Skip to content

Commit 632fe0b

Browse files
Yuuoniyjic23
authored andcommitted
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. Fixes: 7d0ead5 ("iio: Reconcile operation order between iio_register/unregister and pm functions") Signed-off-by: Miaoqian Lin <linmq006@gmail.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Link: https://lore.kernel.org/r/20220106112309.16879-1-linmq006@gmail.com Cc: <Stable@vger.kernel.org> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
1 parent 4165456 commit 632fe0b

7 files changed

Lines changed: 27 additions & 8 deletions

File tree

drivers/iio/accel/bmc150-accel-core.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1783,11 +1783,14 @@ int bmc150_accel_core_probe(struct device *dev, struct regmap *regmap, int irq,
17831783
ret = iio_device_register(indio_dev);
17841784
if (ret < 0) {
17851785
dev_err(dev, "Unable to register iio device\n");
1786-
goto err_trigger_unregister;
1786+
goto err_pm_cleanup;
17871787
}
17881788

17891789
return 0;
17901790

1791+
err_pm_cleanup:
1792+
pm_runtime_dont_use_autosuspend(dev);
1793+
pm_runtime_disable(dev);
17911794
err_trigger_unregister:
17921795
bmc150_accel_unregister_triggers(data, BMC150_ACCEL_TRIGGERS - 1);
17931796
err_buffer_cleanup:

drivers/iio/accel/kxcjk-1013.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1590,11 +1590,14 @@ static int kxcjk1013_probe(struct i2c_client *client,
15901590
ret = iio_device_register(indio_dev);
15911591
if (ret < 0) {
15921592
dev_err(&client->dev, "unable to register iio device\n");
1593-
goto err_buffer_cleanup;
1593+
goto err_pm_cleanup;
15941594
}
15951595

15961596
return 0;
15971597

1598+
err_pm_cleanup:
1599+
pm_runtime_dont_use_autosuspend(&client->dev);
1600+
pm_runtime_disable(&client->dev);
15981601
err_buffer_cleanup:
15991602
iio_triggered_buffer_cleanup(indio_dev);
16001603
err_trigger_unregister:

drivers/iio/accel/mma9551.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -495,11 +495,14 @@ static int mma9551_probe(struct i2c_client *client,
495495
ret = iio_device_register(indio_dev);
496496
if (ret < 0) {
497497
dev_err(&client->dev, "unable to register iio device\n");
498-
goto out_poweroff;
498+
goto err_pm_cleanup;
499499
}
500500

501501
return 0;
502502

503+
err_pm_cleanup:
504+
pm_runtime_dont_use_autosuspend(&client->dev);
505+
pm_runtime_disable(&client->dev);
503506
out_poweroff:
504507
mma9551_set_device_state(client, false);
505508

drivers/iio/accel/mma9553.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1134,12 +1134,15 @@ static int mma9553_probe(struct i2c_client *client,
11341134
ret = iio_device_register(indio_dev);
11351135
if (ret < 0) {
11361136
dev_err(&client->dev, "unable to register iio device\n");
1137-
goto out_poweroff;
1137+
goto err_pm_cleanup;
11381138
}
11391139

11401140
dev_dbg(&indio_dev->dev, "Registered device %s\n", name);
11411141
return 0;
11421142

1143+
err_pm_cleanup:
1144+
pm_runtime_dont_use_autosuspend(&client->dev);
1145+
pm_runtime_disable(&client->dev);
11431146
out_poweroff:
11441147
mma9551_set_device_state(client, false);
11451148
return ret;

drivers/iio/gyro/bmg160_core.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1188,11 +1188,14 @@ int bmg160_core_probe(struct device *dev, struct regmap *regmap, int irq,
11881188
ret = iio_device_register(indio_dev);
11891189
if (ret < 0) {
11901190
dev_err(dev, "unable to register iio device\n");
1191-
goto err_buffer_cleanup;
1191+
goto err_pm_cleanup;
11921192
}
11931193

11941194
return 0;
11951195

1196+
err_pm_cleanup:
1197+
pm_runtime_dont_use_autosuspend(dev);
1198+
pm_runtime_disable(dev);
11961199
err_buffer_cleanup:
11971200
iio_triggered_buffer_cleanup(indio_dev);
11981201
err_trigger_unregister:

drivers/iio/imu/kmx61.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1385,7 +1385,7 @@ static int kmx61_probe(struct i2c_client *client,
13851385
ret = iio_device_register(data->acc_indio_dev);
13861386
if (ret < 0) {
13871387
dev_err(&client->dev, "Failed to register acc iio device\n");
1388-
goto err_buffer_cleanup_mag;
1388+
goto err_pm_cleanup;
13891389
}
13901390

13911391
ret = iio_device_register(data->mag_indio_dev);
@@ -1398,6 +1398,9 @@ static int kmx61_probe(struct i2c_client *client,
13981398

13991399
err_iio_unregister_acc:
14001400
iio_device_unregister(data->acc_indio_dev);
1401+
err_pm_cleanup:
1402+
pm_runtime_dont_use_autosuspend(&client->dev);
1403+
pm_runtime_disable(&client->dev);
14011404
err_buffer_cleanup_mag:
14021405
if (client->irq > 0)
14031406
iio_triggered_buffer_cleanup(data->mag_indio_dev);

drivers/iio/magnetometer/bmc150_magn.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -962,13 +962,14 @@ int bmc150_magn_probe(struct device *dev, struct regmap *regmap,
962962
ret = iio_device_register(indio_dev);
963963
if (ret < 0) {
964964
dev_err(dev, "unable to register iio device\n");
965-
goto err_disable_runtime_pm;
965+
goto err_pm_cleanup;
966966
}
967967

968968
dev_dbg(dev, "Registered device %s\n", name);
969969
return 0;
970970

971-
err_disable_runtime_pm:
971+
err_pm_cleanup:
972+
pm_runtime_dont_use_autosuspend(dev);
972973
pm_runtime_disable(dev);
973974
err_buffer_cleanup:
974975
iio_triggered_buffer_cleanup(indio_dev);

0 commit comments

Comments
 (0)