lm92.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * lm92 - Hardware monitoring driver
  4. * Copyright (C) 2005-2008 Jean Delvare <jdelvare@suse.de>
  5. *
  6. * Based on the lm90 driver, with some ideas taken from the lm_sensors
  7. * lm92 driver as well.
  8. *
  9. * The LM92 is a sensor chip made by National Semiconductor. It reports
  10. * its own temperature with a 0.0625 deg resolution and a 0.33 deg
  11. * accuracy. Complete datasheet can be obtained from National's website
  12. * at:
  13. * http://www.national.com/pf/LM/LM92.html
  14. *
  15. * This driver also supports the MAX6635 sensor chip made by Maxim.
  16. * This chip is compatible with the LM92, but has a lesser accuracy
  17. * (1.0 deg). Complete datasheet can be obtained from Maxim's website
  18. * at:
  19. * http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3074
  20. *
  21. * Since the LM92 was the first chipset supported by this driver, most
  22. * comments will refer to this chipset, but are actually general and
  23. * concern all supported chipsets, unless mentioned otherwise.
  24. *
  25. * Support could easily be added for the National Semiconductor LM76
  26. * and Maxim MAX6633 and MAX6634 chips, which are mostly compatible
  27. * with the LM92.
  28. */
  29. #include <linux/err.h>
  30. #include <linux/hwmon.h>
  31. #include <linux/i2c.h>
  32. #include <linux/init.h>
  33. #include <linux/module.h>
  34. #include <linux/regmap.h>
  35. #include <linux/slab.h>
  36. /*
  37. * The LM92 and MAX6635 have 2 two-state pins for address selection,
  38. * resulting in 4 possible addresses.
  39. */
  40. static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b,
  41. I2C_CLIENT_END };
  42. /* The LM92 registers */
  43. #define LM92_REG_CONFIG 0x01 /* 8-bit, RW */
  44. #define LM92_REG_TEMP 0x00 /* 16-bit, RO */
  45. #define LM92_REG_TEMP_HYST 0x02 /* 16-bit, RW */
  46. #define LM92_REG_TEMP_CRIT 0x03 /* 16-bit, RW */
  47. #define LM92_REG_TEMP_LOW 0x04 /* 16-bit, RW */
  48. #define LM92_REG_TEMP_HIGH 0x05 /* 16-bit, RW */
  49. #define LM92_REG_MAN_ID 0x07 /* 16-bit, RO, LM92 only */
  50. /*
  51. * The LM92 uses signed 13-bit values with LSB = 0.0625 degree Celsius,
  52. * left-justified in 16-bit registers. No rounding is done, with such
  53. * a resolution it's just not worth it. Note that the MAX6635 doesn't
  54. * make use of the 4 lower bits for limits (i.e. effective resolution
  55. * for limits is 1 degree Celsius).
  56. */
  57. static inline int TEMP_FROM_REG(s16 reg)
  58. {
  59. return reg / 8 * 625 / 10;
  60. }
  61. static inline s16 TEMP_TO_REG(long val, int resolution)
  62. {
  63. val = clamp_val(val, -60000, 160000);
  64. return DIV_ROUND_CLOSEST(val << (resolution - 9), 1000) << (16 - resolution);
  65. }
  66. /* Alarm flags are stored in the 3 LSB of the temperature register */
  67. static inline u8 ALARMS_FROM_REG(s16 reg)
  68. {
  69. return reg & 0x0007;
  70. }
  71. /* Client data (each client gets its own) */
  72. struct lm92_data {
  73. struct regmap *regmap;
  74. int resolution;
  75. };
  76. static int lm92_temp_read(struct lm92_data *data, u32 attr, int channel, long *val)
  77. {
  78. int reg = -1, hyst_reg = -1, alarm_bit = 0;
  79. struct regmap *regmap = data->regmap;
  80. u32 temp;
  81. int ret;
  82. switch (attr) {
  83. case hwmon_temp_input:
  84. reg = LM92_REG_TEMP;
  85. break;
  86. case hwmon_temp_min:
  87. reg = LM92_REG_TEMP_LOW;
  88. break;
  89. case hwmon_temp_max:
  90. reg = LM92_REG_TEMP_HIGH;
  91. break;
  92. case hwmon_temp_crit:
  93. reg = LM92_REG_TEMP_CRIT;
  94. break;
  95. case hwmon_temp_min_hyst:
  96. hyst_reg = LM92_REG_TEMP_LOW;
  97. break;
  98. case hwmon_temp_max_hyst:
  99. hyst_reg = LM92_REG_TEMP_HIGH;
  100. break;
  101. case hwmon_temp_crit_hyst:
  102. hyst_reg = LM92_REG_TEMP_CRIT;
  103. break;
  104. case hwmon_temp_min_alarm:
  105. alarm_bit = 0;
  106. break;
  107. case hwmon_temp_max_alarm:
  108. alarm_bit = 1;
  109. break;
  110. case hwmon_temp_crit_alarm:
  111. alarm_bit = 2;
  112. break;
  113. default:
  114. return -EOPNOTSUPP;
  115. }
  116. if (reg >= 0) {
  117. ret = regmap_read(regmap, reg, &temp);
  118. if (ret < 0)
  119. return ret;
  120. *val = TEMP_FROM_REG(temp);
  121. } else if (hyst_reg >= 0) {
  122. u32 regs[2] = { hyst_reg, LM92_REG_TEMP_HYST };
  123. u16 regvals[2];
  124. ret = regmap_multi_reg_read(regmap, regs, regvals, 2);
  125. if (ret)
  126. return ret;
  127. if (attr == hwmon_temp_min_hyst)
  128. *val = TEMP_FROM_REG(regvals[0]) + TEMP_FROM_REG(regvals[1]);
  129. else
  130. *val = TEMP_FROM_REG(regvals[0]) - TEMP_FROM_REG(regvals[1]);
  131. } else {
  132. ret = regmap_read(regmap, LM92_REG_TEMP, &temp);
  133. if (ret)
  134. return ret;
  135. *val = !!(temp & BIT(alarm_bit));
  136. }
  137. return 0;
  138. }
  139. static int lm92_chip_read(struct lm92_data *data, u32 attr, long *val)
  140. {
  141. u32 temp;
  142. int ret;
  143. switch (attr) {
  144. case hwmon_chip_alarms:
  145. ret = regmap_read(data->regmap, LM92_REG_TEMP, &temp);
  146. if (ret)
  147. return ret;
  148. *val = ALARMS_FROM_REG(temp);
  149. break;
  150. default:
  151. return -EOPNOTSUPP;
  152. }
  153. return 0;
  154. }
  155. static int lm92_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
  156. int channel, long *val)
  157. {
  158. struct lm92_data *data = dev_get_drvdata(dev);
  159. switch (type) {
  160. case hwmon_chip:
  161. return lm92_chip_read(data, attr, val);
  162. case hwmon_temp:
  163. return lm92_temp_read(data, attr, channel, val);
  164. default:
  165. return -EOPNOTSUPP;
  166. }
  167. }
  168. static int lm92_temp_write(struct lm92_data *data, u32 attr, long val)
  169. {
  170. struct regmap *regmap = data->regmap;
  171. int reg, err;
  172. u32 temp;
  173. switch (attr) {
  174. case hwmon_temp_min:
  175. reg = LM92_REG_TEMP_LOW;
  176. break;
  177. case hwmon_temp_max:
  178. reg = LM92_REG_TEMP_HIGH;
  179. break;
  180. case hwmon_temp_crit:
  181. reg = LM92_REG_TEMP_CRIT;
  182. break;
  183. case hwmon_temp_crit_hyst:
  184. val = clamp_val(val, -120000, 220000);
  185. err = regmap_read(regmap, LM92_REG_TEMP_CRIT, &temp);
  186. if (err)
  187. return err;
  188. val = TEMP_TO_REG(TEMP_FROM_REG(temp) - val, data->resolution);
  189. return regmap_write(regmap, LM92_REG_TEMP_HYST, val);
  190. default:
  191. return -EOPNOTSUPP;
  192. }
  193. return regmap_write(regmap, reg, TEMP_TO_REG(val, data->resolution));
  194. }
  195. static int lm92_write(struct device *dev, enum hwmon_sensor_types type,
  196. u32 attr, int channel, long val)
  197. {
  198. struct lm92_data *data = dev_get_drvdata(dev);
  199. switch (type) {
  200. case hwmon_temp:
  201. return lm92_temp_write(data, attr, val);
  202. default:
  203. return -EOPNOTSUPP;
  204. }
  205. }
  206. static umode_t lm92_is_visible(const void *_data, enum hwmon_sensor_types type,
  207. u32 attr, int channel)
  208. {
  209. switch (type) {
  210. case hwmon_chip:
  211. switch (attr) {
  212. case hwmon_chip_alarms:
  213. return 0444;
  214. default:
  215. break;
  216. }
  217. break;
  218. case hwmon_temp:
  219. switch (attr) {
  220. case hwmon_temp_min:
  221. case hwmon_temp_max:
  222. case hwmon_temp_crit:
  223. case hwmon_temp_crit_hyst:
  224. return 0644;
  225. case hwmon_temp_input:
  226. case hwmon_temp_min_hyst:
  227. case hwmon_temp_max_hyst:
  228. case hwmon_temp_min_alarm:
  229. case hwmon_temp_max_alarm:
  230. case hwmon_temp_crit_alarm:
  231. return 0444;
  232. default:
  233. break;
  234. }
  235. break;
  236. default:
  237. break;
  238. }
  239. return 0;
  240. }
  241. static const struct hwmon_channel_info * const lm92_info[] = {
  242. HWMON_CHANNEL_INFO(chip, HWMON_C_ALARMS),
  243. HWMON_CHANNEL_INFO(temp,
  244. HWMON_T_INPUT |
  245. HWMON_T_MIN | HWMON_T_MIN_HYST |
  246. HWMON_T_MAX | HWMON_T_MAX_HYST |
  247. HWMON_T_CRIT | HWMON_T_CRIT_HYST |
  248. HWMON_T_MIN_ALARM | HWMON_T_MAX_ALARM |
  249. HWMON_T_CRIT_ALARM),
  250. NULL
  251. };
  252. static const struct hwmon_ops lm92_hwmon_ops = {
  253. .is_visible = lm92_is_visible,
  254. .read = lm92_read,
  255. .write = lm92_write,
  256. };
  257. static const struct hwmon_chip_info lm92_chip_info = {
  258. .ops = &lm92_hwmon_ops,
  259. .info = lm92_info,
  260. };
  261. /*
  262. * Detection and registration
  263. */
  264. static int lm92_init_client(struct regmap *regmap)
  265. {
  266. return regmap_clear_bits(regmap, LM92_REG_CONFIG, 0x01);
  267. }
  268. /* Return 0 if detection is successful, -ENODEV otherwise */
  269. static int lm92_detect(struct i2c_client *new_client,
  270. struct i2c_board_info *info)
  271. {
  272. struct i2c_adapter *adapter = new_client->adapter;
  273. u8 config_addr = LM92_REG_CONFIG;
  274. u8 man_id_addr = LM92_REG_MAN_ID;
  275. int i, regval;
  276. if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA
  277. | I2C_FUNC_SMBUS_WORD_DATA))
  278. return -ENODEV;
  279. /*
  280. * Register values repeat with multiples of 8.
  281. * Read twice to improve detection accuracy.
  282. */
  283. for (i = 0; i < 2; i++) {
  284. regval = i2c_smbus_read_word_data(new_client, man_id_addr);
  285. if (regval != 0x0180)
  286. return -ENODEV;
  287. regval = i2c_smbus_read_byte_data(new_client, config_addr);
  288. if (regval < 0 || (regval & 0xe0))
  289. return -ENODEV;
  290. config_addr += 8;
  291. man_id_addr += 8;
  292. }
  293. strscpy(info->type, "lm92", I2C_NAME_SIZE);
  294. return 0;
  295. }
  296. /* regmap */
  297. static int lm92_reg_read(void *context, unsigned int reg, unsigned int *val)
  298. {
  299. int ret;
  300. if (reg == LM92_REG_CONFIG)
  301. ret = i2c_smbus_read_byte_data(context, reg);
  302. else
  303. ret = i2c_smbus_read_word_swapped(context, reg);
  304. if (ret < 0)
  305. return ret;
  306. *val = ret;
  307. return 0;
  308. }
  309. static int lm92_reg_write(void *context, unsigned int reg, unsigned int val)
  310. {
  311. if (reg == LM92_REG_CONFIG)
  312. return i2c_smbus_write_byte_data(context, LM92_REG_CONFIG, val);
  313. return i2c_smbus_write_word_swapped(context, reg, val);
  314. }
  315. static bool lm92_regmap_is_volatile(struct device *dev, unsigned int reg)
  316. {
  317. return reg == LM92_REG_TEMP;
  318. }
  319. static bool lm92_regmap_is_writeable(struct device *dev, unsigned int reg)
  320. {
  321. return reg >= LM92_REG_CONFIG;
  322. }
  323. static const struct regmap_config lm92_regmap_config = {
  324. .reg_bits = 8,
  325. .val_bits = 16,
  326. .max_register = LM92_REG_TEMP_HIGH,
  327. .cache_type = REGCACHE_MAPLE,
  328. .volatile_reg = lm92_regmap_is_volatile,
  329. .writeable_reg = lm92_regmap_is_writeable,
  330. };
  331. static const struct regmap_bus lm92_regmap_bus = {
  332. .reg_write = lm92_reg_write,
  333. .reg_read = lm92_reg_read,
  334. };
  335. static int lm92_probe(struct i2c_client *client)
  336. {
  337. struct device *dev = &client->dev;
  338. struct device *hwmon_dev;
  339. struct lm92_data *data;
  340. struct regmap *regmap;
  341. int err;
  342. regmap = devm_regmap_init(dev, &lm92_regmap_bus, client,
  343. &lm92_regmap_config);
  344. if (IS_ERR(regmap))
  345. return PTR_ERR(regmap);
  346. data = devm_kzalloc(dev, sizeof(struct lm92_data), GFP_KERNEL);
  347. if (!data)
  348. return -ENOMEM;
  349. data->regmap = regmap;
  350. data->resolution = (unsigned long)i2c_get_match_data(client);
  351. /* Initialize the chipset */
  352. err = lm92_init_client(regmap);
  353. if (err)
  354. return err;
  355. hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, data,
  356. &lm92_chip_info, NULL);
  357. return PTR_ERR_OR_ZERO(hwmon_dev);
  358. }
  359. /*
  360. * Module and driver stuff
  361. */
  362. /* .driver_data is limit register resolution */
  363. static const struct i2c_device_id lm92_id[] = {
  364. { "lm92", 13 },
  365. { "max6635", 9 },
  366. { }
  367. };
  368. MODULE_DEVICE_TABLE(i2c, lm92_id);
  369. static struct i2c_driver lm92_driver = {
  370. .class = I2C_CLASS_HWMON,
  371. .driver = {
  372. .name = "lm92",
  373. },
  374. .probe = lm92_probe,
  375. .id_table = lm92_id,
  376. .detect = lm92_detect,
  377. .address_list = normal_i2c,
  378. };
  379. module_i2c_driver(lm92_driver);
  380. MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>");
  381. MODULE_DESCRIPTION("LM92/MAX6635 driver");
  382. MODULE_LICENSE("GPL");