[PATCH v2 4/6] iio: adc: ade9000: gate the DICOEFF write behind a chip_info flag

Antoniu Miclaus <[email protected]>
Newsgroups org.kernel.vger.linux-doc,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-iio,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
Some parts in the ADE9000 family have no on-chip digital integrator and
therefore lack the DICOEFF register; they use an external analog integrator
for Rogowski coil current sensors. Prepare for such parts by adding a
has_digital_integrator flag to the chip_info and only writing DICOEFF when
it is set.

Move the DICOEFF and RUN writes out of the shared initialization sequence
into ade9000_setup() so DICOEFF can be issued conditionally while RUN still
starts the DSP afterwards. All currently supported parts set the flag, so
there is no functional change.

Signed-off-by: Antoniu Miclaus <[email protected]>
---
Changes in v2:
- new precursor patch, split out of the ADE9430 support patch.

 drivers/iio/adc/ade9000.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/adc/ade9000.c b/drivers/iio/adc/ade9000.c
index ce0317766698..0167d5bcdb74 100644
--- a/drivers/iio/adc/ade9000.c
+++ b/drivers/iio/adc/ade9000.c
@@ -290,6 +290,7 @@ enum ade9000_wfb_cfg {
  * @rms_full_scale_codes: digital code produced at full-scale RMS input
  * @watt_full_scale_codes: digital code produced at full-scale power input
  * @pcf_full_scale_codes: digital code produced at full-scale xI_PCF/xV_PCF input
+ * @has_digital_integrator: part has an on-chip digital integrator (DICOEFF)
  *
  * The full-scale codes are taken from the respective datasheets and are used to
  * derive the IIO scale of the raw measurement channels.
@@ -301,6 +302,7 @@ struct ade9000_chip_info {
 	unsigned int rms_full_scale_codes;
 	unsigned int watt_full_scale_codes;
 	unsigned int pcf_full_scale_codes;
+	bool has_digital_integrator;
 };
 
 struct ade9000_state {
@@ -680,6 +682,7 @@ static const struct ade9000_chip_info ade9000_chip_info = {
 	.rms_full_scale_codes = 52702092,
 	.watt_full_scale_codes = 20694066,
 	.pcf_full_scale_codes = 74532013,
+	.has_digital_integrator = true,
 };
 
 static const struct ade9000_chip_info ade9078_chip_info = {
@@ -689,6 +692,7 @@ static const struct ade9000_chip_info ade9078_chip_info = {
 	.rms_full_scale_codes = 52866837,
 	.watt_full_scale_codes = 20823646,
 	.pcf_full_scale_codes = 74680000,
+	.has_digital_integrator = true,
 };
 
 static const struct reg_sequence ade9000_initialization_sequence[] = {
@@ -704,13 +708,11 @@ static const struct reg_sequence ade9000_initialization_sequence[] = {
 	{ ADE9000_REG_EVENT_MASK, ADE9000_EVENT_DISABLE },
 	{ ADE9000_REG_WFB_CFG, ADE9000_WFB_CFG },
 	{ ADE9000_REG_VLEVEL, ADE9000_VLEVEL },
-	{ ADE9000_REG_DICOEFF, ADE9000_DICOEFF },
 	{ ADE9000_REG_EGY_TIME, ADE9000_EGY_TIME },
 	{ ADE9000_REG_EP_CFG, ADE9000_EP_CFG },
 	/* Clear all pending status bits by writing 1s */
 	{ ADE9000_REG_STATUS0, GENMASK(31, 0) },
 	{ ADE9000_REG_STATUS1, GENMASK(31, 0) },
-	{ ADE9000_REG_RUN, ADE9000_RUN_ON }
 };
 
 static int ade9000_spi_write_reg(void *context, unsigned int reg,
@@ -1672,6 +1674,21 @@ static int ade9000_setup(struct ade9000_state *st)
 	if (ret)
 		return dev_err_probe(dev, ret, "Failed to write register sequence");
 
+	/*
+	 * DICOEFF must be configured before the DSP is started. Parts without
+	 * an on-chip digital integrator lack this register, so skip it there.
+	 */
+	if (st->info->has_digital_integrator) {
+		ret = regmap_write(st->regmap, ADE9000_REG_DICOEFF,
+				   ADE9000_DICOEFF);
+		if (ret)
+			return dev_err_probe(dev, ret, "Failed to set DICOEFF\n");
+	}
+
+	ret = regmap_write(st->regmap, ADE9000_REG_RUN, ADE9000_RUN_ON);
+	if (ret)
+		return dev_err_probe(dev, ret, "Failed to start DSP\n");
+
 	fsleep(2000);
 
 	return 0;
-- 
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.