ltc2947-core.c 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Analog Devices LTC2947 high precision power and energy monitor
  4. *
  5. * Copyright 2019 Analog Devices Inc.
  6. */
  7. #include <linux/bitfield.h>
  8. #include <linux/bits.h>
  9. #include <linux/clk.h>
  10. #include <linux/device.h>
  11. #include <linux/hwmon.h>
  12. #include <linux/module.h>
  13. #include <linux/math64.h>
  14. #include <linux/mod_devicetable.h>
  15. #include <linux/property.h>
  16. #include <linux/regmap.h>
  17. #include "ltc2947.h"
  18. /* register's */
  19. #define LTC2947_REG_PAGE_CTRL 0xFF
  20. #define LTC2947_REG_CTRL 0xF0
  21. #define LTC2947_REG_TBCTL 0xE9
  22. #define LTC2947_CONT_MODE_MASK BIT(3)
  23. #define LTC2947_CONT_MODE(x) FIELD_PREP(LTC2947_CONT_MODE_MASK, x)
  24. #define LTC2947_PRE_MASK GENMASK(2, 0)
  25. #define LTC2947_PRE(x) FIELD_PREP(LTC2947_PRE_MASK, x)
  26. #define LTC2947_DIV_MASK GENMASK(7, 3)
  27. #define LTC2947_DIV(x) FIELD_PREP(LTC2947_DIV_MASK, x)
  28. #define LTC2947_SHUTDOWN_MASK BIT(0)
  29. #define LTC2947_REG_ACCUM_POL 0xE1
  30. #define LTC2947_ACCUM_POL_1_MASK GENMASK(1, 0)
  31. #define LTC2947_ACCUM_POL_1(x) FIELD_PREP(LTC2947_ACCUM_POL_1_MASK, x)
  32. #define LTC2947_ACCUM_POL_2_MASK GENMASK(3, 2)
  33. #define LTC2947_ACCUM_POL_2(x) FIELD_PREP(LTC2947_ACCUM_POL_2_MASK, x)
  34. #define LTC2947_REG_ACCUM_DEADBAND 0xE4
  35. #define LTC2947_REG_GPIOSTATCTL 0x67
  36. #define LTC2947_GPIO_EN_MASK BIT(0)
  37. #define LTC2947_GPIO_EN(x) FIELD_PREP(LTC2947_GPIO_EN_MASK, x)
  38. #define LTC2947_GPIO_FAN_EN_MASK BIT(6)
  39. #define LTC2947_GPIO_FAN_EN(x) FIELD_PREP(LTC2947_GPIO_FAN_EN_MASK, x)
  40. #define LTC2947_GPIO_FAN_POL_MASK BIT(7)
  41. #define LTC2947_GPIO_FAN_POL(x) FIELD_PREP(LTC2947_GPIO_FAN_POL_MASK, x)
  42. #define LTC2947_REG_GPIO_ACCUM 0xE3
  43. /* 200Khz */
  44. #define LTC2947_CLK_MIN 200000
  45. /* 25Mhz */
  46. #define LTC2947_CLK_MAX 25000000
  47. #define LTC2947_PAGE0 0
  48. #define LTC2947_PAGE1 1
  49. /* Voltage registers */
  50. #define LTC2947_REG_VOLTAGE 0xA0
  51. #define LTC2947_REG_VOLTAGE_MAX 0x50
  52. #define LTC2947_REG_VOLTAGE_MIN 0x52
  53. #define LTC2947_REG_VOLTAGE_THRE_H 0x90
  54. #define LTC2947_REG_VOLTAGE_THRE_L 0x92
  55. #define LTC2947_REG_DVCC 0xA4
  56. #define LTC2947_REG_DVCC_MAX 0x58
  57. #define LTC2947_REG_DVCC_MIN 0x5A
  58. #define LTC2947_REG_DVCC_THRE_H 0x98
  59. #define LTC2947_REG_DVCC_THRE_L 0x9A
  60. #define LTC2947_VOLTAGE_GEN_CHAN 0
  61. #define LTC2947_VOLTAGE_DVCC_CHAN 1
  62. /* in mV */
  63. #define VOLTAGE_MAX 15500
  64. #define VOLTAGE_MIN -300
  65. #define VDVCC_MAX 15000
  66. #define VDVCC_MIN 4750
  67. /* Current registers */
  68. #define LTC2947_REG_CURRENT 0x90
  69. #define LTC2947_REG_CURRENT_MAX 0x40
  70. #define LTC2947_REG_CURRENT_MIN 0x42
  71. #define LTC2947_REG_CURRENT_THRE_H 0x80
  72. #define LTC2947_REG_CURRENT_THRE_L 0x82
  73. /* in mA */
  74. #define CURRENT_MAX 30000
  75. #define CURRENT_MIN -30000
  76. /* Power registers */
  77. #define LTC2947_REG_POWER 0x93
  78. #define LTC2947_REG_POWER_MAX 0x44
  79. #define LTC2947_REG_POWER_MIN 0x46
  80. #define LTC2947_REG_POWER_THRE_H 0x84
  81. #define LTC2947_REG_POWER_THRE_L 0x86
  82. /* in uW */
  83. #define POWER_MAX 450000000
  84. #define POWER_MIN -450000000
  85. /* Temperature registers */
  86. #define LTC2947_REG_TEMP 0xA2
  87. #define LTC2947_REG_TEMP_MAX 0x54
  88. #define LTC2947_REG_TEMP_MIN 0x56
  89. #define LTC2947_REG_TEMP_THRE_H 0x94
  90. #define LTC2947_REG_TEMP_THRE_L 0x96
  91. #define LTC2947_REG_TEMP_FAN_THRE_H 0x9C
  92. #define LTC2947_REG_TEMP_FAN_THRE_L 0x9E
  93. #define LTC2947_TEMP_FAN_CHAN 1
  94. /* in millidegress Celsius */
  95. #define TEMP_MAX 85000
  96. #define TEMP_MIN -40000
  97. /* Energy registers */
  98. #define LTC2947_REG_ENERGY1 0x06
  99. #define LTC2947_REG_ENERGY2 0x16
  100. /* Status/Alarm/Overflow registers */
  101. #define LTC2947_REG_STATUS 0x80
  102. #define LTC2947_REG_STATVT 0x81
  103. #define LTC2947_REG_STATIP 0x82
  104. #define LTC2947_REG_STATVDVCC 0x87
  105. #define LTC2947_ALERTS_SIZE (LTC2947_REG_STATVDVCC - LTC2947_REG_STATUS)
  106. #define LTC2947_MAX_VOLTAGE_MASK BIT(0)
  107. #define LTC2947_MIN_VOLTAGE_MASK BIT(1)
  108. #define LTC2947_MAX_CURRENT_MASK BIT(0)
  109. #define LTC2947_MIN_CURRENT_MASK BIT(1)
  110. #define LTC2947_MAX_POWER_MASK BIT(2)
  111. #define LTC2947_MIN_POWER_MASK BIT(3)
  112. #define LTC2947_MAX_TEMP_MASK BIT(2)
  113. #define LTC2947_MIN_TEMP_MASK BIT(3)
  114. #define LTC2947_MAX_TEMP_FAN_MASK BIT(4)
  115. #define LTC2947_MIN_TEMP_FAN_MASK BIT(5)
  116. struct ltc2947_data {
  117. struct regmap *map;
  118. struct device *dev;
  119. u32 lsb_energy;
  120. bool gpio_out;
  121. };
  122. static int __ltc2947_val_read16(const struct ltc2947_data *st, const u8 reg,
  123. u64 *val)
  124. {
  125. __be16 __val = 0;
  126. int ret;
  127. ret = regmap_bulk_read(st->map, reg, &__val, 2);
  128. if (ret)
  129. return ret;
  130. *val = be16_to_cpu(__val);
  131. return 0;
  132. }
  133. static int __ltc2947_val_read24(const struct ltc2947_data *st, const u8 reg,
  134. u64 *val)
  135. {
  136. __be32 __val = 0;
  137. int ret;
  138. ret = regmap_bulk_read(st->map, reg, &__val, 3);
  139. if (ret)
  140. return ret;
  141. *val = be32_to_cpu(__val) >> 8;
  142. return 0;
  143. }
  144. static int __ltc2947_val_read64(const struct ltc2947_data *st, const u8 reg,
  145. u64 *val)
  146. {
  147. __be64 __val = 0;
  148. int ret;
  149. ret = regmap_bulk_read(st->map, reg, &__val, 6);
  150. if (ret)
  151. return ret;
  152. *val = be64_to_cpu(__val) >> 16;
  153. return 0;
  154. }
  155. static int ltc2947_val_read(struct ltc2947_data *st, const u8 reg,
  156. const u8 page, const size_t size, s64 *val)
  157. {
  158. int ret;
  159. u64 __val = 0;
  160. ret = regmap_write(st->map, LTC2947_REG_PAGE_CTRL, page);
  161. if (ret)
  162. return ret;
  163. dev_dbg(st->dev, "Read val, reg:%02X, p:%d sz:%zu\n", reg, page,
  164. size);
  165. switch (size) {
  166. case 2:
  167. ret = __ltc2947_val_read16(st, reg, &__val);
  168. break;
  169. case 3:
  170. ret = __ltc2947_val_read24(st, reg, &__val);
  171. break;
  172. case 6:
  173. ret = __ltc2947_val_read64(st, reg, &__val);
  174. break;
  175. default:
  176. ret = -EINVAL;
  177. break;
  178. }
  179. if (ret)
  180. return ret;
  181. *val = sign_extend64(__val, (8 * size) - 1);
  182. dev_dbg(st->dev, "Got s:%lld, u:%016llX\n", *val, __val);
  183. return 0;
  184. }
  185. static int __ltc2947_val_write64(const struct ltc2947_data *st, const u8 reg,
  186. const u64 val)
  187. {
  188. __be64 __val;
  189. __val = cpu_to_be64(val << 16);
  190. return regmap_bulk_write(st->map, reg, &__val, 6);
  191. }
  192. static int __ltc2947_val_write16(const struct ltc2947_data *st, const u8 reg,
  193. const u16 val)
  194. {
  195. __be16 __val;
  196. __val = cpu_to_be16(val);
  197. return regmap_bulk_write(st->map, reg, &__val, 2);
  198. }
  199. static int ltc2947_val_write(struct ltc2947_data *st, const u8 reg,
  200. const u8 page, const size_t size, const u64 val)
  201. {
  202. int ret;
  203. /* set device on correct page */
  204. ret = regmap_write(st->map, LTC2947_REG_PAGE_CTRL, page);
  205. if (ret)
  206. return ret;
  207. dev_dbg(st->dev, "Write val, r:%02X, p:%d, sz:%zu, val:%016llX\n",
  208. reg, page, size, val);
  209. switch (size) {
  210. case 2:
  211. ret = __ltc2947_val_write16(st, reg, val);
  212. break;
  213. case 6:
  214. ret = __ltc2947_val_write64(st, reg, val);
  215. break;
  216. default:
  217. ret = -EINVAL;
  218. break;
  219. }
  220. return ret;
  221. }
  222. static int ltc2947_reset_history(struct ltc2947_data *st, const u8 reg_h,
  223. const u8 reg_l)
  224. {
  225. int ret;
  226. /*
  227. * let's reset the tracking register's. Tracking register's have all
  228. * 2 bytes size
  229. */
  230. ret = ltc2947_val_write(st, reg_h, LTC2947_PAGE0, 2, 0x8000U);
  231. if (ret)
  232. return ret;
  233. return ltc2947_val_write(st, reg_l, LTC2947_PAGE0, 2, 0x7FFFU);
  234. }
  235. static int ltc2947_alarm_read(struct ltc2947_data *st, const u8 reg,
  236. const u32 mask, long *val)
  237. {
  238. u8 offset = reg - LTC2947_REG_STATUS;
  239. /* +1 to include status reg */
  240. char alarms[LTC2947_ALERTS_SIZE + 1];
  241. int ret = 0;
  242. memset(alarms, 0, sizeof(alarms));
  243. ret = regmap_write(st->map, LTC2947_REG_PAGE_CTRL, LTC2947_PAGE0);
  244. if (ret)
  245. return ret;
  246. dev_dbg(st->dev, "Read alarm, reg:%02X, mask:%02X\n", reg, mask);
  247. /*
  248. * As stated in the datasheet, when Threshold and Overflow registers
  249. * are used, the status and all alert registers must be read in one
  250. * multi-byte transaction.
  251. */
  252. ret = regmap_bulk_read(st->map, LTC2947_REG_STATUS, alarms,
  253. sizeof(alarms));
  254. if (ret)
  255. return ret;
  256. /* get the alarm */
  257. *val = !!(alarms[offset] & mask);
  258. return 0;
  259. }
  260. static int ltc2947_read_temp(struct device *dev, const u32 attr, long *val,
  261. const int channel)
  262. {
  263. int ret;
  264. struct ltc2947_data *st = dev_get_drvdata(dev);
  265. s64 __val = 0;
  266. switch (attr) {
  267. case hwmon_temp_input:
  268. ret = ltc2947_val_read(st, LTC2947_REG_TEMP, LTC2947_PAGE0,
  269. 2, &__val);
  270. break;
  271. case hwmon_temp_highest:
  272. ret = ltc2947_val_read(st, LTC2947_REG_TEMP_MAX, LTC2947_PAGE0,
  273. 2, &__val);
  274. break;
  275. case hwmon_temp_lowest:
  276. ret = ltc2947_val_read(st, LTC2947_REG_TEMP_MIN, LTC2947_PAGE0,
  277. 2, &__val);
  278. break;
  279. case hwmon_temp_max_alarm:
  280. if (channel == LTC2947_TEMP_FAN_CHAN)
  281. return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
  282. LTC2947_MAX_TEMP_FAN_MASK,
  283. val);
  284. return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
  285. LTC2947_MAX_TEMP_MASK, val);
  286. case hwmon_temp_min_alarm:
  287. if (channel == LTC2947_TEMP_FAN_CHAN)
  288. return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
  289. LTC2947_MIN_TEMP_FAN_MASK,
  290. val);
  291. return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
  292. LTC2947_MIN_TEMP_MASK, val);
  293. case hwmon_temp_max:
  294. if (channel == LTC2947_TEMP_FAN_CHAN)
  295. ret = ltc2947_val_read(st, LTC2947_REG_TEMP_FAN_THRE_H,
  296. LTC2947_PAGE1, 2, &__val);
  297. else
  298. ret = ltc2947_val_read(st, LTC2947_REG_TEMP_THRE_H,
  299. LTC2947_PAGE1, 2, &__val);
  300. break;
  301. case hwmon_temp_min:
  302. if (channel == LTC2947_TEMP_FAN_CHAN)
  303. ret = ltc2947_val_read(st, LTC2947_REG_TEMP_FAN_THRE_L,
  304. LTC2947_PAGE1, 2, &__val);
  305. else
  306. ret = ltc2947_val_read(st, LTC2947_REG_TEMP_THRE_L,
  307. LTC2947_PAGE1, 2, &__val);
  308. break;
  309. default:
  310. return -ENOTSUPP;
  311. }
  312. if (ret)
  313. return ret;
  314. /* in milidegrees celcius, temp is given by: */
  315. *val = (__val * 204) + 5500;
  316. return 0;
  317. }
  318. static int ltc2947_read_power(struct device *dev, const u32 attr, long *val)
  319. {
  320. struct ltc2947_data *st = dev_get_drvdata(dev);
  321. int ret;
  322. u32 lsb = 200000; /* in uW */
  323. s64 __val = 0;
  324. switch (attr) {
  325. case hwmon_power_input:
  326. ret = ltc2947_val_read(st, LTC2947_REG_POWER, LTC2947_PAGE0,
  327. 3, &__val);
  328. lsb = 50000;
  329. break;
  330. case hwmon_power_input_highest:
  331. ret = ltc2947_val_read(st, LTC2947_REG_POWER_MAX, LTC2947_PAGE0,
  332. 2, &__val);
  333. break;
  334. case hwmon_power_input_lowest:
  335. ret = ltc2947_val_read(st, LTC2947_REG_POWER_MIN, LTC2947_PAGE0,
  336. 2, &__val);
  337. break;
  338. case hwmon_power_max_alarm:
  339. return ltc2947_alarm_read(st, LTC2947_REG_STATIP,
  340. LTC2947_MAX_POWER_MASK, val);
  341. case hwmon_power_min_alarm:
  342. return ltc2947_alarm_read(st, LTC2947_REG_STATIP,
  343. LTC2947_MIN_POWER_MASK, val);
  344. case hwmon_power_max:
  345. ret = ltc2947_val_read(st, LTC2947_REG_POWER_THRE_H,
  346. LTC2947_PAGE1, 2, &__val);
  347. break;
  348. case hwmon_power_min:
  349. ret = ltc2947_val_read(st, LTC2947_REG_POWER_THRE_L,
  350. LTC2947_PAGE1, 2, &__val);
  351. break;
  352. default:
  353. return -ENOTSUPP;
  354. }
  355. if (ret)
  356. return ret;
  357. *val = __val * lsb;
  358. return 0;
  359. }
  360. static int ltc2947_read_curr(struct device *dev, const u32 attr, long *val)
  361. {
  362. struct ltc2947_data *st = dev_get_drvdata(dev);
  363. int ret;
  364. u8 lsb = 12; /* in mA */
  365. s64 __val = 0;
  366. switch (attr) {
  367. case hwmon_curr_input:
  368. ret = ltc2947_val_read(st, LTC2947_REG_CURRENT,
  369. LTC2947_PAGE0, 3, &__val);
  370. lsb = 3;
  371. break;
  372. case hwmon_curr_highest:
  373. ret = ltc2947_val_read(st, LTC2947_REG_CURRENT_MAX,
  374. LTC2947_PAGE0, 2, &__val);
  375. break;
  376. case hwmon_curr_lowest:
  377. ret = ltc2947_val_read(st, LTC2947_REG_CURRENT_MIN,
  378. LTC2947_PAGE0, 2, &__val);
  379. break;
  380. case hwmon_curr_max_alarm:
  381. return ltc2947_alarm_read(st, LTC2947_REG_STATIP,
  382. LTC2947_MAX_CURRENT_MASK, val);
  383. case hwmon_curr_min_alarm:
  384. return ltc2947_alarm_read(st, LTC2947_REG_STATIP,
  385. LTC2947_MIN_CURRENT_MASK, val);
  386. case hwmon_curr_max:
  387. ret = ltc2947_val_read(st, LTC2947_REG_CURRENT_THRE_H,
  388. LTC2947_PAGE1, 2, &__val);
  389. break;
  390. case hwmon_curr_min:
  391. ret = ltc2947_val_read(st, LTC2947_REG_CURRENT_THRE_L,
  392. LTC2947_PAGE1, 2, &__val);
  393. break;
  394. default:
  395. return -ENOTSUPP;
  396. }
  397. if (ret)
  398. return ret;
  399. *val = __val * lsb;
  400. return 0;
  401. }
  402. static int ltc2947_read_in(struct device *dev, const u32 attr, long *val,
  403. const int channel)
  404. {
  405. struct ltc2947_data *st = dev_get_drvdata(dev);
  406. int ret;
  407. u8 lsb = 2; /* in mV */
  408. s64 __val = 0;
  409. if (channel < 0 || channel > LTC2947_VOLTAGE_DVCC_CHAN) {
  410. dev_err(st->dev, "Invalid chan%d for voltage", channel);
  411. return -EINVAL;
  412. }
  413. switch (attr) {
  414. case hwmon_in_input:
  415. if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
  416. ret = ltc2947_val_read(st, LTC2947_REG_DVCC,
  417. LTC2947_PAGE0, 2, &__val);
  418. lsb = 145;
  419. } else {
  420. ret = ltc2947_val_read(st, LTC2947_REG_VOLTAGE,
  421. LTC2947_PAGE0, 2, &__val);
  422. }
  423. break;
  424. case hwmon_in_highest:
  425. if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
  426. ret = ltc2947_val_read(st, LTC2947_REG_DVCC_MAX,
  427. LTC2947_PAGE0, 2, &__val);
  428. lsb = 145;
  429. } else {
  430. ret = ltc2947_val_read(st, LTC2947_REG_VOLTAGE_MAX,
  431. LTC2947_PAGE0, 2, &__val);
  432. }
  433. break;
  434. case hwmon_in_lowest:
  435. if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
  436. ret = ltc2947_val_read(st, LTC2947_REG_DVCC_MIN,
  437. LTC2947_PAGE0, 2, &__val);
  438. lsb = 145;
  439. } else {
  440. ret = ltc2947_val_read(st, LTC2947_REG_VOLTAGE_MIN,
  441. LTC2947_PAGE0, 2, &__val);
  442. }
  443. break;
  444. case hwmon_in_max_alarm:
  445. if (channel == LTC2947_VOLTAGE_DVCC_CHAN)
  446. return ltc2947_alarm_read(st, LTC2947_REG_STATVDVCC,
  447. LTC2947_MAX_VOLTAGE_MASK,
  448. val);
  449. return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
  450. LTC2947_MAX_VOLTAGE_MASK, val);
  451. case hwmon_in_min_alarm:
  452. if (channel == LTC2947_VOLTAGE_DVCC_CHAN)
  453. return ltc2947_alarm_read(st, LTC2947_REG_STATVDVCC,
  454. LTC2947_MIN_VOLTAGE_MASK,
  455. val);
  456. return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
  457. LTC2947_MIN_VOLTAGE_MASK, val);
  458. case hwmon_in_max:
  459. if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
  460. ret = ltc2947_val_read(st, LTC2947_REG_DVCC_THRE_H,
  461. LTC2947_PAGE1, 2, &__val);
  462. lsb = 145;
  463. } else {
  464. ret = ltc2947_val_read(st, LTC2947_REG_VOLTAGE_THRE_H,
  465. LTC2947_PAGE1, 2, &__val);
  466. }
  467. break;
  468. case hwmon_in_min:
  469. if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
  470. ret = ltc2947_val_read(st, LTC2947_REG_DVCC_THRE_L,
  471. LTC2947_PAGE1, 2, &__val);
  472. lsb = 145;
  473. } else {
  474. ret = ltc2947_val_read(st, LTC2947_REG_VOLTAGE_THRE_L,
  475. LTC2947_PAGE1, 2, &__val);
  476. }
  477. break;
  478. default:
  479. return -ENOTSUPP;
  480. }
  481. if (ret)
  482. return ret;
  483. *val = __val * lsb;
  484. return 0;
  485. }
  486. static int ltc2947_read_energy(struct device *dev, s64 *val, const int channel)
  487. {
  488. int reg = channel ? LTC2947_REG_ENERGY2 : LTC2947_REG_ENERGY1;
  489. struct ltc2947_data *st = dev_get_drvdata(dev);
  490. s64 __val = 0;
  491. int ret;
  492. ret = ltc2947_val_read(st, reg, LTC2947_PAGE0, 6, &__val);
  493. if (ret)
  494. return ret;
  495. /* value in microJoule. st->lsb_energy was multiplied by 10E9 */
  496. *val = DIV_S64_ROUND_CLOSEST(__val * st->lsb_energy, 1000);
  497. return 0;
  498. }
  499. static int ltc2947_read(struct device *dev, enum hwmon_sensor_types type,
  500. u32 attr, int channel, long *val)
  501. {
  502. switch (type) {
  503. case hwmon_in:
  504. return ltc2947_read_in(dev, attr, val, channel);
  505. case hwmon_curr:
  506. return ltc2947_read_curr(dev, attr, val);
  507. case hwmon_power:
  508. return ltc2947_read_power(dev, attr, val);
  509. case hwmon_temp:
  510. return ltc2947_read_temp(dev, attr, val, channel);
  511. case hwmon_energy64:
  512. return ltc2947_read_energy(dev, (s64 *)val, channel);
  513. default:
  514. return -ENOTSUPP;
  515. }
  516. }
  517. static int ltc2947_write_temp(struct device *dev, const u32 attr,
  518. long val, const int channel)
  519. {
  520. struct ltc2947_data *st = dev_get_drvdata(dev);
  521. if (channel < 0 || channel > LTC2947_TEMP_FAN_CHAN) {
  522. dev_err(st->dev, "Invalid chan%d for temperature", channel);
  523. return -EINVAL;
  524. }
  525. switch (attr) {
  526. case hwmon_temp_reset_history:
  527. if (val != 1)
  528. return -EINVAL;
  529. return ltc2947_reset_history(st, LTC2947_REG_TEMP_MAX,
  530. LTC2947_REG_TEMP_MIN);
  531. case hwmon_temp_max:
  532. val = clamp_val(val, TEMP_MIN, TEMP_MAX);
  533. if (channel == LTC2947_TEMP_FAN_CHAN) {
  534. if (!st->gpio_out)
  535. return -ENOTSUPP;
  536. return ltc2947_val_write(st,
  537. LTC2947_REG_TEMP_FAN_THRE_H,
  538. LTC2947_PAGE1, 2,
  539. DIV_ROUND_CLOSEST(val - 550, 204));
  540. }
  541. return ltc2947_val_write(st, LTC2947_REG_TEMP_THRE_H,
  542. LTC2947_PAGE1, 2,
  543. DIV_ROUND_CLOSEST(val - 550, 204));
  544. case hwmon_temp_min:
  545. val = clamp_val(val, TEMP_MIN, TEMP_MAX);
  546. if (channel == LTC2947_TEMP_FAN_CHAN) {
  547. if (!st->gpio_out)
  548. return -ENOTSUPP;
  549. return ltc2947_val_write(st,
  550. LTC2947_REG_TEMP_FAN_THRE_L,
  551. LTC2947_PAGE1, 2,
  552. DIV_ROUND_CLOSEST(val - 550, 204));
  553. }
  554. return ltc2947_val_write(st, LTC2947_REG_TEMP_THRE_L,
  555. LTC2947_PAGE1, 2,
  556. DIV_ROUND_CLOSEST(val - 550, 204));
  557. default:
  558. return -ENOTSUPP;
  559. }
  560. }
  561. static int ltc2947_write_power(struct device *dev, const u32 attr,
  562. long val)
  563. {
  564. struct ltc2947_data *st = dev_get_drvdata(dev);
  565. switch (attr) {
  566. case hwmon_power_reset_history:
  567. if (val != 1)
  568. return -EINVAL;
  569. return ltc2947_reset_history(st, LTC2947_REG_POWER_MAX,
  570. LTC2947_REG_POWER_MIN);
  571. case hwmon_power_max:
  572. val = clamp_val(val, POWER_MIN, POWER_MAX);
  573. return ltc2947_val_write(st, LTC2947_REG_POWER_THRE_H,
  574. LTC2947_PAGE1, 2,
  575. DIV_ROUND_CLOSEST(val, 200000));
  576. case hwmon_power_min:
  577. val = clamp_val(val, POWER_MIN, POWER_MAX);
  578. return ltc2947_val_write(st, LTC2947_REG_POWER_THRE_L,
  579. LTC2947_PAGE1, 2,
  580. DIV_ROUND_CLOSEST(val, 200000));
  581. default:
  582. return -ENOTSUPP;
  583. }
  584. }
  585. static int ltc2947_write_curr(struct device *dev, const u32 attr,
  586. long val)
  587. {
  588. struct ltc2947_data *st = dev_get_drvdata(dev);
  589. switch (attr) {
  590. case hwmon_curr_reset_history:
  591. if (val != 1)
  592. return -EINVAL;
  593. return ltc2947_reset_history(st, LTC2947_REG_CURRENT_MAX,
  594. LTC2947_REG_CURRENT_MIN);
  595. case hwmon_curr_max:
  596. val = clamp_val(val, CURRENT_MIN, CURRENT_MAX);
  597. return ltc2947_val_write(st, LTC2947_REG_CURRENT_THRE_H,
  598. LTC2947_PAGE1, 2,
  599. DIV_ROUND_CLOSEST(val, 12));
  600. case hwmon_curr_min:
  601. val = clamp_val(val, CURRENT_MIN, CURRENT_MAX);
  602. return ltc2947_val_write(st, LTC2947_REG_CURRENT_THRE_L,
  603. LTC2947_PAGE1, 2,
  604. DIV_ROUND_CLOSEST(val, 12));
  605. default:
  606. return -ENOTSUPP;
  607. }
  608. }
  609. static int ltc2947_write_in(struct device *dev, const u32 attr, long val,
  610. const int channel)
  611. {
  612. struct ltc2947_data *st = dev_get_drvdata(dev);
  613. if (channel > LTC2947_VOLTAGE_DVCC_CHAN) {
  614. dev_err(st->dev, "Invalid chan%d for voltage", channel);
  615. return -EINVAL;
  616. }
  617. switch (attr) {
  618. case hwmon_in_reset_history:
  619. if (val != 1)
  620. return -EINVAL;
  621. if (channel == LTC2947_VOLTAGE_DVCC_CHAN)
  622. return ltc2947_reset_history(st, LTC2947_REG_DVCC_MAX,
  623. LTC2947_REG_DVCC_MIN);
  624. return ltc2947_reset_history(st, LTC2947_REG_VOLTAGE_MAX,
  625. LTC2947_REG_VOLTAGE_MIN);
  626. case hwmon_in_max:
  627. if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
  628. val = clamp_val(val, VDVCC_MIN, VDVCC_MAX);
  629. return ltc2947_val_write(st, LTC2947_REG_DVCC_THRE_H,
  630. LTC2947_PAGE1, 2,
  631. DIV_ROUND_CLOSEST(val, 145));
  632. }
  633. val = clamp_val(val, VOLTAGE_MIN, VOLTAGE_MAX);
  634. return ltc2947_val_write(st, LTC2947_REG_VOLTAGE_THRE_H,
  635. LTC2947_PAGE1, 2,
  636. DIV_ROUND_CLOSEST(val, 2));
  637. case hwmon_in_min:
  638. if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
  639. val = clamp_val(val, VDVCC_MIN, VDVCC_MAX);
  640. return ltc2947_val_write(st, LTC2947_REG_DVCC_THRE_L,
  641. LTC2947_PAGE1, 2,
  642. DIV_ROUND_CLOSEST(val, 145));
  643. }
  644. val = clamp_val(val, VOLTAGE_MIN, VOLTAGE_MAX);
  645. return ltc2947_val_write(st, LTC2947_REG_VOLTAGE_THRE_L,
  646. LTC2947_PAGE1, 2,
  647. DIV_ROUND_CLOSEST(val, 2));
  648. default:
  649. return -ENOTSUPP;
  650. }
  651. }
  652. static int ltc2947_write(struct device *dev,
  653. enum hwmon_sensor_types type,
  654. u32 attr, int channel, long val)
  655. {
  656. switch (type) {
  657. case hwmon_in:
  658. return ltc2947_write_in(dev, attr, val, channel);
  659. case hwmon_curr:
  660. return ltc2947_write_curr(dev, attr, val);
  661. case hwmon_power:
  662. return ltc2947_write_power(dev, attr, val);
  663. case hwmon_temp:
  664. return ltc2947_write_temp(dev, attr, val, channel);
  665. default:
  666. return -ENOTSUPP;
  667. }
  668. }
  669. static int ltc2947_read_labels(struct device *dev,
  670. enum hwmon_sensor_types type,
  671. u32 attr, int channel, const char **str)
  672. {
  673. switch (type) {
  674. case hwmon_in:
  675. if (channel == LTC2947_VOLTAGE_DVCC_CHAN)
  676. *str = "DVCC";
  677. else
  678. *str = "VP-VM";
  679. return 0;
  680. case hwmon_curr:
  681. *str = "IP-IM";
  682. return 0;
  683. case hwmon_temp:
  684. if (channel == LTC2947_TEMP_FAN_CHAN)
  685. *str = "TEMPFAN";
  686. else
  687. *str = "Ambient";
  688. return 0;
  689. case hwmon_power:
  690. *str = "Power";
  691. return 0;
  692. default:
  693. return -ENOTSUPP;
  694. }
  695. }
  696. static int ltc2947_in_is_visible(const u32 attr)
  697. {
  698. switch (attr) {
  699. case hwmon_in_input:
  700. case hwmon_in_highest:
  701. case hwmon_in_lowest:
  702. case hwmon_in_max_alarm:
  703. case hwmon_in_min_alarm:
  704. case hwmon_in_label:
  705. return 0444;
  706. case hwmon_in_reset_history:
  707. return 0200;
  708. case hwmon_in_max:
  709. case hwmon_in_min:
  710. return 0644;
  711. default:
  712. return 0;
  713. }
  714. }
  715. static int ltc2947_curr_is_visible(const u32 attr)
  716. {
  717. switch (attr) {
  718. case hwmon_curr_input:
  719. case hwmon_curr_highest:
  720. case hwmon_curr_lowest:
  721. case hwmon_curr_max_alarm:
  722. case hwmon_curr_min_alarm:
  723. case hwmon_curr_label:
  724. return 0444;
  725. case hwmon_curr_reset_history:
  726. return 0200;
  727. case hwmon_curr_max:
  728. case hwmon_curr_min:
  729. return 0644;
  730. default:
  731. return 0;
  732. }
  733. }
  734. static int ltc2947_power_is_visible(const u32 attr)
  735. {
  736. switch (attr) {
  737. case hwmon_power_input:
  738. case hwmon_power_input_highest:
  739. case hwmon_power_input_lowest:
  740. case hwmon_power_label:
  741. case hwmon_power_max_alarm:
  742. case hwmon_power_min_alarm:
  743. return 0444;
  744. case hwmon_power_reset_history:
  745. return 0200;
  746. case hwmon_power_max:
  747. case hwmon_power_min:
  748. return 0644;
  749. default:
  750. return 0;
  751. }
  752. }
  753. static int ltc2947_temp_is_visible(const u32 attr)
  754. {
  755. switch (attr) {
  756. case hwmon_temp_input:
  757. case hwmon_temp_highest:
  758. case hwmon_temp_lowest:
  759. case hwmon_temp_max_alarm:
  760. case hwmon_temp_min_alarm:
  761. case hwmon_temp_label:
  762. return 0444;
  763. case hwmon_temp_reset_history:
  764. return 0200;
  765. case hwmon_temp_max:
  766. case hwmon_temp_min:
  767. return 0644;
  768. default:
  769. return 0;
  770. }
  771. }
  772. static umode_t ltc2947_is_visible(const void *data,
  773. enum hwmon_sensor_types type,
  774. u32 attr, int channel)
  775. {
  776. switch (type) {
  777. case hwmon_in:
  778. return ltc2947_in_is_visible(attr);
  779. case hwmon_curr:
  780. return ltc2947_curr_is_visible(attr);
  781. case hwmon_power:
  782. return ltc2947_power_is_visible(attr);
  783. case hwmon_temp:
  784. return ltc2947_temp_is_visible(attr);
  785. case hwmon_energy64:
  786. return 0444;
  787. default:
  788. return 0;
  789. }
  790. }
  791. static const struct hwmon_channel_info * const ltc2947_info[] = {
  792. HWMON_CHANNEL_INFO(in,
  793. HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST |
  794. HWMON_I_MAX | HWMON_I_MIN | HWMON_I_RESET_HISTORY |
  795. HWMON_I_MIN_ALARM | HWMON_I_MAX_ALARM |
  796. HWMON_I_LABEL,
  797. HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST |
  798. HWMON_I_MAX | HWMON_I_MIN | HWMON_I_RESET_HISTORY |
  799. HWMON_I_MIN_ALARM | HWMON_I_MAX_ALARM |
  800. HWMON_I_LABEL),
  801. HWMON_CHANNEL_INFO(curr,
  802. HWMON_C_INPUT | HWMON_C_LOWEST | HWMON_C_HIGHEST |
  803. HWMON_C_MAX | HWMON_C_MIN | HWMON_C_RESET_HISTORY |
  804. HWMON_C_MIN_ALARM | HWMON_C_MAX_ALARM |
  805. HWMON_C_LABEL),
  806. HWMON_CHANNEL_INFO(power,
  807. HWMON_P_INPUT | HWMON_P_INPUT_LOWEST |
  808. HWMON_P_INPUT_HIGHEST | HWMON_P_MAX | HWMON_P_MIN |
  809. HWMON_P_RESET_HISTORY | HWMON_P_MAX_ALARM |
  810. HWMON_P_MIN_ALARM | HWMON_P_LABEL),
  811. HWMON_CHANNEL_INFO(temp,
  812. HWMON_T_INPUT | HWMON_T_LOWEST | HWMON_T_HIGHEST |
  813. HWMON_T_MAX | HWMON_T_MIN | HWMON_T_RESET_HISTORY |
  814. HWMON_T_MIN_ALARM | HWMON_T_MAX_ALARM |
  815. HWMON_T_LABEL,
  816. HWMON_T_MAX_ALARM | HWMON_T_MIN_ALARM | HWMON_T_MAX |
  817. HWMON_T_MIN | HWMON_T_LABEL),
  818. HWMON_CHANNEL_INFO(energy64,
  819. HWMON_E_INPUT,
  820. HWMON_E_INPUT),
  821. NULL
  822. };
  823. static const struct hwmon_ops ltc2947_hwmon_ops = {
  824. .is_visible = ltc2947_is_visible,
  825. .read = ltc2947_read,
  826. .write = ltc2947_write,
  827. .read_string = ltc2947_read_labels,
  828. };
  829. static const struct hwmon_chip_info ltc2947_chip_info = {
  830. .ops = &ltc2947_hwmon_ops,
  831. .info = ltc2947_info,
  832. };
  833. static int ltc2947_setup(struct ltc2947_data *st)
  834. {
  835. int ret;
  836. struct clk *extclk;
  837. u32 dummy, deadband, pol;
  838. u32 accum[2];
  839. /* clear status register by reading it */
  840. ret = regmap_read(st->map, LTC2947_REG_STATUS, &dummy);
  841. if (ret)
  842. return ret;
  843. /*
  844. * Set max/min for power here since the default values x scale
  845. * would overflow on 32bit arch
  846. */
  847. ret = ltc2947_val_write(st, LTC2947_REG_POWER_THRE_H, LTC2947_PAGE1, 2,
  848. POWER_MAX / 200000);
  849. if (ret)
  850. return ret;
  851. ret = ltc2947_val_write(st, LTC2947_REG_POWER_THRE_L, LTC2947_PAGE1, 2,
  852. POWER_MIN / 200000);
  853. if (ret)
  854. return ret;
  855. /* check external clock presence */
  856. extclk = devm_clk_get_optional_enabled(st->dev, NULL);
  857. if (IS_ERR(extclk))
  858. return dev_err_probe(st->dev, PTR_ERR(extclk),
  859. "Failed to get external clock\n");
  860. if (extclk) {
  861. unsigned long rate_hz;
  862. u8 pre = 0, div, tbctl;
  863. u64 aux;
  864. /* let's calculate and set the right valus in TBCTL */
  865. rate_hz = clk_get_rate(extclk);
  866. if (rate_hz < LTC2947_CLK_MIN || rate_hz > LTC2947_CLK_MAX) {
  867. dev_err(st->dev, "Invalid rate:%lu for external clock",
  868. rate_hz);
  869. return -EINVAL;
  870. }
  871. /* as in table 1 of the datasheet */
  872. if (rate_hz >= LTC2947_CLK_MIN && rate_hz <= 1000000)
  873. pre = 0;
  874. else if (rate_hz > 1000000 && rate_hz <= 2000000)
  875. pre = 1;
  876. else if (rate_hz > 2000000 && rate_hz <= 4000000)
  877. pre = 2;
  878. else if (rate_hz > 4000000 && rate_hz <= 8000000)
  879. pre = 3;
  880. else if (rate_hz > 8000000 && rate_hz <= 16000000)
  881. pre = 4;
  882. else if (rate_hz > 16000000 && rate_hz <= LTC2947_CLK_MAX)
  883. pre = 5;
  884. /*
  885. * Div is given by:
  886. * floor(fref / (2^PRE * 32768))
  887. */
  888. div = rate_hz / ((1 << pre) * 32768);
  889. tbctl = LTC2947_PRE(pre) | LTC2947_DIV(div);
  890. ret = regmap_write(st->map, LTC2947_REG_TBCTL, tbctl);
  891. if (ret)
  892. return ret;
  893. /*
  894. * The energy lsb is given by (in W*s):
  895. * 06416 * (1/fref) * 2^PRE * (DIV + 1)
  896. * The value is multiplied by 10E9
  897. */
  898. aux = (div + 1) * ((1 << pre) * 641600000ULL);
  899. st->lsb_energy = DIV_ROUND_CLOSEST_ULL(aux, rate_hz);
  900. } else {
  901. /* 19.89E-6 * 10E9 */
  902. st->lsb_energy = 19890;
  903. }
  904. ret = device_property_read_u32_array(st->dev, "adi,accumulator-ctl-pol",
  905. accum, ARRAY_SIZE(accum));
  906. if (!ret) {
  907. u32 accum_reg = LTC2947_ACCUM_POL_1(accum[0]) |
  908. LTC2947_ACCUM_POL_2(accum[1]);
  909. ret = regmap_write(st->map, LTC2947_REG_ACCUM_POL, accum_reg);
  910. if (ret)
  911. return ret;
  912. }
  913. ret = device_property_read_u32(st->dev,
  914. "adi,accumulation-deadband-microamp",
  915. &deadband);
  916. if (!ret) {
  917. /* the LSB is the same as the current, so 3mA */
  918. ret = regmap_write(st->map, LTC2947_REG_ACCUM_DEADBAND,
  919. deadband / (1000 * 3));
  920. if (ret)
  921. return ret;
  922. }
  923. /* check gpio cfg */
  924. ret = device_property_read_u32(st->dev, "adi,gpio-out-pol", &pol);
  925. if (!ret) {
  926. /* setup GPIO as output */
  927. u32 gpio_ctl = LTC2947_GPIO_EN(1) | LTC2947_GPIO_FAN_EN(1) |
  928. LTC2947_GPIO_FAN_POL(pol);
  929. st->gpio_out = true;
  930. ret = regmap_write(st->map, LTC2947_REG_GPIOSTATCTL, gpio_ctl);
  931. if (ret)
  932. return ret;
  933. }
  934. ret = device_property_read_u32_array(st->dev, "adi,gpio-in-accum",
  935. accum, ARRAY_SIZE(accum));
  936. if (!ret) {
  937. /*
  938. * Setup the accum options. The gpioctl is already defined as
  939. * input by default.
  940. */
  941. u32 accum_val = LTC2947_ACCUM_POL_1(accum[0]) |
  942. LTC2947_ACCUM_POL_2(accum[1]);
  943. if (st->gpio_out) {
  944. dev_err(st->dev,
  945. "Cannot have input gpio config if already configured as output");
  946. return -EINVAL;
  947. }
  948. ret = regmap_write(st->map, LTC2947_REG_GPIO_ACCUM, accum_val);
  949. if (ret)
  950. return ret;
  951. }
  952. /* set continuos mode */
  953. return regmap_update_bits(st->map, LTC2947_REG_CTRL,
  954. LTC2947_CONT_MODE_MASK, LTC2947_CONT_MODE(1));
  955. }
  956. int ltc2947_core_probe(struct regmap *map, const char *name)
  957. {
  958. struct ltc2947_data *st;
  959. struct device *dev = regmap_get_device(map);
  960. struct device *hwmon;
  961. int ret;
  962. st = devm_kzalloc(dev, sizeof(*st), GFP_KERNEL);
  963. if (!st)
  964. return -ENOMEM;
  965. st->map = map;
  966. st->dev = dev;
  967. dev_set_drvdata(dev, st);
  968. ret = ltc2947_setup(st);
  969. if (ret)
  970. return ret;
  971. hwmon = devm_hwmon_device_register_with_info(dev, name, st,
  972. &ltc2947_chip_info, NULL);
  973. return PTR_ERR_OR_ZERO(hwmon);
  974. }
  975. EXPORT_SYMBOL_GPL(ltc2947_core_probe);
  976. static int ltc2947_resume(struct device *dev)
  977. {
  978. struct ltc2947_data *st = dev_get_drvdata(dev);
  979. u32 ctrl = 0;
  980. int ret;
  981. /* dummy read to wake the device */
  982. ret = regmap_read(st->map, LTC2947_REG_CTRL, &ctrl);
  983. if (ret)
  984. return ret;
  985. /*
  986. * Wait for the device. It takes 100ms to wake up so, 10ms extra
  987. * should be enough.
  988. */
  989. msleep(110);
  990. ret = regmap_read(st->map, LTC2947_REG_CTRL, &ctrl);
  991. if (ret)
  992. return ret;
  993. /* ctrl should be 0 */
  994. if (ctrl != 0) {
  995. dev_err(st->dev, "Device failed to wake up, ctl:%02X\n", ctrl);
  996. return -ETIMEDOUT;
  997. }
  998. /* set continuous mode */
  999. return regmap_update_bits(st->map, LTC2947_REG_CTRL,
  1000. LTC2947_CONT_MODE_MASK, LTC2947_CONT_MODE(1));
  1001. }
  1002. static int ltc2947_suspend(struct device *dev)
  1003. {
  1004. struct ltc2947_data *st = dev_get_drvdata(dev);
  1005. return regmap_update_bits(st->map, LTC2947_REG_CTRL,
  1006. LTC2947_SHUTDOWN_MASK, 1);
  1007. }
  1008. EXPORT_SIMPLE_DEV_PM_OPS(ltc2947_pm_ops, ltc2947_suspend, ltc2947_resume);
  1009. const struct of_device_id ltc2947_of_match[] = {
  1010. { .compatible = "adi,ltc2947" },
  1011. {}
  1012. };
  1013. EXPORT_SYMBOL_GPL(ltc2947_of_match);
  1014. MODULE_DEVICE_TABLE(of, ltc2947_of_match);
  1015. MODULE_AUTHOR("Nuno Sa <nuno.sa@analog.com>");
  1016. MODULE_DESCRIPTION("LTC2947 power and energy monitor core driver");
  1017. MODULE_LICENSE("GPL");