iio: gyro: bmg160: Fix error handling in bmg160_core_probe
PATCH 1/1 iio: gyro: bmg160: Fix error handling in bmg160_core_probe
The pm_runtime_enable will increase power disable depth. If the probe fails, we should use pm_runtime_disable() to balance pm_runtime_enable(). In the PM Runtime docs:
Drivers in ->remove() callback should undo the runtime PM changes done
in ->probe(). Usually this means calling pm_runtime_disable(),
pm_runtime_dont_use_autosuspend() etc.We should do this in error handling.
--- drivers/iio/gyro/bmg160_core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/iio/gyro/bmg160_core.c +4 -1
@@ -1188,11 +1188,14 @@ int bmg160_core_probe(struct device *dev, struct regmap *regmap, int irq, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (dev,"unable to register iio device\n" ); - goto err_buffer_cleanup; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (dev); +pm_runtime_disable (dev); err_buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev); err_trigger_unregister:
Signature · 1 line
2.17.1
Quoted 9 lines · On Wed, 5 Jan 2022 12:56:30 +0000 Miaoqian Lin <[email protected]> wrote:
The
pm_runtime_enablewill increase power disable depth. If the probe fails, we should usepm_runtime_disable()to balancepm_runtime_enable(). In the PM Runtime docs:Drivers in ->remove() callback should undo the runtime PM changes done in ->probe(). Usually this means calling pm_runtime_disable(), pm_runtime_dont_use_autosuspend() etc.We should do this in error handling.
Fixes 7d0ead5 ("iio: Reconcile operation order between iio_register/unregister and pm functions")
Hi Miaoqian,
Please check this fixes tag against the format it should have.
Thanks,
Jonathan
Quoted 25 lines
Signed-off-by Miaoqian Lin <[email protected]>--- drivers/iio/gyro/bmg160_core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)drivers/iio/gyro/bmg160_core.c +4
-1@@ -1188,11 +1188,14 @@ int bmg160_core_probe(struct device *dev, struct regmap *regmap, int irq, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (dev,"unable to register iio device\n" ); - goto err_buffer_cleanup; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (dev); +pm_runtime_disable (dev); err_buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev); err_trigger_unregister:
Quoted 11 lines · Jonathan Cameron
Quoted 8 lines · On Wed, 5 Jan 2022 12:56:30 +0000 Miaoqian Lin <[email protected]> wrote:
The
pm_runtime_enablewill increase power disable depth. If the probe fails, we should usepm_runtime_disable()to balancepm_runtime_enable(). In the PM Runtime docs:Drivers in ->remove() callback should undo the runtime PM changes done in ->probe(). Usually this means calling pm_runtime_disable(), pm_runtime_dont_use_autosuspend() etc.We should do this in error handling.
Quoted 5 lines
Quoted 1 line
Fixes 7d0ead5 ("iio: Reconcile operation order between iio_register/unregister and pm functions")Hi Miaoqian,
Please check this fixes tag against the format it should have.
I usually advise people to put the following in the ~/.gitconfig:
[core]
abbrev = 12
[alias]
one = show -s --pretty='format:%h (\"%s\")' c = show -s --pretty='format:https://git.kernel.org/torvalds/c/%h'
git one ... will give a right thing.
Signature · 2 lines
With Best Regards, Andy Shevchenko
Quoted 7 lines · Miaoqian Lin
The
pm_runtime_enablewill increase power disable depth. If the probe fails, we should usepm_runtime_disable()to balancepm_runtime_enable(). In the PM Runtime docs:Drivers in ->remove() callback should undo the runtime PM changes done in ->probe(). Usually this means calling pm_runtime_disable(), pm_runtime_dont_use_autosuspend() etc.We should do this in error handling.
Looking into culprit commit, can you fix all of them, please?
Signature · 2 lines
With Best Regards, Andy Shevchenko
PATCH v2 1/1 iio: Fix error handling for PM
The pm_runtime_enable will increase power disable depth. If the probe fails, we should use pm_runtime_disable() to balance pm_runtime_enable(). In the PM Runtime docs:
Drivers in ->remove() callback should undo the runtime PM changes done
in ->probe(). Usually this means calling pm_runtime_disable(),
pm_runtime_dont_use_autosuspend() etc.We should do this in error handling.
Fix this problem for the following drivers: bmc150, bmg160, kmx61, kxcj-1013, mma9551, mma9553.
---
Changes in v2:
- fix the fixes tag
- fix similar problems introduced by the same commit
--- drivers/iio/accel/bmc150-accel-core.c | 5 ++++- drivers/iio/accel/kxcjk-1013.c | 5 ++++- drivers/iio/accel/mma9551.c | 5 ++++- drivers/iio/accel/mma9553.c | 5 ++++- drivers/iio/gyro/bmg160_core.c | 5 ++++- drivers/iio/imu/kmx61.c | 5 ++++- drivers/iio/magnetometer/bmc150_magn.c | 5 +++-- 7 files changed, 27 insertions(+), 8 deletions(-)
drivers/iio/accel/bmc150-accel-core.c +4 -1
@@ -1783,11 +1783,14 @@ int bmc150_accel_core_probe(struct device *dev, struct regmap *regmap, int irq, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (dev,"Unable to register iio device\n" ); - goto err_trigger_unregister; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (dev); +pm_runtime_disable (dev); err_trigger_unregister:bmc150_accel_unregister_triggers (data,BMC150_ACCEL_TRIGGERS -1 ); err_buffer_cleanup:
drivers/iio/accel/kxcjk-1013.c +4 -1
@@ -1589,11 +1589,14 @@ static int kxcjk1013_probe(struct i2c_client *client, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (&client->dev,"unable to register iio device\n" ); - goto err_buffer_cleanup; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); err_buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev); err_trigger_unregister:
drivers/iio/accel/mma9551.c +4 -1
@@ -495,11 +495,14 @@ static int mma9551_probe(struct i2c_client *client, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (&client->dev,"unable to register iio device\n" ); - goto out_poweroff; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); out_poweroff:mma9551_set_device_state (client, false);
drivers/iio/accel/mma9553.c +4 -1
@@ -1134,12 +1134,15 @@ static int mma9553_probe(struct i2c_client *client, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (&client->dev,"unable to register iio device\n" ); - goto out_poweroff; + goto err_pm_cleanup; }dev_dbg (&indio_dev->dev,"Registered device %s\n" , name);return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); out_poweroff:mma9551_set_device_state (client, false);return ret;
drivers/iio/gyro/bmg160_core.c +4 -1
@@ -1188,11 +1188,14 @@ int bmg160_core_probe(struct device *dev, struct regmap *regmap, int irq, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (dev,"unable to register iio device\n" ); - goto err_buffer_cleanup; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (dev); +pm_runtime_disable (dev); err_buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev); err_trigger_unregister:
drivers/iio/imu/kmx61.c +4 -1
@@ -1385,7 +1385,7 @@ static int kmx61_probe(struct i2c_client *client, ret =iio_device_register (data->acc_indio_dev);if (ret <0 ) {dev_err (&client->dev,"Failed to register acc iio device\n" ); - goto err_buffer_cleanup_mag; + goto err_pm_cleanup; } ret =iio_device_register (data->mag_indio_dev);
@@ -1398,6 +1398,9 @@ static int kmx61_probe(struct i2c_client *client, err_iio_unregister_acc:iio_device_unregister (data->acc_indio_dev); +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); err_buffer_cleanup_mag:if (client->irq >0 )iio_triggered_buffer_cleanup (data->mag_indio_dev);
drivers/iio/magnetometer/bmc150_magn.c +3 -2
@@ -962,13 +962,14 @@ int bmc150_magn_probe(struct device *dev, struct regmap *regmap, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (dev,"unable to register iio device\n" ); - goto err_disable_runtime_pm; + goto err_pm_cleanup; }dev_dbg (dev,"Registered device %s\n" , name);return 0 ; -err_disable_runtime_pm: +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (dev);pm_runtime_disable (dev); err_buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev);
Signature · 1 line
2.17.1
Re: [PATCH v2] iio: Fix error handling for PM
Quoted 10 lines · Miaoqian Lin
The
pm_runtime_enablewill increase power disable depth. If the probe fails, we should usepm_runtime_disable()to balancepm_runtime_enable(). In the PM Runtime docs:Drivers in ->remove() callback should undo the runtime PM changes done in ->probe(). Usually this means calling pm_runtime_disable(), pm_runtime_dont_use_autosuspend() etc.We should do this in error handling.
Fix this problem for the following drivers: bmc150, bmg160, kmx61, kxcj-1013, mma9551, mma9553.
LGTM, FWIW,
Quoted 164 lines
Fixes 7d0ead5c3f00 ("iio: Reconcile operation order between iio_register/unregister and pm functions")Signed-off-by Miaoqian Lin <[email protected]>---
Changes in v2:
- fix the fixes tag
- fix similar problems introduced by the same commit--- drivers/iio/accel/bmc150-accel-core.c | 5 ++++- drivers/iio/accel/kxcjk-1013.c | 5 ++++- drivers/iio/accel/mma9551.c | 5 ++++- drivers/iio/accel/mma9553.c | 5 ++++- drivers/iio/gyro/bmg160_core.c | 5 ++++- drivers/iio/imu/kmx61.c | 5 ++++- drivers/iio/magnetometer/bmc150_magn.c | 5 +++-- 7 files changed, 27 insertions(+), 8 deletions(-)drivers/iio/accel/bmc150-accel-core.c +4
-1@@ -1783,11 +1783,14 @@ int bmc150_accel_core_probe(struct device *dev, struct regmap *regmap, int irq, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (dev,"Unable to register iio device\n" ); - goto err_trigger_unregister; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (dev); +pm_runtime_disable (dev); err_trigger_unregister:bmc150_accel_unregister_triggers (data,BMC150_ACCEL_TRIGGERS -1 ); err_buffer_cleanup:drivers/iio/accel/kxcjk-1013.c +4
-1@@ -1589,11 +1589,14 @@ static int kxcjk1013_probe(struct i2c_client *client, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (&client->dev,"unable to register iio device\n" ); - goto err_buffer_cleanup; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); err_buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev); err_trigger_unregister:drivers/iio/accel/mma9551.c +4
-1@@ -495,11 +495,14 @@ static int mma9551_probe(struct i2c_client *client, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (&client->dev,"unable to register iio device\n" ); - goto out_poweroff; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); out_poweroff:mma9551_set_device_state (client, false);drivers/iio/accel/mma9553.c +4
-1@@ -1134,12 +1134,15 @@ static int mma9553_probe(struct i2c_client *client, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (&client->dev,"unable to register iio device\n" ); - goto out_poweroff; + goto err_pm_cleanup; }dev_dbg (&indio_dev->dev,"Registered device %s\n" , name);return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); out_poweroff:mma9551_set_device_state (client, false);return ret;drivers/iio/gyro/bmg160_core.c +4
-1@@ -1188,11 +1188,14 @@ int bmg160_core_probe(struct device *dev, struct regmap *regmap, int irq, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (dev,"unable to register iio device\n" ); - goto err_buffer_cleanup; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (dev); +pm_runtime_disable (dev); err_buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev); err_trigger_unregister:drivers/iio/imu/kmx61.c +4
-1@@ -1385,7 +1385,7 @@ static int kmx61_probe(struct i2c_client *client, ret =iio_device_register (data->acc_indio_dev);if (ret <0 ) {dev_err (&client->dev,"Failed to register acc iio device\n" ); - goto err_buffer_cleanup_mag; + goto err_pm_cleanup; } ret =iio_device_register (data->mag_indio_dev);@@ -1398,6 +1398,9 @@ static int kmx61_probe(struct i2c_client *client, err_iio_unregister_acc:iio_device_unregister (data->acc_indio_dev); +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); err_buffer_cleanup_mag:if (client->irq >0 )iio_triggered_buffer_cleanup (data->mag_indio_dev);drivers/iio/magnetometer/bmc150_magn.c +3
-2@@ -962,13 +962,14 @@ int bmc150_magn_probe(struct device *dev, struct regmap *regmap, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (dev,"unable to register iio device\n" ); - goto err_disable_runtime_pm; + goto err_pm_cleanup; }dev_dbg (dev,"Registered device %s\n" , name);return 0 ; -err_disable_runtime_pm: +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (dev);pm_runtime_disable (dev); err_buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev);Signature · 1 line
2.17.1
Signature · 2 lines
With Best Regards, Andy Shevchenko
Re: [PATCH v2] iio: Fix error handling for PM
Quoted 9 lines · On Fri, 7 Jan 2022 13:59:47 +0200 Andy Shevchenko…
Quoted 8 lines · Miaoqian Lin
The
pm_runtime_enablewill increase power disable depth. If the probe fails, we should usepm_runtime_disable()to balancepm_runtime_enable(). In the PM Runtime docs:Drivers in ->remove() callback should undo the runtime PM changes done in ->probe(). Usually this means calling pm_runtime_disable(), pm_runtime_dont_use_autosuspend() etc.We should do this in error handling.
Quoted 5 lines
Quoted 2 lines
Fix this problem for the following drivers: bmc150, bmg160, kmx61, kxcj-1013, mma9551, mma9553.
LGTM, FWIW,
Reviewed-by Andy Shevchenko <[email protected]>
Applied to the fixes-togreg branch of iio.git and marked for stable.
Thanks,
Jonathan
Quoted 166 lines
Quoted 165 lines
Fixes 7d0ead5c3f00 ("iio: Reconcile operation order between iio_register/unregister and pm functions")Signed-off-by Miaoqian Lin <[email protected]>---
Changes in v2:
- fix the fixes tag
- fix similar problems introduced by the same commit--- drivers/iio/accel/bmc150-accel-core.c | 5 ++++- drivers/iio/accel/kxcjk-1013.c | 5 ++++- drivers/iio/accel/mma9551.c | 5 ++++- drivers/iio/accel/mma9553.c | 5 ++++- drivers/iio/gyro/bmg160_core.c | 5 ++++- drivers/iio/imu/kmx61.c | 5 ++++- drivers/iio/magnetometer/bmc150_magn.c | 5 +++-- 7 files changed, 27 insertions(+), 8 deletions(-)drivers/iio/accel/bmc150-accel-core.c +4
-1@@ -1783,11 +1783,14 @@ int bmc150_accel_core_probe(struct device *dev, struct regmap *regmap, int irq, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (dev,"Unable to register iio device\n" ); - goto err_trigger_unregister; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (dev); +pm_runtime_disable (dev); err_trigger_unregister:bmc150_accel_unregister_triggers (data,BMC150_ACCEL_TRIGGERS -1 ); err_buffer_cleanup:drivers/iio/accel/kxcjk-1013.c +4
-1@@ -1589,11 +1589,14 @@ static int kxcjk1013_probe(struct i2c_client *client, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (&client->dev,"unable to register iio device\n" ); - goto err_buffer_cleanup; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); err_buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev); err_trigger_unregister:drivers/iio/accel/mma9551.c +4
-1@@ -495,11 +495,14 @@ static int mma9551_probe(struct i2c_client *client, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (&client->dev,"unable to register iio device\n" ); - goto out_poweroff; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); out_poweroff:mma9551_set_device_state (client, false);drivers/iio/accel/mma9553.c +4
-1@@ -1134,12 +1134,15 @@ static int mma9553_probe(struct i2c_client *client, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (&client->dev,"unable to register iio device\n" ); - goto out_poweroff; + goto err_pm_cleanup; }dev_dbg (&indio_dev->dev,"Registered device %s\n" , name);return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); out_poweroff:mma9551_set_device_state (client, false);return ret;drivers/iio/gyro/bmg160_core.c +4
-1@@ -1188,11 +1188,14 @@ int bmg160_core_probe(struct device *dev, struct regmap *regmap, int irq, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (dev,"unable to register iio device\n" ); - goto err_buffer_cleanup; + goto err_pm_cleanup; }return 0 ; +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (dev); +pm_runtime_disable (dev); err_buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev); err_trigger_unregister:drivers/iio/imu/kmx61.c +4
-1@@ -1385,7 +1385,7 @@ static int kmx61_probe(struct i2c_client *client, ret =iio_device_register (data->acc_indio_dev);if (ret <0 ) {dev_err (&client->dev,"Failed to register acc iio device\n" ); - goto err_buffer_cleanup_mag; + goto err_pm_cleanup; } ret =iio_device_register (data->mag_indio_dev);@@ -1398,6 +1398,9 @@ static int kmx61_probe(struct i2c_client *client, err_iio_unregister_acc:iio_device_unregister (data->acc_indio_dev); +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (&client->dev); +pm_runtime_disable (&client->dev); err_buffer_cleanup_mag:if (client->irq >0 )iio_triggered_buffer_cleanup (data->mag_indio_dev);drivers/iio/magnetometer/bmc150_magn.c +3
-2@@ -962,13 +962,14 @@ int bmc150_magn_probe(struct device *dev, struct regmap *regmap, ret =iio_device_register (indio_dev);if (ret <0 ) {dev_err (dev,"unable to register iio device\n" ); - goto err_disable_runtime_pm; + goto err_pm_cleanup; }dev_dbg (dev,"Registered device %s\n" , name);return 0 ; -err_disable_runtime_pm: +err_pm_cleanup: +pm_runtime_dont_use_autosuspend (dev);pm_runtime_disable (dev); err_buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev);Signature · 1 line
2.17.1