Re: [PATCH] Input: ad714x: Convert to using managed resources

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Sep 12, 2015 at 11:52 PM, Dmitry Torokhov
<dmitry.torokhov@xxxxxxxxx> wrote:
> On Sat, Sep 12, 2015 at 08:26:18PM +0530, Vaishali Thakkar wrote:
>> Use managed resource functions devm_request_threaded_irq,
>> devm_inpute_allocate_device and devm_kzalloc to simplify
>> error handling. Also, remove use of input_unregister_device
>> as input_register_device itself handles it and works as
>> resource managed function.
>>
>> To be compatible with the change, various gotos are replaced
>> with direct returns, and unneeded labels are dropped. With
>> these changes remove ad714x_remove and corresponding calls of
>> it as they are now redundant.
>>
>> Signed-off-by: Vaishali Thakkar <vthakkar1994@xxxxxxxxx>
>> ---
>> Please note that this patch is having three lines over 80
>> characters as limiting them to 80 characters makes code
>> less readable.
>
> You can actually remove input[input_alloc] and that will allow you to
> stay witing 80 columnts. Does the following version still work for you?

Sure. This makes perfect sense. Thanks.

Can I send v2 of a patch with all changes you suggested or would you
like me to split this patch in 2 patches?

> Thanks.
>
> Input: ad714x - convert to using managed resources
>
> From: Vaishali Thakkar <vthakkar1994@xxxxxxxxx>
>
> Use managed resource functions devm_request_threaded_irq,
> devm_inpute_allocate_device and devm_kzalloc to simplify error handling.
> Also, remove use of input_unregister_device as input_register_device itself
> handles it and works as resource managed function.
>
> To be compatible with the change, various gotos are replaced with direct
> returns, and unneeded labels are dropped. With these changes remove
> ad714x_remove and corresponding calls of it as they are now redundant.
>
> Signed-off-by: Vaishali Thakkar <vthakkar1994@xxxxxxxxx>
> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx>
> ---
>  drivers/input/misc/ad714x-i2c.c |   10 --
>  drivers/input/misc/ad714x-spi.c |   10 --
>  drivers/input/misc/ad714x.c     |  214 +++++++++++++++------------------------
>  drivers/input/misc/ad714x.h     |    1
>  4 files changed, 82 insertions(+), 153 deletions(-)
>
> diff --git a/drivers/input/misc/ad714x-i2c.c b/drivers/input/misc/ad714x-i2c.c
> index 189bdc8..2f04773 100644
> --- a/drivers/input/misc/ad714x-i2c.c
> +++ b/drivers/input/misc/ad714x-i2c.c
> @@ -85,15 +85,6 @@ static int ad714x_i2c_probe(struct i2c_client *client,
>         return 0;
>  }
>
> -static int ad714x_i2c_remove(struct i2c_client *client)
> -{
> -       struct ad714x_chip *chip = i2c_get_clientdata(client);
> -
> -       ad714x_remove(chip);
> -
> -       return 0;
> -}
> -
>  static const struct i2c_device_id ad714x_id[] = {
>         { "ad7142_captouch", 0 },
>         { "ad7143_captouch", 0 },
> @@ -110,7 +101,6 @@ static struct i2c_driver ad714x_i2c_driver = {
>                 .pm   = &ad714x_i2c_pm,
>         },
>         .probe    = ad714x_i2c_probe,
> -       .remove   = ad714x_i2c_remove,
>         .id_table = ad714x_id,
>  };
>
> diff --git a/drivers/input/misc/ad714x-spi.c b/drivers/input/misc/ad714x-spi.c
> index a79e50b..c8170f0 100644
> --- a/drivers/input/misc/ad714x-spi.c
> +++ b/drivers/input/misc/ad714x-spi.c
> @@ -101,15 +101,6 @@ static int ad714x_spi_probe(struct spi_device *spi)
>         return 0;
>  }
>
> -static int ad714x_spi_remove(struct spi_device *spi)
> -{
> -       struct ad714x_chip *chip = spi_get_drvdata(spi);
> -
> -       ad714x_remove(chip);
> -
> -       return 0;
> -}
> -
>  static struct spi_driver ad714x_spi_driver = {
>         .driver = {
>                 .name   = "ad714x_captouch",
> @@ -117,7 +108,6 @@ static struct spi_driver ad714x_spi_driver = {
>                 .pm     = &ad714x_spi_pm,
>         },
>         .probe          = ad714x_spi_probe,
> -       .remove         = ad714x_spi_remove,
>  };
>
>  module_spi_driver(ad714x_spi_driver);
> diff --git a/drivers/input/misc/ad714x.c b/drivers/input/misc/ad714x.c
> index 7a61e9e..84b51dd 100644
> --- a/drivers/input/misc/ad714x.c
> +++ b/drivers/input/misc/ad714x.c
> @@ -960,13 +960,12 @@ static irqreturn_t ad714x_interrupt_thread(int irq, void *data)
>         return IRQ_HANDLED;
>  }
>
> -#define MAX_DEVICE_NUM 8
>  struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
>                                  ad714x_read_t read, ad714x_write_t write)
>  {
> -       int i, alloc_idx;
> +       int i;
>         int error;
> -       struct input_dev *input[MAX_DEVICE_NUM];
> +       struct input_dev *input;
>
>         struct ad714x_platform_data *plat_data = dev_get_platdata(dev);
>         struct ad714x_chip *ad714x;
> @@ -982,25 +981,25 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
>         if (irq <= 0) {
>                 dev_err(dev, "IRQ not configured!\n");
>                 error = -EINVAL;
> -               goto err_out;
> +               return ERR_PTR(error);
>         }
>
>         if (dev_get_platdata(dev) == NULL) {
>                 dev_err(dev, "platform data for ad714x doesn't exist\n");
>                 error = -EINVAL;
> -               goto err_out;
> +               return ERR_PTR(error);
>         }
>
> -       ad714x = kzalloc(sizeof(*ad714x) + sizeof(*ad714x->sw) +
> -                        sizeof(*sd_drv) * plat_data->slider_num +
> -                        sizeof(*wl_drv) * plat_data->wheel_num +
> -                        sizeof(*tp_drv) * plat_data->touchpad_num +
> -                        sizeof(*bt_drv) * plat_data->button_num, GFP_KERNEL);
> +       ad714x = devm_kzalloc(dev, sizeof(*ad714x) + sizeof(*ad714x->sw) +
> +                                  sizeof(*sd_drv) * plat_data->slider_num +
> +                                  sizeof(*wl_drv) * plat_data->wheel_num +
> +                                  sizeof(*tp_drv) * plat_data->touchpad_num +
> +                                  sizeof(*bt_drv) * plat_data->button_num,
> +                             GFP_KERNEL);
>         if (!ad714x) {
>                 error = -ENOMEM;
> -               goto err_out;
> +               return ERR_PTR(error);
>         }
> -
>         ad714x->hw = plat_data;
>
>         drv_mem = ad714x + 1;
> @@ -1022,47 +1021,40 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
>
>         error = ad714x_hw_detect(ad714x);
>         if (error)
> -               goto err_free_mem;
> +               return ERR_PTR(error);
>
>         /* initialize and request sw/hw resources */
>
>         ad714x_hw_init(ad714x);
>         mutex_init(&ad714x->mutex);
>
> -       /*
> -        * Allocate and register AD714X input device
> -        */
> -       alloc_idx = 0;
> -
>         /* a slider uses one input_dev instance */
>         if (ad714x->hw->slider_num > 0) {
>                 struct ad714x_slider_plat *sd_plat = ad714x->hw->slider;
>
>                 for (i = 0; i < ad714x->hw->slider_num; i++) {
> -                       sd_drv[i].input = input[alloc_idx] = input_allocate_device();
> -                       if (!input[alloc_idx]) {
> -                               error = -ENOMEM;
> -                               goto err_free_dev;
> -                       }
> -
> -                       __set_bit(EV_ABS, input[alloc_idx]->evbit);
> -                       __set_bit(EV_KEY, input[alloc_idx]->evbit);
> -                       __set_bit(ABS_X, input[alloc_idx]->absbit);
> -                       __set_bit(BTN_TOUCH, input[alloc_idx]->keybit);
> -                       input_set_abs_params(input[alloc_idx],
> +                       input = devm_input_allocate_device(dev);
> +                       if (!input)
> +                               return ERR_PTR(-ENOMEM);
> +
> +                       __set_bit(EV_ABS, input->evbit);
> +                       __set_bit(EV_KEY, input->evbit);
> +                       __set_bit(ABS_X, input->absbit);
> +                       __set_bit(BTN_TOUCH, input->keybit);
> +                       input_set_abs_params(input,
>                                 ABS_X, 0, sd_plat->max_coord, 0, 0);
>
> -                       input[alloc_idx]->id.bustype = bus_type;
> -                       input[alloc_idx]->id.product = ad714x->product;
> -                       input[alloc_idx]->id.version = ad714x->version;
> -                       input[alloc_idx]->name = "ad714x_captouch_slider";
> -                       input[alloc_idx]->dev.parent = dev;
> +                       input->id.bustype = bus_type;
> +                       input->id.product = ad714x->product;
> +                       input->id.version = ad714x->version;
> +                       input->name = "ad714x_captouch_slider";
> +                       input->dev.parent = dev;
>
> -                       error = input_register_device(input[alloc_idx]);
> +                       error = input_register_device(input);
>                         if (error)
> -                               goto err_free_dev;
> +                               return ERR_PTR(error);
>
> -                       alloc_idx++;
> +                       sd_drv[i].input = input;
>                 }
>         }
>
> @@ -1071,30 +1063,28 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
>                 struct ad714x_wheel_plat *wl_plat = ad714x->hw->wheel;
>
>                 for (i = 0; i < ad714x->hw->wheel_num; i++) {
> -                       wl_drv[i].input = input[alloc_idx] = input_allocate_device();
> -                       if (!input[alloc_idx]) {
> -                               error = -ENOMEM;
> -                               goto err_free_dev;
> -                       }
> -
> -                       __set_bit(EV_KEY, input[alloc_idx]->evbit);
> -                       __set_bit(EV_ABS, input[alloc_idx]->evbit);
> -                       __set_bit(ABS_WHEEL, input[alloc_idx]->absbit);
> -                       __set_bit(BTN_TOUCH, input[alloc_idx]->keybit);
> -                       input_set_abs_params(input[alloc_idx],
> +                       input = devm_input_allocate_device(dev);
> +                       if (!input)
> +                               return ERR_PTR(-ENOMEM);
> +
> +                       __set_bit(EV_KEY, input->evbit);
> +                       __set_bit(EV_ABS, input->evbit);
> +                       __set_bit(ABS_WHEEL, input->absbit);
> +                       __set_bit(BTN_TOUCH, input->keybit);
> +                       input_set_abs_params(input,
>                                 ABS_WHEEL, 0, wl_plat->max_coord, 0, 0);
>
> -                       input[alloc_idx]->id.bustype = bus_type;
> -                       input[alloc_idx]->id.product = ad714x->product;
> -                       input[alloc_idx]->id.version = ad714x->version;
> -                       input[alloc_idx]->name = "ad714x_captouch_wheel";
> -                       input[alloc_idx]->dev.parent = dev;
> +                       input->id.bustype = bus_type;
> +                       input->id.product = ad714x->product;
> +                       input->id.version = ad714x->version;
> +                       input->name = "ad714x_captouch_wheel";
> +                       input->dev.parent = dev;
>
> -                       error = input_register_device(input[alloc_idx]);
> +                       error = input_register_device(input);
>                         if (error)
> -                               goto err_free_dev;
> +                               return ERR_PTR(error);
>
> -                       alloc_idx++;
> +                       wl_drv[i].input = input;
>                 }
>         }
>
> @@ -1103,33 +1093,31 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
>                 struct ad714x_touchpad_plat *tp_plat = ad714x->hw->touchpad;
>
>                 for (i = 0; i < ad714x->hw->touchpad_num; i++) {
> -                       tp_drv[i].input = input[alloc_idx] = input_allocate_device();
> -                       if (!input[alloc_idx]) {
> -                               error = -ENOMEM;
> -                               goto err_free_dev;
> -                       }
> -
> -                       __set_bit(EV_ABS, input[alloc_idx]->evbit);
> -                       __set_bit(EV_KEY, input[alloc_idx]->evbit);
> -                       __set_bit(ABS_X, input[alloc_idx]->absbit);
> -                       __set_bit(ABS_Y, input[alloc_idx]->absbit);
> -                       __set_bit(BTN_TOUCH, input[alloc_idx]->keybit);
> -                       input_set_abs_params(input[alloc_idx],
> +                       input = devm_input_allocate_device(dev);
> +                       if (!input)
> +                               return ERR_PTR(-ENOMEM);
> +
> +                       __set_bit(EV_ABS, input->evbit);
> +                       __set_bit(EV_KEY, input->evbit);
> +                       __set_bit(ABS_X, input->absbit);
> +                       __set_bit(ABS_Y, input->absbit);
> +                       __set_bit(BTN_TOUCH, input->keybit);
> +                       input_set_abs_params(input,
>                                 ABS_X, 0, tp_plat->x_max_coord, 0, 0);
> -                       input_set_abs_params(input[alloc_idx],
> +                       input_set_abs_params(input,
>                                 ABS_Y, 0, tp_plat->y_max_coord, 0, 0);
>
> -                       input[alloc_idx]->id.bustype = bus_type;
> -                       input[alloc_idx]->id.product = ad714x->product;
> -                       input[alloc_idx]->id.version = ad714x->version;
> -                       input[alloc_idx]->name = "ad714x_captouch_pad";
> -                       input[alloc_idx]->dev.parent = dev;
> +                       input->id.bustype = bus_type;
> +                       input->id.product = ad714x->product;
> +                       input->id.version = ad714x->version;
> +                       input->name = "ad714x_captouch_pad";
> +                       input->dev.parent = dev;
>
> -                       error = input_register_device(input[alloc_idx]);
> +                       error = input_register_device(input);
>                         if (error)
> -                               goto err_free_dev;
> +                               return ERR_PTR(error);
>
> -                       alloc_idx++;
> +                       tp_drv[i].input = input;
>                 }
>         }
>
> @@ -1137,82 +1125,44 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
>         if (ad714x->hw->button_num > 0) {
>                 struct ad714x_button_plat *bt_plat = ad714x->hw->button;
>
> -               input[alloc_idx] = input_allocate_device();
> -               if (!input[alloc_idx]) {
> +               input = devm_input_allocate_device(dev);
> +               if (!input) {
>                         error = -ENOMEM;
> -                       goto err_free_dev;
> +                       return ERR_PTR(error);
>                 }
>
> -               __set_bit(EV_KEY, input[alloc_idx]->evbit);
> +               __set_bit(EV_KEY, input->evbit);
>                 for (i = 0; i < ad714x->hw->button_num; i++) {
> -                       bt_drv[i].input = input[alloc_idx];
> -                       __set_bit(bt_plat[i].keycode, input[alloc_idx]->keybit);
> +                       bt_drv[i].input = input;
> +                       __set_bit(bt_plat[i].keycode, input->keybit);
>                 }
>
> -               input[alloc_idx]->id.bustype = bus_type;
> -               input[alloc_idx]->id.product = ad714x->product;
> -               input[alloc_idx]->id.version = ad714x->version;
> -               input[alloc_idx]->name = "ad714x_captouch_button";
> -               input[alloc_idx]->dev.parent = dev;
> +               input->id.bustype = bus_type;
> +               input->id.product = ad714x->product;
> +               input->id.version = ad714x->version;
> +               input->name = "ad714x_captouch_button";
> +               input->dev.parent = dev;
>
> -               error = input_register_device(input[alloc_idx]);
> +               error = input_register_device(input);
>                 if (error)
> -                       goto err_free_dev;
> -
> -               alloc_idx++;
> +                       return ERR_PTR(error);
>         }
>
>         irqflags = plat_data->irqflags ?: IRQF_TRIGGER_FALLING;
>         irqflags |= IRQF_ONESHOT;
>
> -       error = request_threaded_irq(ad714x->irq, NULL, ad714x_interrupt_thread,
> -                                    irqflags, "ad714x_captouch", ad714x);
> +       error = devm_request_threaded_irq(dev, ad714x->irq, NULL,
> +                                         ad714x_interrupt_thread,
> +                                         irqflags, "ad714x_captouch", ad714x);
>         if (error) {
>                 dev_err(dev, "can't allocate irq %d\n", ad714x->irq);
> -               goto err_unreg_dev;
> +               return ERR_PTR(error);
>         }
>
>         return ad714x;
> -
> - err_free_dev:
> -       dev_err(dev, "failed to setup AD714x input device %i\n", alloc_idx);
> -       input_free_device(input[alloc_idx]);
> - err_unreg_dev:
> -       while (--alloc_idx >= 0)
> -               input_unregister_device(input[alloc_idx]);
> - err_free_mem:
> -       kfree(ad714x);
> - err_out:
> -       return ERR_PTR(error);
>  }
>  EXPORT_SYMBOL(ad714x_probe);
>
> -void ad714x_remove(struct ad714x_chip *ad714x)
> -{
> -       struct ad714x_platform_data *hw = ad714x->hw;
> -       struct ad714x_driver_data *sw = ad714x->sw;
> -       int i;
> -
> -       free_irq(ad714x->irq, ad714x);
> -
> -       /* unregister and free all input devices */
> -
> -       for (i = 0; i < hw->slider_num; i++)
> -               input_unregister_device(sw->slider[i].input);
> -
> -       for (i = 0; i < hw->wheel_num; i++)
> -               input_unregister_device(sw->wheel[i].input);
> -
> -       for (i = 0; i < hw->touchpad_num; i++)
> -               input_unregister_device(sw->touchpad[i].input);
> -
> -       if (hw->button_num)
> -               input_unregister_device(sw->button[0].input);
> -
> -       kfree(ad714x);
> -}
> -EXPORT_SYMBOL(ad714x_remove);
> -
>  #ifdef CONFIG_PM
>  int ad714x_disable(struct ad714x_chip *ad714x)
>  {
> diff --git a/drivers/input/misc/ad714x.h b/drivers/input/misc/ad714x.h
> index 3c85455..5d65d30 100644
> --- a/drivers/input/misc/ad714x.h
> +++ b/drivers/input/misc/ad714x.h
> @@ -50,6 +50,5 @@ int ad714x_disable(struct ad714x_chip *ad714x);
>  int ad714x_enable(struct ad714x_chip *ad714x);
>  struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
>                                  ad714x_read_t read, ad714x_write_t write);
> -void ad714x_remove(struct ad714x_chip *ad714x);
>
>  #endif
>
> --
> Dmitry



-- 
Vaishali
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux