ucd9000.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. /*
  2. * Hardware monitoring driver for UCD90xxx Sequencer and System Health
  3. * Controller series
  4. *
  5. * Copyright (C) 2011 Ericsson AB.
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. #include <linux/debugfs.h>
  22. #include <linux/kernel.h>
  23. #include <linux/module.h>
  24. #include <linux/of_device.h>
  25. #include <linux/init.h>
  26. #include <linux/err.h>
  27. #include <linux/slab.h>
  28. #include <linux/i2c.h>
  29. #include <linux/pmbus.h>
  30. #include <linux/gpio.h>
  31. #include <linux/gpio/driver.h>
  32. #include "pmbus.h"
  33. enum chips { ucd9000, ucd90120, ucd90124, ucd90160, ucd9090, ucd90910 };
  34. #define UCD9000_MONITOR_CONFIG 0xd5
  35. #define UCD9000_NUM_PAGES 0xd6
  36. #define UCD9000_FAN_CONFIG_INDEX 0xe7
  37. #define UCD9000_FAN_CONFIG 0xe8
  38. #define UCD9000_MFR_STATUS 0xf3
  39. #define UCD9000_GPIO_SELECT 0xfa
  40. #define UCD9000_GPIO_CONFIG 0xfb
  41. #define UCD9000_DEVICE_ID 0xfd
  42. /* GPIO CONFIG bits */
  43. #define UCD9000_GPIO_CONFIG_ENABLE BIT(0)
  44. #define UCD9000_GPIO_CONFIG_OUT_ENABLE BIT(1)
  45. #define UCD9000_GPIO_CONFIG_OUT_VALUE BIT(2)
  46. #define UCD9000_GPIO_CONFIG_STATUS BIT(3)
  47. #define UCD9000_GPIO_INPUT 0
  48. #define UCD9000_GPIO_OUTPUT 1
  49. #define UCD9000_MON_TYPE(x) (((x) >> 5) & 0x07)
  50. #define UCD9000_MON_PAGE(x) ((x) & 0x0f)
  51. #define UCD9000_MON_VOLTAGE 1
  52. #define UCD9000_MON_TEMPERATURE 2
  53. #define UCD9000_MON_CURRENT 3
  54. #define UCD9000_MON_VOLTAGE_HW 4
  55. #define UCD9000_NUM_FAN 4
  56. #define UCD9000_GPIO_NAME_LEN 16
  57. #define UCD9090_NUM_GPIOS 23
  58. #define UCD901XX_NUM_GPIOS 26
  59. #define UCD90910_NUM_GPIOS 26
  60. #define UCD9000_DEBUGFS_NAME_LEN 24
  61. #define UCD9000_GPI_COUNT 8
  62. struct ucd9000_data {
  63. u8 fan_data[UCD9000_NUM_FAN][I2C_SMBUS_BLOCK_MAX];
  64. struct pmbus_driver_info info;
  65. #ifdef CONFIG_GPIOLIB
  66. struct gpio_chip gpio;
  67. #endif
  68. struct dentry *debugfs;
  69. };
  70. #define to_ucd9000_data(_info) container_of(_info, struct ucd9000_data, info)
  71. struct ucd9000_debugfs_entry {
  72. struct i2c_client *client;
  73. u8 index;
  74. };
  75. static int ucd9000_get_fan_config(struct i2c_client *client, int fan)
  76. {
  77. int fan_config = 0;
  78. struct ucd9000_data *data
  79. = to_ucd9000_data(pmbus_get_driver_info(client));
  80. if (data->fan_data[fan][3] & 1)
  81. fan_config |= PB_FAN_2_INSTALLED; /* Use lower bit position */
  82. /* Pulses/revolution */
  83. fan_config |= (data->fan_data[fan][3] & 0x06) >> 1;
  84. return fan_config;
  85. }
  86. static int ucd9000_read_byte_data(struct i2c_client *client, int page, int reg)
  87. {
  88. int ret = 0;
  89. int fan_config;
  90. switch (reg) {
  91. case PMBUS_FAN_CONFIG_12:
  92. if (page > 0)
  93. return -ENXIO;
  94. ret = ucd9000_get_fan_config(client, 0);
  95. if (ret < 0)
  96. return ret;
  97. fan_config = ret << 4;
  98. ret = ucd9000_get_fan_config(client, 1);
  99. if (ret < 0)
  100. return ret;
  101. fan_config |= ret;
  102. ret = fan_config;
  103. break;
  104. case PMBUS_FAN_CONFIG_34:
  105. if (page > 0)
  106. return -ENXIO;
  107. ret = ucd9000_get_fan_config(client, 2);
  108. if (ret < 0)
  109. return ret;
  110. fan_config = ret << 4;
  111. ret = ucd9000_get_fan_config(client, 3);
  112. if (ret < 0)
  113. return ret;
  114. fan_config |= ret;
  115. ret = fan_config;
  116. break;
  117. default:
  118. ret = -ENODATA;
  119. break;
  120. }
  121. return ret;
  122. }
  123. static const struct i2c_device_id ucd9000_id[] = {
  124. {"ucd9000", ucd9000},
  125. {"ucd90120", ucd90120},
  126. {"ucd90124", ucd90124},
  127. {"ucd90160", ucd90160},
  128. {"ucd9090", ucd9090},
  129. {"ucd90910", ucd90910},
  130. {}
  131. };
  132. MODULE_DEVICE_TABLE(i2c, ucd9000_id);
  133. static const struct of_device_id ucd9000_of_match[] = {
  134. {
  135. .compatible = "ti,ucd9000",
  136. .data = (void *)ucd9000
  137. },
  138. {
  139. .compatible = "ti,ucd90120",
  140. .data = (void *)ucd90120
  141. },
  142. {
  143. .compatible = "ti,ucd90124",
  144. .data = (void *)ucd90124
  145. },
  146. {
  147. .compatible = "ti,ucd90160",
  148. .data = (void *)ucd90160
  149. },
  150. {
  151. .compatible = "ti,ucd9090",
  152. .data = (void *)ucd9090
  153. },
  154. {
  155. .compatible = "ti,ucd90910",
  156. .data = (void *)ucd90910
  157. },
  158. { },
  159. };
  160. MODULE_DEVICE_TABLE(of, ucd9000_of_match);
  161. #ifdef CONFIG_GPIOLIB
  162. static int ucd9000_gpio_read_config(struct i2c_client *client,
  163. unsigned int offset)
  164. {
  165. int ret;
  166. /* No page set required */
  167. ret = i2c_smbus_write_byte_data(client, UCD9000_GPIO_SELECT, offset);
  168. if (ret < 0)
  169. return ret;
  170. return i2c_smbus_read_byte_data(client, UCD9000_GPIO_CONFIG);
  171. }
  172. static int ucd9000_gpio_get(struct gpio_chip *gc, unsigned int offset)
  173. {
  174. struct i2c_client *client = gpiochip_get_data(gc);
  175. int ret;
  176. ret = ucd9000_gpio_read_config(client, offset);
  177. if (ret < 0)
  178. return ret;
  179. return !!(ret & UCD9000_GPIO_CONFIG_STATUS);
  180. }
  181. static void ucd9000_gpio_set(struct gpio_chip *gc, unsigned int offset,
  182. int value)
  183. {
  184. struct i2c_client *client = gpiochip_get_data(gc);
  185. int ret;
  186. ret = ucd9000_gpio_read_config(client, offset);
  187. if (ret < 0) {
  188. dev_dbg(&client->dev, "failed to read GPIO %d config: %d\n",
  189. offset, ret);
  190. return;
  191. }
  192. if (value) {
  193. if (ret & UCD9000_GPIO_CONFIG_STATUS)
  194. return;
  195. ret |= UCD9000_GPIO_CONFIG_STATUS;
  196. } else {
  197. if (!(ret & UCD9000_GPIO_CONFIG_STATUS))
  198. return;
  199. ret &= ~UCD9000_GPIO_CONFIG_STATUS;
  200. }
  201. ret |= UCD9000_GPIO_CONFIG_ENABLE;
  202. /* Page set not required */
  203. ret = i2c_smbus_write_byte_data(client, UCD9000_GPIO_CONFIG, ret);
  204. if (ret < 0) {
  205. dev_dbg(&client->dev, "Failed to write GPIO %d config: %d\n",
  206. offset, ret);
  207. return;
  208. }
  209. ret &= ~UCD9000_GPIO_CONFIG_ENABLE;
  210. ret = i2c_smbus_write_byte_data(client, UCD9000_GPIO_CONFIG, ret);
  211. if (ret < 0)
  212. dev_dbg(&client->dev, "Failed to write GPIO %d config: %d\n",
  213. offset, ret);
  214. }
  215. static int ucd9000_gpio_get_direction(struct gpio_chip *gc,
  216. unsigned int offset)
  217. {
  218. struct i2c_client *client = gpiochip_get_data(gc);
  219. int ret;
  220. ret = ucd9000_gpio_read_config(client, offset);
  221. if (ret < 0)
  222. return ret;
  223. return !(ret & UCD9000_GPIO_CONFIG_OUT_ENABLE);
  224. }
  225. static int ucd9000_gpio_set_direction(struct gpio_chip *gc,
  226. unsigned int offset, bool direction_out,
  227. int requested_out)
  228. {
  229. struct i2c_client *client = gpiochip_get_data(gc);
  230. int ret, config, out_val;
  231. ret = ucd9000_gpio_read_config(client, offset);
  232. if (ret < 0)
  233. return ret;
  234. if (direction_out) {
  235. out_val = requested_out ? UCD9000_GPIO_CONFIG_OUT_VALUE : 0;
  236. if (ret & UCD9000_GPIO_CONFIG_OUT_ENABLE) {
  237. if ((ret & UCD9000_GPIO_CONFIG_OUT_VALUE) == out_val)
  238. return 0;
  239. } else {
  240. ret |= UCD9000_GPIO_CONFIG_OUT_ENABLE;
  241. }
  242. if (out_val)
  243. ret |= UCD9000_GPIO_CONFIG_OUT_VALUE;
  244. else
  245. ret &= ~UCD9000_GPIO_CONFIG_OUT_VALUE;
  246. } else {
  247. if (!(ret & UCD9000_GPIO_CONFIG_OUT_ENABLE))
  248. return 0;
  249. ret &= ~UCD9000_GPIO_CONFIG_OUT_ENABLE;
  250. }
  251. ret |= UCD9000_GPIO_CONFIG_ENABLE;
  252. config = ret;
  253. /* Page set not required */
  254. ret = i2c_smbus_write_byte_data(client, UCD9000_GPIO_CONFIG, config);
  255. if (ret < 0)
  256. return ret;
  257. config &= ~UCD9000_GPIO_CONFIG_ENABLE;
  258. return i2c_smbus_write_byte_data(client, UCD9000_GPIO_CONFIG, config);
  259. }
  260. static int ucd9000_gpio_direction_input(struct gpio_chip *gc,
  261. unsigned int offset)
  262. {
  263. return ucd9000_gpio_set_direction(gc, offset, UCD9000_GPIO_INPUT, 0);
  264. }
  265. static int ucd9000_gpio_direction_output(struct gpio_chip *gc,
  266. unsigned int offset, int val)
  267. {
  268. return ucd9000_gpio_set_direction(gc, offset, UCD9000_GPIO_OUTPUT,
  269. val);
  270. }
  271. static void ucd9000_probe_gpio(struct i2c_client *client,
  272. const struct i2c_device_id *mid,
  273. struct ucd9000_data *data)
  274. {
  275. int rc;
  276. switch (mid->driver_data) {
  277. case ucd9090:
  278. data->gpio.ngpio = UCD9090_NUM_GPIOS;
  279. break;
  280. case ucd90120:
  281. case ucd90124:
  282. case ucd90160:
  283. data->gpio.ngpio = UCD901XX_NUM_GPIOS;
  284. break;
  285. case ucd90910:
  286. data->gpio.ngpio = UCD90910_NUM_GPIOS;
  287. break;
  288. default:
  289. return; /* GPIO support is optional. */
  290. }
  291. /*
  292. * Pinmux support has not been added to the new gpio_chip.
  293. * This support should be added when possible given the mux
  294. * behavior of these IO devices.
  295. */
  296. data->gpio.label = client->name;
  297. data->gpio.get_direction = ucd9000_gpio_get_direction;
  298. data->gpio.direction_input = ucd9000_gpio_direction_input;
  299. data->gpio.direction_output = ucd9000_gpio_direction_output;
  300. data->gpio.get = ucd9000_gpio_get;
  301. data->gpio.set = ucd9000_gpio_set;
  302. data->gpio.can_sleep = true;
  303. data->gpio.base = -1;
  304. data->gpio.parent = &client->dev;
  305. rc = devm_gpiochip_add_data(&client->dev, &data->gpio, client);
  306. if (rc)
  307. dev_warn(&client->dev, "Could not add gpiochip: %d\n", rc);
  308. }
  309. #else
  310. static void ucd9000_probe_gpio(struct i2c_client *client,
  311. const struct i2c_device_id *mid,
  312. struct ucd9000_data *data)
  313. {
  314. }
  315. #endif /* CONFIG_GPIOLIB */
  316. #ifdef CONFIG_DEBUG_FS
  317. static int ucd9000_get_mfr_status(struct i2c_client *client, u8 *buffer)
  318. {
  319. int ret = pmbus_set_page(client, 0);
  320. if (ret < 0)
  321. return ret;
  322. return i2c_smbus_read_block_data(client, UCD9000_MFR_STATUS, buffer);
  323. }
  324. static int ucd9000_debugfs_show_mfr_status_bit(void *data, u64 *val)
  325. {
  326. struct ucd9000_debugfs_entry *entry = data;
  327. struct i2c_client *client = entry->client;
  328. u8 buffer[I2C_SMBUS_BLOCK_MAX];
  329. int ret;
  330. ret = ucd9000_get_mfr_status(client, buffer);
  331. if (ret < 0)
  332. return ret;
  333. /*
  334. * Attribute only created for devices with gpi fault bits at bits
  335. * 16-23, which is the second byte of the response.
  336. */
  337. *val = !!(buffer[1] & BIT(entry->index));
  338. return 0;
  339. }
  340. DEFINE_DEBUGFS_ATTRIBUTE(ucd9000_debugfs_mfr_status_bit,
  341. ucd9000_debugfs_show_mfr_status_bit, NULL, "%1lld\n");
  342. static ssize_t ucd9000_debugfs_read_mfr_status(struct file *file,
  343. char __user *buf, size_t count,
  344. loff_t *ppos)
  345. {
  346. struct i2c_client *client = file->private_data;
  347. u8 buffer[I2C_SMBUS_BLOCK_MAX];
  348. char str[(I2C_SMBUS_BLOCK_MAX * 2) + 2];
  349. char *res;
  350. int rc;
  351. rc = ucd9000_get_mfr_status(client, buffer);
  352. if (rc < 0)
  353. return rc;
  354. res = bin2hex(str, buffer, min(rc, I2C_SMBUS_BLOCK_MAX));
  355. *res++ = '\n';
  356. *res = 0;
  357. return simple_read_from_buffer(buf, count, ppos, str, res - str);
  358. }
  359. static const struct file_operations ucd9000_debugfs_show_mfr_status_fops = {
  360. .llseek = noop_llseek,
  361. .read = ucd9000_debugfs_read_mfr_status,
  362. .open = simple_open,
  363. };
  364. static int ucd9000_init_debugfs(struct i2c_client *client,
  365. const struct i2c_device_id *mid,
  366. struct ucd9000_data *data)
  367. {
  368. struct dentry *debugfs;
  369. struct ucd9000_debugfs_entry *entries;
  370. int i;
  371. char name[UCD9000_DEBUGFS_NAME_LEN];
  372. debugfs = pmbus_get_debugfs_dir(client);
  373. if (!debugfs)
  374. return -ENOENT;
  375. data->debugfs = debugfs_create_dir(client->name, debugfs);
  376. if (!data->debugfs)
  377. return -ENOENT;
  378. /*
  379. * Of the chips this driver supports, only the UCD9090, UCD90160,
  380. * and UCD90910 report GPI faults in their MFR_STATUS register, so only
  381. * create the GPI fault debugfs attributes for those chips.
  382. */
  383. if (mid->driver_data == ucd9090 || mid->driver_data == ucd90160 ||
  384. mid->driver_data == ucd90910) {
  385. entries = devm_kcalloc(&client->dev,
  386. UCD9000_GPI_COUNT, sizeof(*entries),
  387. GFP_KERNEL);
  388. if (!entries)
  389. return -ENOMEM;
  390. for (i = 0; i < UCD9000_GPI_COUNT; i++) {
  391. entries[i].client = client;
  392. entries[i].index = i;
  393. scnprintf(name, UCD9000_DEBUGFS_NAME_LEN,
  394. "gpi%d_alarm", i + 1);
  395. debugfs_create_file(name, 0444, data->debugfs,
  396. &entries[i],
  397. &ucd9000_debugfs_mfr_status_bit);
  398. }
  399. }
  400. scnprintf(name, UCD9000_DEBUGFS_NAME_LEN, "mfr_status");
  401. debugfs_create_file(name, 0444, data->debugfs, client,
  402. &ucd9000_debugfs_show_mfr_status_fops);
  403. return 0;
  404. }
  405. #else
  406. static int ucd9000_init_debugfs(struct i2c_client *client,
  407. const struct i2c_device_id *mid,
  408. struct ucd9000_data *data)
  409. {
  410. return 0;
  411. }
  412. #endif /* CONFIG_DEBUG_FS */
  413. static int ucd9000_probe(struct i2c_client *client,
  414. const struct i2c_device_id *id)
  415. {
  416. u8 block_buffer[I2C_SMBUS_BLOCK_MAX + 1];
  417. struct ucd9000_data *data;
  418. struct pmbus_driver_info *info;
  419. const struct i2c_device_id *mid;
  420. enum chips chip;
  421. int i, ret;
  422. if (!i2c_check_functionality(client->adapter,
  423. I2C_FUNC_SMBUS_BYTE_DATA |
  424. I2C_FUNC_SMBUS_BLOCK_DATA))
  425. return -ENODEV;
  426. ret = i2c_smbus_read_block_data(client, UCD9000_DEVICE_ID,
  427. block_buffer);
  428. if (ret < 0) {
  429. dev_err(&client->dev, "Failed to read device ID\n");
  430. return ret;
  431. }
  432. block_buffer[ret] = '\0';
  433. dev_info(&client->dev, "Device ID %s\n", block_buffer);
  434. for (mid = ucd9000_id; mid->name[0]; mid++) {
  435. if (!strncasecmp(mid->name, block_buffer, strlen(mid->name)))
  436. break;
  437. }
  438. if (!mid->name[0]) {
  439. dev_err(&client->dev, "Unsupported device\n");
  440. return -ENODEV;
  441. }
  442. if (client->dev.of_node)
  443. chip = (enum chips)of_device_get_match_data(&client->dev);
  444. else
  445. chip = id->driver_data;
  446. if (chip != ucd9000 && chip != mid->driver_data)
  447. dev_notice(&client->dev,
  448. "Device mismatch: Configured %s, detected %s\n",
  449. id->name, mid->name);
  450. data = devm_kzalloc(&client->dev, sizeof(struct ucd9000_data),
  451. GFP_KERNEL);
  452. if (!data)
  453. return -ENOMEM;
  454. info = &data->info;
  455. ret = i2c_smbus_read_byte_data(client, UCD9000_NUM_PAGES);
  456. if (ret < 0) {
  457. dev_err(&client->dev,
  458. "Failed to read number of active pages\n");
  459. return ret;
  460. }
  461. info->pages = ret;
  462. if (!info->pages) {
  463. dev_err(&client->dev, "No pages configured\n");
  464. return -ENODEV;
  465. }
  466. /* The internal temperature sensor is always active */
  467. info->func[0] = PMBUS_HAVE_TEMP;
  468. /* Everything else is configurable */
  469. ret = i2c_smbus_read_block_data(client, UCD9000_MONITOR_CONFIG,
  470. block_buffer);
  471. if (ret <= 0) {
  472. dev_err(&client->dev, "Failed to read configuration data\n");
  473. return -ENODEV;
  474. }
  475. for (i = 0; i < ret; i++) {
  476. int page = UCD9000_MON_PAGE(block_buffer[i]);
  477. if (page >= info->pages)
  478. continue;
  479. switch (UCD9000_MON_TYPE(block_buffer[i])) {
  480. case UCD9000_MON_VOLTAGE:
  481. case UCD9000_MON_VOLTAGE_HW:
  482. info->func[page] |= PMBUS_HAVE_VOUT
  483. | PMBUS_HAVE_STATUS_VOUT;
  484. break;
  485. case UCD9000_MON_TEMPERATURE:
  486. info->func[page] |= PMBUS_HAVE_TEMP2
  487. | PMBUS_HAVE_STATUS_TEMP;
  488. break;
  489. case UCD9000_MON_CURRENT:
  490. info->func[page] |= PMBUS_HAVE_IOUT
  491. | PMBUS_HAVE_STATUS_IOUT;
  492. break;
  493. default:
  494. break;
  495. }
  496. }
  497. /* Fan configuration */
  498. if (mid->driver_data == ucd90124) {
  499. for (i = 0; i < UCD9000_NUM_FAN; i++) {
  500. i2c_smbus_write_byte_data(client,
  501. UCD9000_FAN_CONFIG_INDEX, i);
  502. ret = i2c_smbus_read_block_data(client,
  503. UCD9000_FAN_CONFIG,
  504. data->fan_data[i]);
  505. if (ret < 0)
  506. return ret;
  507. }
  508. i2c_smbus_write_byte_data(client, UCD9000_FAN_CONFIG_INDEX, 0);
  509. info->read_byte_data = ucd9000_read_byte_data;
  510. info->func[0] |= PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12
  511. | PMBUS_HAVE_FAN34 | PMBUS_HAVE_STATUS_FAN34;
  512. }
  513. ucd9000_probe_gpio(client, mid, data);
  514. ret = pmbus_do_probe(client, mid, info);
  515. if (ret)
  516. return ret;
  517. ret = ucd9000_init_debugfs(client, mid, data);
  518. if (ret)
  519. dev_warn(&client->dev, "Failed to register debugfs: %d\n",
  520. ret);
  521. return 0;
  522. }
  523. /* This is the driver that will be inserted */
  524. static struct i2c_driver ucd9000_driver = {
  525. .driver = {
  526. .name = "ucd9000",
  527. .of_match_table = of_match_ptr(ucd9000_of_match),
  528. },
  529. .probe = ucd9000_probe,
  530. .remove = pmbus_do_remove,
  531. .id_table = ucd9000_id,
  532. };
  533. module_i2c_driver(ucd9000_driver);
  534. MODULE_AUTHOR("Guenter Roeck");
  535. MODULE_DESCRIPTION("PMBus driver for TI UCD90xxx");
  536. MODULE_LICENSE("GPL");