summaryrefslogtreecommitdiff
path: root/drivers/iio/light
diff options
context:
space:
mode:
authorSurendra Singh Chouhan <kr494167@gmail.com>2026-07-24 08:28:02 +0530
committerJonathan Cameron <jonathan.cameron@oss.qualcomm.com>2026-08-31 02:58:30 +0100
commitc23bfe6e22104c463f37da3770e17ec72fc73f86 (patch)
treeab88cf4f0f70f246ccdc0b2d86e183e1160cbc1f /drivers/iio/light
parent575acf622d30edfc9a0c63041991698ec907c869 (diff)
downloadlinux-next-c23bfe6e22104c463f37da3770e17ec72fc73f86.tar.gz
linux-next-c23bfe6e22104c463f37da3770e17ec72fc73f86.zip
iio: light: apds9999: register standby action after enabling device
apds9999_init() called devm_add_action_or_reset() at the start of the function, before register configuration and before enabling the device via APDS9999_MAIN_CTRL_LS_EN. If register initialization failed during apds9999_init() (e.g. SMBus write failures on LS_MEAS_RATE or LS_GAIN), devm_add_action_or_reset() immediately triggered apds9999_standby(), writing to the control register on a device that failed initialization and was never enabled. Fix this by registering devm_add_action_or_reset() only after APDS9999_MAIN_CTRL_LS_EN is successfully written to the control register. Signed-off-by: Surendra Singh Chouhan <kr494167@gmail.com> Signed-off-by: Jonathan Cameron <jonathan.cameron@oss.qualcomm.com>
Diffstat (limited to 'drivers/iio/light')
-rw-r--r--drivers/iio/light/apds9999.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/iio/light/apds9999.c b/drivers/iio/light/apds9999.c
index 43fa9992c9c2..62620c4a2fbc 100644
--- a/drivers/iio/light/apds9999.c
+++ b/drivers/iio/light/apds9999.c
@@ -100,10 +100,6 @@ static int apds9999_init(struct apds9999_data *data)
u8 regval;
int ret;
- ret = devm_add_action_or_reset(dev, apds9999_standby, client);
- if (ret)
- return ret;
-
guard(mutex)(&data->lock);
regval = FIELD_PREP(APDS9999_LS_RES_MASK, APDS9999_RES_18BIT) |
@@ -121,8 +117,12 @@ static int apds9999_init(struct apds9999_data *data)
return ret;
data->als_gain_idx = APDS9999_GAIN_3X;
- return i2c_smbus_write_byte_data(client, APDS9999_REG_MAIN_CTRL,
- APDS9999_MAIN_CTRL_LS_EN);
+ ret = i2c_smbus_write_byte_data(client, APDS9999_REG_MAIN_CTRL,
+ APDS9999_MAIN_CTRL_LS_EN);
+ if (ret)
+ return ret;
+
+ return devm_add_action_or_reset(dev, apds9999_standby, client);
}
static int apds9999_read_channel(struct apds9999_data *data, u8 reg,