ltc2991.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2023 Analog Devices, Inc.
  4. * Author: Antoniu Miclaus <antoniu.miclaus@analog.com>
  5. */
  6. #include <linux/bitops.h>
  7. #include <linux/err.h>
  8. #include <linux/hwmon.h>
  9. #include <linux/i2c.h>
  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <linux/property.h>
  13. #include <linux/regmap.h>
  14. #include <linux/regulator/consumer.h>
  15. #define LTC2991_STATUS_LOW 0x00
  16. #define LTC2991_CH_EN_TRIGGER 0x01
  17. #define LTC2991_V1_V4_CTRL 0x06
  18. #define LTC2991_V5_V8_CTRL 0x07
  19. #define LTC2991_PWM_TH_LSB_T_INT 0x08
  20. #define LTC2991_PWM_TH_MSB 0x09
  21. #define LTC2991_CHANNEL_V_MSB(x) (0x0A + ((x) * 2))
  22. #define LTC2991_CHANNEL_T_MSB(x) (0x0A + ((x) * 4))
  23. #define LTC2991_CHANNEL_C_MSB(x) (0x0C + ((x) * 4))
  24. #define LTC2991_T_INT_MSB 0x1A
  25. #define LTC2991_VCC_MSB 0x1C
  26. #define LTC2991_V7_V8_EN BIT(7)
  27. #define LTC2991_V5_V6_EN BIT(6)
  28. #define LTC2991_V3_V4_EN BIT(5)
  29. #define LTC2991_V1_V2_EN BIT(4)
  30. #define LTC2991_T_INT_VCC_EN BIT(3)
  31. #define LTC2991_V3_V4_FILT_EN BIT(7)
  32. #define LTC2991_V3_V4_TEMP_EN BIT(5)
  33. #define LTC2991_V3_V4_DIFF_EN BIT(4)
  34. #define LTC2991_V1_V2_FILT_EN BIT(3)
  35. #define LTC2991_V1_V2_TEMP_EN BIT(1)
  36. #define LTC2991_V1_V2_DIFF_EN BIT(0)
  37. #define LTC2991_V7_V8_FILT_EN BIT(7)
  38. #define LTC2991_V7_V8_TEMP_EN BIT(5)
  39. #define LTC2991_V7_V8_DIFF_EN BIT(4)
  40. #define LTC2991_V5_V6_FILT_EN BIT(3)
  41. #define LTC2991_V5_V6_TEMP_EN BIT(1)
  42. #define LTC2991_V5_V6_DIFF_EN BIT(0)
  43. #define LTC2991_REPEAT_ACQ_EN BIT(4)
  44. #define LTC2991_T_INT_FILT_EN BIT(3)
  45. #define LTC2991_MAX_CHANNEL 4
  46. #define LTC2991_T_INT_CH_NR 4
  47. #define LTC2991_VCC_CH_NR 0
  48. struct ltc2991_state {
  49. struct regmap *regmap;
  50. u32 r_sense_uohm[LTC2991_MAX_CHANNEL];
  51. bool temp_en[LTC2991_MAX_CHANNEL];
  52. };
  53. static int ltc2991_read_reg(struct ltc2991_state *st, u8 addr, u8 reg_len,
  54. int *val)
  55. {
  56. __be16 regvals;
  57. int ret;
  58. if (reg_len < 2)
  59. return regmap_read(st->regmap, addr, val);
  60. ret = regmap_bulk_read(st->regmap, addr, &regvals, reg_len);
  61. if (ret)
  62. return ret;
  63. *val = be16_to_cpu(regvals);
  64. return 0;
  65. }
  66. static int ltc2991_get_voltage(struct ltc2991_state *st, u32 reg, long *val)
  67. {
  68. int reg_val, ret, offset = 0;
  69. ret = ltc2991_read_reg(st, reg, 2, &reg_val);
  70. if (ret)
  71. return ret;
  72. if (reg == LTC2991_VCC_MSB)
  73. /* Vcc 2.5V offset */
  74. offset = 2500;
  75. /* Vx, 305.18uV/LSB */
  76. *val = DIV_ROUND_CLOSEST(sign_extend32(reg_val, 14) * 30518,
  77. 1000 * 100) + offset;
  78. return 0;
  79. }
  80. static int ltc2991_read_in(struct device *dev, u32 attr, int channel, long *val)
  81. {
  82. struct ltc2991_state *st = dev_get_drvdata(dev);
  83. u32 reg;
  84. switch (attr) {
  85. case hwmon_in_input:
  86. if (channel == LTC2991_VCC_CH_NR)
  87. reg = LTC2991_VCC_MSB;
  88. else
  89. reg = LTC2991_CHANNEL_V_MSB(channel - 1);
  90. return ltc2991_get_voltage(st, reg, val);
  91. default:
  92. return -EOPNOTSUPP;
  93. }
  94. }
  95. static int ltc2991_get_curr(struct ltc2991_state *st, u32 reg, int channel,
  96. long *val)
  97. {
  98. int reg_val, ret;
  99. ret = ltc2991_read_reg(st, reg, 2, &reg_val);
  100. if (ret)
  101. return ret;
  102. /* Vx-Vy, 19.075uV/LSB */
  103. *val = DIV_ROUND_CLOSEST(sign_extend32(reg_val, 14) * 19075,
  104. (s32)st->r_sense_uohm[channel]);
  105. return 0;
  106. }
  107. static int ltc2991_read_curr(struct device *dev, u32 attr, int channel,
  108. long *val)
  109. {
  110. struct ltc2991_state *st = dev_get_drvdata(dev);
  111. u32 reg;
  112. switch (attr) {
  113. case hwmon_curr_input:
  114. reg = LTC2991_CHANNEL_C_MSB(channel);
  115. return ltc2991_get_curr(st, reg, channel, val);
  116. default:
  117. return -EOPNOTSUPP;
  118. }
  119. }
  120. static int ltc2991_get_temp(struct ltc2991_state *st, u32 reg, int channel,
  121. long *val)
  122. {
  123. int reg_val, ret;
  124. ret = ltc2991_read_reg(st, reg, 2, &reg_val);
  125. if (ret)
  126. return ret;
  127. /* Temp LSB = 0.0625 Degrees */
  128. *val = DIV_ROUND_CLOSEST(sign_extend32(reg_val, 12) * 1000, 16);
  129. return 0;
  130. }
  131. static int ltc2991_read_temp(struct device *dev, u32 attr, int channel,
  132. long *val)
  133. {
  134. struct ltc2991_state *st = dev_get_drvdata(dev);
  135. u32 reg;
  136. switch (attr) {
  137. case hwmon_temp_input:
  138. if (channel == LTC2991_T_INT_CH_NR)
  139. reg = LTC2991_T_INT_MSB;
  140. else
  141. reg = LTC2991_CHANNEL_T_MSB(channel);
  142. return ltc2991_get_temp(st, reg, channel, val);
  143. default:
  144. return -EOPNOTSUPP;
  145. }
  146. }
  147. static int ltc2991_read(struct device *dev, enum hwmon_sensor_types type,
  148. u32 attr, int channel, long *val)
  149. {
  150. switch (type) {
  151. case hwmon_in:
  152. return ltc2991_read_in(dev, attr, channel, val);
  153. case hwmon_curr:
  154. return ltc2991_read_curr(dev, attr, channel, val);
  155. case hwmon_temp:
  156. return ltc2991_read_temp(dev, attr, channel, val);
  157. default:
  158. return -EOPNOTSUPP;
  159. }
  160. }
  161. static umode_t ltc2991_is_visible(const void *data,
  162. enum hwmon_sensor_types type, u32 attr,
  163. int channel)
  164. {
  165. const struct ltc2991_state *st = data;
  166. switch (type) {
  167. case hwmon_in:
  168. switch (attr) {
  169. case hwmon_in_input:
  170. if (channel == LTC2991_VCC_CH_NR)
  171. return 0444;
  172. if (st->temp_en[(channel - 1) / 2])
  173. break;
  174. if (channel % 2)
  175. return 0444;
  176. if (!st->r_sense_uohm[(channel - 1) / 2])
  177. return 0444;
  178. }
  179. break;
  180. case hwmon_curr:
  181. switch (attr) {
  182. case hwmon_curr_input:
  183. if (st->r_sense_uohm[channel])
  184. return 0444;
  185. break;
  186. }
  187. break;
  188. case hwmon_temp:
  189. switch (attr) {
  190. case hwmon_temp_input:
  191. if (channel == LTC2991_T_INT_CH_NR ||
  192. st->temp_en[channel])
  193. return 0444;
  194. break;
  195. }
  196. break;
  197. default:
  198. break;
  199. }
  200. return 0;
  201. }
  202. static const struct hwmon_ops ltc2991_hwmon_ops = {
  203. .is_visible = ltc2991_is_visible,
  204. .read = ltc2991_read,
  205. };
  206. static const struct hwmon_channel_info *ltc2991_info[] = {
  207. HWMON_CHANNEL_INFO(temp,
  208. HWMON_T_INPUT,
  209. HWMON_T_INPUT,
  210. HWMON_T_INPUT,
  211. HWMON_T_INPUT,
  212. HWMON_T_INPUT
  213. ),
  214. HWMON_CHANNEL_INFO(curr,
  215. HWMON_C_INPUT,
  216. HWMON_C_INPUT,
  217. HWMON_C_INPUT,
  218. HWMON_C_INPUT
  219. ),
  220. HWMON_CHANNEL_INFO(in,
  221. HWMON_I_INPUT,
  222. HWMON_I_INPUT,
  223. HWMON_I_INPUT,
  224. HWMON_I_INPUT,
  225. HWMON_I_INPUT,
  226. HWMON_I_INPUT,
  227. HWMON_I_INPUT,
  228. HWMON_I_INPUT,
  229. HWMON_I_INPUT
  230. ),
  231. NULL
  232. };
  233. static const struct hwmon_chip_info ltc2991_chip_info = {
  234. .ops = &ltc2991_hwmon_ops,
  235. .info = ltc2991_info,
  236. };
  237. static const struct regmap_config ltc2991_regmap_config = {
  238. .reg_bits = 8,
  239. .val_bits = 8,
  240. .max_register = 0x1D,
  241. };
  242. static int ltc2991_init(struct ltc2991_state *st, struct device *dev)
  243. {
  244. int ret;
  245. u32 val, addr;
  246. u8 v5_v8_reg_data = 0, v1_v4_reg_data = 0;
  247. ret = devm_regulator_get_enable(dev, "vcc");
  248. if (ret)
  249. return dev_err_probe(dev, ret,
  250. "failed to enable regulator\n");
  251. device_for_each_child_node_scoped(dev, child) {
  252. ret = fwnode_property_read_u32(child, "reg", &addr);
  253. if (ret < 0)
  254. return ret;
  255. if (addr > 3)
  256. return -EINVAL;
  257. ret = fwnode_property_read_u32(child,
  258. "shunt-resistor-micro-ohms",
  259. &val);
  260. if (!ret) {
  261. if (!val)
  262. return dev_err_probe(dev, -EINVAL,
  263. "shunt resistor value cannot be zero\n");
  264. st->r_sense_uohm[addr] = val;
  265. switch (addr) {
  266. case 0:
  267. v1_v4_reg_data |= LTC2991_V1_V2_DIFF_EN;
  268. break;
  269. case 1:
  270. v1_v4_reg_data |= LTC2991_V3_V4_DIFF_EN;
  271. break;
  272. case 2:
  273. v5_v8_reg_data |= LTC2991_V5_V6_DIFF_EN;
  274. break;
  275. case 3:
  276. v5_v8_reg_data |= LTC2991_V7_V8_DIFF_EN;
  277. break;
  278. default:
  279. break;
  280. }
  281. }
  282. ret = fwnode_property_read_bool(child,
  283. "adi,temperature-enable");
  284. if (ret) {
  285. st->temp_en[addr] = ret;
  286. switch (addr) {
  287. case 0:
  288. v1_v4_reg_data |= LTC2991_V1_V2_TEMP_EN;
  289. break;
  290. case 1:
  291. v1_v4_reg_data |= LTC2991_V3_V4_TEMP_EN;
  292. break;
  293. case 2:
  294. v5_v8_reg_data |= LTC2991_V5_V6_TEMP_EN;
  295. break;
  296. case 3:
  297. v5_v8_reg_data |= LTC2991_V7_V8_TEMP_EN;
  298. break;
  299. default:
  300. break;
  301. }
  302. }
  303. }
  304. ret = regmap_write(st->regmap, LTC2991_V5_V8_CTRL, v5_v8_reg_data);
  305. if (ret)
  306. return dev_err_probe(dev, ret,
  307. "Error: Failed to set V5-V8 CTRL reg.\n");
  308. ret = regmap_write(st->regmap, LTC2991_V1_V4_CTRL, v1_v4_reg_data);
  309. if (ret)
  310. return dev_err_probe(dev, ret,
  311. "Error: Failed to set V1-V4 CTRL reg.\n");
  312. ret = regmap_write(st->regmap, LTC2991_PWM_TH_LSB_T_INT,
  313. LTC2991_REPEAT_ACQ_EN);
  314. if (ret)
  315. return dev_err_probe(dev, ret,
  316. "Error: Failed to set continuous mode.\n");
  317. /* Enable all channels and trigger conversions */
  318. return regmap_write(st->regmap, LTC2991_CH_EN_TRIGGER,
  319. LTC2991_V7_V8_EN | LTC2991_V5_V6_EN |
  320. LTC2991_V3_V4_EN | LTC2991_V1_V2_EN |
  321. LTC2991_T_INT_VCC_EN);
  322. }
  323. static int ltc2991_i2c_probe(struct i2c_client *client)
  324. {
  325. int ret;
  326. struct device *hwmon_dev;
  327. struct ltc2991_state *st;
  328. st = devm_kzalloc(&client->dev, sizeof(*st), GFP_KERNEL);
  329. if (!st)
  330. return -ENOMEM;
  331. st->regmap = devm_regmap_init_i2c(client, &ltc2991_regmap_config);
  332. if (IS_ERR(st->regmap))
  333. return PTR_ERR(st->regmap);
  334. ret = ltc2991_init(st, &client->dev);
  335. if (ret)
  336. return ret;
  337. hwmon_dev = devm_hwmon_device_register_with_info(&client->dev,
  338. client->name, st,
  339. &ltc2991_chip_info,
  340. NULL);
  341. return PTR_ERR_OR_ZERO(hwmon_dev);
  342. }
  343. static const struct of_device_id ltc2991_of_match[] = {
  344. { .compatible = "adi,ltc2991" },
  345. { }
  346. };
  347. MODULE_DEVICE_TABLE(of, ltc2991_of_match);
  348. static const struct i2c_device_id ltc2991_i2c_id[] = {
  349. { "ltc2991" },
  350. {}
  351. };
  352. MODULE_DEVICE_TABLE(i2c, ltc2991_i2c_id);
  353. static struct i2c_driver ltc2991_i2c_driver = {
  354. .driver = {
  355. .name = "ltc2991",
  356. .of_match_table = ltc2991_of_match,
  357. },
  358. .probe = ltc2991_i2c_probe,
  359. .id_table = ltc2991_i2c_id,
  360. };
  361. module_i2c_driver(ltc2991_i2c_driver);
  362. MODULE_AUTHOR("Antoniu Miclaus <antoniu.miclaus@analog.com>");
  363. MODULE_DESCRIPTION("Analog Devices LTC2991 HWMON Driver");
  364. MODULE_LICENSE("GPL");