Wednesday 08 December 2010 00:23:16 Tony Lindgren napisaƂ(a):
> * Tony Lindgren <t...@atomide.com> [101204 13:16]:
> > * Varadarajan, Charulatha <ch...@ti.com> [101202 06:08]:
> > > On Thu, Dec 2, 2010 at 15:28, Kevin Hilman <khil...@deeprootsystems.com> 
wrote:
> > > > Tony, you can also add
> > > >
> > > > Acked-by: Kevin Hilman <khil...@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 <t...@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 <darkstar6...@gmail.com> and
> Janusz Krzysztofik <jkrzy...@tis.icnet.pl>.
>
> Cc: Cory Maccarrone <darkstar6...@gmail.com>
> Cc: Janusz Krzysztofik <jkrzy...@tis.icnet.pl>
> Signed-off-by: Tony Lindgren <t...@atomide.com>

Acked-by: Janusz Krzysztofik <jkrzy...@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 majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


--
To unsubscribe from this list: send the line "unsubscribe linux-omap" 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