0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/bitops.h>
0010 #include <linux/delay.h>
0011 #include <linux/iio/iio.h>
0012 #include <linux/module.h>
0013 #include <linux/mutex.h>
0014 #include <linux/regulator/consumer.h>
0015 #include <linux/gpio/consumer.h>
0016 #include <linux/gpio/driver.h>
0017 #include <linux/property.h>
0018
0019 #include <dt-bindings/iio/adi,ad5592r.h>
0020
0021 #include "ad5592r-base.h"
0022
0023 static int ad5592r_gpio_get(struct gpio_chip *chip, unsigned offset)
0024 {
0025 struct ad5592r_state *st = gpiochip_get_data(chip);
0026 int ret = 0;
0027 u8 val;
0028
0029 mutex_lock(&st->gpio_lock);
0030
0031 if (st->gpio_out & BIT(offset))
0032 val = st->gpio_val;
0033 else
0034 ret = st->ops->gpio_read(st, &val);
0035
0036 mutex_unlock(&st->gpio_lock);
0037
0038 if (ret < 0)
0039 return ret;
0040
0041 return !!(val & BIT(offset));
0042 }
0043
0044 static void ad5592r_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
0045 {
0046 struct ad5592r_state *st = gpiochip_get_data(chip);
0047
0048 mutex_lock(&st->gpio_lock);
0049
0050 if (value)
0051 st->gpio_val |= BIT(offset);
0052 else
0053 st->gpio_val &= ~BIT(offset);
0054
0055 st->ops->reg_write(st, AD5592R_REG_GPIO_SET, st->gpio_val);
0056
0057 mutex_unlock(&st->gpio_lock);
0058 }
0059
0060 static int ad5592r_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
0061 {
0062 struct ad5592r_state *st = gpiochip_get_data(chip);
0063 int ret;
0064
0065 mutex_lock(&st->gpio_lock);
0066
0067 st->gpio_out &= ~BIT(offset);
0068 st->gpio_in |= BIT(offset);
0069
0070 ret = st->ops->reg_write(st, AD5592R_REG_GPIO_OUT_EN, st->gpio_out);
0071 if (ret < 0)
0072 goto err_unlock;
0073
0074 ret = st->ops->reg_write(st, AD5592R_REG_GPIO_IN_EN, st->gpio_in);
0075
0076 err_unlock:
0077 mutex_unlock(&st->gpio_lock);
0078
0079 return ret;
0080 }
0081
0082 static int ad5592r_gpio_direction_output(struct gpio_chip *chip,
0083 unsigned offset, int value)
0084 {
0085 struct ad5592r_state *st = gpiochip_get_data(chip);
0086 int ret;
0087
0088 mutex_lock(&st->gpio_lock);
0089
0090 if (value)
0091 st->gpio_val |= BIT(offset);
0092 else
0093 st->gpio_val &= ~BIT(offset);
0094
0095 st->gpio_in &= ~BIT(offset);
0096 st->gpio_out |= BIT(offset);
0097
0098 ret = st->ops->reg_write(st, AD5592R_REG_GPIO_SET, st->gpio_val);
0099 if (ret < 0)
0100 goto err_unlock;
0101
0102 ret = st->ops->reg_write(st, AD5592R_REG_GPIO_OUT_EN, st->gpio_out);
0103 if (ret < 0)
0104 goto err_unlock;
0105
0106 ret = st->ops->reg_write(st, AD5592R_REG_GPIO_IN_EN, st->gpio_in);
0107
0108 err_unlock:
0109 mutex_unlock(&st->gpio_lock);
0110
0111 return ret;
0112 }
0113
0114 static int ad5592r_gpio_request(struct gpio_chip *chip, unsigned offset)
0115 {
0116 struct ad5592r_state *st = gpiochip_get_data(chip);
0117
0118 if (!(st->gpio_map & BIT(offset))) {
0119 dev_err(st->dev, "GPIO %d is reserved by alternate function\n",
0120 offset);
0121 return -ENODEV;
0122 }
0123
0124 return 0;
0125 }
0126
0127 static int ad5592r_gpio_init(struct ad5592r_state *st)
0128 {
0129 if (!st->gpio_map)
0130 return 0;
0131
0132 st->gpiochip.label = dev_name(st->dev);
0133 st->gpiochip.base = -1;
0134 st->gpiochip.ngpio = 8;
0135 st->gpiochip.parent = st->dev;
0136 st->gpiochip.can_sleep = true;
0137 st->gpiochip.direction_input = ad5592r_gpio_direction_input;
0138 st->gpiochip.direction_output = ad5592r_gpio_direction_output;
0139 st->gpiochip.get = ad5592r_gpio_get;
0140 st->gpiochip.set = ad5592r_gpio_set;
0141 st->gpiochip.request = ad5592r_gpio_request;
0142 st->gpiochip.owner = THIS_MODULE;
0143
0144 mutex_init(&st->gpio_lock);
0145
0146 return gpiochip_add_data(&st->gpiochip, st);
0147 }
0148
0149 static void ad5592r_gpio_cleanup(struct ad5592r_state *st)
0150 {
0151 if (st->gpio_map)
0152 gpiochip_remove(&st->gpiochip);
0153 }
0154
0155 static int ad5592r_reset(struct ad5592r_state *st)
0156 {
0157 struct gpio_desc *gpio;
0158
0159 gpio = devm_gpiod_get_optional(st->dev, "reset", GPIOD_OUT_LOW);
0160 if (IS_ERR(gpio))
0161 return PTR_ERR(gpio);
0162
0163 if (gpio) {
0164 udelay(1);
0165 gpiod_set_value(gpio, 1);
0166 } else {
0167 mutex_lock(&st->lock);
0168
0169 st->ops->reg_write(st, AD5592R_REG_RESET, 0xdac);
0170 mutex_unlock(&st->lock);
0171 }
0172
0173 udelay(250);
0174
0175 return 0;
0176 }
0177
0178 static int ad5592r_get_vref(struct ad5592r_state *st)
0179 {
0180 int ret;
0181
0182 if (st->reg) {
0183 ret = regulator_get_voltage(st->reg);
0184 if (ret < 0)
0185 return ret;
0186
0187 return ret / 1000;
0188 } else {
0189 return 2500;
0190 }
0191 }
0192
0193 static int ad5592r_set_channel_modes(struct ad5592r_state *st)
0194 {
0195 const struct ad5592r_rw_ops *ops = st->ops;
0196 int ret;
0197 unsigned i;
0198 u8 pulldown = 0, tristate = 0, dac = 0, adc = 0;
0199 u16 read_back;
0200
0201 for (i = 0; i < st->num_channels; i++) {
0202 switch (st->channel_modes[i]) {
0203 case CH_MODE_DAC:
0204 dac |= BIT(i);
0205 break;
0206
0207 case CH_MODE_ADC:
0208 adc |= BIT(i);
0209 break;
0210
0211 case CH_MODE_DAC_AND_ADC:
0212 dac |= BIT(i);
0213 adc |= BIT(i);
0214 break;
0215
0216 case CH_MODE_GPIO:
0217 st->gpio_map |= BIT(i);
0218 st->gpio_in |= BIT(i);
0219 break;
0220
0221 case CH_MODE_UNUSED:
0222 default:
0223 switch (st->channel_offstate[i]) {
0224 case CH_OFFSTATE_OUT_TRISTATE:
0225 tristate |= BIT(i);
0226 break;
0227
0228 case CH_OFFSTATE_OUT_LOW:
0229 st->gpio_out |= BIT(i);
0230 break;
0231
0232 case CH_OFFSTATE_OUT_HIGH:
0233 st->gpio_out |= BIT(i);
0234 st->gpio_val |= BIT(i);
0235 break;
0236
0237 case CH_OFFSTATE_PULLDOWN:
0238 default:
0239 pulldown |= BIT(i);
0240 break;
0241 }
0242 }
0243 }
0244
0245 mutex_lock(&st->lock);
0246
0247
0248 ret = ops->reg_write(st, AD5592R_REG_PULLDOWN, pulldown);
0249 if (ret)
0250 goto err_unlock;
0251
0252 ret = ops->reg_write(st, AD5592R_REG_TRISTATE, tristate);
0253 if (ret)
0254 goto err_unlock;
0255
0256
0257 ret = ops->reg_write(st, AD5592R_REG_DAC_EN, dac);
0258 if (ret)
0259 goto err_unlock;
0260
0261 ret = ops->reg_write(st, AD5592R_REG_ADC_EN, adc);
0262 if (ret)
0263 goto err_unlock;
0264
0265 ret = ops->reg_write(st, AD5592R_REG_GPIO_SET, st->gpio_val);
0266 if (ret)
0267 goto err_unlock;
0268
0269 ret = ops->reg_write(st, AD5592R_REG_GPIO_OUT_EN, st->gpio_out);
0270 if (ret)
0271 goto err_unlock;
0272
0273 ret = ops->reg_write(st, AD5592R_REG_GPIO_IN_EN, st->gpio_in);
0274 if (ret)
0275 goto err_unlock;
0276
0277
0278 ret = ops->reg_read(st, AD5592R_REG_ADC_EN, &read_back);
0279 if (!ret && (read_back & 0xff) != adc)
0280 ret = -EIO;
0281
0282 err_unlock:
0283 mutex_unlock(&st->lock);
0284 return ret;
0285 }
0286
0287 static int ad5592r_reset_channel_modes(struct ad5592r_state *st)
0288 {
0289 int i;
0290
0291 for (i = 0; i < ARRAY_SIZE(st->channel_modes); i++)
0292 st->channel_modes[i] = CH_MODE_UNUSED;
0293
0294 return ad5592r_set_channel_modes(st);
0295 }
0296
0297 static int ad5592r_write_raw(struct iio_dev *iio_dev,
0298 struct iio_chan_spec const *chan, int val, int val2, long mask)
0299 {
0300 struct ad5592r_state *st = iio_priv(iio_dev);
0301 int ret;
0302
0303 switch (mask) {
0304 case IIO_CHAN_INFO_RAW:
0305
0306 if (val >= (1 << chan->scan_type.realbits) || val < 0)
0307 return -EINVAL;
0308
0309 if (!chan->output)
0310 return -EINVAL;
0311
0312 mutex_lock(&st->lock);
0313 ret = st->ops->write_dac(st, chan->channel, val);
0314 if (!ret)
0315 st->cached_dac[chan->channel] = val;
0316 mutex_unlock(&st->lock);
0317 return ret;
0318 case IIO_CHAN_INFO_SCALE:
0319 if (chan->type == IIO_VOLTAGE) {
0320 bool gain;
0321
0322 if (val == st->scale_avail[0][0] &&
0323 val2 == st->scale_avail[0][1])
0324 gain = false;
0325 else if (val == st->scale_avail[1][0] &&
0326 val2 == st->scale_avail[1][1])
0327 gain = true;
0328 else
0329 return -EINVAL;
0330
0331 mutex_lock(&st->lock);
0332
0333 ret = st->ops->reg_read(st, AD5592R_REG_CTRL,
0334 &st->cached_gp_ctrl);
0335 if (ret < 0) {
0336 mutex_unlock(&st->lock);
0337 return ret;
0338 }
0339
0340 if (chan->output) {
0341 if (gain)
0342 st->cached_gp_ctrl |=
0343 AD5592R_REG_CTRL_DAC_RANGE;
0344 else
0345 st->cached_gp_ctrl &=
0346 ~AD5592R_REG_CTRL_DAC_RANGE;
0347 } else {
0348 if (gain)
0349 st->cached_gp_ctrl |=
0350 AD5592R_REG_CTRL_ADC_RANGE;
0351 else
0352 st->cached_gp_ctrl &=
0353 ~AD5592R_REG_CTRL_ADC_RANGE;
0354 }
0355
0356 ret = st->ops->reg_write(st, AD5592R_REG_CTRL,
0357 st->cached_gp_ctrl);
0358 mutex_unlock(&st->lock);
0359
0360 return ret;
0361 }
0362 break;
0363 default:
0364 return -EINVAL;
0365 }
0366
0367 return 0;
0368 }
0369
0370 static int ad5592r_read_raw(struct iio_dev *iio_dev,
0371 struct iio_chan_spec const *chan,
0372 int *val, int *val2, long m)
0373 {
0374 struct ad5592r_state *st = iio_priv(iio_dev);
0375 u16 read_val;
0376 int ret, mult;
0377
0378 switch (m) {
0379 case IIO_CHAN_INFO_RAW:
0380 if (!chan->output) {
0381 mutex_lock(&st->lock);
0382 ret = st->ops->read_adc(st, chan->channel, &read_val);
0383 mutex_unlock(&st->lock);
0384 if (ret)
0385 return ret;
0386
0387 if ((read_val >> 12 & 0x7) != (chan->channel & 0x7)) {
0388 dev_err(st->dev, "Error while reading channel %u\n",
0389 chan->channel);
0390 return -EIO;
0391 }
0392
0393 read_val &= GENMASK(11, 0);
0394
0395 } else {
0396 mutex_lock(&st->lock);
0397 read_val = st->cached_dac[chan->channel];
0398 mutex_unlock(&st->lock);
0399 }
0400
0401 dev_dbg(st->dev, "Channel %u read: 0x%04hX\n",
0402 chan->channel, read_val);
0403
0404 *val = (int) read_val;
0405 return IIO_VAL_INT;
0406 case IIO_CHAN_INFO_SCALE:
0407 *val = ad5592r_get_vref(st);
0408
0409 if (chan->type == IIO_TEMP) {
0410 s64 tmp = *val * (3767897513LL / 25LL);
0411 *val = div_s64_rem(tmp, 1000000000LL, val2);
0412
0413 return IIO_VAL_INT_PLUS_MICRO;
0414 }
0415
0416 mutex_lock(&st->lock);
0417
0418 if (chan->output)
0419 mult = !!(st->cached_gp_ctrl &
0420 AD5592R_REG_CTRL_DAC_RANGE);
0421 else
0422 mult = !!(st->cached_gp_ctrl &
0423 AD5592R_REG_CTRL_ADC_RANGE);
0424
0425 mutex_unlock(&st->lock);
0426
0427 *val *= ++mult;
0428
0429 *val2 = chan->scan_type.realbits;
0430
0431 return IIO_VAL_FRACTIONAL_LOG2;
0432 case IIO_CHAN_INFO_OFFSET:
0433 ret = ad5592r_get_vref(st);
0434
0435 mutex_lock(&st->lock);
0436
0437 if (st->cached_gp_ctrl & AD5592R_REG_CTRL_ADC_RANGE)
0438 *val = (-34365 * 25) / ret;
0439 else
0440 *val = (-75365 * 25) / ret;
0441
0442 mutex_unlock(&st->lock);
0443
0444 return IIO_VAL_INT;
0445 default:
0446 return -EINVAL;
0447 }
0448 }
0449
0450 static int ad5592r_write_raw_get_fmt(struct iio_dev *indio_dev,
0451 struct iio_chan_spec const *chan, long mask)
0452 {
0453 switch (mask) {
0454 case IIO_CHAN_INFO_SCALE:
0455 return IIO_VAL_INT_PLUS_NANO;
0456
0457 default:
0458 return IIO_VAL_INT_PLUS_MICRO;
0459 }
0460
0461 return -EINVAL;
0462 }
0463
0464 static const struct iio_info ad5592r_info = {
0465 .read_raw = ad5592r_read_raw,
0466 .write_raw = ad5592r_write_raw,
0467 .write_raw_get_fmt = ad5592r_write_raw_get_fmt,
0468 };
0469
0470 static ssize_t ad5592r_show_scale_available(struct iio_dev *iio_dev,
0471 uintptr_t private,
0472 const struct iio_chan_spec *chan,
0473 char *buf)
0474 {
0475 struct ad5592r_state *st = iio_priv(iio_dev);
0476
0477 return sprintf(buf, "%d.%09u %d.%09u\n",
0478 st->scale_avail[0][0], st->scale_avail[0][1],
0479 st->scale_avail[1][0], st->scale_avail[1][1]);
0480 }
0481
0482 static const struct iio_chan_spec_ext_info ad5592r_ext_info[] = {
0483 {
0484 .name = "scale_available",
0485 .read = ad5592r_show_scale_available,
0486 .shared = IIO_SHARED_BY_TYPE,
0487 },
0488 {},
0489 };
0490
0491 static void ad5592r_setup_channel(struct iio_dev *iio_dev,
0492 struct iio_chan_spec *chan, bool output, unsigned id)
0493 {
0494 chan->type = IIO_VOLTAGE;
0495 chan->indexed = 1;
0496 chan->output = output;
0497 chan->channel = id;
0498 chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW);
0499 chan->info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE);
0500 chan->scan_type.sign = 'u';
0501 chan->scan_type.realbits = 12;
0502 chan->scan_type.storagebits = 16;
0503 chan->ext_info = ad5592r_ext_info;
0504 }
0505
0506 static int ad5592r_alloc_channels(struct iio_dev *iio_dev)
0507 {
0508 struct ad5592r_state *st = iio_priv(iio_dev);
0509 unsigned i, curr_channel = 0,
0510 num_channels = st->num_channels;
0511 struct iio_chan_spec *channels;
0512 struct fwnode_handle *child;
0513 u32 reg, tmp;
0514 int ret;
0515
0516 device_for_each_child_node(st->dev, child) {
0517 ret = fwnode_property_read_u32(child, "reg", ®);
0518 if (ret || reg >= ARRAY_SIZE(st->channel_modes))
0519 continue;
0520
0521 ret = fwnode_property_read_u32(child, "adi,mode", &tmp);
0522 if (!ret)
0523 st->channel_modes[reg] = tmp;
0524
0525 ret = fwnode_property_read_u32(child, "adi,off-state", &tmp);
0526 if (!ret)
0527 st->channel_offstate[reg] = tmp;
0528 }
0529
0530 channels = devm_kcalloc(st->dev,
0531 1 + 2 * num_channels, sizeof(*channels),
0532 GFP_KERNEL);
0533 if (!channels)
0534 return -ENOMEM;
0535
0536 for (i = 0; i < num_channels; i++) {
0537 switch (st->channel_modes[i]) {
0538 case CH_MODE_DAC:
0539 ad5592r_setup_channel(iio_dev, &channels[curr_channel],
0540 true, i);
0541 curr_channel++;
0542 break;
0543
0544 case CH_MODE_ADC:
0545 ad5592r_setup_channel(iio_dev, &channels[curr_channel],
0546 false, i);
0547 curr_channel++;
0548 break;
0549
0550 case CH_MODE_DAC_AND_ADC:
0551 ad5592r_setup_channel(iio_dev, &channels[curr_channel],
0552 true, i);
0553 curr_channel++;
0554 ad5592r_setup_channel(iio_dev, &channels[curr_channel],
0555 false, i);
0556 curr_channel++;
0557 break;
0558
0559 default:
0560 continue;
0561 }
0562 }
0563
0564 channels[curr_channel].type = IIO_TEMP;
0565 channels[curr_channel].channel = 8;
0566 channels[curr_channel].info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
0567 BIT(IIO_CHAN_INFO_SCALE) |
0568 BIT(IIO_CHAN_INFO_OFFSET);
0569 curr_channel++;
0570
0571 iio_dev->num_channels = curr_channel;
0572 iio_dev->channels = channels;
0573
0574 return 0;
0575 }
0576
0577 static void ad5592r_init_scales(struct ad5592r_state *st, int vref_mV)
0578 {
0579 s64 tmp = (s64)vref_mV * 1000000000LL >> 12;
0580
0581 st->scale_avail[0][0] =
0582 div_s64_rem(tmp, 1000000000LL, &st->scale_avail[0][1]);
0583 st->scale_avail[1][0] =
0584 div_s64_rem(tmp * 2, 1000000000LL, &st->scale_avail[1][1]);
0585 }
0586
0587 int ad5592r_probe(struct device *dev, const char *name,
0588 const struct ad5592r_rw_ops *ops)
0589 {
0590 struct iio_dev *iio_dev;
0591 struct ad5592r_state *st;
0592 int ret;
0593
0594 iio_dev = devm_iio_device_alloc(dev, sizeof(*st));
0595 if (!iio_dev)
0596 return -ENOMEM;
0597
0598 st = iio_priv(iio_dev);
0599 st->dev = dev;
0600 st->ops = ops;
0601 st->num_channels = 8;
0602 dev_set_drvdata(dev, iio_dev);
0603
0604 st->reg = devm_regulator_get_optional(dev, "vref");
0605 if (IS_ERR(st->reg)) {
0606 if ((PTR_ERR(st->reg) != -ENODEV) && dev_fwnode(dev))
0607 return PTR_ERR(st->reg);
0608
0609 st->reg = NULL;
0610 } else {
0611 ret = regulator_enable(st->reg);
0612 if (ret)
0613 return ret;
0614 }
0615
0616 iio_dev->name = name;
0617 iio_dev->info = &ad5592r_info;
0618 iio_dev->modes = INDIO_DIRECT_MODE;
0619
0620 mutex_init(&st->lock);
0621
0622 ad5592r_init_scales(st, ad5592r_get_vref(st));
0623
0624 ret = ad5592r_reset(st);
0625 if (ret)
0626 goto error_disable_reg;
0627
0628 ret = ops->reg_write(st, AD5592R_REG_PD,
0629 (st->reg == NULL) ? AD5592R_REG_PD_EN_REF : 0);
0630 if (ret)
0631 goto error_disable_reg;
0632
0633 ret = ad5592r_alloc_channels(iio_dev);
0634 if (ret)
0635 goto error_disable_reg;
0636
0637 ret = ad5592r_set_channel_modes(st);
0638 if (ret)
0639 goto error_reset_ch_modes;
0640
0641 ret = iio_device_register(iio_dev);
0642 if (ret)
0643 goto error_reset_ch_modes;
0644
0645 ret = ad5592r_gpio_init(st);
0646 if (ret)
0647 goto error_dev_unregister;
0648
0649 return 0;
0650
0651 error_dev_unregister:
0652 iio_device_unregister(iio_dev);
0653
0654 error_reset_ch_modes:
0655 ad5592r_reset_channel_modes(st);
0656
0657 error_disable_reg:
0658 if (st->reg)
0659 regulator_disable(st->reg);
0660
0661 return ret;
0662 }
0663 EXPORT_SYMBOL_NS_GPL(ad5592r_probe, IIO_AD5592R);
0664
0665 void ad5592r_remove(struct device *dev)
0666 {
0667 struct iio_dev *iio_dev = dev_get_drvdata(dev);
0668 struct ad5592r_state *st = iio_priv(iio_dev);
0669
0670 iio_device_unregister(iio_dev);
0671 ad5592r_reset_channel_modes(st);
0672 ad5592r_gpio_cleanup(st);
0673
0674 if (st->reg)
0675 regulator_disable(st->reg);
0676 }
0677 EXPORT_SYMBOL_NS_GPL(ad5592r_remove, IIO_AD5592R);
0678
0679 MODULE_AUTHOR("Paul Cercueil <paul.cercueil@analog.com>");
0680 MODULE_DESCRIPTION("Analog Devices AD5592R multi-channel converters");
0681 MODULE_LICENSE("GPL v2");