lm25066.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Hardware monitoring driver for LM25056 / LM25066 / LM5064 / LM5066
  4. *
  5. * Copyright (c) 2011 Ericsson AB.
  6. * Copyright (c) 2013 Guenter Roeck
  7. */
  8. #include <linux/bitops.h>
  9. #include <linux/kernel.h>
  10. #include <linux/module.h>
  11. #include <linux/init.h>
  12. #include <linux/err.h>
  13. #include <linux/slab.h>
  14. #include <linux/i2c.h>
  15. #include <linux/log2.h>
  16. #include <linux/of_device.h>
  17. #include "pmbus.h"
  18. enum chips { lm25056, lm25066, lm5064, lm5066, lm5066i };
  19. #define LM25066_READ_VAUX 0xd0
  20. #define LM25066_MFR_READ_IIN 0xd1
  21. #define LM25066_MFR_READ_PIN 0xd2
  22. #define LM25066_MFR_IIN_OC_WARN_LIMIT 0xd3
  23. #define LM25066_MFR_PIN_OP_WARN_LIMIT 0xd4
  24. #define LM25066_READ_PIN_PEAK 0xd5
  25. #define LM25066_CLEAR_PIN_PEAK 0xd6
  26. #define LM25066_DEVICE_SETUP 0xd9
  27. #define LM25066_READ_AVG_VIN 0xdc
  28. #define LM25066_SAMPLES_FOR_AVG 0xdb
  29. #define LM25066_READ_AVG_VOUT 0xdd
  30. #define LM25066_READ_AVG_IIN 0xde
  31. #define LM25066_READ_AVG_PIN 0xdf
  32. #define LM25066_DEV_SETUP_CL BIT(4) /* Current limit */
  33. #define LM25066_SAMPLES_FOR_AVG_MAX 4096
  34. /* LM25056 only */
  35. #define LM25056_VAUX_OV_WARN_LIMIT 0xe3
  36. #define LM25056_VAUX_UV_WARN_LIMIT 0xe4
  37. #define LM25056_MFR_STS_VAUX_OV_WARN BIT(1)
  38. #define LM25056_MFR_STS_VAUX_UV_WARN BIT(0)
  39. struct __coeff {
  40. short m, b, R;
  41. };
  42. #define PSC_CURRENT_IN_L (PSC_NUM_CLASSES)
  43. #define PSC_POWER_L (PSC_NUM_CLASSES + 1)
  44. static const struct __coeff lm25066_coeff[][PSC_NUM_CLASSES + 2] = {
  45. [lm25056] = {
  46. [PSC_VOLTAGE_IN] = {
  47. .m = 16296,
  48. .b = 1343,
  49. .R = -2,
  50. },
  51. [PSC_CURRENT_IN] = {
  52. .m = 13797,
  53. .b = -1833,
  54. .R = -2,
  55. },
  56. [PSC_CURRENT_IN_L] = {
  57. .m = 6726,
  58. .b = -537,
  59. .R = -2,
  60. },
  61. [PSC_POWER] = {
  62. .m = 5501,
  63. .b = -2908,
  64. .R = -3,
  65. },
  66. [PSC_POWER_L] = {
  67. .m = 26882,
  68. .b = -5646,
  69. .R = -4,
  70. },
  71. [PSC_TEMPERATURE] = {
  72. .m = 1580,
  73. .b = -14500,
  74. .R = -2,
  75. },
  76. },
  77. [lm25066] = {
  78. [PSC_VOLTAGE_IN] = {
  79. .m = 22070,
  80. .b = -1800,
  81. .R = -2,
  82. },
  83. [PSC_VOLTAGE_OUT] = {
  84. .m = 22070,
  85. .b = -1800,
  86. .R = -2,
  87. },
  88. [PSC_CURRENT_IN] = {
  89. .m = 13661,
  90. .b = -5200,
  91. .R = -2,
  92. },
  93. [PSC_CURRENT_IN_L] = {
  94. .m = 6854,
  95. .b = -3100,
  96. .R = -2,
  97. },
  98. [PSC_POWER] = {
  99. .m = 736,
  100. .b = -3300,
  101. .R = -2,
  102. },
  103. [PSC_POWER_L] = {
  104. .m = 369,
  105. .b = -1900,
  106. .R = -2,
  107. },
  108. [PSC_TEMPERATURE] = {
  109. .m = 16,
  110. },
  111. },
  112. [lm5064] = {
  113. [PSC_VOLTAGE_IN] = {
  114. .m = 4611,
  115. .b = -642,
  116. .R = -2,
  117. },
  118. [PSC_VOLTAGE_OUT] = {
  119. .m = 4621,
  120. .b = 423,
  121. .R = -2,
  122. },
  123. [PSC_CURRENT_IN] = {
  124. .m = 10742,
  125. .b = 1552,
  126. .R = -2,
  127. },
  128. [PSC_CURRENT_IN_L] = {
  129. .m = 5456,
  130. .b = 2118,
  131. .R = -2,
  132. },
  133. [PSC_POWER] = {
  134. .m = 1204,
  135. .b = 8524,
  136. .R = -3,
  137. },
  138. [PSC_POWER_L] = {
  139. .m = 612,
  140. .b = 11202,
  141. .R = -3,
  142. },
  143. [PSC_TEMPERATURE] = {
  144. .m = 16,
  145. },
  146. },
  147. [lm5066] = {
  148. [PSC_VOLTAGE_IN] = {
  149. .m = 4587,
  150. .b = -1200,
  151. .R = -2,
  152. },
  153. [PSC_VOLTAGE_OUT] = {
  154. .m = 4587,
  155. .b = -2400,
  156. .R = -2,
  157. },
  158. [PSC_CURRENT_IN] = {
  159. .m = 10753,
  160. .b = -1200,
  161. .R = -2,
  162. },
  163. [PSC_CURRENT_IN_L] = {
  164. .m = 5405,
  165. .b = -600,
  166. .R = -2,
  167. },
  168. [PSC_POWER] = {
  169. .m = 1204,
  170. .b = -6000,
  171. .R = -3,
  172. },
  173. [PSC_POWER_L] = {
  174. .m = 605,
  175. .b = -8000,
  176. .R = -3,
  177. },
  178. [PSC_TEMPERATURE] = {
  179. .m = 16,
  180. },
  181. },
  182. [lm5066i] = {
  183. [PSC_VOLTAGE_IN] = {
  184. .m = 4617,
  185. .b = -140,
  186. .R = -2,
  187. },
  188. [PSC_VOLTAGE_OUT] = {
  189. .m = 4602,
  190. .b = 500,
  191. .R = -2,
  192. },
  193. [PSC_CURRENT_IN] = {
  194. .m = 15076,
  195. .b = -504,
  196. .R = -2,
  197. },
  198. [PSC_CURRENT_IN_L] = {
  199. .m = 7645,
  200. .b = 100,
  201. .R = -2,
  202. },
  203. [PSC_POWER] = {
  204. .m = 1701,
  205. .b = -4000,
  206. .R = -3,
  207. },
  208. [PSC_POWER_L] = {
  209. .m = 861,
  210. .b = -965,
  211. .R = -3,
  212. },
  213. [PSC_TEMPERATURE] = {
  214. .m = 16,
  215. },
  216. },
  217. };
  218. struct lm25066_data {
  219. int id;
  220. u16 rlimit; /* Maximum register value */
  221. struct pmbus_driver_info info;
  222. };
  223. #define to_lm25066_data(x) container_of(x, struct lm25066_data, info)
  224. static int lm25066_read_word_data(struct i2c_client *client, int page,
  225. int phase, int reg)
  226. {
  227. const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
  228. const struct lm25066_data *data = to_lm25066_data(info);
  229. int ret;
  230. switch (reg) {
  231. case PMBUS_VIRT_READ_VMON:
  232. ret = pmbus_read_word_data(client, 0, 0xff, LM25066_READ_VAUX);
  233. if (ret < 0)
  234. break;
  235. /* Adjust returned value to match VIN coefficients */
  236. switch (data->id) {
  237. case lm25056:
  238. /* VIN: 6.14 mV VAUX: 293 uV LSB */
  239. ret = DIV_ROUND_CLOSEST(ret * 293, 6140);
  240. break;
  241. case lm25066:
  242. /* VIN: 4.54 mV VAUX: 283.2 uV LSB */
  243. ret = DIV_ROUND_CLOSEST(ret * 2832, 45400);
  244. break;
  245. case lm5064:
  246. /* VIN: 4.53 mV VAUX: 700 uV LSB */
  247. ret = DIV_ROUND_CLOSEST(ret * 70, 453);
  248. break;
  249. case lm5066:
  250. case lm5066i:
  251. /* VIN: 2.18 mV VAUX: 725 uV LSB */
  252. ret = DIV_ROUND_CLOSEST(ret * 725, 2180);
  253. break;
  254. }
  255. break;
  256. case PMBUS_READ_IIN:
  257. ret = pmbus_read_word_data(client, 0, 0xff,
  258. LM25066_MFR_READ_IIN);
  259. break;
  260. case PMBUS_READ_PIN:
  261. ret = pmbus_read_word_data(client, 0, 0xff,
  262. LM25066_MFR_READ_PIN);
  263. break;
  264. case PMBUS_IIN_OC_WARN_LIMIT:
  265. ret = pmbus_read_word_data(client, 0, 0xff,
  266. LM25066_MFR_IIN_OC_WARN_LIMIT);
  267. break;
  268. case PMBUS_PIN_OP_WARN_LIMIT:
  269. ret = pmbus_read_word_data(client, 0, 0xff,
  270. LM25066_MFR_PIN_OP_WARN_LIMIT);
  271. break;
  272. case PMBUS_VIRT_READ_VIN_AVG:
  273. ret = pmbus_read_word_data(client, 0, 0xff,
  274. LM25066_READ_AVG_VIN);
  275. break;
  276. case PMBUS_VIRT_READ_VOUT_AVG:
  277. ret = pmbus_read_word_data(client, 0, 0xff,
  278. LM25066_READ_AVG_VOUT);
  279. break;
  280. case PMBUS_VIRT_READ_IIN_AVG:
  281. ret = pmbus_read_word_data(client, 0, 0xff,
  282. LM25066_READ_AVG_IIN);
  283. break;
  284. case PMBUS_VIRT_READ_PIN_AVG:
  285. ret = pmbus_read_word_data(client, 0, 0xff,
  286. LM25066_READ_AVG_PIN);
  287. break;
  288. case PMBUS_VIRT_READ_PIN_MAX:
  289. ret = pmbus_read_word_data(client, 0, 0xff,
  290. LM25066_READ_PIN_PEAK);
  291. break;
  292. case PMBUS_VIRT_RESET_PIN_HISTORY:
  293. ret = 0;
  294. break;
  295. case PMBUS_VIRT_SAMPLES:
  296. ret = pmbus_read_byte_data(client, 0, LM25066_SAMPLES_FOR_AVG);
  297. if (ret < 0)
  298. break;
  299. ret = 1 << ret;
  300. break;
  301. default:
  302. ret = -ENODATA;
  303. break;
  304. }
  305. return ret;
  306. }
  307. static int lm25056_read_word_data(struct i2c_client *client, int page,
  308. int phase, int reg)
  309. {
  310. int ret;
  311. switch (reg) {
  312. case PMBUS_VIRT_VMON_UV_WARN_LIMIT:
  313. ret = pmbus_read_word_data(client, 0, 0xff,
  314. LM25056_VAUX_UV_WARN_LIMIT);
  315. if (ret < 0)
  316. break;
  317. /* Adjust returned value to match VIN coefficients */
  318. ret = DIV_ROUND_CLOSEST(ret * 293, 6140);
  319. break;
  320. case PMBUS_VIRT_VMON_OV_WARN_LIMIT:
  321. ret = pmbus_read_word_data(client, 0, 0xff,
  322. LM25056_VAUX_OV_WARN_LIMIT);
  323. if (ret < 0)
  324. break;
  325. /* Adjust returned value to match VIN coefficients */
  326. ret = DIV_ROUND_CLOSEST(ret * 293, 6140);
  327. break;
  328. default:
  329. ret = lm25066_read_word_data(client, page, phase, reg);
  330. break;
  331. }
  332. return ret;
  333. }
  334. static int lm25056_read_byte_data(struct i2c_client *client, int page, int reg)
  335. {
  336. int ret, s;
  337. switch (reg) {
  338. case PMBUS_VIRT_STATUS_VMON:
  339. ret = pmbus_read_byte_data(client, 0,
  340. PMBUS_STATUS_MFR_SPECIFIC);
  341. if (ret < 0)
  342. break;
  343. s = 0;
  344. if (ret & LM25056_MFR_STS_VAUX_UV_WARN)
  345. s |= PB_VOLTAGE_UV_WARNING;
  346. if (ret & LM25056_MFR_STS_VAUX_OV_WARN)
  347. s |= PB_VOLTAGE_OV_WARNING;
  348. ret = s;
  349. break;
  350. default:
  351. ret = -ENODATA;
  352. break;
  353. }
  354. return ret;
  355. }
  356. static int lm25066_write_word_data(struct i2c_client *client, int page, int reg,
  357. u16 word)
  358. {
  359. const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
  360. const struct lm25066_data *data = to_lm25066_data(info);
  361. int ret;
  362. switch (reg) {
  363. case PMBUS_POUT_OP_FAULT_LIMIT:
  364. case PMBUS_POUT_OP_WARN_LIMIT:
  365. case PMBUS_VOUT_UV_WARN_LIMIT:
  366. case PMBUS_OT_FAULT_LIMIT:
  367. case PMBUS_OT_WARN_LIMIT:
  368. case PMBUS_IIN_OC_FAULT_LIMIT:
  369. case PMBUS_VIN_UV_WARN_LIMIT:
  370. case PMBUS_VIN_UV_FAULT_LIMIT:
  371. case PMBUS_VIN_OV_FAULT_LIMIT:
  372. case PMBUS_VIN_OV_WARN_LIMIT:
  373. word = ((s16)word < 0) ? 0 : clamp_val(word, 0, data->rlimit);
  374. ret = pmbus_write_word_data(client, 0, reg, word);
  375. break;
  376. case PMBUS_IIN_OC_WARN_LIMIT:
  377. word = ((s16)word < 0) ? 0 : clamp_val(word, 0, data->rlimit);
  378. ret = pmbus_write_word_data(client, 0,
  379. LM25066_MFR_IIN_OC_WARN_LIMIT,
  380. word);
  381. break;
  382. case PMBUS_PIN_OP_WARN_LIMIT:
  383. word = ((s16)word < 0) ? 0 : clamp_val(word, 0, data->rlimit);
  384. ret = pmbus_write_word_data(client, 0,
  385. LM25066_MFR_PIN_OP_WARN_LIMIT,
  386. word);
  387. break;
  388. case PMBUS_VIRT_VMON_UV_WARN_LIMIT:
  389. /* Adjust from VIN coefficients (for LM25056) */
  390. word = DIV_ROUND_CLOSEST((int)word * 6140, 293);
  391. word = ((s16)word < 0) ? 0 : clamp_val(word, 0, data->rlimit);
  392. ret = pmbus_write_word_data(client, 0,
  393. LM25056_VAUX_UV_WARN_LIMIT, word);
  394. break;
  395. case PMBUS_VIRT_VMON_OV_WARN_LIMIT:
  396. /* Adjust from VIN coefficients (for LM25056) */
  397. word = DIV_ROUND_CLOSEST((int)word * 6140, 293);
  398. word = ((s16)word < 0) ? 0 : clamp_val(word, 0, data->rlimit);
  399. ret = pmbus_write_word_data(client, 0,
  400. LM25056_VAUX_OV_WARN_LIMIT, word);
  401. break;
  402. case PMBUS_VIRT_RESET_PIN_HISTORY:
  403. ret = pmbus_write_byte(client, 0, LM25066_CLEAR_PIN_PEAK);
  404. break;
  405. case PMBUS_VIRT_SAMPLES:
  406. word = clamp_val(word, 1, LM25066_SAMPLES_FOR_AVG_MAX);
  407. ret = pmbus_write_byte_data(client, 0, LM25066_SAMPLES_FOR_AVG,
  408. ilog2(word));
  409. break;
  410. default:
  411. ret = -ENODATA;
  412. break;
  413. }
  414. return ret;
  415. }
  416. #if IS_ENABLED(CONFIG_SENSORS_LM25066_REGULATOR)
  417. static const struct regulator_desc lm25066_reg_desc[] = {
  418. PMBUS_REGULATOR("vout", 0),
  419. };
  420. #endif
  421. static const struct i2c_device_id lm25066_id[] = {
  422. {"lm25056", lm25056},
  423. {"lm25066", lm25066},
  424. {"lm5064", lm5064},
  425. {"lm5066", lm5066},
  426. {"lm5066i", lm5066i},
  427. { }
  428. };
  429. MODULE_DEVICE_TABLE(i2c, lm25066_id);
  430. static const struct of_device_id __maybe_unused lm25066_of_match[] = {
  431. { .compatible = "ti,lm25056", .data = (void *)lm25056, },
  432. { .compatible = "ti,lm25066", .data = (void *)lm25066, },
  433. { .compatible = "ti,lm5064", .data = (void *)lm5064, },
  434. { .compatible = "ti,lm5066", .data = (void *)lm5066, },
  435. { .compatible = "ti,lm5066i", .data = (void *)lm5066i, },
  436. { },
  437. };
  438. MODULE_DEVICE_TABLE(of, lm25066_of_match);
  439. static int lm25066_probe(struct i2c_client *client)
  440. {
  441. int config;
  442. u32 shunt;
  443. struct lm25066_data *data;
  444. struct pmbus_driver_info *info;
  445. const struct __coeff *coeff;
  446. const struct of_device_id *of_id;
  447. const struct i2c_device_id *i2c_id;
  448. if (!i2c_check_functionality(client->adapter,
  449. I2C_FUNC_SMBUS_READ_BYTE_DATA))
  450. return -ENODEV;
  451. data = devm_kzalloc(&client->dev, sizeof(struct lm25066_data),
  452. GFP_KERNEL);
  453. if (!data)
  454. return -ENOMEM;
  455. config = i2c_smbus_read_byte_data(client, LM25066_DEVICE_SETUP);
  456. if (config < 0)
  457. return config;
  458. i2c_id = i2c_match_id(lm25066_id, client);
  459. of_id = of_match_device(lm25066_of_match, &client->dev);
  460. if (of_id && (unsigned long)of_id->data != i2c_id->driver_data)
  461. dev_notice(&client->dev, "Device mismatch: %s in device tree, %s detected\n",
  462. of_id->name, i2c_id->name);
  463. data->id = i2c_id->driver_data;
  464. info = &data->info;
  465. info->pages = 1;
  466. info->format[PSC_VOLTAGE_IN] = direct;
  467. info->format[PSC_VOLTAGE_OUT] = direct;
  468. info->format[PSC_CURRENT_IN] = direct;
  469. info->format[PSC_TEMPERATURE] = direct;
  470. info->format[PSC_POWER] = direct;
  471. info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VMON
  472. | PMBUS_HAVE_PIN | PMBUS_HAVE_IIN | PMBUS_HAVE_STATUS_INPUT
  473. | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP | PMBUS_HAVE_SAMPLES;
  474. if (data->id == lm25056) {
  475. info->func[0] |= PMBUS_HAVE_STATUS_VMON;
  476. info->read_word_data = lm25056_read_word_data;
  477. info->read_byte_data = lm25056_read_byte_data;
  478. data->rlimit = 0x0fff;
  479. } else {
  480. info->func[0] |= PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT;
  481. info->read_word_data = lm25066_read_word_data;
  482. data->rlimit = 0x0fff;
  483. }
  484. info->write_word_data = lm25066_write_word_data;
  485. coeff = &lm25066_coeff[data->id][0];
  486. info->m[PSC_TEMPERATURE] = coeff[PSC_TEMPERATURE].m;
  487. info->b[PSC_TEMPERATURE] = coeff[PSC_TEMPERATURE].b;
  488. info->R[PSC_TEMPERATURE] = coeff[PSC_TEMPERATURE].R;
  489. info->m[PSC_VOLTAGE_IN] = coeff[PSC_VOLTAGE_IN].m;
  490. info->b[PSC_VOLTAGE_IN] = coeff[PSC_VOLTAGE_IN].b;
  491. info->R[PSC_VOLTAGE_IN] = coeff[PSC_VOLTAGE_IN].R;
  492. info->m[PSC_VOLTAGE_OUT] = coeff[PSC_VOLTAGE_OUT].m;
  493. info->b[PSC_VOLTAGE_OUT] = coeff[PSC_VOLTAGE_OUT].b;
  494. info->R[PSC_VOLTAGE_OUT] = coeff[PSC_VOLTAGE_OUT].R;
  495. info->R[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN].R;
  496. info->R[PSC_POWER] = coeff[PSC_POWER].R;
  497. if (config & LM25066_DEV_SETUP_CL) {
  498. info->m[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN_L].m;
  499. info->b[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN_L].b;
  500. info->m[PSC_POWER] = coeff[PSC_POWER_L].m;
  501. info->b[PSC_POWER] = coeff[PSC_POWER_L].b;
  502. } else {
  503. info->m[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN].m;
  504. info->b[PSC_CURRENT_IN] = coeff[PSC_CURRENT_IN].b;
  505. info->m[PSC_POWER] = coeff[PSC_POWER].m;
  506. info->b[PSC_POWER] = coeff[PSC_POWER].b;
  507. }
  508. /*
  509. * Values in the TI datasheets are normalized for a 1mOhm sense
  510. * resistor; assume that unless DT specifies a value explicitly.
  511. */
  512. if (of_property_read_u32(client->dev.of_node, "shunt-resistor-micro-ohms", &shunt))
  513. shunt = 1000;
  514. info->m[PSC_CURRENT_IN] = info->m[PSC_CURRENT_IN] * shunt / 1000;
  515. info->m[PSC_POWER] = info->m[PSC_POWER] * shunt / 1000;
  516. #if IS_ENABLED(CONFIG_SENSORS_LM25066_REGULATOR)
  517. /* LM25056 doesn't support OPERATION */
  518. if (data->id != lm25056) {
  519. info->num_regulators = ARRAY_SIZE(lm25066_reg_desc);
  520. info->reg_desc = lm25066_reg_desc;
  521. }
  522. #endif
  523. return pmbus_do_probe(client, info);
  524. }
  525. /* This is the driver that will be inserted */
  526. static struct i2c_driver lm25066_driver = {
  527. .driver = {
  528. .name = "lm25066",
  529. .of_match_table = of_match_ptr(lm25066_of_match),
  530. },
  531. .probe_new = lm25066_probe,
  532. .id_table = lm25066_id,
  533. };
  534. module_i2c_driver(lm25066_driver);
  535. MODULE_AUTHOR("Guenter Roeck");
  536. MODULE_DESCRIPTION("PMBus driver for LM25066 and compatible chips");
  537. MODULE_LICENSE("GPL");
  538. MODULE_IMPORT_NS(PMBUS);