2009-04-01 17:11:48 +08:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2009 by Jan Weitzel Phytec Messtechnik GmbH,
|
|
|
|
* <armlinux@phytec.de>
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
|
|
* MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __MACH_IOMUX_V3_H__
|
|
|
|
#define __MACH_IOMUX_V3_H__
|
|
|
|
|
|
|
|
/*
|
|
|
|
* build IOMUX_PAD structure
|
|
|
|
*
|
|
|
|
* This iomux scheme is based around pads, which are the physical balls
|
|
|
|
* on the processor.
|
|
|
|
*
|
|
|
|
* - Each pad has a pad control register (IOMUXC_SW_PAD_CTRL_x) which controls
|
|
|
|
* things like driving strength and pullup/pulldown.
|
|
|
|
* - Each pad can have but not necessarily does have an output routing register
|
|
|
|
* (IOMUXC_SW_MUX_CTL_PAD_x).
|
|
|
|
* - Each pad can have but not necessarily does have an input routing register
|
|
|
|
* (IOMUXC_x_SELECT_INPUT)
|
|
|
|
*
|
|
|
|
* The three register sets do not have a fixed offset to each other,
|
|
|
|
* hence we order this table by pad control registers (which all pads
|
|
|
|
* have) and put the optional i/o routing registers into additional
|
|
|
|
* fields.
|
|
|
|
*
|
|
|
|
* The naming convention for the pad modes is MX35_PAD_<padname>__<padmode>
|
|
|
|
* If <padname> or <padmode> refers to a GPIO, it is named
|
|
|
|
* GPIO_<unit>_<num>
|
|
|
|
*
|
2010-11-22 16:39:51 +08:00
|
|
|
* IOMUX/PAD Bit field definitions
|
|
|
|
*
|
|
|
|
* MUX_CTRL_OFS: 0..11 (12)
|
|
|
|
* PAD_CTRL_OFS: 12..23 (12)
|
|
|
|
* SEL_INPUT_OFS: 24..35 (12)
|
|
|
|
* MUX_MODE + SION: 36..40 (5)
|
|
|
|
* PAD_CTRL + NO_PAD_CTRL: 41..57 (17)
|
|
|
|
* SEL_INP: 58..61 (4)
|
|
|
|
* reserved: 63 (1)
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef u64 iomux_v3_cfg_t;
|
|
|
|
|
|
|
|
#define MUX_CTRL_OFS_SHIFT 0
|
|
|
|
#define MUX_CTRL_OFS_MASK ((iomux_v3_cfg_t)0xfff << MUX_CTRL_OFS_SHIFT)
|
|
|
|
#define MUX_PAD_CTRL_OFS_SHIFT 12
|
|
|
|
#define MUX_PAD_CTRL_OFS_MASK ((iomux_v3_cfg_t)0xfff << MUX_PAD_CTRL_OFS_SHIFT)
|
|
|
|
#define MUX_SEL_INPUT_OFS_SHIFT 24
|
|
|
|
#define MUX_SEL_INPUT_OFS_MASK ((iomux_v3_cfg_t)0xfff << MUX_SEL_INPUT_OFS_SHIFT)
|
|
|
|
|
|
|
|
#define MUX_MODE_SHIFT 36
|
|
|
|
#define MUX_MODE_MASK ((iomux_v3_cfg_t)0x1f << MUX_MODE_SHIFT)
|
|
|
|
#define MUX_PAD_CTRL_SHIFT 41
|
|
|
|
#define MUX_PAD_CTRL_MASK ((iomux_v3_cfg_t)0x1ffff << MUX_PAD_CTRL_SHIFT)
|
|
|
|
#define MUX_SEL_INPUT_SHIFT 58
|
|
|
|
#define MUX_SEL_INPUT_MASK ((iomux_v3_cfg_t)0xf << MUX_SEL_INPUT_SHIFT)
|
|
|
|
|
2010-12-15 16:56:35 +08:00
|
|
|
#define MUX_PAD_CTRL(x) ((iomux_v3_cfg_t)(x) << MUX_PAD_CTRL_SHIFT)
|
|
|
|
|
2010-11-22 16:39:51 +08:00
|
|
|
#define IOMUX_PAD(_pad_ctrl_ofs, _mux_ctrl_ofs, _mux_mode, _sel_input_ofs, \
|
|
|
|
_sel_input, _pad_ctrl) \
|
|
|
|
(((iomux_v3_cfg_t)(_mux_ctrl_ofs) << MUX_CTRL_OFS_SHIFT) | \
|
|
|
|
((iomux_v3_cfg_t)(_mux_mode) << MUX_MODE_SHIFT) | \
|
|
|
|
((iomux_v3_cfg_t)(_pad_ctrl_ofs) << MUX_PAD_CTRL_OFS_SHIFT) | \
|
|
|
|
((iomux_v3_cfg_t)(_pad_ctrl) << MUX_PAD_CTRL_SHIFT) | \
|
|
|
|
((iomux_v3_cfg_t)(_sel_input_ofs) << MUX_SEL_INPUT_OFS_SHIFT) | \
|
|
|
|
((iomux_v3_cfg_t)(_sel_input) << MUX_SEL_INPUT_SHIFT))
|
2009-04-01 17:11:48 +08:00
|
|
|
|
2011-08-14 03:51:41 +08:00
|
|
|
#define NEW_PAD_CTRL(cfg, pad) (((cfg) & ~MUX_PAD_CTRL_MASK) | MUX_PAD_CTRL(pad))
|
2009-04-01 17:11:48 +08:00
|
|
|
/*
|
|
|
|
* Use to set PAD control
|
|
|
|
*/
|
|
|
|
|
2011-06-25 01:52:56 +08:00
|
|
|
#define NO_PAD_CTRL (1 << 16)
|
2009-06-04 16:32:08 +08:00
|
|
|
#define PAD_CTL_DVS (1 << 13)
|
|
|
|
#define PAD_CTL_HYS (1 << 8)
|
2009-04-01 17:11:48 +08:00
|
|
|
|
2009-06-04 16:32:08 +08:00
|
|
|
#define PAD_CTL_PKE (1 << 7)
|
plat-mxc: iomux-v3.h: implicitly enable pull-up/down when that's desired
To configure pads during the initialisation a set of special constants
is used, e.g.
#define MX25_PAD_FEC_MDIO__FEC_MDIO IOMUX_PAD(0x3c4, 0x1cc, 0x10, 0, 0, PAD_CTL_HYS | PAD_CTL_PUS_22K_UP)
The problem is that no pull-up/down is getting activated unless both
PAD_CTL_PUE (pull-up enable) and PAD_CTL_PKE (pull/keeper module
enable) set. This is clearly stated in the i.MX25 datasheet and is
confirmed by the measurements on hardware. This leads to some rather
hard to understand bugs such as misdetecting an absent ethernet PHY (a
real bug i had), unstable data transfer etc. This might affect mx25,
mx35, mx50, mx51 and mx53 SoCs.
It's reasonable to expect that if the pullup value is specified, the
intention was to have it actually active, so we implicitly add the
needed bits.
Cc: stable@kernel.org
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
2011-10-10 15:19:23 +08:00
|
|
|
#define PAD_CTL_PUE (1 << 6 | PAD_CTL_PKE)
|
|
|
|
#define PAD_CTL_PUS_100K_DOWN (0 << 4 | PAD_CTL_PUE)
|
|
|
|
#define PAD_CTL_PUS_47K_UP (1 << 4 | PAD_CTL_PUE)
|
|
|
|
#define PAD_CTL_PUS_100K_UP (2 << 4 | PAD_CTL_PUE)
|
|
|
|
#define PAD_CTL_PUS_22K_UP (3 << 4 | PAD_CTL_PUE)
|
2009-04-01 17:11:48 +08:00
|
|
|
|
2009-06-04 16:32:08 +08:00
|
|
|
#define PAD_CTL_ODE (1 << 3)
|
2009-04-01 17:11:48 +08:00
|
|
|
|
2010-02-05 04:21:53 +08:00
|
|
|
#define PAD_CTL_DSE_LOW (0 << 1)
|
|
|
|
#define PAD_CTL_DSE_MED (1 << 1)
|
|
|
|
#define PAD_CTL_DSE_HIGH (2 << 1)
|
|
|
|
#define PAD_CTL_DSE_MAX (3 << 1)
|
2009-04-01 17:11:48 +08:00
|
|
|
|
2009-06-04 16:32:08 +08:00
|
|
|
#define PAD_CTL_SRE_FAST (1 << 0)
|
2010-02-05 04:21:53 +08:00
|
|
|
#define PAD_CTL_SRE_SLOW (0 << 0)
|
2009-04-01 17:11:48 +08:00
|
|
|
|
2011-01-06 19:05:39 +08:00
|
|
|
#define IOMUX_CONFIG_SION (0x1 << 4)
|
2010-06-12 22:22:39 +08:00
|
|
|
|
|
|
|
#define MX51_NUM_GPIO_PORT 4
|
|
|
|
|
|
|
|
#define GPIO_PIN_MASK 0x1f
|
|
|
|
|
|
|
|
#define GPIO_PORT_SHIFT 5
|
|
|
|
#define GPIO_PORT_MASK (0x7 << GPIO_PORT_SHIFT)
|
|
|
|
|
|
|
|
#define GPIO_PORTA (0 << GPIO_PORT_SHIFT)
|
|
|
|
#define GPIO_PORTB (1 << GPIO_PORT_SHIFT)
|
|
|
|
#define GPIO_PORTC (2 << GPIO_PORT_SHIFT)
|
|
|
|
#define GPIO_PORTD (3 << GPIO_PORT_SHIFT)
|
|
|
|
#define GPIO_PORTE (4 << GPIO_PORT_SHIFT)
|
|
|
|
#define GPIO_PORTF (5 << GPIO_PORT_SHIFT)
|
|
|
|
|
2009-04-01 17:11:48 +08:00
|
|
|
/*
|
2009-10-30 00:18:02 +08:00
|
|
|
* setups a single pad in the iomuxer
|
2009-04-01 17:11:48 +08:00
|
|
|
*/
|
2010-11-22 16:39:51 +08:00
|
|
|
int mxc_iomux_v3_setup_pad(iomux_v3_cfg_t pad);
|
2009-04-01 17:11:48 +08:00
|
|
|
|
|
|
|
/*
|
2015-03-02 22:45:05 +08:00
|
|
|
* setups multiple pads
|
2009-04-01 17:11:48 +08:00
|
|
|
* convenient way to call the above function with tables
|
|
|
|
*/
|
2015-02-21 23:08:21 +08:00
|
|
|
int mxc_iomux_v3_setup_multiple_pads(const iomux_v3_cfg_t *pad_list,
|
|
|
|
unsigned count);
|
2009-04-01 17:11:48 +08:00
|
|
|
|
2009-06-04 17:16:22 +08:00
|
|
|
/*
|
|
|
|
* Initialise the iomux controller
|
|
|
|
*/
|
|
|
|
void mxc_iomux_v3_init(void __iomem *iomux_v3_base);
|
|
|
|
|
2009-04-01 17:11:48 +08:00
|
|
|
#endif /* __MACH_IOMUX_V3_H__*/
|
|
|
|
|