pmbus_core.c 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828
  1. /*
  2. * Hardware monitoring driver for PMBus devices
  3. *
  4. * Copyright (c) 2010, 2011 Ericsson AB.
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19. */
  20. #include <linux/kernel.h>
  21. #include <linux/module.h>
  22. #include <linux/init.h>
  23. #include <linux/err.h>
  24. #include <linux/slab.h>
  25. #include <linux/i2c.h>
  26. #include <linux/hwmon.h>
  27. #include <linux/hwmon-sysfs.h>
  28. #include <linux/jiffies.h>
  29. #include <linux/i2c/pmbus.h>
  30. #include "pmbus.h"
  31. /*
  32. * Constants needed to determine number of sensors, booleans, and labels.
  33. */
  34. #define PMBUS_MAX_INPUT_SENSORS 22 /* 10*volt, 7*curr, 5*power */
  35. #define PMBUS_VOUT_SENSORS_PER_PAGE 9 /* input, min, max, lcrit,
  36. crit, lowest, highest, avg,
  37. reset */
  38. #define PMBUS_IOUT_SENSORS_PER_PAGE 8 /* input, min, max, crit,
  39. lowest, highest, avg,
  40. reset */
  41. #define PMBUS_POUT_SENSORS_PER_PAGE 7 /* input, cap, max, crit,
  42. * highest, avg, reset
  43. */
  44. #define PMBUS_MAX_SENSORS_PER_FAN 1 /* input */
  45. #define PMBUS_MAX_SENSORS_PER_TEMP 9 /* input, min, max, lcrit,
  46. * crit, lowest, highest, avg,
  47. * reset
  48. */
  49. #define PMBUS_MAX_INPUT_BOOLEANS 7 /* v: min_alarm, max_alarm,
  50. lcrit_alarm, crit_alarm;
  51. c: alarm, crit_alarm;
  52. p: crit_alarm */
  53. #define PMBUS_VOUT_BOOLEANS_PER_PAGE 4 /* min_alarm, max_alarm,
  54. lcrit_alarm, crit_alarm */
  55. #define PMBUS_IOUT_BOOLEANS_PER_PAGE 3 /* alarm, lcrit_alarm,
  56. crit_alarm */
  57. #define PMBUS_POUT_BOOLEANS_PER_PAGE 3 /* cap_alarm, alarm, crit_alarm
  58. */
  59. #define PMBUS_MAX_BOOLEANS_PER_FAN 2 /* alarm, fault */
  60. #define PMBUS_MAX_BOOLEANS_PER_TEMP 4 /* min_alarm, max_alarm,
  61. lcrit_alarm, crit_alarm */
  62. #define PMBUS_MAX_INPUT_LABELS 4 /* vin, vcap, iin, pin */
  63. /*
  64. * status, status_vout, status_iout, status_fans, status_fan34, and status_temp
  65. * are paged. status_input is unpaged.
  66. */
  67. #define PB_NUM_STATUS_REG (PMBUS_PAGES * 6 + 1)
  68. /*
  69. * Index into status register array, per status register group
  70. */
  71. #define PB_STATUS_BASE 0
  72. #define PB_STATUS_VOUT_BASE (PB_STATUS_BASE + PMBUS_PAGES)
  73. #define PB_STATUS_IOUT_BASE (PB_STATUS_VOUT_BASE + PMBUS_PAGES)
  74. #define PB_STATUS_FAN_BASE (PB_STATUS_IOUT_BASE + PMBUS_PAGES)
  75. #define PB_STATUS_FAN34_BASE (PB_STATUS_FAN_BASE + PMBUS_PAGES)
  76. #define PB_STATUS_INPUT_BASE (PB_STATUS_FAN34_BASE + PMBUS_PAGES)
  77. #define PB_STATUS_TEMP_BASE (PB_STATUS_INPUT_BASE + 1)
  78. #define PMBUS_NAME_SIZE 24
  79. struct pmbus_sensor {
  80. char name[PMBUS_NAME_SIZE]; /* sysfs sensor name */
  81. struct sensor_device_attribute attribute;
  82. u8 page; /* page number */
  83. u16 reg; /* register */
  84. enum pmbus_sensor_classes class; /* sensor class */
  85. bool update; /* runtime sensor update needed */
  86. int data; /* Sensor data.
  87. Negative if there was a read error */
  88. };
  89. struct pmbus_boolean {
  90. char name[PMBUS_NAME_SIZE]; /* sysfs boolean name */
  91. struct sensor_device_attribute attribute;
  92. struct pmbus_sensor *s1;
  93. struct pmbus_sensor *s2;
  94. };
  95. #define to_pmbus_boolean(_attr) \
  96. container_of(_attr, struct pmbus_boolean, attribute)
  97. struct pmbus_label {
  98. char name[PMBUS_NAME_SIZE]; /* sysfs label name */
  99. struct device_attribute attribute;
  100. char label[PMBUS_NAME_SIZE]; /* label */
  101. };
  102. #define to_pmbus_label(_attr) \
  103. container_of(_attr, struct pmbus_label, attribute)
  104. struct pmbus_data {
  105. struct device *dev;
  106. struct device *hwmon_dev;
  107. u32 flags; /* from platform data */
  108. int exponent; /* linear mode: exponent for output voltages */
  109. const struct pmbus_driver_info *info;
  110. int max_attributes;
  111. int num_attributes;
  112. struct attribute **attributes;
  113. struct attribute_group group;
  114. /*
  115. * Sensors cover both sensor and limit registers.
  116. */
  117. int max_sensors;
  118. int num_sensors;
  119. struct pmbus_sensor *sensors;
  120. struct mutex update_lock;
  121. bool valid;
  122. unsigned long last_updated; /* in jiffies */
  123. /*
  124. * A single status register covers multiple attributes,
  125. * so we keep them all together.
  126. */
  127. u8 status[PB_NUM_STATUS_REG];
  128. u8 currpage;
  129. };
  130. int pmbus_set_page(struct i2c_client *client, u8 page)
  131. {
  132. struct pmbus_data *data = i2c_get_clientdata(client);
  133. int rv = 0;
  134. int newpage;
  135. if (page != data->currpage) {
  136. rv = i2c_smbus_write_byte_data(client, PMBUS_PAGE, page);
  137. newpage = i2c_smbus_read_byte_data(client, PMBUS_PAGE);
  138. if (newpage != page)
  139. rv = -EIO;
  140. else
  141. data->currpage = page;
  142. }
  143. return rv;
  144. }
  145. EXPORT_SYMBOL_GPL(pmbus_set_page);
  146. int pmbus_write_byte(struct i2c_client *client, int page, u8 value)
  147. {
  148. int rv;
  149. if (page >= 0) {
  150. rv = pmbus_set_page(client, page);
  151. if (rv < 0)
  152. return rv;
  153. }
  154. return i2c_smbus_write_byte(client, value);
  155. }
  156. EXPORT_SYMBOL_GPL(pmbus_write_byte);
  157. /*
  158. * _pmbus_write_byte() is similar to pmbus_write_byte(), but checks if
  159. * a device specific mapping funcion exists and calls it if necessary.
  160. */
  161. static int _pmbus_write_byte(struct i2c_client *client, int page, u8 value)
  162. {
  163. struct pmbus_data *data = i2c_get_clientdata(client);
  164. const struct pmbus_driver_info *info = data->info;
  165. int status;
  166. if (info->write_byte) {
  167. status = info->write_byte(client, page, value);
  168. if (status != -ENODATA)
  169. return status;
  170. }
  171. return pmbus_write_byte(client, page, value);
  172. }
  173. int pmbus_write_word_data(struct i2c_client *client, u8 page, u8 reg, u16 word)
  174. {
  175. int rv;
  176. rv = pmbus_set_page(client, page);
  177. if (rv < 0)
  178. return rv;
  179. return i2c_smbus_write_word_data(client, reg, word);
  180. }
  181. EXPORT_SYMBOL_GPL(pmbus_write_word_data);
  182. /*
  183. * _pmbus_write_word_data() is similar to pmbus_write_word_data(), but checks if
  184. * a device specific mapping function exists and calls it if necessary.
  185. */
  186. static int _pmbus_write_word_data(struct i2c_client *client, int page, int reg,
  187. u16 word)
  188. {
  189. struct pmbus_data *data = i2c_get_clientdata(client);
  190. const struct pmbus_driver_info *info = data->info;
  191. int status;
  192. if (info->write_word_data) {
  193. status = info->write_word_data(client, page, reg, word);
  194. if (status != -ENODATA)
  195. return status;
  196. }
  197. if (reg >= PMBUS_VIRT_BASE)
  198. return -ENXIO;
  199. return pmbus_write_word_data(client, page, reg, word);
  200. }
  201. int pmbus_read_word_data(struct i2c_client *client, u8 page, u8 reg)
  202. {
  203. int rv;
  204. rv = pmbus_set_page(client, page);
  205. if (rv < 0)
  206. return rv;
  207. return i2c_smbus_read_word_data(client, reg);
  208. }
  209. EXPORT_SYMBOL_GPL(pmbus_read_word_data);
  210. /*
  211. * _pmbus_read_word_data() is similar to pmbus_read_word_data(), but checks if
  212. * a device specific mapping function exists and calls it if necessary.
  213. */
  214. static int _pmbus_read_word_data(struct i2c_client *client, int page, int reg)
  215. {
  216. struct pmbus_data *data = i2c_get_clientdata(client);
  217. const struct pmbus_driver_info *info = data->info;
  218. int status;
  219. if (info->read_word_data) {
  220. status = info->read_word_data(client, page, reg);
  221. if (status != -ENODATA)
  222. return status;
  223. }
  224. if (reg >= PMBUS_VIRT_BASE)
  225. return -ENXIO;
  226. return pmbus_read_word_data(client, page, reg);
  227. }
  228. int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg)
  229. {
  230. int rv;
  231. if (page >= 0) {
  232. rv = pmbus_set_page(client, page);
  233. if (rv < 0)
  234. return rv;
  235. }
  236. return i2c_smbus_read_byte_data(client, reg);
  237. }
  238. EXPORT_SYMBOL_GPL(pmbus_read_byte_data);
  239. /*
  240. * _pmbus_read_byte_data() is similar to pmbus_read_byte_data(), but checks if
  241. * a device specific mapping function exists and calls it if necessary.
  242. */
  243. static int _pmbus_read_byte_data(struct i2c_client *client, int page, int reg)
  244. {
  245. struct pmbus_data *data = i2c_get_clientdata(client);
  246. const struct pmbus_driver_info *info = data->info;
  247. int status;
  248. if (info->read_byte_data) {
  249. status = info->read_byte_data(client, page, reg);
  250. if (status != -ENODATA)
  251. return status;
  252. }
  253. return pmbus_read_byte_data(client, page, reg);
  254. }
  255. static void pmbus_clear_fault_page(struct i2c_client *client, int page)
  256. {
  257. _pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS);
  258. }
  259. void pmbus_clear_faults(struct i2c_client *client)
  260. {
  261. struct pmbus_data *data = i2c_get_clientdata(client);
  262. int i;
  263. for (i = 0; i < data->info->pages; i++)
  264. pmbus_clear_fault_page(client, i);
  265. }
  266. EXPORT_SYMBOL_GPL(pmbus_clear_faults);
  267. static int pmbus_check_status_cml(struct i2c_client *client)
  268. {
  269. int status, status2;
  270. status = _pmbus_read_byte_data(client, -1, PMBUS_STATUS_BYTE);
  271. if (status < 0 || (status & PB_STATUS_CML)) {
  272. status2 = _pmbus_read_byte_data(client, -1, PMBUS_STATUS_CML);
  273. if (status2 < 0 || (status2 & PB_CML_FAULT_INVALID_COMMAND))
  274. return -EIO;
  275. }
  276. return 0;
  277. }
  278. bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg)
  279. {
  280. int rv;
  281. struct pmbus_data *data = i2c_get_clientdata(client);
  282. rv = _pmbus_read_byte_data(client, page, reg);
  283. if (rv >= 0 && !(data->flags & PMBUS_SKIP_STATUS_CHECK))
  284. rv = pmbus_check_status_cml(client);
  285. pmbus_clear_fault_page(client, -1);
  286. return rv >= 0;
  287. }
  288. EXPORT_SYMBOL_GPL(pmbus_check_byte_register);
  289. bool pmbus_check_word_register(struct i2c_client *client, int page, int reg)
  290. {
  291. int rv;
  292. struct pmbus_data *data = i2c_get_clientdata(client);
  293. rv = _pmbus_read_word_data(client, page, reg);
  294. if (rv >= 0 && !(data->flags & PMBUS_SKIP_STATUS_CHECK))
  295. rv = pmbus_check_status_cml(client);
  296. pmbus_clear_fault_page(client, -1);
  297. return rv >= 0;
  298. }
  299. EXPORT_SYMBOL_GPL(pmbus_check_word_register);
  300. const struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client *client)
  301. {
  302. struct pmbus_data *data = i2c_get_clientdata(client);
  303. return data->info;
  304. }
  305. EXPORT_SYMBOL_GPL(pmbus_get_driver_info);
  306. static struct pmbus_data *pmbus_update_device(struct device *dev)
  307. {
  308. struct i2c_client *client = to_i2c_client(dev);
  309. struct pmbus_data *data = i2c_get_clientdata(client);
  310. const struct pmbus_driver_info *info = data->info;
  311. mutex_lock(&data->update_lock);
  312. if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
  313. int i;
  314. for (i = 0; i < info->pages; i++)
  315. data->status[PB_STATUS_BASE + i]
  316. = _pmbus_read_byte_data(client, i,
  317. PMBUS_STATUS_BYTE);
  318. for (i = 0; i < info->pages; i++) {
  319. if (!(info->func[i] & PMBUS_HAVE_STATUS_VOUT))
  320. continue;
  321. data->status[PB_STATUS_VOUT_BASE + i]
  322. = _pmbus_read_byte_data(client, i, PMBUS_STATUS_VOUT);
  323. }
  324. for (i = 0; i < info->pages; i++) {
  325. if (!(info->func[i] & PMBUS_HAVE_STATUS_IOUT))
  326. continue;
  327. data->status[PB_STATUS_IOUT_BASE + i]
  328. = _pmbus_read_byte_data(client, i, PMBUS_STATUS_IOUT);
  329. }
  330. for (i = 0; i < info->pages; i++) {
  331. if (!(info->func[i] & PMBUS_HAVE_STATUS_TEMP))
  332. continue;
  333. data->status[PB_STATUS_TEMP_BASE + i]
  334. = _pmbus_read_byte_data(client, i,
  335. PMBUS_STATUS_TEMPERATURE);
  336. }
  337. for (i = 0; i < info->pages; i++) {
  338. if (!(info->func[i] & PMBUS_HAVE_STATUS_FAN12))
  339. continue;
  340. data->status[PB_STATUS_FAN_BASE + i]
  341. = _pmbus_read_byte_data(client, i,
  342. PMBUS_STATUS_FAN_12);
  343. }
  344. for (i = 0; i < info->pages; i++) {
  345. if (!(info->func[i] & PMBUS_HAVE_STATUS_FAN34))
  346. continue;
  347. data->status[PB_STATUS_FAN34_BASE + i]
  348. = _pmbus_read_byte_data(client, i,
  349. PMBUS_STATUS_FAN_34);
  350. }
  351. if (info->func[0] & PMBUS_HAVE_STATUS_INPUT)
  352. data->status[PB_STATUS_INPUT_BASE]
  353. = _pmbus_read_byte_data(client, 0,
  354. PMBUS_STATUS_INPUT);
  355. for (i = 0; i < data->num_sensors; i++) {
  356. struct pmbus_sensor *sensor = &data->sensors[i];
  357. if (!data->valid || sensor->update)
  358. sensor->data
  359. = _pmbus_read_word_data(client,
  360. sensor->page,
  361. sensor->reg);
  362. }
  363. pmbus_clear_faults(client);
  364. data->last_updated = jiffies;
  365. data->valid = 1;
  366. }
  367. mutex_unlock(&data->update_lock);
  368. return data;
  369. }
  370. /*
  371. * Convert linear sensor values to milli- or micro-units
  372. * depending on sensor type.
  373. */
  374. static long pmbus_reg2data_linear(struct pmbus_data *data,
  375. struct pmbus_sensor *sensor)
  376. {
  377. s16 exponent;
  378. s32 mantissa;
  379. long val;
  380. if (sensor->class == PSC_VOLTAGE_OUT) { /* LINEAR16 */
  381. exponent = data->exponent;
  382. mantissa = (u16) sensor->data;
  383. } else { /* LINEAR11 */
  384. exponent = ((s16)sensor->data) >> 11;
  385. mantissa = ((s16)((sensor->data & 0x7ff) << 5)) >> 5;
  386. }
  387. val = mantissa;
  388. /* scale result to milli-units for all sensors except fans */
  389. if (sensor->class != PSC_FAN)
  390. val = val * 1000L;
  391. /* scale result to micro-units for power sensors */
  392. if (sensor->class == PSC_POWER)
  393. val = val * 1000L;
  394. if (exponent >= 0)
  395. val <<= exponent;
  396. else
  397. val >>= -exponent;
  398. return val;
  399. }
  400. /*
  401. * Convert direct sensor values to milli- or micro-units
  402. * depending on sensor type.
  403. */
  404. static long pmbus_reg2data_direct(struct pmbus_data *data,
  405. struct pmbus_sensor *sensor)
  406. {
  407. long val = (s16) sensor->data;
  408. long m, b, R;
  409. m = data->info->m[sensor->class];
  410. b = data->info->b[sensor->class];
  411. R = data->info->R[sensor->class];
  412. if (m == 0)
  413. return 0;
  414. /* X = 1/m * (Y * 10^-R - b) */
  415. R = -R;
  416. /* scale result to milli-units for everything but fans */
  417. if (sensor->class != PSC_FAN) {
  418. R += 3;
  419. b *= 1000;
  420. }
  421. /* scale result to micro-units for power sensors */
  422. if (sensor->class == PSC_POWER) {
  423. R += 3;
  424. b *= 1000;
  425. }
  426. while (R > 0) {
  427. val *= 10;
  428. R--;
  429. }
  430. while (R < 0) {
  431. val = DIV_ROUND_CLOSEST(val, 10);
  432. R++;
  433. }
  434. return (val - b) / m;
  435. }
  436. /*
  437. * Convert VID sensor values to milli- or micro-units
  438. * depending on sensor type.
  439. * We currently only support VR11.
  440. */
  441. static long pmbus_reg2data_vid(struct pmbus_data *data,
  442. struct pmbus_sensor *sensor)
  443. {
  444. long val = sensor->data;
  445. if (val < 0x02 || val > 0xb2)
  446. return 0;
  447. return DIV_ROUND_CLOSEST(160000 - (val - 2) * 625, 100);
  448. }
  449. static long pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor)
  450. {
  451. long val;
  452. switch (data->info->format[sensor->class]) {
  453. case direct:
  454. val = pmbus_reg2data_direct(data, sensor);
  455. break;
  456. case vid:
  457. val = pmbus_reg2data_vid(data, sensor);
  458. break;
  459. case linear:
  460. default:
  461. val = pmbus_reg2data_linear(data, sensor);
  462. break;
  463. }
  464. return val;
  465. }
  466. #define MAX_MANTISSA (1023 * 1000)
  467. #define MIN_MANTISSA (511 * 1000)
  468. static u16 pmbus_data2reg_linear(struct pmbus_data *data,
  469. enum pmbus_sensor_classes class, long val)
  470. {
  471. s16 exponent = 0, mantissa;
  472. bool negative = false;
  473. /* simple case */
  474. if (val == 0)
  475. return 0;
  476. if (class == PSC_VOLTAGE_OUT) {
  477. /* LINEAR16 does not support negative voltages */
  478. if (val < 0)
  479. return 0;
  480. /*
  481. * For a static exponents, we don't have a choice
  482. * but to adjust the value to it.
  483. */
  484. if (data->exponent < 0)
  485. val <<= -data->exponent;
  486. else
  487. val >>= data->exponent;
  488. val = DIV_ROUND_CLOSEST(val, 1000);
  489. return val & 0xffff;
  490. }
  491. if (val < 0) {
  492. negative = true;
  493. val = -val;
  494. }
  495. /* Power is in uW. Convert to mW before converting. */
  496. if (class == PSC_POWER)
  497. val = DIV_ROUND_CLOSEST(val, 1000L);
  498. /*
  499. * For simplicity, convert fan data to milli-units
  500. * before calculating the exponent.
  501. */
  502. if (class == PSC_FAN)
  503. val = val * 1000;
  504. /* Reduce large mantissa until it fits into 10 bit */
  505. while (val >= MAX_MANTISSA && exponent < 15) {
  506. exponent++;
  507. val >>= 1;
  508. }
  509. /* Increase small mantissa to improve precision */
  510. while (val < MIN_MANTISSA && exponent > -15) {
  511. exponent--;
  512. val <<= 1;
  513. }
  514. /* Convert mantissa from milli-units to units */
  515. mantissa = DIV_ROUND_CLOSEST(val, 1000);
  516. /* Ensure that resulting number is within range */
  517. if (mantissa > 0x3ff)
  518. mantissa = 0x3ff;
  519. /* restore sign */
  520. if (negative)
  521. mantissa = -mantissa;
  522. /* Convert to 5 bit exponent, 11 bit mantissa */
  523. return (mantissa & 0x7ff) | ((exponent << 11) & 0xf800);
  524. }
  525. static u16 pmbus_data2reg_direct(struct pmbus_data *data,
  526. enum pmbus_sensor_classes class, long val)
  527. {
  528. long m, b, R;
  529. m = data->info->m[class];
  530. b = data->info->b[class];
  531. R = data->info->R[class];
  532. /* Power is in uW. Adjust R and b. */
  533. if (class == PSC_POWER) {
  534. R -= 3;
  535. b *= 1000;
  536. }
  537. /* Calculate Y = (m * X + b) * 10^R */
  538. if (class != PSC_FAN) {
  539. R -= 3; /* Adjust R and b for data in milli-units */
  540. b *= 1000;
  541. }
  542. val = val * m + b;
  543. while (R > 0) {
  544. val *= 10;
  545. R--;
  546. }
  547. while (R < 0) {
  548. val = DIV_ROUND_CLOSEST(val, 10);
  549. R++;
  550. }
  551. return val;
  552. }
  553. static u16 pmbus_data2reg_vid(struct pmbus_data *data,
  554. enum pmbus_sensor_classes class, long val)
  555. {
  556. val = clamp_val(val, 500, 1600);
  557. return 2 + DIV_ROUND_CLOSEST((1600 - val) * 100, 625);
  558. }
  559. static u16 pmbus_data2reg(struct pmbus_data *data,
  560. enum pmbus_sensor_classes class, long val)
  561. {
  562. u16 regval;
  563. switch (data->info->format[class]) {
  564. case direct:
  565. regval = pmbus_data2reg_direct(data, class, val);
  566. break;
  567. case vid:
  568. regval = pmbus_data2reg_vid(data, class, val);
  569. break;
  570. case linear:
  571. default:
  572. regval = pmbus_data2reg_linear(data, class, val);
  573. break;
  574. }
  575. return regval;
  576. }
  577. /*
  578. * Return boolean calculated from converted data.
  579. * <index> defines a status register index and mask.
  580. * The mask is in the lower 8 bits, the register index is in bits 8..23.
  581. *
  582. * The associated pmbus_boolean structure contains optional pointers to two
  583. * sensor attributes. If specified, those attributes are compared against each
  584. * other to determine if a limit has been exceeded.
  585. *
  586. * If the sensor attribute pointers are NULL, the function returns true if
  587. * (status[reg] & mask) is true.
  588. *
  589. * If sensor attribute pointers are provided, a comparison against a specified
  590. * limit has to be performed to determine the boolean result.
  591. * In this case, the function returns true if v1 >= v2 (where v1 and v2 are
  592. * sensor values referenced by sensor attribute pointers s1 and s2).
  593. *
  594. * To determine if an object exceeds upper limits, specify <s1,s2> = <v,limit>.
  595. * To determine if an object exceeds lower limits, specify <s1,s2> = <limit,v>.
  596. *
  597. * If a negative value is stored in any of the referenced registers, this value
  598. * reflects an error code which will be returned.
  599. */
  600. static int pmbus_get_boolean(struct pmbus_data *data, struct pmbus_boolean *b,
  601. int index)
  602. {
  603. struct pmbus_sensor *s1 = b->s1;
  604. struct pmbus_sensor *s2 = b->s2;
  605. u16 reg = (index >> 8) & 0xffff;
  606. u8 mask = index & 0xff;
  607. int ret, status;
  608. u8 regval;
  609. status = data->status[reg];
  610. if (status < 0)
  611. return status;
  612. regval = status & mask;
  613. if (!s1 && !s2) {
  614. ret = !!regval;
  615. } else if (!s1 || !s2) {
  616. BUG();
  617. return 0;
  618. } else {
  619. long v1, v2;
  620. if (s1->data < 0)
  621. return s1->data;
  622. if (s2->data < 0)
  623. return s2->data;
  624. v1 = pmbus_reg2data(data, s1);
  625. v2 = pmbus_reg2data(data, s2);
  626. ret = !!(regval && v1 >= v2);
  627. }
  628. return ret;
  629. }
  630. static ssize_t pmbus_show_boolean(struct device *dev,
  631. struct device_attribute *da, char *buf)
  632. {
  633. struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
  634. struct pmbus_boolean *boolean = to_pmbus_boolean(attr);
  635. struct pmbus_data *data = pmbus_update_device(dev);
  636. int val;
  637. val = pmbus_get_boolean(data, boolean, attr->index);
  638. if (val < 0)
  639. return val;
  640. return snprintf(buf, PAGE_SIZE, "%d\n", val);
  641. }
  642. static ssize_t pmbus_show_sensor(struct device *dev,
  643. struct device_attribute *da, char *buf)
  644. {
  645. struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
  646. struct pmbus_data *data = pmbus_update_device(dev);
  647. struct pmbus_sensor *sensor;
  648. sensor = &data->sensors[attr->index];
  649. if (sensor->data < 0)
  650. return sensor->data;
  651. return snprintf(buf, PAGE_SIZE, "%ld\n", pmbus_reg2data(data, sensor));
  652. }
  653. static ssize_t pmbus_set_sensor(struct device *dev,
  654. struct device_attribute *devattr,
  655. const char *buf, size_t count)
  656. {
  657. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  658. struct i2c_client *client = to_i2c_client(dev);
  659. struct pmbus_data *data = i2c_get_clientdata(client);
  660. struct pmbus_sensor *sensor = &data->sensors[attr->index];
  661. ssize_t rv = count;
  662. long val = 0;
  663. int ret;
  664. u16 regval;
  665. if (kstrtol(buf, 10, &val) < 0)
  666. return -EINVAL;
  667. mutex_lock(&data->update_lock);
  668. regval = pmbus_data2reg(data, sensor->class, val);
  669. ret = _pmbus_write_word_data(client, sensor->page, sensor->reg, regval);
  670. if (ret < 0)
  671. rv = ret;
  672. else
  673. data->sensors[attr->index].data = regval;
  674. mutex_unlock(&data->update_lock);
  675. return rv;
  676. }
  677. static ssize_t pmbus_show_label(struct device *dev,
  678. struct device_attribute *da, char *buf)
  679. {
  680. struct pmbus_label *label = to_pmbus_label(da);
  681. return snprintf(buf, PAGE_SIZE, "%s\n", label->label);
  682. }
  683. static void pmbus_dev_attr_init(struct device_attribute *dev_attr,
  684. const char *name,
  685. umode_t mode,
  686. ssize_t (*show)(struct device *dev,
  687. struct device_attribute *attr,
  688. char *buf),
  689. ssize_t (*store)(struct device *dev,
  690. struct device_attribute *attr,
  691. const char *buf, size_t count))
  692. {
  693. sysfs_attr_init(&dev_attr->attr);
  694. dev_attr->attr.name = name;
  695. dev_attr->attr.mode = mode;
  696. dev_attr->show = show;
  697. dev_attr->store = store;
  698. }
  699. static void pmbus_attr_init(struct sensor_device_attribute *a,
  700. const char *name,
  701. umode_t mode,
  702. ssize_t (*show)(struct device *dev,
  703. struct device_attribute *attr,
  704. char *buf),
  705. ssize_t (*store)(struct device *dev,
  706. struct device_attribute *attr,
  707. const char *buf, size_t count),
  708. int idx)
  709. {
  710. pmbus_dev_attr_init(&a->dev_attr, name, mode, show, store);
  711. a->index = idx;
  712. }
  713. static int pmbus_add_boolean(struct pmbus_data *data,
  714. const char *name, const char *type, int seq,
  715. struct pmbus_sensor *s1,
  716. struct pmbus_sensor *s2,
  717. u16 reg, u8 mask)
  718. {
  719. struct pmbus_boolean *boolean;
  720. struct sensor_device_attribute *a;
  721. BUG_ON(data->num_attributes >= data->max_attributes);
  722. boolean = devm_kzalloc(data->dev, sizeof(*boolean), GFP_KERNEL);
  723. if (!boolean)
  724. return -ENOMEM;
  725. a = &boolean->attribute;
  726. snprintf(boolean->name, sizeof(boolean->name), "%s%d_%s",
  727. name, seq, type);
  728. boolean->s1 = s1;
  729. boolean->s2 = s2;
  730. pmbus_attr_init(a, boolean->name, S_IRUGO, pmbus_show_boolean, NULL,
  731. (reg << 8) | mask);
  732. data->attributes[data->num_attributes++] = &a->dev_attr.attr;
  733. return 0;
  734. }
  735. static struct pmbus_sensor *pmbus_add_sensor(struct pmbus_data *data,
  736. const char *name, const char *type,
  737. int seq, int page, int reg,
  738. enum pmbus_sensor_classes class,
  739. bool update, bool readonly)
  740. {
  741. struct pmbus_sensor *sensor;
  742. struct sensor_device_attribute *a;
  743. BUG_ON(data->num_sensors >= data->max_sensors ||
  744. data->num_attributes >= data->max_attributes);
  745. sensor = &data->sensors[data->num_sensors];
  746. a = &sensor->attribute;
  747. snprintf(sensor->name, sizeof(sensor->name), "%s%d_%s",
  748. name, seq, type);
  749. sensor->page = page;
  750. sensor->reg = reg;
  751. sensor->class = class;
  752. sensor->update = update;
  753. pmbus_attr_init(a, sensor->name,
  754. readonly ? S_IRUGO : S_IRUGO | S_IWUSR,
  755. pmbus_show_sensor, pmbus_set_sensor, data->num_sensors);
  756. data->attributes[data->num_attributes++] = &a->dev_attr.attr;
  757. data->num_sensors++;
  758. return sensor;
  759. }
  760. static int pmbus_add_label(struct pmbus_data *data,
  761. const char *name, int seq,
  762. const char *lstring, int index)
  763. {
  764. struct pmbus_label *label;
  765. struct device_attribute *a;
  766. BUG_ON(data->num_attributes >= data->max_attributes);
  767. label = devm_kzalloc(data->dev, sizeof(*label), GFP_KERNEL);
  768. if (!label)
  769. return -ENOMEM;
  770. a = &label->attribute;
  771. snprintf(label->name, sizeof(label->name), "%s%d_label", name, seq);
  772. if (!index)
  773. strncpy(label->label, lstring, sizeof(label->label) - 1);
  774. else
  775. snprintf(label->label, sizeof(label->label), "%s%d", lstring,
  776. index);
  777. pmbus_dev_attr_init(a, label->name, S_IRUGO, pmbus_show_label, NULL);
  778. data->attributes[data->num_attributes++] = &a->attr;
  779. return 0;
  780. }
  781. /*
  782. * Determine maximum number of sensors, booleans, and labels.
  783. * To keep things simple, only make a rough high estimate.
  784. */
  785. static void pmbus_find_max_attr(struct i2c_client *client,
  786. struct pmbus_data *data)
  787. {
  788. const struct pmbus_driver_info *info = data->info;
  789. int page, max_sensors, max_booleans, max_labels;
  790. max_sensors = PMBUS_MAX_INPUT_SENSORS;
  791. max_booleans = PMBUS_MAX_INPUT_BOOLEANS;
  792. max_labels = PMBUS_MAX_INPUT_LABELS;
  793. for (page = 0; page < info->pages; page++) {
  794. if (info->func[page] & PMBUS_HAVE_VOUT) {
  795. max_sensors += PMBUS_VOUT_SENSORS_PER_PAGE;
  796. max_booleans += PMBUS_VOUT_BOOLEANS_PER_PAGE;
  797. max_labels++;
  798. }
  799. if (info->func[page] & PMBUS_HAVE_IOUT) {
  800. max_sensors += PMBUS_IOUT_SENSORS_PER_PAGE;
  801. max_booleans += PMBUS_IOUT_BOOLEANS_PER_PAGE;
  802. max_labels++;
  803. }
  804. if (info->func[page] & PMBUS_HAVE_POUT) {
  805. max_sensors += PMBUS_POUT_SENSORS_PER_PAGE;
  806. max_booleans += PMBUS_POUT_BOOLEANS_PER_PAGE;
  807. max_labels++;
  808. }
  809. if (info->func[page] & PMBUS_HAVE_FAN12) {
  810. max_sensors += 2 * PMBUS_MAX_SENSORS_PER_FAN;
  811. max_booleans += 2 * PMBUS_MAX_BOOLEANS_PER_FAN;
  812. }
  813. if (info->func[page] & PMBUS_HAVE_FAN34) {
  814. max_sensors += 2 * PMBUS_MAX_SENSORS_PER_FAN;
  815. max_booleans += 2 * PMBUS_MAX_BOOLEANS_PER_FAN;
  816. }
  817. if (info->func[page] & PMBUS_HAVE_TEMP) {
  818. max_sensors += PMBUS_MAX_SENSORS_PER_TEMP;
  819. max_booleans += PMBUS_MAX_BOOLEANS_PER_TEMP;
  820. }
  821. if (info->func[page] & PMBUS_HAVE_TEMP2) {
  822. max_sensors += PMBUS_MAX_SENSORS_PER_TEMP;
  823. max_booleans += PMBUS_MAX_BOOLEANS_PER_TEMP;
  824. }
  825. if (info->func[page] & PMBUS_HAVE_TEMP3) {
  826. max_sensors += PMBUS_MAX_SENSORS_PER_TEMP;
  827. max_booleans += PMBUS_MAX_BOOLEANS_PER_TEMP;
  828. }
  829. }
  830. data->max_sensors = max_sensors;
  831. data->max_attributes = max_sensors + max_booleans + max_labels;
  832. }
  833. /*
  834. * Search for attributes. Allocate sensors, booleans, and labels as needed.
  835. */
  836. /*
  837. * The pmbus_limit_attr structure describes a single limit attribute
  838. * and its associated alarm attribute.
  839. */
  840. struct pmbus_limit_attr {
  841. u16 reg; /* Limit register */
  842. bool update; /* True if register needs updates */
  843. bool low; /* True if low limit; for limits with compare
  844. functions only */
  845. const char *attr; /* Attribute name */
  846. const char *alarm; /* Alarm attribute name */
  847. u32 sbit; /* Alarm attribute status bit */
  848. };
  849. /*
  850. * The pmbus_sensor_attr structure describes one sensor attribute. This
  851. * description includes a reference to the associated limit attributes.
  852. */
  853. struct pmbus_sensor_attr {
  854. u8 reg; /* sensor register */
  855. enum pmbus_sensor_classes class;/* sensor class */
  856. const char *label; /* sensor label */
  857. bool paged; /* true if paged sensor */
  858. bool update; /* true if update needed */
  859. bool compare; /* true if compare function needed */
  860. u32 func; /* sensor mask */
  861. u32 sfunc; /* sensor status mask */
  862. int sbase; /* status base register */
  863. u32 gbit; /* generic status bit */
  864. const struct pmbus_limit_attr *limit;/* limit registers */
  865. int nlimit; /* # of limit registers */
  866. };
  867. /*
  868. * Add a set of limit attributes and, if supported, the associated
  869. * alarm attributes.
  870. * returns 0 if no alarm register found, 1 if an alarm register was found,
  871. * < 0 on errors.
  872. */
  873. static int pmbus_add_limit_attrs(struct i2c_client *client,
  874. struct pmbus_data *data,
  875. const struct pmbus_driver_info *info,
  876. const char *name, int index, int page,
  877. struct pmbus_sensor *base,
  878. const struct pmbus_sensor_attr *attr)
  879. {
  880. const struct pmbus_limit_attr *l = attr->limit;
  881. int nlimit = attr->nlimit;
  882. int have_alarm = 0;
  883. int i, ret;
  884. struct pmbus_sensor *curr;
  885. for (i = 0; i < nlimit; i++) {
  886. if (pmbus_check_word_register(client, page, l->reg)) {
  887. curr = pmbus_add_sensor(data, name, l->attr, index,
  888. page, l->reg, attr->class,
  889. attr->update || l->update,
  890. false);
  891. if (l->sbit && (info->func[page] & attr->sfunc)) {
  892. ret = pmbus_add_boolean(data, name,
  893. l->alarm, index,
  894. attr->compare ? l->low ? curr : base
  895. : NULL,
  896. attr->compare ? l->low ? base : curr
  897. : NULL,
  898. attr->sbase + page, l->sbit);
  899. if (ret)
  900. return ret;
  901. have_alarm = 1;
  902. }
  903. }
  904. l++;
  905. }
  906. return have_alarm;
  907. }
  908. static int pmbus_add_sensor_attrs_one(struct i2c_client *client,
  909. struct pmbus_data *data,
  910. const struct pmbus_driver_info *info,
  911. const char *name,
  912. int index, int page,
  913. const struct pmbus_sensor_attr *attr)
  914. {
  915. struct pmbus_sensor *base;
  916. int ret;
  917. if (attr->label) {
  918. ret = pmbus_add_label(data, name, index, attr->label,
  919. attr->paged ? page + 1 : 0);
  920. if (ret)
  921. return ret;
  922. }
  923. base = pmbus_add_sensor(data, name, "input", index, page, attr->reg,
  924. attr->class, true, true);
  925. if (attr->sfunc) {
  926. ret = pmbus_add_limit_attrs(client, data, info, name,
  927. index, page, base, attr);
  928. if (ret < 0)
  929. return ret;
  930. /*
  931. * Add generic alarm attribute only if there are no individual
  932. * alarm attributes, if there is a global alarm bit, and if
  933. * the generic status register for this page is accessible.
  934. */
  935. if (!ret && attr->gbit &&
  936. pmbus_check_byte_register(client, page,
  937. PMBUS_STATUS_BYTE)) {
  938. ret = pmbus_add_boolean(data, name, "alarm", index,
  939. NULL, NULL,
  940. PB_STATUS_BASE + page,
  941. attr->gbit);
  942. if (ret)
  943. return ret;
  944. }
  945. }
  946. return 0;
  947. }
  948. static int pmbus_add_sensor_attrs(struct i2c_client *client,
  949. struct pmbus_data *data,
  950. const char *name,
  951. const struct pmbus_sensor_attr *attrs,
  952. int nattrs)
  953. {
  954. const struct pmbus_driver_info *info = data->info;
  955. int index, i;
  956. int ret;
  957. index = 1;
  958. for (i = 0; i < nattrs; i++) {
  959. int page, pages;
  960. pages = attrs->paged ? info->pages : 1;
  961. for (page = 0; page < pages; page++) {
  962. if (!(info->func[page] & attrs->func))
  963. continue;
  964. ret = pmbus_add_sensor_attrs_one(client, data, info,
  965. name, index, page,
  966. attrs);
  967. if (ret)
  968. return ret;
  969. index++;
  970. }
  971. attrs++;
  972. }
  973. return 0;
  974. }
  975. static const struct pmbus_limit_attr vin_limit_attrs[] = {
  976. {
  977. .reg = PMBUS_VIN_UV_WARN_LIMIT,
  978. .attr = "min",
  979. .alarm = "min_alarm",
  980. .sbit = PB_VOLTAGE_UV_WARNING,
  981. }, {
  982. .reg = PMBUS_VIN_UV_FAULT_LIMIT,
  983. .attr = "lcrit",
  984. .alarm = "lcrit_alarm",
  985. .sbit = PB_VOLTAGE_UV_FAULT,
  986. }, {
  987. .reg = PMBUS_VIN_OV_WARN_LIMIT,
  988. .attr = "max",
  989. .alarm = "max_alarm",
  990. .sbit = PB_VOLTAGE_OV_WARNING,
  991. }, {
  992. .reg = PMBUS_VIN_OV_FAULT_LIMIT,
  993. .attr = "crit",
  994. .alarm = "crit_alarm",
  995. .sbit = PB_VOLTAGE_OV_FAULT,
  996. }, {
  997. .reg = PMBUS_VIRT_READ_VIN_AVG,
  998. .update = true,
  999. .attr = "average",
  1000. }, {
  1001. .reg = PMBUS_VIRT_READ_VIN_MIN,
  1002. .update = true,
  1003. .attr = "lowest",
  1004. }, {
  1005. .reg = PMBUS_VIRT_READ_VIN_MAX,
  1006. .update = true,
  1007. .attr = "highest",
  1008. }, {
  1009. .reg = PMBUS_VIRT_RESET_VIN_HISTORY,
  1010. .attr = "reset_history",
  1011. },
  1012. };
  1013. static const struct pmbus_limit_attr vout_limit_attrs[] = {
  1014. {
  1015. .reg = PMBUS_VOUT_UV_WARN_LIMIT,
  1016. .attr = "min",
  1017. .alarm = "min_alarm",
  1018. .sbit = PB_VOLTAGE_UV_WARNING,
  1019. }, {
  1020. .reg = PMBUS_VOUT_UV_FAULT_LIMIT,
  1021. .attr = "lcrit",
  1022. .alarm = "lcrit_alarm",
  1023. .sbit = PB_VOLTAGE_UV_FAULT,
  1024. }, {
  1025. .reg = PMBUS_VOUT_OV_WARN_LIMIT,
  1026. .attr = "max",
  1027. .alarm = "max_alarm",
  1028. .sbit = PB_VOLTAGE_OV_WARNING,
  1029. }, {
  1030. .reg = PMBUS_VOUT_OV_FAULT_LIMIT,
  1031. .attr = "crit",
  1032. .alarm = "crit_alarm",
  1033. .sbit = PB_VOLTAGE_OV_FAULT,
  1034. }, {
  1035. .reg = PMBUS_VIRT_READ_VOUT_AVG,
  1036. .update = true,
  1037. .attr = "average",
  1038. }, {
  1039. .reg = PMBUS_VIRT_READ_VOUT_MIN,
  1040. .update = true,
  1041. .attr = "lowest",
  1042. }, {
  1043. .reg = PMBUS_VIRT_READ_VOUT_MAX,
  1044. .update = true,
  1045. .attr = "highest",
  1046. }, {
  1047. .reg = PMBUS_VIRT_RESET_VOUT_HISTORY,
  1048. .attr = "reset_history",
  1049. }
  1050. };
  1051. static const struct pmbus_sensor_attr voltage_attributes[] = {
  1052. {
  1053. .reg = PMBUS_READ_VIN,
  1054. .class = PSC_VOLTAGE_IN,
  1055. .label = "vin",
  1056. .func = PMBUS_HAVE_VIN,
  1057. .sfunc = PMBUS_HAVE_STATUS_INPUT,
  1058. .sbase = PB_STATUS_INPUT_BASE,
  1059. .gbit = PB_STATUS_VIN_UV,
  1060. .limit = vin_limit_attrs,
  1061. .nlimit = ARRAY_SIZE(vin_limit_attrs),
  1062. }, {
  1063. .reg = PMBUS_READ_VCAP,
  1064. .class = PSC_VOLTAGE_IN,
  1065. .label = "vcap",
  1066. .func = PMBUS_HAVE_VCAP,
  1067. }, {
  1068. .reg = PMBUS_READ_VOUT,
  1069. .class = PSC_VOLTAGE_OUT,
  1070. .label = "vout",
  1071. .paged = true,
  1072. .func = PMBUS_HAVE_VOUT,
  1073. .sfunc = PMBUS_HAVE_STATUS_VOUT,
  1074. .sbase = PB_STATUS_VOUT_BASE,
  1075. .gbit = PB_STATUS_VOUT_OV,
  1076. .limit = vout_limit_attrs,
  1077. .nlimit = ARRAY_SIZE(vout_limit_attrs),
  1078. }
  1079. };
  1080. /* Current attributes */
  1081. static const struct pmbus_limit_attr iin_limit_attrs[] = {
  1082. {
  1083. .reg = PMBUS_IIN_OC_WARN_LIMIT,
  1084. .attr = "max",
  1085. .alarm = "max_alarm",
  1086. .sbit = PB_IIN_OC_WARNING,
  1087. }, {
  1088. .reg = PMBUS_IIN_OC_FAULT_LIMIT,
  1089. .attr = "crit",
  1090. .alarm = "crit_alarm",
  1091. .sbit = PB_IIN_OC_FAULT,
  1092. }, {
  1093. .reg = PMBUS_VIRT_READ_IIN_AVG,
  1094. .update = true,
  1095. .attr = "average",
  1096. }, {
  1097. .reg = PMBUS_VIRT_READ_IIN_MIN,
  1098. .update = true,
  1099. .attr = "lowest",
  1100. }, {
  1101. .reg = PMBUS_VIRT_READ_IIN_MAX,
  1102. .update = true,
  1103. .attr = "highest",
  1104. }, {
  1105. .reg = PMBUS_VIRT_RESET_IIN_HISTORY,
  1106. .attr = "reset_history",
  1107. }
  1108. };
  1109. static const struct pmbus_limit_attr iout_limit_attrs[] = {
  1110. {
  1111. .reg = PMBUS_IOUT_OC_WARN_LIMIT,
  1112. .attr = "max",
  1113. .alarm = "max_alarm",
  1114. .sbit = PB_IOUT_OC_WARNING,
  1115. }, {
  1116. .reg = PMBUS_IOUT_UC_FAULT_LIMIT,
  1117. .attr = "lcrit",
  1118. .alarm = "lcrit_alarm",
  1119. .sbit = PB_IOUT_UC_FAULT,
  1120. }, {
  1121. .reg = PMBUS_IOUT_OC_FAULT_LIMIT,
  1122. .attr = "crit",
  1123. .alarm = "crit_alarm",
  1124. .sbit = PB_IOUT_OC_FAULT,
  1125. }, {
  1126. .reg = PMBUS_VIRT_READ_IOUT_AVG,
  1127. .update = true,
  1128. .attr = "average",
  1129. }, {
  1130. .reg = PMBUS_VIRT_READ_IOUT_MIN,
  1131. .update = true,
  1132. .attr = "lowest",
  1133. }, {
  1134. .reg = PMBUS_VIRT_READ_IOUT_MAX,
  1135. .update = true,
  1136. .attr = "highest",
  1137. }, {
  1138. .reg = PMBUS_VIRT_RESET_IOUT_HISTORY,
  1139. .attr = "reset_history",
  1140. }
  1141. };
  1142. static const struct pmbus_sensor_attr current_attributes[] = {
  1143. {
  1144. .reg = PMBUS_READ_IIN,
  1145. .class = PSC_CURRENT_IN,
  1146. .label = "iin",
  1147. .func = PMBUS_HAVE_IIN,
  1148. .sfunc = PMBUS_HAVE_STATUS_INPUT,
  1149. .sbase = PB_STATUS_INPUT_BASE,
  1150. .limit = iin_limit_attrs,
  1151. .nlimit = ARRAY_SIZE(iin_limit_attrs),
  1152. }, {
  1153. .reg = PMBUS_READ_IOUT,
  1154. .class = PSC_CURRENT_OUT,
  1155. .label = "iout",
  1156. .paged = true,
  1157. .func = PMBUS_HAVE_IOUT,
  1158. .sfunc = PMBUS_HAVE_STATUS_IOUT,
  1159. .sbase = PB_STATUS_IOUT_BASE,
  1160. .gbit = PB_STATUS_IOUT_OC,
  1161. .limit = iout_limit_attrs,
  1162. .nlimit = ARRAY_SIZE(iout_limit_attrs),
  1163. }
  1164. };
  1165. /* Power attributes */
  1166. static const struct pmbus_limit_attr pin_limit_attrs[] = {
  1167. {
  1168. .reg = PMBUS_PIN_OP_WARN_LIMIT,
  1169. .attr = "max",
  1170. .alarm = "alarm",
  1171. .sbit = PB_PIN_OP_WARNING,
  1172. }, {
  1173. .reg = PMBUS_VIRT_READ_PIN_AVG,
  1174. .update = true,
  1175. .attr = "average",
  1176. }, {
  1177. .reg = PMBUS_VIRT_READ_PIN_MAX,
  1178. .update = true,
  1179. .attr = "input_highest",
  1180. }, {
  1181. .reg = PMBUS_VIRT_RESET_PIN_HISTORY,
  1182. .attr = "reset_history",
  1183. }
  1184. };
  1185. static const struct pmbus_limit_attr pout_limit_attrs[] = {
  1186. {
  1187. .reg = PMBUS_POUT_MAX,
  1188. .attr = "cap",
  1189. .alarm = "cap_alarm",
  1190. .sbit = PB_POWER_LIMITING,
  1191. }, {
  1192. .reg = PMBUS_POUT_OP_WARN_LIMIT,
  1193. .attr = "max",
  1194. .alarm = "max_alarm",
  1195. .sbit = PB_POUT_OP_WARNING,
  1196. }, {
  1197. .reg = PMBUS_POUT_OP_FAULT_LIMIT,
  1198. .attr = "crit",
  1199. .alarm = "crit_alarm",
  1200. .sbit = PB_POUT_OP_FAULT,
  1201. }, {
  1202. .reg = PMBUS_VIRT_READ_POUT_AVG,
  1203. .update = true,
  1204. .attr = "average",
  1205. }, {
  1206. .reg = PMBUS_VIRT_READ_POUT_MAX,
  1207. .update = true,
  1208. .attr = "input_highest",
  1209. }, {
  1210. .reg = PMBUS_VIRT_RESET_POUT_HISTORY,
  1211. .attr = "reset_history",
  1212. }
  1213. };
  1214. static const struct pmbus_sensor_attr power_attributes[] = {
  1215. {
  1216. .reg = PMBUS_READ_PIN,
  1217. .class = PSC_POWER,
  1218. .label = "pin",
  1219. .func = PMBUS_HAVE_PIN,
  1220. .sfunc = PMBUS_HAVE_STATUS_INPUT,
  1221. .sbase = PB_STATUS_INPUT_BASE,
  1222. .limit = pin_limit_attrs,
  1223. .nlimit = ARRAY_SIZE(pin_limit_attrs),
  1224. }, {
  1225. .reg = PMBUS_READ_POUT,
  1226. .class = PSC_POWER,
  1227. .label = "pout",
  1228. .paged = true,
  1229. .func = PMBUS_HAVE_POUT,
  1230. .sfunc = PMBUS_HAVE_STATUS_IOUT,
  1231. .sbase = PB_STATUS_IOUT_BASE,
  1232. .limit = pout_limit_attrs,
  1233. .nlimit = ARRAY_SIZE(pout_limit_attrs),
  1234. }
  1235. };
  1236. /* Temperature atributes */
  1237. static const struct pmbus_limit_attr temp_limit_attrs[] = {
  1238. {
  1239. .reg = PMBUS_UT_WARN_LIMIT,
  1240. .low = true,
  1241. .attr = "min",
  1242. .alarm = "min_alarm",
  1243. .sbit = PB_TEMP_UT_WARNING,
  1244. }, {
  1245. .reg = PMBUS_UT_FAULT_LIMIT,
  1246. .low = true,
  1247. .attr = "lcrit",
  1248. .alarm = "lcrit_alarm",
  1249. .sbit = PB_TEMP_UT_FAULT,
  1250. }, {
  1251. .reg = PMBUS_OT_WARN_LIMIT,
  1252. .attr = "max",
  1253. .alarm = "max_alarm",
  1254. .sbit = PB_TEMP_OT_WARNING,
  1255. }, {
  1256. .reg = PMBUS_OT_FAULT_LIMIT,
  1257. .attr = "crit",
  1258. .alarm = "crit_alarm",
  1259. .sbit = PB_TEMP_OT_FAULT,
  1260. }, {
  1261. .reg = PMBUS_VIRT_READ_TEMP_MIN,
  1262. .attr = "lowest",
  1263. }, {
  1264. .reg = PMBUS_VIRT_READ_TEMP_AVG,
  1265. .attr = "average",
  1266. }, {
  1267. .reg = PMBUS_VIRT_READ_TEMP_MAX,
  1268. .attr = "highest",
  1269. }, {
  1270. .reg = PMBUS_VIRT_RESET_TEMP_HISTORY,
  1271. .attr = "reset_history",
  1272. }
  1273. };
  1274. static const struct pmbus_limit_attr temp_limit_attrs2[] = {
  1275. {
  1276. .reg = PMBUS_UT_WARN_LIMIT,
  1277. .low = true,
  1278. .attr = "min",
  1279. .alarm = "min_alarm",
  1280. .sbit = PB_TEMP_UT_WARNING,
  1281. }, {
  1282. .reg = PMBUS_UT_FAULT_LIMIT,
  1283. .low = true,
  1284. .attr = "lcrit",
  1285. .alarm = "lcrit_alarm",
  1286. .sbit = PB_TEMP_UT_FAULT,
  1287. }, {
  1288. .reg = PMBUS_OT_WARN_LIMIT,
  1289. .attr = "max",
  1290. .alarm = "max_alarm",
  1291. .sbit = PB_TEMP_OT_WARNING,
  1292. }, {
  1293. .reg = PMBUS_OT_FAULT_LIMIT,
  1294. .attr = "crit",
  1295. .alarm = "crit_alarm",
  1296. .sbit = PB_TEMP_OT_FAULT,
  1297. }, {
  1298. .reg = PMBUS_VIRT_READ_TEMP2_MIN,
  1299. .attr = "lowest",
  1300. }, {
  1301. .reg = PMBUS_VIRT_READ_TEMP2_AVG,
  1302. .attr = "average",
  1303. }, {
  1304. .reg = PMBUS_VIRT_READ_TEMP2_MAX,
  1305. .attr = "highest",
  1306. }, {
  1307. .reg = PMBUS_VIRT_RESET_TEMP2_HISTORY,
  1308. .attr = "reset_history",
  1309. }
  1310. };
  1311. static const struct pmbus_limit_attr temp_limit_attrs3[] = {
  1312. {
  1313. .reg = PMBUS_UT_WARN_LIMIT,
  1314. .low = true,
  1315. .attr = "min",
  1316. .alarm = "min_alarm",
  1317. .sbit = PB_TEMP_UT_WARNING,
  1318. }, {
  1319. .reg = PMBUS_UT_FAULT_LIMIT,
  1320. .low = true,
  1321. .attr = "lcrit",
  1322. .alarm = "lcrit_alarm",
  1323. .sbit = PB_TEMP_UT_FAULT,
  1324. }, {
  1325. .reg = PMBUS_OT_WARN_LIMIT,
  1326. .attr = "max",
  1327. .alarm = "max_alarm",
  1328. .sbit = PB_TEMP_OT_WARNING,
  1329. }, {
  1330. .reg = PMBUS_OT_FAULT_LIMIT,
  1331. .attr = "crit",
  1332. .alarm = "crit_alarm",
  1333. .sbit = PB_TEMP_OT_FAULT,
  1334. }
  1335. };
  1336. static const struct pmbus_sensor_attr temp_attributes[] = {
  1337. {
  1338. .reg = PMBUS_READ_TEMPERATURE_1,
  1339. .class = PSC_TEMPERATURE,
  1340. .paged = true,
  1341. .update = true,
  1342. .compare = true,
  1343. .func = PMBUS_HAVE_TEMP,
  1344. .sfunc = PMBUS_HAVE_STATUS_TEMP,
  1345. .sbase = PB_STATUS_TEMP_BASE,
  1346. .gbit = PB_STATUS_TEMPERATURE,
  1347. .limit = temp_limit_attrs,
  1348. .nlimit = ARRAY_SIZE(temp_limit_attrs),
  1349. }, {
  1350. .reg = PMBUS_READ_TEMPERATURE_2,
  1351. .class = PSC_TEMPERATURE,
  1352. .paged = true,
  1353. .update = true,
  1354. .compare = true,
  1355. .func = PMBUS_HAVE_TEMP2,
  1356. .sfunc = PMBUS_HAVE_STATUS_TEMP,
  1357. .sbase = PB_STATUS_TEMP_BASE,
  1358. .gbit = PB_STATUS_TEMPERATURE,
  1359. .limit = temp_limit_attrs2,
  1360. .nlimit = ARRAY_SIZE(temp_limit_attrs2),
  1361. }, {
  1362. .reg = PMBUS_READ_TEMPERATURE_3,
  1363. .class = PSC_TEMPERATURE,
  1364. .paged = true,
  1365. .update = true,
  1366. .compare = true,
  1367. .func = PMBUS_HAVE_TEMP3,
  1368. .sfunc = PMBUS_HAVE_STATUS_TEMP,
  1369. .sbase = PB_STATUS_TEMP_BASE,
  1370. .gbit = PB_STATUS_TEMPERATURE,
  1371. .limit = temp_limit_attrs3,
  1372. .nlimit = ARRAY_SIZE(temp_limit_attrs3),
  1373. }
  1374. };
  1375. static const int pmbus_fan_registers[] = {
  1376. PMBUS_READ_FAN_SPEED_1,
  1377. PMBUS_READ_FAN_SPEED_2,
  1378. PMBUS_READ_FAN_SPEED_3,
  1379. PMBUS_READ_FAN_SPEED_4
  1380. };
  1381. static const int pmbus_fan_config_registers[] = {
  1382. PMBUS_FAN_CONFIG_12,
  1383. PMBUS_FAN_CONFIG_12,
  1384. PMBUS_FAN_CONFIG_34,
  1385. PMBUS_FAN_CONFIG_34
  1386. };
  1387. static const int pmbus_fan_status_registers[] = {
  1388. PMBUS_STATUS_FAN_12,
  1389. PMBUS_STATUS_FAN_12,
  1390. PMBUS_STATUS_FAN_34,
  1391. PMBUS_STATUS_FAN_34
  1392. };
  1393. static const u32 pmbus_fan_flags[] = {
  1394. PMBUS_HAVE_FAN12,
  1395. PMBUS_HAVE_FAN12,
  1396. PMBUS_HAVE_FAN34,
  1397. PMBUS_HAVE_FAN34
  1398. };
  1399. static const u32 pmbus_fan_status_flags[] = {
  1400. PMBUS_HAVE_STATUS_FAN12,
  1401. PMBUS_HAVE_STATUS_FAN12,
  1402. PMBUS_HAVE_STATUS_FAN34,
  1403. PMBUS_HAVE_STATUS_FAN34
  1404. };
  1405. /* Fans */
  1406. static int pmbus_add_fan_attributes(struct i2c_client *client,
  1407. struct pmbus_data *data)
  1408. {
  1409. const struct pmbus_driver_info *info = data->info;
  1410. int index = 1;
  1411. int page;
  1412. int ret;
  1413. for (page = 0; page < info->pages; page++) {
  1414. int f;
  1415. for (f = 0; f < ARRAY_SIZE(pmbus_fan_registers); f++) {
  1416. int regval;
  1417. if (!(info->func[page] & pmbus_fan_flags[f]))
  1418. break;
  1419. if (!pmbus_check_word_register(client, page,
  1420. pmbus_fan_registers[f]))
  1421. break;
  1422. /*
  1423. * Skip fan if not installed.
  1424. * Each fan configuration register covers multiple fans,
  1425. * so we have to do some magic.
  1426. */
  1427. regval = _pmbus_read_byte_data(client, page,
  1428. pmbus_fan_config_registers[f]);
  1429. if (regval < 0 ||
  1430. (!(regval & (PB_FAN_1_INSTALLED >> ((f & 1) * 4)))))
  1431. continue;
  1432. pmbus_add_sensor(data, "fan", "input", index, page,
  1433. pmbus_fan_registers[f], PSC_FAN, true,
  1434. true);
  1435. /*
  1436. * Each fan status register covers multiple fans,
  1437. * so we have to do some magic.
  1438. */
  1439. if ((info->func[page] & pmbus_fan_status_flags[f]) &&
  1440. pmbus_check_byte_register(client,
  1441. page, pmbus_fan_status_registers[f])) {
  1442. int base;
  1443. if (f > 1) /* fan 3, 4 */
  1444. base = PB_STATUS_FAN34_BASE + page;
  1445. else
  1446. base = PB_STATUS_FAN_BASE + page;
  1447. ret = pmbus_add_boolean(data, "fan",
  1448. "alarm", index, NULL, NULL, base,
  1449. PB_FAN_FAN1_WARNING >> (f & 1));
  1450. if (ret)
  1451. return ret;
  1452. ret = pmbus_add_boolean(data, "fan",
  1453. "fault", index, NULL, NULL, base,
  1454. PB_FAN_FAN1_FAULT >> (f & 1));
  1455. if (ret)
  1456. return ret;
  1457. }
  1458. index++;
  1459. }
  1460. }
  1461. return 0;
  1462. }
  1463. static int pmbus_find_attributes(struct i2c_client *client,
  1464. struct pmbus_data *data)
  1465. {
  1466. int ret;
  1467. /* Voltage sensors */
  1468. ret = pmbus_add_sensor_attrs(client, data, "in", voltage_attributes,
  1469. ARRAY_SIZE(voltage_attributes));
  1470. if (ret)
  1471. return ret;
  1472. /* Current sensors */
  1473. ret = pmbus_add_sensor_attrs(client, data, "curr", current_attributes,
  1474. ARRAY_SIZE(current_attributes));
  1475. if (ret)
  1476. return ret;
  1477. /* Power sensors */
  1478. ret = pmbus_add_sensor_attrs(client, data, "power", power_attributes,
  1479. ARRAY_SIZE(power_attributes));
  1480. if (ret)
  1481. return ret;
  1482. /* Temperature sensors */
  1483. ret = pmbus_add_sensor_attrs(client, data, "temp", temp_attributes,
  1484. ARRAY_SIZE(temp_attributes));
  1485. if (ret)
  1486. return ret;
  1487. /* Fans */
  1488. ret = pmbus_add_fan_attributes(client, data);
  1489. return ret;
  1490. }
  1491. /*
  1492. * Identify chip parameters.
  1493. * This function is called for all chips.
  1494. */
  1495. static int pmbus_identify_common(struct i2c_client *client,
  1496. struct pmbus_data *data)
  1497. {
  1498. int vout_mode = -1;
  1499. if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE))
  1500. vout_mode = _pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE);
  1501. if (vout_mode >= 0 && vout_mode != 0xff) {
  1502. /*
  1503. * Not all chips support the VOUT_MODE command,
  1504. * so a failure to read it is not an error.
  1505. */
  1506. switch (vout_mode >> 5) {
  1507. case 0: /* linear mode */
  1508. if (data->info->format[PSC_VOLTAGE_OUT] != linear)
  1509. return -ENODEV;
  1510. data->exponent = ((s8)(vout_mode << 3)) >> 3;
  1511. break;
  1512. case 1: /* VID mode */
  1513. if (data->info->format[PSC_VOLTAGE_OUT] != vid)
  1514. return -ENODEV;
  1515. break;
  1516. case 2: /* direct mode */
  1517. if (data->info->format[PSC_VOLTAGE_OUT] != direct)
  1518. return -ENODEV;
  1519. break;
  1520. default:
  1521. return -ENODEV;
  1522. }
  1523. }
  1524. /* Determine maximum number of sensors, booleans, and labels */
  1525. pmbus_find_max_attr(client, data);
  1526. pmbus_clear_fault_page(client, 0);
  1527. return 0;
  1528. }
  1529. int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
  1530. struct pmbus_driver_info *info)
  1531. {
  1532. struct device *dev = &client->dev;
  1533. const struct pmbus_platform_data *pdata = dev->platform_data;
  1534. struct pmbus_data *data;
  1535. int ret;
  1536. if (!info)
  1537. return -ENODEV;
  1538. if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WRITE_BYTE
  1539. | I2C_FUNC_SMBUS_BYTE_DATA
  1540. | I2C_FUNC_SMBUS_WORD_DATA))
  1541. return -ENODEV;
  1542. data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
  1543. if (!data)
  1544. return -ENOMEM;
  1545. i2c_set_clientdata(client, data);
  1546. mutex_init(&data->update_lock);
  1547. data->dev = dev;
  1548. /* Bail out if PMBus status register does not exist. */
  1549. if (i2c_smbus_read_byte_data(client, PMBUS_STATUS_BYTE) < 0) {
  1550. dev_err(dev, "PMBus status register not found\n");
  1551. return -ENODEV;
  1552. }
  1553. if (pdata)
  1554. data->flags = pdata->flags;
  1555. data->info = info;
  1556. pmbus_clear_faults(client);
  1557. if (info->identify) {
  1558. ret = (*info->identify)(client, info);
  1559. if (ret < 0) {
  1560. dev_err(dev, "Chip identification failed\n");
  1561. return ret;
  1562. }
  1563. }
  1564. if (info->pages <= 0 || info->pages > PMBUS_PAGES) {
  1565. dev_err(dev, "Bad number of PMBus pages: %d\n", info->pages);
  1566. return -ENODEV;
  1567. }
  1568. ret = pmbus_identify_common(client, data);
  1569. if (ret < 0) {
  1570. dev_err(dev, "Failed to identify chip capabilities\n");
  1571. return ret;
  1572. }
  1573. data->sensors = devm_kzalloc(dev, sizeof(struct pmbus_sensor)
  1574. * data->max_sensors, GFP_KERNEL);
  1575. if (!data->sensors)
  1576. return -ENOMEM;
  1577. data->attributes = devm_kzalloc(dev, sizeof(struct attribute *)
  1578. * data->max_attributes, GFP_KERNEL);
  1579. if (!data->attributes)
  1580. return -ENOMEM;
  1581. ret = pmbus_find_attributes(client, data);
  1582. if (ret)
  1583. return ret;
  1584. /*
  1585. * If there are no attributes, something is wrong.
  1586. * Bail out instead of trying to register nothing.
  1587. */
  1588. if (!data->num_attributes) {
  1589. dev_err(dev, "No attributes found\n");
  1590. return -ENODEV;
  1591. }
  1592. /* Register sysfs hooks */
  1593. data->group.attrs = data->attributes;
  1594. ret = sysfs_create_group(&dev->kobj, &data->group);
  1595. if (ret) {
  1596. dev_err(dev, "Failed to create sysfs entries\n");
  1597. return ret;
  1598. }
  1599. data->hwmon_dev = hwmon_device_register(dev);
  1600. if (IS_ERR(data->hwmon_dev)) {
  1601. ret = PTR_ERR(data->hwmon_dev);
  1602. dev_err(dev, "Failed to register hwmon device\n");
  1603. goto out_hwmon_device_register;
  1604. }
  1605. return 0;
  1606. out_hwmon_device_register:
  1607. sysfs_remove_group(&dev->kobj, &data->group);
  1608. return ret;
  1609. }
  1610. EXPORT_SYMBOL_GPL(pmbus_do_probe);
  1611. int pmbus_do_remove(struct i2c_client *client)
  1612. {
  1613. struct pmbus_data *data = i2c_get_clientdata(client);
  1614. hwmon_device_unregister(data->hwmon_dev);
  1615. sysfs_remove_group(&client->dev.kobj, &data->group);
  1616. return 0;
  1617. }
  1618. EXPORT_SYMBOL_GPL(pmbus_do_remove);
  1619. MODULE_AUTHOR("Guenter Roeck");
  1620. MODULE_DESCRIPTION("PMBus core driver");
  1621. MODULE_LICENSE("GPL");