* [PATCH v4 01/16] dt-bindings: iio: adc: at91-sama5d2: document sama7d65
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
2026-07-27 12:26 ` [PATCH v4 02/16] iio: adc: at91-sama5d2_adc: use cleanup.h for NVMEM buffer Varshini Rajendran
` (14 subsequent siblings)
15 siblings, 0 replies; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
Cc: Krzysztof Kozlowski
Add dt-binding documentation for sama7d65 ADC.
sama7d65 requires an individual compatible to address the differences
from its predecessor sama7g5. The main difference is the temperature
calibration layout and its handling.
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
Documentation/devicetree/bindings/iio/adc/atmel,sama5d2-adc.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/iio/adc/atmel,sama5d2-adc.yaml b/Documentation/devicetree/bindings/iio/adc/atmel,sama5d2-adc.yaml
index 4817b840977a..e8a65fdcd018 100644
--- a/Documentation/devicetree/bindings/iio/adc/atmel,sama5d2-adc.yaml
+++ b/Documentation/devicetree/bindings/iio/adc/atmel,sama5d2-adc.yaml
@@ -15,6 +15,7 @@ properties:
- atmel,sama5d2-adc
- microchip,sam9x60-adc
- microchip,sama7g5-adc
+ - microchip,sama7d65-adc
reg:
maxItems: 1
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread* [PATCH v4 02/16] iio: adc: at91-sama5d2_adc: use cleanup.h for NVMEM buffer
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
2026-07-27 12:26 ` [PATCH v4 01/16] dt-bindings: iio: adc: at91-sama5d2: document sama7d65 Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
2026-07-27 12:36 ` sashiko-bot
2026-07-27 12:26 ` [PATCH v4 03/16] iio: adc: at91-sama5d2_adc: rework temp calibration layout handling Varshini Rajendran
` (13 subsequent siblings)
15 siblings, 1 reply; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
Cc: Andy Shevchenko
Use __free(kfree) and __free(nvmem_cell_put) cleanup helpers in
at91_adc_temp_sensor_init() to simplify error handling paths.
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
---
drivers/iio/adc/at91-sama5d2_adc.c | 33 +++++++++++++-----------------
1 file changed, 14 insertions(+), 19 deletions(-)
diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c
index e8a5285bb6d4..4a4a25f3c715 100644
--- a/drivers/iio/adc/at91-sama5d2_adc.c
+++ b/drivers/iio/adc/at91-sama5d2_adc.c
@@ -35,6 +35,8 @@
#include <dt-bindings/iio/adc/at91-sama5d2_adc.h>
+DEFINE_FREE(nvmem_cell_put, struct nvmem_cell *, if (_T) nvmem_cell_put(_T))
+
struct at91_adc_reg_layout {
/* Control Register */
u16 CR;
@@ -2249,33 +2251,28 @@ static int at91_adc_temp_sensor_init(struct at91_adc_state *st,
struct device *dev)
{
struct at91_adc_temp_sensor_clb *clb = &st->soc_info.temp_sensor_clb;
- struct nvmem_cell *temp_calib;
- u32 *buf;
size_t len;
- int ret = 0;
if (!st->soc_info.platform->temp_sensor)
return 0;
/* Get the calibration data from NVMEM. */
- temp_calib = nvmem_cell_get(dev, "temperature_calib");
+ struct nvmem_cell *temp_calib __free(nvmem_cell_put) =
+ nvmem_cell_get(dev, "temperature_calib");
if (IS_ERR(temp_calib)) {
- ret = PTR_ERR(temp_calib);
- if (ret != -ENOENT)
+ if (PTR_ERR(temp_calib) != -ENOENT)
dev_err(dev, "Failed to get temperature_calib cell!\n");
- return ret;
+ return PTR_ERR(temp_calib);
}
- buf = nvmem_cell_read(temp_calib, &len);
- nvmem_cell_put(temp_calib);
- if (IS_ERR(buf)) {
- dev_err(dev, "Failed to read calibration data!\n");
- return PTR_ERR(buf);
- }
- if (len < AT91_ADC_TS_CLB_IDX_MAX * 4) {
+ u32 *buf __free(kfree) = nvmem_cell_read(temp_calib, &len);
+ if (IS_ERR(buf))
+ return dev_err_probe(dev, PTR_ERR(buf),
+ "Failed to read calibration data!\n");
+
+ if (len < AT91_ADC_TS_CLB_IDX_MAX * sizeof(*buf)) {
dev_err(dev, "Invalid calibration data!\n");
- ret = -EINVAL;
- goto free_buf;
+ return -EINVAL;
}
/* Store calibration data for later use. */
@@ -2288,9 +2285,7 @@ static int at91_adc_temp_sensor_init(struct at91_adc_state *st,
*/
clb->p1 = clb->p1 * 1000;
-free_buf:
- kfree(buf);
- return ret;
+ return 0;
}
static int at91_adc_probe(struct platform_device *pdev)
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH v4 02/16] iio: adc: at91-sama5d2_adc: use cleanup.h for NVMEM buffer
2026-07-27 12:26 ` [PATCH v4 02/16] iio: adc: at91-sama5d2_adc: use cleanup.h for NVMEM buffer Varshini Rajendran
@ 2026-07-27 12:36 ` sashiko-bot
0 siblings, 0 replies; 27+ messages in thread
From: sashiko-bot @ 2026-07-27 12:36 UTC (permalink / raw)
To: Varshini Rajendran; +Cc: devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] The custom `DEFINE_FREE(nvmem_cell_put)` wrapper does not guard against `ERR_PTR` values, leading to a kernel panic when `nvmem_cell_get()` fails.
--
--- Patch [2]: [PATCH v4 02/16] iio: adc: at91-sama5d2_adc: use cleanup.h for NVMEM buffer ---
commit dbed20984526e19bec7734326990be3251fc20e1
Author: Varshini Rajendran <varshini.rajendran@microchip.com>
iio: adc: at91-sama5d2_adc: use cleanup.h for NVMEM buffer
This commit updates at91_adc_temp_sensor_init() to use scope-based cleanup
helpers. It introduces a custom DEFINE_FREE wrapper for nvmem_cell_put
and uses __free(kfree) to simplify the error handling paths.
> diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c
> --- a/drivers/iio/adc/at91-sama5d2_adc.c
> +++ b/drivers/iio/adc/at91-sama5d2_adc.c
> @@ -35,6 +35,8 @@
>
> #include <dt-bindings/iio/adc/at91-sama5d2_adc.h>
>
> +DEFINE_FREE(nvmem_cell_put, struct nvmem_cell *, if (_T) nvmem_cell_put(_T))
[ ... ]
> @@ -2249,33 +2251,28 @@ static int at91_adc_temp_sensor_init(struct at91_adc_state *st,
> struct device *dev)
> {
[ ... ]
> /* Get the calibration data from NVMEM. */
> - temp_calib = nvmem_cell_get(dev, "temperature_calib");
> + struct nvmem_cell *temp_calib __free(nvmem_cell_put) =
> + nvmem_cell_get(dev, "temperature_calib");
> if (IS_ERR(temp_calib)) {
> - ret = PTR_ERR(temp_calib);
> - if (ret != -ENOENT)
> + if (PTR_ERR(temp_calib) != -ENOENT)
> dev_err(dev, "Failed to get temperature_calib cell!\n");
> - return ret;
> + return PTR_ERR(temp_calib);
> }
[Severity: High]
Can returning early here cause a panic when the cleanup function runs?
nvmem_cell_get() returns an ERR_PTR on failure, such as -ENOENT or
-EPROBE_DEFER. Because the DEFINE_FREE wrapper for nvmem_cell_put only
checks if the pointer is non-zero (if (_T)), an ERR_PTR evaluates to true.
This means that nvmem_cell_put() will be called with an invalid pointer,
which can trigger a kernel panic when it attempts to dereference it.
Could the DEFINE_FREE macro be updated to use if (!IS_ERR_OR_NULL(_T)) to
safely handle these error codes?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260727122633.117435-1-varshini.rajendran@microchip.com?part=2
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v4 03/16] iio: adc: at91-sama5d2_adc: rework temp calibration layout handling
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
2026-07-27 12:26 ` [PATCH v4 01/16] dt-bindings: iio: adc: at91-sama5d2: document sama7d65 Varshini Rajendran
2026-07-27 12:26 ` [PATCH v4 02/16] iio: adc: at91-sama5d2_adc: use cleanup.h for NVMEM buffer Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
2026-07-27 12:39 ` sashiko-bot
2026-07-27 12:26 ` [PATCH v4 04/16] iio: adc: at91-sama5d2_adc: add condition to validate calibration data Varshini Rajendran
` (12 subsequent siblings)
15 siblings, 1 reply; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
Extend support to handle different temperature calibration layouts.
Add a temperature calibration data layout structure to describe indexes
of the factors P1, P4, P6, tag, minimum length of the packet and the
scaling factors for P1 (p1_scale) which are SoC-specific instead of the
older non scalable id structure. This helps handle the differences in the
same function flow and prepare the calibration data to be applied.
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
---
drivers/iio/adc/at91-sama5d2_adc.c | 66 ++++++++++++++++++++++--------
1 file changed, 48 insertions(+), 18 deletions(-)
diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c
index 4a4a25f3c715..798e4d60bf69 100644
--- a/drivers/iio/adc/at91-sama5d2_adc.c
+++ b/drivers/iio/adc/at91-sama5d2_adc.c
@@ -16,6 +16,7 @@
#include <linux/dmaengine.h>
#include <linux/interrupt.h>
#include <linux/io.h>
+#include <linux/math.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/property.h>
@@ -446,6 +447,27 @@ static const struct at91_adc_reg_layout sama7g5_layout = {
#define at91_adc_writel(st, reg, val) \
writel_relaxed(val, (st)->base + (st)->soc_info.platform->layout->reg)
+/* Temperature calibration tag "ACST" in ASCII */
+#define AT91_TEMP_CALIB_TAG_ACST 0x41435354
+
+/**
+ * struct at91_adc_temp_calib_layout - temperature calibration packet layout
+ * @tag_idx: index of Packet tag in the NVMEM cell buffer
+ * @p1_idx: index of FT1_TEMP, equivalent to P1 in the NVMEM cell buffer
+ * @p4_idx: index of FT1_VPAT, equivalent to P4 in the NVMEM cell buffer
+ * @p6_idx: index of FT2_VBG, equivalent to P6 in the NVMEM cell buffer
+ * @min_len: minimum number of u32 words expected in the NVMEM cell buffer
+ * @p1_scale: scaling factor applied to P1 to convert to millicelcius
+ */
+struct at91_adc_temp_calib_layout {
+ unsigned int tag_idx;
+ unsigned int p1_idx;
+ unsigned int p4_idx;
+ unsigned int p6_idx;
+ unsigned int min_len;
+ struct u32_fract p1_scale;
+};
+
/**
* struct at91_adc_platform - at91-sama5d2 platform information struct
* @layout: pointer to the reg layout struct
@@ -464,6 +486,7 @@ static const struct at91_adc_reg_layout sama7g5_layout = {
* @oversampling_avail_no: number of available oversampling values
* @chan_realbits: realbits for registered channels
* @temp_chan: temperature channel index
+ * @temp_calib_layout: temperature calibration packet layout
* @temp_sensor: temperature sensor supported
*/
struct at91_adc_platform {
@@ -481,6 +504,7 @@ struct at91_adc_platform {
unsigned int oversampling_avail_no;
unsigned int chan_realbits;
unsigned int temp_chan;
+ const struct at91_adc_temp_calib_layout *temp_calib_layout;
bool temp_sensor;
};
@@ -497,18 +521,13 @@ struct at91_adc_temp_sensor_clb {
u32 p6;
};
-/**
- * enum at91_adc_ts_clb_idx - calibration indexes in NVMEM buffer
- * @AT91_ADC_TS_CLB_IDX_P1: index for P1
- * @AT91_ADC_TS_CLB_IDX_P4: index for P4
- * @AT91_ADC_TS_CLB_IDX_P6: index for P6
- * @AT91_ADC_TS_CLB_IDX_MAX: max index for temperature calibration packet in OTP
- */
-enum at91_adc_ts_clb_idx {
- AT91_ADC_TS_CLB_IDX_P1 = 2,
- AT91_ADC_TS_CLB_IDX_P4 = 5,
- AT91_ADC_TS_CLB_IDX_P6 = 7,
- AT91_ADC_TS_CLB_IDX_MAX = 19,
+static const struct at91_adc_temp_calib_layout sama7g5_temp_calib = {
+ .tag_idx = 1,
+ .p1_idx = 2,
+ .p4_idx = 5,
+ .p6_idx = 7,
+ .min_len = 19,
+ .p1_scale = { .numerator = 1000, .denominator = 1 },
};
/* Temperature sensor calibration - Vtemp voltage sensitivity to temperature. */
@@ -746,6 +765,7 @@ static const struct at91_adc_platform sama7g5_platform = {
.chan_realbits = 16,
.temp_sensor = true,
.temp_chan = AT91_SAMA7G5_ADC_TEMP_CHANNEL,
+ .temp_calib_layout = &sama7g5_temp_calib,
};
static int at91_adc_chan_xlate(struct iio_dev *indio_dev, int chan)
@@ -2251,11 +2271,18 @@ static int at91_adc_temp_sensor_init(struct at91_adc_state *st,
struct device *dev)
{
struct at91_adc_temp_sensor_clb *clb = &st->soc_info.temp_sensor_clb;
+ const struct at91_adc_temp_calib_layout *layout;
size_t len;
if (!st->soc_info.platform->temp_sensor)
return 0;
+ layout = st->soc_info.platform->temp_calib_layout;
+ if (!layout)
+ return -ENODEV;
+ if (!layout->p1_scale.denominator)
+ return -EINVAL;
+
/* Get the calibration data from NVMEM. */
struct nvmem_cell *temp_calib __free(nvmem_cell_put) =
nvmem_cell_get(dev, "temperature_calib");
@@ -2270,20 +2297,23 @@ static int at91_adc_temp_sensor_init(struct at91_adc_state *st,
return dev_err_probe(dev, PTR_ERR(buf),
"Failed to read calibration data!\n");
- if (len < AT91_ADC_TS_CLB_IDX_MAX * sizeof(*buf)) {
+ if (len < layout->min_len * sizeof(*buf)) {
dev_err(dev, "Invalid calibration data!\n");
return -EINVAL;
}
/* Store calibration data for later use. */
- clb->p1 = buf[AT91_ADC_TS_CLB_IDX_P1];
- clb->p4 = buf[AT91_ADC_TS_CLB_IDX_P4];
- clb->p6 = buf[AT91_ADC_TS_CLB_IDX_P6];
+ clb->p1 = buf[layout->p1_idx];
+ clb->p4 = buf[layout->p4_idx];
+ clb->p6 = buf[layout->p6_idx];
/*
- * We prepare here the conversion to milli to avoid doing it on hotpath.
+ * Here we prepare the conversion to milli to avoid doing it on hotpath.
+ * The p1 value is multiplied and divided with a scaling factor as per
+ * the SoC storage format described by per-platform calibration layout.
*/
- clb->p1 = clb->p1 * 1000;
+ clb->p1 *= layout->p1_scale.numerator;
+ clb->p1 /= layout->p1_scale.denominator;
return 0;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH v4 03/16] iio: adc: at91-sama5d2_adc: rework temp calibration layout handling
2026-07-27 12:26 ` [PATCH v4 03/16] iio: adc: at91-sama5d2_adc: rework temp calibration layout handling Varshini Rajendran
@ 2026-07-27 12:39 ` sashiko-bot
0 siblings, 0 replies; 27+ messages in thread
From: sashiko-bot @ 2026-07-27 12:39 UTC (permalink / raw)
To: Varshini Rajendran; +Cc: robh, conor+dt, devicetree
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] The `DEFINE_FREE` wrapper for `nvmem_cell_put` incorrectly handles error pointers, leading to a kernel crash when `nvmem_cell_get()` fails.
- [Medium] The introduced temperature calibration tag index and expected tag macro are never used to validate the NVMEM packet.
--
--- Patch [3]: [PATCH v4 03/16] iio: adc: at91-sama5d2_adc: rework temp calibration layout handling ---
commit 859125ad776a3a3f2a744e65f324ef58a384982e
Author: Varshini Rajendran <varshini.rajendran@microchip.com>
iio: adc: at91-sama5d2_adc: rework temp calibration layout handling
Extend support to handle different temperature calibration layouts.
Add a temperature calibration data layout structure to describe indexes
of the factors P1, P4, P6, tag, minimum length of the packet and the
scaling factors for P1 (p1_scale) which are SoC-specific instead of the
older non scalable id structure. This helps handle the differences in the
same function flow and prepare the calibration data to be applied.
> diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c
> index 4a4a25f3c715a..798e4d60bf697 100644
> --- a/drivers/iio/adc/at91-sama5d2_adc.c
> +++ b/drivers/iio/adc/at91-sama5d2_adc.c
[ ... ]
> @@ -2251,11 +2271,18 @@ static int at91_adc_temp_sensor_init(struct at91_adc_state *st,
> struct device *dev)
> {
> struct at91_adc_temp_sensor_clb *clb = &st->soc_info.temp_sensor_clb;
> + const struct at91_adc_temp_calib_layout *layout;
> size_t len;
>
> if (!st->soc_info.platform->temp_sensor)
> return 0;
>
> + layout = st->soc_info.platform->temp_calib_layout;
> + if (!layout)
> + return -ENODEV;
> + if (!layout->p1_scale.denominator)
> + return -EINVAL;
> +
> /* Get the calibration data from NVMEM. */
> struct nvmem_cell *temp_calib __free(nvmem_cell_put) =
> nvmem_cell_get(dev, "temperature_calib");
[Severity: High]
Does the DEFINE_FREE() wrapper for nvmem_cell_put() properly handle error
pointers?
If nvmem_cell_get() returns an ERR_PTR (e.g. if the NVMEM cell is missing
or defers probe), the error pointer will be truthy. If the custom
DEFINE_FREE(nvmem_cell_put) wrapper only checks "if (_T)" instead of
using IS_ERR_OR_NULL(), the truthy ERR_PTR can bypass the guard and be
passed to nvmem_cell_put(). This would unconditionally dereference the
error pointer and cause a kernel panic.
[ ... ]
> @@ -2270,20 +2297,23 @@ static int at91_adc_temp_sensor_init(struct at91_adc_state *st,
> return dev_err_probe(dev, PTR_ERR(buf),
> "Failed to read calibration data!\n");
>
> - if (len < AT91_ADC_TS_CLB_IDX_MAX * sizeof(*buf)) {
> + if (len < layout->min_len * sizeof(*buf)) {
> dev_err(dev, "Invalid calibration data!\n");
> return -EINVAL;
> }
[Severity: Medium]
Are we missing the expected packet tag validation here?
The commit introduces the AT91_TEMP_CALIB_TAG_ACST macro and the tag_idx field
specifically to validate the NVMEM cell content, but the actual validation
check seems omitted.
This might allow the driver to accept corrupted or invalid NVMEM calibration
data as long as it meets the minimum length requirement.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260727122633.117435-1-varshini.rajendran@microchip.com?part=3
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v4 04/16] iio: adc: at91-sama5d2_adc: add condition to validate calibration data
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
` (2 preceding siblings ...)
2026-07-27 12:26 ` [PATCH v4 03/16] iio: adc: at91-sama5d2_adc: rework temp calibration layout handling Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
2026-07-27 12:42 ` sashiko-bot
2026-07-27 12:26 ` [PATCH v4 05/16] iio: adc: at91-sama5d2_adc: remove unnecessary casts in of_device_id Varshini Rajendran
` (11 subsequent siblings)
15 siblings, 1 reply; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
Add additional condition to validate the calibration data read from the
NVMEM cell using the TAG of the packet.
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
---
drivers/iio/adc/at91-sama5d2_adc.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c
index 798e4d60bf69..15dc88f4961b 100644
--- a/drivers/iio/adc/at91-sama5d2_adc.c
+++ b/drivers/iio/adc/at91-sama5d2_adc.c
@@ -2297,7 +2297,8 @@ static int at91_adc_temp_sensor_init(struct at91_adc_state *st,
return dev_err_probe(dev, PTR_ERR(buf),
"Failed to read calibration data!\n");
- if (len < layout->min_len * sizeof(*buf)) {
+ if (len < layout->min_len * sizeof(*buf) ||
+ buf[layout->tag_idx] != AT91_TEMP_CALIB_TAG_ACST) {
dev_err(dev, "Invalid calibration data!\n");
return -EINVAL;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH v4 04/16] iio: adc: at91-sama5d2_adc: add condition to validate calibration data
2026-07-27 12:26 ` [PATCH v4 04/16] iio: adc: at91-sama5d2_adc: add condition to validate calibration data Varshini Rajendran
@ 2026-07-27 12:42 ` sashiko-bot
0 siblings, 0 replies; 27+ messages in thread
From: sashiko-bot @ 2026-07-27 12:42 UTC (permalink / raw)
To: Varshini Rajendran; +Cc: robh, devicetree, conor+dt
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
New issues:
- [Critical] Invalid pointer dereference and kernel panic in the DEFINE_FREE(nvmem_cell_put) macro error handling path.
Pre-existing issues:
- [High] Race condition during probe: IRQ is requested before the peripheral clock is enabled and hardware interrupts are masked.
--
--- Patch [4]: [PATCH v4 04/16] iio: adc: at91-sama5d2_adc: add condition to validate calibration data ---
commit 9e92e8909ac4316dc3487b92319cfbc6db940b7b
Author: Varshini Rajendran <varshini.rajendran@microchip.com>
Subject: iio: adc: at91-sama5d2_adc: add condition to validate calibration data
This commit adds an additional check to validate the temperature calibration
data read from NVMEM. It verifies that the tag matches the expected
AT91_TEMP_CALIB_TAG_ACST value before proceeding.
> diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c
> index 798e4d60bf697..15dc88f4961b2 100644
> --- a/drivers/iio/adc/at91-sama5d2_adc.c
> +++ b/drivers/iio/adc/at91-sama5d2_adc.c
> @@ -2297,7 +2297,8 @@ static int at91_adc_temp_sensor_init(struct at91_adc_state *st,
> return dev_err_probe(dev, PTR_ERR(buf),
> "Failed to read calibration data!\n");
>
> - if (len < layout->min_len * sizeof(*buf)) {
> + if (len < layout->min_len * sizeof(*buf) ||
[Severity: Critical]
Does the error handling path in at91_adc_temp_sensor_init() safely handle
nvmem_cell_get() failures?
Looking at the initialization of temp_calib earlier in this function:
drivers/iio/adc/at91-sama5d2_adc.c:at91_adc_temp_sensor_init() {
...
struct nvmem_cell *temp_calib __free(nvmem_cell_put) =
nvmem_cell_get(dev, "temperature_calib");
if (IS_ERR(temp_calib)) {
...
return PTR_ERR(temp_calib);
}
...
}
When nvmem_cell_get() fails (e.g., returning -ENOENT), it returns an ERR_PTR
and we return early. This triggers the __free(nvmem_cell_put) cleanup handler.
The cleanup handler is defined as:
DEFINE_FREE(nvmem_cell_put, struct nvmem_cell *, if (_T) nvmem_cell_put(_T))
Since the ERR_PTR is not NULL, the condition if (_T) evaluates to true,
passing the ERR_PTR directly to nvmem_cell_put(). Inside nvmem_cell_put(),
the pointer is dereferenced unconditionally, which can lead to a panic.
Should the cleanup macro be updated to check if (!IS_ERR_OR_NULL(_T)) instead?
> + buf[layout->tag_idx] != AT91_TEMP_CALIB_TAG_ACST) {
> dev_err(dev, "Invalid calibration data!\n");
> return -EINVAL;
> }
[Severity: High]
This is a pre-existing issue, but is there a race condition during probe
between requesting the IRQ and enabling the peripheral clock?
In at91_adc_probe(), devm_request_irq() is called before the peripheral clock
is enabled with clk_prepare_enable() and before at91_adc_hw_init() masks
hardware interrupts.
If an interrupt is left pending by the bootloader, the handler
at91_adc_interrupt() will execute immediately:
drivers/iio/adc/at91-sama5d2_adc.c:at91_adc_interrupt() {
...
at91_adc_irq_status(st, &status, &eoc);
...
}
This handler reads a hardware register while the peripheral clock is still
disabled, which can cause a hardware abort. Additionally, since the interrupts
haven't been masked yet, it might bypass the IRQ_NONE check and fall through
to the software conversion branch, dereferencing the uninitialized st->chan
pointer.
Can the IRQ request be moved after the clock is enabled and the hardware is
fully initialized?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260727122633.117435-1-varshini.rajendran@microchip.com?part=4
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v4 05/16] iio: adc: at91-sama5d2_adc: remove unnecessary casts in of_device_id
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
` (3 preceding siblings ...)
2026-07-27 12:26 ` [PATCH v4 04/16] iio: adc: at91-sama5d2_adc: add condition to validate calibration data Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
2026-07-27 12:26 ` [PATCH v4 06/16] iio: adc: at91-sama5d2_adc: adapt the driver for sama7d65 Varshini Rajendran
` (10 subsequent siblings)
15 siblings, 0 replies; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
The .data field in struct of_device_id is 'const void *', so explicit
casts are unnecessary when assigning addresses of const structs.
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
---
drivers/iio/adc/at91-sama5d2_adc.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c
index 15dc88f4961b..63481ecb94f5 100644
--- a/drivers/iio/adc/at91-sama5d2_adc.c
+++ b/drivers/iio/adc/at91-sama5d2_adc.c
@@ -2628,10 +2628,10 @@ static const struct dev_pm_ops at91_adc_pm_ops = {
static const struct of_device_id at91_adc_dt_match[] = {
{
.compatible = "atmel,sama5d2-adc",
- .data = (const void *)&sama5d2_platform,
+ .data = &sama5d2_platform,
}, {
.compatible = "microchip,sama7g5-adc",
- .data = (const void *)&sama7g5_platform,
+ .data = &sama7g5_platform,
}, {
/* sentinel */
}
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread* [PATCH v4 06/16] iio: adc: at91-sama5d2_adc: adapt the driver for sama7d65
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
` (4 preceding siblings ...)
2026-07-27 12:26 ` [PATCH v4 05/16] iio: adc: at91-sama5d2_adc: remove unnecessary casts in of_device_id Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
2026-07-27 12:41 ` sashiko-bot
2026-07-27 12:26 ` [PATCH v4 07/16] dt-bindings: nvmem: microchip,sama7g5-otpc: add sama7d65 and dt node example Varshini Rajendran
` (9 subsequent siblings)
15 siblings, 1 reply; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
Add support for sama7d65 ADC. The differences are highlighted with the
compatible. The calibration data layout is the main difference.
Update Kconfig help text to mention SAMA7 SoC family support.
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
---
drivers/iio/adc/Kconfig | 2 +-
drivers/iio/adc/at91-sama5d2_adc.c | 30 ++++++++++++++++++++++++++++++
2 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
index 3755a81c1efd..85b443853a08 100644
--- a/drivers/iio/adc/Kconfig
+++ b/drivers/iio/adc/Kconfig
@@ -647,7 +647,7 @@ config AT91_SAMA5D2_ADC
select IIO_TRIGGERED_BUFFER
help
Say yes here to build support for Atmel SAMA5D2 ADC which is
- available on SAMA5D2 SoC family.
+ available on SAMA5D2 and SAMA7 SoC families.
To compile this driver as a module, choose M here: the module will be
called at91-sama5d2_adc.
diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c
index 63481ecb94f5..a54691b38244 100644
--- a/drivers/iio/adc/at91-sama5d2_adc.c
+++ b/drivers/iio/adc/at91-sama5d2_adc.c
@@ -530,6 +530,15 @@ static const struct at91_adc_temp_calib_layout sama7g5_temp_calib = {
.p1_scale = { .numerator = 1000, .denominator = 1 },
};
+static const struct at91_adc_temp_calib_layout sama7d65_temp_calib = {
+ .tag_idx = 1,
+ .p1_idx = 3,
+ .p4_idx = 2,
+ .p6_idx = 5,
+ .min_len = 11,
+ .p1_scale = { .numerator = 1, .denominator = 1000 },
+};
+
/* Temperature sensor calibration - Vtemp voltage sensitivity to temperature. */
#define AT91_ADC_TS_VTEMP_DT (2080U)
@@ -768,6 +777,24 @@ static const struct at91_adc_platform sama7g5_platform = {
.temp_calib_layout = &sama7g5_temp_calib,
};
+static const struct at91_adc_platform sama7d65_platform = {
+ .layout = &sama7g5_layout,
+ .adc_channels = &at91_sama7g5_adc_channels,
+ .nr_channels = AT91_SAMA7G5_SINGLE_CHAN_CNT +
+ AT91_SAMA7G5_DIFF_CHAN_CNT +
+ AT91_SAMA7G5_TEMP_CHAN_CNT,
+ .max_channels = ARRAY_SIZE(at91_sama7g5_adc_channels),
+ .max_index = AT91_SAMA7G5_MAX_CHAN_IDX,
+ .hw_trig_cnt = AT91_SAMA7G5_HW_TRIG_CNT,
+ .osr_mask = GENMASK(18, 16),
+ .oversampling_avail = { 1, 4, 16, 64, 256 },
+ .oversampling_avail_no = 5,
+ .chan_realbits = 16,
+ .temp_sensor = true,
+ .temp_chan = AT91_SAMA7G5_ADC_TEMP_CHANNEL,
+ .temp_calib_layout = &sama7d65_temp_calib,
+};
+
static int at91_adc_chan_xlate(struct iio_dev *indio_dev, int chan)
{
int i;
@@ -2632,6 +2659,9 @@ static const struct of_device_id at91_adc_dt_match[] = {
}, {
.compatible = "microchip,sama7g5-adc",
.data = &sama7g5_platform,
+ }, {
+ .compatible = "microchip,sama7d65-adc",
+ .data = &sama7d65_platform,
}, {
/* sentinel */
}
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH v4 06/16] iio: adc: at91-sama5d2_adc: adapt the driver for sama7d65
2026-07-27 12:26 ` [PATCH v4 06/16] iio: adc: at91-sama5d2_adc: adapt the driver for sama7d65 Varshini Rajendran
@ 2026-07-27 12:41 ` sashiko-bot
0 siblings, 0 replies; 27+ messages in thread
From: sashiko-bot @ 2026-07-27 12:41 UTC (permalink / raw)
To: Varshini Rajendran; +Cc: robh, conor+dt, devicetree
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] The custom `DEFINE_FREE` implementation for `nvmem_cell_put` fails to check for error pointers, causing a kernel panic when `nvmem_cell_get` fails.
--
--- Patch [6]: [PATCH v4 06/16] iio: adc: at91-sama5d2_adc: adapt the driver for sama7d65 ---
commit ded9daef979dc15e3d8816ca33992bea7aa02c01
Author: Varshini Rajendran <varshini.rajendran@microchip.com>
iio: adc: at91-sama5d2_adc: adapt the driver for sama7d65
Add support for sama7d65 ADC. The differences are highlighted with the
compatible. The calibration data layout is the main difference.
> diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c
> index 63481ecb94f5e..a54691b38244f 100644
> --- a/drivers/iio/adc/at91-sama5d2_adc.c
> +++ b/drivers/iio/adc/at91-sama5d2_adc.c
[ ... ]
> @@ -768,6 +777,24 @@ static const struct at91_adc_platform sama7g5_platform = {
> .temp_calib_layout = &sama7g5_temp_calib,
> };
>
> +static const struct at91_adc_platform sama7d65_platform = {
> + .layout = &sama7g5_layout,
> + .adc_channels = &at91_sama7g5_adc_channels,
> + .nr_channels = AT91_SAMA7G5_SINGLE_CHAN_CNT +
> + AT91_SAMA7G5_DIFF_CHAN_CNT +
> + AT91_SAMA7G5_TEMP_CHAN_CNT,
> + .max_channels = ARRAY_SIZE(at91_sama7g5_adc_channels),
> + .max_index = AT91_SAMA7G5_MAX_CHAN_IDX,
> + .hw_trig_cnt = AT91_SAMA7G5_HW_TRIG_CNT,
> + .osr_mask = GENMASK(18, 16),
> + .oversampling_avail = { 1, 4, 16, 64, 256 },
> + .oversampling_avail_no = 5,
> + .chan_realbits = 16,
> + .temp_sensor = true,
[Severity: High]
Could enabling the temperature sensor here expose this new platform to a panic
during probe?
When at91_adc_temp_sensor_init() is called for platforms with a temperature
sensor, it uses nvmem_cell_get() which returns an error pointer on failure:
struct nvmem_cell *temp_calib __free(nvmem_cell_put) =
nvmem_cell_get(dev, "temperature_calib");
if (IS_ERR(temp_calib)) {
if (PTR_ERR(temp_calib) != -ENOENT)
dev_err(dev, "Failed to get temperature_calib cell!\n");
return PTR_ERR(temp_calib);
}
Because DEFINE_FREE for nvmem_cell_put is implemented with a simple check
instead of verifying for error pointers:
DEFINE_FREE(nvmem_cell_put, struct nvmem_cell *, if (_T) nvmem_cell_put(_T))
If nvmem_cell_get() fails, the ERR_PTR is evaluated as true by the cleanup
macro and passed directly to nvmem_cell_put(). This will immediately attempt
to dereference the error pointer, causing a kernel panic.
> + .temp_chan = AT91_SAMA7G5_ADC_TEMP_CHANNEL,
> + .temp_calib_layout = &sama7d65_temp_calib,
> +};
> +
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260727122633.117435-1-varshini.rajendran@microchip.com?part=6
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v4 07/16] dt-bindings: nvmem: microchip,sama7g5-otpc: add sama7d65 and dt node example
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
` (5 preceding siblings ...)
2026-07-27 12:26 ` [PATCH v4 06/16] iio: adc: at91-sama5d2_adc: adapt the driver for sama7d65 Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
2026-07-27 12:41 ` sashiko-bot
2026-07-27 12:26 ` [PATCH v4 08/16] nvmem: microchip-otpc: nvmem: microchip-otpc: add tag-based packet lookup Varshini Rajendran
` (8 subsequent siblings)
15 siblings, 1 reply; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
Cc: Conor Dooley
Add support for sama7d65 and a dt node example that shows tag can be used
to reference a packet stored in the OTP memory.
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
Acked-by: Conor Dooley <conor.dooley@microchip.com>
---
.../nvmem/microchip,sama7g5-otpc.yaml | 28 +++++++++++++++++--
1 file changed, 25 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml b/Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml
index cc25f2927682..04b44660554e 100644
--- a/Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml
+++ b/Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml
@@ -20,9 +20,15 @@ allOf:
properties:
compatible:
- items:
- - const: microchip,sama7g5-otpc
- - const: syscon
+ oneOf:
+ - items:
+ - const: microchip,sama7g5-otpc
+ - const: syscon
+ - items:
+ - enum:
+ - microchip,sama7d65-otpc
+ - const: microchip,sama7g5-otpc
+ - const: syscon
reg:
maxItems: 1
@@ -48,4 +54,20 @@ examples:
};
};
+ - |
+ efuse@e8c00000 {
+ compatible = "microchip,sama7d65-otpc", "microchip,sama7g5-otpc", "syscon";
+ reg = <0xe8c00000 0x100>;
+
+ nvmem-layout {
+ compatible = "fixed-layout";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ calib@41435354 {
+ reg = <0x41435354 0x2c>; /* Temp calib data packet TAG */
+ };
+ };
+ };
+
...
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH v4 07/16] dt-bindings: nvmem: microchip,sama7g5-otpc: add sama7d65 and dt node example
2026-07-27 12:26 ` [PATCH v4 07/16] dt-bindings: nvmem: microchip,sama7g5-otpc: add sama7d65 and dt node example Varshini Rajendran
@ 2026-07-27 12:41 ` sashiko-bot
0 siblings, 0 replies; 27+ messages in thread
From: sashiko-bot @ 2026-07-27 12:41 UTC (permalink / raw)
To: Varshini Rajendran; +Cc: devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Critical] Kernel panic on error path due to incorrect usage of cleanup.h with ERR_PTR.
- [High] The dt-bindings introduce a tag-based packet reference example (0x41435354), but the tag resolution implementation is entirely missing from the core OTPC driver, causing reads to fail.
--
--- Patch [7]: [PATCH v4 07/16] dt-bindings: nvmem: microchip,sama7g5-otpc: add sama7d65 and dt node example ---
commit c38200e184c8f58a1ca93cb43c4f35660c0b276c
Author: Varshini Rajendran <varshini.rajendran@microchip.com>
dt-bindings: nvmem: microchip,sama7g5-otpc: add sama7d65 and dt node example
This commit adds support for the sama7d65 compatible string. It also adds a
device tree node example demonstrating how a tag can reference a packet
stored in the OTP memory.
> diff --git a/Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml b/Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml
> index cc25f2927682e..04b44660554ea 100644
> --- a/Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml
> +++ b/Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml
[ ... ]
> @@ -48,4 +54,20 @@ examples:
> };
> };
>
> + - |
> + efuse@e8c00000 {
> + compatible = "microchip,sama7d65-otpc", "microchip,sama7g5-otpc", "syscon";
> + reg = <0xe8c00000 0x100>;
> +
> + nvmem-layout {
> + compatible = "fixed-layout";
> + #address-cells = <1>;
> + #size-cells = <1>;
> +
> + calib@41435354 {
> + reg = <0x41435354 0x2c>; /* Temp calib data packet TAG */
[Severity: High]
Does this configuration cause reads to fail because the tag resolution
implementation is missing from the core OTPC driver?
This example uses `nvmem-layout` `fixed-layout` and defines a cell with
`reg = <0x41435354 0x2c>`. The NVMEM core passes the byte offset `0x41435354`
to `mchp_otpc_read()`.
However, the driver strictly expects ID-based addressing (`packet_id * 4`):
drivers/nvmem/microchip-otpc.c:mchp_otpc_read() {
...
packet = mchp_otpc_id_to_packet(otpc, off / 4);
if (!packet)
return -EINVAL;
...
}
Passing `0x41435354` results in calculating an enormous packet ID
(`0x1050CD15`), which exceeds the maximum number of initialized packets.
Will this cause `mchp_otpc_id_to_packet()` to return NULL and the read to
always fail with -EINVAL?
> + };
> + };
> + };
> +
> ...
[Severity: Critical]
Does this code trigger an invalid memory access on the error path due to
incorrect usage of cleanup.h with ERR_PTR?
drivers/iio/adc/at91-sama5d2_adc.c:DEFINE_FREE(nvmem_cell_put)
DEFINE_FREE(nvmem_cell_put, struct nvmem_cell *, if (_T) nvmem_cell_put(_T))
If the optional `temperature_calib` nvmem cell is missing, `nvmem_cell_get()`
returns `ERR_PTR(-ENOENT)`. The error path returns early, triggering
`__free(nvmem_cell_put)`:
drivers/iio/adc/at91-sama5d2_adc.c:at91_adc_temp_sensor_init() {
...
struct nvmem_cell *temp_calib __free(nvmem_cell_put) =
nvmem_cell_get(dev, "temperature_calib");
if (IS_ERR(temp_calib)) {
if (PTR_ERR(temp_calib) != -ENOENT)
dev_err(dev, "Failed to get temperature_calib cell!\n");
return PTR_ERR(temp_calib);
}
...
}
Since the error pointer evaluates to true (not NULL), it is passed directly
to `nvmem_cell_put()`, which unconditionally dereferences `cell->entry`,
causing an invalid memory access.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260727122633.117435-1-varshini.rajendran@microchip.com?part=7
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v4 08/16] nvmem: microchip-otpc: nvmem: microchip-otpc: add tag-based packet lookup
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
` (6 preceding siblings ...)
2026-07-27 12:26 ` [PATCH v4 07/16] dt-bindings: nvmem: microchip,sama7g5-otpc: add sama7d65 and dt node example Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
2026-07-27 12:44 ` sashiko-bot
2026-07-27 12:26 ` [PATCH v4 09/16] nvmem: microchip-otpc: nvmem: add emulation mode and OTP access validation Varshini Rajendran
` (7 subsequent siblings)
15 siblings, 1 reply; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
Add support for accessing OTP packets by their tag which is a FourCC
while preserving backward compatibility with the existing ID-based
lookup.
The OTP memory layout can vary across devices and may change over time,
making the packet ID approach unreliable when the memory map is not
known in advance. The packet tag provides a reliable way to identify
and access packets without prior knowledge of the OTP memory layout.
Two offset encodings are now supported:
1. Legacy ID-based: offset = OTP_PKT(id) = id * 4
Used in DT as: reg = <OTP_PKT(1) 76>;
2. TAG-based: offset = 4-byte ASCII packet tag (FourCC)
Used in DT as: reg = <0x41435354 0x4c>; (tag "ACST")
The driver resolves offsets matching valid legacy selectors (multiples
of 4 within the packet count) through ID lookup, falling back to tag
lookup for other valid values. This ensures existing device trees
continue to work while enabling new tag-based access. During probe,
packet meta data including the tag is read and cached.
The stride of the nvmem memory is set to 1 in order to support tag based
offsets, comment in the header file is updated accordingly.
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
---
drivers/nvmem/microchip-otpc.c | 117 ++++++++++++++++--
.../nvmem/microchip,sama7g5-otpc.h | 4 +-
2 files changed, 110 insertions(+), 11 deletions(-)
diff --git a/drivers/nvmem/microchip-otpc.c b/drivers/nvmem/microchip-otpc.c
index df979e8549fd..a17f82afdc37 100644
--- a/drivers/nvmem/microchip-otpc.c
+++ b/drivers/nvmem/microchip-otpc.c
@@ -23,6 +23,8 @@
#define MCHP_OTPC_SR_READ BIT(6)
#define MCHP_OTPC_HR (0x20)
#define MCHP_OTPC_HR_SIZE GENMASK(15, 8)
+#define MCHP_OTPC_HR_PACKET GENMASK(2, 0)
+#define MCHP_OTPC_HR_PACKET_REGULAR 1
#define MCHP_OTPC_DR (0x24)
#define MCHP_OTPC_NAME "mchp-otpc"
@@ -47,11 +49,13 @@ struct mchp_otpc {
* @list: list head
* @id: packet ID
* @offset: packet offset (in words) in OTP memory
+ * @tag: 4-byte ASCII (FourCC) tag of the packet
*/
struct mchp_otpc_packet {
struct list_head list;
u32 id;
u32 offset;
+ u32 tag;
};
static struct mchp_otpc_packet *mchp_otpc_id_to_packet(struct mchp_otpc *otpc,
@@ -70,6 +74,52 @@ static struct mchp_otpc_packet *mchp_otpc_id_to_packet(struct mchp_otpc *otpc,
return NULL;
}
+static struct mchp_otpc_packet *mchp_otpc_tag_to_packet(struct mchp_otpc *otpc, u32 tag)
+{
+ struct mchp_otpc_packet *packet;
+
+ list_for_each_entry(packet, &otpc->packets, list) {
+ if (packet->tag == tag)
+ return packet;
+ }
+
+ return NULL;
+}
+
+static bool mchp_otpc_is_valid_fourcc(u32 tag)
+{
+ int i;
+ u8 c;
+
+ for (i = 0; i < 4; i++) {
+ c = (tag >> (i * 8)) & 0xff;
+ if (c < 0x20 || c > 0x7e)
+ return false;
+ }
+
+ return true;
+}
+
+static struct mchp_otpc_packet *mchp_otpc_resolve_packet(struct mchp_otpc *otpc, u32 off)
+{
+ /*
+ * Legacy id based packet access: offset = id * 4
+ * Inside the driver we use continuous unsigned integer numbers
+ * for packet id, thus divide off by 4 before passing it to
+ * mchp_otpc_id_to_packet().
+ */
+ u32 remainder = off % 4;
+ u32 id = off / 4;
+
+ if (!remainder && id < otpc->npackets)
+ return mchp_otpc_id_to_packet(otpc, id);
+
+ /*
+ * TAG-based packet access: offset is a 4-byte ASCII tag (FourCC)
+ */
+ return mchp_otpc_tag_to_packet(otpc, off);
+}
+
static int mchp_otpc_prepare_read(struct mchp_otpc *otpc,
unsigned int offset)
{
@@ -140,8 +190,29 @@ static int mchp_otpc_prepare_read(struct mchp_otpc *otpc,
* offset returned by hardware.
*
* For this, the read function will return the first requested bytes in the
- * packet. The user will have to be aware of the memory footprint before doing
- * the read request.
+ * packet.
+ *
+ * Two offset encodings are supported:
+ *
+ * 1. Legacy ID-based: offset = OTP_PKT(id) = id * 4
+ * Used in DT as: reg = <OTP_PKT(1) 76>;
+ * 2. TAG-based: offset = 4-byte ASCII packet tag (FourCC)
+ * Used in DT as: reg = <0x41435354 0x4c>; (tag "ACST")
+ *
+ * To use the legacy ID based packet lookup the user will have to be aware of
+ * the memory footprint before doing the read request.
+ *
+ * But by using the TAG based packet lookup, the user won't have to be aware
+ * of the memory footprint before doing the read request since this driver has
+ * it abstracted and taken care of.
+ *
+ * Practically, there is no way of knowing the mapping of the OTP memory table
+ * in advance for every device. But by using the packet tag - the identifier
+ * ASCII value (FourCC), the packets can be recognized without being aware of the
+ * flashed OTP memory map table and the payload can be acquired reliably.
+ *
+ * While the legacy ID based lookup is still supported, TAG based approach is
+ * recommended.
*/
static int mchp_otpc_read(void *priv, unsigned int off, void *val,
size_t bytes)
@@ -154,12 +225,11 @@ static int mchp_otpc_read(void *priv, unsigned int off, void *val,
int ret, payload_size;
/*
- * We reach this point with off being multiple of stride = 4 to
- * be able to cross the subsystem. Inside the driver we use continuous
- * unsigned integer numbers for packet id, thus divide off by 4
- * before passing it to mchp_otpc_id_to_packet().
+ * From this point the offset has to be translated into the actual
+ * packet. For this we traverse the table of contents stored in a list
+ * "packet" based on the access type - packet id or tag.
*/
- packet = mchp_otpc_id_to_packet(otpc, off / 4);
+ packet = mchp_otpc_resolve_packet(otpc, off);
if (!packet)
return -EINVAL;
offset = packet->offset;
@@ -190,10 +260,25 @@ static int mchp_otpc_read(void *priv, unsigned int off, void *val,
return 0;
}
+static int mchp_otpc_read_packet_tag(struct mchp_otpc *otpc, unsigned int offset,
+ unsigned int *tag)
+{
+ int ret;
+
+ ret = mchp_otpc_prepare_read(otpc, offset);
+ if (ret)
+ return ret;
+
+ writel_relaxed(0, otpc->base + MCHP_OTPC_AR);
+ *tag = readl_relaxed(otpc->base + MCHP_OTPC_DR);
+
+ return 0;
+}
+
static int mchp_otpc_init_packets_list(struct mchp_otpc *otpc, u32 *size)
{
struct mchp_otpc_packet *packet;
- u32 word, word_pos = 0, id = 0, npackets = 0, payload_size;
+ u32 word, word_pos = 0, id = 0, npackets = 0, payload_size, type;
int ret;
INIT_LIST_HEAD(&otpc->packets);
@@ -215,6 +300,20 @@ static int mchp_otpc_init_packets_list(struct mchp_otpc *otpc, u32 *size)
packet->id = id++;
packet->offset = word_pos;
+ type = FIELD_GET(MCHP_OTPC_HR_PACKET, word);
+
+ if (type == MCHP_OTPC_HR_PACKET_REGULAR) {
+ ret = mchp_otpc_read_packet_tag(otpc, packet->offset,
+ &packet->tag);
+ if (ret)
+ return ret;
+
+ if (!mchp_otpc_is_valid_fourcc(packet->tag))
+ packet->tag = 0;
+ } else {
+ packet->tag = 0;
+ }
+
INIT_LIST_HEAD(&packet->list);
list_add_tail(&packet->list, &otpc->packets);
@@ -236,7 +335,7 @@ static struct nvmem_config mchp_nvmem_config = {
.type = NVMEM_TYPE_OTP,
.read_only = true,
.word_size = 4,
- .stride = 4,
+ .stride = 1,
.reg_read = mchp_otpc_read,
};
diff --git a/include/dt-bindings/nvmem/microchip,sama7g5-otpc.h b/include/dt-bindings/nvmem/microchip,sama7g5-otpc.h
index f570b23165a2..5f72e75ad091 100644
--- a/include/dt-bindings/nvmem/microchip,sama7g5-otpc.h
+++ b/include/dt-bindings/nvmem/microchip,sama7g5-otpc.h
@@ -4,8 +4,8 @@
#define _DT_BINDINGS_NVMEM_MICROCHIP_OTPC_H
/*
- * Need to have it as a multiple of 4 as NVMEM memory is registered with
- * stride = 4.
+ * Need to have it as a multiple of 4 for the legacy id based packet
+ * access.
*/
#define OTP_PKT(id) ((id) * 4)
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH v4 08/16] nvmem: microchip-otpc: nvmem: microchip-otpc: add tag-based packet lookup
2026-07-27 12:26 ` [PATCH v4 08/16] nvmem: microchip-otpc: nvmem: microchip-otpc: add tag-based packet lookup Varshini Rajendran
@ 2026-07-27 12:44 ` sashiko-bot
0 siblings, 0 replies; 27+ messages in thread
From: sashiko-bot @ 2026-07-27 12:44 UTC (permalink / raw)
To: Varshini Rajendran; +Cc: conor+dt, devicetree, robh
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
Pre-existing issues:
- [High] Missing mutual exclusion to protect the multi-step hardware read sequence leads to race conditions and hardware state corruption.
- [High] Unconditional 32-bit writes can overflow unaligned destination buffers when the requested read size is not a multiple of 4.
--
--- Patch [8]: [PATCH v4 08/16] nvmem: microchip-otpc: nvmem: microchip-otpc: add tag-based packet lookup ---
commit 9730ed34d324f2aa5db4e67574aa110d572f9120
Author: Varshini Rajendran <varshini.rajendran@microchip.com>
nvmem: microchip-otpc: nvmem: microchip-otpc: add tag-based packet lookup
This commit adds support for accessing OTP packets by their tag (FourCC)
while preserving backward compatibility with ID-based lookup. The driver
resolves offsets matching valid legacy selectors through ID lookup, falling
back to tag lookup for other valid values.
> diff --git a/drivers/nvmem/microchip-otpc.c b/drivers/nvmem/microchip-otpc.c
> index df979e8549fdb..a17f82afdc37d 100644
> --- a/drivers/nvmem/microchip-otpc.c
> +++ b/drivers/nvmem/microchip-otpc.c
[ ... ]
> @@ -154,12 +225,11 @@ static int mchp_otpc_read(void *priv, unsigned int off, void *val,
> int ret, payload_size;
>
> /*
> - * We reach this point with off being multiple of stride = 4 to
> - * be able to cross the subsystem. Inside the driver we use continuous
> - * unsigned integer numbers for packet id, thus divide off by 4
> - * before passing it to mchp_otpc_id_to_packet().
> + * From this point the offset has to be translated into the actual
> + * packet. For this we traverse the table of contents stored in a list
> + * "packet" based on the access type - packet id or tag.
> */
> - packet = mchp_otpc_id_to_packet(otpc, off / 4);
> + packet = mchp_otpc_resolve_packet(otpc, off);
[Severity: High]
This isn't a bug introduced by this patch, but I wanted to ask about the
thread safety of mchp_otpc_read() and mchp_otpc_prepare_read().
If multiple kernel consumers or userspace via sysfs (like a pread on
/sys/bus/nvmem/devices/*/nvmem) read from this device concurrently,
couldn't they clobber the shared hardware state machine registers
(MR, CR, SR, etc)?
Since the NVMEM core does not serialize reg_read callbacks unless keepouts
are defined, and this driver doesn't use regmap, does this driver need its
own mutex to protect the multi-step hardware read sequence?
> if (!packet)
> return -EINVAL;
> offset = packet->offset;
[Severity: High]
This is also a pre-existing issue, but looking further down in
mchp_otpc_read() at the payload reading loop:
do {
*buf++ = readl_relaxed(otpc->base + MCHP_OTPC_DR);
len += sizeof(*buf);
offset++;
payload_size--;
} while (payload_size >= 0 && len < bytes);
Could this unconditionally write past the end of the destination buffer if a
caller invokes nvmem_device_read() with an unaligned size?
The loop always writes 4 bytes at a time into *buf. If bytes is not a
multiple of 4 (e.g. bytes = 5 or 6), it looks like the final write will
overflow the allocated buffer bounds since the loop condition (len < bytes)
is only checked after the write occurs.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260727122633.117435-1-varshini.rajendran@microchip.com?part=8
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v4 09/16] nvmem: microchip-otpc: nvmem: add emulation mode and OTP access validation
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
` (7 preceding siblings ...)
2026-07-27 12:26 ` [PATCH v4 08/16] nvmem: microchip-otpc: nvmem: microchip-otpc: add tag-based packet lookup Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
2026-07-27 12:39 ` sashiko-bot
2026-07-27 12:26 ` [PATCH v4 10/16] ARM: dts: microchip: sama7d65: add cpu opps Varshini Rajendran
` (6 subsequent siblings)
15 siblings, 1 reply; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
Add validation of OTP memory accessibility and emulation mode status
during probe.
When the boot packet is not configured, emulation mode allows access to
the other packets. When both are not available an informational message
is logged to help with debugging.
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
---
drivers/nvmem/microchip-otpc.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/drivers/nvmem/microchip-otpc.c b/drivers/nvmem/microchip-otpc.c
index a17f82afdc37..6b0184423463 100644
--- a/drivers/nvmem/microchip-otpc.c
+++ b/drivers/nvmem/microchip-otpc.c
@@ -18,6 +18,7 @@
#define MCHP_OTPC_CR_READ BIT(6)
#define MCHP_OTPC_MR (0x4)
#define MCHP_OTPC_MR_ADDR GENMASK(31, 16)
+#define MCHP_OTPC_MR_EMUL BIT(7)
#define MCHP_OTPC_AR (0x8)
#define MCHP_OTPC_SR (0xc)
#define MCHP_OTPC_SR_READ BIT(6)
@@ -343,7 +344,8 @@ static int mchp_otpc_probe(struct platform_device *pdev)
{
struct nvmem_device *nvmem;
struct mchp_otpc *otpc;
- u32 size;
+ bool emul_enable;
+ u32 size, mr_val;
int ret;
otpc = devm_kzalloc(&pdev->dev, sizeof(*otpc), GFP_KERNEL);
@@ -355,10 +357,22 @@ static int mchp_otpc_probe(struct platform_device *pdev)
return PTR_ERR(otpc->base);
otpc->dev = &pdev->dev;
+
+ mr_val = readl_relaxed(otpc->base + MCHP_OTPC_MR);
+ emul_enable = mr_val & MCHP_OTPC_MR_EMUL;
+ if (emul_enable)
+ dev_info(otpc->dev, "Emulation mode enabled\n");
+
ret = mchp_otpc_init_packets_list(otpc, &size);
if (ret)
return ret;
+ if (!size) {
+ dev_warn(otpc->dev, "Cannot access OTP memory\n");
+ if (!emul_enable)
+ dev_info(otpc->dev, "Boot packet not programmed and emulation mode disabled\n");
+ }
+
mchp_nvmem_config.dev = otpc->dev;
mchp_nvmem_config.add_legacy_fixed_of_cells = true;
mchp_nvmem_config.size = size;
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH v4 09/16] nvmem: microchip-otpc: nvmem: add emulation mode and OTP access validation
2026-07-27 12:26 ` [PATCH v4 09/16] nvmem: microchip-otpc: nvmem: add emulation mode and OTP access validation Varshini Rajendran
@ 2026-07-27 12:39 ` sashiko-bot
0 siblings, 0 replies; 27+ messages in thread
From: sashiko-bot @ 2026-07-27 12:39 UTC (permalink / raw)
To: Varshini Rajendran; +Cc: robh, conor+dt, devicetree
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
Pre-existing issues:
- [High] The arguments for `sleep_us` and `timeout_us` in `read_poll_timeout` are swapped, causing the poll to sleep excessively and fail prematurely.
- [High] There is a mismatch between the calculated NVMEM device size and the number of bytes read per packet, leading to truncated reads and corrupted payload data in the buffer.
- [Medium] The OTP payload stream is read from the `MCHP_OTPC_DR` data register using `readl_relaxed()` in a loop, which causes unintended byte-swapping on big-endian architectures.
--
--- Patch [9]: [PATCH v4 09/16] nvmem: microchip-otpc: nvmem: add emulation mode and OTP access validation ---
commit b464c23d34790bae23b36f89796febe703de8718
Author: Varshini Rajendran <varshini.rajendran@microchip.com>
nvmem: microchip-otpc: nvmem: add emulation mode and OTP access validation
This commit adds validation of OTP memory accessibility and emulation mode
status during probe. When the boot packet is not configured, emulation mode
allows access to the other packets.
> diff --git a/drivers/nvmem/microchip-otpc.c b/drivers/nvmem/microchip-otpc.c
> index a17f82afdc37d..6b0184423463e 100644
> --- a/drivers/nvmem/microchip-otpc.c
> +++ b/drivers/nvmem/microchip-otpc.c
> @@ -343,7 +344,8 @@ static int mchp_otpc_probe(struct platform_device *pdev)
> {
[ ... ]
> ret = mchp_otpc_init_packets_list(otpc, &size);
> if (ret)
> return ret;
>
> + if (!size) {
> + dev_warn(otpc->dev, "Cannot access OTP memory\n");
> + if (!emul_enable)
> + dev_info(otpc->dev, "Boot packet not programmed and emulation mode disabled\n");
> + }
> +
> mchp_nvmem_config.dev = otpc->dev;
> mchp_nvmem_config.add_legacy_fixed_of_cells = true;
While reviewing this patch, I noticed a few pre-existing issues in the same
file that you might want to address:
drivers/nvmem/microchip-otpc.c:mchp_otpc_read()
> *buf++ = readl_relaxed(otpc->base + MCHP_OTPC_DR);
[Severity: Medium]
This is a pre-existing issue, but does this read sequential FIFO payload data
using a byteswapping scalar accessor rather than a stream accessor (e.g.
readsl())?
Using readl_relaxed() here might cause unintended byte-swapping on big-endian
architectures when reading the underlying raw byte stream.
drivers/nvmem/microchip-otpc.c:mchp_otpc_prepare_read()
> return read_poll_timeout(readl_relaxed, tmp, !(tmp & MCHP_OTPC_SR_READ),
> 10000, 2000, false, otpc->base + MCHP_OTPC_SR);
[Severity: High]
This is a pre-existing issue, but are the sleep_us and timeout_us arguments
swapped here?
The sleep_us parameter is set to 10000 (10ms) while timeout_us is set to
2000 (2ms), which would cause the timeout to expire before the first sleep
completes.
drivers/nvmem/microchip-otpc.c:mchp_otpc_init_packets_list()
> *size += 4 * (payload_size + 1);
drivers/nvmem/microchip-otpc.c:mchp_otpc_read()
> } while (payload_size >= 0 && len < bytes);
[Severity: High]
This is a pre-existing issue, but is there a mismatch between the calculated
NVMEM device size and the number of bytes read per packet?
In mchp_otpc_init_packets_list(), the total size is incremented by exactly
payload_size + 1 words (header + payload).
However, in mchp_otpc_read(), the loop condition payload_size >= 0 causes
it to iterate payload_size + 1 times for the payload alone, meaning a total
of payload_size + 2 words (including header) are fetched and written to the
buffer per packet.
Could this write a padding or gap word into the user buffer, shifting
subsequent packets and causing final packets to be truncated because the
len < bytes limit is reached prematurely?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260727122633.117435-1-varshini.rajendran@microchip.com?part=9
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v4 10/16] ARM: dts: microchip: sama7d65: add cpu opps
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
` (8 preceding siblings ...)
2026-07-27 12:26 ` [PATCH v4 09/16] nvmem: microchip-otpc: nvmem: add emulation mode and OTP access validation Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
2026-07-27 12:26 ` [PATCH v4 11/16] ARM: dts: microchip: sama7d65: Add ADC node Varshini Rajendran
` (5 subsequent siblings)
15 siblings, 0 replies; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
Add CPU OPPs table for SAMA7D65.
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
---
arch/arm/boot/dts/microchip/sama7d65.dtsi | 36 +++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/arch/arm/boot/dts/microchip/sama7d65.dtsi b/arch/arm/boot/dts/microchip/sama7d65.dtsi
index ec200848c153..dfac17e34e65 100644
--- a/arch/arm/boot/dts/microchip/sama7d65.dtsi
+++ b/arch/arm/boot/dts/microchip/sama7d65.dtsi
@@ -35,6 +35,7 @@ cpu0: cpu@0 {
d-cache-size = <0x8000>; // L1, 32 KB
i-cache-size = <0x8000>; // L1, 32 KB
next-level-cache = <&L2>;
+ operating-points-v2 = <&cpu_opp_table>;
L2: l2-cache {
compatible = "cache";
@@ -45,6 +46,41 @@ L2: l2-cache {
};
};
+ cpu_opp_table: opp-table {
+ compatible = "operating-points-v2";
+
+ opp-90000000 {
+ opp-hz = /bits/ 64 <90000000>;
+ opp-microvolt = <1050000 1050000 1225000>;
+ clock-latency-ns = <320000>;
+ };
+
+ opp-250000000 {
+ opp-hz = /bits/ 64 <250000000>;
+ opp-microvolt = <1050000 1050000 1225000>;
+ clock-latency-ns = <320000>;
+ };
+
+ opp-600000000 {
+ opp-hz = /bits/ 64 <600000000>;
+ opp-microvolt = <1050000 1050000 1225000>;
+ clock-latency-ns = <320000>;
+ opp-suspend;
+ };
+
+ opp-800000000 {
+ opp-hz = /bits/ 64 <800000000>;
+ opp-microvolt = <1150000 1125000 1225000>;
+ clock-latency-ns = <320000>;
+ };
+
+ opp-1000000002 {
+ opp-hz = /bits/ 64 <1000000002>;
+ opp-microvolt = <1250000 1225000 1300000>;
+ clock-latency-ns = <320000>;
+ };
+ };
+
clocks {
main_xtal: clock-mainxtal {
compatible = "fixed-clock";
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread* [PATCH v4 11/16] ARM: dts: microchip: sama7d65: Add ADC node
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
` (9 preceding siblings ...)
2026-07-27 12:26 ` [PATCH v4 10/16] ARM: dts: microchip: sama7d65: add cpu opps Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
2026-07-27 12:26 ` [PATCH v4 12/16] ARM: dts: microchip: sama7d65_curiosity: Enable ADC, DVFS Varshini Rajendran
` (4 subsequent siblings)
15 siblings, 0 replies; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
Add node for the ADC controller in sama7d65 SoC. Add the vddout25 fixed
regulator node which provides the 2.5V reference voltage for the ADC.
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
---
arch/arm/boot/dts/microchip/sama7d65.dtsi | 28 +++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/arch/arm/boot/dts/microchip/sama7d65.dtsi b/arch/arm/boot/dts/microchip/sama7d65.dtsi
index dfac17e34e65..c35f27615bc4 100644
--- a/arch/arm/boot/dts/microchip/sama7d65.dtsi
+++ b/arch/arm/boot/dts/microchip/sama7d65.dtsi
@@ -11,6 +11,7 @@
#include <dt-bindings/clock/at91.h>
#include <dt-bindings/dma/at91.h>
#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/iio/adc/at91-sama5d2_adc.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/mfd/at91-usart.h>
@@ -95,6 +96,15 @@ slow_xtal: clock-slowxtal {
};
};
+ vddout25: fixed-regulator-vddout25 {
+ compatible = "regulator-fixed";
+ regulator-name = "VDDOUT25";
+ regulator-min-microvolt = <2500000>;
+ regulator-max-microvolt = <2500000>;
+ regulator-boot-on;
+ status = "disabled";
+ };
+
ns_sram: sram@100000 {
compatible = "mmio-sram";
reg = <0x100000 0x20000>;
@@ -296,6 +306,24 @@ can4: can@e0838000 {
status = "disabled";
};
+ adc: adc@e1000000 {
+ compatible = "microchip,sama7d65-adc";
+ reg = <0xe1000000 0x200>;
+ interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&pmc PMC_TYPE_GCK 25>;
+ clock-names = "adc_clk";
+ assigned-clocks = <&pmc PMC_TYPE_GCK 25>;
+ assigned-clock-rates = <100000000>;
+ dmas = <&dma0 AT91_XDMAC_DT_PERID(0)>;
+ dma-names = "rx";
+ #io-channel-cells = <1>;
+ atmel,min-sample-rate-hz = <200000>;
+ atmel,max-sample-rate-hz = <20000000>;
+ atmel,trigger-edge-type = <IRQ_TYPE_EDGE_RISING>;
+ atmel,startup-time-ms = <4>;
+ status = "disabled";
+ };
+
dma2: dma-controller@e1200000 {
compatible = "microchip,sama7d65-dma", "microchip,sama7g5-dma";
reg = <0xe1200000 0x1000>;
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread* [PATCH v4 12/16] ARM: dts: microchip: sama7d65_curiosity: Enable ADC, DVFS
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
` (10 preceding siblings ...)
2026-07-27 12:26 ` [PATCH v4 11/16] ARM: dts: microchip: sama7d65: Add ADC node Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
2026-07-27 12:26 ` [PATCH v4 13/16] ARM: dts: microchip: sama7d65: add otpc node Varshini Rajendran
` (3 subsequent siblings)
15 siblings, 0 replies; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
Enable ADC and DVFS on SAMA7D65 Curiosity board. Configure the necessary
power supply (vddana, vref) for the ADC, and enable cpu-supply for DVFS.
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
Reviewed-by: Claudiu Beznea <claudiu.beznea@tuxon.dev>
---
.../dts/microchip/at91-sama7d65_curiosity.dts | 27 +++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/arch/arm/boot/dts/microchip/at91-sama7d65_curiosity.dts b/arch/arm/boot/dts/microchip/at91-sama7d65_curiosity.dts
index 927c27260b6c..c2d1e5308170 100644
--- a/arch/arm/boot/dts/microchip/at91-sama7d65_curiosity.dts
+++ b/arch/arm/boot/dts/microchip/at91-sama7d65_curiosity.dts
@@ -79,6 +79,14 @@ reg_5v: regulator-5v {
};
};
+&adc {
+ vddana-supply = <&vddout25>;
+ vref-supply = <&vddout25>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_adc_default &pinctrl_adtrg_default>;
+ status = "okay";
+};
+
&can1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_can1_default>;
@@ -97,6 +105,10 @@ &can3 {
status = "okay";
};
+&cpu0 {
+ cpu-supply = <&vddcpu>;
+};
+
&dma0 {
status = "okay";
};
@@ -334,6 +346,16 @@ &main_xtal {
};
&pioa {
+ pinctrl_adc_default: adc-default {
+ pinmux = <PIN_PC5__GPIO>;
+ bias-disable;
+ };
+
+ pinctrl_adtrg_default: adtrg-default {
+ pinmux = <PIN_PB7__ADTRG>;
+ bias-pull-up;
+ };
+
pinctrl_can1_default: can1-default {
pinmux = <PIN_PD10__CANTX1>,
<PIN_PD11__CANRX1>;
@@ -457,3 +479,8 @@ input@0 {
&slow_xtal {
clock-frequency = <32768>;
};
+
+&vddout25 {
+ vin-supply = <&vdd_3v3>;
+ status = "okay";
+};
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread* [PATCH v4 13/16] ARM: dts: microchip: sama7d65: add otpc node
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
` (11 preceding siblings ...)
2026-07-27 12:26 ` [PATCH v4 12/16] ARM: dts: microchip: sama7d65_curiosity: Enable ADC, DVFS Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
2026-07-27 12:44 ` sashiko-bot
2026-07-27 12:26 ` [PATCH v4 14/16] ARM: dts: microchip: sama7d65: add cells for temperature calibration Varshini Rajendran
` (2 subsequent siblings)
15 siblings, 1 reply; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
Add OTPC node along with temperature calibration cell.
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
---
arch/arm/boot/dts/microchip/sama7d65.dtsi | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/arch/arm/boot/dts/microchip/sama7d65.dtsi b/arch/arm/boot/dts/microchip/sama7d65.dtsi
index c35f27615bc4..aac2e22d96cb 100644
--- a/arch/arm/boot/dts/microchip/sama7d65.dtsi
+++ b/arch/arm/boot/dts/microchip/sama7d65.dtsi
@@ -15,6 +15,7 @@
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/mfd/at91-usart.h>
+#include <dt-bindings/nvmem/microchip,sama7g5-otpc.h>
/ {
model = "Microchip SAMA7D65 family SoC";
@@ -1111,6 +1112,21 @@ ddr3phy: ddr3phy@e3804000 {
reg = <0xe3804000 0x1000>;
};
+ otpc: efuse@e8c00000 {
+ compatible = "microchip,sama7d65-otpc", "microchip,sama7g5-otpc", "syscon";
+ reg = <0xe8c00000 0x100>;
+
+ nvmem-layout {
+ compatible = "fixed-layout";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ temperature_calib: calib@41435354 {
+ reg = <0x41435354 0x2c>; /* Temp calib data packet TAG */
+ };
+ };
+ };
+
gic: interrupt-controller@e8c11000 {
compatible = "arm,cortex-a7-gic";
reg = <0xe8c11000 0x1000>,
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH v4 13/16] ARM: dts: microchip: sama7d65: add otpc node
2026-07-27 12:26 ` [PATCH v4 13/16] ARM: dts: microchip: sama7d65: add otpc node Varshini Rajendran
@ 2026-07-27 12:44 ` sashiko-bot
0 siblings, 0 replies; 27+ messages in thread
From: sashiko-bot @ 2026-07-27 12:44 UTC (permalink / raw)
To: Varshini Rajendran; +Cc: robh, conor+dt, devicetree
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Medium] The newly added `temperature_calib` NVMEM cell is not referenced by the `adc` node, causing the ADC driver to silently skip temperature sensor initialization.
- [Low] The `<dt-bindings/nvmem/microchip,sama7g5-otpc.h>` header is included but completely unused.
--
--- Patch [13]: [PATCH v4 13/16] ARM: dts: microchip: sama7d65: add otpc node ---
commit dd1db22ae5d7132965b472e571b6275cf5176e96
Author: Varshini Rajendran <varshini.rajendran@microchip.com>
ARM: dts: microchip: sama7d65: add otpc node
Add OTPC node along with temperature calibration cell.
> diff --git a/arch/arm/boot/dts/microchip/sama7d65.dtsi b/arch/arm/boot/dts/microchip/sama7d65.dtsi
> index c35f27615bc49..aac2e22d96cb3 100644
> --- a/arch/arm/boot/dts/microchip/sama7d65.dtsi
> +++ b/arch/arm/boot/dts/microchip/sama7d65.dtsi
> @@ -15,6 +15,7 @@
> #include <dt-bindings/interrupt-controller/arm-gic.h>
> #include <dt-bindings/interrupt-controller/irq.h>
> #include <dt-bindings/mfd/at91-usart.h>
> +#include <dt-bindings/nvmem/microchip,sama7g5-otpc.h>
[Severity: Low]
This isn't a bug, but should this header be included? It doesn't appear
to be used in this file, as the calibration cell uses a TAG-based NVMEM
access instead of the OTP_PKT() macro provided by this header.
>
> / {
> model = "Microchip SAMA7D65 family SoC";
> @@ -1111,6 +1112,21 @@ ddr3phy: ddr3phy@e3804000 {
> reg = <0xe3804000 0x1000>;
> };
>
> + otpc: efuse@e8c00000 {
> + compatible = "microchip,sama7d65-otpc", "microchip,sama7g5-otpc", "syscon";
> + reg = <0xe8c00000 0x100>;
> +
> + nvmem-layout {
> + compatible = "fixed-layout";
> + #address-cells = <1>;
> + #size-cells = <1>;
> +
> + temperature_calib: calib@41435354 {
> + reg = <0x41435354 0x2c>; /* Temp calib data packet TAG */
> + };
[Severity: Medium]
Should the adc@e1000000 node be updated to reference this newly added cell?
Without 'nvmem-cells = <&temperature_calib>;' and
'nvmem-cell-names = "temperature_calib";' properties in the adc node, the ADC
driver will silently skip temperature sensor initialization when it receives
-ENOENT from nvmem_cell_get().
> + };
> + };
> +
> gic: interrupt-controller@e8c11000 {
> compatible = "arm,cortex-a7-gic";
> reg = <0xe8c11000 0x1000>,
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260727122633.117435-1-varshini.rajendran@microchip.com?part=13
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v4 14/16] ARM: dts: microchip: sama7d65: add cells for temperature calibration
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
` (12 preceding siblings ...)
2026-07-27 12:26 ` [PATCH v4 13/16] ARM: dts: microchip: sama7d65: add otpc node Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
2026-07-27 12:50 ` sashiko-bot
2026-07-27 12:26 ` [PATCH v4 15/16] ARM: dts: microchip: sama7d65: add temperature sensor Varshini Rajendran
2026-07-27 12:26 ` [PATCH v4 16/16] ARM: dts: microchip: sama7d65: add thermal zones node Varshini Rajendran
15 siblings, 1 reply; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
Add nvmem-cells for temperature calibration data to the ADC node.
The calibration data is read from the OTPC.
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
Reviewed-by: Claudiu Beznea <claudiu.beznea@tuxon.dev>
---
arch/arm/boot/dts/microchip/sama7d65.dtsi | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/arm/boot/dts/microchip/sama7d65.dtsi b/arch/arm/boot/dts/microchip/sama7d65.dtsi
index aac2e22d96cb..a8b18ad0ef7f 100644
--- a/arch/arm/boot/dts/microchip/sama7d65.dtsi
+++ b/arch/arm/boot/dts/microchip/sama7d65.dtsi
@@ -318,6 +318,8 @@ adc: adc@e1000000 {
dmas = <&dma0 AT91_XDMAC_DT_PERID(0)>;
dma-names = "rx";
#io-channel-cells = <1>;
+ nvmem-cells = <&temperature_calib>;
+ nvmem-cell-names = "temperature_calib";
atmel,min-sample-rate-hz = <200000>;
atmel,max-sample-rate-hz = <20000000>;
atmel,trigger-edge-type = <IRQ_TYPE_EDGE_RISING>;
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH v4 14/16] ARM: dts: microchip: sama7d65: add cells for temperature calibration
2026-07-27 12:26 ` [PATCH v4 14/16] ARM: dts: microchip: sama7d65: add cells for temperature calibration Varshini Rajendran
@ 2026-07-27 12:50 ` sashiko-bot
0 siblings, 0 replies; 27+ messages in thread
From: sashiko-bot @ 2026-07-27 12:50 UTC (permalink / raw)
To: Varshini Rajendran; +Cc: devicetree, conor+dt, robh
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] The newly introduced DEFINE_FREE macro for nvmem_cell_put does not check for error pointers, causing a kernel panic when nvmem_cell_get fails.
- [Low] Adding `nvmem-cells` and `nvmem-cell-names` to the `microchip,sama7d65-adc` node without defining them in the corresponding YAML binding causes a schema validation failure.
--
--- Patch [14]: [PATCH v4 14/16] ARM: dts: microchip: sama7d65: add cells for temperature calibration ---
commit 696a7115c167bb7e7a6b827c0f8e5dd2a34541d5
Author: Varshini Rajendran <varshini.rajendran@microchip.com>
ARM: dts: microchip: sama7d65: add cells for temperature calibration
Add nvmem-cells for temperature calibration data to the ADC node.
The calibration data is read from the OTPC.
> diff --git a/arch/arm/boot/dts/microchip/sama7d65.dtsi b/arch/arm/boot/dts/microchip/sama7d65.dtsi
> index aac2e22d96cb3..a8b18ad0ef7f7 100644
> --- a/arch/arm/boot/dts/microchip/sama7d65.dtsi
> +++ b/arch/arm/boot/dts/microchip/sama7d65.dtsi
> @@ -318,6 +318,8 @@ adc: adc@e1000000 {
> dmas = <&dma0 AT91_XDMAC_DT_PERID(0)>;
> dma-names = "rx";
> #io-channel-cells = <1>;
> + nvmem-cells = <&temperature_calib>;
> + nvmem-cell-names = "temperature_calib";
[Severity: Low]
Will this cause a device tree schema validation failure?
The atmel,sama5d2-adc.yaml binding schema restricts properties via
additionalProperties: false and does not define or reference these nvmem
properties.
[Severity: High]
Does the driver correctly handle a missing temperature_calib nvmem cell?
If this cell is missing, nvmem_cell_get() returns -ENOENT, which is returned
by at91_adc_temp_sensor_init() in drivers/iio/adc/at91-sama5d2_adc.c.
The __free(nvmem_cell_put) macro executes on the ERR_PTR:
drivers/iio/adc/at91-sama5d2_adc.c:
DEFINE_FREE(nvmem_cell_put, struct nvmem_cell *, if (_T) nvmem_cell_put(_T))
Because this macro only checks if (_T) and not if (!IS_ERR_OR_NULL(_T)), it
passes the error pointer to nvmem_cell_put(), which unconditionally
dereferences it (cell->entry->nvmem) and causes a kernel panic.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260727122633.117435-1-varshini.rajendran@microchip.com?part=14
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v4 15/16] ARM: dts: microchip: sama7d65: add temperature sensor
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
` (13 preceding siblings ...)
2026-07-27 12:26 ` [PATCH v4 14/16] ARM: dts: microchip: sama7d65: add cells for temperature calibration Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
2026-07-27 12:45 ` sashiko-bot
2026-07-27 12:26 ` [PATCH v4 16/16] ARM: dts: microchip: sama7d65: add thermal zones node Varshini Rajendran
15 siblings, 1 reply; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
Add the generic-adc-thermal temperature sensor node for SAMA7D65.
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
Reviewed-by: Claudiu Beznea <claudiu.beznea@tuxon.dev>
---
arch/arm/boot/dts/microchip/sama7d65.dtsi | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/arch/arm/boot/dts/microchip/sama7d65.dtsi b/arch/arm/boot/dts/microchip/sama7d65.dtsi
index a8b18ad0ef7f..3aba73983c79 100644
--- a/arch/arm/boot/dts/microchip/sama7d65.dtsi
+++ b/arch/arm/boot/dts/microchip/sama7d65.dtsi
@@ -119,6 +119,13 @@ pmu {
interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
};
+ thermal_sensor: thermal-sensor {
+ compatible = "generic-adc-thermal";
+ #thermal-sensor-cells = <0>;
+ io-channels = <&adc AT91_SAMA7G5_ADC_TEMP_CHANNEL>;
+ io-channel-names = "sensor-channel";
+ };
+
soc {
compatible = "simple-bus";
ranges;
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread* Re: [PATCH v4 15/16] ARM: dts: microchip: sama7d65: add temperature sensor
2026-07-27 12:26 ` [PATCH v4 15/16] ARM: dts: microchip: sama7d65: add temperature sensor Varshini Rajendran
@ 2026-07-27 12:45 ` sashiko-bot
0 siblings, 0 replies; 27+ messages in thread
From: sashiko-bot @ 2026-07-27 12:45 UTC (permalink / raw)
To: Varshini Rajendran; +Cc: devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] The `generic-adc-thermal` node fails to probe due to a missing `thermal-zones` definition in the device tree.
--
--- Patch [15]: [PATCH v4 15/16] ARM: dts: microchip: sama7d65: add temperature sensor ---
commit c26d5d2aede7ab2e9e82e21d748fdf77a5266008
Author: Varshini Rajendran <varshini.rajendran@microchip.com>
ARM: dts: microchip: sama7d65: add temperature sensor
This commit adds a generic-adc-thermal temperature sensor node to the
SAMA7D65 device tree.
> diff --git a/arch/arm/boot/dts/microchip/sama7d65.dtsi b/arch/arm/boot/dts/microchip/sama7d65.dtsi
> --- a/arch/arm/boot/dts/microchip/sama7d65.dtsi
> +++ b/arch/arm/boot/dts/microchip/sama7d65.dtsi
[ ... ]
> @@ -119,6 +119,13 @@ pmu {
> interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
> };
>
> + thermal_sensor: thermal-sensor {
> + compatible = "generic-adc-thermal";
> + #thermal-sensor-cells = <0>;
> + io-channels = <&adc AT91_SAMA7G5_ADC_TEMP_CHANNEL>;
> + io-channel-names = "sensor-channel";
> + };
[Severity: Medium]
Will this generic-adc-thermal node fail to probe due to a missing
thermal-zones definition?
Looking at the generic-adc-thermal driver's gadc_thermal_probe(), it requires
the sensor to be linked within a thermal-zones block. It calls
devm_thermal_of_zone_register(), which returns -ENODEV when the thermal-zones
node is absent.
Since the thermal-zones node appears to be missing in sama7d65.dtsi, the
driver will treat this -ENODEV as a fatal error, log "Thermal zone sensor
register failed: -19", and abort probing. Should a thermal-zones definition
be added alongside this sensor?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260727122633.117435-1-varshini.rajendran@microchip.com?part=15
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v4 16/16] ARM: dts: microchip: sama7d65: add thermal zones node
2026-07-27 12:26 [PATCH v4 00/16] Add thermal management support for sama7d65 Varshini Rajendran
` (14 preceding siblings ...)
2026-07-27 12:26 ` [PATCH v4 15/16] ARM: dts: microchip: sama7d65: add temperature sensor Varshini Rajendran
@ 2026-07-27 12:26 ` Varshini Rajendran
15 siblings, 0 replies; 27+ messages in thread
From: Varshini Rajendran @ 2026-07-27 12:26 UTC (permalink / raw)
To: ehristev, jic23, dlechner, nuno.sa, andy, robh, krzk+dt, conor+dt,
nicolas.ferre, alexandre.belloni, claudiu.beznea, srini,
marcelo.schmitt, radu.sabau, Jonathan.Santos, jorge.marques,
joshua.crofts1, jishnu.prakash, antoniu.miclaus,
varshini.rajendran, mazziesaccount, linux-iio, devicetree,
linux-arm-kernel, linux-kernel
Add thermal zones node for SAMA7D65 with trip points for passive
cooling and critical shutdown.
Signed-off-by: Varshini Rajendran <varshini.rajendran@microchip.com>
Reviewed-by: Claudiu Beznea <claudiu.beznea@tuxon.dev>
---
arch/arm/boot/dts/microchip/sama7d65.dtsi | 42 +++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/arch/arm/boot/dts/microchip/sama7d65.dtsi b/arch/arm/boot/dts/microchip/sama7d65.dtsi
index 3aba73983c79..7743f9e8f692 100644
--- a/arch/arm/boot/dts/microchip/sama7d65.dtsi
+++ b/arch/arm/boot/dts/microchip/sama7d65.dtsi
@@ -16,6 +16,7 @@
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/mfd/at91-usart.h>
#include <dt-bindings/nvmem/microchip,sama7g5-otpc.h>
+#include <dt-bindings/thermal/thermal.h>
/ {
model = "Microchip SAMA7D65 family SoC";
@@ -38,6 +39,7 @@ cpu0: cpu@0 {
i-cache-size = <0x8000>; // L1, 32 KB
next-level-cache = <&L2>;
operating-points-v2 = <&cpu_opp_table>;
+ #cooling-cells = <2>; /* min followed by max */
L2: l2-cache {
compatible = "cache";
@@ -126,6 +128,46 @@ thermal_sensor: thermal-sensor {
io-channel-names = "sensor-channel";
};
+ thermal-zones {
+ cpu_thermal: cpu-thermal {
+ polling-delay-passive = <1000>;
+ polling-delay = <5000>;
+ thermal-sensors = <&thermal_sensor>;
+
+ trips {
+ cpu_normal: cpu-alert0 {
+ temperature = <90000>;
+ hysteresis = <0>;
+ type = "passive";
+ };
+
+ cpu_hot: cpu-alert1 {
+ temperature = <95000>;
+ hysteresis = <0>;
+ type = "passive";
+ };
+
+ cpu_critical: cpu-critical {
+ temperature = <100000>;
+ hysteresis = <0>;
+ type = "critical";
+ };
+ };
+
+ cooling-maps {
+ map0 {
+ trip = <&cpu_normal>;
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+ };
+
+ map1 {
+ trip = <&cpu_hot>;
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+ };
+ };
+ };
+ };
+
soc {
compatible = "simple-bus";
ranges;
--
2.34.1
^ permalink raw reply related [flat|nested] 27+ messages in thread