i.MX31: fix mxc_iomux_set_pad()
authorGuennadi Liakhovetski <lg@denx.de>
Thu, 13 Nov 2008 11:20:49 +0000 (12:20 +0100)
committerSascha Hauer <s.hauer@pengutronix.de>
Tue, 16 Dec 2008 13:57:24 +0000 (14:57 +0100)
mxc_iomux_set_pad() is buggy on i.MX31 - it calculates the register and
the offset therein wrongly. Fix it.

Signed-off-by: Guennadi Liakhovetski <lg@denx.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
arch/arm/mach-mx3/iomux.c

index 6e664be8cc13ed187ba28159cec8283ccd1e3c1a..7a5088b519a8c6a1d077b4bd3cd997b7adde7c9f 100644 (file)
@@ -74,17 +74,18 @@ void mxc_iomux_set_pad(enum iomux_pins pin, u32 config)
        u32 field, l;
        void __iomem *reg;
 
-       reg = IOMUXSW_PAD_CTL + (pin + 2) / 3;
+       pin &= IOMUX_PADNUM_MASK;
+       reg = IOMUXSW_PAD_CTL + (pin + 2) / 3 * 4;
        field = (pin + 2) % 3;
 
-       pr_debug("%s: reg offset = 0x%x field = %d\n",
+       pr_debug("%s: reg offset = 0x%x, field = %d\n",
                        __func__, (pin + 2) / 3, field);
 
        spin_lock(&gpio_mux_lock);
 
        l = __raw_readl(reg);
-       l &= ~(0x1ff << (field * 9));
-       l |= config << (field * 9);
+       l &= ~(0x1ff << (field * 10));
+       l |= config << (field * 10);
        __raw_writel(l, reg);
 
        spin_unlock(&gpio_mux_lock);