[PATCH 5/8] iio: adc: rzt2h: Prepare for SoCs without sample state registers

From: Prabhakar

Date: Tue Sep 29 2026 - 08:48:28 EST


From: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx>

Prepare the driver for SoCs that use the same ADC IP without the
per-channel sample state registers present on RZ/T2H.

Add a feature flag for the sample state registers and make the sampling
frequency handling conditional on their presence. Allow each SoC to
provide its own sampling frequency calculation and configure the existing
RZ/T2H support to use the sample state registers and corresponding
calculation.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx>
---
drivers/iio/adc/rzt2h_adc.c | 22 +++++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/drivers/iio/adc/rzt2h_adc.c b/drivers/iio/adc/rzt2h_adc.c
index 4726f892da23..cf34895928f1 100644
--- a/drivers/iio/adc/rzt2h_adc.c
+++ b/drivers/iio/adc/rzt2h_adc.c
@@ -60,9 +60,13 @@
#define RZT2H_ADC_STOP_CYCLES 2

#define RZT2H_ADC_FEATURE_CALIBRATION BIT(0)
+#define RZT2H_ADC_FEATURE_SAMPLE_STATE BIT(1)
+
+struct rzt2h_adc;

struct rzt2h_adc_chip_info {
const struct iio_chan_spec *chan_template;
+ int (*sst_to_freq)(struct rzt2h_adc *adc, u8 sst);
unsigned int num_channels;
u8 features;
};
@@ -146,6 +150,9 @@ static void rzt2h_adc_stop(struct rzt2h_adc *adc)

static void rzt2h_adc_set_sst(struct rzt2h_adc *adc, unsigned int ch, u8 sst)
{
+ if (!(adc->chip_info->features & RZT2H_ADC_FEATURE_SAMPLE_STATE))
+ return;
+
writeb(sst, adc->base + RZT2H_ADSSTRn(ch));
}

@@ -526,7 +533,7 @@ static int rzt2h_adc_read_raw(struct iio_dev *indio_dev,
*val2 = 12;
return IIO_VAL_FRACTIONAL_LOG2;
case IIO_CHAN_INFO_SAMP_FREQ:
- *val = rzt2h_adc_sst_to_freq(adc, adc->sst[chan->channel]);
+ *val = adc->chip_info->sst_to_freq(adc, adc->sst[chan->channel]);
return IIO_VAL_INT;
default:
return -EINVAL;
@@ -541,6 +548,8 @@ static int rzt2h_adc_write_raw(struct iio_dev *indio_dev,

switch (mask) {
case IIO_CHAN_INFO_SAMP_FREQ: {
+ if (!(adc->chip_info->features & RZT2H_ADC_FEATURE_SAMPLE_STATE))
+ return -EINVAL;
if (val <= 0)
return -EINVAL;

@@ -730,9 +739,11 @@ static int rzt2h_adc_probe(struct platform_device *pdev)
if (!adc->adclk_rate)
return dev_err_probe(dev, -EINVAL, "invalid adclk rate\n");

- adc->samp_freq_avail[0] = rzt2h_adc_sst_to_freq(adc, RZT2H_ADC_SST_MAX);
- adc->samp_freq_avail[1] = 1;
- adc->samp_freq_avail[2] = rzt2h_adc_sst_to_freq(adc, RZT2H_ADC_SST_MIN);
+ if (chip_info->features & RZT2H_ADC_FEATURE_SAMPLE_STATE) {
+ adc->samp_freq_avail[0] = chip_info->sst_to_freq(adc, RZT2H_ADC_SST_MAX);
+ adc->samp_freq_avail[1] = 1;
+ adc->samp_freq_avail[2] = chip_info->sst_to_freq(adc, RZT2H_ADC_SST_MIN);
+ }

pm_runtime_set_autosuspend_delay(dev, 300);
pm_runtime_use_autosuspend(dev);
@@ -763,8 +774,9 @@ static int rzt2h_adc_probe(struct platform_device *pdev)

static const struct rzt2h_adc_chip_info rzt2h_adc_info = {
.chan_template = &rzt2h_adc_chan_template,
+ .sst_to_freq = rzt2h_adc_sst_to_freq,
.num_channels = 16,
- .features = RZT2H_ADC_FEATURE_CALIBRATION,
+ .features = RZT2H_ADC_FEATURE_CALIBRATION | RZT2H_ADC_FEATURE_SAMPLE_STATE,
};

static const struct of_device_id rzt2h_adc_match[] = {
--
2.55.0