max6697.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (c) 2012 Guenter Roeck <linux@roeck-us.net>
  4. *
  5. * based on max1668.c
  6. * Copyright (c) 2011 David George <david.george@ska.ac.za>
  7. */
  8. #include <linux/bitfield.h>
  9. #include <linux/bits.h>
  10. #include <linux/err.h>
  11. #include <linux/hwmon.h>
  12. #include <linux/i2c.h>
  13. #include <linux/init.h>
  14. #include <linux/module.h>
  15. #include <linux/of.h>
  16. #include <linux/regmap.h>
  17. #include <linux/slab.h>
  18. enum chips { max6581, max6602, max6622, max6636, max6689, max6693, max6694,
  19. max6697, max6698, max6699 };
  20. /* Report local sensor as temp1 */
  21. static const u8 MAX6697_REG_TEMP[] = {
  22. 0x07, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08 };
  23. static const u8 MAX6697_REG_TEMP_EXT[] = {
  24. 0x57, 0x09, 0x52, 0x53, 0x54, 0x55, 0x56, 0 };
  25. static const u8 MAX6697_REG_MAX[] = {
  26. 0x17, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x18 };
  27. static const u8 MAX6697_REG_CRIT[] = {
  28. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27 };
  29. #define MAX6697_REG_MIN 0x30
  30. /*
  31. * Map device tree / internal register bit map to chip bit map.
  32. * Applies to alert register and over-temperature register.
  33. */
  34. #define MAX6697_EXTERNAL_MASK_DT GENMASK(7, 1)
  35. #define MAX6697_LOCAL_MASK_DT BIT(0)
  36. #define MAX6697_EXTERNAL_MASK_CHIP GENMASK(6, 0)
  37. #define MAX6697_LOCAL_MASK_CHIP BIT(7)
  38. /* alert - local channel is in bit 6 */
  39. #define MAX6697_ALERT_MAP_BITS(reg) ((((reg) & 0x7e) >> 1) | \
  40. (((reg) & 0x01) << 6) | ((reg) & 0x80))
  41. /* over-temperature - local channel is in bit 7 */
  42. #define MAX6697_OVERT_MAP_BITS(reg) \
  43. (FIELD_PREP(MAX6697_EXTERNAL_MASK_CHIP, FIELD_GET(MAX6697_EXTERNAL_MASK_DT, reg)) | \
  44. FIELD_PREP(MAX6697_LOCAL_MASK_CHIP, FIELD_GET(MAX6697_LOCAL_MASK_DT, reg)))
  45. #define MAX6697_REG_STAT_ALARM 0x44
  46. #define MAX6697_REG_STAT_CRIT 0x45
  47. #define MAX6697_REG_STAT_FAULT 0x46
  48. #define MAX6697_REG_STAT_MIN_ALARM 0x47
  49. #define MAX6697_REG_CONFIG 0x41
  50. #define MAX6581_CONF_EXTENDED BIT(1)
  51. #define MAX6693_CONF_BETA BIT(2)
  52. #define MAX6697_CONF_RESISTANCE BIT(3)
  53. #define MAX6697_CONF_TIMEOUT BIT(5)
  54. #define MAX6697_REG_ALERT_MASK 0x42
  55. #define MAX6697_REG_OVERT_MASK 0x43
  56. #define MAX6581_REG_RESISTANCE 0x4a
  57. #define MAX6581_REG_IDEALITY 0x4b
  58. #define MAX6581_REG_IDEALITY_SELECT 0x4c
  59. #define MAX6581_REG_OFFSET 0x4d
  60. #define MAX6581_REG_OFFSET_SELECT 0x4e
  61. #define MAX6581_OFFSET_MIN -31750
  62. #define MAX6581_OFFSET_MAX 31750
  63. #define MAX6697_CONV_TIME 156 /* ms per channel, worst case */
  64. struct max6697_chip_data {
  65. int channels;
  66. u32 have_ext;
  67. u32 have_crit;
  68. u32 have_fault;
  69. u8 valid_conf;
  70. };
  71. struct max6697_data {
  72. struct regmap *regmap;
  73. enum chips type;
  74. const struct max6697_chip_data *chip;
  75. int temp_offset; /* in degrees C */
  76. #define MAX6697_TEMP_INPUT 0
  77. #define MAX6697_TEMP_EXT 1
  78. #define MAX6697_TEMP_MAX 2
  79. #define MAX6697_TEMP_CRIT 3
  80. u32 alarms;
  81. };
  82. static const struct max6697_chip_data max6697_chip_data[] = {
  83. [max6581] = {
  84. .channels = 8,
  85. .have_crit = 0xff,
  86. .have_ext = 0x7f,
  87. .have_fault = 0xfe,
  88. .valid_conf = MAX6581_CONF_EXTENDED | MAX6697_CONF_TIMEOUT,
  89. },
  90. [max6602] = {
  91. .channels = 5,
  92. .have_crit = 0x12,
  93. .have_ext = 0x02,
  94. .have_fault = 0x1e,
  95. .valid_conf = MAX6697_CONF_RESISTANCE | MAX6697_CONF_TIMEOUT,
  96. },
  97. [max6622] = {
  98. .channels = 5,
  99. .have_crit = 0x12,
  100. .have_ext = 0x02,
  101. .have_fault = 0x1e,
  102. .valid_conf = MAX6697_CONF_RESISTANCE | MAX6697_CONF_TIMEOUT,
  103. },
  104. [max6636] = {
  105. .channels = 7,
  106. .have_crit = 0x72,
  107. .have_ext = 0x02,
  108. .have_fault = 0x7e,
  109. .valid_conf = MAX6697_CONF_RESISTANCE | MAX6697_CONF_TIMEOUT,
  110. },
  111. [max6689] = {
  112. .channels = 7,
  113. .have_crit = 0x72,
  114. .have_ext = 0x02,
  115. .have_fault = 0x7e,
  116. .valid_conf = MAX6697_CONF_RESISTANCE | MAX6697_CONF_TIMEOUT,
  117. },
  118. [max6693] = {
  119. .channels = 7,
  120. .have_crit = 0x72,
  121. .have_ext = 0x02,
  122. .have_fault = 0x7e,
  123. .valid_conf = MAX6697_CONF_RESISTANCE | MAX6693_CONF_BETA |
  124. MAX6697_CONF_TIMEOUT,
  125. },
  126. [max6694] = {
  127. .channels = 5,
  128. .have_crit = 0x12,
  129. .have_ext = 0x02,
  130. .have_fault = 0x1e,
  131. .valid_conf = MAX6697_CONF_RESISTANCE | MAX6693_CONF_BETA |
  132. MAX6697_CONF_TIMEOUT,
  133. },
  134. [max6697] = {
  135. .channels = 7,
  136. .have_crit = 0x72,
  137. .have_ext = 0x02,
  138. .have_fault = 0x7e,
  139. .valid_conf = MAX6697_CONF_RESISTANCE | MAX6697_CONF_TIMEOUT,
  140. },
  141. [max6698] = {
  142. .channels = 7,
  143. .have_crit = 0x72,
  144. .have_ext = 0x02,
  145. .have_fault = 0x0e,
  146. .valid_conf = MAX6697_CONF_RESISTANCE | MAX6697_CONF_TIMEOUT,
  147. },
  148. [max6699] = {
  149. .channels = 5,
  150. .have_crit = 0x12,
  151. .have_ext = 0x02,
  152. .have_fault = 0x1e,
  153. .valid_conf = MAX6697_CONF_RESISTANCE | MAX6697_CONF_TIMEOUT,
  154. },
  155. };
  156. static int max6697_alarm_channel_map(int channel)
  157. {
  158. switch (channel) {
  159. case 0:
  160. return 6;
  161. case 7:
  162. return 7;
  163. default:
  164. return channel - 1;
  165. }
  166. }
  167. static int max6697_read(struct device *dev, enum hwmon_sensor_types type,
  168. u32 attr, int channel, long *val)
  169. {
  170. unsigned int offset_regs[2] = { MAX6581_REG_OFFSET_SELECT, MAX6581_REG_OFFSET };
  171. unsigned int temp_regs[2] = { MAX6697_REG_TEMP[channel],
  172. MAX6697_REG_TEMP_EXT[channel] };
  173. struct max6697_data *data = dev_get_drvdata(dev);
  174. struct regmap *regmap = data->regmap;
  175. u8 regdata[2] = { };
  176. u32 regval;
  177. int ret;
  178. switch (attr) {
  179. case hwmon_temp_input:
  180. ret = regmap_multi_reg_read(regmap, temp_regs, regdata,
  181. data->chip->have_ext & BIT(channel) ? 2 : 1);
  182. if (ret)
  183. return ret;
  184. *val = (((regdata[0] - data->temp_offset) << 3) | (regdata[1] >> 5)) * 125;
  185. break;
  186. case hwmon_temp_max:
  187. ret = regmap_read(regmap, MAX6697_REG_MAX[channel], &regval);
  188. if (ret)
  189. return ret;
  190. *val = ((int)regval - data->temp_offset) * 1000;
  191. break;
  192. case hwmon_temp_crit:
  193. ret = regmap_read(regmap, MAX6697_REG_CRIT[channel], &regval);
  194. if (ret)
  195. return ret;
  196. *val = ((int)regval - data->temp_offset) * 1000;
  197. break;
  198. case hwmon_temp_min:
  199. ret = regmap_read(regmap, MAX6697_REG_MIN, &regval);
  200. if (ret)
  201. return ret;
  202. *val = ((int)regval - data->temp_offset) * 1000;
  203. break;
  204. case hwmon_temp_offset:
  205. ret = regmap_multi_reg_read(regmap, offset_regs, regdata, 2);
  206. if (ret)
  207. return ret;
  208. if (!(regdata[0] & BIT(channel - 1)))
  209. regdata[1] = 0;
  210. *val = sign_extend32(regdata[1], 7) * 250;
  211. break;
  212. case hwmon_temp_fault:
  213. ret = regmap_read(regmap, MAX6697_REG_STAT_FAULT, &regval);
  214. if (ret)
  215. return ret;
  216. if (data->type == max6581)
  217. *val = !!(regval & BIT(channel - 1));
  218. else
  219. *val = !!(regval & BIT(channel));
  220. break;
  221. case hwmon_temp_crit_alarm:
  222. ret = regmap_read(regmap, MAX6697_REG_STAT_CRIT, &regval);
  223. if (ret)
  224. return ret;
  225. /*
  226. * In the MAX6581 datasheet revision 0 to 3, the local channel
  227. * overtemperature status is reported in bit 6 of register 0x45,
  228. * and the overtemperature status for remote channel 7 is
  229. * reported in bit 7. In Revision 4 and later, the local channel
  230. * overtemperature status is reported in bit 7, and the remote
  231. * channel 7 overtemperature status is reported in bit 6. A real
  232. * chip was found to match the functionality documented in
  233. * Revision 4 and later.
  234. */
  235. *val = !!(regval & BIT(channel ? channel - 1 : 7));
  236. break;
  237. case hwmon_temp_max_alarm:
  238. ret = regmap_read(regmap, MAX6697_REG_STAT_ALARM, &regval);
  239. if (ret)
  240. return ret;
  241. *val = !!(regval & BIT(max6697_alarm_channel_map(channel)));
  242. break;
  243. case hwmon_temp_min_alarm:
  244. ret = regmap_read(regmap, MAX6697_REG_STAT_MIN_ALARM, &regval);
  245. if (ret)
  246. return ret;
  247. *val = !!(regval & BIT(max6697_alarm_channel_map(channel)));
  248. break;
  249. default:
  250. return -EOPNOTSUPP;
  251. }
  252. return 0;
  253. }
  254. static int max6697_write(struct device *dev, enum hwmon_sensor_types type,
  255. u32 attr, int channel, long val)
  256. {
  257. struct max6697_data *data = dev_get_drvdata(dev);
  258. struct regmap *regmap = data->regmap;
  259. int ret;
  260. switch (attr) {
  261. case hwmon_temp_max:
  262. val = clamp_val(val, -1000000, 1000000); /* prevent underflow */
  263. val = DIV_ROUND_CLOSEST(val, 1000) + data->temp_offset;
  264. val = clamp_val(val, 0, data->type == max6581 ? 255 : 127);
  265. return regmap_write(regmap, MAX6697_REG_MAX[channel], val);
  266. case hwmon_temp_crit:
  267. val = clamp_val(val, -1000000, 1000000); /* prevent underflow */
  268. val = DIV_ROUND_CLOSEST(val, 1000) + data->temp_offset;
  269. val = clamp_val(val, 0, data->type == max6581 ? 255 : 127);
  270. return regmap_write(regmap, MAX6697_REG_CRIT[channel], val);
  271. case hwmon_temp_min:
  272. val = clamp_val(val, -1000000, 1000000); /* prevent underflow */
  273. val = DIV_ROUND_CLOSEST(val, 1000) + data->temp_offset;
  274. val = clamp_val(val, 0, 255);
  275. return regmap_write(regmap, MAX6697_REG_MIN, val);
  276. case hwmon_temp_offset:
  277. val = clamp_val(val, MAX6581_OFFSET_MIN, MAX6581_OFFSET_MAX);
  278. val = DIV_ROUND_CLOSEST(val, 250);
  279. if (!val) { /* disable this (and only this) channel */
  280. ret = regmap_clear_bits(regmap, MAX6581_REG_OFFSET_SELECT,
  281. BIT(channel - 1));
  282. } else {
  283. /* enable channel and update offset */
  284. ret = regmap_set_bits(regmap, MAX6581_REG_OFFSET_SELECT,
  285. BIT(channel - 1));
  286. if (ret)
  287. return ret;
  288. ret = regmap_write(regmap, MAX6581_REG_OFFSET, val);
  289. }
  290. return ret;
  291. default:
  292. return -EOPNOTSUPP;
  293. }
  294. }
  295. static umode_t max6697_is_visible(const void *_data, enum hwmon_sensor_types type,
  296. u32 attr, int channel)
  297. {
  298. const struct max6697_data *data = _data;
  299. const struct max6697_chip_data *chip = data->chip;
  300. if (channel >= chip->channels)
  301. return 0;
  302. switch (attr) {
  303. case hwmon_temp_max:
  304. return 0644;
  305. case hwmon_temp_input:
  306. case hwmon_temp_max_alarm:
  307. return 0444;
  308. case hwmon_temp_min:
  309. if (data->type == max6581)
  310. return channel ? 0444 : 0644;
  311. break;
  312. case hwmon_temp_min_alarm:
  313. if (data->type == max6581)
  314. return 0444;
  315. break;
  316. case hwmon_temp_crit:
  317. if (chip->have_crit & BIT(channel))
  318. return 0644;
  319. break;
  320. case hwmon_temp_crit_alarm:
  321. if (chip->have_crit & BIT(channel))
  322. return 0444;
  323. break;
  324. case hwmon_temp_fault:
  325. if (chip->have_fault & BIT(channel))
  326. return 0444;
  327. break;
  328. case hwmon_temp_offset:
  329. if (data->type == max6581 && channel)
  330. return 0644;
  331. break;
  332. default:
  333. break;
  334. }
  335. return 0;
  336. }
  337. /* Return 0 if detection is successful, -ENODEV otherwise */
  338. static const struct hwmon_channel_info * const max6697_info[] = {
  339. HWMON_CHANNEL_INFO(temp,
  340. HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT |
  341. HWMON_T_MIN | HWMON_T_MIN_ALARM |
  342. HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM,
  343. HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT |
  344. HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM |
  345. HWMON_T_MIN | HWMON_T_MIN_ALARM |
  346. HWMON_T_FAULT | HWMON_T_OFFSET,
  347. HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT |
  348. HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM |
  349. HWMON_T_MIN | HWMON_T_MIN_ALARM |
  350. HWMON_T_FAULT | HWMON_T_OFFSET,
  351. HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT |
  352. HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM |
  353. HWMON_T_MIN | HWMON_T_MIN_ALARM |
  354. HWMON_T_FAULT | HWMON_T_OFFSET,
  355. HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT |
  356. HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM |
  357. HWMON_T_MIN | HWMON_T_MIN_ALARM |
  358. HWMON_T_FAULT | HWMON_T_OFFSET,
  359. HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT |
  360. HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM |
  361. HWMON_T_MIN | HWMON_T_MIN_ALARM |
  362. HWMON_T_FAULT | HWMON_T_OFFSET,
  363. HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT |
  364. HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM |
  365. HWMON_T_MIN | HWMON_T_MIN_ALARM |
  366. HWMON_T_FAULT | HWMON_T_OFFSET,
  367. HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT |
  368. HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM |
  369. HWMON_T_MIN | HWMON_T_MIN_ALARM |
  370. HWMON_T_FAULT | HWMON_T_OFFSET),
  371. NULL
  372. };
  373. static const struct hwmon_ops max6697_hwmon_ops = {
  374. .is_visible = max6697_is_visible,
  375. .read = max6697_read,
  376. .write = max6697_write,
  377. };
  378. static const struct hwmon_chip_info max6697_chip_info = {
  379. .ops = &max6697_hwmon_ops,
  380. .info = max6697_info,
  381. };
  382. static int max6697_config_of(struct device_node *node, struct max6697_data *data)
  383. {
  384. const struct max6697_chip_data *chip = data->chip;
  385. struct regmap *regmap = data->regmap;
  386. int ret, confreg;
  387. u32 vals[2];
  388. confreg = 0;
  389. if (of_property_read_bool(node, "smbus-timeout-disable") &&
  390. (chip->valid_conf & MAX6697_CONF_TIMEOUT)) {
  391. confreg |= MAX6697_CONF_TIMEOUT;
  392. }
  393. if (of_property_read_bool(node, "extended-range-enable") &&
  394. (chip->valid_conf & MAX6581_CONF_EXTENDED)) {
  395. confreg |= MAX6581_CONF_EXTENDED;
  396. data->temp_offset = 64;
  397. }
  398. if (of_property_read_bool(node, "beta-compensation-enable") &&
  399. (chip->valid_conf & MAX6693_CONF_BETA)) {
  400. confreg |= MAX6693_CONF_BETA;
  401. }
  402. if (of_property_read_u32(node, "alert-mask", vals))
  403. vals[0] = 0;
  404. ret = regmap_write(regmap, MAX6697_REG_ALERT_MASK,
  405. MAX6697_ALERT_MAP_BITS(vals[0]));
  406. if (ret)
  407. return ret;
  408. if (of_property_read_u32(node, "over-temperature-mask", vals))
  409. vals[0] = 0;
  410. ret = regmap_write(regmap, MAX6697_REG_OVERT_MASK,
  411. MAX6697_OVERT_MAP_BITS(vals[0]));
  412. if (ret)
  413. return ret;
  414. if (data->type != max6581) {
  415. if (of_property_read_bool(node, "resistance-cancellation") &&
  416. chip->valid_conf & MAX6697_CONF_RESISTANCE) {
  417. confreg |= MAX6697_CONF_RESISTANCE;
  418. }
  419. } else {
  420. if (of_property_read_u32(node, "resistance-cancellation", &vals[0])) {
  421. if (of_property_read_bool(node, "resistance-cancellation"))
  422. vals[0] = 0xfe;
  423. else
  424. vals[0] = 0;
  425. }
  426. vals[0] &= 0xfe;
  427. ret = regmap_write(regmap, MAX6581_REG_RESISTANCE, vals[0] >> 1);
  428. if (ret < 0)
  429. return ret;
  430. if (of_property_read_u32_array(node, "transistor-ideality", vals, 2)) {
  431. vals[0] = 0;
  432. vals[1] = 0;
  433. }
  434. ret = regmap_write(regmap, MAX6581_REG_IDEALITY, vals[1]);
  435. if (ret < 0)
  436. return ret;
  437. ret = regmap_write(regmap, MAX6581_REG_IDEALITY_SELECT,
  438. (vals[0] & 0xfe) >> 1);
  439. if (ret < 0)
  440. return ret;
  441. }
  442. return regmap_write(regmap, MAX6697_REG_CONFIG, confreg);
  443. }
  444. static int max6697_init_chip(struct device_node *np, struct max6697_data *data)
  445. {
  446. unsigned int reg;
  447. int ret;
  448. /*
  449. * Don't touch configuration if there is no devicetree configuration.
  450. * If that is the case, use the current chip configuration.
  451. */
  452. if (!np) {
  453. struct regmap *regmap = data->regmap;
  454. ret = regmap_read(regmap, MAX6697_REG_CONFIG, &reg);
  455. if (ret < 0)
  456. return ret;
  457. if (data->type == max6581) {
  458. if (reg & MAX6581_CONF_EXTENDED)
  459. data->temp_offset = 64;
  460. ret = regmap_read(regmap, MAX6581_REG_RESISTANCE, &reg);
  461. }
  462. } else {
  463. ret = max6697_config_of(np, data);
  464. }
  465. return ret;
  466. }
  467. static bool max6697_volatile_reg(struct device *dev, unsigned int reg)
  468. {
  469. switch (reg) {
  470. case 0x00 ... 0x09: /* temperature high bytes */
  471. case 0x44 ... 0x47: /* status */
  472. case 0x51 ... 0x58: /* temperature low bytes */
  473. return true;
  474. default:
  475. return false;
  476. }
  477. }
  478. static bool max6697_writeable_reg(struct device *dev, unsigned int reg)
  479. {
  480. return reg != 0x0a && reg != 0x0f && !max6697_volatile_reg(dev, reg);
  481. }
  482. static const struct regmap_config max6697_regmap_config = {
  483. .reg_bits = 8,
  484. .val_bits = 8,
  485. .max_register = 0x58,
  486. .writeable_reg = max6697_writeable_reg,
  487. .volatile_reg = max6697_volatile_reg,
  488. .cache_type = REGCACHE_MAPLE,
  489. };
  490. static int max6697_probe(struct i2c_client *client)
  491. {
  492. struct device *dev = &client->dev;
  493. struct max6697_data *data;
  494. struct device *hwmon_dev;
  495. struct regmap *regmap;
  496. int err;
  497. regmap = devm_regmap_init_i2c(client, &max6697_regmap_config);
  498. if (IS_ERR(regmap))
  499. return PTR_ERR(regmap);
  500. data = devm_kzalloc(dev, sizeof(struct max6697_data), GFP_KERNEL);
  501. if (!data)
  502. return -ENOMEM;
  503. data->regmap = regmap;
  504. data->type = (uintptr_t)i2c_get_match_data(client);
  505. data->chip = &max6697_chip_data[data->type];
  506. err = max6697_init_chip(client->dev.of_node, data);
  507. if (err)
  508. return err;
  509. hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, data,
  510. &max6697_chip_info, NULL);
  511. return PTR_ERR_OR_ZERO(hwmon_dev);
  512. }
  513. static const struct i2c_device_id max6697_id[] = {
  514. { "max6581", max6581 },
  515. { "max6602", max6602 },
  516. { "max6622", max6622 },
  517. { "max6636", max6636 },
  518. { "max6689", max6689 },
  519. { "max6693", max6693 },
  520. { "max6694", max6694 },
  521. { "max6697", max6697 },
  522. { "max6698", max6698 },
  523. { "max6699", max6699 },
  524. { }
  525. };
  526. MODULE_DEVICE_TABLE(i2c, max6697_id);
  527. static const struct of_device_id __maybe_unused max6697_of_match[] = {
  528. {
  529. .compatible = "maxim,max6581",
  530. .data = (void *)max6581
  531. },
  532. {
  533. .compatible = "maxim,max6602",
  534. .data = (void *)max6602
  535. },
  536. {
  537. .compatible = "maxim,max6622",
  538. .data = (void *)max6622
  539. },
  540. {
  541. .compatible = "maxim,max6636",
  542. .data = (void *)max6636
  543. },
  544. {
  545. .compatible = "maxim,max6689",
  546. .data = (void *)max6689
  547. },
  548. {
  549. .compatible = "maxim,max6693",
  550. .data = (void *)max6693
  551. },
  552. {
  553. .compatible = "maxim,max6694",
  554. .data = (void *)max6694
  555. },
  556. {
  557. .compatible = "maxim,max6697",
  558. .data = (void *)max6697
  559. },
  560. {
  561. .compatible = "maxim,max6698",
  562. .data = (void *)max6698
  563. },
  564. {
  565. .compatible = "maxim,max6699",
  566. .data = (void *)max6699
  567. },
  568. { },
  569. };
  570. MODULE_DEVICE_TABLE(of, max6697_of_match);
  571. static struct i2c_driver max6697_driver = {
  572. .driver = {
  573. .name = "max6697",
  574. .of_match_table = of_match_ptr(max6697_of_match),
  575. },
  576. .probe = max6697_probe,
  577. .id_table = max6697_id,
  578. };
  579. module_i2c_driver(max6697_driver);
  580. MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
  581. MODULE_DESCRIPTION("MAX6697 temperature sensor driver");
  582. MODULE_LICENSE("GPL");