On Fri, Sep 04, 2020 at 05:45:39PM +0200, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bgolaszew...@baylibre.com>
> 
> We're currently creating chips at module init time only so using a
> static index for dummy devices is fine. We want to support dynamically
> created chips however so we need to switch to dynamic device IDs.

It misses ida_destroy().

What about XArray API?

> Signed-off-by: Bartosz Golaszewski <bgolaszew...@baylibre.com>
> ---
>  drivers/gpio/gpio-mockup.c | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpio/gpio-mockup.c b/drivers/gpio/gpio-mockup.c
> index 96976ba66598..995e37fef9c5 100644
> --- a/drivers/gpio/gpio-mockup.c
> +++ b/drivers/gpio/gpio-mockup.c
> @@ -9,6 +9,7 @@
>  
>  #include <linux/debugfs.h>
>  #include <linux/gpio/driver.h>
> +#include <linux/idr.h>
>  #include <linux/interrupt.h>
>  #include <linux/irq.h>
>  #include <linux/irq_sim.h>
> @@ -70,6 +71,8 @@ module_param_named(gpio_mockup_named_lines,
>  
>  static struct dentry *gpio_mockup_dbg_dir;
>  
> +static DEFINE_IDA(gpio_mockup_ida);
> +
>  static int gpio_mockup_range_base(unsigned int index)
>  {
>       return gpio_mockup_ranges[index * 2];
> @@ -480,8 +483,12 @@ static LIST_HEAD(gpio_mockup_devices);
>  
>  static void gpio_mockup_unregister_one_device(struct gpio_mockup_device *dev)
>  {
> +     int id;
> +
>       list_del(&dev->list);
> +     id = dev->pdev->id;
>       platform_device_unregister(dev->pdev);
> +     ida_free(&gpio_mockup_ida, id);
>       kfree(dev);
>  }
>  
> @@ -587,12 +594,19 @@ static int __init gpio_mockup_init(void)
>               }
>  
>               pdevinfo.name = "gpio-mockup";
> -             pdevinfo.id = i;
>               pdevinfo.properties = properties;
>  
> +             pdevinfo.id = ida_alloc(&gpio_mockup_ida, GFP_KERNEL);
> +             if (pdevinfo.id < 0) {
> +                     kfree_strarray(line_names, ngpio);
> +                     err = pdevinfo.id;
> +                     goto err_out;
> +             }
> +
>               mockup_dev = kzalloc(sizeof(*mockup_dev), GFP_KERNEL);
>               if (!mockup_dev) {
>                       kfree_strarray(line_names, ngpio);
> +                     ida_free(&gpio_mockup_ida, pdevinfo.id);
>                       err = -ENOMEM;
>                       goto err_out;
>               }
> @@ -601,6 +615,7 @@ static int __init gpio_mockup_init(void)
>               kfree_strarray(line_names, ngpio);
>               if (IS_ERR(mockup_dev->pdev)) {
>                       pr_err("error registering device");
> +                     ida_free(&gpio_mockup_ida, pdevinfo.id);
>                       kfree(mockup_dev);
>                       err = PTR_ERR(mockup_dev->pdev);
>                       goto err_out;
> -- 
> 2.26.1
> 

-- 
With Best Regards,
Andy Shevchenko


Reply via email to