Tarun Kanti DebBarma <[email protected]> writes:

> From: Charulatha V <[email protected]>
>
> Non-wakeup GPIOs are available only in OMAP2420 and OMAP3430. But
> the GPIO driver initializes the non-wakeup GPIO bits for OMAP24xx
> (bothe OMAP 2420 and 2430) & not for OMAP3 which is incorrect.

Can you cite the documentation you're using for the OMAP3 non-wakeup
GPIOs?

This is a change of functionality from current code, where all OMAP3
GPIOs are considered wakeup capable.

I'd like this to be tackled in two patches.  One for the
cleanup/consolidation, and one for change in behavior.

For this cleanup/consolidation (this series), please keep existing
functionality and focus on the cleanup.  Then, in an additional patch
(on top of the cleanup/conslidation), change the functionality with a
detailed changelog.

Thanks,

Kevin

> Fix the above by providing non-wakeup GPIO information through pdata
> specific to the SoC.
>
> The GPIO rev id provided in the hwmod database is the same for OMAP2420
> and OMAP2430. Change the GPIO rev ids in hwmod database as given below
> so that it can be used to identify OMAP2420 and OMAP2430.
> OMAP2420 - 0
> OMAP2430 - 1
> OMAP3    - 2
> OMAP4    - 3
>
> Signed-off-by: Charulatha V <[email protected]>
> Cc: Cousson, Benoit <[email protected]>
> Cc: Paul Walmsley <[email protected]>
> ---
>  arch/arm/mach-omap2/gpio.c                 |   26 ++++++++++++++++++++++++--
>  arch/arm/mach-omap2/omap_hwmod_2430_data.c |    2 +-
>  arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |    2 +-
>  arch/arm/mach-omap2/omap_hwmod_44xx_data.c |    2 +-
>  arch/arm/plat-omap/include/plat/gpio.h     |    1 +
>  drivers/gpio/gpio_omap.c                   |   11 +++--------
>  6 files changed, 31 insertions(+), 13 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/gpio.c b/arch/arm/mach-omap2/gpio.c
> index 0446bd1..6cd26b4 100644
> --- a/arch/arm/mach-omap2/gpio.c
> +++ b/arch/arm/mach-omap2/gpio.c
> @@ -56,6 +56,28 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void 
> *unused)
>               return -ENOMEM;
>       }
>  
> +     switch (oh->class->rev) {
> +     case 0:
> +             if (id == 1)
> +                     /* non-wakeup GPIO pins for OMAP2420 Bank1 */
> +                     pdata->non_wakeup_gpios = 0xe203ffc0;
> +             else if (id == 2)
> +                     /* non-wakeup GPIO pins for OMAP2420 Bank2 */
> +                     pdata->non_wakeup_gpios = 0x08700040;
> +             break;
> +     case 2:
> +             if (id == 2)
> +                     /* non-wakeup GPIO pins for OMAP3 Bank2 */
> +                     pdata->non_wakeup_gpios = 0x00000001;
> +             else if (id == 6)
> +                     /* non-wakeup GPIO pins for OMAP3 Bank6 */
> +                     pdata->non_wakeup_gpios = 0x08000000;
> +             break;
> +     default:
> +             /* No non-wakeup GPIO pins for other SoCs */
> +             break;
> +     }
> +
>       dev_attr = (struct omap_gpio_dev_attr *)oh->dev_attr;
>       pdata->bank_width = dev_attr->bank_width;
>       pdata->dbck_flag = dev_attr->dbck_flag;
> @@ -70,6 +92,7 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void 
> *unused)
>       switch (oh->class->rev) {
>       case 0:
>       case 1:
> +     case 2:
>               pdata->bank_type = METHOD_GPIO_24XX;
>               pdata->regs->revision = OMAP24XX_GPIO_REVISION;
>               pdata->regs->direction = OMAP24XX_GPIO_OE;
> @@ -86,7 +109,7 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void 
> *unused)
>               pdata->regs->debounce_en = OMAP24XX_GPIO_DEBOUNCE_EN;
>               pdata->regs->ctrl = OMAP24XX_GPIO_CTRL;
>               break;
> -     case 2:
> +     case 3:
>               pdata->bank_type = METHOD_GPIO_44XX;
>               pdata->regs->revision = OMAP4_GPIO_REVISION;
>               pdata->regs->direction = OMAP4_GPIO_OE;
> @@ -108,7 +131,6 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, 
> void *unused)
>               kfree(pdata);
>               return -EINVAL;
>       }
> -
>       od = omap_device_build(name, id - 1, oh, pdata,
>                               sizeof(*pdata), omap_gpio_latency,
>                               ARRAY_SIZE(omap_gpio_latency),
> diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c 
> b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
> index 9682dd5..ae702b5 100644
> --- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c
> +++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
> @@ -1728,7 +1728,7 @@ static struct omap_hwmod_class_sysconfig 
> omap243x_gpio_sysc = {
>  static struct omap_hwmod_class omap243x_gpio_hwmod_class = {
>       .name = "gpio",
>       .sysc = &omap243x_gpio_sysc,
> -     .rev = 0,
> +     .rev = 1,
>  };
>  
>  /* gpio1 */
> diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c 
> b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
> index 909a84d..05e7005 100644
> --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
> +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
> @@ -2117,7 +2117,7 @@ static struct omap_hwmod_class_sysconfig 
> omap3xxx_gpio_sysc = {
>  static struct omap_hwmod_class omap3xxx_gpio_hwmod_class = {
>       .name = "gpio",
>       .sysc = &omap3xxx_gpio_sysc,
> -     .rev = 1,
> +     .rev = 2,
>  };
>  
>  /* gpio_dev_attr*/
> diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c 
> b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
> index abc548a..ea30752 100644
> --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
> +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
> @@ -1703,7 +1703,7 @@ static struct omap_hwmod_class_sysconfig 
> omap44xx_gpio_sysc = {
>  static struct omap_hwmod_class omap44xx_gpio_hwmod_class = {
>       .name   = "gpio",
>       .sysc   = &omap44xx_gpio_sysc,
> -     .rev    = 2,
> +     .rev    = 3,
>  };
>  
>  /* gpio dev_attr */
> diff --git a/arch/arm/plat-omap/include/plat/gpio.h 
> b/arch/arm/plat-omap/include/plat/gpio.h
> index caf432c..8014a8a 100644
> --- a/arch/arm/plat-omap/include/plat/gpio.h
> +++ b/arch/arm/plat-omap/include/plat/gpio.h
> @@ -199,6 +199,7 @@ struct omap_gpio_platform_data {
>       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 */
> +     u32 non_wakeup_gpios;
>  
>       struct omap_gpio_reg_offs *regs;
>  };
> diff --git a/drivers/gpio/gpio_omap.c b/drivers/gpio/gpio_omap.c
> index dfdc45e..0ba4cdb 100644
> --- a/drivers/gpio/gpio_omap.c
> +++ b/drivers/gpio/gpio_omap.c
> @@ -1008,7 +1008,7 @@ static inline int init_gpio_info(struct platform_device 
> *pdev)
>  }
>  
>  /* TODO: Cleanup cpu_is_* checks */
> -static void omap_gpio_mod_init(struct gpio_bank *bank, int id)
> +static void omap_gpio_mod_init(struct gpio_bank *bank)
>  {
>       if (cpu_class_is_omap2()) {
>               if (cpu_is_omap44xx()) {
> @@ -1028,12 +1028,6 @@ static void omap_gpio_mod_init(struct gpio_bank *bank, 
> int id)
>  
>                       /* Initialize interface clk ungated, module enabled */
>                       __raw_writel(0, bank->base + OMAP24XX_GPIO_CTRL);
> -             } else if (cpu_is_omap24xx()) {
> -                     static const u32 non_wakeup_gpios[] = {
> -                             0xe203ffc0, 0x08700040
> -                     };
> -                     if (id < ARRAY_SIZE(non_wakeup_gpios))
> -                             bank->non_wakeup_gpios = non_wakeup_gpios[id];
>               }
>       } else if (cpu_class_is_omap1()) {
>               if (bank_is_mpuio(bank))
> @@ -1179,6 +1173,7 @@ static int __devinit omap_gpio_probe(struct 
> platform_device *pdev)
>       bank->dbck_flag = pdata->dbck_flag;
>       bank->stride = pdata->bank_stride;
>       bank->width = pdata->bank_width;
> +     bank->non_wakeup_gpios = pdata->non_wakeup_gpios;
>  
>       bank->regs = pdata->regs;
>  
> @@ -1205,7 +1200,7 @@ static int __devinit omap_gpio_probe(struct 
> platform_device *pdev)
>       pm_runtime_enable(bank->dev);
>       pm_runtime_get_sync(bank->dev);
>  
> -     omap_gpio_mod_init(bank, id);
> +     omap_gpio_mod_init(bank);
>       omap_gpio_chip_init(bank);
>       omap_gpio_show_rev(bank);
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to