Hello Richard,

On Fri, Sep 24, 2010 at 11:54:25AM +0800, Richard Zhu wrote:
> Modify the machine specific codes and add the eSDHC1 and eSDHC2 support
> on MX51 BBG platform.
> IOMUX, CLOCK, register the device.
> 
> Signed-off-by: Richard Zhu <r65...@freescale.com>
> ---
>  arch/arm/mach-mx5/board-mx51_babbage.c      |   38 ++++++
I think board changes should go in a seperate patch

>  arch/arm/mach-mx5/clock-mx51.c              |  193 
> +++++++++++++++++++++++++++
>  arch/arm/mach-mx5/devices.c                 |   46 +++++++
>  arch/arm/mach-mx5/devices.h                 |    2 +
>  arch/arm/plat-mxc/include/mach/iomux-mx51.h |   33 +++--
>  5 files changed, 298 insertions(+), 14 deletions(-)
> 
> diff --git a/arch/arm/mach-mx5/board-mx51_babbage.c 
> b/arch/arm/mach-mx5/board-mx51_babbage.c
> index 6e384d9..e79f8a1 100644
> --- a/arch/arm/mach-mx5/board-mx51_babbage.c
> +++ b/arch/arm/mach-mx5/board-mx51_babbage.c
> @@ -17,6 +17,7 @@
>  #include <linux/delay.h>
>  #include <linux/io.h>
>  #include <linux/fsl_devices.h>
> +#include <linux/sdhci-pltfm.h>
>  
>  #include <mach/common.h>
>  #include <mach/hardware.h>
> @@ -24,6 +25,7 @@
>  #include <mach/iomux-mx51.h>
>  #include <mach/i2c.h>
>  #include <mach/mxc_ehci.h>
> +#include <mach/mmc.h>
>  
>  #include <asm/irq.h>
>  #include <asm/setup.h>
> @@ -33,6 +35,8 @@
>  
>  #include "devices.h"
>  
> +#define BABBAGE_SDHCI1_WP    (0*32 + 1)      /* GPIO_1_1 */
> +#define BABBAGE_SDHCI2_WP    (0*32 + 5)      /* GPIO_1_5 */
>  #define BABBAGE_USB_HUB_RESET        (0*32 + 7)      /* GPIO_1_7 */
>  #define BABBAGE_USBH1_STP    (0*32 + 27)     /* GPIO_1_27 */
>  #define BABBAGE_PHY_RESET (1*32 +5)  /* GPIO_2_5 */
> @@ -93,6 +97,24 @@ static struct pad_desc mx51babbage_pads[] = {
>  
>       /* USB HUB reset line*/
>       MX51_PAD_GPIO_1_7__GPIO_1_7,
> +
> +     /* SDHCI1 IOMUX */
> +     MX51_PAD_SD1_CMD__SD1_CMD,
> +     MX51_PAD_SD1_CLK__SD1_CLK,
> +     MX51_PAD_SD1_DATA0__SD1_DATA0,
> +     MX51_PAD_SD1_DATA1__SD1_DATA1,
> +     MX51_PAD_SD1_DATA2__SD1_DATA2,
> +     MX51_PAD_SD1_DATA3__SD1_DATA3,
> +     MX51_PAD_GPIO_1_1__GPIO_1_1,
> +
> +     /* SDHCI2 IOMUX */
> +     MX51_PAD_SD2_CMD__SD2_CMD,
> +     MX51_PAD_SD2_CLK__SD2_CLK,
> +     MX51_PAD_SD2_DATA0__SD2_DATA0,
> +     MX51_PAD_SD2_DATA1__SD2_DATA1,
> +     MX51_PAD_SD2_DATA2__SD2_DATA2,
> +     MX51_PAD_SD2_DATA3__SD2_DATA3,
> +     MX51_PAD_GPIO_1_5__GPIO_1_5,
>  };
>  
>  /* Serial ports */
> @@ -240,6 +262,20 @@ static int __init babbage_otg_mode(char *options)
>  }
>  __setup("otg_mode=", babbage_otg_mode);
>  
> +struct sdhci_pltfm_data mmc1_data = {
> +     /* Board specified max bus width */
> +     .caps = MMC_CAP_4_BIT_DATA,
> +     /* GPIO pin number that used as the Write Protect */
This sentence no (complete) verb.

> +     .wp_gpio = BABBAGE_SDHCI1_WP,
> +};
> +
> +struct sdhci_pltfm_data mmc2_data = {
> +     /* Board specified max bus width */
> +     .caps = MMC_CAP_4_BIT_DATA,
> +     /* GPIO pin number that used as the Write Protect */
> +     .wp_gpio = BABBAGE_SDHCI2_WP,
> +};
> +
>  /*
>   * Board specific initialization.
>   */
> @@ -255,6 +291,8 @@ static void __init mxc_board_init(void)
>       mxc_register_device(&mxc_i2c_device0, &babbage_i2c_data);
>       mxc_register_device(&mxc_i2c_device1, &babbage_i2c_data);
>       mxc_register_device(&mxc_hsi2c_device, &babbage_hsi2c_data);
> +     mxc_register_device(&mxcsdhc1_device, &mmc1_data);
> +     mxc_register_device(&mxcsdhc2_device, &mmc2_data);
>  
>       if (otg_mode_host)
>               mxc_register_device(&mxc_usbdr_host_device, &dr_utmi_config);
> diff --git a/arch/arm/mach-mx5/clock-mx51.c b/arch/arm/mach-mx5/clock-mx51.c
> index 6af69de..3526fd3 100644
> --- a/arch/arm/mach-mx5/clock-mx51.c
> +++ b/arch/arm/mach-mx5/clock-mx51.c
> @@ -41,6 +41,35 @@ static struct clk usboh3_clk;
>  
>  #define MAX_DPLL_WAIT_TRIES  1000 /* 1000 * udelay(1) = 1ms */
>  
> +static void __calc_pre_post_dividers(u32 div, u32 *pre, u32 *post)
> +{
Can we have a comment please about what this function does?
> +     u32 min_pre, temp_pre, old_err, err;
> +
> +     if (div >= 512) {
> +             *pre = 8;
> +             *post = 64;
> +     } else if (div >= 8) {
declare the variables here please.

> +             min_pre = (div - 1) / 64 + 1;
> +             old_err = 8;
> +             for (temp_pre = 8; temp_pre >= min_pre; temp_pre--) {
> +                     err = div % temp_pre;
> +                     if (err == 0) {
> +                             *pre = temp_pre;
> +                             break;
> +                     }
> +                     err = temp_pre - err;
> +                     if (err < old_err) {
> +                             old_err = err;
> +                             *pre = temp_pre;
> +                     }
> +             }
> +             *post = (div + *pre - 1) / *pre;
> +     } else if (div < 8) {
This if is unnecessary as the else branch is only hit if !(div >= 8)

> +             *pre = div;
> +             *post = 1;
> +     }
> +}
> +
>  static int _clk_ccgr_enable(struct clk *clk)
>  {
>       u32 reg;
> @@ -762,6 +791,160 @@ static struct clk kpp_clk = {
>       .id = 0,
>  };
>  
> +static int _clk_esdhc1_set_parent(struct clk *clk, struct clk *parent)
> +{
> +     u32 reg, mux;
> +     mux = _get_mux(parent, &pll1_sw_clk, &pll2_sw_clk,
> +                     &pll3_sw_clk, &lp_apm_clk);
> +     reg = __raw_readl(MXC_CCM_CSCMR1) &
> +             ~MXC_CCM_CSCMR1_ESDHC1_MSHC1_CLK_SEL_MASK;
> +     reg |= mux << MXC_CCM_CSCMR1_ESDHC1_MSHC1_CLK_SEL_OFFSET;
> +     __raw_writel(reg, MXC_CCM_CSCMR1);
> +
> +     return 0;
> +}
> +
> +static unsigned long _clk_esdhc1_get_rate(struct clk *clk)
> +{
> +     u32 reg, prediv, podf;
> +     unsigned long parent_rate;
> +
> +     parent_rate = clk_get_rate(clk->parent);
> +
> +     reg = __raw_readl(MXC_CCM_CSCDR1);
> +     prediv = ((reg & MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PRED_MASK) >>
> +               MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PRED_OFFSET) + 1;
> +     podf = ((reg & MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PODF_MASK) >>
> +             MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PODF_OFFSET) + 1;
> +
> +     return parent_rate / (prediv * podf);
> +}
> +
> +static int _clk_esdhc1_set_rate(struct clk *clk, unsigned long rate)
> +{
> +     u32 reg, div, parent_rate;
> +     u32 pre = 0, post = 0;
> +
> +     parent_rate = clk_get_rate(clk->parent);
> +     div = parent_rate / rate;
> +
> +     if ((parent_rate / div) != rate)
> +             return -EINVAL;
> +
> +     __calc_pre_post_dividers(div, &pre, &post);
> +
> +     /* Set sdhc1 clock divider */
> +     reg = __raw_readl(MXC_CCM_CSCDR1) &
> +             ~(MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PRED_MASK
> +                             | MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PODF_MASK);
> +     reg |= (post - 1) << MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PODF_OFFSET;
> +     reg |= (pre - 1) << MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PRED_OFFSET;
> +     __raw_writel(reg, MXC_CCM_CSCDR1);
> +
> +     return 0;
> +}
> +
> +static struct clk esdhc1_clk[] = {
> +     {
> +             .id = 0,
> +             .parent = &pll2_sw_clk,
> +             .secondary = &esdhc1_clk[1],
> +             .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
> +             .enable_reg = MXC_CCM_CCGR3,
> +             .get_rate = _clk_esdhc1_get_rate,
> +             .set_rate = _clk_esdhc1_set_rate,
> +             .enable = _clk_max_enable,
> +             .disable = _clk_max_disable,
> +             .set_parent = _clk_esdhc1_set_parent,
> +     },
> +     {
> +             .id = 0,
> +             .parent = &ipg_clk,
> +             .secondary = NULL,
> +             .enable = _clk_max_enable,
> +             .enable_reg = MXC_CCM_CCGR3,
> +             .enable_shift = MXC_CCM_CCGRx_CG0_OFFSET,
> +             .disable = _clk_max_disable,
> +     }
> +};
> +
> +static int _clk_esdhc2_set_parent(struct clk *clk, struct clk *parent)
> +{
> +     u32 reg, mux;
> +
> +     mux = _get_mux(parent, &pll1_sw_clk, &pll2_sw_clk,
> +                     &pll3_sw_clk, &lp_apm_clk);
> +     reg = __raw_readl(MXC_CCM_CSCMR1) &
> +             ~MXC_CCM_CSCMR1_ESDHC2_MSHC2_CLK_SEL_MASK;
> +     reg |= mux << MXC_CCM_CSCMR1_ESDHC2_MSHC2_CLK_SEL_OFFSET;
> +
> +     __raw_writel(reg, MXC_CCM_CSCMR1);
Maybe it's time to make this idiom a function and call this?  Something
like

        static void sensiblefuncname(struct clk *parent, ...)
        {
                u32 mux = _get_mux(...);
                reg = __raw_readl(offset) & ~mask;
                reg |= mux << __ffs(mask);

                __raw_writel(reg, offset);
        }

What do you think?

> +     return 0;
> +}
> +
> +static unsigned long _clk_esdhc2_get_rate(struct clk *clk)
> +{
> +     u32 reg, prediv, podf;
> +     unsigned long parent_rate;
> +
> +     parent_rate = clk_get_rate(clk->parent);
> +
> +     reg = __raw_readl(MXC_CCM_CSCDR1);
> +     prediv = ((reg & MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PRED_MASK) >>
> +               MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PRED_OFFSET) + 1;
> +     podf = ((reg & MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PODF_MASK) >>
> +             MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PODF_OFFSET) + 1;
> +
> +     return parent_rate / (prediv * podf);
Maybe round here?

> +}
> +
> +static int _clk_esdhc2_set_rate(struct clk *clk, unsigned long rate)
> +{
> +     u32 reg, div, parent_rate;
> +     u32 pre = 0, post = 0;
> +
> +     parent_rate = clk_get_rate(clk->parent);
> +     div = parent_rate / rate;
> +     if ((parent_rate / div) != rate)
> +             return -EINVAL;
> +
> +     __calc_pre_post_dividers(div, &pre, &post);
> +
> +     /* Set sdhc1 clock divider */
> +     reg = __raw_readl(MXC_CCM_CSCDR1) &
> +             ~(MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PRED_MASK
> +                             | MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PODF_MASK);
> +     reg |= (post - 1) << MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PODF_OFFSET;
> +     reg |= (pre - 1) << MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PRED_OFFSET;
> +     __raw_writel(reg, MXC_CCM_CSCDR1);
> +
> +     return 0;
I havn't checked, but I assume the functions _clk_esdhc1_set_rate and
_clk_esdhc2_set_rate can share some code?

> +}
> +
> +static struct clk esdhc2_clk[] = {
> +     {
> +             .id = 1,
> +             .parent = &pll2_sw_clk,
> +             .secondary = &esdhc2_clk[1],
> +             .enable_shift = MXC_CCM_CCGRx_CG3_OFFSET,
> +             .enable_reg = MXC_CCM_CCGR3,
> +             .get_rate = _clk_esdhc2_get_rate,
> +             .set_rate = _clk_esdhc2_set_rate,
> +             .enable = _clk_max_enable,
> +             .disable = _clk_max_disable,
> +             .set_parent = _clk_esdhc2_set_parent,
> +     },
> +     {
> +             .id = 1,
> +             .parent = &ipg_clk,
> +             .secondary = NULL,
> +             .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET,
> +             .enable_reg = MXC_CCM_CCGR3,
> +             .enable = _clk_max_enable,
> +             .disable = _clk_max_disable,
> +     }
> +};
> +
>  #define DEFINE_CLOCK(name, i, er, es, gr, sr, p, s)  \
>       static struct clk name = {                      \
>               .id             = i,                    \
> @@ -837,6 +1020,8 @@ static struct clk_lookup lookups[] = {
>       _REGISTER_CLOCK("fsl-usb2-udc", "usb", usboh3_clk)
>       _REGISTER_CLOCK("fsl-usb2-udc", "usb_ahb", ahb_clk)
>       _REGISTER_CLOCK("imx-keypad.0", NULL, kpp_clk)
> +     _REGISTER_CLOCK("imx-sdhci.0", "imx_sdhc_clk", esdhc1_clk[0])
> +     _REGISTER_CLOCK("imx-sdhci.1", "imx_sdhc_clk", esdhc2_clk[0])
Is the string needed here?

>  };
>  
>  static void clk_tree_init(void)
> @@ -880,6 +1065,14 @@ int __init mx51_clocks_init(unsigned long ckil, 
> unsigned long osc,
>       /* set the usboh3_clk parent to pll2_sw_clk */
>       clk_set_parent(&usboh3_clk, &pll2_sw_clk);
>  
> +     /* Set SDHC parents to be PLL2 */
> +     clk_set_parent(&esdhc1_clk[0], &pll2_sw_clk);
> +     clk_set_parent(&esdhc2_clk[0], &pll2_sw_clk);
> +
> +     /* set SDHC root clock as 166.25MHZ*/
> +     clk_set_rate(&esdhc1_clk[0], 166250000);
> +     clk_set_rate(&esdhc2_clk[0], 166250000);
> +
>       /* System timer */
>       mxc_timer_init(&gpt_clk, MX51_IO_ADDRESS(MX51_GPT1_BASE_ADDR),
>               MX51_MXC_INT_GPT);
> diff --git a/arch/arm/mach-mx5/devices.c b/arch/arm/mach-mx5/devices.c
> index 1920ff4..c137b36 100644
> --- a/arch/arm/mach-mx5/devices.c
> +++ b/arch/arm/mach-mx5/devices.c
> @@ -245,6 +245,52 @@ struct platform_device mxc_keypad_device = {
>       .resource = mxc_kpp_resources,
>  };
>  
> +static struct resource mxcsdhc1_resources[] = {
> +     {
> +             .start = MX51_MMC_SDHC1_BASE_ADDR,
> +             .end = MX51_MMC_SDHC1_BASE_ADDR + SZ_4K - 1,
> +             .flags = IORESOURCE_MEM,
> +     },
> +     {
> +             .start = MX51_MXC_INT_MMC_SDHC1,
> +             .end = MX51_MXC_INT_MMC_SDHC1,
> +             .flags = IORESOURCE_IRQ,
> +     },
> +};
> +
> +static struct resource mxcsdhc2_resources[] = {
> +     {
> +             .start = MX51_MMC_SDHC2_BASE_ADDR,
> +             .end = MX51_MMC_SDHC2_BASE_ADDR + SZ_4K - 1,
> +             .flags = IORESOURCE_MEM,
> +     },
> +     {
> +             .start = MX51_MXC_INT_MMC_SDHC2,
> +             .end = MX51_MXC_INT_MMC_SDHC2,
> +             .flags = IORESOURCE_IRQ,
> +     },
> +};
> +
> + struct platform_device mxcsdhc1_device = {
> +     .name = "imx-sdhci",
> +     .id = 0,
> +     .num_resources = ARRAY_SIZE(mxcsdhc1_resources),
> +     .resource = mxcsdhc1_resources,
> +     .dev = {
> +             .coherent_dma_mask = DMA_BIT_MASK(32),
> +     },
> +};
> +
> + struct platform_device mxcsdhc2_device = {
> +     .name = "imx-sdhci",
> +     .id = 1,
> +     .num_resources = ARRAY_SIZE(mxcsdhc2_resources),
> +     .resource = mxcsdhc2_resources,
> +     .dev = {
> +             .coherent_dma_mask = DMA_BIT_MASK(32),
> +     },
> +};
> +
I would prefer using dynamic creation of these devices.  See Sascha's
for-2.6.37 branch

>  static struct mxc_gpio_port mxc_gpio_ports[] = {
>       {
>               .chip.label = "gpio-0",
> diff --git a/arch/arm/mach-mx5/devices.h b/arch/arm/mach-mx5/devices.h
> index e509cfa..21b9a6f 100644
> --- a/arch/arm/mach-mx5/devices.h
> +++ b/arch/arm/mach-mx5/devices.h
> @@ -10,3 +10,5 @@ extern struct platform_device mxc_i2c_device0;
>  extern struct platform_device mxc_i2c_device1;
>  extern struct platform_device mxc_hsi2c_device;
>  extern struct platform_device mxc_keypad_device;
> +extern struct platform_device mxcsdhc1_device;
> +extern struct platform_device mxcsdhc2_device;
> diff --git a/arch/arm/plat-mxc/include/mach/iomux-mx51.h 
> b/arch/arm/plat-mxc/include/mach/iomux-mx51.h
> index 21bfa46..8963852 100644
> --- a/arch/arm/plat-mxc/include/mach/iomux-mx51.h
> +++ b/arch/arm/plat-mxc/include/mach/iomux-mx51.h
> @@ -45,6 +45,9 @@ typedef enum iomux_config {
>                               PAD_CTL_PKE | PAD_CTL_HYS)
>  #define MX51_GPIO_PAD_CTRL           (PAD_CTL_DSE_HIGH | PAD_CTL_PKE | \
>                               PAD_CTL_SRE_FAST)
> +#define MX51_SDHCI_PAD_CTRL  (PAD_CTL_DSE_HIGH | PAD_CTL_PUS_47K_UP | \
> +                             PAD_CTL_PKE | PAD_CTL_PUE | PAD_CTL_SRE_FAST | \
> +                             PAD_CTL_DVS)
>  
>  /*
>   * The naming convention for the pad modes is MX51_PAD_<padname>__<padmode>
> @@ -294,20 +297,22 @@ typedef enum iomux_config {
>  #define MX51_PAD_DISP2_DAT13__DISP2_DAT13       IOMUX_PAD(0x790, 0x388, 0, 
> 0x0,   0, NO_PAD_CTRL)
>  #define MX51_PAD_DISP2_DAT14__DISP2_DAT14       IOMUX_PAD(0x794, 0x38C, 0, 
> 0x0,   0, NO_PAD_CTRL)
>  #define MX51_PAD_DISP2_DAT15__DISP2_DAT15       IOMUX_PAD(0x798, 0x390, 0, 
> 0x0,   0, NO_PAD_CTRL)
> -#define MX51_PAD_SD1_CMD__SD1_CMD               IOMUX_PAD(0x79C, 0x394, 0, 
> 0x0,   0, NO_PAD_CTRL)
> -#define MX51_PAD_SD1_CLK__SD1_CLK               IOMUX_PAD(0x7A0, 0x398, 0, 
> 0x0,   0, NO_PAD_CTRL)
> -#define MX51_PAD_SD1_DATA0__SD1_DATA0           IOMUX_PAD(0x7A4, 0x39C, 0, 
> 0x0,   0, NO_PAD_CTRL)
> -#define MX51_PAD_SD1_DATA1__SD1_DATA1           IOMUX_PAD(0x7A8, 0x3A0, 0, 
> 0x0,   0, NO_PAD_CTRL)
> -#define MX51_PAD_SD1_DATA2__SD1_DATA2           IOMUX_PAD(0x7AC, 0x3A4, 0, 
> 0x0,   0, NO_PAD_CTRL)
> -#define MX51_PAD_SD1_DATA3__SD1_DATA3           IOMUX_PAD(0x7B0, 0x3A8, 0, 
> 0x0,   0, NO_PAD_CTRL)
> +#define MX51_PAD_SD1_CMD__SD1_CMD    IOMUX_PAD(0x79C, 0x394, 
> IOMUX_CONFIG_SION, 0x0, 0, MX51_SDHCI_PAD_CTRL)
> +#define MX51_PAD_SD1_CLK__SD1_CLK    IOMUX_PAD(0x7A0, 0x398, 
> IOMUX_CONFIG_SION, 0x0, 0, MX51_SDHCI_PAD_CTRL \
> +             | PAD_CTL_HYS)
Please align the IOMUX_PAD, and there is a space before the tab in the
definition of MX51_PAD_SD1_CLK__SD1_CLK.

> +#define MX51_PAD_SD1_DATA0__SD1_DATA0        IOMUX_PAD(0x7A4, 0x39C, 
> IOMUX_CONFIG_SION, 0x0, 0, MX51_SDHCI_PAD_CTRL)
> +#define MX51_PAD_SD1_DATA1__SD1_DATA1        IOMUX_PAD(0x7A8, 0x3A0, 
> IOMUX_CONFIG_SION, 0x0, 0, MX51_SDHCI_PAD_CTRL)
> +#define MX51_PAD_SD1_DATA2__SD1_DATA2        IOMUX_PAD(0x7AC, 0x3A4, 
> IOMUX_CONFIG_SION, 0x0, 0, MX51_SDHCI_PAD_CTRL)
> +#define MX51_PAD_SD1_DATA3__SD1_DATA3        IOMUX_PAD(0x7B0, 0x3A8, 
> IOMUX_CONFIG_SION, 0x0, 0, MX51_SDHCI_PAD_CTRL)
>  #define MX51_PAD_GPIO_1_0__GPIO_1_0          IOMUX_PAD(0x7B4, 0x3AC, 1, 0x0, 
>   0, NO_PAD_CTRL)
> -#define MX51_PAD_GPIO_1_1__GPIO_1_1          IOMUX_PAD(0x7B8, 0x3B0, 1, 0x0, 
>   0, NO_PAD_CTRL)
> -#define MX51_PAD_SD2_CMD__SD2_CMD               IOMUX_PAD(0x7BC, 0x3B4, 0, 
> 0x0,   0, NO_PAD_CTRL)
> -#define MX51_PAD_SD2_CLK__SD2_CLK               IOMUX_PAD(0x7C0, 0x3B8, 0, 
> 0x0,   0, NO_PAD_CTRL)
> -#define MX51_PAD_SD2_DATA0__SD2_DATA0           IOMUX_PAD(0x7C4, 0x3BC, 0, 
> 0x0,   0, NO_PAD_CTRL)
> -#define MX51_PAD_SD2_DATA1__SD2_DATA1           IOMUX_PAD(0x7C8, 0x3C0, 0, 
> 0x0,   0, NO_PAD_CTRL)
> -#define MX51_PAD_SD2_DATA2__SD2_DATA2           IOMUX_PAD(0x7CC, 0x3C4, 0, 
> 0x0,   0, NO_PAD_CTRL)
> -#define MX51_PAD_SD2_DATA3__SD2_DATA3           IOMUX_PAD(0x7D0, 0x3C8, 0, 
> 0x0,   0, NO_PAD_CTRL)
> +#define MX51_PAD_GPIO_1_1__GPIO_1_1  IOMUX_PAD(0x7B8, 0x3B0, 
> IOMUX_CONFIG_GPIO, 0x0, 0, MX51_SDHCI_PAD_CTRL)
> +#define MX51_PAD_SD2_CMD__SD2_CMD    IOMUX_PAD(0x7BC, 0x3B4, 
> IOMUX_CONFIG_SION, 0x0, 1, MX51_SDHCI_PAD_CTRL)
> +#define MX51_PAD_SD2_CLK__SD2_CLK    IOMUX_PAD(0x7C0, 0x3B8, 
> IOMUX_CONFIG_SION, 0x0, 0, MX51_SDHCI_PAD_CTRL \
> +             | PAD_CTL_HYS)
> +#define MX51_PAD_SD2_DATA0__SD2_DATA0        IOMUX_PAD(0x7C4, 0x3BC, 
> IOMUX_CONFIG_SION, 0x0, 0, MX51_SDHCI_PAD_CTRL)
> +#define MX51_PAD_SD2_DATA1__SD2_DATA1        IOMUX_PAD(0x7C8, 0x3C0, 
> IOMUX_CONFIG_SION, 0x0, 0, MX51_SDHCI_PAD_CTRL)
> +#define MX51_PAD_SD2_DATA2__SD2_DATA2        IOMUX_PAD(0x7CC, 0x3C4, 
> IOMUX_CONFIG_SION, 0x0, 0, MX51_SDHCI_PAD_CTRL)
> +#define MX51_PAD_SD2_DATA3__SD2_DATA3        IOMUX_PAD(0x7D0, 0x3C8, 
> IOMUX_CONFIG_SION, 0x0, 0, MX51_SDHCI_PAD_CTRL)
>  #define MX51_PAD_GPIO_1_2__GPIO_1_2          IOMUX_PAD(0x7D4, 0x3CC, 0, 0x0, 
>   0, NO_PAD_CTRL)
>  #define MX51_PAD_GPIO_1_2__I2C2_SCL          IOMUX_PAD(0x7D4, 0x3CC, (2 | 
> IOMUX_CONFIG_SION), \
>                                                       0x9b8,   3, 
> MX51_I2C_PAD_CTRL)
> @@ -316,7 +321,7 @@ typedef enum iomux_config {
>                                                       0x9bc,   3, 
> MX51_I2C_PAD_CTRL)
>  #define MX51_PAD_PMIC_INT_REQ__PMIC_INT_REQ  IOMUX_PAD(0x7FC, 0x3D4, 0, 0x0, 
>   0, NO_PAD_CTRL)
>  #define MX51_PAD_GPIO_1_4__GPIO_1_4          IOMUX_PAD(0x804, 0x3D8, 0, 0x0, 
>   0, NO_PAD_CTRL)
> -#define MX51_PAD_GPIO_1_5__GPIO_1_5          IOMUX_PAD(0x808, 0x3DC, 0, 0x0, 
>   0, NO_PAD_CTRL)
> +#define MX51_PAD_GPIO_1_5__GPIO_1_5  IOMUX_PAD(0x808, 0x3DC, 
> IOMUX_CONFIG_GPIO, 0x0, 1, MX51_SDHCI_PAD_CTRL)
>  #define MX51_PAD_GPIO_1_6__GPIO_1_6          IOMUX_PAD(0x80C, 0x3E0, 0, 0x0, 
>   0, MX51_GPIO_PAD_CTRL)
>  #define MX51_PAD_GPIO_1_7__GPIO_1_7          IOMUX_PAD(0x810, 0x3E4, 0, 0x0, 
>   0, MX51_GPIO_PAD_CTRL)
>  #define MX51_PAD_GPIO_1_8__GPIO_1_8          IOMUX_PAD(0x814, 0x3E8, 0, 0x0, 
>   1, MX51_GPIO_PAD_CTRL)
> -- 
> 1.7.0
> 
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-ker...@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> 

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to