ad7091r-base.c 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * AD7091RX Analog to Digital converter driver
  4. *
  5. * Copyright 2014-2019 Analog Devices Inc.
  6. */
  7. #include <linux/bitops.h>
  8. #include <linux/bitfield.h>
  9. #include <linux/cleanup.h>
  10. #include <linux/iio/events.h>
  11. #include <linux/iio/iio.h>
  12. #include <linux/interrupt.h>
  13. #include <linux/module.h>
  14. #include <linux/regmap.h>
  15. #include <linux/regulator/consumer.h>
  16. #include "ad7091r-base.h"
  17. const struct iio_event_spec ad7091r_events[] = {
  18. {
  19. .type = IIO_EV_TYPE_THRESH,
  20. .dir = IIO_EV_DIR_RISING,
  21. .mask_separate = BIT(IIO_EV_INFO_VALUE) |
  22. BIT(IIO_EV_INFO_ENABLE),
  23. },
  24. {
  25. .type = IIO_EV_TYPE_THRESH,
  26. .dir = IIO_EV_DIR_FALLING,
  27. .mask_separate = BIT(IIO_EV_INFO_VALUE) |
  28. BIT(IIO_EV_INFO_ENABLE),
  29. },
  30. {
  31. .type = IIO_EV_TYPE_THRESH,
  32. .dir = IIO_EV_DIR_EITHER,
  33. .mask_separate = BIT(IIO_EV_INFO_HYSTERESIS),
  34. },
  35. };
  36. EXPORT_SYMBOL_NS_GPL(ad7091r_events, "IIO_AD7091R");
  37. static int ad7091r_set_channel(struct ad7091r_state *st, unsigned int channel)
  38. {
  39. unsigned int dummy;
  40. int ret;
  41. /* AD7091R_REG_CHANNEL specified which channels to be converted */
  42. ret = regmap_write(st->map, AD7091R_REG_CHANNEL,
  43. BIT(channel) | (BIT(channel) << 8));
  44. if (ret)
  45. return ret;
  46. /*
  47. * There is a latency of one conversion before the channel conversion
  48. * sequence is updated
  49. */
  50. return regmap_read(st->map, AD7091R_REG_RESULT, &dummy);
  51. }
  52. static int ad7091r_read_one(struct iio_dev *iio_dev,
  53. unsigned int channel, unsigned int *read_val)
  54. {
  55. struct ad7091r_state *st = iio_priv(iio_dev);
  56. unsigned int val;
  57. int ret;
  58. ret = ad7091r_set_channel(st, channel);
  59. if (ret)
  60. return ret;
  61. ret = regmap_read(st->map, AD7091R_REG_RESULT, &val);
  62. if (ret)
  63. return ret;
  64. if (st->chip_info->reg_result_chan_id(val) != channel)
  65. return -EIO;
  66. *read_val = AD7091R_REG_RESULT_CONV_RESULT(val);
  67. return 0;
  68. }
  69. static int ad7091r_read_raw(struct iio_dev *iio_dev,
  70. struct iio_chan_spec const *chan,
  71. int *val, int *val2, long m)
  72. {
  73. struct ad7091r_state *st = iio_priv(iio_dev);
  74. unsigned int read_val;
  75. int ret;
  76. guard(mutex)(&st->lock);
  77. switch (m) {
  78. case IIO_CHAN_INFO_RAW:
  79. if (st->mode != AD7091R_MODE_COMMAND)
  80. return -EBUSY;
  81. ret = ad7091r_read_one(iio_dev, chan->channel, &read_val);
  82. if (ret)
  83. return ret;
  84. *val = read_val;
  85. return IIO_VAL_INT;
  86. case IIO_CHAN_INFO_SCALE:
  87. if (st->vref) {
  88. ret = regulator_get_voltage(st->vref);
  89. if (ret < 0)
  90. return ret;
  91. *val = ret / 1000;
  92. } else {
  93. *val = st->chip_info->vref_mV;
  94. }
  95. *val2 = chan->scan_type.realbits;
  96. return IIO_VAL_FRACTIONAL_LOG2;
  97. default:
  98. return -EINVAL;
  99. }
  100. }
  101. static int ad7091r_read_event_config(struct iio_dev *indio_dev,
  102. const struct iio_chan_spec *chan,
  103. enum iio_event_type type,
  104. enum iio_event_direction dir)
  105. {
  106. struct ad7091r_state *st = iio_priv(indio_dev);
  107. int val, ret;
  108. switch (dir) {
  109. case IIO_EV_DIR_RISING:
  110. ret = regmap_read(st->map,
  111. AD7091R_REG_CH_HIGH_LIMIT(chan->channel),
  112. &val);
  113. if (ret)
  114. return ret;
  115. return val != AD7091R_HIGH_LIMIT;
  116. case IIO_EV_DIR_FALLING:
  117. ret = regmap_read(st->map,
  118. AD7091R_REG_CH_LOW_LIMIT(chan->channel),
  119. &val);
  120. if (ret)
  121. return ret;
  122. return val != AD7091R_LOW_LIMIT;
  123. default:
  124. return -EINVAL;
  125. }
  126. }
  127. static int ad7091r_write_event_config(struct iio_dev *indio_dev,
  128. const struct iio_chan_spec *chan,
  129. enum iio_event_type type,
  130. enum iio_event_direction dir,
  131. bool state)
  132. {
  133. struct ad7091r_state *st = iio_priv(indio_dev);
  134. if (state) {
  135. return regmap_set_bits(st->map, AD7091R_REG_CONF,
  136. AD7091R_REG_CONF_ALERT_EN);
  137. } else {
  138. /*
  139. * Set thresholds either to 0 or to 2^12 - 1 as appropriate to
  140. * prevent alerts and thus disable event generation.
  141. */
  142. switch (dir) {
  143. case IIO_EV_DIR_RISING:
  144. return regmap_write(st->map,
  145. AD7091R_REG_CH_HIGH_LIMIT(chan->channel),
  146. AD7091R_HIGH_LIMIT);
  147. case IIO_EV_DIR_FALLING:
  148. return regmap_write(st->map,
  149. AD7091R_REG_CH_LOW_LIMIT(chan->channel),
  150. AD7091R_LOW_LIMIT);
  151. default:
  152. return -EINVAL;
  153. }
  154. }
  155. }
  156. static int ad7091r_read_event_value(struct iio_dev *indio_dev,
  157. const struct iio_chan_spec *chan,
  158. enum iio_event_type type,
  159. enum iio_event_direction dir,
  160. enum iio_event_info info, int *val, int *val2)
  161. {
  162. struct ad7091r_state *st = iio_priv(indio_dev);
  163. int ret;
  164. switch (info) {
  165. case IIO_EV_INFO_VALUE:
  166. switch (dir) {
  167. case IIO_EV_DIR_RISING:
  168. ret = regmap_read(st->map,
  169. AD7091R_REG_CH_HIGH_LIMIT(chan->channel),
  170. val);
  171. if (ret)
  172. return ret;
  173. return IIO_VAL_INT;
  174. case IIO_EV_DIR_FALLING:
  175. ret = regmap_read(st->map,
  176. AD7091R_REG_CH_LOW_LIMIT(chan->channel),
  177. val);
  178. if (ret)
  179. return ret;
  180. return IIO_VAL_INT;
  181. default:
  182. return -EINVAL;
  183. }
  184. case IIO_EV_INFO_HYSTERESIS:
  185. ret = regmap_read(st->map,
  186. AD7091R_REG_CH_HYSTERESIS(chan->channel),
  187. val);
  188. if (ret)
  189. return ret;
  190. return IIO_VAL_INT;
  191. default:
  192. return -EINVAL;
  193. }
  194. }
  195. static int ad7091r_write_event_value(struct iio_dev *indio_dev,
  196. const struct iio_chan_spec *chan,
  197. enum iio_event_type type,
  198. enum iio_event_direction dir,
  199. enum iio_event_info info, int val, int val2)
  200. {
  201. struct ad7091r_state *st = iio_priv(indio_dev);
  202. switch (info) {
  203. case IIO_EV_INFO_VALUE:
  204. switch (dir) {
  205. case IIO_EV_DIR_RISING:
  206. return regmap_write(st->map,
  207. AD7091R_REG_CH_HIGH_LIMIT(chan->channel),
  208. val);
  209. case IIO_EV_DIR_FALLING:
  210. return regmap_write(st->map,
  211. AD7091R_REG_CH_LOW_LIMIT(chan->channel),
  212. val);
  213. default:
  214. return -EINVAL;
  215. }
  216. case IIO_EV_INFO_HYSTERESIS:
  217. return regmap_write(st->map,
  218. AD7091R_REG_CH_HYSTERESIS(chan->channel),
  219. val);
  220. default:
  221. return -EINVAL;
  222. }
  223. }
  224. static const struct iio_info ad7091r_info = {
  225. .read_raw = ad7091r_read_raw,
  226. .read_event_config = &ad7091r_read_event_config,
  227. .write_event_config = &ad7091r_write_event_config,
  228. .read_event_value = &ad7091r_read_event_value,
  229. .write_event_value = &ad7091r_write_event_value,
  230. };
  231. static irqreturn_t ad7091r_event_handler(int irq, void *private)
  232. {
  233. struct iio_dev *iio_dev = private;
  234. struct ad7091r_state *st = iio_priv(iio_dev);
  235. unsigned int i, read_val;
  236. int ret;
  237. s64 timestamp = iio_get_time_ns(iio_dev);
  238. ret = regmap_read(st->map, AD7091R_REG_ALERT, &read_val);
  239. if (ret)
  240. return IRQ_HANDLED;
  241. for (i = 0; i < st->chip_info->num_channels; i++) {
  242. if (read_val & BIT(i * 2))
  243. iio_push_event(iio_dev,
  244. IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, i,
  245. IIO_EV_TYPE_THRESH,
  246. IIO_EV_DIR_RISING), timestamp);
  247. if (read_val & BIT(i * 2 + 1))
  248. iio_push_event(iio_dev,
  249. IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, i,
  250. IIO_EV_TYPE_THRESH,
  251. IIO_EV_DIR_FALLING), timestamp);
  252. }
  253. return IRQ_HANDLED;
  254. }
  255. static void ad7091r_remove(void *data)
  256. {
  257. struct ad7091r_state *st = data;
  258. regulator_disable(st->vref);
  259. }
  260. int ad7091r_probe(struct device *dev, const struct ad7091r_init_info *init_info,
  261. int irq)
  262. {
  263. struct iio_dev *iio_dev;
  264. struct ad7091r_state *st;
  265. int ret;
  266. iio_dev = devm_iio_device_alloc(dev, sizeof(*st));
  267. if (!iio_dev)
  268. return -ENOMEM;
  269. st = iio_priv(iio_dev);
  270. st->dev = dev;
  271. init_info->init_adc_regmap(st, init_info->regmap_config);
  272. if (IS_ERR(st->map))
  273. return dev_err_probe(st->dev, PTR_ERR(st->map),
  274. "Error initializing regmap\n");
  275. iio_dev->info = &ad7091r_info;
  276. iio_dev->modes = INDIO_DIRECT_MODE;
  277. if (init_info->setup) {
  278. ret = init_info->setup(st);
  279. if (ret < 0)
  280. return ret;
  281. }
  282. if (irq) {
  283. st->chip_info = init_info->info_irq;
  284. ret = regmap_update_bits(st->map, AD7091R_REG_CONF,
  285. AD7091R_REG_CONF_ALERT_EN, BIT(4));
  286. if (ret)
  287. return ret;
  288. ret = devm_request_threaded_irq(dev, irq, NULL,
  289. ad7091r_event_handler,
  290. IRQF_TRIGGER_FALLING |
  291. IRQF_ONESHOT,
  292. st->chip_info->name, iio_dev);
  293. if (ret)
  294. return ret;
  295. } else {
  296. st->chip_info = init_info->info_no_irq;
  297. }
  298. iio_dev->name = st->chip_info->name;
  299. iio_dev->num_channels = st->chip_info->num_channels;
  300. iio_dev->channels = st->chip_info->channels;
  301. st->vref = devm_regulator_get_optional(dev, "vref");
  302. if (IS_ERR(st->vref)) {
  303. if (PTR_ERR(st->vref) == -EPROBE_DEFER)
  304. return -EPROBE_DEFER;
  305. st->vref = NULL;
  306. /* Enable internal vref */
  307. ret = regmap_set_bits(st->map, AD7091R_REG_CONF,
  308. AD7091R_REG_CONF_INT_VREF);
  309. if (ret)
  310. return dev_err_probe(st->dev, ret,
  311. "Error on enable internal reference\n");
  312. } else {
  313. ret = regulator_enable(st->vref);
  314. if (ret)
  315. return ret;
  316. ret = devm_add_action_or_reset(dev, ad7091r_remove, st);
  317. if (ret)
  318. return ret;
  319. }
  320. /* Use command mode by default to convert only desired channels*/
  321. ret = st->chip_info->set_mode(st, AD7091R_MODE_COMMAND);
  322. if (ret)
  323. return ret;
  324. return devm_iio_device_register(dev, iio_dev);
  325. }
  326. EXPORT_SYMBOL_NS_GPL(ad7091r_probe, "IIO_AD7091R");
  327. bool ad7091r_writeable_reg(struct device *dev, unsigned int reg)
  328. {
  329. switch (reg) {
  330. case AD7091R_REG_RESULT:
  331. case AD7091R_REG_ALERT:
  332. return false;
  333. default:
  334. return true;
  335. }
  336. }
  337. EXPORT_SYMBOL_NS_GPL(ad7091r_writeable_reg, "IIO_AD7091R");
  338. bool ad7091r_volatile_reg(struct device *dev, unsigned int reg)
  339. {
  340. /* The volatile ad7091r registers are also the only RO ones. */
  341. return !ad7091r_writeable_reg(dev, reg);
  342. }
  343. EXPORT_SYMBOL_NS_GPL(ad7091r_volatile_reg, "IIO_AD7091R");
  344. MODULE_AUTHOR("Beniamin Bia <beniamin.bia@analog.com>");
  345. MODULE_DESCRIPTION("Analog Devices AD7091Rx multi-channel converters");
  346. MODULE_LICENSE("GPL v2");