ads7871.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * ads7871 - driver for TI ADS7871 A/D converter
  4. *
  5. * Copyright (c) 2010 Paul Thomas <[email protected]>
  6. *
  7. * You need to have something like this in struct spi_board_info
  8. * {
  9. * .modalias = "ads7871",
  10. * .max_speed_hz = 2*1000*1000,
  11. * .chip_select = 0,
  12. * .bus_num = 1,
  13. * },
  14. */
  15. /*From figure 18 in the datasheet*/
  16. /*Register addresses*/
  17. #define REG_LS_BYTE 0 /*A/D Output Data, LS Byte*/
  18. #define REG_MS_BYTE 1 /*A/D Output Data, MS Byte*/
  19. #define REG_PGA_VALID 2 /*PGA Valid Register*/
  20. #define REG_AD_CONTROL 3 /*A/D Control Register*/
  21. #define REG_GAIN_MUX 4 /*Gain/Mux Register*/
  22. #define REG_IO_STATE 5 /*Digital I/O State Register*/
  23. #define REG_IO_CONTROL 6 /*Digital I/O Control Register*/
  24. #define REG_OSC_CONTROL 7 /*Rev/Oscillator Control Register*/
  25. #define REG_SER_CONTROL 24 /*Serial Interface Control Register*/
  26. #define REG_ID 31 /*ID Register*/
  27. /*
  28. * From figure 17 in the datasheet
  29. * These bits get ORed with the address to form
  30. * the instruction byte
  31. */
  32. /*Instruction Bit masks*/
  33. #define INST_MODE_BM (1 << 7)
  34. #define INST_READ_BM (1 << 6)
  35. #define INST_16BIT_BM (1 << 5)
  36. /*From figure 18 in the datasheet*/
  37. /*bit masks for Rev/Oscillator Control Register*/
  38. #define MUX_CNV_BV 7
  39. #define MUX_CNV_BM (1 << MUX_CNV_BV)
  40. #define MUX_M3_BM (1 << 3) /*M3 selects single ended*/
  41. #define MUX_G_BV 4 /*allows for reg = (gain << MUX_G_BV) | ...*/
  42. /*From figure 18 in the datasheet*/
  43. /*bit masks for Rev/Oscillator Control Register*/
  44. #define OSC_OSCR_BM (1 << 5)
  45. #define OSC_OSCE_BM (1 << 4)
  46. #define OSC_REFE_BM (1 << 3)
  47. #define OSC_BUFE_BM (1 << 2)
  48. #define OSC_R2V_BM (1 << 1)
  49. #define OSC_RBG_BM (1 << 0)
  50. #include <linux/module.h>
  51. #include <linux/init.h>
  52. #include <linux/spi/spi.h>
  53. #include <linux/hwmon.h>
  54. #include <linux/hwmon-sysfs.h>
  55. #include <linux/err.h>
  56. #include <linux/delay.h>
  57. #define DEVICE_NAME "ads7871"
  58. struct ads7871_data {
  59. struct spi_device *spi;
  60. };
  61. static int ads7871_read_reg8(struct spi_device *spi, int reg)
  62. {
  63. int ret;
  64. reg = reg | INST_READ_BM;
  65. ret = spi_w8r8(spi, reg);
  66. return ret;
  67. }
  68. static int ads7871_read_reg16(struct spi_device *spi, int reg)
  69. {
  70. int ret;
  71. reg = reg | INST_READ_BM | INST_16BIT_BM;
  72. ret = spi_w8r16(spi, reg);
  73. return ret;
  74. }
  75. static int ads7871_write_reg8(struct spi_device *spi, int reg, u8 val)
  76. {
  77. u8 tmp[2] = {reg, val};
  78. return spi_write(spi, tmp, sizeof(tmp));
  79. }
  80. static ssize_t voltage_show(struct device *dev, struct device_attribute *da,
  81. char *buf)
  82. {
  83. struct ads7871_data *pdata = dev_get_drvdata(dev);
  84. struct spi_device *spi = pdata->spi;
  85. struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
  86. int ret, val, i = 0;
  87. uint8_t channel, mux_cnv;
  88. channel = attr->index;
  89. /*
  90. * TODO: add support for conversions
  91. * other than single ended with a gain of 1
  92. */
  93. /*MUX_M3_BM forces single ended*/
  94. /*This is also where the gain of the PGA would be set*/
  95. ads7871_write_reg8(spi, REG_GAIN_MUX,
  96. (MUX_CNV_BM | MUX_M3_BM | channel));
  97. ret = ads7871_read_reg8(spi, REG_GAIN_MUX);
  98. mux_cnv = ((ret & MUX_CNV_BM) >> MUX_CNV_BV);
  99. /*
  100. * on 400MHz arm9 platform the conversion
  101. * is already done when we do this test
  102. */
  103. while ((i < 2) && mux_cnv) {
  104. i++;
  105. ret = ads7871_read_reg8(spi, REG_GAIN_MUX);
  106. mux_cnv = ((ret & MUX_CNV_BM) >> MUX_CNV_BV);
  107. msleep_interruptible(1);
  108. }
  109. if (mux_cnv == 0) {
  110. val = ads7871_read_reg16(spi, REG_LS_BYTE);
  111. /*result in volts*10000 = (val/8192)*2.5*10000*/
  112. val = ((val >> 2) * 25000) / 8192;
  113. return sprintf(buf, "%d\n", val);
  114. } else {
  115. return -1;
  116. }
  117. }
  118. static SENSOR_DEVICE_ATTR_RO(in0_input, voltage, 0);
  119. static SENSOR_DEVICE_ATTR_RO(in1_input, voltage, 1);
  120. static SENSOR_DEVICE_ATTR_RO(in2_input, voltage, 2);
  121. static SENSOR_DEVICE_ATTR_RO(in3_input, voltage, 3);
  122. static SENSOR_DEVICE_ATTR_RO(in4_input, voltage, 4);
  123. static SENSOR_DEVICE_ATTR_RO(in5_input, voltage, 5);
  124. static SENSOR_DEVICE_ATTR_RO(in6_input, voltage, 6);
  125. static SENSOR_DEVICE_ATTR_RO(in7_input, voltage, 7);
  126. static struct attribute *ads7871_attrs[] = {
  127. &sensor_dev_attr_in0_input.dev_attr.attr,
  128. &sensor_dev_attr_in1_input.dev_attr.attr,
  129. &sensor_dev_attr_in2_input.dev_attr.attr,
  130. &sensor_dev_attr_in3_input.dev_attr.attr,
  131. &sensor_dev_attr_in4_input.dev_attr.attr,
  132. &sensor_dev_attr_in5_input.dev_attr.attr,
  133. &sensor_dev_attr_in6_input.dev_attr.attr,
  134. &sensor_dev_attr_in7_input.dev_attr.attr,
  135. NULL
  136. };
  137. ATTRIBUTE_GROUPS(ads7871);
  138. static int ads7871_probe(struct spi_device *spi)
  139. {
  140. struct device *dev = &spi->dev;
  141. int ret;
  142. uint8_t val;
  143. struct ads7871_data *pdata;
  144. struct device *hwmon_dev;
  145. /* Configure the SPI bus */
  146. spi->mode = (SPI_MODE_0);
  147. spi->bits_per_word = 8;
  148. spi_setup(spi);
  149. ads7871_write_reg8(spi, REG_SER_CONTROL, 0);
  150. ads7871_write_reg8(spi, REG_AD_CONTROL, 0);
  151. val = (OSC_OSCR_BM | OSC_OSCE_BM | OSC_REFE_BM | OSC_BUFE_BM);
  152. ads7871_write_reg8(spi, REG_OSC_CONTROL, val);
  153. ret = ads7871_read_reg8(spi, REG_OSC_CONTROL);
  154. dev_dbg(dev, "REG_OSC_CONTROL write:%x, read:%x\n", val, ret);
  155. /*
  156. * because there is no other error checking on an SPI bus
  157. * we need to make sure we really have a chip
  158. */
  159. if (val != ret)
  160. return -ENODEV;
  161. pdata = devm_kzalloc(dev, sizeof(struct ads7871_data), GFP_KERNEL);
  162. if (!pdata)
  163. return -ENOMEM;
  164. pdata->spi = spi;
  165. hwmon_dev = devm_hwmon_device_register_with_groups(dev, spi->modalias,
  166. pdata,
  167. ads7871_groups);
  168. return PTR_ERR_OR_ZERO(hwmon_dev);
  169. }
  170. static struct spi_driver ads7871_driver = {
  171. .driver = {
  172. .name = DEVICE_NAME,
  173. },
  174. .probe = ads7871_probe,
  175. };
  176. module_spi_driver(ads7871_driver);
  177. MODULE_AUTHOR("Paul Thomas <[email protected]>");
  178. MODULE_DESCRIPTION("TI ADS7871 A/D driver");
  179. MODULE_LICENSE("GPL");