powr1220.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * powr1220.c - Driver for the Lattice POWR1220 programmable power supply
  4. * and monitor. Users can read all ADC inputs along with their labels
  5. * using the sysfs nodes.
  6. *
  7. * Copyright (c) 2014 Echo360 https://www.echo360.com
  8. * Scott Kanowitz <skanowitz@echo360.com> <scott.kanowitz@gmail.com>
  9. */
  10. #include <linux/module.h>
  11. #include <linux/init.h>
  12. #include <linux/slab.h>
  13. #include <linux/jiffies.h>
  14. #include <linux/i2c.h>
  15. #include <linux/hwmon.h>
  16. #include <linux/hwmon-sysfs.h>
  17. #include <linux/err.h>
  18. #include <linux/delay.h>
  19. #define ADC_STEP_MV 2
  20. #define ADC_MAX_LOW_MEASUREMENT_MV 2000
  21. enum powr1xxx_chips { powr1014, powr1220 };
  22. enum powr1220_regs {
  23. VMON_STATUS0,
  24. VMON_STATUS1,
  25. VMON_STATUS2,
  26. OUTPUT_STATUS0,
  27. OUTPUT_STATUS1,
  28. OUTPUT_STATUS2,
  29. INPUT_STATUS,
  30. ADC_VALUE_LOW,
  31. ADC_VALUE_HIGH,
  32. ADC_MUX,
  33. UES_BYTE0,
  34. UES_BYTE1,
  35. UES_BYTE2,
  36. UES_BYTE3,
  37. GP_OUTPUT1,
  38. GP_OUTPUT2,
  39. GP_OUTPUT3,
  40. INPUT_VALUE,
  41. RESET,
  42. TRIM1_TRIM,
  43. TRIM2_TRIM,
  44. TRIM3_TRIM,
  45. TRIM4_TRIM,
  46. TRIM5_TRIM,
  47. TRIM6_TRIM,
  48. TRIM7_TRIM,
  49. TRIM8_TRIM,
  50. MAX_POWR1220_REGS
  51. };
  52. enum powr1220_adc_values {
  53. VMON1,
  54. VMON2,
  55. VMON3,
  56. VMON4,
  57. VMON5,
  58. VMON6,
  59. VMON7,
  60. VMON8,
  61. VMON9,
  62. VMON10,
  63. VMON11,
  64. VMON12,
  65. VCCA,
  66. VCCINP,
  67. MAX_POWR1220_ADC_VALUES
  68. };
  69. struct powr1220_data {
  70. struct i2c_client *client;
  71. u8 max_channels;
  72. bool adc_valid[MAX_POWR1220_ADC_VALUES];
  73. /* the next value is in jiffies */
  74. unsigned long adc_last_updated[MAX_POWR1220_ADC_VALUES];
  75. /* values */
  76. int adc_maxes[MAX_POWR1220_ADC_VALUES];
  77. int adc_values[MAX_POWR1220_ADC_VALUES];
  78. };
  79. static const char * const input_names[] = {
  80. [VMON1] = "vmon1",
  81. [VMON2] = "vmon2",
  82. [VMON3] = "vmon3",
  83. [VMON4] = "vmon4",
  84. [VMON5] = "vmon5",
  85. [VMON6] = "vmon6",
  86. [VMON7] = "vmon7",
  87. [VMON8] = "vmon8",
  88. [VMON9] = "vmon9",
  89. [VMON10] = "vmon10",
  90. [VMON11] = "vmon11",
  91. [VMON12] = "vmon12",
  92. [VCCA] = "vcca",
  93. [VCCINP] = "vccinp",
  94. };
  95. /* Reads the specified ADC channel */
  96. static int powr1220_read_adc(struct device *dev, int ch_num)
  97. {
  98. struct powr1220_data *data = dev_get_drvdata(dev);
  99. int reading;
  100. int result;
  101. int adc_range = 0;
  102. if (time_after(jiffies, data->adc_last_updated[ch_num] + HZ) ||
  103. !data->adc_valid[ch_num]) {
  104. /*
  105. * figure out if we need to use the attenuator for
  106. * high inputs or inputs that we don't yet have a measurement
  107. * for. We dynamically set the attenuator depending on the
  108. * max reading.
  109. */
  110. if (data->adc_maxes[ch_num] > ADC_MAX_LOW_MEASUREMENT_MV ||
  111. data->adc_maxes[ch_num] == 0)
  112. adc_range = 1 << 4;
  113. /* set the attenuator and mux */
  114. result = i2c_smbus_write_byte_data(data->client, ADC_MUX,
  115. adc_range | ch_num);
  116. if (result < 0)
  117. return result;
  118. /*
  119. * wait at least Tconvert time (200 us) for the
  120. * conversion to complete
  121. */
  122. udelay(200);
  123. /* get the ADC reading */
  124. result = i2c_smbus_read_byte_data(data->client, ADC_VALUE_LOW);
  125. if (result < 0)
  126. return result;
  127. reading = result >> 4;
  128. /* get the upper half of the reading */
  129. result = i2c_smbus_read_byte_data(data->client, ADC_VALUE_HIGH);
  130. if (result < 0)
  131. return result;
  132. reading |= result << 4;
  133. /* now convert the reading to a voltage */
  134. reading *= ADC_STEP_MV;
  135. data->adc_values[ch_num] = reading;
  136. data->adc_valid[ch_num] = true;
  137. data->adc_last_updated[ch_num] = jiffies;
  138. result = reading;
  139. if (reading > data->adc_maxes[ch_num])
  140. data->adc_maxes[ch_num] = reading;
  141. } else {
  142. result = data->adc_values[ch_num];
  143. }
  144. return result;
  145. }
  146. static umode_t
  147. powr1220_is_visible(const void *data, enum hwmon_sensor_types type, u32
  148. attr, int channel)
  149. {
  150. struct powr1220_data *chip_data = (struct powr1220_data *)data;
  151. if (channel >= chip_data->max_channels)
  152. return 0;
  153. switch (type) {
  154. case hwmon_in:
  155. switch (attr) {
  156. case hwmon_in_input:
  157. case hwmon_in_highest:
  158. case hwmon_in_label:
  159. return 0444;
  160. default:
  161. break;
  162. }
  163. break;
  164. default:
  165. break;
  166. }
  167. return 0;
  168. }
  169. static int
  170. powr1220_read_string(struct device *dev, enum hwmon_sensor_types type, u32 attr,
  171. int channel, const char **str)
  172. {
  173. switch (type) {
  174. case hwmon_in:
  175. switch (attr) {
  176. case hwmon_in_label:
  177. *str = input_names[channel];
  178. return 0;
  179. default:
  180. return -EOPNOTSUPP;
  181. }
  182. break;
  183. default:
  184. return -EOPNOTSUPP;
  185. }
  186. return -EOPNOTSUPP;
  187. }
  188. static int
  189. powr1220_read(struct device *dev, enum hwmon_sensor_types type, u32
  190. attr, int channel, long *val)
  191. {
  192. struct powr1220_data *data = dev_get_drvdata(dev);
  193. int ret;
  194. switch (type) {
  195. case hwmon_in:
  196. switch (attr) {
  197. case hwmon_in_input:
  198. ret = powr1220_read_adc(dev, channel);
  199. if (ret < 0)
  200. return ret;
  201. *val = ret;
  202. break;
  203. case hwmon_in_highest:
  204. *val = data->adc_maxes[channel];
  205. break;
  206. default:
  207. return -EOPNOTSUPP;
  208. }
  209. break;
  210. default:
  211. return -EOPNOTSUPP;
  212. }
  213. return 0;
  214. }
  215. static const struct hwmon_channel_info * const powr1220_info[] = {
  216. HWMON_CHANNEL_INFO(in,
  217. HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
  218. HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
  219. HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
  220. HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
  221. HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
  222. HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
  223. HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
  224. HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
  225. HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
  226. HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
  227. HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
  228. HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
  229. HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL,
  230. HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL),
  231. NULL
  232. };
  233. static const struct hwmon_ops powr1220_hwmon_ops = {
  234. .read = powr1220_read,
  235. .read_string = powr1220_read_string,
  236. .is_visible = powr1220_is_visible,
  237. };
  238. static const struct hwmon_chip_info powr1220_chip_info = {
  239. .ops = &powr1220_hwmon_ops,
  240. .info = powr1220_info,
  241. };
  242. static int powr1220_probe(struct i2c_client *client)
  243. {
  244. struct powr1220_data *data;
  245. struct device *hwmon_dev;
  246. enum powr1xxx_chips chip;
  247. if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
  248. return -ENODEV;
  249. data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
  250. if (!data)
  251. return -ENOMEM;
  252. chip = (uintptr_t)i2c_get_match_data(client);
  253. switch (chip) {
  254. case powr1014:
  255. data->max_channels = 10;
  256. break;
  257. default:
  258. data->max_channels = 12;
  259. break;
  260. }
  261. data->client = client;
  262. hwmon_dev = devm_hwmon_device_register_with_info(&client->dev,
  263. client->name,
  264. data,
  265. &powr1220_chip_info,
  266. NULL);
  267. return PTR_ERR_OR_ZERO(hwmon_dev);
  268. }
  269. static const struct i2c_device_id powr1220_ids[] = {
  270. { "powr1014", powr1014, },
  271. { "powr1220", powr1220, },
  272. { }
  273. };
  274. MODULE_DEVICE_TABLE(i2c, powr1220_ids);
  275. static struct i2c_driver powr1220_driver = {
  276. .driver = {
  277. .name = "powr1220",
  278. },
  279. .probe = powr1220_probe,
  280. .id_table = powr1220_ids,
  281. };
  282. module_i2c_driver(powr1220_driver);
  283. MODULE_AUTHOR("Scott Kanowitz");
  284. MODULE_DESCRIPTION("POWR1220 driver");
  285. MODULE_LICENSE("GPL");