Message ID | 20150912182228.GA11354@dtor-ws (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sat, Sep 12, 2015 at 11:52 PM, Dmitry Torokhov <dmitry.torokhov@gmail.com> 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@gmail.com> >> --- >> 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@gmail.com> > > 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@gmail.com> > Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> > --- > 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
On Sat, Sep 12, 2015 at 10:08 PM, Vaishali Thakkar <vthakkar1994@gmail.com> wrote: > On Sat, Sep 12, 2015 at 11:52 PM, Dmitry Torokhov > <dmitry.torokhov@gmail.com> 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@gmail.com> >>> --- >>> 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? If the version I sent works for you there is no need to resend/splt. Thanks.
On Sun, Sep 13, 2015 at 12:31 PM, Dmitry Torokhov <dmitry.torokhov@gmail.com> wrote: > On Sat, Sep 12, 2015 at 10:08 PM, Vaishali Thakkar > <vthakkar1994@gmail.com> wrote: >> On Sat, Sep 12, 2015 at 11:52 PM, Dmitry Torokhov >> <dmitry.torokhov@gmail.com> 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@gmail.com> >>>> --- >>>> 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? > > If the version I sent works for you there is no need to resend/splt. Yeah, Ok. That works for me. > Thanks. > > -- > Dmitry
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