tmp513.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Driver for Texas Instruments TMP512, TMP513 power monitor chips
  4. *
  5. * TMP513:
  6. * Thermal/Power Management with Triple Remote and
  7. * Local Temperature Sensor and Current Shunt Monitor
  8. * Datasheet: https://www.ti.com/lit/gpn/tmp513
  9. *
  10. * TMP512:
  11. * Thermal/Power Management with Dual Remote
  12. * and Local Temperature Sensor and Current Shunt Monitor
  13. * Datasheet: https://www.ti.com/lit/gpn/tmp512
  14. *
  15. * Copyright (C) 2019 Eric Tremblay <etremblay@distech-controls.com>
  16. *
  17. * This program is free software; you can redistribute it and/or modify
  18. * it under the terms of the GNU General Public License as published by
  19. * the Free Software Foundation; version 2 of the License.
  20. */
  21. #include <linux/bitops.h>
  22. #include <linux/bug.h>
  23. #include <linux/device.h>
  24. #include <linux/err.h>
  25. #include <linux/hwmon.h>
  26. #include <linux/i2c.h>
  27. #include <linux/init.h>
  28. #include <linux/math.h>
  29. #include <linux/module.h>
  30. #include <linux/property.h>
  31. #include <linux/regmap.h>
  32. #include <linux/slab.h>
  33. #include <linux/types.h>
  34. #include <linux/units.h>
  35. // Common register definition
  36. #define TMP51X_SHUNT_CONFIG 0x00
  37. #define TMP51X_TEMP_CONFIG 0x01
  38. #define TMP51X_STATUS 0x02
  39. #define TMP51X_SMBUS_ALERT 0x03
  40. #define TMP51X_SHUNT_CURRENT_RESULT 0x04
  41. #define TMP51X_BUS_VOLTAGE_RESULT 0x05
  42. #define TMP51X_POWER_RESULT 0x06
  43. #define TMP51X_BUS_CURRENT_RESULT 0x07
  44. #define TMP51X_LOCAL_TEMP_RESULT 0x08
  45. #define TMP51X_REMOTE_TEMP_RESULT_1 0x09
  46. #define TMP51X_REMOTE_TEMP_RESULT_2 0x0A
  47. #define TMP51X_SHUNT_CURRENT_H_LIMIT 0x0C
  48. #define TMP51X_SHUNT_CURRENT_L_LIMIT 0x0D
  49. #define TMP51X_BUS_VOLTAGE_H_LIMIT 0x0E
  50. #define TMP51X_BUS_VOLTAGE_L_LIMIT 0x0F
  51. #define TMP51X_POWER_LIMIT 0x10
  52. #define TMP51X_LOCAL_TEMP_LIMIT 0x11
  53. #define TMP51X_REMOTE_TEMP_LIMIT_1 0x12
  54. #define TMP51X_REMOTE_TEMP_LIMIT_2 0x13
  55. #define TMP51X_SHUNT_CALIBRATION 0x15
  56. #define TMP51X_N_FACTOR_AND_HYST_1 0x16
  57. #define TMP51X_N_FACTOR_2 0x17
  58. #define TMP51X_MAN_ID_REG 0xFE
  59. #define TMP51X_DEVICE_ID_REG 0xFF
  60. // TMP513 specific register definition
  61. #define TMP513_REMOTE_TEMP_RESULT_3 0x0B
  62. #define TMP513_REMOTE_TEMP_LIMIT_3 0x14
  63. #define TMP513_N_FACTOR_3 0x18
  64. // Common attrs, and NULL
  65. #define TMP51X_MANUFACTURER_ID 0x55FF
  66. #define TMP512_DEVICE_ID 0x22FF
  67. #define TMP513_DEVICE_ID 0x23FF
  68. // Default config
  69. #define TMP51X_SHUNT_CONFIG_DEFAULT 0x399F
  70. #define TMP51X_SHUNT_VALUE_DEFAULT 1000
  71. #define TMP51X_VBUS_RANGE_DEFAULT TMP51X_VBUS_RANGE_32V
  72. #define TMP51X_PGA_DEFAULT 8
  73. #define TMP51X_MAX_REGISTER_ADDR 0xFF
  74. // Mask and shift
  75. #define CURRENT_SENSE_VOLTAGE_320_MASK 0x1800
  76. #define CURRENT_SENSE_VOLTAGE_160_MASK 0x1000
  77. #define CURRENT_SENSE_VOLTAGE_80_MASK 0x0800
  78. #define CURRENT_SENSE_VOLTAGE_40_MASK 0
  79. #define TMP51X_BUS_VOLTAGE_MASK 0x2000
  80. #define TMP51X_NFACTOR_MASK 0xFF00
  81. #define TMP51X_HYST_MASK 0x00FF
  82. #define TMP51X_BUS_VOLTAGE_SHIFT 3
  83. #define TMP51X_TEMP_SHIFT 3
  84. // Alarms
  85. #define TMP51X_SHUNT_CURRENT_H_LIMIT_POS 15
  86. #define TMP51X_SHUNT_CURRENT_L_LIMIT_POS 14
  87. #define TMP51X_BUS_VOLTAGE_H_LIMIT_POS 13
  88. #define TMP51X_BUS_VOLTAGE_L_LIMIT_POS 12
  89. #define TMP51X_POWER_LIMIT_POS 11
  90. #define TMP51X_LOCAL_TEMP_LIMIT_POS 10
  91. #define TMP51X_REMOTE_TEMP_LIMIT_1_POS 9
  92. #define TMP51X_REMOTE_TEMP_LIMIT_2_POS 8
  93. #define TMP513_REMOTE_TEMP_LIMIT_3_POS 7
  94. #define TMP51X_VBUS_RANGE_32V (32 * MICRO)
  95. #define TMP51X_VBUS_RANGE_16V (16 * MICRO)
  96. // Max and Min value
  97. #define MAX_BUS_VOLTAGE_32_LIMIT 32764
  98. #define MAX_BUS_VOLTAGE_16_LIMIT 16382
  99. // Max possible value is -256 to +256 but datasheet indicated -40 to 125.
  100. #define MAX_TEMP_LIMIT 125000
  101. #define MIN_TEMP_LIMIT -40000
  102. #define MAX_TEMP_HYST 127500
  103. #define TMP512_MAX_CHANNELS 3
  104. #define TMP513_MAX_CHANNELS 4
  105. #define TMP51X_TEMP_CONFIG_CONV_RATE GENMASK(9, 7)
  106. #define TMP51X_TEMP_CONFIG_RC BIT(10)
  107. #define TMP51X_TEMP_CHANNEL_MASK(n) (GENMASK((n) - 1, 0) << 11)
  108. #define TMP51X_TEMP_CONFIG_CONT BIT(15)
  109. #define TMP51X_TEMP_CONFIG_DEFAULT(n) \
  110. (TMP51X_TEMP_CHANNEL_MASK(n) | TMP51X_TEMP_CONFIG_CONT | \
  111. TMP51X_TEMP_CONFIG_CONV_RATE | TMP51X_TEMP_CONFIG_RC)
  112. static const u8 TMP51X_TEMP_INPUT[4] = {
  113. TMP51X_LOCAL_TEMP_RESULT,
  114. TMP51X_REMOTE_TEMP_RESULT_1,
  115. TMP51X_REMOTE_TEMP_RESULT_2,
  116. TMP513_REMOTE_TEMP_RESULT_3
  117. };
  118. static const u8 TMP51X_TEMP_CRIT[4] = {
  119. TMP51X_LOCAL_TEMP_LIMIT,
  120. TMP51X_REMOTE_TEMP_LIMIT_1,
  121. TMP51X_REMOTE_TEMP_LIMIT_2,
  122. TMP513_REMOTE_TEMP_LIMIT_3
  123. };
  124. static const u8 TMP51X_TEMP_CRIT_ALARM[4] = {
  125. TMP51X_LOCAL_TEMP_LIMIT_POS,
  126. TMP51X_REMOTE_TEMP_LIMIT_1_POS,
  127. TMP51X_REMOTE_TEMP_LIMIT_2_POS,
  128. TMP513_REMOTE_TEMP_LIMIT_3_POS
  129. };
  130. static const u8 TMP51X_TEMP_CRIT_HYST[4] = {
  131. TMP51X_N_FACTOR_AND_HYST_1,
  132. TMP51X_N_FACTOR_AND_HYST_1,
  133. TMP51X_N_FACTOR_AND_HYST_1,
  134. TMP51X_N_FACTOR_AND_HYST_1
  135. };
  136. static const u8 TMP51X_CURR_INPUT[2] = {
  137. TMP51X_SHUNT_CURRENT_RESULT,
  138. TMP51X_BUS_CURRENT_RESULT
  139. };
  140. static const struct regmap_config tmp51x_regmap_config = {
  141. .reg_bits = 8,
  142. .val_bits = 16,
  143. .max_register = TMP51X_MAX_REGISTER_ADDR,
  144. };
  145. struct tmp51x_data {
  146. u16 shunt_config;
  147. u16 pga_gain;
  148. u32 vbus_range_uvolt;
  149. u16 temp_config;
  150. u32 nfactor[3];
  151. u32 shunt_uohms;
  152. u32 curr_lsb_ua;
  153. u32 pwr_lsb_uw;
  154. u8 max_channels;
  155. struct regmap *regmap;
  156. };
  157. // Set the shift based on the gain: 8 -> 1, 4 -> 2, 2 -> 3, 1 -> 4
  158. static inline u8 tmp51x_get_pga_shift(struct tmp51x_data *data)
  159. {
  160. return 5 - ffs(data->pga_gain);
  161. }
  162. static int tmp51x_get_value(struct tmp51x_data *data, u8 reg, u8 pos,
  163. unsigned int regval, long *val)
  164. {
  165. switch (reg) {
  166. case TMP51X_STATUS:
  167. *val = (regval >> pos) & 1;
  168. break;
  169. case TMP51X_SHUNT_CURRENT_RESULT:
  170. case TMP51X_SHUNT_CURRENT_H_LIMIT:
  171. case TMP51X_SHUNT_CURRENT_L_LIMIT:
  172. /*
  173. * The valus is read in voltage in the chip but reported as
  174. * current to the user.
  175. * 2's complement number shifted by one to four depending
  176. * on the pga gain setting. 1lsb = 10uV
  177. */
  178. *val = sign_extend32(regval,
  179. reg == TMP51X_SHUNT_CURRENT_RESULT ?
  180. 16 - tmp51x_get_pga_shift(data) : 15);
  181. *val = DIV_ROUND_CLOSEST(*val * 10 * (long)MILLI, (long)data->shunt_uohms);
  182. break;
  183. case TMP51X_BUS_VOLTAGE_RESULT:
  184. case TMP51X_BUS_VOLTAGE_H_LIMIT:
  185. case TMP51X_BUS_VOLTAGE_L_LIMIT:
  186. // 1lsb = 4mV
  187. *val = (regval >> TMP51X_BUS_VOLTAGE_SHIFT) * 4;
  188. break;
  189. case TMP51X_POWER_RESULT:
  190. case TMP51X_POWER_LIMIT:
  191. // Power = (current * BusVoltage) / 5000
  192. *val = regval * data->pwr_lsb_uw;
  193. break;
  194. case TMP51X_BUS_CURRENT_RESULT:
  195. // Current = (ShuntVoltage * CalibrationRegister) / 4096
  196. *val = sign_extend32(regval, 15) * (long)data->curr_lsb_ua;
  197. *val = DIV_ROUND_CLOSEST(*val, (long)MILLI);
  198. break;
  199. case TMP51X_LOCAL_TEMP_RESULT:
  200. case TMP51X_REMOTE_TEMP_RESULT_1:
  201. case TMP51X_REMOTE_TEMP_RESULT_2:
  202. case TMP513_REMOTE_TEMP_RESULT_3:
  203. case TMP51X_LOCAL_TEMP_LIMIT:
  204. case TMP51X_REMOTE_TEMP_LIMIT_1:
  205. case TMP51X_REMOTE_TEMP_LIMIT_2:
  206. case TMP513_REMOTE_TEMP_LIMIT_3:
  207. // 1lsb = 0.0625 degrees centigrade
  208. *val = sign_extend32(regval, 15) >> TMP51X_TEMP_SHIFT;
  209. *val = DIV_ROUND_CLOSEST(*val * 625, 10);
  210. break;
  211. case TMP51X_N_FACTOR_AND_HYST_1:
  212. // 1lsb = 0.5 degrees centigrade
  213. *val = (regval & TMP51X_HYST_MASK) * 500;
  214. break;
  215. default:
  216. // Programmer goofed
  217. WARN_ON_ONCE(1);
  218. *val = 0;
  219. return -EOPNOTSUPP;
  220. }
  221. return 0;
  222. }
  223. static int tmp51x_set_value(struct tmp51x_data *data, u8 reg, long val)
  224. {
  225. int regval, max_val;
  226. u32 mask = 0;
  227. switch (reg) {
  228. case TMP51X_SHUNT_CURRENT_H_LIMIT:
  229. case TMP51X_SHUNT_CURRENT_L_LIMIT:
  230. /*
  231. * The user enter current value and we convert it to
  232. * voltage. 1lsb = 10uV
  233. */
  234. val = DIV_ROUND_CLOSEST(val * (long)data->shunt_uohms, 10 * (long)MILLI);
  235. max_val = U16_MAX >> tmp51x_get_pga_shift(data);
  236. regval = clamp_val(val, -max_val, max_val);
  237. break;
  238. case TMP51X_BUS_VOLTAGE_H_LIMIT:
  239. case TMP51X_BUS_VOLTAGE_L_LIMIT:
  240. // 1lsb = 4mV
  241. max_val = (data->vbus_range_uvolt == TMP51X_VBUS_RANGE_32V) ?
  242. MAX_BUS_VOLTAGE_32_LIMIT : MAX_BUS_VOLTAGE_16_LIMIT;
  243. val = clamp_val(DIV_ROUND_CLOSEST(val, 4), 0, max_val);
  244. regval = val << TMP51X_BUS_VOLTAGE_SHIFT;
  245. break;
  246. case TMP51X_POWER_LIMIT:
  247. regval = clamp_val(DIV_ROUND_CLOSEST(val, data->pwr_lsb_uw), 0,
  248. U16_MAX);
  249. break;
  250. case TMP51X_LOCAL_TEMP_LIMIT:
  251. case TMP51X_REMOTE_TEMP_LIMIT_1:
  252. case TMP51X_REMOTE_TEMP_LIMIT_2:
  253. case TMP513_REMOTE_TEMP_LIMIT_3:
  254. // 1lsb = 0.0625 degrees centigrade
  255. val = clamp_val(val, MIN_TEMP_LIMIT, MAX_TEMP_LIMIT);
  256. regval = DIV_ROUND_CLOSEST(val * 10, 625) << TMP51X_TEMP_SHIFT;
  257. break;
  258. case TMP51X_N_FACTOR_AND_HYST_1:
  259. // 1lsb = 0.5 degrees centigrade
  260. val = clamp_val(val, 0, MAX_TEMP_HYST);
  261. regval = DIV_ROUND_CLOSEST(val, 500);
  262. mask = TMP51X_HYST_MASK;
  263. break;
  264. default:
  265. // Programmer goofed
  266. WARN_ON_ONCE(1);
  267. return -EOPNOTSUPP;
  268. }
  269. if (mask == 0)
  270. return regmap_write(data->regmap, reg, regval);
  271. else
  272. return regmap_update_bits(data->regmap, reg, mask, regval);
  273. }
  274. static u8 tmp51x_get_reg(enum hwmon_sensor_types type, u32 attr, int channel)
  275. {
  276. switch (type) {
  277. case hwmon_temp:
  278. switch (attr) {
  279. case hwmon_temp_input:
  280. return TMP51X_TEMP_INPUT[channel];
  281. case hwmon_temp_crit_alarm:
  282. return TMP51X_STATUS;
  283. case hwmon_temp_crit:
  284. return TMP51X_TEMP_CRIT[channel];
  285. case hwmon_temp_crit_hyst:
  286. return TMP51X_TEMP_CRIT_HYST[channel];
  287. }
  288. break;
  289. case hwmon_in:
  290. switch (attr) {
  291. case hwmon_in_input:
  292. return TMP51X_BUS_VOLTAGE_RESULT;
  293. case hwmon_in_lcrit_alarm:
  294. case hwmon_in_crit_alarm:
  295. return TMP51X_STATUS;
  296. case hwmon_in_lcrit:
  297. return TMP51X_BUS_VOLTAGE_L_LIMIT;
  298. case hwmon_in_crit:
  299. return TMP51X_BUS_VOLTAGE_H_LIMIT;
  300. }
  301. break;
  302. case hwmon_curr:
  303. switch (attr) {
  304. case hwmon_curr_input:
  305. return TMP51X_CURR_INPUT[channel];
  306. case hwmon_curr_lcrit_alarm:
  307. case hwmon_curr_crit_alarm:
  308. return TMP51X_STATUS;
  309. case hwmon_curr_lcrit:
  310. return TMP51X_SHUNT_CURRENT_L_LIMIT;
  311. case hwmon_curr_crit:
  312. return TMP51X_SHUNT_CURRENT_H_LIMIT;
  313. }
  314. break;
  315. case hwmon_power:
  316. switch (attr) {
  317. case hwmon_power_input:
  318. return TMP51X_POWER_RESULT;
  319. case hwmon_power_crit_alarm:
  320. return TMP51X_STATUS;
  321. case hwmon_power_crit:
  322. return TMP51X_POWER_LIMIT;
  323. }
  324. break;
  325. default:
  326. break;
  327. }
  328. return 0;
  329. }
  330. static u8 tmp51x_get_status_pos(enum hwmon_sensor_types type, u32 attr,
  331. int channel)
  332. {
  333. switch (type) {
  334. case hwmon_temp:
  335. switch (attr) {
  336. case hwmon_temp_crit_alarm:
  337. return TMP51X_TEMP_CRIT_ALARM[channel];
  338. }
  339. break;
  340. case hwmon_in:
  341. switch (attr) {
  342. case hwmon_in_lcrit_alarm:
  343. return TMP51X_BUS_VOLTAGE_L_LIMIT_POS;
  344. case hwmon_in_crit_alarm:
  345. return TMP51X_BUS_VOLTAGE_H_LIMIT_POS;
  346. }
  347. break;
  348. case hwmon_curr:
  349. switch (attr) {
  350. case hwmon_curr_lcrit_alarm:
  351. return TMP51X_SHUNT_CURRENT_L_LIMIT_POS;
  352. case hwmon_curr_crit_alarm:
  353. return TMP51X_SHUNT_CURRENT_H_LIMIT_POS;
  354. }
  355. break;
  356. case hwmon_power:
  357. switch (attr) {
  358. case hwmon_power_crit_alarm:
  359. return TMP51X_POWER_LIMIT_POS;
  360. }
  361. break;
  362. default:
  363. break;
  364. }
  365. return 0;
  366. }
  367. static int tmp51x_read(struct device *dev, enum hwmon_sensor_types type,
  368. u32 attr, int channel, long *val)
  369. {
  370. struct tmp51x_data *data = dev_get_drvdata(dev);
  371. int ret;
  372. u32 regval;
  373. u8 pos = 0, reg = 0;
  374. reg = tmp51x_get_reg(type, attr, channel);
  375. if (reg == 0)
  376. return -EOPNOTSUPP;
  377. if (reg == TMP51X_STATUS)
  378. pos = tmp51x_get_status_pos(type, attr, channel);
  379. ret = regmap_read(data->regmap, reg, &regval);
  380. if (ret < 0)
  381. return ret;
  382. return tmp51x_get_value(data, reg, pos, regval, val);
  383. }
  384. static int tmp51x_write(struct device *dev, enum hwmon_sensor_types type,
  385. u32 attr, int channel, long val)
  386. {
  387. u8 reg = 0;
  388. reg = tmp51x_get_reg(type, attr, channel);
  389. if (reg == 0)
  390. return -EOPNOTSUPP;
  391. return tmp51x_set_value(dev_get_drvdata(dev), reg, val);
  392. }
  393. static umode_t tmp51x_is_visible(const void *_data,
  394. enum hwmon_sensor_types type, u32 attr,
  395. int channel)
  396. {
  397. const struct tmp51x_data *data = _data;
  398. switch (type) {
  399. case hwmon_temp:
  400. if (channel >= data->max_channels)
  401. return 0;
  402. switch (attr) {
  403. case hwmon_temp_input:
  404. case hwmon_temp_crit_alarm:
  405. return 0444;
  406. case hwmon_temp_crit:
  407. return 0644;
  408. case hwmon_temp_crit_hyst:
  409. if (channel == 0)
  410. return 0644;
  411. return 0444;
  412. }
  413. break;
  414. case hwmon_in:
  415. switch (attr) {
  416. case hwmon_in_input:
  417. case hwmon_in_lcrit_alarm:
  418. case hwmon_in_crit_alarm:
  419. return 0444;
  420. case hwmon_in_lcrit:
  421. case hwmon_in_crit:
  422. return 0644;
  423. }
  424. break;
  425. case hwmon_curr:
  426. if (!data->shunt_uohms)
  427. return 0;
  428. switch (attr) {
  429. case hwmon_curr_input:
  430. case hwmon_curr_lcrit_alarm:
  431. case hwmon_curr_crit_alarm:
  432. return 0444;
  433. case hwmon_curr_lcrit:
  434. case hwmon_curr_crit:
  435. return 0644;
  436. }
  437. break;
  438. case hwmon_power:
  439. if (!data->shunt_uohms)
  440. return 0;
  441. switch (attr) {
  442. case hwmon_power_input:
  443. case hwmon_power_crit_alarm:
  444. return 0444;
  445. case hwmon_power_crit:
  446. return 0644;
  447. }
  448. break;
  449. default:
  450. break;
  451. }
  452. return 0;
  453. }
  454. static const struct hwmon_channel_info * const tmp51x_info[] = {
  455. HWMON_CHANNEL_INFO(temp,
  456. HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_CRIT_ALARM |
  457. HWMON_T_CRIT_HYST,
  458. HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_CRIT_ALARM |
  459. HWMON_T_CRIT_HYST,
  460. HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_CRIT_ALARM |
  461. HWMON_T_CRIT_HYST,
  462. HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_CRIT_ALARM |
  463. HWMON_T_CRIT_HYST),
  464. HWMON_CHANNEL_INFO(in,
  465. HWMON_I_INPUT | HWMON_I_LCRIT | HWMON_I_LCRIT_ALARM |
  466. HWMON_I_CRIT | HWMON_I_CRIT_ALARM),
  467. HWMON_CHANNEL_INFO(curr,
  468. HWMON_C_INPUT | HWMON_C_LCRIT | HWMON_C_LCRIT_ALARM |
  469. HWMON_C_CRIT | HWMON_C_CRIT_ALARM,
  470. HWMON_C_INPUT),
  471. HWMON_CHANNEL_INFO(power,
  472. HWMON_P_INPUT | HWMON_P_CRIT | HWMON_P_CRIT_ALARM),
  473. NULL
  474. };
  475. static const struct hwmon_ops tmp51x_hwmon_ops = {
  476. .is_visible = tmp51x_is_visible,
  477. .read = tmp51x_read,
  478. .write = tmp51x_write,
  479. };
  480. static const struct hwmon_chip_info tmp51x_chip_info = {
  481. .ops = &tmp51x_hwmon_ops,
  482. .info = tmp51x_info,
  483. };
  484. /*
  485. * Calibrate the tmp51x following the datasheet method
  486. */
  487. static int tmp51x_calibrate(struct tmp51x_data *data)
  488. {
  489. int vshunt_max = data->pga_gain * 40;
  490. u64 max_curr_ma;
  491. u32 div;
  492. /*
  493. * If shunt_uohms is equal to 0, the calibration should be set to 0.
  494. * The consequence will be that the current and power measurement engine
  495. * of the sensor will not work. Temperature and voltage sensing will
  496. * continue to work.
  497. */
  498. if (data->shunt_uohms == 0)
  499. return regmap_write(data->regmap, TMP51X_SHUNT_CALIBRATION, 0);
  500. max_curr_ma = DIV_ROUND_CLOSEST_ULL(vshunt_max * MICRO, data->shunt_uohms);
  501. /*
  502. * Calculate the minimal bit resolution for the current and the power.
  503. * Those values will be used during register interpretation.
  504. */
  505. data->curr_lsb_ua = DIV_ROUND_CLOSEST_ULL(max_curr_ma * MILLI, 32767);
  506. data->pwr_lsb_uw = 20 * data->curr_lsb_ua;
  507. div = DIV_ROUND_CLOSEST_ULL(data->curr_lsb_ua * data->shunt_uohms, MICRO);
  508. return regmap_write(data->regmap, TMP51X_SHUNT_CALIBRATION,
  509. DIV_ROUND_CLOSEST(40960, div));
  510. }
  511. /*
  512. * Initialize the configuration and calibration registers.
  513. */
  514. static int tmp51x_init(struct tmp51x_data *data)
  515. {
  516. unsigned int regval;
  517. int ret = regmap_write(data->regmap, TMP51X_SHUNT_CONFIG,
  518. data->shunt_config);
  519. if (ret < 0)
  520. return ret;
  521. ret = regmap_write(data->regmap, TMP51X_TEMP_CONFIG, data->temp_config);
  522. if (ret < 0)
  523. return ret;
  524. // nFactor configuration
  525. ret = regmap_update_bits(data->regmap, TMP51X_N_FACTOR_AND_HYST_1,
  526. TMP51X_NFACTOR_MASK, data->nfactor[0] << 8);
  527. if (ret < 0)
  528. return ret;
  529. ret = regmap_write(data->regmap, TMP51X_N_FACTOR_2,
  530. data->nfactor[1] << 8);
  531. if (ret < 0)
  532. return ret;
  533. if (data->max_channels == TMP513_MAX_CHANNELS) {
  534. ret = regmap_write(data->regmap, TMP513_N_FACTOR_3,
  535. data->nfactor[2] << 8);
  536. if (ret < 0)
  537. return ret;
  538. }
  539. ret = tmp51x_calibrate(data);
  540. if (ret < 0)
  541. return ret;
  542. // Read the status register before using as the datasheet propose
  543. return regmap_read(data->regmap, TMP51X_STATUS, &regval);
  544. }
  545. static const struct i2c_device_id tmp51x_id[] = {
  546. { "tmp512", TMP512_MAX_CHANNELS },
  547. { "tmp513", TMP513_MAX_CHANNELS },
  548. { }
  549. };
  550. MODULE_DEVICE_TABLE(i2c, tmp51x_id);
  551. static const struct of_device_id tmp51x_of_match[] = {
  552. { .compatible = "ti,tmp512", .data = (void *)TMP512_MAX_CHANNELS },
  553. { .compatible = "ti,tmp513", .data = (void *)TMP513_MAX_CHANNELS },
  554. { }
  555. };
  556. MODULE_DEVICE_TABLE(of, tmp51x_of_match);
  557. static int tmp51x_vbus_range_to_reg(struct device *dev,
  558. struct tmp51x_data *data)
  559. {
  560. if (data->vbus_range_uvolt == TMP51X_VBUS_RANGE_32V) {
  561. data->shunt_config |= TMP51X_BUS_VOLTAGE_MASK;
  562. } else if (data->vbus_range_uvolt == TMP51X_VBUS_RANGE_16V) {
  563. data->shunt_config &= ~TMP51X_BUS_VOLTAGE_MASK;
  564. } else {
  565. return dev_err_probe(dev, -EINVAL,
  566. "ti,bus-range-microvolt is invalid: %u\n",
  567. data->vbus_range_uvolt);
  568. }
  569. return 0;
  570. }
  571. static int tmp51x_pga_gain_to_reg(struct device *dev, struct tmp51x_data *data)
  572. {
  573. if (data->pga_gain == 8) {
  574. data->shunt_config |= CURRENT_SENSE_VOLTAGE_320_MASK;
  575. } else if (data->pga_gain == 4) {
  576. data->shunt_config |= CURRENT_SENSE_VOLTAGE_160_MASK;
  577. } else if (data->pga_gain == 2) {
  578. data->shunt_config |= CURRENT_SENSE_VOLTAGE_80_MASK;
  579. } else if (data->pga_gain == 1) {
  580. data->shunt_config |= CURRENT_SENSE_VOLTAGE_40_MASK;
  581. } else {
  582. return dev_err_probe(dev, -EINVAL,
  583. "ti,pga-gain is invalid: %u\n", data->pga_gain);
  584. }
  585. return 0;
  586. }
  587. static int tmp51x_read_properties(struct device *dev, struct tmp51x_data *data)
  588. {
  589. int ret;
  590. u32 val;
  591. ret = device_property_read_u32(dev, "shunt-resistor-micro-ohms", &val);
  592. data->shunt_uohms = (ret >= 0) ? val : TMP51X_SHUNT_VALUE_DEFAULT;
  593. ret = device_property_read_u32(dev, "ti,bus-range-microvolt", &val);
  594. data->vbus_range_uvolt = (ret >= 0) ? val : TMP51X_VBUS_RANGE_DEFAULT;
  595. ret = tmp51x_vbus_range_to_reg(dev, data);
  596. if (ret < 0)
  597. return ret;
  598. ret = device_property_read_u32(dev, "ti,pga-gain", &val);
  599. data->pga_gain = (ret >= 0) ? val : TMP51X_PGA_DEFAULT;
  600. ret = tmp51x_pga_gain_to_reg(dev, data);
  601. if (ret < 0)
  602. return ret;
  603. device_property_read_u32_array(dev, "ti,nfactor", data->nfactor,
  604. data->max_channels - 1);
  605. // Check if shunt value is compatible with pga-gain
  606. if (data->shunt_uohms > data->pga_gain * 40 * MICRO) {
  607. return dev_err_probe(dev, -EINVAL,
  608. "shunt-resistor: %u too big for pga_gain: %u\n",
  609. data->shunt_uohms, data->pga_gain);
  610. }
  611. return 0;
  612. }
  613. static void tmp51x_use_default(struct tmp51x_data *data)
  614. {
  615. data->vbus_range_uvolt = TMP51X_VBUS_RANGE_DEFAULT;
  616. data->pga_gain = TMP51X_PGA_DEFAULT;
  617. data->shunt_uohms = TMP51X_SHUNT_VALUE_DEFAULT;
  618. }
  619. static int tmp51x_configure(struct device *dev, struct tmp51x_data *data)
  620. {
  621. data->shunt_config = TMP51X_SHUNT_CONFIG_DEFAULT;
  622. data->temp_config = TMP51X_TEMP_CONFIG_DEFAULT(data->max_channels);
  623. if (dev->of_node)
  624. return tmp51x_read_properties(dev, data);
  625. tmp51x_use_default(data);
  626. return 0;
  627. }
  628. static int tmp51x_probe(struct i2c_client *client)
  629. {
  630. struct device *dev = &client->dev;
  631. struct tmp51x_data *data;
  632. struct device *hwmon_dev;
  633. int ret;
  634. data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
  635. if (!data)
  636. return -ENOMEM;
  637. data->max_channels = (uintptr_t)i2c_get_match_data(client);
  638. ret = tmp51x_configure(dev, data);
  639. if (ret < 0)
  640. return dev_err_probe(dev, ret, "error configuring the device\n");
  641. data->regmap = devm_regmap_init_i2c(client, &tmp51x_regmap_config);
  642. if (IS_ERR(data->regmap))
  643. return dev_err_probe(dev, PTR_ERR(data->regmap),
  644. "failed to allocate register map\n");
  645. ret = tmp51x_init(data);
  646. if (ret < 0)
  647. return dev_err_probe(dev, ret, "error configuring the device\n");
  648. hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
  649. data,
  650. &tmp51x_chip_info,
  651. NULL);
  652. if (IS_ERR(hwmon_dev))
  653. return PTR_ERR(hwmon_dev);
  654. dev_dbg(dev, "power monitor %s\n", client->name);
  655. return 0;
  656. }
  657. static struct i2c_driver tmp51x_driver = {
  658. .driver = {
  659. .name = "tmp51x",
  660. .of_match_table = tmp51x_of_match,
  661. },
  662. .probe = tmp51x_probe,
  663. .id_table = tmp51x_id,
  664. };
  665. module_i2c_driver(tmp51x_driver);
  666. MODULE_AUTHOR("Eric Tremblay <etremblay@distechcontrols.com>");
  667. MODULE_DESCRIPTION("tmp51x driver");
  668. MODULE_LICENSE("GPL");