Messages in this thread | | | From | Jingoo Han <> | Subject | Re: [PATCH 05/11] mfd: twl6040: use devm_gpio_request_one() and devm_request_threaded_irq() | Date | Wed, 20 Feb 2013 17:09:01 +0900 |
| |
On Wednesday, February 20, 2013 4:37 PM, Dmitry Torokhov wrote: > > Hi Jingoo, > > On Wed, Feb 20, 2013 at 03:11:38PM +0900, Jingoo Han wrote: > > Use devm_gpio_request_one() and devm_request_threaded_irq() to make > > cleanup paths and more simple. > > > > Signed-off-by: Jingoo Han <jg1.han@samsung.com> > > --- > > drivers/mfd/twl6040.c | 26 +++++++------------------- > > 1 files changed, 7 insertions(+), 19 deletions(-) > > > > diff --git a/drivers/mfd/twl6040.c b/drivers/mfd/twl6040.c > > index f361bf3..2d38512 100644 > > --- a/drivers/mfd/twl6040.c > > +++ b/drivers/mfd/twl6040.c > > @@ -586,8 +586,8 @@ static int twl6040_probe(struct i2c_client *client, > > twl6040->audpwron = -EINVAL; > > > > if (gpio_is_valid(twl6040->audpwron)) { > > - ret = gpio_request_one(twl6040->audpwron, GPIOF_OUT_INIT_LOW, > > - "audpwron"); > > + ret = devm_gpio_request_one(twl6040->dev, twl6040->audpwron, > > + GPIOF_OUT_INIT_LOW, "audpwron"); > > if (ret) > > goto gpio_err; > > } > > @@ -596,14 +596,14 @@ static int twl6040_probe(struct i2c_client *client, > > IRQF_ONESHOT, 0, &twl6040_irq_chip, > > &twl6040->irq_data); > > if (ret < 0) > > - goto irq_init_err; > > + goto gpio_err; > > > > twl6040->irq_ready = regmap_irq_get_virq(twl6040->irq_data, > > TWL6040_IRQ_READY); > > twl6040->irq_th = regmap_irq_get_virq(twl6040->irq_data, > > TWL6040_IRQ_TH); > > > > - ret = request_threaded_irq(twl6040->irq_ready, NULL, > > + ret = devm_request_threaded_irq(twl6040->dev, twl6040->irq_ready, NULL, > > twl6040_readyint_handler, IRQF_ONESHOT, > > "twl6040_irq_ready", twl6040); > > if (ret) { > > @@ -611,12 +611,12 @@ static int twl6040_probe(struct i2c_client *client, > > goto readyirq_err; > > } > > > > - ret = request_threaded_irq(twl6040->irq_th, NULL, > > + ret = devm_request_threaded_irq(twl6040->dev, twl6040->irq_th, NULL, > > twl6040_thint_handler, IRQF_ONESHOT, > > "twl6040_irq_th", twl6040); > > if (ret) { > > dev_err(twl6040->dev, "Thermal IRQ request failed: %d\n", ret); > > - goto thirq_err; > > + goto readyirq_err; > > } > > > > /* dual-access registers controlled by I2C only */ > > @@ -676,19 +676,12 @@ static int twl6040_probe(struct i2c_client *client, > > ret = mfd_add_devices(&client->dev, -1, twl6040->cells, children, > > NULL, 0, NULL); > > if (ret) > > - goto mfd_err; > > + goto readyirq_err; > > > > return 0; > > > > -mfd_err: > > - free_irq(twl6040->irq_th, twl6040); > > -thirq_err: > > - free_irq(twl6040->irq_ready, twl6040); > > readyirq_err: > > regmap_del_irq_chip(twl6040->irq, twl6040->irq_data); > > -irq_init_err: > > - if (gpio_is_valid(twl6040->audpwron)) > > - gpio_free(twl6040->audpwron); > > gpio_err: > > regulator_bulk_disable(TWL6040_NUM_SUPPLIES, twl6040->supplies); > > power_err: > > @@ -706,11 +699,6 @@ static int twl6040_remove(struct i2c_client *client) > > if (twl6040->power_count) > > twl6040_power(twl6040, 0); > > > > - if (gpio_is_valid(twl6040->audpwron)) > > - gpio_free(twl6040->audpwron); > > - > > - free_irq(twl6040->irq_ready, twl6040); > > - free_irq(twl6040->irq_th, twl6040); > > regmap_del_irq_chip(twl6040->irq, twl6040->irq_data); > > > > mfd_remove_devices(&client->dev); > > Are you sure it is OK to have sub-devices removed and regmap destroyed > with IRQs still active?
Yes, you're right. I will use devm_free_irq().
> > Thanks. > > -- > Dmitry
| |