aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars-Peter Clausen <lars@metafoo.de>2012-11-21 11:27:00 -0500
committerJonathan Cameron <jic23@kernel.org>2012-11-30 07:57:07 -0500
commitd21f30c99e7c46cceb19f45e378a8d6a0a707428 (patch)
treef48da2cfe6e897cb6d748f546183e2eadcbeff03
parentfe2e0d5228aa170fa725c2cb02cf423838c30bb3 (diff)
staging:iio:ad7793: Rework platform data
Currently the platform data for the ad7793 consist just out of the raw default register settings. This has some downsides, for one we actually don't want to make all bits configurable and secondly not all register settings are actually valid. This patch exposes all the options which should be configurable via platform data as induvidual platform data struct fields. This also allows us to document the different settings via proper kernel doc. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
-rw-r--r--drivers/staging/iio/adc/ad7793.c25
-rw-r--r--drivers/staging/iio/adc/ad7793.h107
2 files changed, 123 insertions, 9 deletions
diff --git a/drivers/staging/iio/adc/ad7793.c b/drivers/staging/iio/adc/ad7793.c
index 843550ddc2ea..ec0fbd43f4ee 100644
--- a/drivers/staging/iio/adc/ad7793.c
+++ b/drivers/staging/iio/adc/ad7793.c
@@ -118,6 +118,12 @@ static int ad7793_setup(struct iio_dev *indio_dev,
118 unsigned long long scale_uv; 118 unsigned long long scale_uv;
119 u32 id; 119 u32 id;
120 120
121 if ((pdata->current_source_direction == AD7793_IEXEC1_IEXEC2_IOUT1 ||
122 pdata->current_source_direction == AD7793_IEXEC1_IEXEC2_IOUT2) &&
123 ((pdata->exitation_current != AD7793_IX_10uA) &&
124 (pdata->exitation_current != AD7793_IX_210uA)))
125 return -EINVAL;
126
121 /* reset the serial interface */ 127 /* reset the serial interface */
122 ret = spi_write(st->sd.spi, (u8 *)&ret, sizeof(ret)); 128 ret = spi_write(st->sd.spi, (u8 *)&ret, sizeof(ret));
123 if (ret < 0) 129 if (ret < 0)
@@ -136,8 +142,18 @@ static int ad7793_setup(struct iio_dev *indio_dev,
136 goto out; 142 goto out;
137 } 143 }
138 144
139 st->mode = pdata->mode; 145 st->mode = AD7793_MODE_RATE(1);
140 st->conf = pdata->conf; 146 st->mode |= AD7793_MODE_CLKSRC(pdata->clock_src);
147 st->conf = AD7793_CONF_REFSEL(pdata->refsel);
148 st->conf |= AD7793_CONF_VBIAS(pdata->bias_voltage);
149 if (pdata->buffered)
150 st->conf |= AD7793_CONF_BUF;
151 if (pdata->boost_enable)
152 st->conf |= AD7793_CONF_BOOST;
153 if (pdata->burnout_current)
154 st->conf |= AD7793_CONF_BO_EN;
155 if (pdata->unipolar)
156 st->conf |= AD7793_CONF_UNIPOLAR;
141 157
142 ret = ad7793_set_mode(&st->sd, AD_SD_MODE_IDLE); 158 ret = ad7793_set_mode(&st->sd, AD_SD_MODE_IDLE);
143 if (ret) 159 if (ret)
@@ -147,8 +163,9 @@ static int ad7793_setup(struct iio_dev *indio_dev,
147 if (ret) 163 if (ret)
148 goto out; 164 goto out;
149 165
150 ret = ad_sd_write_reg(&st->sd, AD7793_REG_IO, 166 ret = ad_sd_write_reg(&st->sd, AD7793_REG_IO, 1,
151 sizeof(pdata->io), pdata->io); 167 pdata->exitation_current |
168 (pdata->current_source_direction << 2));
152 if (ret) 169 if (ret)
153 goto out; 170 goto out;
154 171
diff --git a/drivers/staging/iio/adc/ad7793.h b/drivers/staging/iio/adc/ad7793.h
index 8fdd450a2cd9..9e905906da2f 100644
--- a/drivers/staging/iio/adc/ad7793.h
+++ b/drivers/staging/iio/adc/ad7793.h
@@ -68,7 +68,7 @@
68#define AD7793_CONF_UNIPOLAR (1 << 12) /* Unipolar/Bipolar Enable */ 68#define AD7793_CONF_UNIPOLAR (1 << 12) /* Unipolar/Bipolar Enable */
69#define AD7793_CONF_BOOST (1 << 11) /* Boost Enable */ 69#define AD7793_CONF_BOOST (1 << 11) /* Boost Enable */
70#define AD7793_CONF_GAIN(x) (((x) & 0x7) << 8) /* Gain Select */ 70#define AD7793_CONF_GAIN(x) (((x) & 0x7) << 8) /* Gain Select */
71#define AD7793_CONF_REFSEL (1 << 7) /* INT/EXT Reference Select */ 71#define AD7793_CONF_REFSEL(x) ((x) << 6) /* INT/EXT Reference Select */
72#define AD7793_CONF_BUF (1 << 4) /* Buffered Mode Enable */ 72#define AD7793_CONF_BUF (1 << 4) /* Buffered Mode Enable */
73#define AD7793_CONF_CHAN(x) ((x) & 0xf) /* Channel select */ 73#define AD7793_CONF_CHAN(x) ((x) & 0xf) /* Channel select */
74#define AD7793_CONF_CHAN_MASK 0xf /* Channel select mask */ 74#define AD7793_CONF_CHAN_MASK 0xf /* Channel select mask */
@@ -105,11 +105,108 @@
105#define AD7793_IO_IXCEN_210uA (2 << 0) /* Excitation Current 210uA */ 105#define AD7793_IO_IXCEN_210uA (2 << 0) /* Excitation Current 210uA */
106#define AD7793_IO_IXCEN_1mA (3 << 0) /* Excitation Current 1mA */ 106#define AD7793_IO_IXCEN_1mA (3 << 0) /* Excitation Current 1mA */
107 107
108/**
109 * enum ad7793_clock_source - AD7793 clock source selection
110 * @AD7793_CLK_SRC_INT: Internal 64 kHz clock, not available at the CLK pin.
111 * @AD7793_CLK_SRC_INT_CO: Internal 64 kHz clock, available at the CLK pin.
112 * @AD7793_CLK_SRC_EXT: Use external clock.
113 * @AD7793_CLK_SRC_EXT_DIV2: Use external clock divided by 2.
114 */
115enum ad7793_clock_source {
116 AD7793_CLK_SRC_INT,
117 AD7793_CLK_SRC_INT_CO,
118 AD7793_CLK_SRC_EXT,
119 AD7793_CLK_SRC_EXT_DIV2,
120};
121
122/**
123 * enum ad7793_bias_voltage - AD7793 bias voltage selection
124 * @AD7793_BIAS_VOLTAGE_DISABLED: Bias voltage generator disabled
125 * @AD7793_BIAS_VOLTAGE_AIN1: Bias voltage connected to AIN1(-).
126 * @AD7793_BIAS_VOLTAGE_AIN2: Bias voltage connected to AIN2(-).
127 * @AD7793_BIAS_VOLTAGE_AIN3: Bias voltage connected to AIN3(-).
128 * Only valid for AD7795/AD7796.
129 */
130enum ad7793_bias_voltage {
131 AD7793_BIAS_VOLTAGE_DISABLED,
132 AD7793_BIAS_VOLTAGE_AIN1,
133 AD7793_BIAS_VOLTAGE_AIN2,
134 AD7793_BIAS_VOLTAGE_AIN3,
135};
136
137/**
138 * enum ad7793_refsel - AD7793 reference voltage selection
139 * @AD7793_REFSEL_REFIN1: External reference applied between REFIN1(+)
140 * and REFIN1(-).
141 * @AD7793_REFSEL_REFIN2: External reference applied between REFIN2(+) and
142 * and REFIN1(-). Only valid for AD7795/AD7796.
143 * @AD7793_REFSEL_INTERNAL: Internal 1.17 V reference.
144 */
145enum ad7793_refsel {
146 AD7793_REFSEL_REFIN1 = 0,
147 AD7793_REFSEL_REFIN2 = 1,
148 AD7793_REFSEL_INTERNAL = 2,
149};
150
151/**
152 * enum ad7793_current_source_direction - AD7793 excitation current direction
153 * @AD7793_IEXEC1_IOUT1_IEXEC2_IOUT2: Current source IEXC1 connected to pin
154 * IOUT1, current source IEXC2 connected to pin IOUT2.
155 * @AD7793_IEXEC1_IOUT2_IEXEC2_IOUT1: Current source IEXC2 connected to pin
156 * IOUT1, current source IEXC1 connected to pin IOUT2.
157 * @AD7793_IEXEC1_IEXEC2_IOUT1: Both current sources connected to pin IOUT1.
158 * Only valid when the current sources are set to 10 uA or 210 uA.
159 * @AD7793_IEXEC1_IEXEC2_IOUT2: Both current sources connected to Pin IOUT2.
160 * Only valid when the current ources are set to 10 uA or 210 uA.
161 */
162enum ad7793_current_source_direction {
163 AD7793_IEXEC1_IOUT1_IEXEC2_IOUT2 = 0,
164 AD7793_IEXEC1_IOUT2_IEXEC2_IOUT1 = 1,
165 AD7793_IEXEC1_IEXEC2_IOUT1 = 2,
166 AD7793_IEXEC1_IEXEC2_IOUT2 = 3,
167};
168
169/**
170 * enum ad7793_excitation_current - AD7793 excitation current selection
171 * @AD7793_IX_DISABLED: Excitation current Disabled.
172 * @AD7793_IX_10uA: Enable 10 micro-ampere excitation current.
173 * @AD7793_IX_210uA: Enable 210 micro-ampere excitation current.
174 * @AD7793_IX_1mA: Enable 1 milli-Ampere excitation current.
175 */
176enum ad7793_excitation_current {
177 AD7793_IX_DISABLED = 0,
178 AD7793_IX_10uA = 1,
179 AD7793_IX_210uA = 2,
180 AD7793_IX_1mA = 3,
181};
182
183/**
184 * struct ad7793_platform_data - AD7793 platform data
185 * @vref_mv: Reference voltage in milli-Volt
186 * @clock_src: Clock source selection
187 * @burnout_current: If set to true the 100nA burnout current is enabled.
188 * @boost_enable: Enable boost for the bias voltage generator.
189 * @buffered: If set to true configure the device for buffered input mode.
190 * @unipolar: If set to true sample in unipolar mode, if set to false sample in
191 * bipolar mode.
192 * @refsel: Reference voltage selection
193 * @bias_voltage: Bias voltage selection
194 * @exitation_current: Excitation current selection
195 * @current_source_direction: Excitation current direction selection
196 */
108struct ad7793_platform_data { 197struct ad7793_platform_data {
109 u16 vref_mv; 198 u16 vref_mv;
110 u16 mode; 199
111 u16 conf; 200 enum ad7793_clock_source clock_src;
112 u8 io; 201 bool burnout_current;
202 bool boost_enable;
203 bool buffered;
204 bool unipolar;
205
206 enum ad7793_refsel refsel;
207 enum ad7793_bias_voltage bias_voltage;
208 enum ad7793_excitation_current exitation_current;
209 enum ad7793_current_source_direction current_source_direction;
113}; 210};
114 211
115#endif /* IIO_ADC_AD7793_H_ */ 212#endif /* IIO_ADC_AD7793_H_ */