summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChuhong Yuan <hslester96@gmail.com>2019-08-01 10:36:05 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2020-01-27 16:51:03 +0300
commit5ba099d4df90a40ffb38df0187c5372ba0ff7660 (patch)
treef12ca449e461481d48b20c4877eeeb95ea1c7355
parent7f6a96dd8223796ffae4dd251be3bff161a28a4b (diff)
downloadlinux-5ba099d4df90a40ffb38df0187c5372ba0ff7660.tar.xz
iio: tsl2772: Use devm_add_action_or_reset for tsl2772_chip_off
[ Upstream commit 338084135aeddb103624a6841972fb8588295cc6 ] Use devm_add_action_or_reset to call tsl2772_chip_off when the device is removed. This also fixes the issue that the chip is turned off before the device is unregistered. Not marked for stable as fairly hard to hit the bug and this is in the middle of a set making other cleanups to the driver. Hence will probably need explicit backporting. Signed-off-by: Chuhong Yuan <hslester96@gmail.com> Fixes: c06c4d793584 ("staging: iio: tsl2x7x/tsl2772: move out of staging") Reviewed-by: Brian Masney <masneyb@onstation.org> Tested-by: Brian Masney <masneyb@onstation.org> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--drivers/iio/light/tsl2772.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/iio/light/tsl2772.c b/drivers/iio/light/tsl2772.c
index df5b2a0da96c..f2e308c6d6d7 100644
--- a/drivers/iio/light/tsl2772.c
+++ b/drivers/iio/light/tsl2772.c
@@ -716,6 +716,13 @@ static int tsl2772_chip_off(struct iio_dev *indio_dev)
return tsl2772_write_control_reg(chip, 0x00);
}
+static void tsl2772_chip_off_action(void *data)
+{
+ struct iio_dev *indio_dev = data;
+
+ tsl2772_chip_off(indio_dev);
+}
+
/**
* tsl2772_invoke_change - power cycle the device to implement the user
* parameters
@@ -1711,9 +1718,14 @@ static int tsl2772_probe(struct i2c_client *clientp,
if (ret < 0)
return ret;
+ ret = devm_add_action_or_reset(&clientp->dev,
+ tsl2772_chip_off_action,
+ indio_dev);
+ if (ret < 0)
+ return ret;
+
ret = iio_device_register(indio_dev);
if (ret) {
- tsl2772_chip_off(indio_dev);
dev_err(&clientp->dev,
"%s: iio registration failed\n", __func__);
return ret;
@@ -1740,8 +1752,6 @@ static int tsl2772_remove(struct i2c_client *client)
{
struct iio_dev *indio_dev = i2c_get_clientdata(client);
- tsl2772_chip_off(indio_dev);
-
iio_device_unregister(indio_dev);
return 0;