tmp464.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /* Driver for the Texas Instruments TMP464 SMBus temperature sensor IC.
  3. * Supported models: TMP464, TMP468
  4. * Copyright (C) 2022 Agathe Porte <[email protected]>
  5. * Preliminary support by:
  6. * Lionel Pouliquen <[email protected]>
  7. */
  8. #include <linux/err.h>
  9. #include <linux/hwmon.h>
  10. #include <linux/i2c.h>
  11. #include <linux/init.h>
  12. #include <linux/module.h>
  13. #include <linux/mutex.h>
  14. #include <linux/of_device.h>
  15. #include <linux/regmap.h>
  16. #include <linux/slab.h>
  17. /* Addresses to scan */
  18. static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, I2C_CLIENT_END };
  19. #define TMP464_NUM_CHANNELS 5 /* chan 0 is internal, 1-4 are remote */
  20. #define TMP468_NUM_CHANNELS 9 /* chan 0 is internal, 1-8 are remote */
  21. #define MAX_CHANNELS 9
  22. #define TMP464_TEMP_REG(channel) (channel)
  23. #define TMP464_TEMP_OFFSET_REG(channel) (0x40 + ((channel) - 1) * 8)
  24. #define TMP464_N_FACTOR_REG(channel) (0x41 + ((channel) - 1) * 8)
  25. static const u8 TMP464_THERM_LIMIT[MAX_CHANNELS] = {
  26. 0x39, 0x42, 0x4A, 0x52, 0x5A, 0x62, 0x6a, 0x72, 0x7a };
  27. static const u8 TMP464_THERM2_LIMIT[MAX_CHANNELS] = {
  28. 0x3A, 0x43, 0x4B, 0x53, 0x5B, 0x63, 0x6b, 0x73, 0x7b };
  29. #define TMP464_THERM_STATUS_REG 0x21
  30. #define TMP464_THERM2_STATUS_REG 0x22
  31. #define TMP464_REMOTE_OPEN_REG 0x23
  32. #define TMP464_CONFIG_REG 0x30
  33. #define TMP464_TEMP_HYST_REG 0x38
  34. #define TMP464_LOCK_REG 0xc4
  35. /* Identification */
  36. #define TMP464_MANUFACTURER_ID_REG 0xFE
  37. #define TMP464_DEVICE_ID_REG 0xFF
  38. /* Flags */
  39. #define TMP464_CONFIG_SHUTDOWN BIT(5)
  40. #define TMP464_CONFIG_RANGE 0x04
  41. #define TMP464_CONFIG_REG_REN(x) (BIT(7 + (x)))
  42. #define TMP464_CONFIG_REG_REN_MASK GENMASK(15, 7)
  43. #define TMP464_CONFIG_CONVERSION_RATE_B0 2
  44. #define TMP464_CONFIG_CONVERSION_RATE_B2 4
  45. #define TMP464_CONFIG_CONVERSION_RATE_MASK GENMASK(TMP464_CONFIG_CONVERSION_RATE_B2, \
  46. TMP464_CONFIG_CONVERSION_RATE_B0)
  47. #define TMP464_UNLOCK_VAL 0xeb19
  48. #define TMP464_LOCK_VAL 0x5ca6
  49. #define TMP464_LOCKED 0x8000
  50. /* Manufacturer / Device ID's */
  51. #define TMP464_MANUFACTURER_ID 0x5449
  52. #define TMP464_DEVICE_ID 0x1468
  53. #define TMP468_DEVICE_ID 0x0468
  54. static const struct i2c_device_id tmp464_id[] = {
  55. { "tmp464", TMP464_NUM_CHANNELS },
  56. { "tmp468", TMP468_NUM_CHANNELS },
  57. { }
  58. };
  59. MODULE_DEVICE_TABLE(i2c, tmp464_id);
  60. static const struct of_device_id __maybe_unused tmp464_of_match[] = {
  61. {
  62. .compatible = "ti,tmp464",
  63. .data = (void *)TMP464_NUM_CHANNELS
  64. },
  65. {
  66. .compatible = "ti,tmp468",
  67. .data = (void *)TMP468_NUM_CHANNELS
  68. },
  69. {},
  70. };
  71. MODULE_DEVICE_TABLE(of, tmp464_of_match);
  72. struct tmp464_channel {
  73. const char *label;
  74. bool enabled;
  75. };
  76. struct tmp464_data {
  77. struct regmap *regmap;
  78. struct mutex update_lock;
  79. int channels;
  80. s16 config_orig;
  81. u16 open_reg;
  82. unsigned long last_updated;
  83. bool valid;
  84. int update_interval;
  85. struct tmp464_channel channel[MAX_CHANNELS];
  86. };
  87. static int temp_from_reg(s16 reg)
  88. {
  89. return DIV_ROUND_CLOSEST((reg >> 3) * 625, 10);
  90. }
  91. static s16 temp_to_limit_reg(long temp)
  92. {
  93. return DIV_ROUND_CLOSEST(temp, 500) << 6;
  94. }
  95. static s16 temp_to_offset_reg(long temp)
  96. {
  97. return DIV_ROUND_CLOSEST(temp * 10, 625) << 3;
  98. }
  99. static int tmp464_enable_channels(struct tmp464_data *data)
  100. {
  101. struct regmap *regmap = data->regmap;
  102. u16 enable = 0;
  103. int i;
  104. for (i = 0; i < data->channels; i++)
  105. if (data->channel[i].enabled)
  106. enable |= TMP464_CONFIG_REG_REN(i);
  107. return regmap_update_bits(regmap, TMP464_CONFIG_REG, TMP464_CONFIG_REG_REN_MASK, enable);
  108. }
  109. static int tmp464_chip_read(struct device *dev, u32 attr, int channel, long *val)
  110. {
  111. struct tmp464_data *data = dev_get_drvdata(dev);
  112. switch (attr) {
  113. case hwmon_chip_update_interval:
  114. *val = data->update_interval;
  115. return 0;
  116. default:
  117. return -EOPNOTSUPP;
  118. }
  119. }
  120. static int tmp464_temp_read(struct device *dev, u32 attr, int channel, long *val)
  121. {
  122. struct tmp464_data *data = dev_get_drvdata(dev);
  123. struct regmap *regmap = data->regmap;
  124. unsigned int regval, regval2;
  125. int err = 0;
  126. mutex_lock(&data->update_lock);
  127. switch (attr) {
  128. case hwmon_temp_max_alarm:
  129. err = regmap_read(regmap, TMP464_THERM_STATUS_REG, &regval);
  130. if (err < 0)
  131. break;
  132. *val = !!(regval & BIT(channel + 7));
  133. break;
  134. case hwmon_temp_crit_alarm:
  135. err = regmap_read(regmap, TMP464_THERM2_STATUS_REG, &regval);
  136. if (err < 0)
  137. break;
  138. *val = !!(regval & BIT(channel + 7));
  139. break;
  140. case hwmon_temp_fault:
  141. /*
  142. * The chip clears TMP464_REMOTE_OPEN_REG after it is read
  143. * and only updates it after the next measurement cycle is
  144. * complete. That means we have to cache the value internally
  145. * for one measurement cycle and report the cached value.
  146. */
  147. if (!data->valid || time_after(jiffies, data->last_updated +
  148. msecs_to_jiffies(data->update_interval))) {
  149. err = regmap_read(regmap, TMP464_REMOTE_OPEN_REG, &regval);
  150. if (err < 0)
  151. break;
  152. data->open_reg = regval;
  153. data->last_updated = jiffies;
  154. data->valid = true;
  155. }
  156. *val = !!(data->open_reg & BIT(channel + 7));
  157. break;
  158. case hwmon_temp_max_hyst:
  159. err = regmap_read(regmap, TMP464_THERM_LIMIT[channel], &regval);
  160. if (err < 0)
  161. break;
  162. err = regmap_read(regmap, TMP464_TEMP_HYST_REG, &regval2);
  163. if (err < 0)
  164. break;
  165. regval -= regval2;
  166. *val = temp_from_reg(regval);
  167. break;
  168. case hwmon_temp_max:
  169. err = regmap_read(regmap, TMP464_THERM_LIMIT[channel], &regval);
  170. if (err < 0)
  171. break;
  172. *val = temp_from_reg(regval);
  173. break;
  174. case hwmon_temp_crit_hyst:
  175. err = regmap_read(regmap, TMP464_THERM2_LIMIT[channel], &regval);
  176. if (err < 0)
  177. break;
  178. err = regmap_read(regmap, TMP464_TEMP_HYST_REG, &regval2);
  179. if (err < 0)
  180. break;
  181. regval -= regval2;
  182. *val = temp_from_reg(regval);
  183. break;
  184. case hwmon_temp_crit:
  185. err = regmap_read(regmap, TMP464_THERM2_LIMIT[channel], &regval);
  186. if (err < 0)
  187. break;
  188. *val = temp_from_reg(regval);
  189. break;
  190. case hwmon_temp_offset:
  191. err = regmap_read(regmap, TMP464_TEMP_OFFSET_REG(channel), &regval);
  192. if (err < 0)
  193. break;
  194. *val = temp_from_reg(regval);
  195. break;
  196. case hwmon_temp_input:
  197. if (!data->channel[channel].enabled) {
  198. err = -ENODATA;
  199. break;
  200. }
  201. err = regmap_read(regmap, TMP464_TEMP_REG(channel), &regval);
  202. if (err < 0)
  203. break;
  204. *val = temp_from_reg(regval);
  205. break;
  206. case hwmon_temp_enable:
  207. *val = data->channel[channel].enabled;
  208. break;
  209. default:
  210. err = -EOPNOTSUPP;
  211. break;
  212. }
  213. mutex_unlock(&data->update_lock);
  214. return err;
  215. }
  216. static int tmp464_read(struct device *dev, enum hwmon_sensor_types type,
  217. u32 attr, int channel, long *val)
  218. {
  219. switch (type) {
  220. case hwmon_chip:
  221. return tmp464_chip_read(dev, attr, channel, val);
  222. case hwmon_temp:
  223. return tmp464_temp_read(dev, attr, channel, val);
  224. default:
  225. return -EOPNOTSUPP;
  226. }
  227. }
  228. static int tmp464_read_string(struct device *dev, enum hwmon_sensor_types type,
  229. u32 attr, int channel, const char **str)
  230. {
  231. struct tmp464_data *data = dev_get_drvdata(dev);
  232. *str = data->channel[channel].label;
  233. return 0;
  234. }
  235. static int tmp464_set_convrate(struct tmp464_data *data, long interval)
  236. {
  237. int rate;
  238. /*
  239. * For valid rates, interval in milli-seconds can be calculated as
  240. * interval = 125 << (7 - rate);
  241. * or
  242. * interval = (1 << (7 - rate)) * 125;
  243. * The rate is therefore
  244. * rate = 7 - __fls(interval / 125);
  245. * and the rounded rate is
  246. * rate = 7 - __fls(interval * 4 / (125 * 3));
  247. * Use clamp_val() to avoid overflows, and to ensure valid input
  248. * for __fls.
  249. */
  250. interval = clamp_val(interval, 125, 16000);
  251. rate = 7 - __fls(interval * 4 / (125 * 3));
  252. data->update_interval = 125 << (7 - rate);
  253. return regmap_update_bits(data->regmap, TMP464_CONFIG_REG,
  254. TMP464_CONFIG_CONVERSION_RATE_MASK,
  255. rate << TMP464_CONFIG_CONVERSION_RATE_B0);
  256. }
  257. static int tmp464_chip_write(struct tmp464_data *data, u32 attr, int channel, long val)
  258. {
  259. switch (attr) {
  260. case hwmon_chip_update_interval:
  261. return tmp464_set_convrate(data, val);
  262. default:
  263. return -EOPNOTSUPP;
  264. }
  265. }
  266. static int tmp464_temp_write(struct tmp464_data *data, u32 attr, int channel, long val)
  267. {
  268. struct regmap *regmap = data->regmap;
  269. unsigned int regval;
  270. int err = 0;
  271. switch (attr) {
  272. case hwmon_temp_max_hyst:
  273. err = regmap_read(regmap, TMP464_THERM_LIMIT[0], &regval);
  274. if (err < 0)
  275. break;
  276. val = clamp_val(val, -256000, 256000); /* prevent overflow/underflow */
  277. val = clamp_val(temp_from_reg(regval) - val, 0, 255000);
  278. err = regmap_write(regmap, TMP464_TEMP_HYST_REG,
  279. DIV_ROUND_CLOSEST(val, 1000) << 7);
  280. break;
  281. case hwmon_temp_max:
  282. val = temp_to_limit_reg(clamp_val(val, -255000, 255500));
  283. err = regmap_write(regmap, TMP464_THERM_LIMIT[channel], val);
  284. break;
  285. case hwmon_temp_crit:
  286. val = temp_to_limit_reg(clamp_val(val, -255000, 255500));
  287. err = regmap_write(regmap, TMP464_THERM2_LIMIT[channel], val);
  288. break;
  289. case hwmon_temp_offset:
  290. val = temp_to_offset_reg(clamp_val(val, -128000, 127937));
  291. err = regmap_write(regmap, TMP464_TEMP_OFFSET_REG(channel), val);
  292. break;
  293. case hwmon_temp_enable:
  294. data->channel[channel].enabled = !!val;
  295. err = tmp464_enable_channels(data);
  296. break;
  297. default:
  298. err = -EOPNOTSUPP;
  299. break;
  300. }
  301. return err;
  302. }
  303. static int tmp464_write(struct device *dev, enum hwmon_sensor_types type,
  304. u32 attr, int channel, long val)
  305. {
  306. struct tmp464_data *data = dev_get_drvdata(dev);
  307. int err;
  308. mutex_lock(&data->update_lock);
  309. switch (type) {
  310. case hwmon_chip:
  311. err = tmp464_chip_write(data, attr, channel, val);
  312. break;
  313. case hwmon_temp:
  314. err = tmp464_temp_write(data, attr, channel, val);
  315. break;
  316. default:
  317. err = -EOPNOTSUPP;
  318. break;
  319. }
  320. mutex_unlock(&data->update_lock);
  321. return err;
  322. }
  323. static umode_t tmp464_is_visible(const void *_data, enum hwmon_sensor_types type,
  324. u32 attr, int channel)
  325. {
  326. const struct tmp464_data *data = _data;
  327. if (channel >= data->channels)
  328. return 0;
  329. if (type == hwmon_chip) {
  330. if (attr == hwmon_chip_update_interval)
  331. return 0644;
  332. return 0;
  333. }
  334. switch (attr) {
  335. case hwmon_temp_input:
  336. case hwmon_temp_max_alarm:
  337. case hwmon_temp_crit_alarm:
  338. case hwmon_temp_crit_hyst:
  339. return 0444;
  340. case hwmon_temp_enable:
  341. case hwmon_temp_max:
  342. case hwmon_temp_crit:
  343. return 0644;
  344. case hwmon_temp_max_hyst:
  345. if (!channel)
  346. return 0644;
  347. return 0444;
  348. case hwmon_temp_label:
  349. if (data->channel[channel].label)
  350. return 0444;
  351. return 0;
  352. case hwmon_temp_fault:
  353. if (channel)
  354. return 0444;
  355. return 0;
  356. case hwmon_temp_offset:
  357. if (channel)
  358. return 0644;
  359. return 0;
  360. default:
  361. return 0;
  362. }
  363. }
  364. static void tmp464_restore_lock(void *regmap)
  365. {
  366. regmap_write(regmap, TMP464_LOCK_REG, TMP464_LOCK_VAL);
  367. }
  368. static void tmp464_restore_config(void *_data)
  369. {
  370. struct tmp464_data *data = _data;
  371. regmap_write(data->regmap, TMP464_CONFIG_REG, data->config_orig);
  372. }
  373. static int tmp464_init_client(struct device *dev, struct tmp464_data *data)
  374. {
  375. struct regmap *regmap = data->regmap;
  376. unsigned int regval;
  377. int err;
  378. err = regmap_read(regmap, TMP464_LOCK_REG, &regval);
  379. if (err)
  380. return err;
  381. if (regval == TMP464_LOCKED) {
  382. /* Explicitly unlock chip if it is locked */
  383. err = regmap_write(regmap, TMP464_LOCK_REG, TMP464_UNLOCK_VAL);
  384. if (err)
  385. return err;
  386. /* and lock it again when unloading the driver */
  387. err = devm_add_action_or_reset(dev, tmp464_restore_lock, regmap);
  388. if (err)
  389. return err;
  390. }
  391. err = regmap_read(regmap, TMP464_CONFIG_REG, &regval);
  392. if (err)
  393. return err;
  394. data->config_orig = regval;
  395. err = devm_add_action_or_reset(dev, tmp464_restore_config, data);
  396. if (err)
  397. return err;
  398. /* Default to 500 ms update interval */
  399. err = regmap_update_bits(regmap, TMP464_CONFIG_REG,
  400. TMP464_CONFIG_CONVERSION_RATE_MASK | TMP464_CONFIG_SHUTDOWN,
  401. BIT(TMP464_CONFIG_CONVERSION_RATE_B0) |
  402. BIT(TMP464_CONFIG_CONVERSION_RATE_B2));
  403. if (err)
  404. return err;
  405. data->update_interval = 500;
  406. return tmp464_enable_channels(data);
  407. }
  408. static int tmp464_detect(struct i2c_client *client,
  409. struct i2c_board_info *info)
  410. {
  411. struct i2c_adapter *adapter = client->adapter;
  412. char *name, *chip;
  413. int reg;
  414. if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA))
  415. return -ENODEV;
  416. reg = i2c_smbus_read_word_swapped(client, TMP464_MANUFACTURER_ID_REG);
  417. if (reg < 0)
  418. return reg;
  419. if (reg != TMP464_MANUFACTURER_ID)
  420. return -ENODEV;
  421. /* Check for "always return zero" bits */
  422. reg = i2c_smbus_read_word_swapped(client, TMP464_THERM_STATUS_REG);
  423. if (reg < 0)
  424. return reg;
  425. if (reg & 0x1f)
  426. return -ENODEV;
  427. reg = i2c_smbus_read_word_swapped(client, TMP464_THERM2_STATUS_REG);
  428. if (reg < 0)
  429. return reg;
  430. if (reg & 0x1f)
  431. return -ENODEV;
  432. reg = i2c_smbus_read_word_swapped(client, TMP464_DEVICE_ID_REG);
  433. if (reg < 0)
  434. return reg;
  435. switch (reg) {
  436. case TMP464_DEVICE_ID:
  437. name = "tmp464";
  438. chip = "TMP464";
  439. break;
  440. case TMP468_DEVICE_ID:
  441. name = "tmp468";
  442. chip = "TMP468";
  443. break;
  444. default:
  445. return -ENODEV;
  446. }
  447. strscpy(info->type, name, I2C_NAME_SIZE);
  448. dev_info(&adapter->dev, "Detected TI %s chip at 0x%02x\n", chip, client->addr);
  449. return 0;
  450. }
  451. static int tmp464_probe_child_from_dt(struct device *dev,
  452. struct device_node *child,
  453. struct tmp464_data *data)
  454. {
  455. struct regmap *regmap = data->regmap;
  456. u32 channel;
  457. s32 nfactor;
  458. int err;
  459. err = of_property_read_u32(child, "reg", &channel);
  460. if (err) {
  461. dev_err(dev, "missing reg property of %pOFn\n", child);
  462. return err;
  463. }
  464. if (channel >= data->channels) {
  465. dev_err(dev, "invalid reg %d of %pOFn\n", channel, child);
  466. return -EINVAL;
  467. }
  468. of_property_read_string(child, "label", &data->channel[channel].label);
  469. data->channel[channel].enabled = of_device_is_available(child);
  470. err = of_property_read_s32(child, "ti,n-factor", &nfactor);
  471. if (err && err != -EINVAL)
  472. return err;
  473. if (!err) {
  474. if (channel == 0) {
  475. dev_err(dev, "n-factor can't be set for internal channel\n");
  476. return -EINVAL;
  477. }
  478. if (nfactor > 127 || nfactor < -128) {
  479. dev_err(dev, "n-factor for channel %d invalid (%d)\n",
  480. channel, nfactor);
  481. return -EINVAL;
  482. }
  483. err = regmap_write(regmap, TMP464_N_FACTOR_REG(channel),
  484. (nfactor << 8) & 0xff00);
  485. if (err)
  486. return err;
  487. }
  488. return 0;
  489. }
  490. static int tmp464_probe_from_dt(struct device *dev, struct tmp464_data *data)
  491. {
  492. const struct device_node *np = dev->of_node;
  493. struct device_node *child;
  494. int err;
  495. for_each_child_of_node(np, child) {
  496. if (strcmp(child->name, "channel"))
  497. continue;
  498. err = tmp464_probe_child_from_dt(dev, child, data);
  499. if (err) {
  500. of_node_put(child);
  501. return err;
  502. }
  503. }
  504. return 0;
  505. }
  506. static const struct hwmon_ops tmp464_ops = {
  507. .is_visible = tmp464_is_visible,
  508. .read = tmp464_read,
  509. .read_string = tmp464_read_string,
  510. .write = tmp464_write,
  511. };
  512. static const struct hwmon_channel_info *tmp464_info[] = {
  513. HWMON_CHANNEL_INFO(chip,
  514. HWMON_C_UPDATE_INTERVAL),
  515. HWMON_CHANNEL_INFO(temp,
  516. HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_MAX_HYST | HWMON_T_CRIT |
  517. HWMON_T_CRIT_HYST | HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM |
  518. HWMON_T_LABEL | HWMON_T_ENABLE,
  519. HWMON_T_INPUT | HWMON_T_OFFSET | HWMON_T_MAX | HWMON_T_MAX_HYST |
  520. HWMON_T_CRIT | HWMON_T_CRIT_HYST | HWMON_T_MAX_ALARM |
  521. HWMON_T_CRIT_ALARM | HWMON_T_FAULT | HWMON_T_LABEL | HWMON_T_ENABLE,
  522. HWMON_T_INPUT | HWMON_T_OFFSET | HWMON_T_MAX | HWMON_T_MAX_HYST |
  523. HWMON_T_CRIT | HWMON_T_CRIT_HYST | HWMON_T_MAX_ALARM |
  524. HWMON_T_CRIT_ALARM | HWMON_T_FAULT | HWMON_T_LABEL | HWMON_T_ENABLE,
  525. HWMON_T_INPUT | HWMON_T_OFFSET | HWMON_T_MAX | HWMON_T_MAX_HYST |
  526. HWMON_T_CRIT | HWMON_T_CRIT_HYST | HWMON_T_MAX_ALARM |
  527. HWMON_T_CRIT_ALARM | HWMON_T_FAULT | HWMON_T_LABEL | HWMON_T_ENABLE,
  528. HWMON_T_INPUT | HWMON_T_OFFSET | HWMON_T_MAX | HWMON_T_MAX_HYST |
  529. HWMON_T_CRIT | HWMON_T_CRIT_HYST | HWMON_T_MAX_ALARM |
  530. HWMON_T_CRIT_ALARM | HWMON_T_FAULT | HWMON_T_LABEL | HWMON_T_ENABLE,
  531. HWMON_T_INPUT | HWMON_T_OFFSET | HWMON_T_MAX | HWMON_T_MAX_HYST |
  532. HWMON_T_CRIT | HWMON_T_CRIT_HYST | HWMON_T_MAX_ALARM |
  533. HWMON_T_CRIT_ALARM | HWMON_T_FAULT | HWMON_T_LABEL | HWMON_T_ENABLE,
  534. HWMON_T_INPUT | HWMON_T_OFFSET | HWMON_T_MAX | HWMON_T_MAX_HYST |
  535. HWMON_T_CRIT | HWMON_T_CRIT_HYST | HWMON_T_MAX_ALARM |
  536. HWMON_T_CRIT_ALARM | HWMON_T_FAULT | HWMON_T_LABEL | HWMON_T_ENABLE,
  537. HWMON_T_INPUT | HWMON_T_OFFSET | HWMON_T_MAX | HWMON_T_MAX_HYST |
  538. HWMON_T_CRIT | HWMON_T_CRIT_HYST | HWMON_T_MAX_ALARM |
  539. HWMON_T_CRIT_ALARM | HWMON_T_FAULT | HWMON_T_LABEL | HWMON_T_ENABLE,
  540. HWMON_T_INPUT | HWMON_T_OFFSET | HWMON_T_MAX | HWMON_T_MAX_HYST |
  541. HWMON_T_CRIT | HWMON_T_CRIT_HYST | HWMON_T_MAX_ALARM |
  542. HWMON_T_CRIT_ALARM | HWMON_T_FAULT | HWMON_T_LABEL | HWMON_T_ENABLE),
  543. NULL
  544. };
  545. static const struct hwmon_chip_info tmp464_chip_info = {
  546. .ops = &tmp464_ops,
  547. .info = tmp464_info,
  548. };
  549. /* regmap */
  550. static bool tmp464_is_volatile_reg(struct device *dev, unsigned int reg)
  551. {
  552. return (reg < TMP464_TEMP_REG(TMP468_NUM_CHANNELS) ||
  553. reg == TMP464_THERM_STATUS_REG ||
  554. reg == TMP464_THERM2_STATUS_REG ||
  555. reg == TMP464_REMOTE_OPEN_REG);
  556. }
  557. static const struct regmap_config tmp464_regmap_config = {
  558. .reg_bits = 8,
  559. .val_bits = 16,
  560. .max_register = TMP464_DEVICE_ID_REG,
  561. .volatile_reg = tmp464_is_volatile_reg,
  562. .val_format_endian = REGMAP_ENDIAN_BIG,
  563. .cache_type = REGCACHE_RBTREE,
  564. .use_single_read = true,
  565. .use_single_write = true,
  566. };
  567. static int tmp464_probe(struct i2c_client *client)
  568. {
  569. struct device *dev = &client->dev;
  570. struct device *hwmon_dev;
  571. struct tmp464_data *data;
  572. int i, err;
  573. if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WORD_DATA)) {
  574. dev_err(&client->dev, "i2c functionality check failed\n");
  575. return -ENODEV;
  576. }
  577. data = devm_kzalloc(dev, sizeof(struct tmp464_data), GFP_KERNEL);
  578. if (!data)
  579. return -ENOMEM;
  580. mutex_init(&data->update_lock);
  581. if (dev->of_node)
  582. data->channels = (int)(unsigned long)of_device_get_match_data(&client->dev);
  583. else
  584. data->channels = i2c_match_id(tmp464_id, client)->driver_data;
  585. data->regmap = devm_regmap_init_i2c(client, &tmp464_regmap_config);
  586. if (IS_ERR(data->regmap))
  587. return PTR_ERR(data->regmap);
  588. for (i = 0; i < data->channels; i++)
  589. data->channel[i].enabled = true;
  590. err = tmp464_init_client(dev, data);
  591. if (err)
  592. return err;
  593. if (dev->of_node) {
  594. err = tmp464_probe_from_dt(dev, data);
  595. if (err)
  596. return err;
  597. }
  598. hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
  599. data, &tmp464_chip_info, NULL);
  600. return PTR_ERR_OR_ZERO(hwmon_dev);
  601. }
  602. static struct i2c_driver tmp464_driver = {
  603. .class = I2C_CLASS_HWMON,
  604. .driver = {
  605. .name = "tmp464",
  606. .of_match_table = of_match_ptr(tmp464_of_match),
  607. },
  608. .probe_new = tmp464_probe,
  609. .id_table = tmp464_id,
  610. .detect = tmp464_detect,
  611. .address_list = normal_i2c,
  612. };
  613. module_i2c_driver(tmp464_driver);
  614. MODULE_AUTHOR("Agathe Porte <[email protected]>");
  615. MODULE_DESCRIPTION("Texas Instruments TMP464 temperature sensor driver");
  616. MODULE_LICENSE("GPL");