Messages in this thread |  | | Date | Wed, 6 May 2026 18:47:49 +0100 | | From | Jonathan Cameron <> | | Subject | Re: [PATCH v3 02/10] iio: accel: mma8452: switch to non-devm request_threaded_irq() |
| |
On Tue, 5 May 2026 23:16:32 +0530 Sanjay Chitroda <sanjayembeddedse@gmail.com> wrote:
> From: Sanjay Chitroda <sanjayembeddedse@gmail.com> > > Avoid using devm_request_threaded_irq() as the driver requires explicit > error-handling path(s). Using devm_* API together with goto-based > unwinding breaks the expected LIFO resource release model. > > Add explicit IRQ cleanup in the driver teardown paths to follow kernel > resource management conventions. > > Fixes: 28e3427824cc ("iio: mma8452: Basic support for transient events.") For a fixes tag we need to have an explicit issue rather than it not following best practice. Patch itself is correct, and if all else is good and you don't have a specific ordering problem in mind I'll just drop the fixes tag whilst applying.
> Signed-off-by: Sanjay Chitroda <sanjayembeddedse@gmail.com> > --- > drivers/iio/accel/mma8452.c | 19 ++++++++++++------- > 1 file changed, 12 insertions(+), 7 deletions(-) > > diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c > index cefc7cf4bd83..279a9b364886 100644 > --- a/drivers/iio/accel/mma8452.c > +++ b/drivers/iio/accel/mma8452.c > @@ -1682,18 +1682,16 @@ static int mma8452_probe(struct i2c_client *client) > goto trigger_cleanup; > > if (client->irq) { > - ret = devm_request_threaded_irq(&client->dev, > - client->irq, > - NULL, mma8452_interrupt, > - IRQF_TRIGGER_LOW | IRQF_ONESHOT, > - client->name, indio_dev); > + ret = request_threaded_irq(client->irq, NULL, mma8452_interrupt, > + IRQF_TRIGGER_LOW | IRQF_ONESHOT, > + client->name, indio_dev); > if (ret) > goto buffer_cleanup; > } > > ret = pm_runtime_set_active(&client->dev); > if (ret < 0) > - goto buffer_cleanup; > + goto free_irq; > > pm_runtime_enable(&client->dev); > pm_runtime_set_autosuspend_delay(&client->dev, > @@ -1702,7 +1700,7 @@ static int mma8452_probe(struct i2c_client *client) > > ret = iio_device_register(indio_dev); > if (ret < 0) > - goto buffer_cleanup; > + goto free_irq; > > ret = mma8452_set_freefall_mode(data, false); > if (ret < 0) > @@ -1713,6 +1711,10 @@ static int mma8452_probe(struct i2c_client *client) > unregister_device: > iio_device_unregister(indio_dev); > > +free_irq: > + if (client->irq) > + free_irq(client->irq, indio_dev); > + > buffer_cleanup: > iio_triggered_buffer_cleanup(indio_dev); > > @@ -1738,6 +1740,9 @@ static void mma8452_remove(struct i2c_client *client) > pm_runtime_disable(&client->dev); > pm_runtime_set_suspended(&client->dev); > > + if (client->irq) > + free_irq(client->irq, indio_dev); > + > iio_triggered_buffer_cleanup(indio_dev); > mma8452_trigger_cleanup(indio_dev); > mma8452_standby(iio_priv(indio_dev));
|  |