14
14
#include <linux/spi/spi.h>
15
15
#include <linux/iio/iio.h>
16
16
#include <linux/of.h>
17
+ #include <linux/regulator/consumer.h>
17
18
18
19
/* MAX14001 registers definition */
19
20
#define MAX14001_REG_ADC 0x00
75
76
#define MAX14001_REG_WEN_WRITE_ENABLE 0x294
76
77
#define MAX14001_REG_WEN_WRITE_DISABLE 0x0
77
78
79
+ /* MAX14001 10-bit ADC */
80
+ #define MAX14001_NUMBER_OF_DATA_BITS 10
81
+ #define MAX14001_BIT_DIV (1 << 10)
82
+
78
83
enum max14001_chip_model {
79
84
max14001 ,
80
85
max14002 ,
@@ -97,9 +102,52 @@ static struct max14001_chip_info max14001_chip_info_tbl[] = {
97
102
struct max14001_state {
98
103
struct spi_device * spi ;
99
104
const struct max14001_chip_info * chip_info ;
105
+ int vref_mV ;
100
106
};
101
107
102
- static int max14001_spi_read (struct max14001_state * st , u16 reg , u16 * val )
108
+ static int max14001_get_scale (struct max14001_state * st )
109
+ {
110
+ int scale ;
111
+
112
+ /* scale = range / 2^10 */
113
+ scale = st -> vref_mV / MAX14001_BIT_DIV ;
114
+ return scale ;
115
+ }
116
+
117
+ static int max14001_get_vref_mV (struct max14001_state * st )
118
+ {
119
+ struct device * dev = & st -> spi -> dev ;
120
+ int ret = 0 ;
121
+
122
+ ret = devm_regulator_get_enable_read_voltage (dev , "vrefin" );
123
+ if (ret < 0 ){
124
+ st -> vref_mV = 1250000 / 1000 ;
125
+ dev_info (& st -> spi -> dev , "%s: vrefin not found. vref_mV %d\n" , __func__ , st -> vref_mV );
126
+ } else {
127
+ st -> vref_mV = ret / 1000 ;
128
+ dev_info (& st -> spi -> dev , "%s: vrefin found. vref_mV %d\n" , __func__ , st -> vref_mV );
129
+ }
130
+
131
+ return ret ;
132
+ }
133
+
134
+ static int max14001_init_required_regulators (struct max14001_state * st )
135
+ {
136
+ struct device * dev = & st -> spi -> dev ;
137
+ int ret = 0 ;
138
+
139
+ ret = devm_regulator_get_enable (dev , "vdd" );
140
+ if (ret )
141
+ return dev_err_probe (dev , ret , "Failed to enable specified Vdd supply\n" );
142
+
143
+ ret = devm_regulator_get_enable (dev , "vddl" );
144
+ if (ret )
145
+ return dev_err_probe (dev , ret , "Failed to enable specified Vddl supply\n" );
146
+
147
+ return ret ;
148
+ }
149
+
150
+ static int max14001_spi_read (struct max14001_state * st , u16 reg , int * val )
103
151
{
104
152
u16 tx , rx , reversed ;
105
153
int ret ;
@@ -116,7 +164,7 @@ static int max14001_spi_read(struct max14001_state *st, u16 reg, u16 *val)
116
164
117
165
/* TODO: Validate this line in the hw, could be le16_to_cpu */
118
166
reversed = bitrev16 (be16_to_cpu (rx ));
119
- * val = FIELD_GET (MAX14001_MASK_ADDR , reversed );
167
+ * val = FIELD_GET (MAX14001_MASK_DATA , reversed );
120
168
121
169
return ret ;
122
170
}
@@ -154,17 +202,17 @@ static int max14001_spi_write_single_reg(struct max14001_state *st, u16 reg, u16
154
202
{
155
203
int ret ;
156
204
157
- // Enable register write
205
+ /* Enable register write */
158
206
ret = max14001_spi_write (st , MAX14001_REG_WEN , MAX14001_REG_WEN_WRITE_ENABLE );
159
207
if (ret < 0 )
160
208
return ret ;
161
209
162
- // Write data into register
210
+ /* Write data into register */
163
211
ret = max14001_spi_write (st , reg , val );
164
212
if (ret < 0 )
165
213
return ret ;
166
214
167
- // Disable register write
215
+ /* Disable register write */
168
216
ret = max14001_spi_write (st , MAX14001_REG_WEN , MAX14001_REG_WEN_WRITE_DISABLE );
169
217
if (ret < 0 )
170
218
return ret ;
@@ -177,14 +225,30 @@ static int max14001_read_raw(struct iio_dev *indio_dev,
177
225
int * val , int * val2 , long mask )
178
226
{
179
227
struct max14001_state * st = iio_priv (indio_dev );
228
+ int ret ;
180
229
181
230
switch (mask ) {
182
231
case IIO_CHAN_INFO_RAW :
183
- dev_info (& st -> spi -> dev , "%s: IIO_CHAN_INFO_RAW\n" , __func__ );
232
+ ret = max14001_spi_read (st , MAX14001_REG_ADC , val );
233
+ dev_info (& st -> spi -> dev , "%s: IIO_CHAN_INFO_RAW: channel: %d, val: %d\n" , __func__ , chan -> channel , val );
234
+ if (ret < 0 )
235
+ return ret ;
236
+
184
237
return IIO_VAL_INT ;
185
- case IIO_CHAN_INFO_SCALE :
186
- dev_info (& st -> spi -> dev , "%s: IIO_CHAN_INFO_SCALE\n" , __func__ );
238
+ case IIO_CHAN_INFO_AVERAGE_RAW :
239
+ ret = max14001_spi_read (st , MAX14001_REG_FADC , val );
240
+ dev_info (& st -> spi -> dev , "%s: IIO_CHAN_INFO_AVERAGE_RAW: channel: %d, val: %d\n" , __func__ , chan -> channel , val );
241
+ if (ret < 0 )
242
+ return ret ;
243
+
187
244
return IIO_VAL_INT ;
245
+ case IIO_CHAN_INFO_SCALE :
246
+ ret = max14001_get_scale (st );
247
+ * val = ret ;
248
+ * val2 = MAX14001_NUMBER_OF_DATA_BITS ;
249
+ dev_info (& st -> spi -> dev , "%s: IIO_CHAN_INFO_SCALE: val: %d, val2: %d\n" , __func__ , val , val2 );
250
+
251
+ return IIO_VAL_FRACTIONAL_LOG2 ;
188
252
}
189
253
190
254
return - EINVAL ;
@@ -215,6 +279,7 @@ static const struct iio_chan_spec max14001_channel_voltage[] = {
215
279
.indexed = 1 ,
216
280
.channel = 0 ,
217
281
.info_mask_separate = BIT (IIO_CHAN_INFO_RAW ) |
282
+ BIT (IIO_CHAN_INFO_AVERAGE_RAW ) |
218
283
BIT (IIO_CHAN_INFO_SCALE ),
219
284
}
220
285
};
@@ -225,6 +290,7 @@ static const struct iio_chan_spec max14001_channel_current[] = {
225
290
.indexed = 1 ,
226
291
.channel = 0 ,
227
292
.info_mask_separate = BIT (IIO_CHAN_INFO_RAW ) |
293
+ BIT (IIO_CHAN_INFO_AVERAGE_RAW ) |
228
294
BIT (IIO_CHAN_INFO_SCALE ),
229
295
}
230
296
};
@@ -254,8 +320,6 @@ static int max14001_probe(struct spi_device *spi)
254
320
indio_dev -> modes = INDIO_DIRECT_MODE ;
255
321
indio_dev -> info = & max14001_info ;
256
322
257
- dev_info (& st -> spi -> dev , "%s: probe\n" , __func__ );
258
-
259
323
for_each_available_child_of_node_scoped (spi -> dev .of_node , child ) {
260
324
current_channel = of_property_read_bool (child , "current-channel" );
261
325
if (current_channel )
@@ -270,6 +334,11 @@ static int max14001_probe(struct spi_device *spi)
270
334
indio_dev -> num_channels = ARRAY_SIZE (max14001_channel_voltage );
271
335
}
272
336
337
+ dev_info (& st -> spi -> dev , "%s: probe\n" , __func__ );
338
+
339
+ max14001_init_required_regulators (st );
340
+ max14001_get_vref_mV (st );
341
+
273
342
return devm_iio_device_register (& spi -> dev , indio_dev );
274
343
}
275
344
0 commit comments