Commit a405b00e4470b15ed062de97c4ce552d41a0a60b

Authored by Guenter Roeck
Committed by Jonathan Cameron
1 parent 7c3e8675f3

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);