[PATCH linux dev-4.10] iio: aspeed-adc: wait for initial sequence.

Mykola Kostenok c_mykolak at mellanox.com
Fri Jul 14 00:28:56 AEST 2017


This patch enables adc engine at initialization time and waits
for the initial sequence completion before enabling adc channels.

Without this code adc channels are not functional and shows
zeros for all connected channels.

Tested on mellanox msn platform.

Signed-off-by: Mykola Kostenok <c_mykolak at mellanox.com>
---
 drivers/iio/adc/aspeed_adc.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/drivers/iio/adc/aspeed_adc.c b/drivers/iio/adc/aspeed_adc.c
index 2283ed2..e4ad6ef 100644
--- a/drivers/iio/adc/aspeed_adc.c
+++ b/drivers/iio/adc/aspeed_adc.c
@@ -22,6 +22,7 @@
 
 #include <linux/iio/iio.h>
 #include <linux/iio/driver.h>
+#include <linux/iopoll.h>
 
 #define ASPEED_RESOLUTION_BITS		10
 #define ASPEED_CLOCKS_PER_SAMPLE	12
@@ -38,6 +39,11 @@
 
 #define ASPEED_ENGINE_ENABLE		BIT(0)
 
+#define ASPEED_ADC_CTRL_INIT_RDY	BIT(8)
+
+#define ASPEED_ADC_INIT_POLLING_TIME	500
+#define ASPEED_ADC_INIT_TIMEOUT		500000
+
 struct aspeed_adc_model_data {
 	const char *model_name;
 	unsigned int min_sampling_rate;	// Hz
@@ -210,6 +216,20 @@ static int aspeed_adc_probe(struct platform_device *pdev)
 		goto scaler_error;
 	}
 
+	/* Enable engine in normal mode. */
+	writel(ASPEED_OPERATION_MODE_NORMAL | ASPEED_ENGINE_ENABLE,
+	       data->base + ASPEED_REG_ENGINE_CONTROL);
+
+	/* Wait for initial sequence complete. */
+	ret = readl_poll_timeout(data->base + ASPEED_REG_ENGINE_CONTROL,
+				 adc_engine_control_reg_val,
+				 adc_engine_control_reg_val &
+				 ASPEED_ADC_CTRL_INIT_RDY,
+				 ASPEED_ADC_INIT_POLLING_TIME,
+				 ASPEED_ADC_INIT_TIMEOUT);
+	if (ret)
+		goto scaler_error;
+
 	/* Start all channels in normal mode. */
 	clk_prepare_enable(data->clk_scaler->clk);
 	adc_engine_control_reg_val = GENMASK(31, 16) |
-- 
2.8.4



More information about the openbmc mailing list