On 13/05/15 08:42, Vignesh R wrote: > > > On Thursday 09 April 2015 07:49 PM, Jonathan Cameron wrote: >> On 31/03/15 12:12, Vignesh R wrote: >>> Add optional DT properties to set open delay, sample delay and number >>> of averages per sample for each adc step. Open delay, sample delay >>> and averaging are some of the parameters that affect the sampling rate >>> and accuracy of the sample. Making these parameters configurable via >>> DT will help in balancing speed vs accuracy. >>> >>> Signed-off-by: Vignesh R <vigneshr@xxxxxx> >> All looks fine to me, but I would ideally like a devicetree >> ack on this one. >> >> Jonathan > > Gentle ping... Thanks. Had forgotten about this one. Ah well, no device tree response... Applied to the togreg branch of iio.git, initially pushed out as testing. Thanks, Jonathan > > Regards > Vignesh >>> --- >>> .../bindings/input/touchscreen/ti-tsc-adc.txt | 24 ++++++++++ >>> drivers/iio/adc/ti_am335x_adc.c | 54 +++++++++++++++++++--- >>> 2 files changed, 72 insertions(+), 6 deletions(-) >>> >>> diff --git a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt >>> index 6c4fb34823d3..8aafbe87f0eb 100644 >>> --- a/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt >>> +++ b/Documentation/devicetree/bindings/input/touchscreen/ti-tsc-adc.txt >>> @@ -42,6 +42,27 @@ Optional properties: >>> hardware knob for adjusting the amount of "settling >>> time". >>> >>> +- child "adc" >>> + ti,chan-step-opendelay: List of open delays for each channel of >>> + ADC in the order of ti,adc-channels. The >>> + value corresponds to the number of ADC >>> + clock cycles to wait after applying the >>> + step configuration registers and before >>> + sending the start of ADC conversion. >>> + Maximum value is 0x3FFFF. >>> + ti,chan-step-sampledelay: List of sample delays for each channel >>> + of ADC in the order of ti,adc-channels. >>> + The value corresponds to the number of >>> + ADC clock cycles to sample (to hold >>> + start of conversion high). >>> + Maximum value is 0xFF. >>> + ti,chan-step-avg: Number of averages to be performed for each >>> + channel of ADC. If average is 16 then input >>> + is sampled 16 times and averaged to get more >>> + accurate value. This increases the time taken >>> + by ADC to generate a sample. Valid range is 0 >>> + average to 16 averages. Maximum value is 16. >>> + >>> Example: >>> tscadc: tscadc@44e0d000 { >>> compatible = "ti,am3359-tscadc"; >>> @@ -55,5 +76,8 @@ Example: >>> >>> adc { >>> ti,adc-channels = <4 5 6 7>; >>> + ti,chan-step-opendelay = <0x098 0x3ffff 0x098 0x0>; >>> + ti,chan-step-sampledelay = <0xff 0x0 0xf 0x0>; >>> + ti,chan-step-avg = <16 2 4 8>; >>> }; >>> } >>> diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c >>> index 2f818405ffbe..5ee597b4a1af 100644 >>> --- a/drivers/iio/adc/ti_am335x_adc.c >>> +++ b/drivers/iio/adc/ti_am335x_adc.c >>> @@ -37,6 +37,7 @@ struct tiadc_device { >>> u8 channel_step[8]; >>> int buffer_en_ch_steps; >>> u16 data[8]; >>> + u32 open_delay[8], sample_delay[8], step_avg[8]; >>> }; >>> >>> static unsigned int tiadc_readl(struct tiadc_device *adc, unsigned int reg) >>> @@ -85,6 +86,7 @@ static u32 get_adc_step_bit(struct tiadc_device *adc_dev, int chan) >>> static void tiadc_step_config(struct iio_dev *indio_dev) >>> { >>> struct tiadc_device *adc_dev = iio_priv(indio_dev); >>> + struct device *dev = adc_dev->mfd_tscadc->dev; >>> unsigned int stepconfig; >>> int i, steps = 0; >>> >>> @@ -98,20 +100,47 @@ static void tiadc_step_config(struct iio_dev *indio_dev) >>> * needs to be given to ADC to digitalize data. >>> */ >>> >>> - if (iio_buffer_enabled(indio_dev)) >>> - stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1 >>> - | STEPCONFIG_MODE_SWCNT; >>> - else >>> - stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1; >>> >>> for (i = 0; i < adc_dev->channels; i++) { >>> int chan; >>> >>> chan = adc_dev->channel_line[i]; >>> + >>> + if (adc_dev->step_avg[i] > STEPCONFIG_AVG_16) { >>> + dev_warn(dev, "chan %d step_avg truncating to %d\n", >>> + chan, STEPCONFIG_AVG_16); >>> + adc_dev->step_avg[i] = STEPCONFIG_AVG_16; >>> + } >>> + >>> + if (adc_dev->step_avg[i]) >>> + stepconfig = >>> + STEPCONFIG_AVG(ffs(adc_dev->step_avg[i]) - 1) | >>> + STEPCONFIG_FIFO1; >>> + else >>> + stepconfig = STEPCONFIG_FIFO1; >>> + >>> + if (iio_buffer_enabled(indio_dev)) >>> + stepconfig |= STEPCONFIG_MODE_SWCNT; >>> + >>> tiadc_writel(adc_dev, REG_STEPCONFIG(steps), >>> stepconfig | STEPCONFIG_INP(chan)); >>> + >>> + if (adc_dev->open_delay[i] > STEPDELAY_OPEN_MASK)alue corresponds to the number of ADC >>> + clock cycles to wait after applying the >>> + step configuration registers and before >>> + sending the start of ADC conversion. >>> + Maximum value is 0x3FFFF. >>> + ti,chan-step-sampledelay: List of sample delays for each channel >>> + of ADC in the order of ti,adc-channels. >>> + The value corresponds to the number of >>> + ADC clock cycles to sample (to hold >>> + start of conversion high). >>> + Maximum value is 0xFF. >>> + ti,chan-step-avg: Number of averages to be performed for each >>> + channel of ADC. If average is 16 then input >>> + is sampled 16 times and averaged to get more >>> + accurate value. This increases the time taken >>> + by ADC to generate a sample. Valid range is 0 >>> + average to 16 averages. Maximum value is 16. { >>> + dev_warn(dev, "chan %d open delay truncating to 0x3FFFF\n", >>> + chan); >>> + adc_dev->open_delay[i] = STEPDELAY_OPEN_MASK; >>> + } >>> + >>> + if (adc_dev->sample_delay[i] > 0xFF) { >>> + dev_warn(dev, "chan %d sample delay truncating to 0xFF\n", >>> + chan); >>> + adc_dev->sample_delay[i] = 0xFF; >>> + } >>> + >>> tiadc_writel(adc_dev, REG_STEPDELAY(steps), >>> - STEPCONFIG_OPENDLY); >>> + STEPDELAY_OPEN(adc_dev->open_delay[i]) | >>> + STEPDELAY_SAMPLE(adc_dev->sample_delay[i])); >>> + >>> adc_dev->channel_step[i] = steps; >>> steps++; >>> } >>> @@ -407,9 +436,22 @@ static int tiadc_parse_dt(struct platform_device *pdev, >>> >>> of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) { >>> adc_dev->channel_line[channels] = val; >>> + >>> + /* Set Default values for optional DT parameters */ >>> + adc_dev->open_delay[channels] = STEPCONFIG_OPENDLY; >>> + adc_dev->sample_delay[channels] = STEPCONFIG_SAMPLEDLY; >>> + adc_dev->step_avg[channels] = 16; >>> + >>> channels++; >>> } >>> >>> + of_property_read_u32_array(node, "ti,chan-step-avg", >>> + adc_dev->step_avg, channels); >>> + of_property_read_u32_array(node, "ti,chan-step-opendelay", >>> + adc_dev->open_delay, channels); >>> + of_property_read_u32_array(node, "ti,chan-step-sampledelay", >>> + adc_dev->sample_delay, channels); >>> + >>> adc_dev->channels = channels; >>> return 0; >>> } >>> >> > -- > 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 > -- 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