[PATCH 12/11] omap1: Fix gpio mpuio bank to work for multi-omap for 7xx/15xx/16xx

Janusz Krzysztofik jkrzyszt at tis.icnet.pl
Fri Dec 10 11:04:33 EST 2010


Wednesday 08 December 2010 00:23:16 Tony Lindgren napisał(a):
> * Tony Lindgren <tony at atomide.com> [101204 13:16]:
> > * Varadarajan, Charulatha <charu at ti.com> [101202 06:08]:
> > > On Thu, Dec 2, 2010 at 15:28, Kevin Hilman <khilman at deeprootsystems.com> 
wrote:
> > > > Tony, you can also add
> > > >
> > > > Acked-by: Kevin Hilman <khilman at deeprootsystems.com>
> >
> > OK, updated. Also made one more GPIO patch to allow us to deal
> > with the 7xx vs 15xx/16xx MPUIO registers.
>
> Turns out that broke drivers/mtd/nand/ams-delta.c as it directly uses
> multiple lines in parallel. So let's use 15xx/16xx offsets instead
> and divide them by two.
>
> Regards,
>
> Tony
>
>
> From: Tony Lindgren <tony at atomide.com>
> Date: Sat, 4 Dec 2010 12:39:43 -0800
> Subject: [PATCH] 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 gpio-keys instead as
> suggested by Cory Maccarrone <darkstar6262 at gmail.com> and
> Janusz Krzysztofik <jkrzyszt at tis.icnet.pl>.
>
> Cc: Cory Maccarrone <darkstar6262 at gmail.com>
> Cc: Janusz Krzysztofik <jkrzyszt at tis.icnet.pl>
> Signed-off-by: Tony Lindgren <tony at atomide.com>

Acked-by: Janusz Krzysztofik <jkrzyszt at tis.icnet.pl>

> diff --git a/arch/arm/mach-omap1/gpio15xx.c
> b/arch/arm/mach-omap1/gpio15xx.c index dbd8168..04c4b04 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 8d4d0a0..5dd0d4c 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 94bccd4..1204c8b 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 59afe77..de93251 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)
> @@ -1340,7 +1342,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);
> @@ -1355,7 +1358,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);
> @@ -1435,7 +1439,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;
> @@ -1596,8 +1600,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);
> @@ -1711,6 +1715,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 5f118ff..41ff2f8 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 */
>  };
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html





More information about the linux-arm-kernel mailing list