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_show_mode(struct device *dev, struct device_attribute *attr, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); struct adc_device *adc_dev = iio_priv(indio_dev); unsigned int tmp; tmp = adc_readl(adc_dev, TSCADC_REG_STEPCONFIG(TOTAL_STEPS)); tmp &= TSCADC_STEPCONFIG_MODE(1); if (tmp == 0x00) return sprintf(buf, "oneshot\n"); else if (tmp == 0x01) return sprintf(buf, "continuous\n"); else return sprintf(buf, "Operation mode unknown\n"); }
static void tsc_step_config(struct tscadc *ts_dev) { unsigned int stepconfigx = 0, stepconfigy = 0; unsigned int delay, chargeconfig = 0; unsigned int stepconfigz1 = 0, stepconfigz2 = 0; int i; /* Configure the Step registers */ delay = TSCADC_STEPCONFIG_SAMPLEDLY | TSCADC_STEPCONFIG_OPENDLY; stepconfigx = TSCADC_STEPCONFIG_MODE_HWSYNC | TSCADC_STEPCONFIG_2SAMPLES_AVG | TSCADC_STEPCONFIG_XPP; switch (ts_dev->wires) { case 4: stepconfigx |= TSCADC_STEPCONFIG_INP | TSCADC_STEPCONFIG_XNN; break; case 5: stepconfigx |= TSCADC_STEPCONFIG_YNN | TSCADC_STEPCONFIG_INP_5 | TSCADC_STEPCONFIG_XNN | TSCADC_STEPCONFIG_YPP; break; case 8: stepconfigx |= TSCADC_STEPCONFIG_INP | TSCADC_STEPCONFIG_XNN; break; } for (i = 1; i < 7; i++) { tscadc_writel(ts_dev, TSCADC_REG_STEPCONFIG(i), stepconfigx); tscadc_writel(ts_dev, TSCADC_REG_STEPDELAY(i), delay); } stepconfigy = TSCADC_STEPCONFIG_MODE_HWSYNC | TSCADC_STEPCONFIG_2SAMPLES_AVG | TSCADC_STEPCONFIG_YNN | TSCADC_STEPCONFIG_INM | TSCADC_STEPCONFIG_FIFO1; switch (ts_dev->wires) { case 4: stepconfigy |= TSCADC_STEPCONFIG_YPP; break; case 5: stepconfigy |= TSCADC_STEPCONFIG_XPP | TSCADC_STEPCONFIG_INP_5 | TSCADC_STEPCONFIG_XNP | TSCADC_STEPCONFIG_YPN; break; case 8: stepconfigy |= TSCADC_STEPCONFIG_YPP; break; } for (i = 7; i < 13; i++) { tscadc_writel(ts_dev, TSCADC_REG_STEPCONFIG(i), stepconfigy); tscadc_writel(ts_dev, TSCADC_REG_STEPDELAY(i), delay); } chargeconfig = TSCADC_STEPCONFIG_XPP | TSCADC_STEPCONFIG_YNN | TSCADC_STEPCONFIG_RFP | TSCADC_STEPCHARGE_RFM | TSCADC_STEPCHARGE_INM | TSCADC_STEPCHARGE_INP; tscadc_writel(ts_dev, TSCADC_REG_CHARGECONFIG, chargeconfig); tscadc_writel(ts_dev, TSCADC_REG_CHARGEDELAY, TSCADC_STEPCHARGE_DELAY); /* Configure to calculate pressure */ stepconfigz1 = TSCADC_STEPCONFIG_MODE_HWSYNC | TSCADC_STEPCONFIG_2SAMPLES_AVG | TSCADC_STEPCONFIG_XNP | TSCADC_STEPCONFIG_YPN | TSCADC_STEPCONFIG_INM; stepconfigz2 = stepconfigz1 | TSCADC_STEPCONFIG_Z1 | TSCADC_STEPCONFIG_FIFO1; tscadc_writel(ts_dev, TSCADC_REG_STEPCONFIG13, stepconfigz1); tscadc_writel(ts_dev, TSCADC_REG_STEPDELAY13, delay); tscadc_writel(ts_dev, TSCADC_REG_STEPCONFIG14, stepconfigz2); tscadc_writel(ts_dev, TSCADC_REG_STEPDELAY14, delay); tscadc_writel(ts_dev, TSCADC_REG_SE, TSCADC_STPENB_STEPENB); }