* [PATCH v2 1/4] iio: light: opt4001: Fix reversed GENMASK() arguments in fault count mask
2026-07-13 3:57 [PATCH v2 0/4] iio: light: opt4001: Fixes from code review Nikhil Gautam
@ 2026-07-13 3:57 ` Nikhil Gautam
2026-07-13 16:06 ` Andy Shevchenko
2026-07-13 3:57 ` [PATCH v2 2/4] iio: light: opt4001: Reject integration times with a non-zero seconds part Nikhil Gautam
` (2 subsequent siblings)
3 siblings, 1 reply; 6+ messages in thread
From: Nikhil Gautam @ 2026-07-13 3:57 UTC (permalink / raw)
To: Jonathan Cameron
Cc: David Lechner, Nuno Sá, Andy Shevchenko,
Stefan Windfeldt-Prytz, linux-iio, linux-kernel, Nikhil Gautam
GENMASK(h, l) requires h >= l, but OPT4001_CTRL_FAULT_COUNT is defined
as GENMASK(0, 1). The define is currently unused so there is no
functional impact, but fix it before anyone builds on it, and add the
_MASK suffix for consistency with the neighbouring definitions.
Fixes: 9a9608418292 ("iio: light: Add support for TI OPT4001 light sensor")
Signed-off-by: Nikhil Gautam <nikhilgtr@gmail.com>
---
drivers/iio/light/opt4001.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/iio/light/opt4001.c b/drivers/iio/light/opt4001.c
index ba4eb82d9bc2..0a2d2273355f 100644
--- a/drivers/iio/light/opt4001.c
+++ b/drivers/iio/light/opt4001.c
@@ -39,7 +39,7 @@
#define OPT4001_CTRL_OPER_MODE_MASK GENMASK(5, 4)
#define OPT4001_CTRL_LATCH_MASK GENMASK(3, 3)
#define OPT4001_CTRL_INT_POL_MASK GENMASK(2, 2)
-#define OPT4001_CTRL_FAULT_COUNT GENMASK(0, 1)
+#define OPT4001_CTRL_FAULT_COUNT_MASK GENMASK(1, 0)
/* OPT4001 constants */
#define OPT4001_DEVICE_ID_VAL 0x121
--
2.39.5
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH v2 1/4] iio: light: opt4001: Fix reversed GENMASK() arguments in fault count mask
2026-07-13 3:57 ` [PATCH v2 1/4] iio: light: opt4001: Fix reversed GENMASK() arguments in fault count mask Nikhil Gautam
@ 2026-07-13 16:06 ` Andy Shevchenko
0 siblings, 0 replies; 6+ messages in thread
From: Andy Shevchenko @ 2026-07-13 16:06 UTC (permalink / raw)
To: Nikhil Gautam
Cc: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
Stefan Windfeldt-Prytz, linux-iio, linux-kernel
On Mon, Jul 13, 2026 at 09:27:33AM +0530, Nikhil Gautam wrote:
> GENMASK(h, l) requires h >= l, but OPT4001_CTRL_FAULT_COUNT is defined
> as GENMASK(0, 1). The define is currently unused so there is no
> functional impact, but fix it before anyone builds on it, and add the
> _MASK suffix for consistency with the neighbouring definitions.
Cam you check my comments on previous version? This one seems has the same
issues.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 2/4] iio: light: opt4001: Reject integration times with a non-zero seconds part
2026-07-13 3:57 [PATCH v2 0/4] iio: light: opt4001: Fixes from code review Nikhil Gautam
2026-07-13 3:57 ` [PATCH v2 1/4] iio: light: opt4001: Fix reversed GENMASK() arguments in fault count mask Nikhil Gautam
@ 2026-07-13 3:57 ` Nikhil Gautam
2026-07-13 3:57 ` [PATCH v2 3/4] iio: light: opt4001: Fix incompatible pointer type passed to div_u64_rem() Nikhil Gautam
2026-07-13 3:57 ` [PATCH v2 4/4] iio: light: opt4001: Fix power down clearing bits of the wrong register Nikhil Gautam
3 siblings, 0 replies; 6+ messages in thread
From: Nikhil Gautam @ 2026-07-13 3:57 UTC (permalink / raw)
To: Jonathan Cameron
Cc: David Lechner, Nuno Sá, Andy Shevchenko,
Stefan Windfeldt-Prytz, linux-iio, linux-kernel, Nikhil Gautam
opt4001_write_raw() only looks at val2 when setting the integration
time, so a write such as 1.000600 is silently accepted as 600 us.
Return -EINVAL if val is non-zero.
Fixes: 9a9608418292 ("iio: light: Add support for TI OPT4001 light sensor")
Signed-off-by: Nikhil Gautam <nikhilgtr@gmail.com>
---
drivers/iio/light/opt4001.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/iio/light/opt4001.c b/drivers/iio/light/opt4001.c
index 0a2d2273355f..9ff99c19b6ae 100644
--- a/drivers/iio/light/opt4001.c
+++ b/drivers/iio/light/opt4001.c
@@ -287,6 +287,9 @@ static int opt4001_write_raw(struct iio_dev *indio_dev,
switch (mask) {
case IIO_CHAN_INFO_INT_TIME:
+ if (val)
+ return -EINVAL;
+
int_time = opt4001_als_time_to_index(val2);
if (int_time < 0)
return int_time;
--
2.39.5
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v2 3/4] iio: light: opt4001: Fix incompatible pointer type passed to div_u64_rem()
2026-07-13 3:57 [PATCH v2 0/4] iio: light: opt4001: Fixes from code review Nikhil Gautam
2026-07-13 3:57 ` [PATCH v2 1/4] iio: light: opt4001: Fix reversed GENMASK() arguments in fault count mask Nikhil Gautam
2026-07-13 3:57 ` [PATCH v2 2/4] iio: light: opt4001: Reject integration times with a non-zero seconds part Nikhil Gautam
@ 2026-07-13 3:57 ` Nikhil Gautam
2026-07-13 3:57 ` [PATCH v2 4/4] iio: light: opt4001: Fix power down clearing bits of the wrong register Nikhil Gautam
3 siblings, 0 replies; 6+ messages in thread
From: Nikhil Gautam @ 2026-07-13 3:57 UTC (permalink / raw)
To: Jonathan Cameron
Cc: David Lechner, Nuno Sá, Andy Shevchenko,
Stefan Windfeldt-Prytz, linux-iio, linux-kernel, Nikhil Gautam
div_u64_rem() takes a u32 * for the remainder but is passed val2, which
is an int *. There is no functional impact as int and u32 have the same
size and representation on all supported architectures and the remainder
is always smaller than the divisor, so it fits in the positive range of
int. Fix the type mismatch by using a local u32 for the remainder and
assigning the result to *val2.
Fixes: 9a9608418292 ("iio: light: Add support for TI OPT4001 light sensor")
Signed-off-by: Nikhil Gautam <nikhilgtr@gmail.com>
---
drivers/iio/light/opt4001.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/iio/light/opt4001.c b/drivers/iio/light/opt4001.c
index 9ff99c19b6ae..9f877c5798b9 100644
--- a/drivers/iio/light/opt4001.c
+++ b/drivers/iio/light/opt4001.c
@@ -173,6 +173,7 @@ static int opt4001_read_lux_value(struct iio_dev *indio_dev,
u8 crc;
u8 calc_crc;
u64 lux_raw;
+ u32 rem;
int ret;
ret = regmap_read(chip->regmap, OPT4001_LIGHT1_MSB, &light1);
@@ -199,8 +200,8 @@ static int opt4001_read_lux_value(struct iio_dev *indio_dev,
lux_raw = lux_raw << exp;
lux_raw = lux_raw * chip->chip_info->mul;
- *val = div_u64_rem(lux_raw, chip->chip_info->div, val2);
- *val2 = *val2 * 100;
+ *val = div_u64_rem(lux_raw, chip->chip_info->div, &rem);
+ *val2 = rem * 100;
return IIO_VAL_INT_PLUS_NANO;
}
--
2.39.5
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v2 4/4] iio: light: opt4001: Fix power down clearing bits of the wrong register
2026-07-13 3:57 [PATCH v2 0/4] iio: light: opt4001: Fixes from code review Nikhil Gautam
` (2 preceding siblings ...)
2026-07-13 3:57 ` [PATCH v2 3/4] iio: light: opt4001: Fix incompatible pointer type passed to div_u64_rem() Nikhil Gautam
@ 2026-07-13 3:57 ` Nikhil Gautam
3 siblings, 0 replies; 6+ messages in thread
From: Nikhil Gautam @ 2026-07-13 3:57 UTC (permalink / raw)
To: Jonathan Cameron
Cc: David Lechner, Nuno Sá, Andy Shevchenko,
Stefan Windfeldt-Prytz, linux-iio, linux-kernel, Nikhil Gautam
opt4001_power_down() intends to clear the operating mode bits in the
CTRL register but reads OPT4001_DEVICE_ID instead of OPT4001_CTRL, so
the value written back to CTRL contains device ID bits rather than the
current configuration.
Fix and simplify this by using regmap_clear_bits() on the CTRL register
directly in the devm action, and drop opt4001_power_down() which has no
other users.
Suggested-by: Jonathan Cameron <jic23@kernel.org>
Fixes: 9a9608418292 ("iio: light: Add support for TI OPT4001 light sensor")
Signed-off-by: Nikhil Gautam <nikhilgtr@gmail.com>
---
drivers/iio/light/opt4001.c | 27 ++++-----------------------
1 file changed, 4 insertions(+), 23 deletions(-)
diff --git a/drivers/iio/light/opt4001.c b/drivers/iio/light/opt4001.c
index 9f877c5798b9..b7e9d361c2e3 100644
--- a/drivers/iio/light/opt4001.c
+++ b/drivers/iio/light/opt4001.c
@@ -223,33 +223,14 @@ static int opt4001_set_conf(struct opt4001_chip *chip)
return ret;
}
-static int opt4001_power_down(struct opt4001_chip *chip)
-{
- struct device *dev = &chip->client->dev;
- int ret;
- unsigned int reg;
-
- ret = regmap_read(chip->regmap, OPT4001_DEVICE_ID, ®);
- if (ret) {
- dev_err(dev, "Failed to read configuration\n");
- return ret;
- }
-
- /* MODE_OFF is 0x0 so just set bits to 0 */
- reg &= ~OPT4001_CTRL_OPER_MODE_MASK;
-
- ret = regmap_write(chip->regmap, OPT4001_CTRL, reg);
- if (ret)
- dev_err(dev, "Failed to set configuration to power down\n");
-
- return ret;
-}
-
static void opt4001_chip_off_action(void *data)
{
struct opt4001_chip *chip = data;
+ int ret;
- opt4001_power_down(chip);
+ ret = regmap_clear_bits(chip->regmap, OPT4001_CTRL, OPT4001_CTRL_OPER_MODE_MASK);
+ if (ret)
+ dev_err(&chip->client->dev, "Failed to power down\n");
}
static const struct iio_chan_spec opt4001_channels[] = {
--
2.39.5
^ permalink raw reply related [flat|nested] 6+ messages in thread