linux/drivers/iio/adc/max9611.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * iio/adc/max9611.c
   4 *
   5 * Maxim max9611/max9612 high side current sense amplifier with
   6 * 12-bit ADC interface.
   7 *
   8 * Copyright (C) 2017 Jacopo Mondi
   9 */
  10
  11/*
  12 * This driver supports input common-mode voltage, current-sense
  13 * amplifier with programmable gains and die temperature reading from
  14 * Maxim max9611/max9612.
  15 *
  16 * Op-amp, analog comparator, and watchdog functionalities are not
  17 * supported by this driver.
  18 */
  19
  20#include <linux/delay.h>
  21#include <linux/i2c.h>
  22#include <linux/iio/iio.h>
  23#include <linux/iio/sysfs.h>
  24#include <linux/module.h>
  25#include <linux/mod_devicetable.h>
  26#include <linux/property.h>
  27
  28#define DRIVER_NAME                     "max9611"
  29
  30/* max9611 register addresses */
  31#define MAX9611_REG_CSA_DATA            0x00
  32#define MAX9611_REG_RS_DATA             0x02
  33#define MAX9611_REG_TEMP_DATA           0x08
  34#define MAX9611_REG_CTRL1               0x0a
  35#define MAX9611_REG_CTRL2               0x0b
  36
  37/* max9611 REG1 mux configuration options */
  38#define MAX9611_MUX_MASK                GENMASK(3, 0)
  39#define MAX9611_MUX_SENSE_1x            0x00
  40#define MAX9611_MUX_SENSE_4x            0x01
  41#define MAX9611_MUX_SENSE_8x            0x02
  42#define MAX9611_INPUT_VOLT              0x03
  43#define MAX9611_MUX_TEMP                0x06
  44
  45/* max9611 voltage (both csa and input) helper macros */
  46#define MAX9611_VOLTAGE_SHIFT           0x04
  47#define MAX9611_VOLTAGE_RAW(_r)         ((_r) >> MAX9611_VOLTAGE_SHIFT)
  48
  49/*
  50 * max9611 current sense amplifier voltage output:
  51 * LSB and offset values depends on selected gain (1x, 4x, 8x)
  52 *
  53 * GAIN         LSB (nV)        OFFSET (LSB steps)
  54 * 1x           107500          1
  55 * 4x           26880           1
  56 * 8x           13440           3
  57 *
  58 * The complete formula to calculate current sense voltage is:
  59 *     (((adc_read >> 4) - offset) / ((1 / LSB) * 10^-3)
  60 */
  61#define MAX9611_CSA_1X_LSB_nV           107500
  62#define MAX9611_CSA_4X_LSB_nV           26880
  63#define MAX9611_CSA_8X_LSB_nV           13440
  64
  65#define MAX9611_CSA_1X_OFFS_RAW         1
  66#define MAX9611_CSA_4X_OFFS_RAW         1
  67#define MAX9611_CSA_8X_OFFS_RAW         3
  68
  69/*
  70 * max9611 common input mode (CIM): LSB is 14mV, with 14mV offset at 25 C
  71 *
  72 * The complete formula to calculate input common voltage is:
  73 *     (((adc_read >> 4) * 1000) - offset) / (1 / 14 * 1000)
  74 */
  75#define MAX9611_CIM_LSB_mV              14
  76#define MAX9611_CIM_OFFSET_RAW          1
  77
  78/*
  79 * max9611 temperature reading: LSB is 480 milli degrees Celsius
  80 *
  81 * The complete formula to calculate temperature is:
  82 *     ((adc_read >> 7) * 1000) / (1 / 480 * 1000)
  83 */
  84#define MAX9611_TEMP_MAX_POS            0x7f80
  85#define MAX9611_TEMP_MAX_NEG            0xff80
  86#define MAX9611_TEMP_MIN_NEG            0xd980
  87#define MAX9611_TEMP_MASK               GENMASK(15, 7)
  88#define MAX9611_TEMP_SHIFT              0x07
  89#define MAX9611_TEMP_RAW(_r)            ((_r) >> MAX9611_TEMP_SHIFT)
  90#define MAX9611_TEMP_SCALE_NUM          1000000
  91#define MAX9611_TEMP_SCALE_DIV          2083
  92
  93/*
  94 * Conversion time is 2 ms (typically) at Ta=25 degreeC
  95 * No maximum value is known, so play it safe.
  96 */
  97#define MAX9611_CONV_TIME_US_RANGE      3000, 3300
  98
  99struct max9611_dev {
 100        struct device *dev;
 101        struct i2c_client *i2c_client;
 102        struct mutex lock;
 103        unsigned int shunt_resistor_uohm;
 104};
 105
 106enum max9611_conf_ids {
 107        CONF_SENSE_1x,
 108        CONF_SENSE_4x,
 109        CONF_SENSE_8x,
 110        CONF_IN_VOLT,
 111        CONF_TEMP,
 112};
 113
 114/*
 115 * max9611_mux_conf - associate ADC mux configuration with register address
 116 *                    where data shall be read from
 117 */
 118static const unsigned int max9611_mux_conf[][2] = {
 119        [CONF_SENSE_1x] = { MAX9611_MUX_SENSE_1x, MAX9611_REG_CSA_DATA },
 120        [CONF_SENSE_4x] = { MAX9611_MUX_SENSE_4x, MAX9611_REG_CSA_DATA },
 121        [CONF_SENSE_8x] = { MAX9611_MUX_SENSE_8x, MAX9611_REG_CSA_DATA },
 122        [CONF_IN_VOLT]  = { MAX9611_INPUT_VOLT, MAX9611_REG_RS_DATA },
 123        [CONF_TEMP]     = { MAX9611_MUX_TEMP, MAX9611_REG_TEMP_DATA },
 124};
 125
 126enum max9611_csa_gain {
 127        CSA_GAIN_1x = CONF_SENSE_1x,
 128        CSA_GAIN_4x = CONF_SENSE_4x,
 129        CSA_GAIN_8x = CONF_SENSE_8x,
 130};
 131
 132enum max9611_csa_gain_params {
 133        CSA_GAIN_LSB_nV,
 134        CSA_GAIN_OFFS_RAW,
 135};
 136
 137/*
 138 * max9611_csa_gain_conf - associate gain multiplier with LSB and
 139 *                         offset values.
 140 *
 141 * Group together parameters associated with configurable gain
 142 * on current sense amplifier path to ADC interface.
 143 * Current sense read routine adjusts gain until it gets a meaningful
 144 * value; use this structure to retrieve the correct LSB and offset values.
 145 */
 146static const unsigned int max9611_gain_conf[][2] = {
 147        [CSA_GAIN_1x] = { MAX9611_CSA_1X_LSB_nV, MAX9611_CSA_1X_OFFS_RAW, },
 148        [CSA_GAIN_4x] = { MAX9611_CSA_4X_LSB_nV, MAX9611_CSA_4X_OFFS_RAW, },
 149        [CSA_GAIN_8x] = { MAX9611_CSA_8X_LSB_nV, MAX9611_CSA_8X_OFFS_RAW, },
 150};
 151
 152enum max9611_chan_addrs {
 153        MAX9611_CHAN_VOLTAGE_INPUT,
 154        MAX9611_CHAN_VOLTAGE_SENSE,
 155        MAX9611_CHAN_TEMPERATURE,
 156        MAX9611_CHAN_CURRENT_LOAD,
 157        MAX9611_CHAN_POWER_LOAD,
 158};
 159
 160static const struct iio_chan_spec max9611_channels[] = {
 161        {
 162          .type                 = IIO_TEMP,
 163          .info_mask_separate   = BIT(IIO_CHAN_INFO_RAW) |
 164                                  BIT(IIO_CHAN_INFO_SCALE),
 165          .address              = MAX9611_CHAN_TEMPERATURE,
 166        },
 167        {
 168          .type                 = IIO_VOLTAGE,
 169          .info_mask_separate   = BIT(IIO_CHAN_INFO_PROCESSED),
 170          .address              = MAX9611_CHAN_VOLTAGE_SENSE,
 171          .indexed              = 1,
 172          .channel              = 0,
 173        },
 174        {
 175          .type                 = IIO_VOLTAGE,
 176          .info_mask_separate   = BIT(IIO_CHAN_INFO_RAW)   |
 177                                  BIT(IIO_CHAN_INFO_SCALE) |
 178                                  BIT(IIO_CHAN_INFO_OFFSET),
 179          .address              = MAX9611_CHAN_VOLTAGE_INPUT,
 180          .indexed              = 1,
 181          .channel              = 1,
 182        },
 183        {
 184          .type                 = IIO_CURRENT,
 185          .info_mask_separate   = BIT(IIO_CHAN_INFO_PROCESSED),
 186          .address              = MAX9611_CHAN_CURRENT_LOAD,
 187        },
 188        {
 189          .type                 = IIO_POWER,
 190          .info_mask_separate   = BIT(IIO_CHAN_INFO_PROCESSED),
 191          .address              = MAX9611_CHAN_POWER_LOAD
 192        },
 193};
 194
 195/**
 196 * max9611_read_single() - read a single value from ADC interface
 197 *
 198 * Data registers are 16 bit long, spread between two 8 bit registers
 199 * with consecutive addresses.
 200 * Configure ADC mux first, then read register at address "reg_addr".
 201 * The smbus_read_word routine asks for 16 bits and the ADC is kind enough
 202 * to return values from "reg_addr" and "reg_addr + 1" consecutively.
 203 * Data are transmitted with big-endian ordering: MSB arrives first.
 204 *
 205 * @max9611: max9611 device
 206 * @selector: index for mux and register configuration
 207 * @raw_val: the value returned from ADC
 208 */
 209static int max9611_read_single(struct max9611_dev *max9611,
 210                               enum max9611_conf_ids selector,
 211                               u16 *raw_val)
 212{
 213        int ret;
 214
 215        u8 mux_conf = max9611_mux_conf[selector][0] & MAX9611_MUX_MASK;
 216        u8 reg_addr = max9611_mux_conf[selector][1];
 217
 218        /*
 219         * Keep mutex lock held during read-write to avoid mux register
 220         * (CTRL1) re-configuration.
 221         */
 222        mutex_lock(&max9611->lock);
 223        ret = i2c_smbus_write_byte_data(max9611->i2c_client,
 224                                        MAX9611_REG_CTRL1, mux_conf);
 225        if (ret) {
 226                dev_err(max9611->dev, "i2c write byte failed: 0x%2x - 0x%2x\n",
 227                        MAX9611_REG_CTRL1, mux_conf);
 228                mutex_unlock(&max9611->lock);
 229                return ret;
 230        }
 231
 232        /* need a delay here to make register configuration stabilize. */
 233
 234        usleep_range(MAX9611_CONV_TIME_US_RANGE);
 235
 236        ret = i2c_smbus_read_word_swapped(max9611->i2c_client, reg_addr);
 237        if (ret < 0) {
 238                dev_err(max9611->dev, "i2c read word from 0x%2x failed\n",
 239                        reg_addr);
 240                mutex_unlock(&max9611->lock);
 241                return ret;
 242        }
 243
 244        *raw_val = ret;
 245        mutex_unlock(&max9611->lock);
 246
 247        return 0;
 248}
 249
 250/**
 251 * max9611_read_csa_voltage() - read current sense amplifier output voltage
 252 *
 253 * Current sense amplifier output voltage is read through a configurable
 254 * 1x, 4x or 8x gain.
 255 * Start with plain 1x gain, and adjust gain control properly until a
 256 * meaningful value is read from ADC output.
 257 *
 258 * @max9611: max9611 device
 259 * @adc_raw: raw value read from ADC output
 260 * @csa_gain: gain configuration option selector
 261 */
 262static int max9611_read_csa_voltage(struct max9611_dev *max9611,
 263                                    u16 *adc_raw,
 264                                    enum max9611_csa_gain *csa_gain)
 265{
 266        enum max9611_conf_ids gain_selectors[] = {
 267                CONF_SENSE_1x,
 268                CONF_SENSE_4x,
 269                CONF_SENSE_8x
 270        };
 271        unsigned int i;
 272        int ret;
 273
 274        for (i = 0; i < ARRAY_SIZE(gain_selectors); ++i) {
 275                ret = max9611_read_single(max9611, gain_selectors[i], adc_raw);
 276                if (ret)
 277                        return ret;
 278
 279                if (*adc_raw > 0) {
 280                        *csa_gain = (enum max9611_csa_gain)gain_selectors[i];
 281                        return 0;
 282                }
 283        }
 284
 285        return -EIO;
 286}
 287
 288static int max9611_read_raw(struct iio_dev *indio_dev,
 289                            struct iio_chan_spec const *chan,
 290                            int *val, int *val2, long mask)
 291{
 292        struct max9611_dev *dev = iio_priv(indio_dev);
 293        enum max9611_csa_gain gain_selector;
 294        const unsigned int *csa_gain;
 295        u16 adc_data;
 296        int ret;
 297
 298        switch (mask) {
 299        case IIO_CHAN_INFO_RAW:
 300
 301                switch (chan->address) {
 302                case MAX9611_CHAN_TEMPERATURE:
 303                        ret = max9611_read_single(dev, CONF_TEMP,
 304                                                  &adc_data);
 305                        if (ret)
 306                                return -EINVAL;
 307
 308                        *val = MAX9611_TEMP_RAW(adc_data);
 309                        return IIO_VAL_INT;
 310
 311                case MAX9611_CHAN_VOLTAGE_INPUT:
 312                        ret = max9611_read_single(dev, CONF_IN_VOLT,
 313                                                  &adc_data);
 314                        if (ret)
 315                                return -EINVAL;
 316
 317                        *val = MAX9611_VOLTAGE_RAW(adc_data);
 318                        return IIO_VAL_INT;
 319                }
 320
 321                break;
 322
 323        case IIO_CHAN_INFO_OFFSET:
 324                /* MAX9611_CHAN_VOLTAGE_INPUT */
 325                *val = MAX9611_CIM_OFFSET_RAW;
 326
 327                return IIO_VAL_INT;
 328
 329        case IIO_CHAN_INFO_SCALE:
 330
 331                switch (chan->address) {
 332                case MAX9611_CHAN_TEMPERATURE:
 333                        *val = MAX9611_TEMP_SCALE_NUM;
 334                        *val2 = MAX9611_TEMP_SCALE_DIV;
 335
 336                        return IIO_VAL_FRACTIONAL;
 337
 338                case MAX9611_CHAN_VOLTAGE_INPUT:
 339                        *val = MAX9611_CIM_LSB_mV;
 340
 341                        return IIO_VAL_INT;
 342                }
 343
 344                break;
 345
 346        case IIO_CHAN_INFO_PROCESSED:
 347
 348                switch (chan->address) {
 349                case MAX9611_CHAN_VOLTAGE_SENSE:
 350                        /*
 351                         * processed (mV): (raw - offset) * LSB (nV) / 10^6
 352                         *
 353                         * Even if max9611 can output raw csa voltage readings,
 354                         * use a produced value as scale depends on gain.
 355                         */
 356                        ret = max9611_read_csa_voltage(dev, &adc_data,
 357                                                       &gain_selector);
 358                        if (ret)
 359                                return -EINVAL;
 360
 361                        csa_gain = max9611_gain_conf[gain_selector];
 362
 363                        adc_data -= csa_gain[CSA_GAIN_OFFS_RAW];
 364                        *val = MAX9611_VOLTAGE_RAW(adc_data) *
 365                               csa_gain[CSA_GAIN_LSB_nV];
 366                        *val2 = 1000000;
 367
 368                        return IIO_VAL_FRACTIONAL;
 369
 370                case MAX9611_CHAN_CURRENT_LOAD:
 371                        /* processed (mA): Vcsa (nV) / Rshunt (uOhm)  */
 372                        ret = max9611_read_csa_voltage(dev, &adc_data,
 373                                                       &gain_selector);
 374                        if (ret)
 375                                return -EINVAL;
 376
 377                        csa_gain = max9611_gain_conf[gain_selector];
 378
 379                        adc_data -= csa_gain[CSA_GAIN_OFFS_RAW];
 380                        *val = MAX9611_VOLTAGE_RAW(adc_data) *
 381                               csa_gain[CSA_GAIN_LSB_nV];
 382                        *val2 = dev->shunt_resistor_uohm;
 383
 384                        return IIO_VAL_FRACTIONAL;
 385
 386                case MAX9611_CHAN_POWER_LOAD:
 387                        /*
 388                         * processed (mW): Vin (mV) * Vcsa (uV) /
 389                         *                 Rshunt (uOhm)
 390                         */
 391                        ret = max9611_read_single(dev, CONF_IN_VOLT,
 392                                                  &adc_data);
 393                        if (ret)
 394                                return -EINVAL;
 395
 396                        adc_data -= MAX9611_CIM_OFFSET_RAW;
 397                        *val = MAX9611_VOLTAGE_RAW(adc_data) *
 398                               MAX9611_CIM_LSB_mV;
 399
 400                        ret = max9611_read_csa_voltage(dev, &adc_data,
 401                                                       &gain_selector);
 402                        if (ret)
 403                                return -EINVAL;
 404
 405                        csa_gain = max9611_gain_conf[gain_selector];
 406
 407                        /* divide by 10^3 here to avoid 32bit overflow */
 408                        adc_data -= csa_gain[CSA_GAIN_OFFS_RAW];
 409                        *val *= MAX9611_VOLTAGE_RAW(adc_data) *
 410                                csa_gain[CSA_GAIN_LSB_nV] / 1000;
 411                        *val2 = dev->shunt_resistor_uohm;
 412
 413                        return IIO_VAL_FRACTIONAL;
 414                }
 415
 416                break;
 417        }
 418
 419        return -EINVAL;
 420}
 421
 422static ssize_t max9611_shunt_resistor_show(struct device *dev,
 423                                           struct device_attribute *attr,
 424                                           char *buf)
 425{
 426        struct max9611_dev *max9611 = iio_priv(dev_to_iio_dev(dev));
 427        unsigned int i, r;
 428
 429        i = max9611->shunt_resistor_uohm / 1000000;
 430        r = max9611->shunt_resistor_uohm % 1000000;
 431
 432        return sysfs_emit(buf, "%u.%06u\n", i, r);
 433}
 434
 435static IIO_DEVICE_ATTR(in_power_shunt_resistor, 0444,
 436                       max9611_shunt_resistor_show, NULL, 0);
 437static IIO_DEVICE_ATTR(in_current_shunt_resistor, 0444,
 438                       max9611_shunt_resistor_show, NULL, 0);
 439
 440static struct attribute *max9611_attributes[] = {
 441        &iio_dev_attr_in_power_shunt_resistor.dev_attr.attr,
 442        &iio_dev_attr_in_current_shunt_resistor.dev_attr.attr,
 443        NULL,
 444};
 445
 446static const struct attribute_group max9611_attribute_group = {
 447        .attrs = max9611_attributes,
 448};
 449
 450static const struct iio_info indio_info = {
 451        .read_raw       = max9611_read_raw,
 452        .attrs          = &max9611_attribute_group,
 453};
 454
 455static int max9611_init(struct max9611_dev *max9611)
 456{
 457        struct i2c_client *client = max9611->i2c_client;
 458        u16 regval;
 459        int ret;
 460
 461        if (!i2c_check_functionality(client->adapter,
 462                                     I2C_FUNC_SMBUS_WRITE_BYTE  |
 463                                     I2C_FUNC_SMBUS_READ_WORD_DATA)) {
 464                dev_err(max9611->dev,
 465                        "I2c adapter does not support smbus write_byte or read_word functionalities: aborting probe.\n");
 466                return -EINVAL;
 467        }
 468
 469        /* Make sure die temperature is in range to test communications. */
 470        ret = max9611_read_single(max9611, CONF_TEMP, &regval);
 471        if (ret)
 472                return ret;
 473
 474        regval &= MAX9611_TEMP_MASK;
 475
 476        if ((regval > MAX9611_TEMP_MAX_POS &&
 477             regval < MAX9611_TEMP_MIN_NEG) ||
 478             regval > MAX9611_TEMP_MAX_NEG) {
 479                dev_err(max9611->dev,
 480                        "Invalid value received from ADC 0x%4x: aborting\n",
 481                        regval);
 482                return -EIO;
 483        }
 484
 485        /* Mux shall be zeroed back before applying other configurations */
 486        ret = i2c_smbus_write_byte_data(max9611->i2c_client,
 487                                        MAX9611_REG_CTRL1, 0);
 488        if (ret) {
 489                dev_err(max9611->dev, "i2c write byte failed: 0x%2x - 0x%2x\n",
 490                        MAX9611_REG_CTRL1, 0);
 491                return ret;
 492        }
 493
 494        ret = i2c_smbus_write_byte_data(max9611->i2c_client,
 495                                        MAX9611_REG_CTRL2, 0);
 496        if (ret) {
 497                dev_err(max9611->dev, "i2c write byte failed: 0x%2x - 0x%2x\n",
 498                        MAX9611_REG_CTRL2, 0);
 499                return ret;
 500        }
 501        usleep_range(MAX9611_CONV_TIME_US_RANGE);
 502
 503        return 0;
 504}
 505
 506static const struct of_device_id max9611_of_table[] = {
 507        {.compatible = "maxim,max9611", .data = "max9611"},
 508        {.compatible = "maxim,max9612", .data = "max9612"},
 509        { },
 510};
 511
 512MODULE_DEVICE_TABLE(of, max9611_of_table);
 513static int max9611_probe(struct i2c_client *client,
 514                         const struct i2c_device_id *id)
 515{
 516        const char * const shunt_res_prop = "shunt-resistor-micro-ohms";
 517        struct max9611_dev *max9611;
 518        struct iio_dev *indio_dev;
 519        struct device *dev = &client->dev;
 520        unsigned int of_shunt;
 521        int ret;
 522
 523        indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*max9611));
 524        if (!indio_dev)
 525                return -ENOMEM;
 526
 527        i2c_set_clientdata(client, indio_dev);
 528
 529        max9611                 = iio_priv(indio_dev);
 530        max9611->dev            = dev;
 531        max9611->i2c_client     = client;
 532        mutex_init(&max9611->lock);
 533
 534        ret = device_property_read_u32(dev, shunt_res_prop, &of_shunt);
 535        if (ret) {
 536                dev_err(dev, "Missing %s property for %pfw node\n",
 537                        shunt_res_prop, dev_fwnode(dev));
 538                return ret;
 539        }
 540        max9611->shunt_resistor_uohm = of_shunt;
 541
 542        ret = max9611_init(max9611);
 543        if (ret)
 544                return ret;
 545
 546        indio_dev->name         = device_get_match_data(dev);
 547        indio_dev->modes        = INDIO_DIRECT_MODE;
 548        indio_dev->info         = &indio_info;
 549        indio_dev->channels     = max9611_channels;
 550        indio_dev->num_channels = ARRAY_SIZE(max9611_channels);
 551
 552        return devm_iio_device_register(dev, indio_dev);
 553}
 554
 555static struct i2c_driver max9611_driver = {
 556        .driver = {
 557                   .name = DRIVER_NAME,
 558                   .of_match_table = max9611_of_table,
 559        },
 560        .probe = max9611_probe,
 561};
 562module_i2c_driver(max9611_driver);
 563
 564MODULE_AUTHOR("Jacopo Mondi <jacopo+renesas@jmondi.org>");
 565MODULE_DESCRIPTION("Maxim max9611/12 current sense amplifier with 12bit ADC");
 566MODULE_LICENSE("GPL v2");
 567