ad5592r-base.c 15 KB

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