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