isl68137.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Hardware monitoring driver for Renesas Digital Multiphase Voltage Regulators
  4. *
  5. * Copyright (c) 2017 Google Inc
  6. * Copyright (c) 2020 Renesas Electronics America
  7. *
  8. */
  9. #include <linux/err.h>
  10. #include <linux/hwmon-sysfs.h>
  11. #include <linux/i2c.h>
  12. #include <linux/init.h>
  13. #include <linux/kernel.h>
  14. #include <linux/module.h>
  15. #include <linux/of.h>
  16. #include <linux/string.h>
  17. #include <linux/sysfs.h>
  18. #include "pmbus.h"
  19. #define ISL68137_VOUT_AVS 0x30
  20. #define RAA_DMPVR2_READ_VMON 0xc8
  21. #define MAX_CHANNELS 4
  22. enum chips {
  23. isl68137,
  24. isl68220,
  25. isl68221,
  26. isl68222,
  27. isl68223,
  28. isl68224,
  29. isl68225,
  30. isl68226,
  31. isl68227,
  32. isl68229,
  33. isl68233,
  34. isl68239,
  35. isl69222,
  36. isl69223,
  37. isl69224,
  38. isl69225,
  39. isl69227,
  40. isl69228,
  41. isl69234,
  42. isl69236,
  43. isl69239,
  44. isl69242,
  45. isl69243,
  46. isl69247,
  47. isl69248,
  48. isl69254,
  49. isl69255,
  50. isl69256,
  51. isl69259,
  52. isl69260,
  53. isl69268,
  54. isl69269,
  55. isl69298,
  56. raa228000,
  57. raa228004,
  58. raa228006,
  59. raa228228,
  60. raa228244,
  61. raa228246,
  62. raa229001,
  63. raa229004,
  64. raa229141,
  65. raa229621,
  66. };
  67. enum variants {
  68. raa_dmpvr1_2rail,
  69. raa_dmpvr2_1rail,
  70. raa_dmpvr2_2rail,
  71. raa_dmpvr2_2rail_nontc,
  72. raa_dmpvr2_2rail_pmbus,
  73. raa_dmpvr2_3rail,
  74. raa_dmpvr2_hv,
  75. };
  76. struct isl68137_channel {
  77. u32 vout_voltage_divider[2];
  78. };
  79. struct isl68137_data {
  80. struct pmbus_driver_info info;
  81. struct isl68137_channel channel[MAX_CHANNELS];
  82. };
  83. #define to_isl68137_data(x) container_of(x, struct isl68137_data, info)
  84. static const struct i2c_device_id raa_dmpvr_id[];
  85. static ssize_t isl68137_avs_enable_show_page(struct i2c_client *client,
  86. int page,
  87. char *buf)
  88. {
  89. int val;
  90. val = pmbus_lock_interruptible(client);
  91. if (val)
  92. return val;
  93. val = pmbus_read_byte_data(client, page, PMBUS_OPERATION);
  94. pmbus_unlock(client);
  95. if (val < 0)
  96. return val;
  97. return sysfs_emit(buf, "%d\n",
  98. (val & ISL68137_VOUT_AVS) == ISL68137_VOUT_AVS);
  99. }
  100. static ssize_t isl68137_avs_enable_store_page(struct i2c_client *client,
  101. int page,
  102. const char *buf, size_t count)
  103. {
  104. int rc, op_val;
  105. bool result;
  106. rc = kstrtobool(buf, &result);
  107. if (rc)
  108. return rc;
  109. op_val = result ? ISL68137_VOUT_AVS : 0;
  110. rc = pmbus_lock_interruptible(client);
  111. if (rc)
  112. return rc;
  113. /*
  114. * Writes to VOUT setpoint over AVSBus will persist after the VRM is
  115. * switched to PMBus control. Switching back to AVSBus control
  116. * restores this persisted setpoint rather than re-initializing to
  117. * PMBus VOUT_COMMAND. Writing VOUT_COMMAND first over PMBus before
  118. * enabling AVS control is the workaround.
  119. */
  120. if (op_val == ISL68137_VOUT_AVS) {
  121. rc = pmbus_read_word_data(client, page, 0xff,
  122. PMBUS_VOUT_COMMAND);
  123. if (rc < 0)
  124. goto unlock;
  125. rc = pmbus_write_word_data(client, page, PMBUS_VOUT_COMMAND,
  126. rc);
  127. if (rc < 0)
  128. goto unlock;
  129. }
  130. rc = pmbus_update_byte_data(client, page, PMBUS_OPERATION,
  131. ISL68137_VOUT_AVS, op_val);
  132. unlock:
  133. pmbus_unlock(client);
  134. return (rc < 0) ? rc : count;
  135. }
  136. static ssize_t isl68137_avs_enable_show(struct device *dev,
  137. struct device_attribute *devattr,
  138. char *buf)
  139. {
  140. struct i2c_client *client = to_i2c_client(dev->parent);
  141. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  142. return isl68137_avs_enable_show_page(client, attr->index, buf);
  143. }
  144. static ssize_t isl68137_avs_enable_store(struct device *dev,
  145. struct device_attribute *devattr,
  146. const char *buf, size_t count)
  147. {
  148. struct i2c_client *client = to_i2c_client(dev->parent);
  149. struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
  150. return isl68137_avs_enable_store_page(client, attr->index, buf, count);
  151. }
  152. static SENSOR_DEVICE_ATTR_RW(avs0_enable, isl68137_avs_enable, 0);
  153. static SENSOR_DEVICE_ATTR_RW(avs1_enable, isl68137_avs_enable, 1);
  154. static struct attribute *enable_attrs[] = {
  155. &sensor_dev_attr_avs0_enable.dev_attr.attr,
  156. &sensor_dev_attr_avs1_enable.dev_attr.attr,
  157. NULL,
  158. };
  159. static const struct attribute_group enable_group = {
  160. .attrs = enable_attrs,
  161. };
  162. static const struct attribute_group *isl68137_attribute_groups[] = {
  163. &enable_group,
  164. NULL,
  165. };
  166. static int raa_dmpvr2_read_word_data(struct i2c_client *client, int page,
  167. int phase, int reg)
  168. {
  169. const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
  170. const struct isl68137_data *data = to_isl68137_data(info);
  171. int ret;
  172. u64 temp;
  173. switch (reg) {
  174. case PMBUS_VIRT_READ_VMON:
  175. ret = pmbus_read_word_data(client, page, phase,
  176. RAA_DMPVR2_READ_VMON);
  177. break;
  178. case PMBUS_READ_POUT:
  179. case PMBUS_READ_VOUT:
  180. /*
  181. * In cases where a voltage divider is attached to the target
  182. * rail between Vout and the Vsense pin, both Vout and Pout
  183. * should be scaled by the voltage divider scaling factor.
  184. * I.e. Vout = Vsense * Rtotal / Rout
  185. */
  186. ret = pmbus_read_word_data(client, page, phase, reg);
  187. if (ret > 0) {
  188. temp = DIV_U64_ROUND_CLOSEST((u64)ret *
  189. data->channel[page].vout_voltage_divider[1],
  190. data->channel[page].vout_voltage_divider[0]);
  191. ret = clamp_val(temp, 0, 0xffff);
  192. }
  193. break;
  194. default:
  195. ret = -ENODATA;
  196. break;
  197. }
  198. return ret;
  199. }
  200. static int raa_dmpvr2_write_word_data(struct i2c_client *client, int page,
  201. int reg, u16 word)
  202. {
  203. const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
  204. const struct isl68137_data *data = to_isl68137_data(info);
  205. int ret;
  206. u64 temp;
  207. switch (reg) {
  208. case PMBUS_VOUT_MAX:
  209. case PMBUS_VOUT_MARGIN_HIGH:
  210. case PMBUS_VOUT_MARGIN_LOW:
  211. case PMBUS_VOUT_OV_FAULT_LIMIT:
  212. case PMBUS_VOUT_UV_FAULT_LIMIT:
  213. case PMBUS_VOUT_COMMAND:
  214. /*
  215. * In cases where a voltage divider is attached to the target
  216. * rail between Vout and the Vsense pin, Vout related PMBus
  217. * commands should be scaled based on the expected voltage
  218. * at the Vsense pin.
  219. * I.e. Vsense = Vout * Rout / Rtotal
  220. */
  221. temp = DIV_U64_ROUND_CLOSEST((u64)word *
  222. data->channel[page].vout_voltage_divider[0],
  223. data->channel[page].vout_voltage_divider[1]);
  224. ret = clamp_val(temp, 0, 0xffff);
  225. break;
  226. default:
  227. ret = -ENODATA;
  228. break;
  229. }
  230. return ret;
  231. }
  232. static struct pmbus_driver_info raa_dmpvr_info = {
  233. .pages = 3,
  234. .format[PSC_VOLTAGE_IN] = direct,
  235. .format[PSC_VOLTAGE_OUT] = direct,
  236. .format[PSC_CURRENT_IN] = direct,
  237. .format[PSC_CURRENT_OUT] = direct,
  238. .format[PSC_POWER] = direct,
  239. .format[PSC_TEMPERATURE] = direct,
  240. .m[PSC_VOLTAGE_IN] = 1,
  241. .b[PSC_VOLTAGE_IN] = 0,
  242. .R[PSC_VOLTAGE_IN] = 2,
  243. .m[PSC_VOLTAGE_OUT] = 1,
  244. .b[PSC_VOLTAGE_OUT] = 0,
  245. .R[PSC_VOLTAGE_OUT] = 3,
  246. .m[PSC_CURRENT_IN] = 1,
  247. .b[PSC_CURRENT_IN] = 0,
  248. .R[PSC_CURRENT_IN] = 2,
  249. .m[PSC_CURRENT_OUT] = 1,
  250. .b[PSC_CURRENT_OUT] = 0,
  251. .R[PSC_CURRENT_OUT] = 1,
  252. .m[PSC_POWER] = 1,
  253. .b[PSC_POWER] = 0,
  254. .R[PSC_POWER] = 0,
  255. .m[PSC_TEMPERATURE] = 1,
  256. .b[PSC_TEMPERATURE] = 0,
  257. .R[PSC_TEMPERATURE] = 0,
  258. .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN | PMBUS_HAVE_PIN
  259. | PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2
  260. | PMBUS_HAVE_TEMP3 | PMBUS_HAVE_STATUS_TEMP
  261. | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
  262. | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT
  263. | PMBUS_HAVE_VMON,
  264. .func[1] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT
  265. | PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP3 | PMBUS_HAVE_STATUS_TEMP
  266. | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_IOUT
  267. | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
  268. .func[2] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT
  269. | PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP3 | PMBUS_HAVE_STATUS_TEMP
  270. | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_IOUT
  271. | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
  272. };
  273. static int isl68137_probe_child_from_dt(struct device *dev,
  274. struct device_node *child,
  275. struct isl68137_data *data)
  276. {
  277. u32 channel, rout, rtotal;
  278. int err;
  279. err = of_property_read_u32(child, "reg", &channel);
  280. if (err) {
  281. dev_err(dev, "missing reg property of %pOFn\n", child);
  282. return err;
  283. }
  284. if (channel >= data->info.pages) {
  285. dev_err(dev, "invalid reg %d of %pOFn\n", channel, child);
  286. return -EINVAL;
  287. }
  288. err = of_property_read_u32_array(child, "vout-voltage-divider",
  289. data->channel[channel].vout_voltage_divider,
  290. ARRAY_SIZE(data->channel[channel].vout_voltage_divider));
  291. if (err && err != -EINVAL) {
  292. dev_err(dev,
  293. "malformed vout-voltage-divider value for channel %d\n",
  294. channel);
  295. return err;
  296. }
  297. rout = data->channel[channel].vout_voltage_divider[0];
  298. rtotal = data->channel[channel].vout_voltage_divider[1];
  299. if (rout == 0) {
  300. dev_err(dev,
  301. "Voltage divider output resistance must be greater than 0\n");
  302. return -EINVAL;
  303. }
  304. if (rtotal < rout) {
  305. dev_err(dev,
  306. "Voltage divider total resistance is less than output resistance\n");
  307. return -EINVAL;
  308. }
  309. return 0;
  310. }
  311. static int isl68137_probe_from_dt(struct device *dev,
  312. struct isl68137_data *data)
  313. {
  314. const struct device_node *np = dev->of_node;
  315. int err;
  316. for_each_child_of_node_scoped(np, child) {
  317. if (strcmp(child->name, "channel"))
  318. continue;
  319. err = isl68137_probe_child_from_dt(dev, child, data);
  320. if (err)
  321. return err;
  322. }
  323. return 0;
  324. }
  325. static int isl68137_probe(struct i2c_client *client)
  326. {
  327. struct device *dev = &client->dev;
  328. struct pmbus_driver_info *info;
  329. struct isl68137_data *data;
  330. int i, err;
  331. data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
  332. if (!data)
  333. return -ENOMEM;
  334. /*
  335. * Initialize all voltage dividers to Rout=1 and Rtotal=1 to simplify
  336. * logic in PMBus word read/write functions
  337. */
  338. for (i = 0; i < MAX_CHANNELS; i++)
  339. memset(data->channel[i].vout_voltage_divider,
  340. 1,
  341. sizeof(data->channel[i].vout_voltage_divider));
  342. memcpy(&data->info, &raa_dmpvr_info, sizeof(data->info));
  343. info = &data->info;
  344. switch (i2c_match_id(raa_dmpvr_id, client)->driver_data) {
  345. case raa_dmpvr1_2rail:
  346. info->pages = 2;
  347. info->R[PSC_VOLTAGE_IN] = 3;
  348. info->func[0] &= ~PMBUS_HAVE_VMON;
  349. info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
  350. | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
  351. | PMBUS_HAVE_POUT;
  352. info->read_word_data = raa_dmpvr2_read_word_data;
  353. info->write_word_data = raa_dmpvr2_write_word_data;
  354. info->groups = isl68137_attribute_groups;
  355. break;
  356. case raa_dmpvr2_1rail:
  357. info->pages = 1;
  358. info->read_word_data = raa_dmpvr2_read_word_data;
  359. info->write_word_data = raa_dmpvr2_write_word_data;
  360. break;
  361. case raa_dmpvr2_2rail_nontc:
  362. info->func[0] &= ~PMBUS_HAVE_TEMP3;
  363. info->func[1] &= ~PMBUS_HAVE_TEMP3;
  364. fallthrough;
  365. case raa_dmpvr2_2rail:
  366. info->pages = 2;
  367. info->read_word_data = raa_dmpvr2_read_word_data;
  368. info->write_word_data = raa_dmpvr2_write_word_data;
  369. break;
  370. case raa_dmpvr2_2rail_pmbus:
  371. info->format[PSC_VOLTAGE_IN] = linear,
  372. info->format[PSC_VOLTAGE_OUT] = linear,
  373. info->format[PSC_CURRENT_IN] = linear;
  374. info->format[PSC_CURRENT_OUT] = linear;
  375. info->format[PSC_POWER] = linear;
  376. info->format[PSC_TEMPERATURE] = linear;
  377. info->pages = 2;
  378. info->read_word_data = raa_dmpvr2_read_word_data;
  379. info->write_word_data = raa_dmpvr2_write_word_data;
  380. break;
  381. case raa_dmpvr2_3rail:
  382. info->read_word_data = raa_dmpvr2_read_word_data;
  383. info->write_word_data = raa_dmpvr2_write_word_data;
  384. break;
  385. case raa_dmpvr2_hv:
  386. info->pages = 1;
  387. info->R[PSC_VOLTAGE_IN] = 1;
  388. info->m[PSC_VOLTAGE_OUT] = 2;
  389. info->R[PSC_VOLTAGE_OUT] = 2;
  390. info->m[PSC_CURRENT_IN] = 2;
  391. info->m[PSC_POWER] = 2;
  392. info->R[PSC_POWER] = -1;
  393. info->read_word_data = raa_dmpvr2_read_word_data;
  394. info->write_word_data = raa_dmpvr2_write_word_data;
  395. break;
  396. default:
  397. return -ENODEV;
  398. }
  399. err = isl68137_probe_from_dt(dev, data);
  400. if (err)
  401. return err;
  402. return pmbus_do_probe(client, info);
  403. }
  404. static const struct i2c_device_id raa_dmpvr_id[] = {
  405. {"isl68137", raa_dmpvr1_2rail},
  406. {"isl68220", raa_dmpvr2_2rail},
  407. {"isl68221", raa_dmpvr2_3rail},
  408. {"isl68222", raa_dmpvr2_2rail},
  409. {"isl68223", raa_dmpvr2_2rail},
  410. {"isl68224", raa_dmpvr2_3rail},
  411. {"isl68225", raa_dmpvr2_2rail},
  412. {"isl68226", raa_dmpvr2_3rail},
  413. {"isl68227", raa_dmpvr2_1rail},
  414. {"isl68229", raa_dmpvr2_3rail},
  415. {"isl68233", raa_dmpvr2_2rail},
  416. {"isl68239", raa_dmpvr2_3rail},
  417. {"isl69222", raa_dmpvr2_2rail},
  418. {"isl69223", raa_dmpvr2_3rail},
  419. {"isl69224", raa_dmpvr2_2rail},
  420. {"isl69225", raa_dmpvr2_2rail},
  421. {"isl69227", raa_dmpvr2_3rail},
  422. {"isl69228", raa_dmpvr2_3rail},
  423. {"isl69234", raa_dmpvr2_2rail},
  424. {"isl69236", raa_dmpvr2_2rail},
  425. {"isl69239", raa_dmpvr2_3rail},
  426. {"isl69242", raa_dmpvr2_2rail},
  427. {"isl69243", raa_dmpvr2_1rail},
  428. {"isl69247", raa_dmpvr2_2rail},
  429. {"isl69248", raa_dmpvr2_2rail},
  430. {"isl69254", raa_dmpvr2_2rail},
  431. {"isl69255", raa_dmpvr2_2rail},
  432. {"isl69256", raa_dmpvr2_2rail},
  433. {"isl69259", raa_dmpvr2_2rail},
  434. {"isl69260", raa_dmpvr2_2rail},
  435. {"isl69268", raa_dmpvr2_2rail},
  436. {"isl69269", raa_dmpvr2_3rail},
  437. {"isl69298", raa_dmpvr2_2rail},
  438. {"raa228000", raa_dmpvr2_hv},
  439. {"raa228004", raa_dmpvr2_hv},
  440. {"raa228006", raa_dmpvr2_hv},
  441. {"raa228228", raa_dmpvr2_2rail_nontc},
  442. {"raa228244", raa_dmpvr2_2rail_nontc},
  443. {"raa228246", raa_dmpvr2_2rail_nontc},
  444. {"raa229001", raa_dmpvr2_2rail},
  445. {"raa229004", raa_dmpvr2_2rail},
  446. {"raa229141", raa_dmpvr2_2rail_pmbus},
  447. {"raa229621", raa_dmpvr2_2rail},
  448. {}
  449. };
  450. MODULE_DEVICE_TABLE(i2c, raa_dmpvr_id);
  451. static const struct of_device_id isl68137_of_match[] = {
  452. { .compatible = "isil,isl68137", .data = (void *)raa_dmpvr1_2rail },
  453. { .compatible = "renesas,isl68220", .data = (void *)raa_dmpvr2_2rail },
  454. { .compatible = "renesas,isl68221", .data = (void *)raa_dmpvr2_3rail },
  455. { .compatible = "renesas,isl68222", .data = (void *)raa_dmpvr2_2rail },
  456. { .compatible = "renesas,isl68223", .data = (void *)raa_dmpvr2_2rail },
  457. { .compatible = "renesas,isl68224", .data = (void *)raa_dmpvr2_3rail },
  458. { .compatible = "renesas,isl68225", .data = (void *)raa_dmpvr2_2rail },
  459. { .compatible = "renesas,isl68226", .data = (void *)raa_dmpvr2_3rail },
  460. { .compatible = "renesas,isl68227", .data = (void *)raa_dmpvr2_1rail },
  461. { .compatible = "renesas,isl68229", .data = (void *)raa_dmpvr2_3rail },
  462. { .compatible = "renesas,isl68233", .data = (void *)raa_dmpvr2_2rail },
  463. { .compatible = "renesas,isl68239", .data = (void *)raa_dmpvr2_3rail },
  464. { .compatible = "renesas,isl69222", .data = (void *)raa_dmpvr2_2rail },
  465. { .compatible = "renesas,isl69223", .data = (void *)raa_dmpvr2_3rail },
  466. { .compatible = "renesas,isl69224", .data = (void *)raa_dmpvr2_2rail },
  467. { .compatible = "renesas,isl69225", .data = (void *)raa_dmpvr2_2rail },
  468. { .compatible = "renesas,isl69227", .data = (void *)raa_dmpvr2_3rail },
  469. { .compatible = "renesas,isl69228", .data = (void *)raa_dmpvr2_3rail },
  470. { .compatible = "renesas,isl69234", .data = (void *)raa_dmpvr2_2rail },
  471. { .compatible = "renesas,isl69236", .data = (void *)raa_dmpvr2_2rail },
  472. { .compatible = "renesas,isl69239", .data = (void *)raa_dmpvr2_3rail },
  473. { .compatible = "renesas,isl69242", .data = (void *)raa_dmpvr2_2rail },
  474. { .compatible = "renesas,isl69243", .data = (void *)raa_dmpvr2_1rail },
  475. { .compatible = "renesas,isl69247", .data = (void *)raa_dmpvr2_2rail },
  476. { .compatible = "renesas,isl69248", .data = (void *)raa_dmpvr2_2rail },
  477. { .compatible = "renesas,isl69254", .data = (void *)raa_dmpvr2_2rail },
  478. { .compatible = "renesas,isl69255", .data = (void *)raa_dmpvr2_2rail },
  479. { .compatible = "renesas,isl69256", .data = (void *)raa_dmpvr2_2rail },
  480. { .compatible = "renesas,isl69259", .data = (void *)raa_dmpvr2_2rail },
  481. { .compatible = "isil,isl69260", .data = (void *)raa_dmpvr2_2rail },
  482. { .compatible = "renesas,isl69268", .data = (void *)raa_dmpvr2_2rail },
  483. { .compatible = "isil,isl69269", .data = (void *)raa_dmpvr2_3rail },
  484. { .compatible = "renesas,isl69298", .data = (void *)raa_dmpvr2_2rail },
  485. { .compatible = "renesas,raa228000", .data = (void *)raa_dmpvr2_hv },
  486. { .compatible = "renesas,raa228004", .data = (void *)raa_dmpvr2_hv },
  487. { .compatible = "renesas,raa228006", .data = (void *)raa_dmpvr2_hv },
  488. { .compatible = "renesas,raa228228", .data = (void *)raa_dmpvr2_2rail_nontc },
  489. { .compatible = "renesas,raa228244", .data = (void *)raa_dmpvr2_2rail_nontc },
  490. { .compatible = "renesas,raa228246", .data = (void *)raa_dmpvr2_2rail_nontc },
  491. { .compatible = "renesas,raa229001", .data = (void *)raa_dmpvr2_2rail },
  492. { .compatible = "renesas,raa229004", .data = (void *)raa_dmpvr2_2rail },
  493. { .compatible = "renesas,raa229621", .data = (void *)raa_dmpvr2_2rail },
  494. { },
  495. };
  496. MODULE_DEVICE_TABLE(of, isl68137_of_match);
  497. /* This is the driver that will be inserted */
  498. static struct i2c_driver isl68137_driver = {
  499. .driver = {
  500. .name = "isl68137",
  501. .of_match_table = isl68137_of_match,
  502. },
  503. .probe = isl68137_probe,
  504. .id_table = raa_dmpvr_id,
  505. };
  506. module_i2c_driver(isl68137_driver);
  507. MODULE_AUTHOR("Maxim Sloyko <maxims@google.com>");
  508. MODULE_DESCRIPTION("PMBus driver for Renesas digital multiphase voltage regulators");
  509. MODULE_LICENSE("GPL");
  510. MODULE_IMPORT_NS("PMBUS");