ltc2978.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. /*
  2. * Hardware monitoring driver for LTC2974, LTC2977, LTC2978, LTC3880,
  3. * LTC3883, and LTM4676
  4. *
  5. * Copyright (c) 2011 Ericsson AB.
  6. * Copyright (c) 2013, 2014 Guenter Roeck
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. */
  18. #include <linux/kernel.h>
  19. #include <linux/module.h>
  20. #include <linux/init.h>
  21. #include <linux/err.h>
  22. #include <linux/slab.h>
  23. #include <linux/i2c.h>
  24. #include "pmbus.h"
  25. enum chips { ltc2974, ltc2977, ltc2978, ltc3880, ltc3883, ltm4676 };
  26. /* Common for all chips */
  27. #define LTC2978_MFR_VOUT_PEAK 0xdd
  28. #define LTC2978_MFR_VIN_PEAK 0xde
  29. #define LTC2978_MFR_TEMPERATURE_PEAK 0xdf
  30. #define LTC2978_MFR_SPECIAL_ID 0xe7
  31. /* LTC2974, LCT2977, and LTC2978 */
  32. #define LTC2978_MFR_VOUT_MIN 0xfb
  33. #define LTC2978_MFR_VIN_MIN 0xfc
  34. #define LTC2978_MFR_TEMPERATURE_MIN 0xfd
  35. /* LTC2974 only */
  36. #define LTC2974_MFR_IOUT_PEAK 0xd7
  37. #define LTC2974_MFR_IOUT_MIN 0xd8
  38. /* LTC3880, LTC3883, and LTM4676 */
  39. #define LTC3880_MFR_IOUT_PEAK 0xd7
  40. #define LTC3880_MFR_CLEAR_PEAKS 0xe3
  41. #define LTC3880_MFR_TEMPERATURE2_PEAK 0xf4
  42. /* LTC3883 only */
  43. #define LTC3883_MFR_IIN_PEAK 0xe1
  44. #define LTC2974_ID_REV1 0x0212
  45. #define LTC2974_ID_REV2 0x0213
  46. #define LTC2977_ID 0x0130
  47. #define LTC2978_ID_REV1 0x0121
  48. #define LTC2978_ID_REV2 0x0122
  49. #define LTC2978A_ID 0x0124
  50. #define LTC3880_ID 0x4000
  51. #define LTC3880_ID_MASK 0xff00
  52. #define LTC3883_ID 0x4300
  53. #define LTC3883_ID_MASK 0xff00
  54. #define LTM4676_ID 0x4480 /* datasheet claims 0x440X */
  55. #define LTM4676_ID_MASK 0xfff0
  56. #define LTC2974_NUM_PAGES 4
  57. #define LTC2978_NUM_PAGES 8
  58. #define LTC3880_NUM_PAGES 2
  59. #define LTC3883_NUM_PAGES 1
  60. /*
  61. * LTC2978 clears peak data whenever the CLEAR_FAULTS command is executed, which
  62. * happens pretty much each time chip data is updated. Raw peak data therefore
  63. * does not provide much value. To be able to provide useful peak data, keep an
  64. * internal cache of measured peak data, which is only cleared if an explicit
  65. * "clear peak" command is executed for the sensor in question.
  66. */
  67. struct ltc2978_data {
  68. enum chips id;
  69. u16 vin_min, vin_max;
  70. u16 temp_min[LTC2974_NUM_PAGES], temp_max[LTC2974_NUM_PAGES];
  71. u16 vout_min[LTC2978_NUM_PAGES], vout_max[LTC2978_NUM_PAGES];
  72. u16 iout_min[LTC2974_NUM_PAGES], iout_max[LTC2974_NUM_PAGES];
  73. u16 iin_max;
  74. u16 temp2_max;
  75. struct pmbus_driver_info info;
  76. };
  77. #define to_ltc2978_data(x) container_of(x, struct ltc2978_data, info)
  78. static inline int lin11_to_val(int data)
  79. {
  80. s16 e = ((s16)data) >> 11;
  81. s32 m = (((s16)(data << 5)) >> 5);
  82. /*
  83. * mantissa is 10 bit + sign, exponent adds up to 15 bit.
  84. * Add 6 bit to exponent for maximum accuracy (10 + 15 + 6 = 31).
  85. */
  86. e += 6;
  87. return (e < 0 ? m >> -e : m << e);
  88. }
  89. static int ltc2978_read_word_data_common(struct i2c_client *client, int page,
  90. int reg)
  91. {
  92. const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
  93. struct ltc2978_data *data = to_ltc2978_data(info);
  94. int ret;
  95. switch (reg) {
  96. case PMBUS_VIRT_READ_VIN_MAX:
  97. ret = pmbus_read_word_data(client, page, LTC2978_MFR_VIN_PEAK);
  98. if (ret >= 0) {
  99. if (lin11_to_val(ret) > lin11_to_val(data->vin_max))
  100. data->vin_max = ret;
  101. ret = data->vin_max;
  102. }
  103. break;
  104. case PMBUS_VIRT_READ_VOUT_MAX:
  105. ret = pmbus_read_word_data(client, page, LTC2978_MFR_VOUT_PEAK);
  106. if (ret >= 0) {
  107. /*
  108. * VOUT is 16 bit unsigned with fixed exponent,
  109. * so we can compare it directly
  110. */
  111. if (ret > data->vout_max[page])
  112. data->vout_max[page] = ret;
  113. ret = data->vout_max[page];
  114. }
  115. break;
  116. case PMBUS_VIRT_READ_TEMP_MAX:
  117. ret = pmbus_read_word_data(client, page,
  118. LTC2978_MFR_TEMPERATURE_PEAK);
  119. if (ret >= 0) {
  120. if (lin11_to_val(ret)
  121. > lin11_to_val(data->temp_max[page]))
  122. data->temp_max[page] = ret;
  123. ret = data->temp_max[page];
  124. }
  125. break;
  126. case PMBUS_VIRT_RESET_VOUT_HISTORY:
  127. case PMBUS_VIRT_RESET_VIN_HISTORY:
  128. case PMBUS_VIRT_RESET_TEMP_HISTORY:
  129. ret = 0;
  130. break;
  131. default:
  132. ret = -ENODATA;
  133. break;
  134. }
  135. return ret;
  136. }
  137. static int ltc2978_read_word_data(struct i2c_client *client, int page, int reg)
  138. {
  139. const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
  140. struct ltc2978_data *data = to_ltc2978_data(info);
  141. int ret;
  142. switch (reg) {
  143. case PMBUS_VIRT_READ_VIN_MIN:
  144. ret = pmbus_read_word_data(client, page, LTC2978_MFR_VIN_MIN);
  145. if (ret >= 0) {
  146. if (lin11_to_val(ret) < lin11_to_val(data->vin_min))
  147. data->vin_min = ret;
  148. ret = data->vin_min;
  149. }
  150. break;
  151. case PMBUS_VIRT_READ_VOUT_MIN:
  152. ret = pmbus_read_word_data(client, page, LTC2978_MFR_VOUT_MIN);
  153. if (ret >= 0) {
  154. /*
  155. * VOUT_MIN is known to not be supported on some lots
  156. * of LTC2978 revision 1, and will return the maximum
  157. * possible voltage if read. If VOUT_MAX is valid and
  158. * lower than the reading of VOUT_MIN, use it instead.
  159. */
  160. if (data->vout_max[page] && ret > data->vout_max[page])
  161. ret = data->vout_max[page];
  162. if (ret < data->vout_min[page])
  163. data->vout_min[page] = ret;
  164. ret = data->vout_min[page];
  165. }
  166. break;
  167. case PMBUS_VIRT_READ_TEMP_MIN:
  168. ret = pmbus_read_word_data(client, page,
  169. LTC2978_MFR_TEMPERATURE_MIN);
  170. if (ret >= 0) {
  171. if (lin11_to_val(ret)
  172. < lin11_to_val(data->temp_min[page]))
  173. data->temp_min[page] = ret;
  174. ret = data->temp_min[page];
  175. }
  176. break;
  177. case PMBUS_VIRT_READ_IOUT_MAX:
  178. case PMBUS_VIRT_RESET_IOUT_HISTORY:
  179. case PMBUS_VIRT_READ_TEMP2_MAX:
  180. case PMBUS_VIRT_RESET_TEMP2_HISTORY:
  181. ret = -ENXIO;
  182. break;
  183. default:
  184. ret = ltc2978_read_word_data_common(client, page, reg);
  185. break;
  186. }
  187. return ret;
  188. }
  189. static int ltc2974_read_word_data(struct i2c_client *client, int page, int reg)
  190. {
  191. const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
  192. struct ltc2978_data *data = to_ltc2978_data(info);
  193. int ret;
  194. switch (reg) {
  195. case PMBUS_VIRT_READ_IOUT_MAX:
  196. ret = pmbus_read_word_data(client, page, LTC2974_MFR_IOUT_PEAK);
  197. if (ret >= 0) {
  198. if (lin11_to_val(ret)
  199. > lin11_to_val(data->iout_max[page]))
  200. data->iout_max[page] = ret;
  201. ret = data->iout_max[page];
  202. }
  203. break;
  204. case PMBUS_VIRT_READ_IOUT_MIN:
  205. ret = pmbus_read_word_data(client, page, LTC2974_MFR_IOUT_MIN);
  206. if (ret >= 0) {
  207. if (lin11_to_val(ret)
  208. < lin11_to_val(data->iout_min[page]))
  209. data->iout_min[page] = ret;
  210. ret = data->iout_min[page];
  211. }
  212. break;
  213. case PMBUS_VIRT_RESET_IOUT_HISTORY:
  214. ret = 0;
  215. break;
  216. default:
  217. ret = ltc2978_read_word_data(client, page, reg);
  218. break;
  219. }
  220. return ret;
  221. }
  222. static int ltc3880_read_word_data(struct i2c_client *client, int page, int reg)
  223. {
  224. const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
  225. struct ltc2978_data *data = to_ltc2978_data(info);
  226. int ret;
  227. switch (reg) {
  228. case PMBUS_VIRT_READ_IOUT_MAX:
  229. ret = pmbus_read_word_data(client, page, LTC3880_MFR_IOUT_PEAK);
  230. if (ret >= 0) {
  231. if (lin11_to_val(ret)
  232. > lin11_to_val(data->iout_max[page]))
  233. data->iout_max[page] = ret;
  234. ret = data->iout_max[page];
  235. }
  236. break;
  237. case PMBUS_VIRT_READ_TEMP2_MAX:
  238. ret = pmbus_read_word_data(client, page,
  239. LTC3880_MFR_TEMPERATURE2_PEAK);
  240. if (ret >= 0) {
  241. if (lin11_to_val(ret) > lin11_to_val(data->temp2_max))
  242. data->temp2_max = ret;
  243. ret = data->temp2_max;
  244. }
  245. break;
  246. case PMBUS_VIRT_READ_VIN_MIN:
  247. case PMBUS_VIRT_READ_VOUT_MIN:
  248. case PMBUS_VIRT_READ_TEMP_MIN:
  249. ret = -ENXIO;
  250. break;
  251. case PMBUS_VIRT_RESET_IOUT_HISTORY:
  252. case PMBUS_VIRT_RESET_TEMP2_HISTORY:
  253. ret = 0;
  254. break;
  255. default:
  256. ret = ltc2978_read_word_data_common(client, page, reg);
  257. break;
  258. }
  259. return ret;
  260. }
  261. static int ltc3883_read_word_data(struct i2c_client *client, int page, int reg)
  262. {
  263. const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
  264. struct ltc2978_data *data = to_ltc2978_data(info);
  265. int ret;
  266. switch (reg) {
  267. case PMBUS_VIRT_READ_IIN_MAX:
  268. ret = pmbus_read_word_data(client, page, LTC3883_MFR_IIN_PEAK);
  269. if (ret >= 0) {
  270. if (lin11_to_val(ret)
  271. > lin11_to_val(data->iin_max))
  272. data->iin_max = ret;
  273. ret = data->iin_max;
  274. }
  275. break;
  276. case PMBUS_VIRT_RESET_IIN_HISTORY:
  277. ret = 0;
  278. break;
  279. default:
  280. ret = ltc3880_read_word_data(client, page, reg);
  281. break;
  282. }
  283. return ret;
  284. }
  285. static int ltc2978_clear_peaks(struct i2c_client *client, int page,
  286. enum chips id)
  287. {
  288. int ret;
  289. if (id == ltc3880 || id == ltc3883)
  290. ret = pmbus_write_byte(client, 0, LTC3880_MFR_CLEAR_PEAKS);
  291. else
  292. ret = pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS);
  293. return ret;
  294. }
  295. static int ltc2978_write_word_data(struct i2c_client *client, int page,
  296. int reg, u16 word)
  297. {
  298. const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
  299. struct ltc2978_data *data = to_ltc2978_data(info);
  300. int ret;
  301. switch (reg) {
  302. case PMBUS_VIRT_RESET_IIN_HISTORY:
  303. data->iin_max = 0x7c00;
  304. ret = ltc2978_clear_peaks(client, page, data->id);
  305. break;
  306. case PMBUS_VIRT_RESET_IOUT_HISTORY:
  307. data->iout_max[page] = 0x7c00;
  308. data->iout_min[page] = 0xfbff;
  309. ret = ltc2978_clear_peaks(client, page, data->id);
  310. break;
  311. case PMBUS_VIRT_RESET_TEMP2_HISTORY:
  312. data->temp2_max = 0x7c00;
  313. ret = ltc2978_clear_peaks(client, page, data->id);
  314. break;
  315. case PMBUS_VIRT_RESET_VOUT_HISTORY:
  316. data->vout_min[page] = 0xffff;
  317. data->vout_max[page] = 0;
  318. ret = ltc2978_clear_peaks(client, page, data->id);
  319. break;
  320. case PMBUS_VIRT_RESET_VIN_HISTORY:
  321. data->vin_min = 0x7bff;
  322. data->vin_max = 0x7c00;
  323. ret = ltc2978_clear_peaks(client, page, data->id);
  324. break;
  325. case PMBUS_VIRT_RESET_TEMP_HISTORY:
  326. data->temp_min[page] = 0x7bff;
  327. data->temp_max[page] = 0x7c00;
  328. ret = ltc2978_clear_peaks(client, page, data->id);
  329. break;
  330. default:
  331. ret = -ENODATA;
  332. break;
  333. }
  334. return ret;
  335. }
  336. static const struct i2c_device_id ltc2978_id[] = {
  337. {"ltc2974", ltc2974},
  338. {"ltc2977", ltc2977},
  339. {"ltc2978", ltc2978},
  340. {"ltc3880", ltc3880},
  341. {"ltc3883", ltc3883},
  342. {"ltm4676", ltm4676},
  343. {}
  344. };
  345. MODULE_DEVICE_TABLE(i2c, ltc2978_id);
  346. static int ltc2978_probe(struct i2c_client *client,
  347. const struct i2c_device_id *id)
  348. {
  349. int chip_id, i;
  350. struct ltc2978_data *data;
  351. struct pmbus_driver_info *info;
  352. if (!i2c_check_functionality(client->adapter,
  353. I2C_FUNC_SMBUS_READ_WORD_DATA))
  354. return -ENODEV;
  355. data = devm_kzalloc(&client->dev, sizeof(struct ltc2978_data),
  356. GFP_KERNEL);
  357. if (!data)
  358. return -ENOMEM;
  359. chip_id = i2c_smbus_read_word_data(client, LTC2978_MFR_SPECIAL_ID);
  360. if (chip_id < 0)
  361. return chip_id;
  362. if (chip_id == LTC2974_ID_REV1 || chip_id == LTC2974_ID_REV2) {
  363. data->id = ltc2974;
  364. } else if (chip_id == LTC2977_ID) {
  365. data->id = ltc2977;
  366. } else if (chip_id == LTC2978_ID_REV1 || chip_id == LTC2978_ID_REV2 ||
  367. chip_id == LTC2978A_ID) {
  368. data->id = ltc2978;
  369. } else if ((chip_id & LTC3880_ID_MASK) == LTC3880_ID) {
  370. data->id = ltc3880;
  371. } else if ((chip_id & LTC3883_ID_MASK) == LTC3883_ID) {
  372. data->id = ltc3883;
  373. } else if ((chip_id & LTM4676_ID_MASK) == LTM4676_ID) {
  374. data->id = ltm4676;
  375. } else {
  376. dev_err(&client->dev, "Unsupported chip ID 0x%x\n", chip_id);
  377. return -ENODEV;
  378. }
  379. if (data->id != id->driver_data)
  380. dev_warn(&client->dev,
  381. "Device mismatch: Configured %s, detected %s\n",
  382. id->name,
  383. ltc2978_id[data->id].name);
  384. info = &data->info;
  385. info->write_word_data = ltc2978_write_word_data;
  386. data->vin_min = 0x7bff;
  387. data->vin_max = 0x7c00;
  388. for (i = 0; i < ARRAY_SIZE(data->vout_min); i++)
  389. data->vout_min[i] = 0xffff;
  390. for (i = 0; i < ARRAY_SIZE(data->iout_min); i++)
  391. data->iout_min[i] = 0xfbff;
  392. for (i = 0; i < ARRAY_SIZE(data->iout_max); i++)
  393. data->iout_max[i] = 0x7c00;
  394. for (i = 0; i < ARRAY_SIZE(data->temp_min); i++)
  395. data->temp_min[i] = 0x7bff;
  396. for (i = 0; i < ARRAY_SIZE(data->temp_max); i++)
  397. data->temp_max[i] = 0x7c00;
  398. data->temp2_max = 0x7c00;
  399. switch (data->id) {
  400. case ltc2974:
  401. info->read_word_data = ltc2974_read_word_data;
  402. info->pages = LTC2974_NUM_PAGES;
  403. info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
  404. | PMBUS_HAVE_TEMP2;
  405. for (i = 0; i < info->pages; i++) {
  406. info->func[i] |= PMBUS_HAVE_VOUT
  407. | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_POUT
  408. | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
  409. | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
  410. }
  411. break;
  412. case ltc2977:
  413. case ltc2978:
  414. info->read_word_data = ltc2978_read_word_data;
  415. info->pages = LTC2978_NUM_PAGES;
  416. info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
  417. | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
  418. | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
  419. for (i = 1; i < LTC2978_NUM_PAGES; i++) {
  420. info->func[i] = PMBUS_HAVE_VOUT
  421. | PMBUS_HAVE_STATUS_VOUT;
  422. }
  423. break;
  424. case ltc3880:
  425. case ltm4676:
  426. info->read_word_data = ltc3880_read_word_data;
  427. info->pages = LTC3880_NUM_PAGES;
  428. info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
  429. | PMBUS_HAVE_STATUS_INPUT
  430. | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
  431. | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
  432. | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
  433. | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
  434. info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
  435. | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
  436. | PMBUS_HAVE_POUT
  437. | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
  438. break;
  439. case ltc3883:
  440. info->read_word_data = ltc3883_read_word_data;
  441. info->pages = LTC3883_NUM_PAGES;
  442. info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
  443. | PMBUS_HAVE_STATUS_INPUT
  444. | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
  445. | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
  446. | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
  447. | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
  448. break;
  449. default:
  450. return -ENODEV;
  451. }
  452. return pmbus_do_probe(client, id, info);
  453. }
  454. /* This is the driver that will be inserted */
  455. static struct i2c_driver ltc2978_driver = {
  456. .driver = {
  457. .name = "ltc2978",
  458. },
  459. .probe = ltc2978_probe,
  460. .remove = pmbus_do_remove,
  461. .id_table = ltc2978_id,
  462. };
  463. module_i2c_driver(ltc2978_driver);
  464. MODULE_AUTHOR("Guenter Roeck");
  465. MODULE_DESCRIPTION("PMBus driver for LTC2974, LTC2978, LTC3880, LTC3883, and LTM4676");
  466. MODULE_LICENSE("GPL");