1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright 2022 Analog Devices Inc.
8 #include <linux/bitfield.h>
9 #include <linux/bits.h>
10 #include <linux/device.h>
11 #include <linux/iio/iio.h>
12 #include <linux/module.h>
13 #include <linux/regmap.h>
14 #include <linux/regulator/consumer.h>
15 #include <linux/spi/spi.h>
17 #include <linux/unaligned.h>
19 /* ADA4250 Register Map */
20 #define ADA4250_REG_GAIN_MUX 0x00
21 #define ADA4250_REG_REFBUF_EN 0x01
22 #define ADA4250_REG_RESET 0x02
23 #define ADA4250_REG_SNSR_CAL_VAL 0x04
24 #define ADA4250_REG_SNSR_CAL_CNFG 0x05
25 #define ADA4250_REG_DIE_REV 0x18
26 #define ADA4250_REG_CHIP_ID 0x19
28 /* ADA4250_REG_GAIN_MUX Map */
29 #define ADA4250_GAIN_MUX_MSK GENMASK(2, 0)
31 /* ADA4250_REG_REFBUF Map */
32 #define ADA4250_REFBUF_MSK BIT(0)
34 /* ADA4250_REG_RESET Map */
35 #define ADA4250_RESET_MSK BIT(0)
37 /* ADA4250_REG_SNSR_CAL_VAL Map */
38 #define ADA4250_CAL_CFG_BIAS_MSK GENMASK(7, 0)
40 /* ADA4250_REG_SNSR_CAL_CNFG Bit Definition */
41 #define ADA4250_BIAS_SET_MSK GENMASK(3, 2)
42 #define ADA4250_RANGE_SET_MSK GENMASK(1, 0)
44 /* Miscellaneous definitions */
45 #define ADA4250_CHIP_ID 0x4250
46 #define ADA4250_RANGE1 0
47 #define ADA4250_RANGE4 3
49 /* ADA4250 current bias set */
50 enum ada4250_current_bias
{
51 ADA4250_BIAS_DISABLED
,
56 struct ada4250_state
{
57 struct spi_device
*spi
;
58 struct regmap
*regmap
;
59 struct regulator
*reg
;
60 /* Protect against concurrent accesses to the device and data content */
68 /* ADA4250 Current Bias Source Settings: Disabled, Bandgap Reference, AVDD */
69 static const int calibbias_table
[] = {0, 1, 2};
71 /* ADA4250 Gain (V/V) values: 1, 2, 4, 8, 16, 32, 64, 128 */
72 static const int hwgain_table
[] = {1, 2, 4, 8, 16, 32, 64, 128};
74 static const struct regmap_config ada4250_regmap_config
= {
77 .read_flag_mask
= BIT(7),
81 static int ada4250_set_offset_uv(struct iio_dev
*indio_dev
,
82 const struct iio_chan_spec
*chan
,
85 struct ada4250_state
*st
= iio_priv(indio_dev
);
87 int i
, ret
, x
[8], max_vos
, min_vos
, voltage_v
, vlsb
= 0;
88 u8 offset_raw
, range
= ADA4250_RANGE1
;
89 u32 lsb_coeff
[6] = {1333, 2301, 4283, 8289, 16311, 31599};
91 if (st
->bias
== 0 || st
->bias
== 3)
94 voltage_v
= regulator_get_voltage(st
->reg
);
95 voltage_v
= DIV_ROUND_CLOSEST(voltage_v
, 1000000);
97 if (st
->bias
== ADA4250_BIAS_AVDD
)
102 x
[1] = 126 * (x
[0] - 1);
104 for (i
= 0; i
< 6; i
++)
105 x
[i
+ 2] = DIV_ROUND_CLOSEST(x
[1] * 1000, lsb_coeff
[i
]);
111 * Compute Range and Voltage per LSB for the Sensor Offset Calibration
112 * Example of computation for Range 1 and Range 2 (Curren Bias Set = AVDD):
114 * Gain | Max Vos(mV) | LSB(mV) | Max Vos(mV) | LSB(mV) |
115 * 2 | X1*127 | X1=0.126(AVDD-1) | X1*3*127 | X1*3 |
116 * 4 | X2*127 | X2=X1/1.3333 | X2*3*127 | X2*3 |
117 * 8 | X3*127 | X3=X1/2.301 | X3*3*127 | X3*3 |
118 * 16 | X4*127 | X4=X1/4.283 | X4*3*127 | X4*3 |
119 * 32 | X5*127 | X5=X1/8.289 | X5*3*127 | X5*3 |
120 * 64 | X6*127 | X6=X1/16.311 | X6*3*127 | X6*3 |
121 * 128 | X7*127 | X7=X1/31.599 | X7*3*127 | X7*3 |
123 for (i
= ADA4250_RANGE1
; i
<= ADA4250_RANGE4
; i
++) {
124 max_vos
= x
[st
->gain
] * 127 * ((1 << (i
+ 1)) - 1);
125 min_vos
= -1 * max_vos
;
126 if (offset_uv
> min_vos
&& offset_uv
< max_vos
) {
128 vlsb
= x
[st
->gain
] * ((1 << (i
+ 1)) - 1);
136 offset_raw
= DIV_ROUND_CLOSEST(abs(offset_uv
), vlsb
);
138 mutex_lock(&st
->lock
);
139 ret
= regmap_update_bits(st
->regmap
, ADA4250_REG_SNSR_CAL_CNFG
,
140 ADA4250_RANGE_SET_MSK
,
141 FIELD_PREP(ADA4250_RANGE_SET_MSK
, range
));
145 st
->offset_uv
= offset_raw
* vlsb
;
148 * To set the offset calibration value, use bits [6:0] and bit 7 as the
149 * polarity bit (set to "0" for a negative offset and "1" for a positive
153 offset_raw
|= BIT(7);
154 st
->offset_uv
*= (-1);
157 ret
= regmap_write(st
->regmap
, ADA4250_REG_SNSR_CAL_VAL
, offset_raw
);
160 mutex_unlock(&st
->lock
);
165 static int ada4250_read_raw(struct iio_dev
*indio_dev
,
166 struct iio_chan_spec
const *chan
,
167 int *val
, int *val2
, long info
)
169 struct ada4250_state
*st
= iio_priv(indio_dev
);
173 case IIO_CHAN_INFO_HARDWAREGAIN
:
174 ret
= regmap_read(st
->regmap
, ADA4250_REG_GAIN_MUX
, val
);
181 case IIO_CHAN_INFO_OFFSET
:
182 *val
= st
->offset_uv
;
185 case IIO_CHAN_INFO_CALIBBIAS
:
186 ret
= regmap_read(st
->regmap
, ADA4250_REG_SNSR_CAL_CNFG
, val
);
190 *val
= FIELD_GET(ADA4250_BIAS_SET_MSK
, *val
);
193 case IIO_CHAN_INFO_SCALE
:
197 return IIO_VAL_FRACTIONAL
;
203 static int ada4250_write_raw(struct iio_dev
*indio_dev
,
204 struct iio_chan_spec
const *chan
,
205 int val
, int val2
, long info
)
207 struct ada4250_state
*st
= iio_priv(indio_dev
);
211 case IIO_CHAN_INFO_HARDWAREGAIN
:
212 ret
= regmap_write(st
->regmap
, ADA4250_REG_GAIN_MUX
,
213 FIELD_PREP(ADA4250_GAIN_MUX_MSK
, ilog2(val
)));
217 st
->gain
= ilog2(val
);
220 case IIO_CHAN_INFO_OFFSET
:
221 return ada4250_set_offset_uv(indio_dev
, chan
, val
);
222 case IIO_CHAN_INFO_CALIBBIAS
:
223 ret
= regmap_update_bits(st
->regmap
, ADA4250_REG_SNSR_CAL_CNFG
,
224 ADA4250_BIAS_SET_MSK
,
225 FIELD_PREP(ADA4250_BIAS_SET_MSK
, val
));
237 static int ada4250_read_avail(struct iio_dev
*indio_dev
,
238 struct iio_chan_spec
const *chan
,
239 const int **vals
, int *type
, int *length
,
243 case IIO_CHAN_INFO_CALIBBIAS
:
244 *vals
= calibbias_table
;
246 *length
= ARRAY_SIZE(calibbias_table
);
248 return IIO_AVAIL_LIST
;
249 case IIO_CHAN_INFO_HARDWAREGAIN
:
250 *vals
= hwgain_table
;
252 *length
= ARRAY_SIZE(hwgain_table
);
254 return IIO_AVAIL_LIST
;
260 static int ada4250_reg_access(struct iio_dev
*indio_dev
,
262 unsigned int write_val
,
263 unsigned int *read_val
)
265 struct ada4250_state
*st
= iio_priv(indio_dev
);
268 return regmap_read(st
->regmap
, reg
, read_val
);
270 return regmap_write(st
->regmap
, reg
, write_val
);
273 static const struct iio_info ada4250_info
= {
274 .read_raw
= ada4250_read_raw
,
275 .write_raw
= ada4250_write_raw
,
276 .read_avail
= &ada4250_read_avail
,
277 .debugfs_reg_access
= &ada4250_reg_access
,
280 static const struct iio_chan_spec ada4250_channels
[] = {
286 .info_mask_separate
= BIT(IIO_CHAN_INFO_HARDWAREGAIN
) |
287 BIT(IIO_CHAN_INFO_OFFSET
) |
288 BIT(IIO_CHAN_INFO_CALIBBIAS
) |
289 BIT(IIO_CHAN_INFO_SCALE
),
290 .info_mask_separate_available
= BIT(IIO_CHAN_INFO_CALIBBIAS
) |
291 BIT(IIO_CHAN_INFO_HARDWAREGAIN
),
295 static void ada4250_reg_disable(void *data
)
297 regulator_disable(data
);
300 static int ada4250_init(struct ada4250_state
*st
)
304 u8 data
[2] __aligned(8) = {};
305 struct spi_device
*spi
= st
->spi
;
307 st
->refbuf_en
= device_property_read_bool(&spi
->dev
, "adi,refbuf-enable");
309 st
->reg
= devm_regulator_get(&spi
->dev
, "avdd");
311 return dev_err_probe(&spi
->dev
, PTR_ERR(st
->reg
),
312 "failed to get the AVDD voltage\n");
314 ret
= regulator_enable(st
->reg
);
316 dev_err(&spi
->dev
, "Failed to enable specified AVDD supply\n");
320 ret
= devm_add_action_or_reset(&spi
->dev
, ada4250_reg_disable
, st
->reg
);
324 ret
= regmap_write(st
->regmap
, ADA4250_REG_RESET
,
325 FIELD_PREP(ADA4250_RESET_MSK
, 1));
329 ret
= regmap_bulk_read(st
->regmap
, ADA4250_REG_CHIP_ID
, data
, 2);
333 chip_id
= get_unaligned_le16(data
);
335 if (chip_id
!= ADA4250_CHIP_ID
) {
336 dev_err(&spi
->dev
, "Invalid chip ID.\n");
340 return regmap_write(st
->regmap
, ADA4250_REG_REFBUF_EN
,
341 FIELD_PREP(ADA4250_REFBUF_MSK
, st
->refbuf_en
));
344 static int ada4250_probe(struct spi_device
*spi
)
346 struct iio_dev
*indio_dev
;
347 struct regmap
*regmap
;
348 struct ada4250_state
*st
;
351 indio_dev
= devm_iio_device_alloc(&spi
->dev
, sizeof(*st
));
355 regmap
= devm_regmap_init_spi(spi
, &ada4250_regmap_config
);
357 return PTR_ERR(regmap
);
359 st
= iio_priv(indio_dev
);
363 indio_dev
->info
= &ada4250_info
;
364 indio_dev
->name
= "ada4250";
365 indio_dev
->channels
= ada4250_channels
;
366 indio_dev
->num_channels
= ARRAY_SIZE(ada4250_channels
);
368 mutex_init(&st
->lock
);
370 ret
= ada4250_init(st
);
372 dev_err(&spi
->dev
, "ADA4250 init failed\n");
376 return devm_iio_device_register(&spi
->dev
, indio_dev
);
379 static const struct spi_device_id ada4250_id
[] = {
383 MODULE_DEVICE_TABLE(spi
, ada4250_id
);
385 static const struct of_device_id ada4250_of_match
[] = {
386 { .compatible
= "adi,ada4250" },
389 MODULE_DEVICE_TABLE(of
, ada4250_of_match
);
391 static struct spi_driver ada4250_driver
= {
394 .of_match_table
= ada4250_of_match
,
396 .probe
= ada4250_probe
,
397 .id_table
= ada4250_id
,
399 module_spi_driver(ada4250_driver
);
401 MODULE_AUTHOR("Antoniu Miclaus <antoniu.miclaus@analog.com");
402 MODULE_DESCRIPTION("Analog Devices ADA4250");
403 MODULE_LICENSE("GPL v2");