ad7816.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. /*
  2. * AD7816 digital temperature sensor driver supporting AD7816/7/8
  3. *
  4. * Copyright 2010 Analog Devices Inc.
  5. *
  6. * Licensed under the GPL-2 or later.
  7. */
  8. #include <linux/interrupt.h>
  9. #include <linux/gpio.h>
  10. #include <linux/device.h>
  11. #include <linux/kernel.h>
  12. #include <linux/slab.h>
  13. #include <linux/sysfs.h>
  14. #include <linux/list.h>
  15. #include <linux/spi/spi.h>
  16. #include <linux/module.h>
  17. #include <linux/iio/iio.h>
  18. #include <linux/iio/sysfs.h>
  19. #include <linux/iio/events.h>
  20. /*
  21. * AD7816 config masks
  22. */
  23. #define AD7816_FULL 0x1
  24. #define AD7816_PD 0x2
  25. #define AD7816_CS_MASK 0x7
  26. #define AD7816_CS_MAX 0x4
  27. /*
  28. * AD7816 temperature masks
  29. */
  30. #define AD7816_VALUE_OFFSET 6
  31. #define AD7816_BOUND_VALUE_BASE 0x8
  32. #define AD7816_BOUND_VALUE_MIN -95
  33. #define AD7816_BOUND_VALUE_MAX 152
  34. #define AD7816_TEMP_FLOAT_OFFSET 2
  35. #define AD7816_TEMP_FLOAT_MASK 0x3
  36. /*
  37. * struct ad7816_chip_info - chip specific information
  38. */
  39. struct ad7816_chip_info {
  40. struct spi_device *spi_dev;
  41. u16 rdwr_pin;
  42. u16 convert_pin;
  43. u16 busy_pin;
  44. u8 oti_data[AD7816_CS_MAX + 1];
  45. u8 channel_id; /* 0 always be temperature */
  46. u8 mode;
  47. };
  48. /*
  49. * ad7816 data access by SPI
  50. */
  51. static int ad7816_spi_read(struct ad7816_chip_info *chip, u16 *data)
  52. {
  53. struct spi_device *spi_dev = chip->spi_dev;
  54. int ret = 0;
  55. __be16 buf;
  56. gpio_set_value(chip->rdwr_pin, 1);
  57. gpio_set_value(chip->rdwr_pin, 0);
  58. ret = spi_write(spi_dev, &chip->channel_id, sizeof(chip->channel_id));
  59. if (ret < 0) {
  60. dev_err(&spi_dev->dev, "SPI channel setting error\n");
  61. return ret;
  62. }
  63. gpio_set_value(chip->rdwr_pin, 1);
  64. if (chip->mode == AD7816_PD) { /* operating mode 2 */
  65. gpio_set_value(chip->convert_pin, 1);
  66. gpio_set_value(chip->convert_pin, 0);
  67. } else { /* operating mode 1 */
  68. gpio_set_value(chip->convert_pin, 0);
  69. gpio_set_value(chip->convert_pin, 1);
  70. }
  71. while (gpio_get_value(chip->busy_pin))
  72. cpu_relax();
  73. gpio_set_value(chip->rdwr_pin, 0);
  74. gpio_set_value(chip->rdwr_pin, 1);
  75. ret = spi_read(spi_dev, &buf, sizeof(*data));
  76. if (ret < 0) {
  77. dev_err(&spi_dev->dev, "SPI data read error\n");
  78. return ret;
  79. }
  80. *data = be16_to_cpu(buf);
  81. return ret;
  82. }
  83. static int ad7816_spi_write(struct ad7816_chip_info *chip, u8 data)
  84. {
  85. struct spi_device *spi_dev = chip->spi_dev;
  86. int ret = 0;
  87. gpio_set_value(chip->rdwr_pin, 1);
  88. gpio_set_value(chip->rdwr_pin, 0);
  89. ret = spi_write(spi_dev, &data, sizeof(data));
  90. if (ret < 0)
  91. dev_err(&spi_dev->dev, "SPI oti data write error\n");
  92. return ret;
  93. }
  94. static ssize_t ad7816_show_mode(struct device *dev,
  95. struct device_attribute *attr,
  96. char *buf)
  97. {
  98. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  99. struct ad7816_chip_info *chip = iio_priv(indio_dev);
  100. if (chip->mode)
  101. return sprintf(buf, "power-save\n");
  102. return sprintf(buf, "full\n");
  103. }
  104. static ssize_t ad7816_store_mode(struct device *dev,
  105. struct device_attribute *attr,
  106. const char *buf,
  107. size_t len)
  108. {
  109. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  110. struct ad7816_chip_info *chip = iio_priv(indio_dev);
  111. if (strcmp(buf, "full")) {
  112. gpio_set_value(chip->rdwr_pin, 1);
  113. chip->mode = AD7816_FULL;
  114. } else {
  115. gpio_set_value(chip->rdwr_pin, 0);
  116. chip->mode = AD7816_PD;
  117. }
  118. return len;
  119. }
  120. static IIO_DEVICE_ATTR(mode, S_IRUGO | S_IWUSR,
  121. ad7816_show_mode,
  122. ad7816_store_mode,
  123. 0);
  124. static ssize_t ad7816_show_available_modes(struct device *dev,
  125. struct device_attribute *attr,
  126. char *buf)
  127. {
  128. return sprintf(buf, "full\npower-save\n");
  129. }
  130. static IIO_DEVICE_ATTR(available_modes, S_IRUGO, ad7816_show_available_modes,
  131. NULL, 0);
  132. static ssize_t ad7816_show_channel(struct device *dev,
  133. struct device_attribute *attr,
  134. char *buf)
  135. {
  136. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  137. struct ad7816_chip_info *chip = iio_priv(indio_dev);
  138. return sprintf(buf, "%d\n", chip->channel_id);
  139. }
  140. static ssize_t ad7816_store_channel(struct device *dev,
  141. struct device_attribute *attr,
  142. const char *buf,
  143. size_t len)
  144. {
  145. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  146. struct ad7816_chip_info *chip = iio_priv(indio_dev);
  147. unsigned long data;
  148. int ret;
  149. ret = kstrtoul(buf, 10, &data);
  150. if (ret)
  151. return ret;
  152. if (data > AD7816_CS_MAX && data != AD7816_CS_MASK) {
  153. dev_err(&chip->spi_dev->dev, "Invalid channel id %lu for %s.\n",
  154. data, indio_dev->name);
  155. return -EINVAL;
  156. } else if (strcmp(indio_dev->name, "ad7818") == 0 && data > 1) {
  157. dev_err(&chip->spi_dev->dev,
  158. "Invalid channel id %lu for ad7818.\n", data);
  159. return -EINVAL;
  160. } else if (strcmp(indio_dev->name, "ad7816") == 0 && data > 0) {
  161. dev_err(&chip->spi_dev->dev,
  162. "Invalid channel id %lu for ad7816.\n", data);
  163. return -EINVAL;
  164. }
  165. chip->channel_id = data;
  166. return len;
  167. }
  168. static IIO_DEVICE_ATTR(channel, S_IRUGO | S_IWUSR,
  169. ad7816_show_channel,
  170. ad7816_store_channel,
  171. 0);
  172. static ssize_t ad7816_show_value(struct device *dev,
  173. struct device_attribute *attr,
  174. char *buf)
  175. {
  176. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  177. struct ad7816_chip_info *chip = iio_priv(indio_dev);
  178. u16 data;
  179. s8 value;
  180. int ret;
  181. ret = ad7816_spi_read(chip, &data);
  182. if (ret)
  183. return -EIO;
  184. data >>= AD7816_VALUE_OFFSET;
  185. if (chip->channel_id == 0) {
  186. value = (s8)((data >> AD7816_TEMP_FLOAT_OFFSET) - 103);
  187. data &= AD7816_TEMP_FLOAT_MASK;
  188. if (value < 0)
  189. data = (1 << AD7816_TEMP_FLOAT_OFFSET) - data;
  190. return sprintf(buf, "%d.%.2d\n", value, data * 25);
  191. }
  192. return sprintf(buf, "%u\n", data);
  193. }
  194. static IIO_DEVICE_ATTR(value, S_IRUGO, ad7816_show_value, NULL, 0);
  195. static struct attribute *ad7816_attributes[] = {
  196. &iio_dev_attr_available_modes.dev_attr.attr,
  197. &iio_dev_attr_mode.dev_attr.attr,
  198. &iio_dev_attr_channel.dev_attr.attr,
  199. &iio_dev_attr_value.dev_attr.attr,
  200. NULL,
  201. };
  202. static const struct attribute_group ad7816_attribute_group = {
  203. .attrs = ad7816_attributes,
  204. };
  205. /*
  206. * temperature bound events
  207. */
  208. #define IIO_EVENT_CODE_AD7816_OTI IIO_UNMOD_EVENT_CODE(IIO_TEMP, \
  209. 0, \
  210. IIO_EV_TYPE_THRESH, \
  211. IIO_EV_DIR_FALLING)
  212. static irqreturn_t ad7816_event_handler(int irq, void *private)
  213. {
  214. iio_push_event(private, IIO_EVENT_CODE_AD7816_OTI, iio_get_time_ns());
  215. return IRQ_HANDLED;
  216. }
  217. static ssize_t ad7816_show_oti(struct device *dev,
  218. struct device_attribute *attr,
  219. char *buf)
  220. {
  221. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  222. struct ad7816_chip_info *chip = iio_priv(indio_dev);
  223. int value;
  224. if (chip->channel_id > AD7816_CS_MAX) {
  225. dev_err(dev, "Invalid oti channel id %d.\n", chip->channel_id);
  226. return -EINVAL;
  227. } else if (chip->channel_id == 0) {
  228. value = AD7816_BOUND_VALUE_MIN +
  229. (chip->oti_data[chip->channel_id] -
  230. AD7816_BOUND_VALUE_BASE);
  231. return sprintf(buf, "%d\n", value);
  232. }
  233. return sprintf(buf, "%u\n", chip->oti_data[chip->channel_id]);
  234. }
  235. static inline ssize_t ad7816_set_oti(struct device *dev,
  236. struct device_attribute *attr,
  237. const char *buf,
  238. size_t len)
  239. {
  240. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  241. struct ad7816_chip_info *chip = iio_priv(indio_dev);
  242. long value;
  243. u8 data;
  244. int ret;
  245. ret = kstrtol(buf, 10, &value);
  246. if (ret)
  247. return ret;
  248. if (chip->channel_id > AD7816_CS_MAX) {
  249. dev_err(dev, "Invalid oti channel id %d.\n", chip->channel_id);
  250. return -EINVAL;
  251. } else if (chip->channel_id == 0) {
  252. if (ret || value < AD7816_BOUND_VALUE_MIN ||
  253. value > AD7816_BOUND_VALUE_MAX)
  254. return -EINVAL;
  255. data = (u8)(value - AD7816_BOUND_VALUE_MIN +
  256. AD7816_BOUND_VALUE_BASE);
  257. } else {
  258. if (ret || value < AD7816_BOUND_VALUE_BASE || value > 255)
  259. return -EINVAL;
  260. data = (u8)value;
  261. }
  262. ret = ad7816_spi_write(chip, data);
  263. if (ret)
  264. return -EIO;
  265. chip->oti_data[chip->channel_id] = data;
  266. return len;
  267. }
  268. static IIO_DEVICE_ATTR(oti, S_IRUGO | S_IWUSR,
  269. ad7816_show_oti, ad7816_set_oti, 0);
  270. static struct attribute *ad7816_event_attributes[] = {
  271. &iio_dev_attr_oti.dev_attr.attr,
  272. NULL,
  273. };
  274. static struct attribute_group ad7816_event_attribute_group = {
  275. .attrs = ad7816_event_attributes,
  276. .name = "events",
  277. };
  278. static const struct iio_info ad7816_info = {
  279. .attrs = &ad7816_attribute_group,
  280. .event_attrs = &ad7816_event_attribute_group,
  281. .driver_module = THIS_MODULE,
  282. };
  283. /*
  284. * device probe and remove
  285. */
  286. static int ad7816_probe(struct spi_device *spi_dev)
  287. {
  288. struct ad7816_chip_info *chip;
  289. struct iio_dev *indio_dev;
  290. unsigned short *pins = spi_dev->dev.platform_data;
  291. int ret = 0;
  292. int i;
  293. if (!pins) {
  294. dev_err(&spi_dev->dev, "No necessary GPIO platform data.\n");
  295. return -EINVAL;
  296. }
  297. indio_dev = devm_iio_device_alloc(&spi_dev->dev, sizeof(*chip));
  298. if (!indio_dev)
  299. return -ENOMEM;
  300. chip = iio_priv(indio_dev);
  301. /* this is only used for device removal purposes */
  302. dev_set_drvdata(&spi_dev->dev, indio_dev);
  303. chip->spi_dev = spi_dev;
  304. for (i = 0; i <= AD7816_CS_MAX; i++)
  305. chip->oti_data[i] = 203;
  306. chip->rdwr_pin = pins[0];
  307. chip->convert_pin = pins[1];
  308. chip->busy_pin = pins[2];
  309. ret = devm_gpio_request(&spi_dev->dev, chip->rdwr_pin,
  310. spi_get_device_id(spi_dev)->name);
  311. if (ret) {
  312. dev_err(&spi_dev->dev, "Fail to request rdwr gpio PIN %d.\n",
  313. chip->rdwr_pin);
  314. return ret;
  315. }
  316. gpio_direction_input(chip->rdwr_pin);
  317. ret = devm_gpio_request(&spi_dev->dev, chip->convert_pin,
  318. spi_get_device_id(spi_dev)->name);
  319. if (ret) {
  320. dev_err(&spi_dev->dev, "Fail to request convert gpio PIN %d.\n",
  321. chip->convert_pin);
  322. return ret;
  323. }
  324. gpio_direction_input(chip->convert_pin);
  325. ret = devm_gpio_request(&spi_dev->dev, chip->busy_pin,
  326. spi_get_device_id(spi_dev)->name);
  327. if (ret) {
  328. dev_err(&spi_dev->dev, "Fail to request busy gpio PIN %d.\n",
  329. chip->busy_pin);
  330. return ret;
  331. }
  332. gpio_direction_input(chip->busy_pin);
  333. indio_dev->name = spi_get_device_id(spi_dev)->name;
  334. indio_dev->dev.parent = &spi_dev->dev;
  335. indio_dev->info = &ad7816_info;
  336. indio_dev->modes = INDIO_DIRECT_MODE;
  337. if (spi_dev->irq) {
  338. /* Only low trigger is supported in ad7816/7/8 */
  339. ret = devm_request_threaded_irq(&spi_dev->dev, spi_dev->irq,
  340. NULL,
  341. &ad7816_event_handler,
  342. IRQF_TRIGGER_LOW | IRQF_ONESHOT,
  343. indio_dev->name,
  344. indio_dev);
  345. if (ret)
  346. return ret;
  347. }
  348. ret = devm_iio_device_register(&spi_dev->dev, indio_dev);
  349. if (ret)
  350. return ret;
  351. dev_info(&spi_dev->dev, "%s temperature sensor and ADC registered.\n",
  352. indio_dev->name);
  353. return 0;
  354. }
  355. static const struct spi_device_id ad7816_id[] = {
  356. { "ad7816", 0 },
  357. { "ad7817", 0 },
  358. { "ad7818", 0 },
  359. {}
  360. };
  361. MODULE_DEVICE_TABLE(spi, ad7816_id);
  362. static struct spi_driver ad7816_driver = {
  363. .driver = {
  364. .name = "ad7816",
  365. },
  366. .probe = ad7816_probe,
  367. .id_table = ad7816_id,
  368. };
  369. module_spi_driver(ad7816_driver);
  370. MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
  371. MODULE_DESCRIPTION("Analog Devices AD7816/7/8 digital temperature sensor driver");
  372. MODULE_LICENSE("GPL v2");