diff options
| author | Tony Lindgren <tony@atomide.com> | 2010-12-07 16:26:58 -0800 | 
|---|---|---|
| committer | Tony Lindgren <tony@atomide.com> | 2010-12-07 16:26:58 -0800 | 
| commit | 5de62b86d2f5cf3459cb02ecb7a4530787bbd898 (patch) | |
| tree | cb74c2e11982c270bd55795ad8cdf18a322fa17f | |
| parent | 77640aabd7558e43b65bc1a0311be2dbb42c3ff8 (diff) | |
| download | olio-linux-3.10-5de62b86d2f5cf3459cb02ecb7a4530787bbd898.tar.xz olio-linux-3.10-5de62b86d2f5cf3459cb02ecb7a4530787bbd898.zip  | |
omap1: Fix gpio mpuio bank to work for multi-omap for 7xx/15xx/16xx
We need to divide the 15xx/16xx offset by 2 for 7xx. Use bank->stride
for that. This allows us to get rid of the duplicate defines for the
MPUIO registers.
Note that this will cause omap-keypad.c driver to not work on 7xx.
However, the right fix there is to move over to matrix_keypad instead
as suggested by Cory Maccarrone <darkstar6262@gmail.com> and
Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>.
Cc: Cory Maccarrone <darkstar6262@gmail.com>
Acked-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
| -rw-r--r-- | arch/arm/mach-omap1/gpio15xx.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-omap1/gpio16xx.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-omap1/gpio7xx.c | 1 | ||||
| -rw-r--r-- | arch/arm/plat-omap/gpio.c | 33 | ||||
| -rw-r--r-- | arch/arm/plat-omap/include/plat/gpio.h | 22 | 
5 files changed, 27 insertions, 31 deletions
diff --git a/arch/arm/mach-omap1/gpio15xx.c b/arch/arm/mach-omap1/gpio15xx.c index dbd81688ead..04c4b04cf54 100644 --- a/arch/arm/mach-omap1/gpio15xx.c +++ b/arch/arm/mach-omap1/gpio15xx.c @@ -38,6 +38,7 @@ static struct __initdata omap_gpio_platform_data omap15xx_mpu_gpio_config = {  	.virtual_irq_start	= IH_MPUIO_BASE,  	.bank_type		= METHOD_MPUIO,  	.bank_width		= 16, +	.bank_stride		= 1,  };  static struct __initdata platform_device omap15xx_mpu_gpio = { diff --git a/arch/arm/mach-omap1/gpio16xx.c b/arch/arm/mach-omap1/gpio16xx.c index 8d4d0a061b5..5dd0d4c82b2 100644 --- a/arch/arm/mach-omap1/gpio16xx.c +++ b/arch/arm/mach-omap1/gpio16xx.c @@ -41,6 +41,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = {  	.virtual_irq_start	= IH_MPUIO_BASE,  	.bank_type		= METHOD_MPUIO,  	.bank_width		= 16, +	.bank_stride		= 1,  };  static struct __initdata platform_device omap16xx_mpu_gpio = { diff --git a/arch/arm/mach-omap1/gpio7xx.c b/arch/arm/mach-omap1/gpio7xx.c index 94bccd44181..1204c8b871a 100644 --- a/arch/arm/mach-omap1/gpio7xx.c +++ b/arch/arm/mach-omap1/gpio7xx.c @@ -43,6 +43,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_mpu_gpio_config = {  	.virtual_irq_start	= IH_MPUIO_BASE,  	.bank_type		= METHOD_MPUIO,  	.bank_width		= 32, +	.bank_stride		= 2,  };  static struct __initdata platform_device omap7xx_mpu_gpio = { diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index 6f53dee98a9..8d493b992e7 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c @@ -159,6 +159,7 @@ struct gpio_bank {  	u32 dbck_enable_mask;  	struct device *dev;  	bool dbck_flag; +	int stride;  };  #ifdef CONFIG_ARCH_OMAP3 @@ -267,7 +268,7 @@ static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input)  	switch (bank->method) {  #ifdef CONFIG_ARCH_OMAP1  	case METHOD_MPUIO: -		reg += OMAP_MPUIO_IO_CNTL; +		reg += OMAP_MPUIO_IO_CNTL / bank->stride;  		break;  #endif  #ifdef CONFIG_ARCH_OMAP15XX @@ -315,7 +316,7 @@ static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable)  	switch (bank->method) {  #ifdef CONFIG_ARCH_OMAP1  	case METHOD_MPUIO: -		reg += OMAP_MPUIO_OUTPUT; +		reg += OMAP_MPUIO_OUTPUT / bank->stride;  		l = __raw_readl(reg);  		if (enable)  			l |= 1 << gpio; @@ -387,7 +388,7 @@ static int _get_gpio_datain(struct gpio_bank *bank, int gpio)  	switch (bank->method) {  #ifdef CONFIG_ARCH_OMAP1  	case METHOD_MPUIO: -		reg += OMAP_MPUIO_INPUT_LATCH; +		reg += OMAP_MPUIO_INPUT_LATCH / bank->stride;  		break;  #endif  #ifdef CONFIG_ARCH_OMAP15XX @@ -433,7 +434,7 @@ static int _get_gpio_dataout(struct gpio_bank *bank, int gpio)  	switch (bank->method) {  #ifdef CONFIG_ARCH_OMAP1  	case METHOD_MPUIO: -		reg += OMAP_MPUIO_OUTPUT; +		reg += OMAP_MPUIO_OUTPUT / bank->stride;  		break;  #endif  #ifdef CONFIG_ARCH_OMAP15XX @@ -620,7 +621,7 @@ static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio)  	switch (bank->method) {  	case METHOD_MPUIO: -		reg += OMAP_MPUIO_GPIO_INT_EDGE; +		reg += OMAP_MPUIO_GPIO_INT_EDGE / bank->stride;  		break;  #ifdef CONFIG_ARCH_OMAP15XX  	case METHOD_GPIO_1510: @@ -654,7 +655,7 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)  	switch (bank->method) {  #ifdef CONFIG_ARCH_OMAP1  	case METHOD_MPUIO: -		reg += OMAP_MPUIO_GPIO_INT_EDGE; +		reg += OMAP_MPUIO_GPIO_INT_EDGE / bank->stride;  		l = __raw_readl(reg);  		if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)  			bank->toggle_mask |= 1 << gpio; @@ -840,7 +841,7 @@ static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank)  	switch (bank->method) {  #ifdef CONFIG_ARCH_OMAP1  	case METHOD_MPUIO: -		reg += OMAP_MPUIO_GPIO_MASKIT; +		reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride;  		mask = 0xffff;  		inv = 1;  		break; @@ -897,7 +898,7 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enab  	switch (bank->method) {  #ifdef CONFIG_ARCH_OMAP1  	case METHOD_MPUIO: -		reg += OMAP_MPUIO_GPIO_MASKIT; +		reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride;  		l = __raw_readl(reg);  		if (enable)  			l &= ~(gpio_mask); @@ -1147,7 +1148,8 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)  	bank = get_irq_data(irq);  #ifdef CONFIG_ARCH_OMAP1  	if (bank->method == METHOD_MPUIO) -		isr_reg = bank->base + OMAP_MPUIO_GPIO_INT; +		isr_reg = bank->base + +				OMAP_MPUIO_GPIO_INT / bank->stride;  #endif  #ifdef CONFIG_ARCH_OMAP15XX  	if (bank->method == METHOD_GPIO_1510) @@ -1345,7 +1347,8 @@ static int omap_mpuio_suspend_noirq(struct device *dev)  {  	struct platform_device *pdev = to_platform_device(dev);  	struct gpio_bank	*bank = platform_get_drvdata(pdev); -	void __iomem		*mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT; +	void __iomem		*mask_reg = bank->base + +					OMAP_MPUIO_GPIO_MASKIT / bank->stride;  	unsigned long		flags;  	spin_lock_irqsave(&bank->lock, flags); @@ -1360,7 +1363,8 @@ static int omap_mpuio_resume_noirq(struct device *dev)  {  	struct platform_device *pdev = to_platform_device(dev);  	struct gpio_bank	*bank = platform_get_drvdata(pdev); -	void __iomem		*mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT; +	void __iomem		*mask_reg = bank->base + +					OMAP_MPUIO_GPIO_MASKIT / bank->stride;  	unsigned long		flags;  	spin_lock_irqsave(&bank->lock, flags); @@ -1440,7 +1444,7 @@ static int gpio_is_input(struct gpio_bank *bank, int mask)  	switch (bank->method) {  	case METHOD_MPUIO: -		reg += OMAP_MPUIO_IO_CNTL; +		reg += OMAP_MPUIO_IO_CNTL / bank->stride;  		break;  	case METHOD_GPIO_1510:  		reg += OMAP1510_GPIO_DIR_CONTROL; @@ -1601,8 +1605,8 @@ static void omap_gpio_mod_init(struct gpio_bank *bank, int id)  		}  	} else if (cpu_class_is_omap1()) {  		if (bank_is_mpuio(bank)) -			__raw_writew(0xffff, bank->base -						+ OMAP_MPUIO_GPIO_MASKIT); +			__raw_writew(0xffff, bank->base + +				OMAP_MPUIO_GPIO_MASKIT / bank->stride);  		if (cpu_is_omap15xx() && bank->method == METHOD_GPIO_1510) {  			__raw_writew(0xffff, bank->base  						+ OMAP1510_GPIO_INT_MASK); @@ -1716,6 +1720,7 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)  	bank->method = pdata->bank_type;  	bank->dev = &pdev->dev;  	bank->dbck_flag = pdata->dbck_flag; +	bank->stride = pdata->bank_stride;  	bank_width = pdata->bank_width;  	spin_lock_init(&bank->lock); diff --git a/arch/arm/plat-omap/include/plat/gpio.h b/arch/arm/plat-omap/include/plat/gpio.h index 5f118ff0d3e..41ff2f8943f 100644 --- a/arch/arm/plat-omap/include/plat/gpio.h +++ b/arch/arm/plat-omap/include/plat/gpio.h @@ -32,22 +32,10 @@  #define OMAP1_MPUIO_BASE			0xfffb5000 -#if (defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)) - -#define OMAP_MPUIO_INPUT_LATCH		0x00 -#define OMAP_MPUIO_OUTPUT		0x02 -#define OMAP_MPUIO_IO_CNTL		0x04 -#define OMAP_MPUIO_KBR_LATCH		0x08 -#define OMAP_MPUIO_KBC			0x0a -#define OMAP_MPUIO_GPIO_EVENT_MODE	0x0c -#define OMAP_MPUIO_GPIO_INT_EDGE	0x0e -#define OMAP_MPUIO_KBD_INT		0x10 -#define OMAP_MPUIO_GPIO_INT		0x12 -#define OMAP_MPUIO_KBD_MASKIT		0x14 -#define OMAP_MPUIO_GPIO_MASKIT		0x16 -#define OMAP_MPUIO_GPIO_DEBOUNCING	0x18 -#define OMAP_MPUIO_LATCH		0x1a -#else +/* + * These are the omap15xx/16xx offsets. The omap7xx offset are + * OMAP_MPUIO_ / 2 offsets below. + */  #define OMAP_MPUIO_INPUT_LATCH		0x00  #define OMAP_MPUIO_OUTPUT		0x04  #define OMAP_MPUIO_IO_CNTL		0x08 @@ -61,7 +49,6 @@  #define OMAP_MPUIO_GPIO_MASKIT		0x2c  #define OMAP_MPUIO_GPIO_DEBOUNCING	0x30  #define OMAP_MPUIO_LATCH		0x34 -#endif  #define OMAP34XX_NR_GPIOS		6 @@ -88,6 +75,7 @@ struct omap_gpio_platform_data {  	u16 virtual_irq_start;  	int bank_type;  	int bank_width;		/* GPIO bank width */ +	int bank_stride;	/* Only needed for omap1 MPUIO */  	bool dbck_flag;		/* dbck required or not - True for OMAP3&4 */  };  |