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 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); }