Commit a405b00e4470b15ed062de97c4ce552d41a0a60b
Committed by
Jonathan Cameron
1 parent
7c3e8675f3
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
iio/adc: (max1363) Add support for external reference voltage
Implement external reference voltage as regulator named "vref". Signed-off-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Showing 1 changed file with 39 additions and 13 deletions Side-by-side Diff
drivers/iio/adc/max1363.c
... | ... | @@ -163,6 +163,8 @@ |
163 | 163 | * @mask_low: bitmask for enabled low thresholds |
164 | 164 | * @thresh_high: high threshold values |
165 | 165 | * @thresh_low: low threshold values |
166 | + * @vref: Reference voltage regulator | |
167 | + * @vref_uv: Actual (external or internal) reference voltage | |
166 | 168 | */ |
167 | 169 | struct max1363_state { |
168 | 170 | struct i2c_client *client; |
... | ... | @@ -182,6 +184,8 @@ |
182 | 184 | /* 4x unipolar first then the fours bipolar ones */ |
183 | 185 | s16 thresh_high[8]; |
184 | 186 | s16 thresh_low[8]; |
187 | + struct regulator *vref; | |
188 | + u32 vref_uv; | |
185 | 189 | }; |
186 | 190 | |
187 | 191 | #define MAX1363_MODE_SINGLE(_num, _mask) { \ |
... | ... | @@ -393,6 +397,8 @@ |
393 | 397 | { |
394 | 398 | struct max1363_state *st = iio_priv(indio_dev); |
395 | 399 | int ret; |
400 | + unsigned long scale_uv; | |
401 | + | |
396 | 402 | switch (m) { |
397 | 403 | case IIO_CHAN_INFO_RAW: |
398 | 404 | ret = max1363_read_single_chan(indio_dev, chan, val, m); |
... | ... | @@ -400,16 +406,10 @@ |
400 | 406 | return ret; |
401 | 407 | return IIO_VAL_INT; |
402 | 408 | case IIO_CHAN_INFO_SCALE: |
403 | - if ((1 << (st->chip_info->bits + 1)) > | |
404 | - st->chip_info->int_vref_mv) { | |
405 | - *val = 0; | |
406 | - *val2 = 500000; | |
407 | - return IIO_VAL_INT_PLUS_MICRO; | |
408 | - } else { | |
409 | - *val = (st->chip_info->int_vref_mv) | |
410 | - >> st->chip_info->bits; | |
411 | - return IIO_VAL_INT; | |
412 | - } | |
409 | + scale_uv = st->vref_uv >> st->chip_info->bits; | |
410 | + *val = scale_uv / 1000; | |
411 | + *val2 = (scale_uv % 1000) * 1000; | |
412 | + return IIO_VAL_INT_PLUS_MICRO; | |
413 | 413 | default: |
414 | 414 | return -EINVAL; |
415 | 415 | } |
416 | 416 | |
... | ... | @@ -1390,12 +1390,16 @@ |
1390 | 1390 | |
1391 | 1391 | static int max1363_initial_setup(struct max1363_state *st) |
1392 | 1392 | { |
1393 | - st->setupbyte = MAX1363_SETUP_AIN3_IS_AIN3_REF_IS_VDD | |
1394 | - | MAX1363_SETUP_POWER_UP_INT_REF | |
1395 | - | MAX1363_SETUP_INT_CLOCK | |
1393 | + st->setupbyte = MAX1363_SETUP_INT_CLOCK | |
1396 | 1394 | | MAX1363_SETUP_UNIPOLAR |
1397 | 1395 | | MAX1363_SETUP_NORESET; |
1398 | 1396 | |
1397 | + if (st->vref) | |
1398 | + st->setupbyte |= MAX1363_SETUP_AIN3_IS_REF_EXT_TO_REF; | |
1399 | + else | |
1400 | + st->setupbyte |= MAX1363_SETUP_POWER_UP_INT_REF | |
1401 | + | MAX1363_SETUP_AIN3_IS_AIN3_REF_IS_INT; | |
1402 | + | |
1399 | 1403 | /* Set scan mode writes the config anyway so wait until then */ |
1400 | 1404 | st->setupbyte = MAX1363_SETUP_BYTE(st->setupbyte); |
1401 | 1405 | st->current_mode = &max1363_mode_table[st->chip_info->default_mode]; |
... | ... | @@ -1491,6 +1495,7 @@ |
1491 | 1495 | int ret; |
1492 | 1496 | struct max1363_state *st; |
1493 | 1497 | struct iio_dev *indio_dev; |
1498 | + struct regulator *vref; | |
1494 | 1499 | |
1495 | 1500 | indio_dev = iio_device_alloc(sizeof(struct max1363_state)); |
1496 | 1501 | if (indio_dev == NULL) { |
... | ... | @@ -1521,6 +1526,23 @@ |
1521 | 1526 | st->chip_info = &max1363_chip_info_tbl[id->driver_data]; |
1522 | 1527 | st->client = client; |
1523 | 1528 | |
1529 | + st->vref_uv = st->chip_info->int_vref_mv * 1000; | |
1530 | + vref = devm_regulator_get(&client->dev, "vref"); | |
1531 | + if (!IS_ERR(vref)) { | |
1532 | + int vref_uv; | |
1533 | + | |
1534 | + ret = regulator_enable(vref); | |
1535 | + if (ret) | |
1536 | + goto error_disable_reg; | |
1537 | + st->vref = vref; | |
1538 | + vref_uv = regulator_get_voltage(vref); | |
1539 | + if (vref_uv <= 0) { | |
1540 | + ret = -EINVAL; | |
1541 | + goto error_disable_reg; | |
1542 | + } | |
1543 | + st->vref_uv = vref_uv; | |
1544 | + } | |
1545 | + | |
1524 | 1546 | ret = max1363_alloc_scan_masks(indio_dev); |
1525 | 1547 | if (ret) |
1526 | 1548 | goto error_disable_reg; |
... | ... | @@ -1562,6 +1584,8 @@ |
1562 | 1584 | error_uninit_buffer: |
1563 | 1585 | iio_triggered_buffer_cleanup(indio_dev); |
1564 | 1586 | error_disable_reg: |
1587 | + if (st->vref) | |
1588 | + regulator_disable(st->vref); | |
1565 | 1589 | regulator_disable(st->reg); |
1566 | 1590 | error_unregister_map: |
1567 | 1591 | iio_map_array_unregister(indio_dev); |
... | ... | @@ -1578,6 +1602,8 @@ |
1578 | 1602 | |
1579 | 1603 | iio_device_unregister(indio_dev); |
1580 | 1604 | iio_triggered_buffer_cleanup(indio_dev); |
1605 | + if (st->vref) | |
1606 | + regulator_disable(st->vref); | |
1581 | 1607 | regulator_disable(st->reg); |
1582 | 1608 | iio_map_array_unregister(indio_dev); |
1583 | 1609 | iio_device_free(indio_dev); |