max31760.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. #include <linux/bitfield.h>
  3. #include <linux/bits.h>
  4. #include <linux/err.h>
  5. #include <linux/hwmon.h>
  6. #include <linux/hwmon-sysfs.h>
  7. #include <linux/i2c.h>
  8. #include <linux/regmap.h>
  9. #include <linux/util_macros.h>
  10. #define REG_CR1 0x00
  11. #define CR1_HYST BIT(5)
  12. #define CR1_DRV GENMASK(4, 3)
  13. #define CR1_TEMP_SRC GENMASK(1, 0)
  14. #define REG_CR2 0x01
  15. #define CR2_STBY BIT(7)
  16. #define CR2_ALERTS BIT(6)
  17. #define CR2_DFC BIT(0)
  18. #define REG_CR3 0x02
  19. #define REG_PWMR 0x50
  20. #define REG_PWMV 0x51
  21. #define REG_STATUS 0x5A
  22. #define STATUS_ALARM_CRIT(ch) BIT(2 + 2 * (ch))
  23. #define STATUS_ALARM_MAX(ch) BIT(3 + 2 * (ch))
  24. #define STATUS_RDFA BIT(6)
  25. #define REG_TACH(ch) (0x52 + (ch) * 2)
  26. #define REG_TEMP_INPUT(ch) (0x56 + (ch) * 2)
  27. #define REG_TEMP_MAX(ch) (0x06 + (ch) * 2)
  28. #define REG_TEMP_CRIT(ch) (0x0A + (ch) * 2)
  29. #define TEMP11_FROM_REG(reg) ((reg) / 32 * 125)
  30. #define TEMP11_TO_REG(val) (DIV_ROUND_CLOSEST(clamp_val((val), -128000, \
  31. 127875), 125) * 32)
  32. #define LUT_SIZE 48
  33. #define REG_LUT(index) (0x20 + (index))
  34. struct max31760_state {
  35. struct regmap *regmap;
  36. struct lut_attribute {
  37. char name[24];
  38. struct sensor_device_attribute sda;
  39. } lut[LUT_SIZE];
  40. struct attribute *attrs[LUT_SIZE + 2];
  41. struct attribute_group group;
  42. const struct attribute_group *groups[2];
  43. };
  44. static bool max31760_volatile_reg(struct device *dev, unsigned int reg)
  45. {
  46. return reg > 0x50;
  47. }
  48. static const struct regmap_config regmap_config = {
  49. .reg_bits = 8,
  50. .val_bits = 8,
  51. .max_register = 0x5B,
  52. .cache_type = REGCACHE_RBTREE,
  53. .volatile_reg = max31760_volatile_reg,
  54. };
  55. static const int max31760_pwm_freq[] = {33, 150, 1500, 25000};
  56. static int tach_to_rpm(u16 tach)
  57. {
  58. if (tach == 0)
  59. tach = 1;
  60. return 60 * 100000 / tach / 2;
  61. }
  62. static int max31760_read(struct device *dev, enum hwmon_sensor_types type,
  63. u32 attr, int channel, long *val)
  64. {
  65. struct max31760_state *state = dev_get_drvdata(dev);
  66. unsigned int regval;
  67. unsigned int reg_temp;
  68. s16 temp;
  69. u8 reg[2];
  70. int ret;
  71. switch (type) {
  72. case hwmon_temp:
  73. switch (attr) {
  74. case hwmon_temp_fault:
  75. ret = regmap_read(state->regmap, REG_STATUS, &regval);
  76. if (ret)
  77. return ret;
  78. *val = FIELD_GET(STATUS_RDFA, regval);
  79. return 0;
  80. case hwmon_temp_max_alarm:
  81. ret = regmap_read(state->regmap, REG_STATUS, &regval);
  82. if (ret)
  83. return ret;
  84. if (channel)
  85. *val = FIELD_GET(STATUS_ALARM_MAX(1), regval);
  86. else
  87. *val = FIELD_GET(STATUS_ALARM_MAX(0), regval);
  88. return 0;
  89. case hwmon_temp_crit_alarm:
  90. ret = regmap_read(state->regmap, REG_STATUS, &regval);
  91. if (ret)
  92. return ret;
  93. if (channel)
  94. *val = FIELD_GET(STATUS_ALARM_CRIT(1), regval);
  95. else
  96. *val = FIELD_GET(STATUS_ALARM_CRIT(0), regval);
  97. return 0;
  98. case hwmon_temp_input:
  99. reg_temp = REG_TEMP_INPUT(channel);
  100. break;
  101. case hwmon_temp_max:
  102. reg_temp = REG_TEMP_MAX(channel);
  103. break;
  104. case hwmon_temp_crit:
  105. reg_temp = REG_TEMP_CRIT(channel);
  106. break;
  107. default:
  108. return -EOPNOTSUPP;
  109. }
  110. ret = regmap_bulk_read(state->regmap, reg_temp, reg, 2);
  111. if (ret)
  112. return ret;
  113. temp = (reg[0] << 8) | reg[1];
  114. *val = TEMP11_FROM_REG(temp);
  115. return 0;
  116. case hwmon_fan:
  117. switch (attr) {
  118. case hwmon_fan_input:
  119. ret = regmap_bulk_read(state->regmap, REG_TACH(channel), reg, 2);
  120. if (ret)
  121. return ret;
  122. *val = tach_to_rpm(reg[0] * 256 + reg[1]);
  123. return 0;
  124. case hwmon_fan_fault:
  125. ret = regmap_read(state->regmap, REG_STATUS, &regval);
  126. if (ret)
  127. return ret;
  128. if (channel)
  129. *val = FIELD_GET(BIT(1), regval);
  130. else
  131. *val = FIELD_GET(BIT(0), regval);
  132. return 0;
  133. case hwmon_fan_enable:
  134. ret = regmap_read(state->regmap, REG_CR3, &regval);
  135. if (ret)
  136. return ret;
  137. if (channel)
  138. *val = FIELD_GET(BIT(1), regval);
  139. else
  140. *val = FIELD_GET(BIT(0), regval);
  141. return 0;
  142. default:
  143. return -EOPNOTSUPP;
  144. }
  145. case hwmon_pwm:
  146. switch (attr) {
  147. case hwmon_pwm_input:
  148. ret = regmap_read(state->regmap, REG_PWMV, &regval);
  149. if (ret)
  150. return ret;
  151. *val = regval;
  152. return 0;
  153. case hwmon_pwm_freq:
  154. ret = regmap_read(state->regmap, REG_CR1, &regval);
  155. if (ret)
  156. return ret;
  157. regval = FIELD_GET(CR1_DRV, regval);
  158. if (regval >= ARRAY_SIZE(max31760_pwm_freq))
  159. return -EINVAL;
  160. *val = max31760_pwm_freq[regval];
  161. return 0;
  162. case hwmon_pwm_enable:
  163. ret = regmap_read(state->regmap, REG_CR2, &regval);
  164. if (ret)
  165. return ret;
  166. *val = 2 - FIELD_GET(CR2_DFC, regval);
  167. return 0;
  168. case hwmon_pwm_auto_channels_temp:
  169. ret = regmap_read(state->regmap, REG_CR1, &regval);
  170. if (ret)
  171. return ret;
  172. switch (FIELD_GET(CR1_TEMP_SRC, regval)) {
  173. case 0:
  174. *val = 2;
  175. break;
  176. case 1:
  177. *val = 1;
  178. break;
  179. case 2:
  180. case 3:
  181. *val = 3;
  182. break;
  183. default:
  184. return -EINVAL;
  185. }
  186. return 0;
  187. default:
  188. return -EOPNOTSUPP;
  189. }
  190. default:
  191. return -EOPNOTSUPP;
  192. }
  193. }
  194. static int max31760_write(struct device *dev, enum hwmon_sensor_types type,
  195. u32 attr, int channel, long val)
  196. {
  197. struct max31760_state *state = dev_get_drvdata(dev);
  198. unsigned int pwm_index;
  199. unsigned int reg_temp;
  200. int temp;
  201. u8 reg_val[2];
  202. switch (type) {
  203. case hwmon_temp:
  204. switch (attr) {
  205. case hwmon_temp_max:
  206. reg_temp = REG_TEMP_MAX(channel);
  207. break;
  208. case hwmon_temp_crit:
  209. reg_temp = REG_TEMP_CRIT(channel);
  210. break;
  211. default:
  212. return -EOPNOTSUPP;
  213. }
  214. temp = TEMP11_TO_REG(val);
  215. reg_val[0] = temp >> 8;
  216. reg_val[1] = temp & 0xFF;
  217. return regmap_bulk_write(state->regmap, reg_temp, reg_val, 2);
  218. case hwmon_fan:
  219. switch (attr) {
  220. case hwmon_fan_enable:
  221. if (val == 0)
  222. return regmap_clear_bits(state->regmap, REG_CR3, BIT(channel));
  223. if (val == 1)
  224. return regmap_set_bits(state->regmap, REG_CR3, BIT(channel));
  225. return -EINVAL;
  226. default:
  227. return -EOPNOTSUPP;
  228. }
  229. case hwmon_pwm:
  230. switch (attr) {
  231. case hwmon_pwm_input:
  232. if (val < 0 || val > 255)
  233. return -EINVAL;
  234. return regmap_write(state->regmap, REG_PWMR, val);
  235. case hwmon_pwm_enable:
  236. if (val == 1)
  237. return regmap_set_bits(state->regmap, REG_CR2, CR2_DFC);
  238. if (val == 2)
  239. return regmap_clear_bits(state->regmap, REG_CR2, CR2_DFC);
  240. return -EINVAL;
  241. case hwmon_pwm_freq:
  242. pwm_index = find_closest(val, max31760_pwm_freq,
  243. ARRAY_SIZE(max31760_pwm_freq));
  244. return regmap_update_bits(state->regmap,
  245. REG_CR1, CR1_DRV,
  246. FIELD_PREP(CR1_DRV, pwm_index));
  247. case hwmon_pwm_auto_channels_temp:
  248. switch (val) {
  249. case 1:
  250. break;
  251. case 2:
  252. val = 0;
  253. break;
  254. case 3:
  255. val = 2;
  256. break;
  257. default:
  258. return -EINVAL;
  259. }
  260. return regmap_update_bits(state->regmap, REG_CR1, CR1_TEMP_SRC, val);
  261. default:
  262. return -EOPNOTSUPP;
  263. }
  264. default:
  265. return -EOPNOTSUPP;
  266. }
  267. }
  268. static const struct hwmon_channel_info *max31760_info[] = {
  269. HWMON_CHANNEL_INFO(chip,
  270. HWMON_C_REGISTER_TZ),
  271. HWMON_CHANNEL_INFO(fan,
  272. HWMON_F_INPUT | HWMON_F_FAULT | HWMON_F_ENABLE,
  273. HWMON_F_INPUT | HWMON_F_FAULT | HWMON_F_ENABLE),
  274. HWMON_CHANNEL_INFO(temp,
  275. HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT | HWMON_T_FAULT |
  276. HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM | HWMON_T_LABEL,
  277. HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT |
  278. HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM | HWMON_T_LABEL),
  279. HWMON_CHANNEL_INFO(pwm,
  280. HWMON_PWM_ENABLE | HWMON_PWM_FREQ | HWMON_PWM_INPUT |
  281. HWMON_PWM_AUTO_CHANNELS_TEMP),
  282. NULL
  283. };
  284. static umode_t max31760_is_visible(const void *data,
  285. enum hwmon_sensor_types type,
  286. u32 attr, int channel)
  287. {
  288. switch (type) {
  289. case hwmon_temp:
  290. switch (attr) {
  291. case hwmon_temp_input:
  292. case hwmon_temp_max_alarm:
  293. case hwmon_temp_crit_alarm:
  294. case hwmon_temp_fault:
  295. case hwmon_temp_label:
  296. return 0444;
  297. case hwmon_temp_max:
  298. case hwmon_temp_crit:
  299. return 0644;
  300. default:
  301. return 0;
  302. }
  303. case hwmon_fan:
  304. switch (attr) {
  305. case hwmon_fan_input:
  306. case hwmon_fan_fault:
  307. return 0444;
  308. case hwmon_fan_enable:
  309. return 0644;
  310. default:
  311. return 0;
  312. }
  313. case hwmon_pwm:
  314. switch (attr) {
  315. case hwmon_pwm_enable:
  316. case hwmon_pwm_input:
  317. case hwmon_pwm_freq:
  318. case hwmon_pwm_auto_channels_temp:
  319. return 0644;
  320. default:
  321. return 0;
  322. }
  323. default:
  324. return 0;
  325. }
  326. }
  327. static int max31760_read_string(struct device *dev,
  328. enum hwmon_sensor_types type,
  329. u32 attr, int channel, const char **str)
  330. {
  331. switch (type) {
  332. case hwmon_temp:
  333. if (attr != hwmon_temp_label)
  334. return -EOPNOTSUPP;
  335. *str = channel ? "local" : "remote";
  336. return 0;
  337. default:
  338. return -EOPNOTSUPP;
  339. }
  340. }
  341. static const struct hwmon_ops max31760_hwmon_ops = {
  342. .is_visible = max31760_is_visible,
  343. .read = max31760_read,
  344. .write = max31760_write,
  345. .read_string = max31760_read_string
  346. };
  347. static const struct hwmon_chip_info max31760_chip_info = {
  348. .ops = &max31760_hwmon_ops,
  349. .info = max31760_info,
  350. };
  351. static ssize_t lut_show(struct device *dev,
  352. struct device_attribute *devattr, char *buf)
  353. {
  354. struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr);
  355. struct max31760_state *state = dev_get_drvdata(dev);
  356. int ret;
  357. unsigned int regval;
  358. ret = regmap_read(state->regmap, REG_LUT(sda->index), &regval);
  359. if (ret)
  360. return ret;
  361. return sysfs_emit(buf, "%d\n", regval);
  362. }
  363. static ssize_t lut_store(struct device *dev,
  364. struct device_attribute *devattr,
  365. const char *buf, size_t count)
  366. {
  367. struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr);
  368. struct max31760_state *state = dev_get_drvdata(dev);
  369. int ret;
  370. u8 pwm;
  371. ret = kstrtou8(buf, 10, &pwm);
  372. if (ret)
  373. return ret;
  374. ret = regmap_write(state->regmap, REG_LUT(sda->index), pwm);
  375. if (ret)
  376. return ret;
  377. return count;
  378. }
  379. static ssize_t pwm1_auto_point_temp_hyst_show(struct device *dev,
  380. struct device_attribute *attr,
  381. char *buf)
  382. {
  383. struct max31760_state *state = dev_get_drvdata(dev);
  384. unsigned int regval;
  385. int ret;
  386. ret = regmap_read(state->regmap, REG_CR1, &regval);
  387. if (ret)
  388. return ret;
  389. return sysfs_emit(buf, "%d\n", (1 + (int)FIELD_GET(CR1_HYST, regval)) * 2000);
  390. }
  391. static ssize_t pwm1_auto_point_temp_hyst_store(struct device *dev,
  392. struct device_attribute *attr,
  393. const char *buf,
  394. size_t count)
  395. {
  396. struct max31760_state *state = dev_get_drvdata(dev);
  397. unsigned int hyst;
  398. int ret;
  399. ret = kstrtou32(buf, 10, &hyst);
  400. if (ret)
  401. return ret;
  402. if (hyst < 3000)
  403. ret = regmap_clear_bits(state->regmap, REG_CR1, CR1_HYST);
  404. else
  405. ret = regmap_set_bits(state->regmap, REG_CR1, CR1_HYST);
  406. if (ret)
  407. return ret;
  408. return count;
  409. }
  410. static DEVICE_ATTR_RW(pwm1_auto_point_temp_hyst);
  411. static void max31760_create_lut_nodes(struct max31760_state *state)
  412. {
  413. int i;
  414. struct sensor_device_attribute *sda;
  415. struct lut_attribute *lut;
  416. for (i = 0; i < LUT_SIZE; ++i) {
  417. lut = &state->lut[i];
  418. sda = &lut->sda;
  419. snprintf(lut->name, sizeof(lut->name),
  420. "pwm1_auto_point%d_pwm", i + 1);
  421. sda->dev_attr.attr.mode = 0644;
  422. sda->index = i;
  423. sda->dev_attr.show = lut_show;
  424. sda->dev_attr.store = lut_store;
  425. sda->dev_attr.attr.name = lut->name;
  426. sysfs_attr_init(&sda->dev_attr.attr);
  427. state->attrs[i] = &sda->dev_attr.attr;
  428. }
  429. state->attrs[i] = &dev_attr_pwm1_auto_point_temp_hyst.attr;
  430. state->group.attrs = state->attrs;
  431. state->groups[0] = &state->group;
  432. }
  433. static int max31760_probe(struct i2c_client *client)
  434. {
  435. struct device *dev = &client->dev;
  436. struct max31760_state *state;
  437. struct device *hwmon_dev;
  438. int ret;
  439. state = devm_kzalloc(dev, sizeof(*state), GFP_KERNEL);
  440. if (!state)
  441. return -ENOMEM;
  442. state->regmap = devm_regmap_init_i2c(client, &regmap_config);
  443. if (IS_ERR(state->regmap))
  444. return dev_err_probe(dev,
  445. PTR_ERR(state->regmap),
  446. "regmap initialization failed\n");
  447. dev_set_drvdata(dev, state);
  448. /* Set alert output to comparator mode */
  449. ret = regmap_set_bits(state->regmap, REG_CR2, CR2_ALERTS);
  450. if (ret)
  451. return dev_err_probe(dev, ret, "cannot write register\n");
  452. max31760_create_lut_nodes(state);
  453. hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
  454. state,
  455. &max31760_chip_info,
  456. state->groups);
  457. return PTR_ERR_OR_ZERO(hwmon_dev);
  458. }
  459. static const struct of_device_id max31760_of_match[] = {
  460. {.compatible = "adi,max31760"},
  461. { }
  462. };
  463. MODULE_DEVICE_TABLE(of, max31760_of_match);
  464. static const struct i2c_device_id max31760_id[] = {
  465. {"max31760"},
  466. { }
  467. };
  468. MODULE_DEVICE_TABLE(i2c, max31760_id);
  469. static int max31760_suspend(struct device *dev)
  470. {
  471. struct max31760_state *state = dev_get_drvdata(dev);
  472. return regmap_set_bits(state->regmap, REG_CR2, CR2_STBY);
  473. }
  474. static int max31760_resume(struct device *dev)
  475. {
  476. struct max31760_state *state = dev_get_drvdata(dev);
  477. return regmap_clear_bits(state->regmap, REG_CR2, CR2_STBY);
  478. }
  479. static DEFINE_SIMPLE_DEV_PM_OPS(max31760_pm_ops, max31760_suspend,
  480. max31760_resume);
  481. static struct i2c_driver max31760_driver = {
  482. .class = I2C_CLASS_HWMON,
  483. .driver = {
  484. .name = "max31760",
  485. .of_match_table = max31760_of_match,
  486. .pm = pm_ptr(&max31760_pm_ops)
  487. },
  488. .probe_new = max31760_probe,
  489. .id_table = max31760_id
  490. };
  491. module_i2c_driver(max31760_driver);
  492. MODULE_AUTHOR("Ibrahim Tilki <[email protected]>");
  493. MODULE_DESCRIPTION("Analog Devices MAX31760 Fan Speed Controller");
  494. MODULE_SOFTDEP("pre: regmap_i2c");
  495. MODULE_VERSION("1.0");
  496. MODULE_LICENSE("GPL");