* [PATCH v4 0/9] iio: temperature: ltc2983: Add support for ADT7604
@ 2026-05-25 16:39 Liviu Stan
2026-05-25 16:39 ` [PATCH v4 1/9] iio: temperature: ltc2983: Fix n_wires default bypassing rotation check Liviu Stan
` (8 more replies)
0 siblings, 9 replies; 29+ messages in thread
From: Liviu Stan @ 2026-05-25 16:39 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Francesco Lavra, Liviu Stan, linux-iio,
linux-kernel, linux, devicetree
This series adds support for the ADT7604 multi-sensor temperature
measurement and leak detection system to the existing ltc2983 driver.
The ADT7604 shares the same die as the LTC2984, reusing its register
map and SPI interface. It repurposes the custom RTD sensor type (18)
as a copper trace resistance sensor and the custom thermistor type (27)
as a leak detector, removing thermocouple, diode and direct ADC support.
Patches 1-6 fix pre-existing bugs in the ltc2983 driver: an n_wires
default that silently bypassed the current-rotate validation, a
reinit_completion() call after the hardware conversion was started,
macro parenthesization and renaming, inconsistent use of the local
device pointer, inconsistent channel wording in log messages, and
missing fwnode_property_present() guards for optional properties.
Patch 7 adds IIO_COVERAGE, a new channel type for sensors reporting
fractional surface coverage as a percentage.
Patch 8 updates the device tree bindings: adds adi,adt7604 compatible,
copper-trace@ and leak-detector@ sensor node types with their respective
properties, and an ADT7604 example.
Patch 9 updates the driver: introduces two new software sensor type
values (LTC2983_SENSOR_COPPER_TRACE = 32, LTC2983_SENSOR_LEAK_DETECTOR
= 33) with dedicated structs and parser functions rather than extending
the existing RTD and thermistor paths. The hardware configuration bits
are fully hardcoded for both sensor types, and several RTD/thermistor
DT properties have no meaning for them. A u64 supported_sensors bitmask
in ltc2983_chip_info gates sensor type validation per chip, replacing
the has_temp bool pattern. BIT_ULL() is used for the new type values
at bits 32 and 33 to avoid shifting beyond 32 bits on 32-bit builds.
Tested on EVAL-ADT7604-AZ connected to Raspberry Pi 5 via SPI.
Changes in v4:
The n_wires fix was moved to position 1 and a new reinit_completion()
fix was inserted at position 2.
Patch 1 - Fix n_wires default bypassing rotation check:
- Moved to the front of the series
Patch 2 - Fix reinit_completion() called after conversion start:
- New patch
Patch 3 - macro parenthesization and rename:
- Added Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
Patch 4 - use local device pointer consistently:
- Collapsed some wrapped lines that now fit within 80 characters
- Decided to leave lines that would slightly pass 80 characters
wrapped since they looked more readable
- Updated commit message to reflect the line consolidation
- Added Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
Patch 5 - fix inconsistent channel wording in messages:
- Added Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
Patch 7 - IIO_COVERAGE channel type:
- Renamed the sysfs attribute from in_coverageX_raw to in_coverageY_raw
and in_coverageX_scale to in_coverageY_scale to follow ABI convention
- Updated commit message to reflect the rename
Patch 8 - DT bindings:
- Added restrictions for adi,sensor-type = <18> in ^rtd@ nodes and
adi,sensor-type = <27> in ^thermistor@ nodes for adi,adt7604
Patch 9 - driver:
- Removed trailing comma from LTC2983_SENSOR_NUM enum sentinel
- Sorted id_table, of_match, and chip_info_data structs alphabetically
Liviu Stan (9):
iio: temperature: ltc2983: Fix n_wires default bypassing rotation
check
iio: temperature: ltc2983: Fix reinit_completion() called after
conversion start
iio: temperature: ltc2983: Fix macro parenthesization and rename
iio: temperature: ltc2983: Use local device pointer consistently
iio: temperature: ltc2983: Fix inconsistent channel wording in
messages
iio: temperature: ltc2983: Use fwnode_property_present() for optional
properties
iio: core: Add IIO_COVERAGE channel type
dt-bindings: iio: temperature: Add ADT7604 support to adi,ltc2983
iio: temperature: ltc2983: Add support for ADT7604
Documentation/ABI/testing/sysfs-bus-iio | 17 +
.../bindings/iio/temperature/adi,ltc2983.yaml | 217 +++++-
drivers/iio/industrialio-core.c | 1 +
drivers/iio/temperature/ltc2983.c | 621 +++++++++++++++---
include/uapi/linux/iio/types.h | 1 +
tools/iio/iio_event_monitor.c | 2 +
6 files changed, 752 insertions(+), 107 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 29+ messages in thread
* [PATCH v4 1/9] iio: temperature: ltc2983: Fix n_wires default bypassing rotation check
2026-05-25 16:39 [PATCH v4 0/9] iio: temperature: ltc2983: Add support for ADT7604 Liviu Stan
@ 2026-05-25 16:39 ` Liviu Stan
2026-05-27 16:11 ` Jonathan Cameron
2026-05-25 16:39 ` [PATCH v4 2/9] iio: temperature: ltc2983: Fix reinit_completion() called after conversion start Liviu Stan
` (7 subsequent siblings)
8 siblings, 1 reply; 29+ messages in thread
From: Liviu Stan @ 2026-05-25 16:39 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Francesco Lavra, Liviu Stan, linux-iio,
linux-kernel, linux, devicetree
When adi,number-of-wires is absent, n_wires is left at 0. The binding
documents a default of 2 wires, matching the hardware default. However
the current-rotate validation checks n_wires == 2 || n_wires == 3, so
with n_wires = 0 the guard is bypassed and adi,current-rotate is accepted
for a 2-wire RTD.
Initialize n_wires = 2 to match the binding default and ensure the
rotation check fires correctly when the property is absent.
Fixes: f110f3188e56 ("iio: temperature: Add support for LTC2983")
Signed-off-by: Liviu Stan <liviu.stan@analog.com>
---
Changes in v4:
- Moved to the front of the series
drivers/iio/temperature/ltc2983.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/iio/temperature/ltc2983.c b/drivers/iio/temperature/ltc2983.c
index 38e6f8dfd3b8..1f835e326b93 100644
--- a/drivers/iio/temperature/ltc2983.c
+++ b/drivers/iio/temperature/ltc2983.c
@@ -741,7 +741,7 @@ ltc2983_rtd_new(const struct fwnode_handle *child, struct ltc2983_data *st,
struct ltc2983_rtd *rtd;
int ret = 0;
struct device *dev = &st->spi->dev;
- u32 excitation_current = 0, n_wires = 0;
+ u32 excitation_current = 0, n_wires = 2;
rtd = devm_kzalloc(dev, sizeof(*rtd), GFP_KERNEL);
if (!rtd)
--
2.43.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v4 2/9] iio: temperature: ltc2983: Fix reinit_completion() called after conversion start
2026-05-25 16:39 [PATCH v4 0/9] iio: temperature: ltc2983: Add support for ADT7604 Liviu Stan
2026-05-25 16:39 ` [PATCH v4 1/9] iio: temperature: ltc2983: Fix n_wires default bypassing rotation check Liviu Stan
@ 2026-05-25 16:39 ` Liviu Stan
2026-05-27 16:13 ` Jonathan Cameron
2026-05-25 16:39 ` [PATCH v4 3/9] iio: temperature: ltc2983: Fix macro parenthesization and rename Liviu Stan
` (6 subsequent siblings)
8 siblings, 1 reply; 29+ messages in thread
From: Liviu Stan @ 2026-05-25 16:39 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Francesco Lavra, Liviu Stan, linux-iio,
linux-kernel, linux, devicetree
reinit_completion() was called after regmap_write() initiated the hardware
conversion, creating a race window where the interrupt could fire and call
complete() before reinit_completion() reset the completion.
Move reinit_completion() before the regmap_write() to close the race.
ltc2983_eeprom_cmd() already does it in the correct order.
Fixes: f110f3188e56 ("iio: temperature: Add support for LTC2983")
Signed-off-by: Liviu Stan <liviu.stan@analog.com>
---
Changes in v4:
- New patch
drivers/iio/temperature/ltc2983.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/iio/temperature/ltc2983.c b/drivers/iio/temperature/ltc2983.c
index 1f835e326b93..2bc5cd46a72f 100644
--- a/drivers/iio/temperature/ltc2983.c
+++ b/drivers/iio/temperature/ltc2983.c
@@ -1177,12 +1177,11 @@ static int ltc2983_chan_read(struct ltc2983_data *st,
start_conversion |= LTC2983_STATUS_CHAN_SEL(sensor->chan);
dev_dbg(&st->spi->dev, "Start conversion on chan:%d, status:%02X\n",
sensor->chan, start_conversion);
+ reinit_completion(&st->completion);
/* start conversion */
ret = regmap_write(st->regmap, LTC2983_STATUS_REG, start_conversion);
if (ret)
return ret;
-
- reinit_completion(&st->completion);
/*
* wait for conversion to complete.
* 300 ms should be more than enough to complete the conversion.
--
2.43.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v4 3/9] iio: temperature: ltc2983: Fix macro parenthesization and rename
2026-05-25 16:39 [PATCH v4 0/9] iio: temperature: ltc2983: Add support for ADT7604 Liviu Stan
2026-05-25 16:39 ` [PATCH v4 1/9] iio: temperature: ltc2983: Fix n_wires default bypassing rotation check Liviu Stan
2026-05-25 16:39 ` [PATCH v4 2/9] iio: temperature: ltc2983: Fix reinit_completion() called after conversion start Liviu Stan
@ 2026-05-25 16:39 ` Liviu Stan
2026-05-27 16:13 ` Jonathan Cameron
2026-05-25 16:39 ` [PATCH v4 4/9] iio: temperature: ltc2983: Use local device pointer consistently Liviu Stan
` (5 subsequent siblings)
8 siblings, 1 reply; 29+ messages in thread
From: Liviu Stan @ 2026-05-25 16:39 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Francesco Lavra, Liviu Stan, linux-iio,
linux-kernel, linux, devicetree
Cc: Joshua Crofts
Wrap the 'chan' parameter in LTC2983_CHAN_START_ADDR() and
LTC2983_CHAN_RES_ADDR() with parentheses to prevent potential
macro argument expansion issues. Also rename LTC2983_CHAN_START_ADDR
to LTC2983_CHAN_ASSIGN_ADDR and LTC2983_CHAN_RES_ADDR to
LTC2983_RESULT_ADDR, to better reflect the datasheet names and avoid
them being confused as related.
Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
Signed-off-by: Liviu Stan <liviu.stan@analog.com>
---
Changes in v4:
- Added Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
drivers/iio/temperature/ltc2983.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/iio/temperature/ltc2983.c b/drivers/iio/temperature/ltc2983.c
index 2bc5cd46a72f..4bae90f03002 100644
--- a/drivers/iio/temperature/ltc2983.c
+++ b/drivers/iio/temperature/ltc2983.c
@@ -56,10 +56,10 @@
#define LTC2983_EEPROM_WRITE_TIME_MS 2600
#define LTC2983_EEPROM_READ_TIME_MS 20
-#define LTC2983_CHAN_START_ADDR(chan) \
- (((chan - 1) * 4) + LTC2983_CHAN_ASSIGN_START_REG)
-#define LTC2983_CHAN_RES_ADDR(chan) \
- (((chan - 1) * 4) + LTC2983_TEMP_RES_START_REG)
+#define LTC2983_CHAN_ASSIGN_ADDR(chan) \
+ ((((chan) - 1) * 4) + LTC2983_CHAN_ASSIGN_START_REG)
+#define LTC2983_RESULT_ADDR(chan) \
+ ((((chan) - 1) * 4) + LTC2983_TEMP_RES_START_REG)
#define LTC2983_THERMOCOUPLE_DIFF_MASK BIT(3)
#define LTC2983_THERMOCOUPLE_SGL(x) \
FIELD_PREP(LTC2983_THERMOCOUPLE_DIFF_MASK, x)
@@ -351,7 +351,7 @@ static int __ltc2983_chan_assign_common(struct ltc2983_data *st,
const struct ltc2983_sensor *sensor,
u32 chan_val)
{
- u32 reg = LTC2983_CHAN_START_ADDR(sensor->chan);
+ u32 reg = LTC2983_CHAN_ASSIGN_ADDR(sensor->chan);
chan_val |= LTC2983_CHAN_TYPE(sensor->type);
dev_dbg(&st->spi->dev, "Assign reg:0x%04X, val:0x%08X\n", reg,
@@ -1196,7 +1196,7 @@ static int ltc2983_chan_read(struct ltc2983_data *st,
}
/* read the converted data */
- ret = regmap_bulk_read(st->regmap, LTC2983_CHAN_RES_ADDR(sensor->chan),
+ ret = regmap_bulk_read(st->regmap, LTC2983_RESULT_ADDR(sensor->chan),
&st->temp, sizeof(st->temp));
if (ret)
return ret;
--
2.43.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v4 4/9] iio: temperature: ltc2983: Use local device pointer consistently
2026-05-25 16:39 [PATCH v4 0/9] iio: temperature: ltc2983: Add support for ADT7604 Liviu Stan
` (2 preceding siblings ...)
2026-05-25 16:39 ` [PATCH v4 3/9] iio: temperature: ltc2983: Fix macro parenthesization and rename Liviu Stan
@ 2026-05-25 16:39 ` Liviu Stan
2026-05-27 16:18 ` Jonathan Cameron
2026-05-25 16:39 ` [PATCH v4 5/9] iio: temperature: ltc2983: Fix inconsistent channel wording in messages Liviu Stan
` (4 subsequent siblings)
8 siblings, 1 reply; 29+ messages in thread
From: Liviu Stan @ 2026-05-25 16:39 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Liviu Stan, Francesco Lavra, linux-iio,
linux-kernel, linux, devicetree
Cc: Joshua Crofts
Some functions define a local 'dev' pointer but still use bare
'&st->spi->dev' in some code paths, and some don't have it at all.
Replace bare references with the local pointer for consistency and
collapse some wrapped lines that now fit within 80 characters.
Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
Signed-off-by: Liviu Stan <liviu.stan@analog.com>
---
Changes in v4:
- Collapsed some wrapped lines that now fit within 80 characters
- Decided to leave lines that would slightly pass 80 characters
wrapped since they looked more readable
- Updated commit message to reflect the line consolidation
- Added Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
drivers/iio/temperature/ltc2983.c | 87 +++++++++++++++++--------------
1 file changed, 47 insertions(+), 40 deletions(-)
diff --git a/drivers/iio/temperature/ltc2983.c b/drivers/iio/temperature/ltc2983.c
index 4bae90f03002..8b0b6b4884f6 100644
--- a/drivers/iio/temperature/ltc2983.c
+++ b/drivers/iio/temperature/ltc2983.c
@@ -351,11 +351,11 @@ static int __ltc2983_chan_assign_common(struct ltc2983_data *st,
const struct ltc2983_sensor *sensor,
u32 chan_val)
{
+ struct device *dev = &st->spi->dev;
u32 reg = LTC2983_CHAN_ASSIGN_ADDR(sensor->chan);
chan_val |= LTC2983_CHAN_TYPE(sensor->type);
- dev_dbg(&st->spi->dev, "Assign reg:0x%04X, val:0x%08X\n", reg,
- chan_val);
+ dev_dbg(dev, "Assign reg:0x%04X, val:0x%08X\n", reg, chan_val);
st->chan_val = cpu_to_be32(chan_val);
return regmap_bulk_write(st->regmap, reg, &st->chan_val,
sizeof(st->chan_val));
@@ -656,11 +656,12 @@ static struct ltc2983_sensor *
ltc2983_thermocouple_new(const struct fwnode_handle *child, struct ltc2983_data *st,
const struct ltc2983_sensor *sensor)
{
+ struct device *dev = &st->spi->dev;
struct ltc2983_thermocouple *thermo;
u32 oc_current;
int ret;
- thermo = devm_kzalloc(&st->spi->dev, sizeof(*thermo), GFP_KERNEL);
+ thermo = devm_kzalloc(dev, sizeof(*thermo), GFP_KERNEL);
if (!thermo)
return ERR_PTR(-ENOMEM);
@@ -687,7 +688,7 @@ ltc2983_thermocouple_new(const struct fwnode_handle *child, struct ltc2983_data
LTC2983_THERMOCOUPLE_OC_CURR(3);
break;
default:
- return dev_err_ptr_probe(&st->spi->dev, -EINVAL,
+ return dev_err_ptr_probe(dev, -EINVAL,
"Invalid open circuit current:%u\n",
oc_current);
}
@@ -697,7 +698,7 @@ ltc2983_thermocouple_new(const struct fwnode_handle *child, struct ltc2983_data
/* validate channel index */
if (!(thermo->sensor_config & LTC2983_THERMOCOUPLE_DIFF_MASK) &&
sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
- return dev_err_ptr_probe(&st->spi->dev, -EINVAL,
+ return dev_err_ptr_probe(dev, -EINVAL,
"Invalid chann:%d for differential thermocouple\n",
sensor->chan);
@@ -712,7 +713,7 @@ ltc2983_thermocouple_new(const struct fwnode_handle *child, struct ltc2983_data
* This would be caught later but we can just return
* the error right away.
*/
- return dev_err_ptr_probe(&st->spi->dev, ret,
+ return dev_err_ptr_probe(dev, ret,
"Property reg must be given\n");
}
@@ -823,7 +824,7 @@ ltc2983_rtd_new(const struct fwnode_handle *child, struct ltc2983_data *st,
} else {
/* same as differential case */
if (sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
- return dev_err_ptr_probe(&st->spi->dev, -EINVAL,
+ return dev_err_ptr_probe(dev, -EINVAL,
"Invalid chann:%d for RTD\n",
sensor->chan);
}
@@ -873,7 +874,7 @@ ltc2983_rtd_new(const struct fwnode_handle *child, struct ltc2983_data *st,
rtd->excitation_current = 0x08;
break;
default:
- return dev_err_ptr_probe(&st->spi->dev, -EINVAL,
+ return dev_err_ptr_probe(dev, -EINVAL,
"Invalid value for excitation current(%u)\n",
excitation_current);
}
@@ -922,7 +923,7 @@ ltc2983_thermistor_new(const struct fwnode_handle *child, struct ltc2983_data *s
/* validate channel index */
if (!(thermistor->sensor_config & LTC2983_THERMISTOR_DIFF_MASK) &&
sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
- return dev_err_ptr_probe(&st->spi->dev, -EINVAL,
+ return dev_err_ptr_probe(dev, -EINVAL,
"Invalid chann:%d for differential thermistor\n",
sensor->chan);
@@ -964,7 +965,7 @@ ltc2983_thermistor_new(const struct fwnode_handle *child, struct ltc2983_data *s
case 0:
/* auto range */
if (sensor->type >= LTC2983_SENSOR_THERMISTOR_STEINHART)
- return dev_err_ptr_probe(&st->spi->dev, -EINVAL,
+ return dev_err_ptr_probe(dev, -EINVAL,
"Auto Range not allowed for custom sensors\n");
thermistor->excitation_current = 0x0c;
@@ -1003,7 +1004,7 @@ ltc2983_thermistor_new(const struct fwnode_handle *child, struct ltc2983_data *s
thermistor->excitation_current = 0x0b;
break;
default:
- return dev_err_ptr_probe(&st->spi->dev, -EINVAL,
+ return dev_err_ptr_probe(dev, -EINVAL,
"Invalid value for excitation current(%u)\n",
excitation_current);
}
@@ -1016,11 +1017,12 @@ static struct ltc2983_sensor *
ltc2983_diode_new(const struct fwnode_handle *child, const struct ltc2983_data *st,
const struct ltc2983_sensor *sensor)
{
+ struct device *dev = &st->spi->dev;
struct ltc2983_diode *diode;
u32 temp = 0, excitation_current = 0;
int ret;
- diode = devm_kzalloc(&st->spi->dev, sizeof(*diode), GFP_KERNEL);
+ diode = devm_kzalloc(dev, sizeof(*diode), GFP_KERNEL);
if (!diode)
return ERR_PTR(-ENOMEM);
@@ -1036,7 +1038,7 @@ ltc2983_diode_new(const struct fwnode_handle *child, const struct ltc2983_data *
/* validate channel index */
if (!(diode->sensor_config & LTC2983_DIODE_DIFF_MASK) &&
sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
- return dev_err_ptr_probe(&st->spi->dev, -EINVAL,
+ return dev_err_ptr_probe(dev, -EINVAL,
"Invalid chann:%d for differential thermistor\n",
sensor->chan);
@@ -1061,7 +1063,7 @@ ltc2983_diode_new(const struct fwnode_handle *child, const struct ltc2983_data *
diode->excitation_current = 0x03;
break;
default:
- return dev_err_ptr_probe(&st->spi->dev, -EINVAL,
+ return dev_err_ptr_probe(dev, -EINVAL,
"Invalid value for excitation current(%u)\n",
excitation_current);
}
@@ -1079,23 +1081,24 @@ static struct ltc2983_sensor *ltc2983_r_sense_new(struct fwnode_handle *child,
struct ltc2983_data *st,
const struct ltc2983_sensor *sensor)
{
+ struct device *dev = &st->spi->dev;
struct ltc2983_rsense *rsense;
int ret;
u32 temp;
- rsense = devm_kzalloc(&st->spi->dev, sizeof(*rsense), GFP_KERNEL);
+ rsense = devm_kzalloc(dev, sizeof(*rsense), GFP_KERNEL);
if (!rsense)
return ERR_PTR(-ENOMEM);
/* validate channel index */
if (sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
- return dev_err_ptr_probe(&st->spi->dev, -EINVAL,
+ return dev_err_ptr_probe(dev, -EINVAL,
"Invalid chann:%d for r_sense\n",
sensor->chan);
ret = fwnode_property_read_u32(child, "adi,rsense-val-milli-ohms", &temp);
if (ret)
- return dev_err_ptr_probe(&st->spi->dev, -EINVAL,
+ return dev_err_ptr_probe(dev, -EINVAL,
"Property adi,rsense-val-milli-ohms missing\n");
/*
* Times 1000 because we have milli-ohms and __convert_to_raw
@@ -1115,9 +1118,10 @@ static struct ltc2983_sensor *ltc2983_adc_new(struct fwnode_handle *child,
struct ltc2983_data *st,
const struct ltc2983_sensor *sensor)
{
+ struct device *dev = &st->spi->dev;
struct ltc2983_adc *adc;
- adc = devm_kzalloc(&st->spi->dev, sizeof(*adc), GFP_KERNEL);
+ adc = devm_kzalloc(dev, sizeof(*adc), GFP_KERNEL);
if (!adc)
return ERR_PTR(-ENOMEM);
@@ -1125,7 +1129,7 @@ static struct ltc2983_sensor *ltc2983_adc_new(struct fwnode_handle *child,
adc->single_ended = true;
if (!adc->single_ended && sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
- return dev_err_ptr_probe(&st->spi->dev, -EINVAL,
+ return dev_err_ptr_probe(dev, -EINVAL,
"Invalid chan:%d for differential adc\n",
sensor->chan);
@@ -1140,9 +1144,10 @@ static struct ltc2983_sensor *ltc2983_temp_new(struct fwnode_handle *child,
struct ltc2983_data *st,
const struct ltc2983_sensor *sensor)
{
+ struct device *dev = &st->spi->dev;
struct ltc2983_temp *temp;
- temp = devm_kzalloc(&st->spi->dev, sizeof(*temp), GFP_KERNEL);
+ temp = devm_kzalloc(dev, sizeof(*temp), GFP_KERNEL);
if (!temp)
return ERR_PTR(-ENOMEM);
@@ -1150,7 +1155,7 @@ static struct ltc2983_sensor *ltc2983_temp_new(struct fwnode_handle *child,
temp->single_ended = true;
if (!temp->single_ended && sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
- return dev_err_ptr_probe(&st->spi->dev, -EINVAL,
+ return dev_err_ptr_probe(dev, -EINVAL,
"Invalid chan:%d for differential temp\n",
sensor->chan);
@@ -1169,13 +1174,14 @@ static struct ltc2983_sensor *ltc2983_temp_new(struct fwnode_handle *child,
static int ltc2983_chan_read(struct ltc2983_data *st,
const struct ltc2983_sensor *sensor, int *val)
{
+ struct device *dev = &st->spi->dev;
u32 start_conversion = 0;
int ret;
unsigned long time;
start_conversion = LTC2983_STATUS_START(true);
start_conversion |= LTC2983_STATUS_CHAN_SEL(sensor->chan);
- dev_dbg(&st->spi->dev, "Start conversion on chan:%d, status:%02X\n",
+ dev_dbg(dev, "Start conversion on chan:%d, status:%02X\n",
sensor->chan, start_conversion);
reinit_completion(&st->completion);
/* start conversion */
@@ -1191,7 +1197,7 @@ static int ltc2983_chan_read(struct ltc2983_data *st,
time = wait_for_completion_timeout(&st->completion,
msecs_to_jiffies(300));
if (!time) {
- dev_warn(&st->spi->dev, "Conversion timed out\n");
+ dev_warn(dev, "Conversion timed out\n");
return -ETIMEDOUT;
}
@@ -1204,7 +1210,7 @@ static int ltc2983_chan_read(struct ltc2983_data *st,
*val = __be32_to_cpu(st->temp);
if (!(LTC2983_RES_VALID_MASK & *val)) {
- dev_err(&st->spi->dev, "Invalid conversion detected\n");
+ dev_err(dev, "Invalid conversion detected\n");
return -EIO;
}
@@ -1221,12 +1227,12 @@ static int ltc2983_read_raw(struct iio_dev *indio_dev,
int *val, int *val2, long mask)
{
struct ltc2983_data *st = iio_priv(indio_dev);
+ struct device *dev = &st->spi->dev;
int ret;
/* sanity check */
if (chan->address >= st->num_channels) {
- dev_err(&st->spi->dev, "Invalid chan address:%ld",
- chan->address);
+ dev_err(dev, "Invalid chan address:%ld", chan->address);
return -EINVAL;
}
@@ -1302,7 +1308,7 @@ static int ltc2983_parse_fw(struct ltc2983_data *st)
st->num_channels = device_get_child_node_count(dev);
if (!st->num_channels)
- return dev_err_probe(&st->spi->dev, -EINVAL,
+ return dev_err_probe(dev, -EINVAL,
"At least one channel must be given!\n");
st->sensors = devm_kcalloc(dev, st->num_channels, sizeof(*st->sensors),
@@ -1390,6 +1396,7 @@ static int ltc2983_eeprom_cmd(struct ltc2983_data *st, unsigned int cmd,
unsigned int wait_time, unsigned int status_reg,
unsigned long status_fail_mask)
{
+ struct device *dev = &st->spi->dev;
unsigned long time;
unsigned int val;
int ret;
@@ -1409,7 +1416,7 @@ static int ltc2983_eeprom_cmd(struct ltc2983_data *st, unsigned int cmd,
time = wait_for_completion_timeout(&st->completion,
msecs_to_jiffies(wait_time));
if (!time)
- return dev_err_probe(&st->spi->dev, -ETIMEDOUT,
+ return dev_err_probe(dev, -ETIMEDOUT,
"EEPROM command timed out\n");
ret = regmap_read(st->regmap, status_reg, &val);
@@ -1417,7 +1424,7 @@ static int ltc2983_eeprom_cmd(struct ltc2983_data *st, unsigned int cmd,
return ret;
if (val & status_fail_mask)
- return dev_err_probe(&st->spi->dev, -EINVAL,
+ return dev_err_probe(dev, -EINVAL,
"EEPROM command failed: 0x%02X\n", val);
return 0;
@@ -1426,6 +1433,7 @@ static int ltc2983_eeprom_cmd(struct ltc2983_data *st, unsigned int cmd,
static int ltc2983_setup(struct ltc2983_data *st, bool assign_iio)
{
u32 iio_chan_t = 0, iio_chan_v = 0, chan, iio_idx = 0, status;
+ struct device *dev = &st->spi->dev;
int ret;
/* make sure the device is up: start bit (7) is 0 and done bit (6) is 1 */
@@ -1433,8 +1441,7 @@ static int ltc2983_setup(struct ltc2983_data *st, bool assign_iio)
LTC2983_STATUS_UP(status) == 1, 25000,
25000 * 10);
if (ret)
- return dev_err_probe(&st->spi->dev, ret,
- "Device startup timed out\n");
+ return dev_err_probe(dev, ret, "Device startup timed out\n");
ret = regmap_update_bits(st->regmap, LTC2983_GLOBAL_CONFIG_REG,
LTC2983_NOTCH_FREQ_MASK,
@@ -1534,12 +1541,13 @@ static const struct iio_info ltc2983_iio_info = {
static int ltc2983_probe(struct spi_device *spi)
{
+ struct device *dev = &spi->dev;
struct ltc2983_data *st;
struct iio_dev *indio_dev;
struct gpio_desc *gpio;
int ret;
- indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+ indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
if (!indio_dev)
return -ENOMEM;
@@ -1551,7 +1559,7 @@ static int ltc2983_probe(struct spi_device *spi)
st->regmap = devm_regmap_init_spi(spi, <c2983_regmap_config);
if (IS_ERR(st->regmap))
- return dev_err_probe(&spi->dev, PTR_ERR(st->regmap),
+ return dev_err_probe(dev, PTR_ERR(st->regmap),
"Failed to initialize regmap\n");
mutex_init(&st->lock);
@@ -1564,11 +1572,11 @@ static int ltc2983_probe(struct spi_device *spi)
if (ret)
return ret;
- ret = devm_regulator_get_enable(&spi->dev, "vdd");
+ ret = devm_regulator_get_enable(dev, "vdd");
if (ret)
return ret;
- gpio = devm_gpiod_get_optional(&st->spi->dev, "reset", GPIOD_OUT_HIGH);
+ gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
if (IS_ERR(gpio))
return PTR_ERR(gpio);
@@ -1578,7 +1586,7 @@ static int ltc2983_probe(struct spi_device *spi)
gpiod_set_value_cansleep(gpio, 0);
}
- st->iio_chan = devm_kzalloc(&spi->dev,
+ st->iio_chan = devm_kzalloc(dev,
st->iio_channels * sizeof(*st->iio_chan),
GFP_KERNEL);
if (!st->iio_chan)
@@ -1588,11 +1596,10 @@ static int ltc2983_probe(struct spi_device *spi)
if (ret)
return ret;
- ret = devm_request_irq(&spi->dev, spi->irq, ltc2983_irq_handler,
+ ret = devm_request_irq(dev, spi->irq, ltc2983_irq_handler,
IRQF_TRIGGER_RISING, st->info->name, st);
if (ret)
- return dev_err_probe(&spi->dev, ret,
- "failed to request an irq\n");
+ return dev_err_probe(dev, ret, "failed to request an irq\n");
if (st->info->has_eeprom) {
ret = ltc2983_eeprom_cmd(st, LTC2983_EEPROM_WRITE_CMD,
@@ -1609,7 +1616,7 @@ static int ltc2983_probe(struct spi_device *spi)
indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->info = <c2983_iio_info;
- return devm_iio_device_register(&spi->dev, indio_dev);
+ return devm_iio_device_register(dev, indio_dev);
}
static int ltc2983_resume(struct device *dev)
--
2.43.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v4 5/9] iio: temperature: ltc2983: Fix inconsistent channel wording in messages
2026-05-25 16:39 [PATCH v4 0/9] iio: temperature: ltc2983: Add support for ADT7604 Liviu Stan
` (3 preceding siblings ...)
2026-05-25 16:39 ` [PATCH v4 4/9] iio: temperature: ltc2983: Use local device pointer consistently Liviu Stan
@ 2026-05-25 16:39 ` Liviu Stan
2026-05-27 16:19 ` Jonathan Cameron
2026-05-25 16:39 ` [PATCH v4 6/9] iio: temperature: ltc2983: Use fwnode_property_present() for optional properties Liviu Stan
` (3 subsequent siblings)
8 siblings, 1 reply; 29+ messages in thread
From: Liviu Stan @ 2026-05-25 16:39 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Liviu Stan, Francesco Lavra, linux-iio,
linux-kernel, linux, devicetree
Cc: Joshua Crofts
Replace occurrences of the abbreviated 'chann' and 'chan' with
'channel' in error and debug messages throughout the driver.
Also changed the diode invalid channel error message from
"thermistor" to "diode".
Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
Signed-off-by: Liviu Stan <liviu.stan@analog.com>
---
Changes in v4:
- Added Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
drivers/iio/temperature/ltc2983.c | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/drivers/iio/temperature/ltc2983.c b/drivers/iio/temperature/ltc2983.c
index 8b0b6b4884f6..fc904c0a42b4 100644
--- a/drivers/iio/temperature/ltc2983.c
+++ b/drivers/iio/temperature/ltc2983.c
@@ -699,7 +699,7 @@ ltc2983_thermocouple_new(const struct fwnode_handle *child, struct ltc2983_data
if (!(thermo->sensor_config & LTC2983_THERMOCOUPLE_DIFF_MASK) &&
sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
return dev_err_ptr_probe(dev, -EINVAL,
- "Invalid chann:%d for differential thermocouple\n",
+ "Invalid channel %d for differential thermocouple\n",
sensor->chan);
struct fwnode_handle *ref __free(fwnode_handle) =
@@ -797,7 +797,7 @@ ltc2983_rtd_new(const struct fwnode_handle *child, struct ltc2983_data *st,
/*
* rtd channel indexes are a bit more complicated to validate.
* For 4wire RTD with rotation, the channel selection cannot be
- * >=19 since the chann + 1 is used in this configuration.
+ * >=19 since the channel + 1 is used in this configuration.
* For 4wire RTDs with kelvin rsense, the rsense channel cannot be
* <=1 since channel - 1 and channel - 2 are used.
*/
@@ -814,18 +814,18 @@ ltc2983_rtd_new(const struct fwnode_handle *child, struct ltc2983_data *st,
(rtd->r_sense_chan <= min))
/* kelvin rsense*/
return dev_err_ptr_probe(dev, -EINVAL,
- "Invalid rsense chann:%d to use in kelvin rsense\n",
+ "Invalid channel %d for kelvin rsense\n",
rtd->r_sense_chan);
if (sensor->chan < min || sensor->chan > max)
return dev_err_ptr_probe(dev, -EINVAL,
- "Invalid chann:%d for the rtd config\n",
+ "Invalid channel %d for RTD config\n",
sensor->chan);
} else {
/* same as differential case */
if (sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
return dev_err_ptr_probe(dev, -EINVAL,
- "Invalid chann:%d for RTD\n",
+ "Invalid channel %d for RTD\n",
sensor->chan);
}
@@ -924,7 +924,7 @@ ltc2983_thermistor_new(const struct fwnode_handle *child, struct ltc2983_data *s
if (!(thermistor->sensor_config & LTC2983_THERMISTOR_DIFF_MASK) &&
sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
return dev_err_ptr_probe(dev, -EINVAL,
- "Invalid chann:%d for differential thermistor\n",
+ "Invalid channel %d for differential thermistor\n",
sensor->chan);
/* check custom sensor */
@@ -1039,7 +1039,7 @@ ltc2983_diode_new(const struct fwnode_handle *child, const struct ltc2983_data *
if (!(diode->sensor_config & LTC2983_DIODE_DIFF_MASK) &&
sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
return dev_err_ptr_probe(dev, -EINVAL,
- "Invalid chann:%d for differential thermistor\n",
+ "Invalid channel %d for differential diode\n",
sensor->chan);
/* set common parameters */
@@ -1093,7 +1093,7 @@ static struct ltc2983_sensor *ltc2983_r_sense_new(struct fwnode_handle *child,
/* validate channel index */
if (sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
return dev_err_ptr_probe(dev, -EINVAL,
- "Invalid chann:%d for r_sense\n",
+ "Invalid channel %d for r_sense\n",
sensor->chan);
ret = fwnode_property_read_u32(child, "adi,rsense-val-milli-ohms", &temp);
@@ -1130,7 +1130,7 @@ static struct ltc2983_sensor *ltc2983_adc_new(struct fwnode_handle *child,
if (!adc->single_ended && sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
return dev_err_ptr_probe(dev, -EINVAL,
- "Invalid chan:%d for differential adc\n",
+ "Invalid channel %d for differential ADC\n",
sensor->chan);
/* set common parameters */
@@ -1156,7 +1156,7 @@ static struct ltc2983_sensor *ltc2983_temp_new(struct fwnode_handle *child,
if (!temp->single_ended && sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
return dev_err_ptr_probe(dev, -EINVAL,
- "Invalid chan:%d for differential temp\n",
+ "Invalid channel %d for differential temp\n",
sensor->chan);
temp->custom = __ltc2983_custom_sensor_new(st, child, "adi,custom-temp",
@@ -1181,7 +1181,7 @@ static int ltc2983_chan_read(struct ltc2983_data *st,
start_conversion = LTC2983_STATUS_START(true);
start_conversion |= LTC2983_STATUS_CHAN_SEL(sensor->chan);
- dev_dbg(dev, "Start conversion on chan:%d, status:%02X\n",
+ dev_dbg(dev, "Start conversion on channel:%d, status:%02X\n",
sensor->chan, start_conversion);
reinit_completion(&st->completion);
/* start conversion */
@@ -1232,7 +1232,7 @@ static int ltc2983_read_raw(struct iio_dev *indio_dev,
/* sanity check */
if (chan->address >= st->num_channels) {
- dev_err(dev, "Invalid chan address:%ld", chan->address);
+ dev_err(dev, "Invalid channel address: %ld\n", chan->address);
return -EINVAL;
}
@@ -1329,14 +1329,14 @@ static int ltc2983_parse_fw(struct ltc2983_data *st)
if (sensor.chan < LTC2983_MIN_CHANNELS_NR ||
sensor.chan > st->info->max_channels_nr)
return dev_err_probe(dev, -EINVAL,
- "chan:%d must be from %u to %u\n",
+ "channel:%d must be from %u to %u\n",
sensor.chan,
LTC2983_MIN_CHANNELS_NR,
st->info->max_channels_nr);
if (channel_avail_mask & BIT(sensor.chan))
return dev_err_probe(dev, -EINVAL,
- "chan:%d already in use\n",
+ "channel:%d already in use\n",
sensor.chan);
ret = fwnode_property_read_u32(child, "adi,sensor-type", &sensor.type);
@@ -1344,7 +1344,7 @@ static int ltc2983_parse_fw(struct ltc2983_data *st)
return dev_err_probe(dev, ret,
"adi,sensor-type property must given for child nodes\n");
- dev_dbg(dev, "Create new sensor, type %u, chann %u",
+ dev_dbg(dev, "Create new sensor, type %u, channel %u",
sensor.type, sensor.chan);
if (sensor.type >= LTC2983_SENSOR_THERMOCOUPLE &&
--
2.43.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v4 6/9] iio: temperature: ltc2983: Use fwnode_property_present() for optional properties
2026-05-25 16:39 [PATCH v4 0/9] iio: temperature: ltc2983: Add support for ADT7604 Liviu Stan
` (4 preceding siblings ...)
2026-05-25 16:39 ` [PATCH v4 5/9] iio: temperature: ltc2983: Fix inconsistent channel wording in messages Liviu Stan
@ 2026-05-25 16:39 ` Liviu Stan
2026-05-27 16:19 ` Jonathan Cameron
2026-05-25 16:39 ` [PATCH v4 7/9] iio: core: Add IIO_COVERAGE channel type Liviu Stan
` (2 subsequent siblings)
8 siblings, 1 reply; 29+ messages in thread
From: Liviu Stan @ 2026-05-25 16:39 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Liviu Stan, Francesco Lavra, linux-iio,
linux-kernel, linux, devicetree
Checking fwnode_property_read_u32() return value with if (!ret)
silently swallows meaningful error codes when a property is present
but malformed. Use fwnode_property_present() first so that absence
uses the default while a present but unreadable property returns
a proper error.
Signed-off-by: Liviu Stan <liviu.stan@analog.com>
---
Changes in v4:
- No changes
drivers/iio/temperature/ltc2983.c | 84 +++++++++++++++++++++----------
1 file changed, 58 insertions(+), 26 deletions(-)
diff --git a/drivers/iio/temperature/ltc2983.c b/drivers/iio/temperature/ltc2983.c
index fc904c0a42b4..130ab7fddc2f 100644
--- a/drivers/iio/temperature/ltc2983.c
+++ b/drivers/iio/temperature/ltc2983.c
@@ -668,8 +668,14 @@ ltc2983_thermocouple_new(const struct fwnode_handle *child, struct ltc2983_data
if (fwnode_property_read_bool(child, "adi,single-ended"))
thermo->sensor_config = LTC2983_THERMOCOUPLE_SGL(1);
- ret = fwnode_property_read_u32(child, "adi,sensor-oc-current-microamp", &oc_current);
- if (!ret) {
+ if (fwnode_property_present(child, "adi,sensor-oc-current-microamp")) {
+ ret = fwnode_property_read_u32(child,
+ "adi,sensor-oc-current-microamp",
+ &oc_current);
+ if (ret)
+ return dev_err_ptr_probe(dev, ret,
+ "Failed to read adi,sensor-oc-current-microamp\n");
+
switch (oc_current) {
case 10:
thermo->sensor_config |=
@@ -759,8 +765,12 @@ ltc2983_rtd_new(const struct fwnode_handle *child, struct ltc2983_data *st,
return dev_err_ptr_probe(dev, ret,
"Property reg must be given\n");
- ret = fwnode_property_read_u32(child, "adi,number-of-wires", &n_wires);
- if (!ret) {
+ if (fwnode_property_present(child, "adi,number-of-wires")) {
+ ret = fwnode_property_read_u32(child, "adi,number-of-wires", &n_wires);
+ if (ret)
+ return dev_err_ptr_probe(dev, ret,
+ "Failed to read adi,number-of-wires\n");
+
switch (n_wires) {
case 2:
rtd->sensor_config = LTC2983_RTD_N_WIRES(0);
@@ -842,12 +852,13 @@ ltc2983_rtd_new(const struct fwnode_handle *child, struct ltc2983_data *st,
rtd->sensor.fault_handler = ltc2983_common_fault_handler;
rtd->sensor.assign_chan = ltc2983_rtd_assign_chan;
- ret = fwnode_property_read_u32(child, "adi,excitation-current-microamp",
- &excitation_current);
- if (ret) {
- /* default to 5uA */
- rtd->excitation_current = 1;
- } else {
+ if (fwnode_property_present(child, "adi,excitation-current-microamp")) {
+ ret = fwnode_property_read_u32(child, "adi,excitation-current-microamp",
+ &excitation_current);
+ if (ret)
+ return dev_err_ptr_probe(dev, ret,
+ "Failed to read adi,excitation-current-microamp\n");
+
switch (excitation_current) {
case 5:
rtd->excitation_current = 0x01;
@@ -878,9 +889,17 @@ ltc2983_rtd_new(const struct fwnode_handle *child, struct ltc2983_data *st,
"Invalid value for excitation current(%u)\n",
excitation_current);
}
+ } else {
+ /* default to 5uA */
+ rtd->excitation_current = 1;
}
- fwnode_property_read_u32(child, "adi,rtd-curve", &rtd->rtd_curve);
+ if (fwnode_property_present(child, "adi,rtd-curve")) {
+ ret = fwnode_property_read_u32(child, "adi,rtd-curve", &rtd->rtd_curve);
+ if (ret)
+ return dev_err_ptr_probe(dev, ret,
+ "Failed to read adi,rtd-curve\n");
+ }
return &rtd->sensor;
}
@@ -950,17 +969,13 @@ ltc2983_thermistor_new(const struct fwnode_handle *child, struct ltc2983_data *s
thermistor->sensor.fault_handler = ltc2983_common_fault_handler;
thermistor->sensor.assign_chan = ltc2983_thermistor_assign_chan;
- ret = fwnode_property_read_u32(child, "adi,excitation-current-nanoamp",
- &excitation_current);
- if (ret) {
- /* Auto range is not allowed for custom sensors */
- if (sensor->type >= LTC2983_SENSOR_THERMISTOR_STEINHART)
- /* default to 1uA */
- thermistor->excitation_current = 0x03;
- else
- /* default to auto-range */
- thermistor->excitation_current = 0x0c;
- } else {
+ if (fwnode_property_present(child, "adi,excitation-current-nanoamp")) {
+ ret = fwnode_property_read_u32(child, "adi,excitation-current-nanoamp",
+ &excitation_current);
+ if (ret)
+ return dev_err_ptr_probe(dev, ret,
+ "Failed to read adi,excitation-current-nanoamp\n");
+
switch (excitation_current) {
case 0:
/* auto range */
@@ -1008,6 +1023,14 @@ ltc2983_thermistor_new(const struct fwnode_handle *child, struct ltc2983_data *s
"Invalid value for excitation current(%u)\n",
excitation_current);
}
+ } else {
+ /* Auto range is not allowed for custom sensors */
+ if (sensor->type >= LTC2983_SENSOR_THERMISTOR_STEINHART)
+ /* default to 1uA */
+ thermistor->excitation_current = 0x03;
+ else
+ /* default to auto-range */
+ thermistor->excitation_current = 0x0c;
}
return &thermistor->sensor;
@@ -1046,9 +1069,13 @@ ltc2983_diode_new(const struct fwnode_handle *child, const struct ltc2983_data *
diode->sensor.fault_handler = ltc2983_common_fault_handler;
diode->sensor.assign_chan = ltc2983_diode_assign_chan;
- ret = fwnode_property_read_u32(child, "adi,excitation-current-microamp",
- &excitation_current);
- if (!ret) {
+ if (fwnode_property_present(child, "adi,excitation-current-microamp")) {
+ ret = fwnode_property_read_u32(child, "adi,excitation-current-microamp",
+ &excitation_current);
+ if (ret)
+ return dev_err_ptr_probe(dev, ret,
+ "Failed to read adi,excitation-current-microamp\n");
+
switch (excitation_current) {
case 10:
diode->excitation_current = 0x00;
@@ -1069,7 +1096,12 @@ ltc2983_diode_new(const struct fwnode_handle *child, const struct ltc2983_data *
}
}
- fwnode_property_read_u32(child, "adi,ideal-factor-value", &temp);
+ if (fwnode_property_present(child, "adi,ideal-factor-value")) {
+ ret = fwnode_property_read_u32(child, "adi,ideal-factor-value", &temp);
+ if (ret)
+ return dev_err_ptr_probe(dev, ret,
+ "Failed to read adi,ideal-factor-value\n");
+ }
/* 2^20 resolution */
diode->ideal_factor_value = __convert_to_raw(temp, 1048576);
--
2.43.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v4 7/9] iio: core: Add IIO_COVERAGE channel type
2026-05-25 16:39 [PATCH v4 0/9] iio: temperature: ltc2983: Add support for ADT7604 Liviu Stan
` (5 preceding siblings ...)
2026-05-25 16:39 ` [PATCH v4 6/9] iio: temperature: ltc2983: Use fwnode_property_present() for optional properties Liviu Stan
@ 2026-05-25 16:39 ` Liviu Stan
2026-05-27 16:51 ` Jonathan Cameron
2026-05-25 16:39 ` [PATCH v4 8/9] dt-bindings: iio: temperature: Add ADT7604 support to adi,ltc2983 Liviu Stan
2026-05-25 16:39 ` [PATCH v4 9/9] iio: temperature: ltc2983: Add support for ADT7604 Liviu Stan
8 siblings, 1 reply; 29+ messages in thread
From: Liviu Stan @ 2026-05-25 16:39 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Liviu Stan, Francesco Lavra, linux-iio,
linux-kernel, linux, devicetree
Add a new channel type for sensors that report fractional coverage as
a percentage. The sysfs attribute is in_coverageY_raw; after applying
in_coverageY_scale the value is in percent. The first user is the
ADT7604 leak detector, where the value represents the portion of the
sensing element that is wetted.
Signed-off-by: Liviu Stan <liviu.stan@analog.com>
---
Changes in v4:
- Renamed the sysfs attribute from in_coverageX_raw to in_coverageY_raw
and in_coverageX_scale to in_coverageY_scale to follow ABI convention
- Updated commit message to reflect the rename
Documentation/ABI/testing/sysfs-bus-iio | 17 +++++++++++++++++
drivers/iio/industrialio-core.c | 1 +
include/uapi/linux/iio/types.h | 1 +
tools/iio/iio_event_monitor.c | 2 ++
4 files changed, 21 insertions(+)
diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio
index 925a33fd309a..d8d6d85235b0 100644
--- a/Documentation/ABI/testing/sysfs-bus-iio
+++ b/Documentation/ABI/testing/sysfs-bus-iio
@@ -1980,6 +1980,23 @@ Description:
Raw (unscaled no offset etc.) resistance reading.
Units after application of scale and offset are ohms.
+What: /sys/bus/iio/devices/iio:deviceX/in_coverageY_raw
+KernelVersion: 7.2
+Contact: linux-iio@vger.kernel.org
+Description:
+ Raw (unscaled no offset etc.) coverage reading. Used for sensors
+ that report fractional coverage as a percentage, such as leak
+ detectors where the value represents what portion of the sensing
+ element is wetted. Units after application of scale and offset are
+ percent.
+
+What: /sys/bus/iio/devices/iio:deviceX/in_coverageY_scale
+KernelVersion: 7.2
+Contact: linux-iio@vger.kernel.org
+Description:
+ Scale to be applied to in_coverageY_raw to obtain coverage
+ in percent.
+
What: /sys/bus/iio/devices/iio:deviceX/heater_enable
KernelVersion: 4.1.0
Contact: linux-iio@vger.kernel.org
diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
index bd6f4f9f4533..ffe0dc49c4b9 100644
--- a/drivers/iio/industrialio-core.c
+++ b/drivers/iio/industrialio-core.c
@@ -98,6 +98,7 @@ static const char * const iio_chan_type_name_spec[] = {
[IIO_CHROMATICITY] = "chromaticity",
[IIO_ATTENTION] = "attention",
[IIO_ALTCURRENT] = "altcurrent",
+ [IIO_COVERAGE] = "coverage",
};
static const char * const iio_modifier_names[] = {
diff --git a/include/uapi/linux/iio/types.h b/include/uapi/linux/iio/types.h
index d7c2bb223651..c9295c707041 100644
--- a/include/uapi/linux/iio/types.h
+++ b/include/uapi/linux/iio/types.h
@@ -53,6 +53,7 @@ enum iio_chan_type {
IIO_CHROMATICITY,
IIO_ATTENTION,
IIO_ALTCURRENT,
+ IIO_COVERAGE,
};
enum iio_modifier {
diff --git a/tools/iio/iio_event_monitor.c b/tools/iio/iio_event_monitor.c
index df6c43d7738d..bc3ef4c77c2b 100644
--- a/tools/iio/iio_event_monitor.c
+++ b/tools/iio/iio_event_monitor.c
@@ -65,6 +65,7 @@ static const char * const iio_chan_type_name_spec[] = {
[IIO_CHROMATICITY] = "chromaticity",
[IIO_ATTENTION] = "attention",
[IIO_ALTCURRENT] = "altcurrent",
+ [IIO_COVERAGE] = "coverage",
};
static const char * const iio_ev_type_text[] = {
@@ -194,6 +195,7 @@ static bool event_is_known(struct iio_event_data *event)
case IIO_CHROMATICITY:
case IIO_ATTENTION:
case IIO_ALTCURRENT:
+ case IIO_COVERAGE:
break;
default:
return false;
--
2.43.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v4 8/9] dt-bindings: iio: temperature: Add ADT7604 support to adi,ltc2983
2026-05-25 16:39 [PATCH v4 0/9] iio: temperature: ltc2983: Add support for ADT7604 Liviu Stan
` (6 preceding siblings ...)
2026-05-25 16:39 ` [PATCH v4 7/9] iio: core: Add IIO_COVERAGE channel type Liviu Stan
@ 2026-05-25 16:39 ` Liviu Stan
2026-05-25 18:28 ` sashiko-bot
2026-05-26 16:55 ` Conor Dooley
2026-05-25 16:39 ` [PATCH v4 9/9] iio: temperature: ltc2983: Add support for ADT7604 Liviu Stan
8 siblings, 2 replies; 29+ messages in thread
From: Liviu Stan @ 2026-05-25 16:39 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Liviu Stan, Francesco Lavra, linux-iio,
linux-kernel, linux, devicetree
The ADT7604 shares the same die as the LTC2984. It repurposes the
custom RTD sensor type (18) as a copper trace resistance sensor
and the custom thermistor type (27) as a leak detector, and
removes thermocouple, diode and direct ADC sensor types.
Add adi,adt7604 to the compatible list and introduce two new
sensor node types specific to this device:
- copper-trace@: maps to the custom RTD sensor type (18). Two
variants: sub-ohm (< 1 ohm, adi,copper-trace-sub-ohm boolean,
no custom table and excitation current) and standard (> 1 ohm,
required adi,custom-copper-trace table, optional excitation current
defaulting to the datasheet recommended value). Primary output
is resistance in ohms. For > 1 ohm copper traces with a custom table,
the chip also outputs temperature in millidegrees Celsius.
- leak-detector@: maps to the custom thermistor sensor type (27).
Takes a required adi,custom-leak-detector lookup table encoding
resistance (uOhm) against coverage data (%). Two outputs:
resistance in ohms and coverage in percent.
Separate node types are used rather than extending the existing
rtd@ and thermistor@ nodes because adi,custom-rtd is required
for sensor type 18, and several properties (adi,number-of-wires,
adi,rtd-curve, adi,rsense-share, adi,single-ended,
adi,current-rotate) have no meaning for the new sensor types, since
the configuration is hardcoded, and would need to be explicitly
forbidden or ignored in the driver.
allOf conditions are added to restrict thermocouple, diode, direct
ADC and active temperature nodes to non-ADT7604 devices, and to
restrict copper-trace and leak-detector nodes to the ADT7604
(some parts only).
Signed-off-by: Liviu Stan <liviu.stan@analog.com>
---
Changes in v4:
- Added restrictions for adi,sensor-type = <18> in ^rtd@ nodes and
adi,sensor-type = <27> in ^thermistor@ nodes for adi,adt7604
.../bindings/iio/temperature/adi,ltc2983.yaml | 217 +++++++++++++++++-
1 file changed, 214 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/iio/temperature/adi,ltc2983.yaml b/Documentation/devicetree/bindings/iio/temperature/adi,ltc2983.yaml
index a22725f7619b..ab77f987ee02 100644
--- a/Documentation/devicetree/bindings/iio/temperature/adi,ltc2983.yaml
+++ b/Documentation/devicetree/bindings/iio/temperature/adi,ltc2983.yaml
@@ -4,14 +4,18 @@
$id: http://devicetree.org/schemas/iio/temperature/adi,ltc2983.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
-title: Analog Devices LTC2983, LTC2986, LTM2985 Multi-sensor Temperature system
+title: Analog Devices LTC2983 and similar Multi-sensor Temperature systems
maintainers:
- Nuno Sá <nuno.sa@analog.com>
description: |
- Analog Devices LTC2983, LTC2984, LTC2986, LTM2985 Multi-Sensor Digital
- Temperature Measurement Systems
+ Analog Devices Multi-Sensor Digital Temperature Measurement Systems:
+ - ADT7604
+ - LTC2983
+ - LTC2984
+ - LTC2986
+ - LTM2985
https://www.analog.com/media/en/technical-documentation/data-sheets/2983fc.pdf
https://www.analog.com/media/en/technical-documentation/data-sheets/2984fb.pdf
@@ -43,6 +47,7 @@ properties:
compatible:
oneOf:
- enum:
+ - adi,adt7604
- adi,ltc2983
- adi,ltc2986
- adi,ltm2985
@@ -436,6 +441,121 @@ patternProperties:
required:
- adi,custom-temp
+ '^copper-trace@':
+ $ref: '#/$defs/sensor-node'
+ unevaluatedProperties: false
+ description: |
+ Copper trace resistance sensor (some parts only). Two variants exist:
+ sub-ohm (< 1 ohm, no custom table allowed) and standard (> 1 ohm,
+ required custom table).
+
+ properties:
+ reg:
+ minimum: 2
+ maximum: 20
+
+ adi,sensor-type:
+ description: Sensor type for copper trace sensors.
+ $ref: /schemas/types.yaml#/definitions/uint32
+ const: 32
+
+ adi,rsense-handle:
+ description: Associated sense resistor sensor.
+ $ref: /schemas/types.yaml#/definitions/phandle
+
+ adi,copper-trace-sub-ohm:
+ description:
+ Select the sub-ohm (< 1 ohm) copper trace variant. Custom table
+ and excitation current are not allowed in this mode.
+ type: boolean
+
+ adi,excitation-current-microamp:
+ description:
+ Excitation current applied to the copper trace. Not used in
+ sub-ohm mode. The datasheet recommends 1mA for copper trace
+ sensors due to their typically small resistance.
+ enum: [5, 10, 25, 50, 100, 250, 500, 1000]
+ default: 1000
+
+ adi,custom-copper-trace:
+ description:
+ Resistance-to-temperature table for copper trace sensors with
+ resistance > 1 ohm. Required when adi,copper-trace-sub-ohm is not
+ set. See Page 36 of the datasheet.
+ $ref: /schemas/types.yaml#/definitions/uint64-matrix
+ minItems: 3
+ maxItems: 64
+ items:
+ items:
+ - description: Resistance point in uOhms.
+ - description: Temperature point in uK.
+
+ required:
+ - adi,rsense-handle
+
+ allOf:
+ - if:
+ required:
+ - adi,copper-trace-sub-ohm
+ then:
+ properties:
+ adi,custom-copper-trace: false
+ adi,excitation-current-microamp: false
+ - if:
+ not:
+ required:
+ - adi,copper-trace-sub-ohm
+ then:
+ required:
+ - adi,custom-copper-trace
+
+ '^leak-detector@':
+ $ref: '#/$defs/sensor-node'
+ unevaluatedProperties: false
+ description: |
+ Leak detector sensor (some parts only). Outputs resistance in ohms and
+ a coverage percentage via IIO_COVERAGE (raw/1024 = coverage %).
+
+ properties:
+ reg:
+ minimum: 2
+ maximum: 20
+
+ adi,sensor-type:
+ description: Sensor type for leak detector sensors.
+ $ref: /schemas/types.yaml#/definitions/uint32
+ const: 33
+
+ adi,rsense-handle:
+ description: Associated sense resistor sensor.
+ $ref: /schemas/types.yaml#/definitions/phandle
+
+ adi,excitation-current-nanoamp:
+ description:
+ Excitation current applied to the leak detector. The correct value
+ depends on the electrical characteristics of the liquid being sensed.
+ For example, 10000 (10µA) is recommended for PG25 (see datasheet
+ Table 39).
+ enum: [250, 500, 1000, 5000, 10000, 25000, 50000, 100000, 250000,
+ 500000, 1000000]
+
+ adi,custom-leak-detector:
+ description: |
+ Lookup table mapping resistance to coverage percentage. Entries must
+ be in ascending resistance order.
+ $ref: /schemas/types.yaml#/definitions/uint64-matrix
+ minItems: 3
+ maxItems: 64
+ items:
+ items:
+ - description: Resistance point in uOhms.
+ - description: Coverage data percentage (0 to 100).
+
+ required:
+ - adi,rsense-handle
+ - adi,excitation-current-nanoamp
+ - adi,custom-leak-detector
+
'^rsense@':
$ref: '#/$defs/sensor-node'
unevaluatedProperties: false
@@ -477,6 +597,32 @@ allOf:
patternProperties:
'^temp@': false
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: adi,adt7604
+ then:
+ patternProperties:
+ '^thermocouple@': false
+ '^diode@': false
+ '^adc@': false
+ '^temp@': false
+ '^rtd@':
+ properties:
+ adi,sensor-type:
+ not:
+ const: 18
+ '^thermistor@':
+ properties:
+ adi,sensor-type:
+ not:
+ const: 27
+ else:
+ patternProperties:
+ '^copper-trace@': false
+ '^leak-detector@': false
+
examples:
- |
#include <dt-bindings/interrupt-controller/irq.h>
@@ -556,4 +702,69 @@ examples:
};
};
};
+
+ - |
+ #include <dt-bindings/interrupt-controller/irq.h>
+ spi {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ temperature-sensor@0 {
+ compatible = "adi,adt7604";
+ reg = <0>;
+ interrupt-parent = <&gpio>;
+ interrupts = <25 IRQ_TYPE_EDGE_RISING>;
+
+ #address-cells = <1>;
+ #size-cells = <0>;
+ vdd-supply = <&supply>;
+
+ trace_rsense: rsense@2 {
+ reg = <2>;
+ adi,sensor-type = <29>;
+ adi,rsense-val-milli-ohms = <100000>; // 100 ohm
+ };
+
+ copper-trace@4 {
+ reg = <4>;
+ adi,sensor-type = <32>;
+ adi,rsense-handle = <&trace_rsense>;
+ adi,copper-trace-sub-ohm;
+ };
+
+ r_sense: rsense@12 {
+ reg = <12>;
+ adi,sensor-type = <29>;
+ adi,rsense-val-milli-ohms = <1000000>; // 1 kohm
+ };
+
+ leak-detector@14 {
+ reg = <14>;
+ adi,sensor-type = <33>;
+ adi,rsense-handle = <&r_sense>;
+ adi,excitation-current-nanoamp = <10000>;
+ adi,custom-leak-detector =
+ /bits/ 64 < 0 100>,
+ /bits/ 64 < 202020000 99>,
+ /bits/ 64 < 285710000 70>,
+ /bits/ 64 < 333330000 60>,
+ /bits/ 64 < 400000000 50>,
+ /bits/ 64 < 500000000 40>,
+ /bits/ 64 < 666670000 30>,
+ /bits/ 64 < 1000000000 20>,
+ /bits/ 64 < 2000000000 10>,
+ /bits/ 64 <1000000000000 0>;
+ };
+
+ rtd@18 {
+ reg = <18>;
+ adi,sensor-type = <12>; // PT100
+ adi,rsense-handle = <&r_sense>;
+ adi,number-of-wires = <2>;
+ adi,rsense-share;
+ adi,excitation-current-microamp = <500>;
+ adi,rtd-curve = <0>;
+ };
+ };
+ };
...
--
2.43.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v4 9/9] iio: temperature: ltc2983: Add support for ADT7604
2026-05-25 16:39 [PATCH v4 0/9] iio: temperature: ltc2983: Add support for ADT7604 Liviu Stan
` (7 preceding siblings ...)
2026-05-25 16:39 ` [PATCH v4 8/9] dt-bindings: iio: temperature: Add ADT7604 support to adi,ltc2983 Liviu Stan
@ 2026-05-25 16:39 ` Liviu Stan
2026-05-25 19:06 ` sashiko-bot
2026-05-26 8:47 ` Liviu Stan
8 siblings, 2 replies; 29+ messages in thread
From: Liviu Stan @ 2026-05-25 16:39 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Francesco Lavra, Liviu Stan, linux-iio,
linux-kernel, linux, devicetree
The ADT7604 shares the same die as the LTC2984. It repurposes the
custom RTD sensor type (18) as a copper trace resistance sensor
and the custom thermistor type (27) as a leak detector, and
removes thermocouple, diode and direct ADC sensor types.
Two new software sensor type values are introduced
(LTC2983_SENSOR_COPPER_TRACE = 32, LTC2983_SENSOR_LEAK_DETECTOR = 33)
that map to the hardware register values 18 and 27 respectively.
Dedicated structs (ltc2983_copper_trace, ltc2983_leak_detector) and
parser functions are added rather than extending the existing RTD and
thermistor paths, as the hardware configuration bits are fully
hardcoded and several RTD/thermistor properties would need to be
explicitly forbidden or ignored.
Custom RTD (type 18) becomes the copper trace sensor. Sensor
configuration bits are hardcoded to 0b1001 per the datasheet.
Two variants are supported via the adi,copper-trace-sub-ohm DT
property: sub-ohm traces (< 1 ohm) have bits 17:0 cleared with no
excitation current or custom table; standard traces (> 1 ohm) have
a required resistance-to-temperature table.
Custom thermistor (type 27) becomes the leak detector. Sensor
configuration bits are hardcoded to 0b001. The custom table uses
a resolution of 16 instead of 64, and is specified via the
required adi,custom-leak-detector DT property.
Both sensor types expose an IIO_RESISTANCE channel reading from
the resistance result register bank (0x0060-0x00AF). Added a
"base" parameter to the LTC2983_RESULT_ADDR macro and a "base_reg"
parameter to the ltc2983_chan_read function so we can read from
both result register banks. The resistance register encodes the
measured resistance with 10 fractional bits, so dividing by 1024
gives ohms. Since the sense resistor is specified in ohms, the
output is in ohms for both sensor types and a single 1/1024
scale applies to both. For > 1 ohm copper traces and for leak
detectors, a secondary channel also appears: IIO_TEMP
(millidegrees Celsius) for copper trace and IIO_COVERAGE (percent)
for leak detector.
The ltc2983_chip_info struct is extended with a u64 supported_sensors
bitmask using BIT_ULL() to safely represent the new sensor type bits
32 and 33 on 32-bit builds. A LTC2983_SENSOR_NUM sentinel is added
to the enum so that the bounds check uses >= LTC2983_SENSOR_NUM
rather than hardcoding the last sensor type.
Tested on EVAL-ADT7604-AZ connected to Raspberry Pi 5 via SPI.
Signed-off-by: Liviu Stan <liviu.stan@analog.com>
---
Changes in v4:
- Removed trailing comma from LTC2983_SENSOR_NUM enum sentinel
- Sorted id_table, of_match, and chip_info_data structs alphabetically
drivers/iio/temperature/ltc2983.c | 413 ++++++++++++++++++++++++++++--
1 file changed, 394 insertions(+), 19 deletions(-)
diff --git a/drivers/iio/temperature/ltc2983.c b/drivers/iio/temperature/ltc2983.c
index 130ab7fddc2f..fc65d8352d12 100644
--- a/drivers/iio/temperature/ltc2983.c
+++ b/drivers/iio/temperature/ltc2983.c
@@ -28,6 +28,8 @@
#define LTC2983_STATUS_REG 0x0000
#define LTC2983_TEMP_RES_START_REG 0x0010
#define LTC2983_TEMP_RES_END_REG 0x005F
+#define ADT7604_RES_RES_START_REG 0x0060
+#define ADT7604_RES_RES_END_REG 0x00AF
#define LTC2983_EEPROM_KEY_REG 0x00B0
#define LTC2983_EEPROM_READ_STATUS_REG 0x00D0
#define LTC2983_GLOBAL_CONFIG_REG 0x00F0
@@ -58,8 +60,8 @@
#define LTC2983_CHAN_ASSIGN_ADDR(chan) \
((((chan) - 1) * 4) + LTC2983_CHAN_ASSIGN_START_REG)
-#define LTC2983_RESULT_ADDR(chan) \
- ((((chan) - 1) * 4) + LTC2983_TEMP_RES_START_REG)
+#define LTC2983_RESULT_ADDR(chan, base) \
+ ((((chan) - 1) * 4) + (base))
#define LTC2983_THERMOCOUPLE_DIFF_MASK BIT(3)
#define LTC2983_THERMOCOUPLE_SGL(x) \
FIELD_PREP(LTC2983_THERMOCOUPLE_DIFF_MASK, x)
@@ -186,17 +188,44 @@ enum {
LTC2983_SENSOR_SENSE_RESISTOR = 29,
LTC2983_SENSOR_DIRECT_ADC = 30,
LTC2983_SENSOR_ACTIVE_TEMP = 31,
+ /* Sensor types for some parts only; map to RTD_CUSTOM/THERMISTOR_CUSTOM in HW */
+ LTC2983_SENSOR_COPPER_TRACE = 32,
+ LTC2983_SENSOR_LEAK_DETECTOR = 33,
+ LTC2983_SENSOR_NUM
};
+/* Bitmask of sensor types supported by LTC2983/LTC2984 and derivatives */
+#define LTC2983_COMMON_SENSORS \
+ (GENMASK_ULL(LTC2983_SENSOR_THERMOCOUPLE_CUSTOM, LTC2983_SENSOR_THERMOCOUPLE) | \
+ GENMASK_ULL(LTC2983_SENSOR_RTD_CUSTOM, LTC2983_SENSOR_RTD) | \
+ GENMASK_ULL(LTC2983_SENSOR_THERMISTOR_CUSTOM, LTC2983_SENSOR_THERMISTOR) | \
+ BIT_ULL(LTC2983_SENSOR_DIODE) | \
+ BIT_ULL(LTC2983_SENSOR_SENSE_RESISTOR) | \
+ BIT_ULL(LTC2983_SENSOR_DIRECT_ADC))
+
+/* Bitmask of sensor types supported by ADT7604 */
+#define ADT7604_SENSORS \
+ (GENMASK_ULL(LTC2983_SENSOR_RTD_CUSTOM - 1, LTC2983_SENSOR_RTD) | \
+ GENMASK_ULL(LTC2983_SENSOR_THERMISTOR_CUSTOM - 1, LTC2983_SENSOR_THERMISTOR) | \
+ BIT_ULL(LTC2983_SENSOR_SENSE_RESISTOR) | \
+ BIT_ULL(LTC2983_SENSOR_COPPER_TRACE) | \
+ BIT_ULL(LTC2983_SENSOR_LEAK_DETECTOR))
+
#define to_thermocouple(_sensor) \
container_of(_sensor, struct ltc2983_thermocouple, sensor)
#define to_rtd(_sensor) \
container_of(_sensor, struct ltc2983_rtd, sensor)
+#define to_copper_trace(_sensor) \
+ container_of(_sensor, struct ltc2983_copper_trace, sensor)
+
#define to_thermistor(_sensor) \
container_of(_sensor, struct ltc2983_thermistor, sensor)
+#define to_leak_detector(_sensor) \
+ container_of(_sensor, struct ltc2983_leak_detector, sensor)
+
#define to_diode(_sensor) \
container_of(_sensor, struct ltc2983_diode, sensor)
@@ -212,7 +241,7 @@ enum {
struct ltc2983_chip_info {
const char *name;
unsigned int max_channels_nr;
- bool has_temp;
+ u64 supported_sensors;
bool has_eeprom;
};
@@ -247,6 +276,8 @@ struct ltc2983_sensor {
u32 chan;
/* sensor type */
u32 type;
+ /* number of IIO channels this sensor produces */
+ u8 n_iio_chan;
};
struct ltc2983_custom_sensor {
@@ -274,6 +305,25 @@ struct ltc2983_rtd {
u32 rtd_curve;
};
+struct ltc2983_copper_trace {
+ struct ltc2983_sensor sensor;
+ struct ltc2983_custom_sensor *custom;
+ u32 r_sense_chan;
+ u32 excitation_current;
+ /* selects the <1Ω variant: bits 17:0 of the channel word are zeroed,
+ * disabling excitation current and custom table fields (ADT7604
+ * datasheet Table 26)
+ */
+ bool is_sub_ohm;
+};
+
+struct ltc2983_leak_detector {
+ struct ltc2983_sensor sensor;
+ struct ltc2983_custom_sensor *custom;
+ u32 r_sense_chan;
+ u32 excitation_current;
+};
+
struct ltc2983_thermistor {
struct ltc2983_sensor sensor;
struct ltc2983_custom_sensor *custom;
@@ -353,8 +403,14 @@ static int __ltc2983_chan_assign_common(struct ltc2983_data *st,
{
struct device *dev = &st->spi->dev;
u32 reg = LTC2983_CHAN_ASSIGN_ADDR(sensor->chan);
+ u32 hw_type = sensor->type;
- chan_val |= LTC2983_CHAN_TYPE(sensor->type);
+ if (hw_type == LTC2983_SENSOR_COPPER_TRACE)
+ hw_type = LTC2983_SENSOR_RTD_CUSTOM;
+ else if (hw_type == LTC2983_SENSOR_LEAK_DETECTOR)
+ hw_type = LTC2983_SENSOR_THERMISTOR_CUSTOM;
+
+ chan_val |= LTC2983_CHAN_TYPE(hw_type);
dev_dbg(dev, "Assign reg:0x%04X, val:0x%08X\n", reg, chan_val);
st->chan_val = cpu_to_be32(chan_val);
return regmap_bulk_write(st->regmap, reg, &st->chan_val,
@@ -485,6 +541,14 @@ __ltc2983_custom_sensor_new(struct ltc2983_data *st, const struct fwnode_handle
for (index = 0; index < n_entries; index++) {
u64 temp = ((u64 *)new_custom->table)[index];
+ /*
+ * Users specify plain coverage percentage (0-100). Convert
+ * to µK so __convert_to_raw() produces the correct hardware
+ * encoding: P + 273.15 K.
+ */
+ if ((index % 2) != 0 && !strcmp(propname, "adi,custom-leak-detector"))
+ temp = temp * 1000000 + 273150000;
+
if ((index % 2) != 0)
temp = __convert_to_raw(temp, 1024);
else if (has_signed && (s64)temp < 0)
@@ -578,6 +642,31 @@ static int ltc2983_rtd_assign_chan(struct ltc2983_data *st,
return __ltc2983_chan_assign_common(st, sensor, chan_val);
}
+static int ltc2983_copper_trace_assign_chan(struct ltc2983_data *st,
+ const struct ltc2983_sensor *sensor)
+{
+ struct ltc2983_copper_trace *ct = to_copper_trace(sensor);
+ u32 chan_val;
+
+ chan_val = LTC2983_CHAN_ASSIGN(ct->r_sense_chan);
+ /* Sensor config bits 21:18 must be 0b1001 (ADT7604 datasheet Table 26) */
+ chan_val |= LTC2983_RTD_CFG(0x9);
+
+ if (ct->is_sub_ohm) {
+ chan_val &= ~GENMASK(17, 0);
+ } else {
+ int ret;
+
+ chan_val |= LTC2983_RTD_EXC_CURRENT(ct->excitation_current);
+ ret = __ltc2983_chan_custom_sensor_assign(st, ct->custom,
+ &chan_val);
+ if (ret)
+ return ret;
+ }
+
+ return __ltc2983_chan_assign_common(st, sensor, chan_val);
+}
+
static int ltc2983_thermistor_assign_chan(struct ltc2983_data *st,
const struct ltc2983_sensor *sensor)
{
@@ -601,6 +690,25 @@ static int ltc2983_thermistor_assign_chan(struct ltc2983_data *st,
return __ltc2983_chan_assign_common(st, sensor, chan_val);
}
+static int ltc2983_leak_detector_assign_chan(struct ltc2983_data *st,
+ const struct ltc2983_sensor *sensor)
+{
+ struct ltc2983_leak_detector *ld = to_leak_detector(sensor);
+ u32 chan_val;
+ int ret;
+
+ chan_val = LTC2983_CHAN_ASSIGN(ld->r_sense_chan);
+ /* bits 21:19 must be 0b001 (ADT7604 datasheet Table 38) */
+ chan_val |= LTC2983_THERMISTOR_CFG(1);
+ chan_val |= LTC2983_THERMISTOR_EXC_CURRENT(ld->excitation_current);
+
+ ret = __ltc2983_chan_custom_sensor_assign(st, ld->custom, &chan_val);
+ if (ret)
+ return ret;
+
+ return __ltc2983_chan_assign_common(st, sensor, chan_val);
+}
+
static int ltc2983_diode_assign_chan(struct ltc2983_data *st,
const struct ltc2983_sensor *sensor)
{
@@ -1036,6 +1144,195 @@ ltc2983_thermistor_new(const struct fwnode_handle *child, struct ltc2983_data *s
return &thermistor->sensor;
}
+static struct ltc2983_sensor *
+ltc2983_copper_trace_new(const struct fwnode_handle *child, struct ltc2983_data *st,
+ const struct ltc2983_sensor *sensor)
+{
+ struct device *dev = &st->spi->dev;
+ struct ltc2983_copper_trace *ct;
+ int ret;
+
+ if (sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
+ return dev_err_ptr_probe(dev, -EINVAL,
+ "Invalid channel %d for copper trace\n",
+ sensor->chan);
+
+ ct = devm_kzalloc(dev, sizeof(*ct), GFP_KERNEL);
+ if (!ct)
+ return ERR_PTR(-ENOMEM);
+
+ struct fwnode_handle *ref __free(fwnode_handle) =
+ fwnode_find_reference(child, "adi,rsense-handle", 0);
+ if (IS_ERR(ref))
+ return dev_err_cast_probe(dev, ref,
+ "Property adi,rsense-handle missing or invalid\n");
+
+ ret = fwnode_property_read_u32(ref, "reg", &ct->r_sense_chan);
+ if (ret)
+ return dev_err_ptr_probe(dev, ret, "Property reg must be given\n");
+
+ ct->is_sub_ohm = fwnode_property_read_bool(child, "adi,copper-trace-sub-ohm");
+
+ if (ct->is_sub_ohm && fwnode_property_present(child, "adi,custom-copper-trace"))
+ return dev_err_ptr_probe(dev, -EINVAL,
+ "sub-ohm copper trace cannot have a custom table\n");
+
+ if (!ct->is_sub_ohm) {
+ u32 excitation_current = 0;
+
+ if (!fwnode_property_present(child, "adi,custom-copper-trace"))
+ return dev_err_ptr_probe(dev, -EINVAL,
+ "adi,custom-copper-trace is required for >1 ohm copper trace\n");
+
+ ct->custom = __ltc2983_custom_sensor_new(st, child, "adi,custom-copper-trace",
+ false, 2048, false);
+ if (IS_ERR(ct->custom))
+ return ERR_CAST(ct->custom);
+
+ if (fwnode_property_present(child, "adi,excitation-current-microamp")) {
+ ret = fwnode_property_read_u32(child, "adi,excitation-current-microamp",
+ &excitation_current);
+ if (ret)
+ return dev_err_ptr_probe(dev, ret,
+ "Failed to read adi,excitation-current-microamp\n");
+
+ switch (excitation_current) {
+ case 5:
+ ct->excitation_current = 0x01;
+ break;
+ case 10:
+ ct->excitation_current = 0x02;
+ break;
+ case 25:
+ ct->excitation_current = 0x03;
+ break;
+ case 50:
+ ct->excitation_current = 0x04;
+ break;
+ case 100:
+ ct->excitation_current = 0x05;
+ break;
+ case 250:
+ ct->excitation_current = 0x06;
+ break;
+ case 500:
+ ct->excitation_current = 0x07;
+ break;
+ case 1000:
+ ct->excitation_current = 0x08;
+ break;
+ default:
+ return dev_err_ptr_probe(dev, -EINVAL,
+ "Invalid value for excitation current(%u)\n",
+ excitation_current);
+ }
+ } else {
+ /* default to 1mA per datasheet recommendation for copper trace */
+ ct->excitation_current = 0x08;
+ }
+ }
+
+ ct->sensor.fault_handler = ltc2983_common_fault_handler;
+ ct->sensor.assign_chan = ltc2983_copper_trace_assign_chan;
+ if (ct->is_sub_ohm)
+ ct->sensor.n_iio_chan = 1;
+ else
+ ct->sensor.n_iio_chan = 2;
+
+ return &ct->sensor;
+}
+
+static struct ltc2983_sensor *
+ltc2983_leak_detector_new(const struct fwnode_handle *child, struct ltc2983_data *st,
+ const struct ltc2983_sensor *sensor)
+{
+ struct device *dev = &st->spi->dev;
+ struct ltc2983_leak_detector *ld;
+ int ret;
+ u32 excitation_current = 0;
+
+ if (sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN)
+ return dev_err_ptr_probe(dev, -EINVAL,
+ "Invalid channel %d for leak detector\n",
+ sensor->chan);
+
+ ld = devm_kzalloc(dev, sizeof(*ld), GFP_KERNEL);
+ if (!ld)
+ return ERR_PTR(-ENOMEM);
+
+ struct fwnode_handle *ref __free(fwnode_handle) =
+ fwnode_find_reference(child, "adi,rsense-handle", 0);
+ if (IS_ERR(ref))
+ return dev_err_cast_probe(dev, ref,
+ "Property adi,rsense-handle missing or invalid\n");
+
+ ret = fwnode_property_read_u32(ref, "reg", &ld->r_sense_chan);
+ if (ret)
+ return dev_err_ptr_probe(dev, ret,
+ "rsense channel must be configured\n");
+
+ if (!fwnode_property_present(child, "adi,custom-leak-detector"))
+ return dev_err_ptr_probe(dev, -EINVAL,
+ "adi,custom-leak-detector is required for leak detectors\n");
+
+ ld->custom = __ltc2983_custom_sensor_new(st, child, "adi,custom-leak-detector",
+ false, 16, false);
+ if (IS_ERR(ld->custom))
+ return ERR_CAST(ld->custom);
+
+ ret = fwnode_property_read_u32(child, "adi,excitation-current-nanoamp",
+ &excitation_current);
+ if (ret)
+ return dev_err_ptr_probe(dev, ret,
+ "adi,excitation-current-nanoamp is required for leak detectors\n");
+
+ switch (excitation_current) {
+ case 250:
+ ld->excitation_current = 0x01;
+ break;
+ case 500:
+ ld->excitation_current = 0x02;
+ break;
+ case 1000:
+ ld->excitation_current = 0x03;
+ break;
+ case 5000:
+ ld->excitation_current = 0x04;
+ break;
+ case 10000:
+ ld->excitation_current = 0x05;
+ break;
+ case 25000:
+ ld->excitation_current = 0x06;
+ break;
+ case 50000:
+ ld->excitation_current = 0x07;
+ break;
+ case 100000:
+ ld->excitation_current = 0x08;
+ break;
+ case 250000:
+ ld->excitation_current = 0x09;
+ break;
+ case 500000:
+ ld->excitation_current = 0x0a;
+ break;
+ case 1000000:
+ ld->excitation_current = 0x0b;
+ break;
+ default:
+ return dev_err_ptr_probe(dev, -EINVAL,
+ "Invalid value for excitation current(%u)\n",
+ excitation_current);
+ }
+
+ ld->sensor.fault_handler = ltc2983_common_fault_handler;
+ ld->sensor.assign_chan = ltc2983_leak_detector_assign_chan;
+ ld->sensor.n_iio_chan = 2;
+
+ return &ld->sensor;
+}
+
static struct ltc2983_sensor *
ltc2983_diode_new(const struct fwnode_handle *child, const struct ltc2983_data *st,
const struct ltc2983_sensor *sensor)
@@ -1204,7 +1501,8 @@ static struct ltc2983_sensor *ltc2983_temp_new(struct fwnode_handle *child,
}
static int ltc2983_chan_read(struct ltc2983_data *st,
- const struct ltc2983_sensor *sensor, int *val)
+ const struct ltc2983_sensor *sensor,
+ u32 base_reg, int *val)
{
struct device *dev = &st->spi->dev;
u32 start_conversion = 0;
@@ -1234,13 +1532,23 @@ static int ltc2983_chan_read(struct ltc2983_data *st,
}
/* read the converted data */
- ret = regmap_bulk_read(st->regmap, LTC2983_RESULT_ADDR(sensor->chan),
+ ret = regmap_bulk_read(st->regmap, LTC2983_RESULT_ADDR(sensor->chan, base_reg),
&st->temp, sizeof(st->temp));
if (ret)
return ret;
*val = __be32_to_cpu(st->temp);
+ if (base_reg == ADT7604_RES_RES_START_REG) {
+ /*
+ * Resistance result register gives a plain unsigned value,
+ * D31 is always 0, no valid bit, no fault bits. Read bits[30:0]
+ * directly — the temperature result format does not apply here.
+ */
+ *val &= GENMASK(30, 0);
+ return 0;
+ }
+
if (!(LTC2983_RES_VALID_MASK & *val)) {
dev_err(dev, "Invalid conversion detected\n");
return -EIO;
@@ -1271,7 +1579,16 @@ static int ltc2983_read_raw(struct iio_dev *indio_dev,
switch (mask) {
case IIO_CHAN_INFO_RAW:
mutex_lock(&st->lock);
- ret = ltc2983_chan_read(st, st->sensors[chan->address], val);
+ switch (chan->type) {
+ case IIO_RESISTANCE:
+ ret = ltc2983_chan_read(st, st->sensors[chan->address],
+ ADT7604_RES_RES_START_REG, val);
+ break;
+ default:
+ ret = ltc2983_chan_read(st, st->sensors[chan->address],
+ LTC2983_TEMP_RES_START_REG, val);
+ break;
+ }
mutex_unlock(&st->lock);
return ret ?: IIO_VAL_INT;
case IIO_CHAN_INFO_SCALE:
@@ -1288,6 +1605,13 @@ static int ltc2983_read_raw(struct iio_dev *indio_dev,
/* 2^21 */
*val2 = 2097152;
return IIO_VAL_FRACTIONAL;
+ case IIO_RESISTANCE:
+ case IIO_COVERAGE:
+ /* value in ohm/percent */
+ *val = 1;
+ /* 2^10 */
+ *val2 = 1024;
+ return IIO_VAL_FRACTIONAL;
default:
return -EINVAL;
}
@@ -1348,7 +1672,7 @@ static int ltc2983_parse_fw(struct ltc2983_data *st)
if (!st->sensors)
return -ENOMEM;
- st->iio_channels = st->num_channels;
+ st->iio_channels = 0;
device_for_each_child_node_scoped(dev, child) {
struct ltc2983_sensor sensor;
@@ -1376,6 +1700,12 @@ static int ltc2983_parse_fw(struct ltc2983_data *st)
return dev_err_probe(dev, ret,
"adi,sensor-type property must given for child nodes\n");
+ if (sensor.type >= LTC2983_SENSOR_NUM ||
+ !(st->info->supported_sensors & BIT_ULL(sensor.type)))
+ return dev_err_probe(dev, -EINVAL,
+ "sensor type %d not supported on %s\n",
+ sensor.type, st->info->name);
+
dev_dbg(dev, "Create new sensor, type %u, channel %u",
sensor.type, sensor.chan);
@@ -1396,13 +1726,14 @@ static int ltc2983_parse_fw(struct ltc2983_data *st)
} else if (sensor.type == LTC2983_SENSOR_SENSE_RESISTOR) {
st->sensors[chan] = ltc2983_r_sense_new(child, st,
&sensor);
- /* don't add rsense to iio */
- st->iio_channels--;
} else if (sensor.type == LTC2983_SENSOR_DIRECT_ADC) {
st->sensors[chan] = ltc2983_adc_new(child, st, &sensor);
- } else if (st->info->has_temp &&
- sensor.type == LTC2983_SENSOR_ACTIVE_TEMP) {
+ } else if (sensor.type == LTC2983_SENSOR_ACTIVE_TEMP) {
st->sensors[chan] = ltc2983_temp_new(child, st, &sensor);
+ } else if (sensor.type == LTC2983_SENSOR_COPPER_TRACE) {
+ st->sensors[chan] = ltc2983_copper_trace_new(child, st, &sensor);
+ } else if (sensor.type == LTC2983_SENSOR_LEAK_DETECTOR) {
+ st->sensors[chan] = ltc2983_leak_detector_new(child, st, &sensor);
} else {
return dev_err_probe(dev, -EINVAL,
"Unknown sensor type %d\n",
@@ -1417,6 +1748,16 @@ static int ltc2983_parse_fw(struct ltc2983_data *st)
st->sensors[chan]->chan = sensor.chan;
st->sensors[chan]->type = sensor.type;
+ /*
+ * Dedicated functions set n_iio_chan themselves; for all other
+ * sensor types rsense produces 0 channels, everything else 1.
+ */
+ if (!st->sensors[chan]->n_iio_chan) {
+ if (sensor.type != LTC2983_SENSOR_SENSE_RESISTOR)
+ st->sensors[chan]->n_iio_chan = 1;
+ }
+ st->iio_channels += st->sensors[chan]->n_iio_chan;
+
channel_avail_mask |= BIT(sensor.chan);
chan++;
}
@@ -1464,8 +1805,9 @@ static int ltc2983_eeprom_cmd(struct ltc2983_data *st, unsigned int cmd,
static int ltc2983_setup(struct ltc2983_data *st, bool assign_iio)
{
- u32 iio_chan_t = 0, iio_chan_v = 0, chan, iio_idx = 0, status;
struct device *dev = &st->spi->dev;
+ u32 iio_chan_t = 0, iio_chan_v = 0, iio_chan_r = 0, iio_chan_c = 0;
+ u32 chan, iio_idx = 0, status;
int ret;
/* make sure the device is up: start bit (7) is 0 and done bit (6) is 1 */
@@ -1512,12 +1854,33 @@ static int ltc2983_setup(struct ltc2983_data *st, bool assign_iio)
continue;
/* assign iio channel */
- if (st->sensors[chan]->type != LTC2983_SENSOR_DIRECT_ADC) {
- chan_type = IIO_TEMP;
- iio_chan = &iio_chan_t;
- } else {
+ switch (st->sensors[chan]->type) {
+ case LTC2983_SENSOR_COPPER_TRACE:
+ if (st->sensors[chan]->n_iio_chan == 1) {
+ /* sub-ohm copper traces produce only a resistance result */
+ st->iio_chan[iio_idx++] =
+ LTC2983_CHAN(IIO_RESISTANCE, iio_chan_r++, chan);
+ } else {
+ st->iio_chan[iio_idx++] =
+ LTC2983_CHAN(IIO_TEMP, iio_chan_t++, chan);
+ st->iio_chan[iio_idx++] =
+ LTC2983_CHAN(IIO_RESISTANCE, iio_chan_r++, chan);
+ }
+ continue;
+ case LTC2983_SENSOR_LEAK_DETECTOR:
+ st->iio_chan[iio_idx++] =
+ LTC2983_CHAN(IIO_COVERAGE, iio_chan_c++, chan);
+ st->iio_chan[iio_idx++] =
+ LTC2983_CHAN(IIO_RESISTANCE, iio_chan_r++, chan);
+ continue;
+ case LTC2983_SENSOR_DIRECT_ADC:
chan_type = IIO_VOLTAGE;
iio_chan = &iio_chan_v;
+ break;
+ default:
+ chan_type = IIO_TEMP;
+ iio_chan = &iio_chan_t;
+ break;
}
/*
@@ -1534,6 +1897,7 @@ static int ltc2983_setup(struct ltc2983_data *st, bool assign_iio)
static const struct regmap_range ltc2983_reg_ranges[] = {
regmap_reg_range(LTC2983_STATUS_REG, LTC2983_STATUS_REG),
regmap_reg_range(LTC2983_TEMP_RES_START_REG, LTC2983_TEMP_RES_END_REG),
+ regmap_reg_range(ADT7604_RES_RES_START_REG, ADT7604_RES_RES_END_REG),
regmap_reg_range(LTC2983_EEPROM_KEY_REG, LTC2983_EEPROM_KEY_REG),
regmap_reg_range(LTC2983_EEPROM_READ_STATUS_REG,
LTC2983_EEPROM_READ_STATUS_REG),
@@ -1672,32 +2036,42 @@ static int ltc2983_suspend(struct device *dev)
static DEFINE_SIMPLE_DEV_PM_OPS(ltc2983_pm_ops, ltc2983_suspend,
ltc2983_resume);
+static const struct ltc2983_chip_info adt7604_chip_info_data = {
+ .name = "adt7604",
+ .max_channels_nr = 20,
+ .has_eeprom = true,
+ .supported_sensors = ADT7604_SENSORS,
+};
+
static const struct ltc2983_chip_info ltc2983_chip_info_data = {
.name = "ltc2983",
.max_channels_nr = 20,
+ .supported_sensors = LTC2983_COMMON_SENSORS,
};
static const struct ltc2983_chip_info ltc2984_chip_info_data = {
.name = "ltc2984",
.max_channels_nr = 20,
.has_eeprom = true,
+ .supported_sensors = LTC2983_COMMON_SENSORS,
};
static const struct ltc2983_chip_info ltc2986_chip_info_data = {
.name = "ltc2986",
.max_channels_nr = 10,
- .has_temp = true,
.has_eeprom = true,
+ .supported_sensors = LTC2983_COMMON_SENSORS | BIT_ULL(LTC2983_SENSOR_ACTIVE_TEMP),
};
static const struct ltc2983_chip_info ltm2985_chip_info_data = {
.name = "ltm2985",
.max_channels_nr = 10,
- .has_temp = true,
.has_eeprom = true,
+ .supported_sensors = LTC2983_COMMON_SENSORS | BIT_ULL(LTC2983_SENSOR_ACTIVE_TEMP),
};
static const struct spi_device_id ltc2983_id_table[] = {
+ { "adt7604", (kernel_ulong_t)&adt7604_chip_info_data },
{ "ltc2983", (kernel_ulong_t)<c2983_chip_info_data },
{ "ltc2984", (kernel_ulong_t)<c2984_chip_info_data },
{ "ltc2986", (kernel_ulong_t)<c2986_chip_info_data },
@@ -1707,6 +2081,7 @@ static const struct spi_device_id ltc2983_id_table[] = {
MODULE_DEVICE_TABLE(spi, ltc2983_id_table);
static const struct of_device_id ltc2983_of_match[] = {
+ { .compatible = "adi,adt7604", .data = &adt7604_chip_info_data },
{ .compatible = "adi,ltc2983", .data = <c2983_chip_info_data },
{ .compatible = "adi,ltc2984", .data = <c2984_chip_info_data },
{ .compatible = "adi,ltc2986", .data = <c2986_chip_info_data },
--
2.43.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* Re: [PATCH v4 8/9] dt-bindings: iio: temperature: Add ADT7604 support to adi,ltc2983
2026-05-25 16:39 ` [PATCH v4 8/9] dt-bindings: iio: temperature: Add ADT7604 support to adi,ltc2983 Liviu Stan
@ 2026-05-25 18:28 ` sashiko-bot
2026-05-26 16:55 ` Conor Dooley
1 sibling, 0 replies; 29+ messages in thread
From: sashiko-bot @ 2026-05-25 18:28 UTC (permalink / raw)
To: Liviu Stan; +Cc: devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] The `default: 1000` value on `adi,excitation-current-microamp` conflicts with its conditional `false` constraint, breaking schema validation for sub-ohm copper-trace nodes.
- [Medium] The device tree binding introduces artificial/virtual sensor types (32 and 33) instead of using the hardware's actual register values (18 and 27) for copper trace and leak detector sensors.
--
commit 6b6588f2ffbcb416f3ba3df38f643fdd0a5c9afa
Author: Liviu Stan <liviu.stan@analog.com>
dt-bindings: iio: temperature: Add ADT7604 support to adi,ltc2983
This commit adds support for the ADT7604 to the adi,ltc2983 binding. It
introduces new sensor node types for copper-trace and leak-detector sensors
which repurpose custom RTD and thermistor types on the hardware, and adds
validation constraints specific to the ADT7604.
> diff --git a/Documentation/devicetree/bindings/iio/temperature/adi,ltc2983.yaml b/Documentation/devicetree/bindings/iio/temperature/adi,ltc2983.yaml
> index a22725f7619b7..ab77f987ee02d 100644
> --- a/Documentation/devicetree/bindings/iio/temperature/adi,ltc2983.yaml
> +++ b/Documentation/devicetree/bindings/iio/temperature/adi,ltc2983.yaml
[ ... ]
> @@ -436,6 +441,121 @@ patternProperties:
> required:
> - adi,custom-temp
>
> + '^copper-trace@':
> + $ref: '#/$defs/sensor-node'
> + unevaluatedProperties: false
> + description: |
> + Copper trace resistance sensor (some parts only). Two variants exist:
> + sub-ohm (< 1 ohm, no custom table allowed) and standard (> 1 ohm,
> + required custom table).
> +
> + properties:
> + reg:
> + minimum: 2
> + maximum: 20
> +
> + adi,sensor-type:
> + description: Sensor type for copper trace sensors.
> + $ref: /schemas/types.yaml#/definitions/uint32
> + const: 32
[Severity: Medium]
Does defining a virtual sensor type (32) conflict with the device tree
principle of describing physical hardware rather than software abstractions?
As noted in the commit message, the hardware repurposes the custom RTD
register value (18) for this sensor. Should the binding use the real
hardware value (<18>) and rely on the node name to distinguish the
configuration instead of extending this property with software-defined values?
> +
> + adi,rsense-handle:
> + description: Associated sense resistor sensor.
> + $ref: /schemas/types.yaml#/definitions/phandle
> +
> + adi,copper-trace-sub-ohm:
> + description:
> + Select the sub-ohm (< 1 ohm) copper trace variant. Custom table
> + and excitation current are not allowed in this mode.
> + type: boolean
> +
> + adi,excitation-current-microamp:
> + description:
> + Excitation current applied to the copper trace. Not used in
> + sub-ohm mode. The datasheet recommends 1mA for copper trace
> + sensors due to their typically small resistance.
> + enum: [5, 10, 25, 50, 100, 250, 500, 1000]
> + default: 1000
> +
> + adi,custom-copper-trace:
> + description:
> + Resistance-to-temperature table for copper trace sensors with
> + resistance > 1 ohm. Required when adi,copper-trace-sub-ohm is not
> + set. See Page 36 of the datasheet.
> + $ref: /schemas/types.yaml#/definitions/uint64-matrix
> + minItems: 3
> + maxItems: 64
> + items:
> + items:
> + - description: Resistance point in uOhms.
> + - description: Temperature point in uK.
> +
> + required:
> + - adi,rsense-handle
> +
> + allOf:
> + - if:
> + required:
> + - adi,copper-trace-sub-ohm
> + then:
> + properties:
> + adi,custom-copper-trace: false
> + adi,excitation-current-microamp: false
[Severity: High]
Will the default value defined above break schema validation for sub-ohm
copper-trace nodes?
dt-schema injects default values for missing properties before evaluating
conditionals. If a sub-ohm node correctly omits the
adi,excitation-current-microamp property, the value 1000 will be injected
automatically. This injected property would then trigger a validation failure
against the false constraint here.
> + - if:
> + not:
> + required:
> + - adi,copper-trace-sub-ohm
> + then:
> + required:
> + - adi,custom-copper-trace
> +
> + '^leak-detector@':
> + $ref: '#/$defs/sensor-node'
> + unevaluatedProperties: false
> + description: |
> + Leak detector sensor (some parts only). Outputs resistance in ohms and
> + a coverage percentage via IIO_COVERAGE (raw/1024 = coverage %).
> +
> + properties:
> + reg:
> + minimum: 2
> + maximum: 20
> +
> + adi,sensor-type:
> + description: Sensor type for leak detector sensors.
> + $ref: /schemas/types.yaml#/definitions/uint32
> + const: 33
[Severity: Medium]
Similarly to the copper trace sensor, could this be using the actual hardware
register value (<27>) instead of the software-defined value 33?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260525164013.118614-1-liviu.stan@analog.com?part=8
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 9/9] iio: temperature: ltc2983: Add support for ADT7604
2026-05-25 16:39 ` [PATCH v4 9/9] iio: temperature: ltc2983: Add support for ADT7604 Liviu Stan
@ 2026-05-25 19:06 ` sashiko-bot
2026-05-26 8:47 ` Liviu Stan
1 sibling, 0 replies; 29+ messages in thread
From: sashiko-bot @ 2026-05-25 19:06 UTC (permalink / raw)
To: Liviu Stan; +Cc: devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [High] Integer truncation of `num_channels` leads to an out-of-bounds write on the heap when parsing device tree children.
--
commit 482bc8c51e04185002511817885173bd265542d8
Author: Liviu Stan <liviu.stan@analog.com>
iio: temperature: ltc2983: Add support for ADT7604
This commit adds support for the ADT7604 sensor, repurposing custom RTD
and thermistor sensor types as copper trace and leak detectors. It
introduces new structs, parser functions, and hardware register mappings
to handle these new types.
> diff --git a/drivers/iio/temperature/ltc2983.c b/drivers/iio/temperature/ltc2983.c
> index 130ab7fddc2fe..fc65d8352d120 100644
> --- a/drivers/iio/temperature/ltc2983.c
> +++ b/drivers/iio/temperature/ltc2983.c
[ ... ]
> @@ -1348,7 +1672,7 @@ static int ltc2983_parse_fw(struct ltc2983_data *st)
> if (!st->sensors)
> return -ENOMEM;
>
> - st->iio_channels = st->num_channels;
> + st->iio_channels = 0;
[Severity: High]
This is a pre-existing issue, but does st->num_channels silently truncate
the number of child nodes since it is defined as a u8?
If a device tree is provided with 256 or more child nodes (e.g., 257
nodes via DT overlays), device_get_child_node_count() returns 257, but
st->num_channels truncates this to 1. This causes devm_kcalloc() to
allocate only a 1-element array for st->sensors.
The device_for_each_child_node_scoped() loop directly following this will
then iterate over the children and write into st->sensors[chan], resulting
in out-of-bounds writes on the heap. Could num_channels be changed to an
unsigned int to prevent this memory corruption?
> device_for_each_child_node_scoped(dev, child) {
> struct ltc2983_sensor sensor;
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260525164013.118614-1-liviu.stan@analog.com?part=9
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 9/9] iio: temperature: ltc2983: Add support for ADT7604
2026-05-25 16:39 ` [PATCH v4 9/9] iio: temperature: ltc2983: Add support for ADT7604 Liviu Stan
2026-05-25 19:06 ` sashiko-bot
@ 2026-05-26 8:47 ` Liviu Stan
2026-05-27 16:49 ` Jonathan Cameron
1 sibling, 1 reply; 29+ messages in thread
From: Liviu Stan @ 2026-05-26 8:47 UTC (permalink / raw)
To: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Francesco Lavra, Liviu Stan, linux-iio,
linux-kernel, linux, devicetree
On Mon, 25 May 2026 19:06:14 +0000 sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
>
> Pre-existing issues:
> - [High] Integer truncation of `num_channels` leads to an out-of-bounds write on the heap when parsing device tree children.
> --
>
> commit 482bc8c51e04185002511817885173bd265542d8
> Author: Liviu Stan <liviu.stan@analog.com>
>
> iio: temperature: ltc2983: Add support for ADT7604
>
> This commit adds support for the ADT7604 sensor, repurposing custom RTD
> and thermistor sensor types as copper trace and leak detectors. It
> introduces new structs, parser functions, and hardware register mappings
> to handle these new types.
>
> > diff --git a/drivers/iio/temperature/ltc2983.c b/drivers/iio/temperature/ltc2983.c
> > index 130ab7fddc2fe..fc65d8352d120 100644
> > --- a/drivers/iio/temperature/ltc2983.c
> > +++ b/drivers/iio/temperature/ltc2983.c
>
> [ ... ]
>
> > @@ -1348,7 +1672,7 @@ static int ltc2983_parse_fw(struct ltc2983_data *st)
> > if (!st->sensors)
> > return -ENOMEM;
> >
> > - st->iio_channels = st->num_channels;
> > + st->iio_channels = 0;
>
> [Severity: High]
> This is a pre-existing issue, but does st->num_channels silently truncate
> the number of child nodes since it is defined as a u8?
>
> If a device tree is provided with 256 or more child nodes (e.g., 257
> nodes via DT overlays), device_get_child_node_count() returns 257, but
> st->num_channels truncates this to 1. This causes devm_kcalloc() to
> allocate only a 1-element array for st->sensors.
>
> The device_for_each_child_node_scoped() loop directly following this will
> then iterate over the children and write into st->sensors[chan], resulting
> in out-of-bounds writes on the heap. Could num_channels be changed to an
> unsigned int to prevent this memory corruption?
>
> > device_for_each_child_node_scoped(dev, child) {
> > struct ltc2983_sensor sensor;
>
> --
> Sashiko AI review · https://sashiko.dev/#/patchset/20260525164013.118614-1-liviu.stan@analog.com?part=9
>
The hardware has 20 channels maximum, so num_channels as u8 can never overflow in practice.
Thanks,
Liviu
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 8/9] dt-bindings: iio: temperature: Add ADT7604 support to adi,ltc2983
2026-05-25 16:39 ` [PATCH v4 8/9] dt-bindings: iio: temperature: Add ADT7604 support to adi,ltc2983 Liviu Stan
2026-05-25 18:28 ` sashiko-bot
@ 2026-05-26 16:55 ` Conor Dooley
2026-05-27 15:59 ` Liviu Stan
2026-05-27 16:51 ` Jonathan Cameron
1 sibling, 2 replies; 29+ messages in thread
From: Conor Dooley @ 2026-05-26 16:55 UTC (permalink / raw)
To: Liviu Stan
Cc: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Francesco Lavra, linux-iio, linux-kernel, linux,
devicetree
[-- Attachment #1: Type: text/plain, Size: 2981 bytes --]
On Mon, May 25, 2026 at 07:39:35PM +0300, Liviu Stan wrote:
> The ADT7604 shares the same die as the LTC2984. It repurposes the
> custom RTD sensor type (18) as a copper trace resistance sensor
> and the custom thermistor type (27) as a leak detector, and
> removes thermocouple, diode and direct ADC sensor types.
>
> Add adi,adt7604 to the compatible list and introduce two new
> sensor node types specific to this device:
>
> - copper-trace@: maps to the custom RTD sensor type (18). Two
> variants: sub-ohm (< 1 ohm, adi,copper-trace-sub-ohm boolean,
> no custom table and excitation current) and standard (> 1 ohm,
> required adi,custom-copper-trace table, optional excitation current
> defaulting to the datasheet recommended value). Primary output
> is resistance in ohms. For > 1 ohm copper traces with a custom table,
> the chip also outputs temperature in millidegrees Celsius.
>
> - leak-detector@: maps to the custom thermistor sensor type (27).
> Takes a required adi,custom-leak-detector lookup table encoding
> resistance (uOhm) against coverage data (%). Two outputs:
> resistance in ohms and coverage in percent.
>
> Separate node types are used rather than extending the existing
> rtd@ and thermistor@ nodes because adi,custom-rtd is required
> for sensor type 18, and several properties (adi,number-of-wires,
> adi,rtd-curve, adi,rsense-share, adi,single-ended,
> adi,current-rotate) have no meaning for the new sensor types, since
> the configuration is hardcoded, and would need to be explicitly
> forbidden or ignored in the driver.
>
> allOf conditions are added to restrict thermocouple, diode, direct
> ADC and active temperature nodes to non-ADT7604 devices, and to
> restrict copper-trace and leak-detector nodes to the ADT7604
> (some parts only).
>
> Signed-off-by: Liviu Stan <liviu.stan@analog.com>
If this approach is acceptable to Jonathan, it is acceptable to me.
Acked-by: Conor Dooley <conor.dooley@microchip.com>
pw-bot: not-applicable
> + leak-detector@14 {
> + reg = <14>;
> + adi,sensor-type = <33>;
> + adi,rsense-handle = <&r_sense>;
> + adi,excitation-current-nanoamp = <10000>;
> + adi,custom-leak-detector =
> + /bits/ 64 < 0 100>,
> + /bits/ 64 < 202020000 99>,
> + /bits/ 64 < 285710000 70>,
> + /bits/ 64 < 333330000 60>,
> + /bits/ 64 < 400000000 50>,
> + /bits/ 64 < 500000000 40>,
> + /bits/ 64 < 666670000 30>,
> + /bits/ 64 < 1000000000 20>,
> + /bits/ 64 < 2000000000 10>,
> + /bits/ 64 <1000000000000 0>;
My OCD hates that you have gone to some effort with alignment here, only
for this last line's first cell to scupper it completely.
> + };
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 8/9] dt-bindings: iio: temperature: Add ADT7604 support to adi,ltc2983
2026-05-26 16:55 ` Conor Dooley
@ 2026-05-27 15:59 ` Liviu Stan
2026-05-27 16:51 ` Jonathan Cameron
1 sibling, 0 replies; 29+ messages in thread
From: Liviu Stan @ 2026-05-27 15:59 UTC (permalink / raw)
To: Conor Dooley
Cc: Liviu Stan, Jonathan Cameron, David Lechner, Nuno Sá,
Andy Shevchenko, Michael Hennerich, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Antoniu Miclaus,
Francesco Lavra, linux-iio, linux-kernel, linux, devicetree
On Tue, 26 May 2026 17:55:49 +0100 Conor Dooley <conor@kernel.org> wrote:
> On Mon, May 25, 2026 at 07:39:35PM +0300, Liviu Stan wrote:
> > The ADT7604 shares the same die as the LTC2984. It repurposes the
> > custom RTD sensor type (18) as a copper trace resistance sensor
> > and the custom thermistor type (27) as a leak detector, and
> > removes thermocouple, diode and direct ADC sensor types.
> >
> > Add adi,adt7604 to the compatible list and introduce two new
> > sensor node types specific to this device:
> >
> > - copper-trace@: maps to the custom RTD sensor type (18). Two
> > variants: sub-ohm (< 1 ohm, adi,copper-trace-sub-ohm boolean,
> > no custom table and excitation current) and standard (> 1 ohm,
> > required adi,custom-copper-trace table, optional excitation current
> > defaulting to the datasheet recommended value). Primary output
> > is resistance in ohms. For > 1 ohm copper traces with a custom table,
> > the chip also outputs temperature in millidegrees Celsius.
> >
> > - leak-detector@: maps to the custom thermistor sensor type (27).
> > Takes a required adi,custom-leak-detector lookup table encoding
> > resistance (uOhm) against coverage data (%). Two outputs:
> > resistance in ohms and coverage in percent.
> >
> > Separate node types are used rather than extending the existing
> > rtd@ and thermistor@ nodes because adi,custom-rtd is required
> > for sensor type 18, and several properties (adi,number-of-wires,
> > adi,rtd-curve, adi,rsense-share, adi,single-ended,
> > adi,current-rotate) have no meaning for the new sensor types, since
> > the configuration is hardcoded, and would need to be explicitly
> > forbidden or ignored in the driver.
> >
> > allOf conditions are added to restrict thermocouple, diode, direct
> > ADC and active temperature nodes to non-ADT7604 devices, and to
> > restrict copper-trace and leak-detector nodes to the ADT7604
> > (some parts only).
> >
> > Signed-off-by: Liviu Stan <liviu.stan@analog.com>
>
> If this approach is acceptable to Jonathan, it is acceptable to me.
> Acked-by: Conor Dooley <conor.dooley@microchip.com>
> pw-bot: not-applicable
>
Thank you!
> > + leak-detector@14 {
> > + reg = <14>;
> > + adi,sensor-type = <33>;
> > + adi,rsense-handle = <&r_sense>;
> > + adi,excitation-current-nanoamp = <10000>;
> > + adi,custom-leak-detector =
> > + /bits/ 64 < 0 100>,
> > + /bits/ 64 < 202020000 99>,
> > + /bits/ 64 < 285710000 70>,
> > + /bits/ 64 < 333330000 60>,
> > + /bits/ 64 < 400000000 50>,
> > + /bits/ 64 < 500000000 40>,
> > + /bits/ 64 < 666670000 30>,
> > + /bits/ 64 < 1000000000 20>,
> > + /bits/ 64 < 2000000000 10>,
> > + /bits/ 64 <1000000000000 0>;
>
> My OCD hates that you have gone to some effort with alignment here, only
> for this last line's first cell to scupper it completely.
>
Sorry for this, I can fix it if necessary.
Thanks,
Liviu
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 1/9] iio: temperature: ltc2983: Fix n_wires default bypassing rotation check
2026-05-25 16:39 ` [PATCH v4 1/9] iio: temperature: ltc2983: Fix n_wires default bypassing rotation check Liviu Stan
@ 2026-05-27 16:11 ` Jonathan Cameron
0 siblings, 0 replies; 29+ messages in thread
From: Jonathan Cameron @ 2026-05-27 16:11 UTC (permalink / raw)
To: Liviu Stan
Cc: David Lechner, Nuno Sá, Andy Shevchenko, Michael Hennerich,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Antoniu Miclaus,
Francesco Lavra, linux-iio, linux-kernel, linux, devicetree
On Mon, 25 May 2026 19:39:28 +0300
Liviu Stan <liviu.stan@analog.com> wrote:
> When adi,number-of-wires is absent, n_wires is left at 0. The binding
> documents a default of 2 wires, matching the hardware default. However
> the current-rotate validation checks n_wires == 2 || n_wires == 3, so
> with n_wires = 0 the guard is bypassed and adi,current-rotate is accepted
> for a 2-wire RTD.
>
> Initialize n_wires = 2 to match the binding default and ensure the
> rotation check fires correctly when the property is absent.
>
> Fixes: f110f3188e56 ("iio: temperature: Add support for LTC2983")
> Signed-off-by: Liviu Stan <liviu.stan@analog.com>
Applied and marked for stable. I vaguely wondered if the stable
marking was worthwhile given this is a driver validating dt failure
so shouldn't happen with valid dt. Ah well, it's simple and obviously
correct so I'll mark it, but will take it via the slow path so we don't
stop the rest of the series moving forwards.
Hence applied to the testing branch of iio.git.
Thanks,
Jonathan
> ---
> Changes in v4:
> - Moved to the front of the series
>
> drivers/iio/temperature/ltc2983.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/iio/temperature/ltc2983.c b/drivers/iio/temperature/ltc2983.c
> index 38e6f8dfd3b8..1f835e326b93 100644
> --- a/drivers/iio/temperature/ltc2983.c
> +++ b/drivers/iio/temperature/ltc2983.c
> @@ -741,7 +741,7 @@ ltc2983_rtd_new(const struct fwnode_handle *child, struct ltc2983_data *st,
> struct ltc2983_rtd *rtd;
> int ret = 0;
> struct device *dev = &st->spi->dev;
> - u32 excitation_current = 0, n_wires = 0;
> + u32 excitation_current = 0, n_wires = 2;
>
> rtd = devm_kzalloc(dev, sizeof(*rtd), GFP_KERNEL);
> if (!rtd)
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 2/9] iio: temperature: ltc2983: Fix reinit_completion() called after conversion start
2026-05-25 16:39 ` [PATCH v4 2/9] iio: temperature: ltc2983: Fix reinit_completion() called after conversion start Liviu Stan
@ 2026-05-27 16:13 ` Jonathan Cameron
0 siblings, 0 replies; 29+ messages in thread
From: Jonathan Cameron @ 2026-05-27 16:13 UTC (permalink / raw)
To: Liviu Stan
Cc: David Lechner, Nuno Sá, Andy Shevchenko, Michael Hennerich,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Antoniu Miclaus,
Francesco Lavra, linux-iio, linux-kernel, linux, devicetree
On Mon, 25 May 2026 19:39:29 +0300
Liviu Stan <liviu.stan@analog.com> wrote:
> reinit_completion() was called after regmap_write() initiated the hardware
> conversion, creating a race window where the interrupt could fire and call
> complete() before reinit_completion() reset the completion.
>
> Move reinit_completion() before the regmap_write() to close the race.
> ltc2983_eeprom_cmd() already does it in the correct order.
>
> Fixes: f110f3188e56 ("iio: temperature: Add support for LTC2983")
> Signed-off-by: Liviu Stan <liviu.stan@analog.com>
Applied the slow way (to the testing branch of iio.git) but marked for stable.
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 3/9] iio: temperature: ltc2983: Fix macro parenthesization and rename
2026-05-25 16:39 ` [PATCH v4 3/9] iio: temperature: ltc2983: Fix macro parenthesization and rename Liviu Stan
@ 2026-05-27 16:13 ` Jonathan Cameron
0 siblings, 0 replies; 29+ messages in thread
From: Jonathan Cameron @ 2026-05-27 16:13 UTC (permalink / raw)
To: Liviu Stan
Cc: David Lechner, Nuno Sá, Andy Shevchenko, Michael Hennerich,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Antoniu Miclaus,
Francesco Lavra, linux-iio, linux-kernel, linux, devicetree,
Joshua Crofts
On Mon, 25 May 2026 19:39:30 +0300
Liviu Stan <liviu.stan@analog.com> wrote:
> Wrap the 'chan' parameter in LTC2983_CHAN_START_ADDR() and
> LTC2983_CHAN_RES_ADDR() with parentheses to prevent potential
> macro argument expansion issues. Also rename LTC2983_CHAN_START_ADDR
> to LTC2983_CHAN_ASSIGN_ADDR and LTC2983_CHAN_RES_ADDR to
> LTC2983_RESULT_ADDR, to better reflect the datasheet names and avoid
> them being confused as related.
>
> Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
> Signed-off-by: Liviu Stan <liviu.stan@analog.com>
Applied.
Thanks,
J
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 4/9] iio: temperature: ltc2983: Use local device pointer consistently
2026-05-25 16:39 ` [PATCH v4 4/9] iio: temperature: ltc2983: Use local device pointer consistently Liviu Stan
@ 2026-05-27 16:18 ` Jonathan Cameron
2026-06-02 23:25 ` Andy Shevchenko
0 siblings, 1 reply; 29+ messages in thread
From: Jonathan Cameron @ 2026-05-27 16:18 UTC (permalink / raw)
To: Liviu Stan
Cc: David Lechner, Nuno Sá, Andy Shevchenko, Michael Hennerich,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Antoniu Miclaus,
Francesco Lavra, linux-iio, linux-kernel, linux, devicetree,
Joshua Crofts
On Mon, 25 May 2026 19:39:31 +0300
Liviu Stan <liviu.stan@analog.com> wrote:
> Some functions define a local 'dev' pointer but still use bare
> '&st->spi->dev' in some code paths, and some don't have it at all.
> Replace bare references with the local pointer for consistency and
> collapse some wrapped lines that now fit within 80 characters.
>
> Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
> Signed-off-by: Liviu Stan <liviu.stan@analog.com>
Applied to the testing branch of iio.git.
Thanks,
Jonathan
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 5/9] iio: temperature: ltc2983: Fix inconsistent channel wording in messages
2026-05-25 16:39 ` [PATCH v4 5/9] iio: temperature: ltc2983: Fix inconsistent channel wording in messages Liviu Stan
@ 2026-05-27 16:19 ` Jonathan Cameron
0 siblings, 0 replies; 29+ messages in thread
From: Jonathan Cameron @ 2026-05-27 16:19 UTC (permalink / raw)
To: Liviu Stan
Cc: David Lechner, Nuno Sá, Andy Shevchenko, Michael Hennerich,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Antoniu Miclaus,
Francesco Lavra, linux-iio, linux-kernel, linux, devicetree,
Joshua Crofts
On Mon, 25 May 2026 19:39:32 +0300
Liviu Stan <liviu.stan@analog.com> wrote:
> Replace occurrences of the abbreviated 'chann' and 'chan' with
> 'channel' in error and debug messages throughout the driver.
> Also changed the diode invalid channel error message from
> "thermistor" to "diode".
>
> Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
> Signed-off-by: Liviu Stan <liviu.stan@analog.com>
Applied,
Thanks,
Jonathan
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 6/9] iio: temperature: ltc2983: Use fwnode_property_present() for optional properties
2026-05-25 16:39 ` [PATCH v4 6/9] iio: temperature: ltc2983: Use fwnode_property_present() for optional properties Liviu Stan
@ 2026-05-27 16:19 ` Jonathan Cameron
2026-06-02 23:26 ` Andy Shevchenko
0 siblings, 1 reply; 29+ messages in thread
From: Jonathan Cameron @ 2026-05-27 16:19 UTC (permalink / raw)
To: Liviu Stan
Cc: David Lechner, Nuno Sá, Andy Shevchenko, Michael Hennerich,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Antoniu Miclaus,
Francesco Lavra, linux-iio, linux-kernel, linux, devicetree
On Mon, 25 May 2026 19:39:33 +0300
Liviu Stan <liviu.stan@analog.com> wrote:
> Checking fwnode_property_read_u32() return value with if (!ret)
> silently swallows meaningful error codes when a property is present
> but malformed. Use fwnode_property_present() first so that absence
> uses the default while a present but unreadable property returns
> a proper error.
>
> Signed-off-by: Liviu Stan <liviu.stan@analog.com>
Applied,
Thanks,
Jonathan
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 9/9] iio: temperature: ltc2983: Add support for ADT7604
2026-05-26 8:47 ` Liviu Stan
@ 2026-05-27 16:49 ` Jonathan Cameron
2026-06-02 6:38 ` Liviu Stan
0 siblings, 1 reply; 29+ messages in thread
From: Jonathan Cameron @ 2026-05-27 16:49 UTC (permalink / raw)
To: Liviu Stan
Cc: David Lechner, Nuno Sá, Andy Shevchenko, Michael Hennerich,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Antoniu Miclaus,
Francesco Lavra, linux-iio, linux-kernel, linux, devicetree
On Tue, 26 May 2026 11:47:01 +0300
Liviu Stan <liviu.stan@analog.com> wrote:
> On Mon, 25 May 2026 19:06:14 +0000 sashiko-bot@kernel.org wrote:
>
> > Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> >
> > Pre-existing issues:
> > - [High] Integer truncation of `num_channels` leads to an out-of-bounds write on the heap when parsing device tree children.
> > --
> >
> > commit 482bc8c51e04185002511817885173bd265542d8
> > Author: Liviu Stan <liviu.stan@analog.com>
> >
> > iio: temperature: ltc2983: Add support for ADT7604
> >
> > This commit adds support for the ADT7604 sensor, repurposing custom RTD
> > and thermistor sensor types as copper trace and leak detectors. It
> > introduces new structs, parser functions, and hardware register mappings
> > to handle these new types.
> >
> > > diff --git a/drivers/iio/temperature/ltc2983.c b/drivers/iio/temperature/ltc2983.c
> > > index 130ab7fddc2fe..fc65d8352d120 100644
> > > --- a/drivers/iio/temperature/ltc2983.c
> > > +++ b/drivers/iio/temperature/ltc2983.c
> >
> > [ ... ]
> >
> > > @@ -1348,7 +1672,7 @@ static int ltc2983_parse_fw(struct ltc2983_data *st)
> > > if (!st->sensors)
> > > return -ENOMEM;
> > >
> > > - st->iio_channels = st->num_channels;
> > > + st->iio_channels = 0;
> >
> > [Severity: High]
> > This is a pre-existing issue, but does st->num_channels silently truncate
> > the number of child nodes since it is defined as a u8?
> >
> > If a device tree is provided with 256 or more child nodes (e.g., 257
> > nodes via DT overlays), device_get_child_node_count() returns 257, but
> > st->num_channels truncates this to 1. This causes devm_kcalloc() to
> > allocate only a 1-element array for st->sensors.
> >
> > The device_for_each_child_node_scoped() loop directly following this will
> > then iterate over the children and write into st->sensors[chan], resulting
> > in out-of-bounds writes on the heap. Could num_channels be changed to an
> > unsigned int to prevent this memory corruption?
> >
> > > device_for_each_child_node_scoped(dev, child) {
> > > struct ltc2983_sensor sensor;
> >
> > --
> > Sashiko AI review · https://sashiko.dev/#/patchset/20260525164013.118614-1-liviu.stan@analog.com?part=9
> >
>
> The hardware has 20 channels maximum, so num_channels as u8 can never overflow in practice.
>
All looks good to me so applied to the testing branch of iio.git.
Thanks,
Jonathan
> Thanks,
> Liviu
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 8/9] dt-bindings: iio: temperature: Add ADT7604 support to adi,ltc2983
2026-05-26 16:55 ` Conor Dooley
2026-05-27 15:59 ` Liviu Stan
@ 2026-05-27 16:51 ` Jonathan Cameron
1 sibling, 0 replies; 29+ messages in thread
From: Jonathan Cameron @ 2026-05-27 16:51 UTC (permalink / raw)
To: Conor Dooley
Cc: Liviu Stan, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Francesco Lavra, linux-iio, linux-kernel, linux,
devicetree
On Tue, 26 May 2026 17:55:49 +0100
Conor Dooley <conor@kernel.org> wrote:
> On Mon, May 25, 2026 at 07:39:35PM +0300, Liviu Stan wrote:
> > The ADT7604 shares the same die as the LTC2984. It repurposes the
> > custom RTD sensor type (18) as a copper trace resistance sensor
> > and the custom thermistor type (27) as a leak detector, and
> > removes thermocouple, diode and direct ADC sensor types.
> >
> > Add adi,adt7604 to the compatible list and introduce two new
> > sensor node types specific to this device:
> >
> > - copper-trace@: maps to the custom RTD sensor type (18). Two
> > variants: sub-ohm (< 1 ohm, adi,copper-trace-sub-ohm boolean,
> > no custom table and excitation current) and standard (> 1 ohm,
> > required adi,custom-copper-trace table, optional excitation current
> > defaulting to the datasheet recommended value). Primary output
> > is resistance in ohms. For > 1 ohm copper traces with a custom table,
> > the chip also outputs temperature in millidegrees Celsius.
> >
> > - leak-detector@: maps to the custom thermistor sensor type (27).
> > Takes a required adi,custom-leak-detector lookup table encoding
> > resistance (uOhm) against coverage data (%). Two outputs:
> > resistance in ohms and coverage in percent.
> >
> > Separate node types are used rather than extending the existing
> > rtd@ and thermistor@ nodes because adi,custom-rtd is required
> > for sensor type 18, and several properties (adi,number-of-wires,
> > adi,rtd-curve, adi,rsense-share, adi,single-ended,
> > adi,current-rotate) have no meaning for the new sensor types, since
> > the configuration is hardcoded, and would need to be explicitly
> > forbidden or ignored in the driver.
> >
> > allOf conditions are added to restrict thermocouple, diode, direct
> > ADC and active temperature nodes to non-ADT7604 devices, and to
> > restrict copper-trace and leak-detector nodes to the ADT7604
> > (some parts only).
> >
> > Signed-off-by: Liviu Stan <liviu.stan@analog.com>
>
> If this approach is acceptable to Jonathan, it is acceptable to me.
> Acked-by: Conor Dooley <conor.dooley@microchip.com>
> pw-bot: not-applicable
>
> > + leak-detector@14 {
> > + reg = <14>;
> > + adi,sensor-type = <33>;
> > + adi,rsense-handle = <&r_sense>;
> > + adi,excitation-current-nanoamp = <10000>;
> > + adi,custom-leak-detector =
> > + /bits/ 64 < 0 100>,
> > + /bits/ 64 < 202020000 99>,
> > + /bits/ 64 < 285710000 70>,
> > + /bits/ 64 < 333330000 60>,
> > + /bits/ 64 < 400000000 50>,
> > + /bits/ 64 < 500000000 40>,
> > + /bits/ 64 < 666670000 30>,
> > + /bits/ 64 < 1000000000 20>,
> > + /bits/ 64 < 2000000000 10>,
> > + /bits/ 64 <1000000000000 0>;
>
> My OCD hates that you have gone to some effort with alignment here, only
> for this last line's first cell to scupper it completely.
Tweaked to:
diff --git a/Documentation/devicetree/bindings/iio/temperature/adi,ltc2983.yaml b/Documentation/devicetree/bindings/iio/temperature/adi,ltc2983.yaml
index ab77f987ee02..13e5f29f0588 100644
--- a/Documentation/devicetree/bindings/iio/temperature/adi,ltc2983.yaml
+++ b/Documentation/devicetree/bindings/iio/temperature/adi,ltc2983.yaml
@@ -744,16 +744,16 @@ examples:
adi,rsense-handle = <&r_sense>;
adi,excitation-current-nanoamp = <10000>;
adi,custom-leak-detector =
- /bits/ 64 < 0 100>,
- /bits/ 64 < 202020000 99>,
- /bits/ 64 < 285710000 70>,
- /bits/ 64 < 333330000 60>,
- /bits/ 64 < 400000000 50>,
- /bits/ 64 < 500000000 40>,
- /bits/ 64 < 666670000 30>,
- /bits/ 64 < 1000000000 20>,
- /bits/ 64 < 2000000000 10>,
- /bits/ 64 <1000000000000 0>;
+ /bits/ 64 < 0 100>,
+ /bits/ 64 < 202020000 99>,
+ /bits/ 64 < 285710000 70>,
+ /bits/ 64 < 333330000 60>,
+ /bits/ 64 < 400000000 50>,
+ /bits/ 64 < 500000000 40>,
+ /bits/ 64 < 666670000 30>,
+ /bits/ 64 < 1000000000 20>,
+ /bits/ 64 < 2000000000 10>,
+ /bits/ 64 <1000000000000 0>;
};
rtd@18 {
>
> > + };
^ permalink raw reply related [flat|nested] 29+ messages in thread
* Re: [PATCH v4 7/9] iio: core: Add IIO_COVERAGE channel type
2026-05-25 16:39 ` [PATCH v4 7/9] iio: core: Add IIO_COVERAGE channel type Liviu Stan
@ 2026-05-27 16:51 ` Jonathan Cameron
0 siblings, 0 replies; 29+ messages in thread
From: Jonathan Cameron @ 2026-05-27 16:51 UTC (permalink / raw)
To: Liviu Stan
Cc: David Lechner, Nuno Sá, Andy Shevchenko, Michael Hennerich,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Antoniu Miclaus,
Francesco Lavra, linux-iio, linux-kernel, linux, devicetree
On Mon, 25 May 2026 19:39:34 +0300
Liviu Stan <liviu.stan@analog.com> wrote:
> Add a new channel type for sensors that report fractional coverage as
> a percentage. The sysfs attribute is in_coverageY_raw; after applying
> in_coverageY_scale the value is in percent. The first user is the
> ADT7604 leak detector, where the value represents the portion of the
> sensing element that is wetted.
>
> Signed-off-by: Liviu Stan <liviu.stan@analog.com>
Applied to the testing branch of iio.git.
Thanks,
Jonathan
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 9/9] iio: temperature: ltc2983: Add support for ADT7604
2026-05-27 16:49 ` Jonathan Cameron
@ 2026-06-02 6:38 ` Liviu Stan
0 siblings, 0 replies; 29+ messages in thread
From: Liviu Stan @ 2026-06-02 6:38 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Liviu Stan, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Francesco Lavra, linux-iio, linux-kernel, linux,
devicetree
On Wed, 27 May 2026 17:49:31 +0100 Jonathan Cameron <jic23@kernel.org> wrote:
> On Tue, 26 May 2026 11:47:01 +0300
> Liviu Stan <liviu.stan@analog.com> wrote:
>
> > On Mon, 25 May 2026 19:06:14 +0000 sashiko-bot@kernel.org wrote:
> >
> > > Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> > >
> > > Pre-existing issues:
> > > - [High] Integer truncation of `num_channels` leads to an out-of-bounds write on the heap when parsing device tree children.
> > > --
> > >
> > > commit 482bc8c51e04185002511817885173bd265542d8
> > > Author: Liviu Stan <liviu.stan@analog.com>
> > >
> > > iio: temperature: ltc2983: Add support for ADT7604
> > >
> > > This commit adds support for the ADT7604 sensor, repurposing custom RTD
> > > and thermistor sensor types as copper trace and leak detectors. It
> > > introduces new structs, parser functions, and hardware register mappings
> > > to handle these new types.
> > >
> > > > diff --git a/drivers/iio/temperature/ltc2983.c b/drivers/iio/temperature/ltc2983.c
> > > > index 130ab7fddc2fe..fc65d8352d120 100644
> > > > --- a/drivers/iio/temperature/ltc2983.c
> > > > +++ b/drivers/iio/temperature/ltc2983.c
> > >
> > > [ ... ]
> > >
> > > > @@ -1348,7 +1672,7 @@ static int ltc2983_parse_fw(struct ltc2983_data *st)
> > > > if (!st->sensors)
> > > > return -ENOMEM;
> > > >
> > > > - st->iio_channels = st->num_channels;
> > > > + st->iio_channels = 0;
> > >
> > > [Severity: High]
> > > This is a pre-existing issue, but does st->num_channels silently truncate
> > > the number of child nodes since it is defined as a u8?
> > >
> > > If a device tree is provided with 256 or more child nodes (e.g., 257
> > > nodes via DT overlays), device_get_child_node_count() returns 257, but
> > > st->num_channels truncates this to 1. This causes devm_kcalloc() to
> > > allocate only a 1-element array for st->sensors.
> > >
> > > The device_for_each_child_node_scoped() loop directly following this will
> > > then iterate over the children and write into st->sensors[chan], resulting
> > > in out-of-bounds writes on the heap. Could num_channels be changed to an
> > > unsigned int to prevent this memory corruption?
> > >
> > > > device_for_each_child_node_scoped(dev, child) {
> > > > struct ltc2983_sensor sensor;
> > >
> > > --
> > > Sashiko AI review · https://sashiko.dev/#/patchset/20260525164013.118614-1-liviu.stan@analog.com?part=9
> > >
> >
> > The hardware has 20 channels maximum, so num_channels as u8 can never overflow in practice.
> >
> All looks good to me so applied to the testing branch of iio.git.
>
> Thanks,
>
> Jonathan
Thank you!
Liviu
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 4/9] iio: temperature: ltc2983: Use local device pointer consistently
2026-05-27 16:18 ` Jonathan Cameron
@ 2026-06-02 23:25 ` Andy Shevchenko
2026-06-03 14:08 ` Jonathan Cameron
0 siblings, 1 reply; 29+ messages in thread
From: Andy Shevchenko @ 2026-06-02 23:25 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Liviu Stan, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Francesco Lavra, linux-iio, linux-kernel, linux,
devicetree, Joshua Crofts
On Wed, May 27, 2026 at 05:18:20PM +0100, Jonathan Cameron wrote:
> On Mon, 25 May 2026 19:39:31 +0300
> Liviu Stan <liviu.stan@analog.com> wrote:
>
> > Some functions define a local 'dev' pointer but still use bare
> > '&st->spi->dev' in some code paths, and some don't have it at all.
> > Replace bare references with the local pointer for consistency and
> > collapse some wrapped lines that now fit within 80 characters.
> >
> > Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
> > Signed-off-by: Liviu Stan <liviu.stan@analog.com>
> Applied to the testing branch of iio.git.
As I said, this has to be split to three patches.
Can we drop it? Or is it late already?
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 6/9] iio: temperature: ltc2983: Use fwnode_property_present() for optional properties
2026-05-27 16:19 ` Jonathan Cameron
@ 2026-06-02 23:26 ` Andy Shevchenko
2026-06-03 14:01 ` Jonathan Cameron
0 siblings, 1 reply; 29+ messages in thread
From: Andy Shevchenko @ 2026-06-02 23:26 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Liviu Stan, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Francesco Lavra, linux-iio, linux-kernel, linux,
devicetree
On Wed, May 27, 2026 at 05:19:45PM +0100, Jonathan Cameron wrote:
> On Mon, 25 May 2026 19:39:33 +0300
> Liviu Stan <liviu.stan@analog.com> wrote:
>
> > Checking fwnode_property_read_u32() return value with if (!ret)
> > silently swallows meaningful error codes when a property is present
> > but malformed. Use fwnode_property_present() first so that absence
> > uses the default while a present but unreadable property returns
> > a proper error.
> >
> > Signed-off-by: Liviu Stan <liviu.stan@analog.com>
> Applied,
With const char *propname defined this all may be made much shorter.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 6/9] iio: temperature: ltc2983: Use fwnode_property_present() for optional properties
2026-06-02 23:26 ` Andy Shevchenko
@ 2026-06-03 14:01 ` Jonathan Cameron
0 siblings, 0 replies; 29+ messages in thread
From: Jonathan Cameron @ 2026-06-03 14:01 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Liviu Stan, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Francesco Lavra, linux-iio, linux-kernel, linux,
devicetree
On Wed, 3 Jun 2026 02:26:17 +0300
Andy Shevchenko <andriy.shevchenko@intel.com> wrote:
> On Wed, May 27, 2026 at 05:19:45PM +0100, Jonathan Cameron wrote:
> > On Mon, 25 May 2026 19:39:33 +0300
> > Liviu Stan <liviu.stan@analog.com> wrote:
> >
> > > Checking fwnode_property_read_u32() return value with if (!ret)
> > > silently swallows meaningful error codes when a property is present
> > > but malformed. Use fwnode_property_present() first so that absence
> > > uses the default while a present but unreadable property returns
> > > a proper error.
> > >
> > > Signed-off-by: Liviu Stan <liviu.stan@analog.com>
> > Applied,
>
> With const char *propname defined this all may be made much shorter.
True. Maybe an additional cleanup on top for next cycle?
>
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v4 4/9] iio: temperature: ltc2983: Use local device pointer consistently
2026-06-02 23:25 ` Andy Shevchenko
@ 2026-06-03 14:08 ` Jonathan Cameron
0 siblings, 0 replies; 29+ messages in thread
From: Jonathan Cameron @ 2026-06-03 14:08 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Liviu Stan, David Lechner, Nuno Sá, Andy Shevchenko,
Michael Hennerich, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Antoniu Miclaus, Francesco Lavra, linux-iio, linux-kernel, linux,
devicetree, Joshua Crofts
On Wed, 3 Jun 2026 02:25:32 +0300
Andy Shevchenko <andriy.shevchenko@intel.com> wrote:
> On Wed, May 27, 2026 at 05:18:20PM +0100, Jonathan Cameron wrote:
> > On Mon, 25 May 2026 19:39:31 +0300
> > Liviu Stan <liviu.stan@analog.com> wrote:
> >
> > > Some functions define a local 'dev' pointer but still use bare
> > > '&st->spi->dev' in some code paths, and some don't have it at all.
> > > Replace bare references with the local pointer for consistency and
> > > collapse some wrapped lines that now fit within 80 characters.
> > >
> > > Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
> > > Signed-off-by: Liviu Stan <liviu.stan@analog.com>
> > Applied to the testing branch of iio.git.
>
> As I said, this has to be split to three patches.
> Can we drop it? Or is it late already?
>
This only seems to be doing one of the 3 sets of things you suggest.
"
So, this has to be split to three:
- dropping dup message
- moving to devm_kcalloc() and at the same time define local dev in the probe
(and only in the probe without changing anything else)
- this patch
"
The argument for the ordering is small. The duplicate message line gets
modified then dropped - not ideal but not a big thing.
The devm_kcalloc() isn't in here.
Given where we are in the cycle I'm not keen to back this out to get
the ideal ordering of changes.
Jonathan
^ permalink raw reply [flat|nested] 29+ messages in thread
end of thread, other threads:[~2026-06-03 14:09 UTC | newest]
Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-25 16:39 [PATCH v4 0/9] iio: temperature: ltc2983: Add support for ADT7604 Liviu Stan
2026-05-25 16:39 ` [PATCH v4 1/9] iio: temperature: ltc2983: Fix n_wires default bypassing rotation check Liviu Stan
2026-05-27 16:11 ` Jonathan Cameron
2026-05-25 16:39 ` [PATCH v4 2/9] iio: temperature: ltc2983: Fix reinit_completion() called after conversion start Liviu Stan
2026-05-27 16:13 ` Jonathan Cameron
2026-05-25 16:39 ` [PATCH v4 3/9] iio: temperature: ltc2983: Fix macro parenthesization and rename Liviu Stan
2026-05-27 16:13 ` Jonathan Cameron
2026-05-25 16:39 ` [PATCH v4 4/9] iio: temperature: ltc2983: Use local device pointer consistently Liviu Stan
2026-05-27 16:18 ` Jonathan Cameron
2026-06-02 23:25 ` Andy Shevchenko
2026-06-03 14:08 ` Jonathan Cameron
2026-05-25 16:39 ` [PATCH v4 5/9] iio: temperature: ltc2983: Fix inconsistent channel wording in messages Liviu Stan
2026-05-27 16:19 ` Jonathan Cameron
2026-05-25 16:39 ` [PATCH v4 6/9] iio: temperature: ltc2983: Use fwnode_property_present() for optional properties Liviu Stan
2026-05-27 16:19 ` Jonathan Cameron
2026-06-02 23:26 ` Andy Shevchenko
2026-06-03 14:01 ` Jonathan Cameron
2026-05-25 16:39 ` [PATCH v4 7/9] iio: core: Add IIO_COVERAGE channel type Liviu Stan
2026-05-27 16:51 ` Jonathan Cameron
2026-05-25 16:39 ` [PATCH v4 8/9] dt-bindings: iio: temperature: Add ADT7604 support to adi,ltc2983 Liviu Stan
2026-05-25 18:28 ` sashiko-bot
2026-05-26 16:55 ` Conor Dooley
2026-05-27 15:59 ` Liviu Stan
2026-05-27 16:51 ` Jonathan Cameron
2026-05-25 16:39 ` [PATCH v4 9/9] iio: temperature: ltc2983: Add support for ADT7604 Liviu Stan
2026-05-25 19:06 ` sashiko-bot
2026-05-26 8:47 ` Liviu Stan
2026-05-27 16:49 ` Jonathan Cameron
2026-06-02 6:38 ` Liviu Stan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox