linux/drivers/iio/dac/ad5592r-base.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * AD5592R Digital <-> Analog converters driver
   4 *
   5 * Copyright 2014-2016 Analog Devices Inc.
   6 * Author: Paul Cercueil <paul.cercueil@analog.com>
   7 */
   8
   9#include <linux/bitops.h>
  10#include <linux/delay.h>
  11#include <linux/iio/iio.h>
  12#include <linux/module.h>
  13#include <linux/mutex.h>
  14#include <linux/of.h>
  15#include <linux/regulator/consumer.h>
  16#include <linux/gpio/consumer.h>
  17#include <linux/gpio/driver.h>
  18#include <linux/property.h>
  19
  20#include <dt-bindings/iio/adi,ad5592r.h>
  21
  22#include "ad5592r-base.h"
  23
  24static int ad5592r_gpio_get(struct gpio_chip *chip, unsigned offset)
  25{
  26        struct ad5592r_state *st = gpiochip_get_data(chip);
  27        int ret = 0;
  28        u8 val;
  29
  30        mutex_lock(&st->gpio_lock);
  31
  32        if (st->gpio_out & BIT(offset))
  33                val = st->gpio_val;
  34        else
  35                ret = st->ops->gpio_read(st, &val);
  36
  37        mutex_unlock(&st->gpio_lock);
  38
  39        if (ret < 0)
  40                return ret;
  41
  42        return !!(val & BIT(offset));
  43}
  44
  45static void ad5592r_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
  46{
  47        struct ad5592r_state *st = gpiochip_get_data(chip);
  48
  49        mutex_lock(&st->gpio_lock);
  50
  51        if (value)
  52                st->gpio_val |= BIT(offset);
  53        else
  54                st->gpio_val &= ~BIT(offset);
  55
  56        st->ops->reg_write(st, AD5592R_REG_GPIO_SET, st->gpio_val);
  57
  58        mutex_unlock(&st->gpio_lock);
  59}
  60
  61static int ad5592r_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
  62{
  63        struct ad5592r_state *st = gpiochip_get_data(chip);
  64        int ret;
  65
  66        mutex_lock(&st->gpio_lock);
  67
  68        st->gpio_out &= ~BIT(offset);
  69        st->gpio_in |= BIT(offset);
  70
  71        ret = st->ops->reg_write(st, AD5592R_REG_GPIO_OUT_EN, st->gpio_out);
  72        if (ret < 0)
  73                goto err_unlock;
  74
  75        ret = st->ops->reg_write(st, AD5592R_REG_GPIO_IN_EN, st->gpio_in);
  76
  77err_unlock:
  78        mutex_unlock(&st->gpio_lock);
  79
  80        return ret;
  81}
  82
  83static int ad5592r_gpio_direction_output(struct gpio_chip *chip,
  84                                         unsigned offset, int value)
  85{
  86        struct ad5592r_state *st = gpiochip_get_data(chip);
  87        int ret;
  88
  89        mutex_lock(&st->gpio_lock);
  90
  91        if (value)
  92                st->gpio_val |= BIT(offset);
  93        else
  94                st->gpio_val &= ~BIT(offset);
  95
  96        st->gpio_in &= ~BIT(offset);
  97        st->gpio_out |= BIT(offset);
  98
  99        ret = st->ops->reg_write(st, AD5592R_REG_GPIO_SET, st->gpio_val);
 100        if (ret < 0)
 101                goto err_unlock;
 102
 103        ret = st->ops->reg_write(st, AD5592R_REG_GPIO_OUT_EN, st->gpio_out);
 104        if (ret < 0)
 105                goto err_unlock;
 106
 107        ret = st->ops->reg_write(st, AD5592R_REG_GPIO_IN_EN, st->gpio_in);
 108
 109err_unlock:
 110        mutex_unlock(&st->gpio_lock);
 111
 112        return ret;
 113}
 114
 115static int ad5592r_gpio_request(struct gpio_chip *chip, unsigned offset)
 116{
 117        struct ad5592r_state *st = gpiochip_get_data(chip);
 118
 119        if (!(st->gpio_map & BIT(offset))) {
 120                dev_err(st->dev, "GPIO %d is reserved by alternate function\n",
 121                        offset);
 122                return -ENODEV;
 123        }
 124
 125        return 0;
 126}
 127
 128static int ad5592r_gpio_init(struct ad5592r_state *st)
 129{
 130        if (!st->gpio_map)
 131                return 0;
 132
 133        st->gpiochip.label = dev_name(st->dev);
 134        st->gpiochip.base = -1;
 135        st->gpiochip.ngpio = 8;
 136        st->gpiochip.parent = st->dev;
 137        st->gpiochip.can_sleep = true;
 138        st->gpiochip.direction_input = ad5592r_gpio_direction_input;
 139        st->gpiochip.direction_output = ad5592r_gpio_direction_output;
 140        st->gpiochip.get = ad5592r_gpio_get;
 141        st->gpiochip.set = ad5592r_gpio_set;
 142        st->gpiochip.request = ad5592r_gpio_request;
 143        st->gpiochip.owner = THIS_MODULE;
 144
 145        mutex_init(&st->gpio_lock);
 146
 147        return gpiochip_add_data(&st->gpiochip, st);
 148}
 149
 150static void ad5592r_gpio_cleanup(struct ad5592r_state *st)
 151{
 152        if (st->gpio_map)
 153                gpiochip_remove(&st->gpiochip);
 154}
 155
 156static int ad5592r_reset(struct ad5592r_state *st)
 157{
 158        struct gpio_desc *gpio;
 159
 160        gpio = devm_gpiod_get_optional(st->dev, "reset", GPIOD_OUT_LOW);
 161        if (IS_ERR(gpio))
 162                return PTR_ERR(gpio);
 163
 164        if (gpio) {
 165                udelay(1);
 166                gpiod_set_value(gpio, 1);
 167        } else {
 168                mutex_lock(&st->lock);
 169                /* Writing this magic value resets the device */
 170                st->ops->reg_write(st, AD5592R_REG_RESET, 0xdac);
 171                mutex_unlock(&st->lock);
 172        }
 173
 174        udelay(250);
 175
 176        return 0;
 177}
 178
 179static int ad5592r_get_vref(struct ad5592r_state *st)
 180{
 181        int ret;
 182
 183        if (st->reg) {
 184                ret = regulator_get_voltage(st->reg);
 185                if (ret < 0)
 186                        return ret;
 187
 188                return ret / 1000;
 189        } else {
 190                return 2500;
 191        }
 192}
 193
 194static int ad5592r_set_channel_modes(struct ad5592r_state *st)
 195{
 196        const struct ad5592r_rw_ops *ops = st->ops;
 197        int ret;
 198        unsigned i;
 199        u8 pulldown = 0, tristate = 0, dac = 0, adc = 0;
 200        u16 read_back;
 201
 202        for (i = 0; i < st->num_channels; i++) {
 203                switch (st->channel_modes[i]) {
 204                case CH_MODE_DAC:
 205                        dac |= BIT(i);
 206                        break;
 207
 208                case CH_MODE_ADC:
 209                        adc |= BIT(i);
 210                        break;
 211
 212                case CH_MODE_DAC_AND_ADC:
 213                        dac |= BIT(i);
 214                        adc |= BIT(i);
 215                        break;
 216
 217                case CH_MODE_GPIO:
 218                        st->gpio_map |= BIT(i);
 219                        st->gpio_in |= BIT(i); /* Default to input */
 220                        break;
 221
 222                case CH_MODE_UNUSED:
 223                default:
 224                        switch (st->channel_offstate[i]) {
 225                        case CH_OFFSTATE_OUT_TRISTATE:
 226                                tristate |= BIT(i);
 227                                break;
 228
 229                        case CH_OFFSTATE_OUT_LOW:
 230                                st->gpio_out |= BIT(i);
 231                                break;
 232
 233                        case CH_OFFSTATE_OUT_HIGH:
 234                                st->gpio_out |= BIT(i);
 235                                st->gpio_val |= BIT(i);
 236                                break;
 237
 238                        case CH_OFFSTATE_PULLDOWN:
 239                        default:
 240                                pulldown |= BIT(i);
 241                                break;
 242                        }
 243                }
 244        }
 245
 246        mutex_lock(&st->lock);
 247
 248        /* Pull down unused pins to GND */
 249        ret = ops->reg_write(st, AD5592R_REG_PULLDOWN, pulldown);
 250        if (ret)
 251                goto err_unlock;
 252
 253        ret = ops->reg_write(st, AD5592R_REG_TRISTATE, tristate);
 254        if (ret)
 255                goto err_unlock;
 256
 257        /* Configure pins that we use */
 258        ret = ops->reg_write(st, AD5592R_REG_DAC_EN, dac);
 259        if (ret)
 260                goto err_unlock;
 261
 262        ret = ops->reg_write(st, AD5592R_REG_ADC_EN, adc);
 263        if (ret)
 264                goto err_unlock;
 265
 266        ret = ops->reg_write(st, AD5592R_REG_GPIO_SET, st->gpio_val);
 267        if (ret)
 268                goto err_unlock;
 269
 270        ret = ops->reg_write(st, AD5592R_REG_GPIO_OUT_EN, st->gpio_out);
 271        if (ret)
 272                goto err_unlock;
 273
 274        ret = ops->reg_write(st, AD5592R_REG_GPIO_IN_EN, st->gpio_in);
 275        if (ret)
 276                goto err_unlock;
 277
 278        /* Verify that we can read back at least one register */
 279        ret = ops->reg_read(st, AD5592R_REG_ADC_EN, &read_back);
 280        if (!ret && (read_back & 0xff) != adc)
 281                ret = -EIO;
 282
 283err_unlock:
 284        mutex_unlock(&st->lock);
 285        return ret;
 286}
 287
 288static int ad5592r_reset_channel_modes(struct ad5592r_state *st)
 289{
 290        int i;
 291
 292        for (i = 0; i < ARRAY_SIZE(st->channel_modes); i++)
 293                st->channel_modes[i] = CH_MODE_UNUSED;
 294
 295        return ad5592r_set_channel_modes(st);
 296}
 297
 298static int ad5592r_write_raw(struct iio_dev *iio_dev,
 299        struct iio_chan_spec const *chan, int val, int val2, long mask)
 300{
 301        struct ad5592r_state *st = iio_priv(iio_dev);
 302        int ret;
 303
 304        switch (mask) {
 305        case IIO_CHAN_INFO_RAW:
 306
 307                if (val >= (1 << chan->scan_type.realbits) || val < 0)
 308                        return -EINVAL;
 309
 310                if (!chan->output)
 311                        return -EINVAL;
 312
 313                mutex_lock(&st->lock);
 314                ret = st->ops->write_dac(st, chan->channel, val);
 315                if (!ret)
 316                        st->cached_dac[chan->channel] = val;
 317                mutex_unlock(&st->lock);
 318                return ret;
 319        case IIO_CHAN_INFO_SCALE:
 320                if (chan->type == IIO_VOLTAGE) {
 321                        bool gain;
 322
 323                        if (val == st->scale_avail[0][0] &&
 324                                val2 == st->scale_avail[0][1])
 325                                gain = false;
 326                        else if (val == st->scale_avail[1][0] &&
 327                                 val2 == st->scale_avail[1][1])
 328                                gain = true;
 329                        else
 330                                return -EINVAL;
 331
 332                        mutex_lock(&st->lock);
 333
 334                        ret = st->ops->reg_read(st, AD5592R_REG_CTRL,
 335                                                &st->cached_gp_ctrl);
 336                        if (ret < 0) {
 337                                mutex_unlock(&st->lock);
 338                                return ret;
 339                        }
 340
 341                        if (chan->output) {
 342                                if (gain)
 343                                        st->cached_gp_ctrl |=
 344                                                AD5592R_REG_CTRL_DAC_RANGE;
 345                                else
 346                                        st->cached_gp_ctrl &=
 347                                                ~AD5592R_REG_CTRL_DAC_RANGE;
 348                        } else {
 349                                if (gain)
 350                                        st->cached_gp_ctrl |=
 351                                                AD5592R_REG_CTRL_ADC_RANGE;
 352                                else
 353                                        st->cached_gp_ctrl &=
 354                                                ~AD5592R_REG_CTRL_ADC_RANGE;
 355                        }
 356
 357                        ret = st->ops->reg_write(st, AD5592R_REG_CTRL,
 358                                                 st->cached_gp_ctrl);
 359                        mutex_unlock(&st->lock);
 360
 361                        return ret;
 362                }
 363                break;
 364        default:
 365                return -EINVAL;
 366        }
 367
 368        return 0;
 369}
 370
 371static int ad5592r_read_raw(struct iio_dev *iio_dev,
 372                           struct iio_chan_spec const *chan,
 373                           int *val, int *val2, long m)
 374{
 375        struct ad5592r_state *st = iio_priv(iio_dev);
 376        u16 read_val;
 377        int ret, mult;
 378
 379        switch (m) {
 380        case IIO_CHAN_INFO_RAW:
 381                if (!chan->output) {
 382                        mutex_lock(&st->lock);
 383                        ret = st->ops->read_adc(st, chan->channel, &read_val);
 384                        mutex_unlock(&st->lock);
 385                        if (ret)
 386                                return ret;
 387
 388                        if ((read_val >> 12 & 0x7) != (chan->channel & 0x7)) {
 389                                dev_err(st->dev, "Error while reading channel %u\n",
 390                                                chan->channel);
 391                                return -EIO;
 392                        }
 393
 394                        read_val &= GENMASK(11, 0);
 395
 396                } else {
 397                        mutex_lock(&st->lock);
 398                        read_val = st->cached_dac[chan->channel];
 399                        mutex_unlock(&st->lock);
 400                }
 401
 402                dev_dbg(st->dev, "Channel %u read: 0x%04hX\n",
 403                                chan->channel, read_val);
 404
 405                *val = (int) read_val;
 406                return IIO_VAL_INT;
 407        case IIO_CHAN_INFO_SCALE:
 408                *val = ad5592r_get_vref(st);
 409
 410                if (chan->type == IIO_TEMP) {
 411                        s64 tmp = *val * (3767897513LL / 25LL);
 412                        *val = div_s64_rem(tmp, 1000000000LL, val2);
 413
 414                        return IIO_VAL_INT_PLUS_MICRO;
 415                }
 416
 417                mutex_lock(&st->lock);
 418
 419                if (chan->output)
 420                        mult = !!(st->cached_gp_ctrl &
 421                                AD5592R_REG_CTRL_DAC_RANGE);
 422                else
 423                        mult = !!(st->cached_gp_ctrl &
 424                                AD5592R_REG_CTRL_ADC_RANGE);
 425
 426                mutex_unlock(&st->lock);
 427
 428                *val *= ++mult;
 429
 430                *val2 = chan->scan_type.realbits;
 431
 432                return IIO_VAL_FRACTIONAL_LOG2;
 433        case IIO_CHAN_INFO_OFFSET:
 434                ret = ad5592r_get_vref(st);
 435
 436                mutex_lock(&st->lock);
 437
 438                if (st->cached_gp_ctrl & AD5592R_REG_CTRL_ADC_RANGE)
 439                        *val = (-34365 * 25) / ret;
 440                else
 441                        *val = (-75365 * 25) / ret;
 442
 443                mutex_unlock(&st->lock);
 444
 445                return IIO_VAL_INT;
 446        default:
 447                return -EINVAL;
 448        }
 449}
 450
 451static int ad5592r_write_raw_get_fmt(struct iio_dev *indio_dev,
 452                                 struct iio_chan_spec const *chan, long mask)
 453{
 454        switch (mask) {
 455        case IIO_CHAN_INFO_SCALE:
 456                return IIO_VAL_INT_PLUS_NANO;
 457
 458        default:
 459                return IIO_VAL_INT_PLUS_MICRO;
 460        }
 461
 462        return -EINVAL;
 463}
 464
 465static const struct iio_info ad5592r_info = {
 466        .read_raw = ad5592r_read_raw,
 467        .write_raw = ad5592r_write_raw,
 468        .write_raw_get_fmt = ad5592r_write_raw_get_fmt,
 469};
 470
 471static ssize_t ad5592r_show_scale_available(struct iio_dev *iio_dev,
 472                                           uintptr_t private,
 473                                           const struct iio_chan_spec *chan,
 474                                           char *buf)
 475{
 476        struct ad5592r_state *st = iio_priv(iio_dev);
 477
 478        return sprintf(buf, "%d.%09u %d.%09u\n",
 479                st->scale_avail[0][0], st->scale_avail[0][1],
 480                st->scale_avail[1][0], st->scale_avail[1][1]);
 481}
 482
 483static const struct iio_chan_spec_ext_info ad5592r_ext_info[] = {
 484        {
 485         .name = "scale_available",
 486         .read = ad5592r_show_scale_available,
 487         .shared = IIO_SHARED_BY_TYPE,
 488         },
 489        {},
 490};
 491
 492static void ad5592r_setup_channel(struct iio_dev *iio_dev,
 493                struct iio_chan_spec *chan, bool output, unsigned id)
 494{
 495        chan->type = IIO_VOLTAGE;
 496        chan->indexed = 1;
 497        chan->output = output;
 498        chan->channel = id;
 499        chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW);
 500        chan->info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE);
 501        chan->scan_type.sign = 'u';
 502        chan->scan_type.realbits = 12;
 503        chan->scan_type.storagebits = 16;
 504        chan->ext_info = ad5592r_ext_info;
 505}
 506
 507static int ad5592r_alloc_channels(struct iio_dev *iio_dev)
 508{
 509        struct ad5592r_state *st = iio_priv(iio_dev);
 510        unsigned i, curr_channel = 0,
 511                 num_channels = st->num_channels;
 512        struct iio_chan_spec *channels;
 513        struct fwnode_handle *child;
 514        u32 reg, tmp;
 515        int ret;
 516
 517        device_for_each_child_node(st->dev, child) {
 518                ret = fwnode_property_read_u32(child, "reg", &reg);
 519                if (ret || reg >= ARRAY_SIZE(st->channel_modes))
 520                        continue;
 521
 522                ret = fwnode_property_read_u32(child, "adi,mode", &tmp);
 523                if (!ret)
 524                        st->channel_modes[reg] = tmp;
 525
 526                fwnode_property_read_u32(child, "adi,off-state", &tmp);
 527                if (!ret)
 528                        st->channel_offstate[reg] = tmp;
 529        }
 530
 531        channels = devm_kcalloc(st->dev,
 532                        1 + 2 * num_channels, sizeof(*channels),
 533                        GFP_KERNEL);
 534        if (!channels)
 535                return -ENOMEM;
 536
 537        for (i = 0; i < num_channels; i++) {
 538                switch (st->channel_modes[i]) {
 539                case CH_MODE_DAC:
 540                        ad5592r_setup_channel(iio_dev, &channels[curr_channel],
 541                                        true, i);
 542                        curr_channel++;
 543                        break;
 544
 545                case CH_MODE_ADC:
 546                        ad5592r_setup_channel(iio_dev, &channels[curr_channel],
 547                                        false, i);
 548                        curr_channel++;
 549                        break;
 550
 551                case CH_MODE_DAC_AND_ADC:
 552                        ad5592r_setup_channel(iio_dev, &channels[curr_channel],
 553                                        true, i);
 554                        curr_channel++;
 555                        ad5592r_setup_channel(iio_dev, &channels[curr_channel],
 556                                        false, i);
 557                        curr_channel++;
 558                        break;
 559
 560                default:
 561                        continue;
 562                }
 563        }
 564
 565        channels[curr_channel].type = IIO_TEMP;
 566        channels[curr_channel].channel = 8;
 567        channels[curr_channel].info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
 568                                   BIT(IIO_CHAN_INFO_SCALE) |
 569                                   BIT(IIO_CHAN_INFO_OFFSET);
 570        curr_channel++;
 571
 572        iio_dev->num_channels = curr_channel;
 573        iio_dev->channels = channels;
 574
 575        return 0;
 576}
 577
 578static void ad5592r_init_scales(struct ad5592r_state *st, int vref_mV)
 579{
 580        s64 tmp = (s64)vref_mV * 1000000000LL >> 12;
 581
 582        st->scale_avail[0][0] =
 583                div_s64_rem(tmp, 1000000000LL, &st->scale_avail[0][1]);
 584        st->scale_avail[1][0] =
 585                div_s64_rem(tmp * 2, 1000000000LL, &st->scale_avail[1][1]);
 586}
 587
 588int ad5592r_probe(struct device *dev, const char *name,
 589                const struct ad5592r_rw_ops *ops)
 590{
 591        struct iio_dev *iio_dev;
 592        struct ad5592r_state *st;
 593        int ret;
 594
 595        iio_dev = devm_iio_device_alloc(dev, sizeof(*st));
 596        if (!iio_dev)
 597                return -ENOMEM;
 598
 599        st = iio_priv(iio_dev);
 600        st->dev = dev;
 601        st->ops = ops;
 602        st->num_channels = 8;
 603        dev_set_drvdata(dev, iio_dev);
 604
 605        st->reg = devm_regulator_get_optional(dev, "vref");
 606        if (IS_ERR(st->reg)) {
 607                if ((PTR_ERR(st->reg) != -ENODEV) && dev->of_node)
 608                        return PTR_ERR(st->reg);
 609
 610                st->reg = NULL;
 611        } else {
 612                ret = regulator_enable(st->reg);
 613                if (ret)
 614                        return ret;
 615        }
 616
 617        iio_dev->name = name;
 618        iio_dev->info = &ad5592r_info;
 619        iio_dev->modes = INDIO_DIRECT_MODE;
 620
 621        mutex_init(&st->lock);
 622
 623        ad5592r_init_scales(st, ad5592r_get_vref(st));
 624
 625        ret = ad5592r_reset(st);
 626        if (ret)
 627                goto error_disable_reg;
 628
 629        ret = ops->reg_write(st, AD5592R_REG_PD,
 630                     (st->reg == NULL) ? AD5592R_REG_PD_EN_REF : 0);
 631        if (ret)
 632                goto error_disable_reg;
 633
 634        ret = ad5592r_alloc_channels(iio_dev);
 635        if (ret)
 636                goto error_disable_reg;
 637
 638        ret = ad5592r_set_channel_modes(st);
 639        if (ret)
 640                goto error_reset_ch_modes;
 641
 642        ret = iio_device_register(iio_dev);
 643        if (ret)
 644                goto error_reset_ch_modes;
 645
 646        ret = ad5592r_gpio_init(st);
 647        if (ret)
 648                goto error_dev_unregister;
 649
 650        return 0;
 651
 652error_dev_unregister:
 653        iio_device_unregister(iio_dev);
 654
 655error_reset_ch_modes:
 656        ad5592r_reset_channel_modes(st);
 657
 658error_disable_reg:
 659        if (st->reg)
 660                regulator_disable(st->reg);
 661
 662        return ret;
 663}
 664EXPORT_SYMBOL_GPL(ad5592r_probe);
 665
 666int ad5592r_remove(struct device *dev)
 667{
 668        struct iio_dev *iio_dev = dev_get_drvdata(dev);
 669        struct ad5592r_state *st = iio_priv(iio_dev);
 670
 671        iio_device_unregister(iio_dev);
 672        ad5592r_reset_channel_modes(st);
 673        ad5592r_gpio_cleanup(st);
 674
 675        if (st->reg)
 676                regulator_disable(st->reg);
 677
 678        return 0;
 679}
 680EXPORT_SYMBOL_GPL(ad5592r_remove);
 681
 682MODULE_AUTHOR("Paul Cercueil <paul.cercueil@analog.com>");
 683MODULE_DESCRIPTION("Analog Devices AD5592R multi-channel converters");
 684MODULE_LICENSE("GPL v2");
 685