static void adc_step_config(struct adc_device *adc_dev, bool mode) { unsigned int stepconfig; int i, channels = 0, steps; /* * There are 16 configurable steps and 8 analog input * lines available which are shared between Touchscreen and ADC. * * Steps backwards i.e. from 16 towards 0 are used by ADC * depending on number of input lines needed. * Channel would represent which analog input * needs to be given to ADC to digitalize data. */ steps = TOTAL_STEPS - adc_dev->channels; channels = TOTAL_CHANNELS - adc_dev->channels; if (mode == 0) stepconfig = TSCADC_STEPCONFIG_AVG_16 | TSCADC_STEPCONFIG_FIFO1; else stepconfig = TSCADC_STEPCONFIG_AVG_16 | TSCADC_STEPCONFIG_FIFO1 | TSCADC_STEPCONFIG_MODE_SWCNT; for (i = (steps + 1); i <= TOTAL_STEPS; i++) { adc_writel(adc_dev, TSCADC_REG_STEPCONFIG(i), stepconfig | TSCADC_STEPCONFIG_INP(channels)); adc_writel(adc_dev, TSCADC_REG_STEPDELAY(i), TSCADC_STEPCONFIG_OPENDLY); channels++; } }
static ssize_t tiadc_set_mode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct iio_dev *indio_dev = dev_get_drvdata(dev); struct adc_device *adc_dev = iio_priv(indio_dev); unsigned int config; config = adc_readl(adc_dev, TSCADC_REG_CTRL); config &= ~(TSCADC_CNTRLREG_TSCSSENB); adc_writel(adc_dev, TSCADC_REG_CTRL, config); if (!strncmp(buf, "oneshot", 7)) adc_dev->is_continuous_mode = false; else if (!strncmp(buf, "continuous", 10)) adc_dev->is_continuous_mode = true; else { dev_err(dev, "Operational mode unknown\n"); return -EINVAL; } adc_step_config(adc_dev, adc_dev->is_continuous_mode); config = adc_readl(adc_dev, TSCADC_REG_CTRL); adc_writel(adc_dev, TSCADC_REG_CTRL, (config | TSCADC_CNTRLREG_TSCSSENB)); return count; }
static void rk30_adc_start(struct adc_host *adc) { struct rk30_adc_device *dev = adc_priv(adc); int chn = adc->chn; //adc_writel(0, dev->regs + ADC_CTRL); adc_writel(0x08, dev->regs + ADC_DELAY_PU_SOC); adc_writel(ADC_CTRL_POWER_UP|ADC_CTRL_CH(chn)|ADC_CTRL_IRQ_ENABLE, dev->regs + ADC_CTRL); return; }
static void rk30_adc_stop(struct adc_host *adc) { struct rk30_adc_device *dev = adc_priv(adc); adc_writel(0, dev->regs + ADC_CTRL); }