On Mon, 17 Jul 2017 12:00:35 +0300 Mykola Kostenok <c_mykolak@xxxxxxxxxxxx> wrote: > 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. > > v1 -> v2: > Pointed by Rick Altherr: > - Wait init sequence code enabled by bool > from OF match table. > > Reviewed-by: Rick Altherr <raltherr@xxxxxxxxxx> > > Signed-off-by: Mykola Kostenok <c_mykolak@xxxxxxxxxxxx> Applied to the fixes-togreg branch of iio.git and marked for stable. Thanks, Jonathan > --- > drivers/iio/adc/aspeed_adc.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/drivers/iio/adc/aspeed_adc.c b/drivers/iio/adc/aspeed_adc.c > index 2283ed2..cfa7ee1 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,11 +39,17 @@ > > #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 > unsigned int max_sampling_rate; // Hz > unsigned int vref_voltage; // mV > + bool wait_init_sequence; > }; > > struct aspeed_adc_data { > @@ -210,6 +217,24 @@ static int aspeed_adc_probe(struct platform_device *pdev) > goto scaler_error; > } > > + model_data = of_device_get_match_data(&pdev->dev); > + > + if (model_data->wait_init_sequence) { > + /* 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) | > @@ -269,6 +294,7 @@ static const struct aspeed_adc_model_data ast2500_model_data = { > .vref_voltage = 1800, // mV > .min_sampling_rate = 1, > .max_sampling_rate = 1000000, > + .wait_init_sequence = true, > }; > > static const struct of_device_id aspeed_adc_matches[] = { -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html