Tarun Kanti DebBarma <[email protected]> writes:

> From: Charulatha V <[email protected]>
>
> gpio_bank_count is the count of number of GPIO devices
> in a SoC. Remove this dependency from the driver. Also remove
> the dependency on array of pointers to gpio_bank struct of
> all GPIO devices.
>
> The cpu_is*() checks used in omap2_gpio_prepare_for_idle() and
> omap2_gpio_resume_after_idle() would be removed in one of the
> patches in this series
>
> Signed-off-by: Charulatha V <[email protected]>
> Cc: Santosh Shilimkar <[email protected]>
> Cc: Kevin Hilman <[email protected]>
> Cc: Tony Lindgren <[email protected]>


Nice.  I like this direction.... Some minor comments below...

> ---
>  arch/arm/mach-omap1/gpio15xx.c         |    1 -
>  arch/arm/mach-omap1/gpio16xx.c         |    2 -
>  arch/arm/mach-omap1/gpio7xx.c          |    2 -
>  arch/arm/mach-omap2/gpio.c             |    1 -
>  arch/arm/plat-omap/gpio.c              |  157 ++++++++++++++++---------------
>  arch/arm/plat-omap/include/plat/gpio.h |    3 -
>  6 files changed, 81 insertions(+), 85 deletions(-)
>
> diff --git a/arch/arm/mach-omap1/gpio15xx.c b/arch/arm/mach-omap1/gpio15xx.c
> index c3caf25..7a15f69 100644
> --- a/arch/arm/mach-omap1/gpio15xx.c
> +++ b/arch/arm/mach-omap1/gpio15xx.c
> @@ -117,7 +117,6 @@ static int __init omap15xx_gpio_init(void)
>       platform_device_register(&omap15xx_mpu_gpio);
>       platform_device_register(&omap15xx_gpio);
>  
> -     gpio_bank_count = 2;
>       return 0;
>  }
>  postcore_initcall(omap15xx_gpio_init);
> diff --git a/arch/arm/mach-omap1/gpio16xx.c b/arch/arm/mach-omap1/gpio16xx.c
> index f62eaf3..43718ec 100644
> --- a/arch/arm/mach-omap1/gpio16xx.c
> +++ b/arch/arm/mach-omap1/gpio16xx.c
> @@ -223,8 +223,6 @@ static int __init omap16xx_gpio_init(void)
>       for (i = 0; i < ARRAY_SIZE(omap16xx_gpio_dev); i++)
>               platform_device_register(omap16xx_gpio_dev[i]);
>  
> -     gpio_bank_count = ARRAY_SIZE(omap16xx_gpio_dev);
> -
>       return 0;
>  }
>  postcore_initcall(omap16xx_gpio_init);
> diff --git a/arch/arm/mach-omap1/gpio7xx.c b/arch/arm/mach-omap1/gpio7xx.c
> index 0fc2557..c7684ce 100644
> --- a/arch/arm/mach-omap1/gpio7xx.c
> +++ b/arch/arm/mach-omap1/gpio7xx.c
> @@ -284,8 +284,6 @@ static int __init omap7xx_gpio_init(void)
>       for (i = 0; i < ARRAY_SIZE(omap7xx_gpio_dev); i++)
>               platform_device_register(omap7xx_gpio_dev[i]);
>  
> -     gpio_bank_count = ARRAY_SIZE(omap7xx_gpio_dev);
> -
>       return 0;
>  }
>  postcore_initcall(omap7xx_gpio_init);
> diff --git a/arch/arm/mach-omap2/gpio.c b/arch/arm/mach-omap2/gpio.c
> index 6cd26b4..487b49a 100644
> --- a/arch/arm/mach-omap2/gpio.c
> +++ b/arch/arm/mach-omap2/gpio.c
> @@ -143,7 +143,6 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, 
> void *unused)
>               return PTR_ERR(od);
>       }
>  
> -     gpio_bank_count++;
>       return 0;
>  }
>  
> diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c
> index 12deb1c..0b76475 100644
> --- a/arch/arm/plat-omap/gpio.c
> +++ b/arch/arm/plat-omap/gpio.c
> @@ -30,7 +30,10 @@
>  #include <mach/gpio.h>
>  #include <asm/mach/irq.h>
>  
> +static LIST_HEAD(omap_gpio_list);
> +
>  struct gpio_bank {
> +     struct list_head node;
>       unsigned long pbase;
>       void __iomem *base;
>       u16 irq;
> @@ -57,6 +60,7 @@ struct gpio_bank {
>       bool dbck_flag;
>       int stride;
>       u32 width;
> +     u16 id;
>  
>       void (*set_dataout)(struct gpio_bank *bank, int gpio, int enable);
>  
> @@ -80,15 +84,6 @@ struct omap3_gpio_regs {
>  static struct omap3_gpio_regs gpio_context[OMAP34XX_NR_GPIOS];
>  #endif
>  
> -/*
> - * TODO: Cleanup gpio_bank usage as it is having information
> - * related to all instances of the device
> - */
> -static struct gpio_bank *gpio_bank;
> -
> -/* TODO: Analyze removing gpio_bank_count usage from driver code */
> -int gpio_bank_count;
> -
>  #define GPIO_INDEX(bank, gpio) (gpio % bank->width)
>  #define GPIO_BIT(bank, gpio) (1 << GPIO_INDEX(bank, gpio))
>  #define GPIO_MOD_CTRL_BIT    BIT(0)
> @@ -859,23 +854,29 @@ static struct platform_device omap_mpuio_device = {
>       /* could list the /proc/iomem resources */
>  };
>  
> -static inline void mpuio_init(void)
> +static inline void mpuio_init(struct gpio_bank *bank)
>  {
> -     struct gpio_bank *bank = &gpio_bank[0];
> +     static int mpuio_init_done;

Why is this flag needed?   isn't the bank->method check enough?

> +     if (mpuio_init_done || (bank->method != METHOD_MPUIO))
> +             return;
> +
>       platform_set_drvdata(&omap_mpuio_device, bank);
>  
>       if (platform_driver_register(&omap_mpuio_driver) == 0)
>               (void) platform_device_register(&omap_mpuio_device);
> +
> +     mpuio_init_done = 1;
>  }
>  
>  #else
> -static inline void mpuio_init(void) {}
> +static inline void mpuio_init(struct gpio_bank *bank) {}
>  #endif       /* 16xx */
>  
>  #else
>  
>  #define bank_is_mpuio(bank)  0
> -static inline void mpuio_init(void) {}
> +static inline void mpuio_init(struct gpio_bank *bank) {}
>  
>  #endif
>  
> @@ -997,18 +998,6 @@ static void __init omap_gpio_show_rev(struct gpio_bank 
> *bank)
>   */
>  static struct lock_class_key gpio_lock_class;
>  
> -static inline int init_gpio_info(struct platform_device *pdev)
> -{
> -     /* TODO: Analyze removing gpio_bank_count usage from driver code */
> -     gpio_bank = kzalloc(gpio_bank_count * sizeof(struct gpio_bank),
> -                             GFP_KERNEL);
> -     if (!gpio_bank) {
> -             dev_err(&pdev->dev, "Memory alloc failed for gpio_bank\n");
> -             return -ENOMEM;
> -     }
> -     return 0;
> -}
> -
>  /* TODO: Cleanup cpu_is_* checks */
>  static void omap_gpio_mod_init(struct gpio_bank *bank)
>  {
> @@ -1140,36 +1129,37 @@ static void __init omap_gpio_chip_init(struct 
> gpio_bank *bank)
>  
>  static int __devinit omap_gpio_probe(struct platform_device *pdev)
>  {
> -     static int gpio_init_done;
>       struct omap_gpio_platform_data *pdata;
>       struct resource *res;
> -     int id;
>       struct gpio_bank *bank;
> +     int ret = 0;
>  
> -     if (!pdev->dev.platform_data)
> -             return -EINVAL;
> -
> -     pdata = pdev->dev.platform_data;
> -
> -     if (!gpio_init_done) {
> -             int ret;
> -
> -             ret = init_gpio_info(pdev);
> -             if (ret)
> -                     return ret;
> +     if (!pdev->dev.platform_data) {
> +             ret = -EINVAL;
> +             goto err_exit;
>       }
>  
> -     id = pdev->id;
> -     bank = &gpio_bank[id];
> +     bank = kzalloc(sizeof(struct gpio_bank), GFP_KERNEL);
> +     if (!bank) {
> +             dev_err(&pdev->dev, "Memory alloc failed for gpio_bank\n");
> +             ret = -ENOMEM;
> +             goto err_exit;
> +     }
>  
>       res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
>       if (unlikely(!res)) {
> -             dev_err(&pdev->dev, "GPIO Bank %i Invalid IRQ resource\n", id);
> -             return -ENODEV;
> +             dev_err(&pdev->dev, "GPIO Bank %i Invalid IRQ resource\n",
> +                             pdev->id);
> +             ret = -ENODEV;
> +             goto err_free;
>       }
>  
>       bank->irq = res->start;
> +     bank->id = pdev->id;
> +
> +     pdata = pdev->dev.platform_data;
>       bank->virtual_irq_start = pdata->virtual_irq_start;
> +
>       bank->method = pdata->bank_type;
>       bank->dev = &pdev->dev;
>       bank->dbck_flag = pdata->dbck_flag;
> @@ -1189,39 +1179,47 @@ static int __devinit omap_gpio_probe(struct 
> platform_device *pdev)
>       /* Static mapping, never released */
>       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>       if (unlikely(!res)) {
> -             dev_err(&pdev->dev, "GPIO Bank %i Invalid mem resource\n", id);
> -             return -ENODEV;
> +             dev_err(&pdev->dev, "GPIO Bank %i Invalid mem resource\n",
> +                             pdev->id);
> +             ret = -ENODEV;
> +             goto err_free;
>       }
>  
>       bank->base = ioremap(res->start, resource_size(res));
>       if (!bank->base) {
> -             dev_err(&pdev->dev, "Could not ioremap gpio bank%i\n", id);
> -             return -ENOMEM;
> +             dev_err(&pdev->dev, "Could not ioremap gpio bank%i\n",
> +                             pdev->id);
> +             ret = -ENOMEM;
> +             goto err_free;
>       }
>  
>       pm_runtime_enable(bank->dev);
>       pm_runtime_get_sync(bank->dev);
>  
> +     mpuio_init(bank);

How about moving this call into _mod_init(), and call it only when
->method = MPUIO.

>       omap_gpio_mod_init(bank);
>       omap_gpio_chip_init(bank);
>       omap_gpio_show_rev(bank);

[...]

Kevin
--
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