aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iio/adc
diff options
context:
space:
mode:
authorVignesh R <vigneshr@ti.com>2015-03-31 07:12:37 -0400
committerJonathan Cameron <jic23@kernel.org>2015-05-13 13:37:22 -0400
commit5dc11e810676ec4a5acb4423ccd33314bf74f4e5 (patch)
treef92aec2fa9e91a402200afdf8d5d90f2bcf5663e /drivers/iio/adc
parentfeca56ff400b7b166c86af9ff5c131d1d33cf615 (diff)
iio: adc: ti_am335x_adc: make sample delay, open delay, averaging DT parameters
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@ti.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'drivers/iio/adc')
-rw-r--r--drivers/iio/adc/ti_am335x_adc.c54
1 files changed, 48 insertions, 6 deletions
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 42e444044ea5..942320e32753 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -37,6 +37,7 @@ struct tiadc_device {
37 u8 channel_step[8]; 37 u8 channel_step[8];
38 int buffer_en_ch_steps; 38 int buffer_en_ch_steps;
39 u16 data[8]; 39 u16 data[8];
40 u32 open_delay[8], sample_delay[8], step_avg[8];
40}; 41};
41 42
42static unsigned int tiadc_readl(struct tiadc_device *adc, unsigned int reg) 43static 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)
85static void tiadc_step_config(struct iio_dev *indio_dev) 86static void tiadc_step_config(struct iio_dev *indio_dev)
86{ 87{
87 struct tiadc_device *adc_dev = iio_priv(indio_dev); 88 struct tiadc_device *adc_dev = iio_priv(indio_dev);
89 struct device *dev = adc_dev->mfd_tscadc->dev;
88 unsigned int stepconfig; 90 unsigned int stepconfig;
89 int i, steps = 0; 91 int i, steps = 0;
90 92
@@ -98,20 +100,47 @@ static void tiadc_step_config(struct iio_dev *indio_dev)
98 * needs to be given to ADC to digitalize data. 100 * needs to be given to ADC to digitalize data.
99 */ 101 */
100 102
101 if (iio_buffer_enabled(indio_dev))
102 stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1
103 | STEPCONFIG_MODE_SWCNT;
104 else
105 stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;
106 103
107 for (i = 0; i < adc_dev->channels; i++) { 104 for (i = 0; i < adc_dev->channels; i++) {
108 int chan; 105 int chan;
109 106
110 chan = adc_dev->channel_line[i]; 107 chan = adc_dev->channel_line[i];
108
109 if (adc_dev->step_avg[i] > STEPCONFIG_AVG_16) {
110 dev_warn(dev, "chan %d step_avg truncating to %d\n",
111 chan, STEPCONFIG_AVG_16);
112 adc_dev->step_avg[i] = STEPCONFIG_AVG_16;
113 }
114
115 if (adc_dev->step_avg[i])
116 stepconfig =
117 STEPCONFIG_AVG(ffs(adc_dev->step_avg[i]) - 1) |
118 STEPCONFIG_FIFO1;
119 else
120 stepconfig = STEPCONFIG_FIFO1;
121
122 if (iio_buffer_enabled(indio_dev))
123 stepconfig |= STEPCONFIG_MODE_SWCNT;
124
111 tiadc_writel(adc_dev, REG_STEPCONFIG(steps), 125 tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
112 stepconfig | STEPCONFIG_INP(chan)); 126 stepconfig | STEPCONFIG_INP(chan));
127
128 if (adc_dev->open_delay[i] > STEPDELAY_OPEN_MASK) {
129 dev_warn(dev, "chan %d open delay truncating to 0x3FFFF\n",
130 chan);
131 adc_dev->open_delay[i] = STEPDELAY_OPEN_MASK;
132 }
133
134 if (adc_dev->sample_delay[i] > 0xFF) {
135 dev_warn(dev, "chan %d sample delay truncating to 0xFF\n",
136 chan);
137 adc_dev->sample_delay[i] = 0xFF;
138 }
139
113 tiadc_writel(adc_dev, REG_STEPDELAY(steps), 140 tiadc_writel(adc_dev, REG_STEPDELAY(steps),
114 STEPCONFIG_OPENDLY); 141 STEPDELAY_OPEN(adc_dev->open_delay[i]) |
142 STEPDELAY_SAMPLE(adc_dev->sample_delay[i]));
143
115 adc_dev->channel_step[i] = steps; 144 adc_dev->channel_step[i] = steps;
116 steps++; 145 steps++;
117 } 146 }
@@ -406,9 +435,22 @@ static int tiadc_parse_dt(struct platform_device *pdev,
406 435
407 of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) { 436 of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
408 adc_dev->channel_line[channels] = val; 437 adc_dev->channel_line[channels] = val;
438
439 /* Set Default values for optional DT parameters */
440 adc_dev->open_delay[channels] = STEPCONFIG_OPENDLY;
441 adc_dev->sample_delay[channels] = STEPCONFIG_SAMPLEDLY;
442 adc_dev->step_avg[channels] = 16;
443
409 channels++; 444 channels++;
410 } 445 }
411 446
447 of_property_read_u32_array(node, "ti,chan-step-avg",
448 adc_dev->step_avg, channels);
449 of_property_read_u32_array(node, "ti,chan-step-opendelay",
450 adc_dev->open_delay, channels);
451 of_property_read_u32_array(node, "ti,chan-step-sampledelay",
452 adc_dev->sample_delay, channels);
453
412 adc_dev->channels = channels; 454 adc_dev->channels = channels;
413 return 0; 455 return 0;
414} 456}