tmp421.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /* tmp421.c
  3. *
  4. * Copyright (C) 2009 Andre Prendel <andre.prendel@gmx.de>
  5. * Preliminary support by:
  6. * Melvin Rook, Raymond Ng
  7. */
  8. /*
  9. * Driver for the Texas Instruments TMP421 SMBus temperature sensor IC.
  10. * Supported models: TMP421, TMP422, TMP423, TMP441, TMP442
  11. */
  12. #include <linux/module.h>
  13. #include <linux/init.h>
  14. #include <linux/slab.h>
  15. #include <linux/jiffies.h>
  16. #include <linux/i2c.h>
  17. #include <linux/hwmon.h>
  18. #include <linux/hwmon-sysfs.h>
  19. #include <linux/err.h>
  20. #include <linux/of.h>
  21. #include <linux/sysfs.h>
  22. /* Addresses to scan */
  23. static const unsigned short normal_i2c[] = { 0x2a, 0x4c, 0x4d, 0x4e, 0x4f,
  24. I2C_CLIENT_END };
  25. enum chips { tmp421, tmp422, tmp423, tmp441, tmp442 };
  26. #define MAX_CHANNELS 4
  27. /* The TMP421 registers */
  28. #define TMP421_STATUS_REG 0x08
  29. #define TMP421_CONFIG_REG_1 0x09
  30. #define TMP421_CONFIG_REG_2 0x0A
  31. #define TMP421_CONFIG_REG_REN(x) (BIT(3 + (x)))
  32. #define TMP421_CONFIG_REG_REN_MASK GENMASK(6, 3)
  33. #define TMP421_CONVERSION_RATE_REG 0x0B
  34. #define TMP421_N_FACTOR_REG_1 0x21
  35. #define TMP421_MANUFACTURER_ID_REG 0xFE
  36. #define TMP421_DEVICE_ID_REG 0xFF
  37. static const u8 TMP421_TEMP_MSB[MAX_CHANNELS] = { 0x00, 0x01, 0x02, 0x03 };
  38. static const u8 TMP421_TEMP_LSB[MAX_CHANNELS] = { 0x10, 0x11, 0x12, 0x13 };
  39. /* Flags */
  40. #define TMP421_CONFIG_SHUTDOWN 0x40
  41. #define TMP421_CONFIG_RANGE 0x04
  42. /* Manufacturer / Device ID's */
  43. #define TMP421_MANUFACTURER_ID 0x55
  44. #define TMP421_DEVICE_ID 0x21
  45. #define TMP422_DEVICE_ID 0x22
  46. #define TMP423_DEVICE_ID 0x23
  47. #define TMP441_DEVICE_ID 0x41
  48. #define TMP442_DEVICE_ID 0x42
  49. static const struct i2c_device_id tmp421_id[] = {
  50. { "tmp421", 2 },
  51. { "tmp422", 3 },
  52. { "tmp423", 4 },
  53. { "tmp441", 2 },
  54. { "tmp442", 3 },
  55. { }
  56. };
  57. MODULE_DEVICE_TABLE(i2c, tmp421_id);
  58. static const struct of_device_id __maybe_unused tmp421_of_match[] = {
  59. {
  60. .compatible = "ti,tmp421",
  61. .data = (void *)2
  62. },
  63. {
  64. .compatible = "ti,tmp422",
  65. .data = (void *)3
  66. },
  67. {
  68. .compatible = "ti,tmp423",
  69. .data = (void *)4
  70. },
  71. {
  72. .compatible = "ti,tmp441",
  73. .data = (void *)2
  74. },
  75. {
  76. .compatible = "ti,tmp442",
  77. .data = (void *)3
  78. },
  79. { },
  80. };
  81. MODULE_DEVICE_TABLE(of, tmp421_of_match);
  82. struct tmp421_channel {
  83. const char *label;
  84. bool enabled;
  85. s16 temp;
  86. };
  87. struct tmp421_data {
  88. struct i2c_client *client;
  89. u32 temp_config[MAX_CHANNELS + 1];
  90. struct hwmon_channel_info temp_info;
  91. const struct hwmon_channel_info *info[2];
  92. struct hwmon_chip_info chip;
  93. bool valid;
  94. unsigned long last_updated;
  95. unsigned long channels;
  96. u8 config;
  97. struct tmp421_channel channel[MAX_CHANNELS];
  98. };
  99. static int temp_from_raw(u16 reg, bool extended)
  100. {
  101. /* Mask out status bits */
  102. int temp = reg & ~0xf;
  103. if (extended)
  104. temp = temp - 64 * 256;
  105. else
  106. temp = (s16)temp;
  107. return DIV_ROUND_CLOSEST(temp * 1000, 256);
  108. }
  109. static int tmp421_update_device(struct tmp421_data *data)
  110. {
  111. struct i2c_client *client = data->client;
  112. int ret = 0;
  113. int i;
  114. if (time_after(jiffies, data->last_updated + (HZ / 2)) ||
  115. !data->valid) {
  116. data->valid = false;
  117. ret = i2c_smbus_read_byte_data(client, TMP421_CONFIG_REG_1);
  118. if (ret < 0)
  119. return ret;
  120. data->config = ret;
  121. for (i = 0; i < data->channels; i++) {
  122. ret = i2c_smbus_read_byte_data(client, TMP421_TEMP_MSB[i]);
  123. if (ret < 0)
  124. return ret;
  125. data->channel[i].temp = ret << 8;
  126. ret = i2c_smbus_read_byte_data(client, TMP421_TEMP_LSB[i]);
  127. if (ret < 0)
  128. return ret;
  129. data->channel[i].temp |= ret;
  130. }
  131. data->last_updated = jiffies;
  132. data->valid = true;
  133. }
  134. return 0;
  135. }
  136. static int tmp421_enable_channels(struct tmp421_data *data)
  137. {
  138. int err;
  139. struct i2c_client *client = data->client;
  140. struct device *dev = &client->dev;
  141. int old = i2c_smbus_read_byte_data(client, TMP421_CONFIG_REG_2);
  142. int new, i;
  143. if (old < 0) {
  144. dev_err(dev, "error reading register, can't disable channels\n");
  145. return old;
  146. }
  147. new = old & ~TMP421_CONFIG_REG_REN_MASK;
  148. for (i = 0; i < data->channels; i++)
  149. if (data->channel[i].enabled)
  150. new |= TMP421_CONFIG_REG_REN(i);
  151. if (new == old)
  152. return 0;
  153. err = i2c_smbus_write_byte_data(client, TMP421_CONFIG_REG_2, new);
  154. if (err < 0)
  155. dev_err(dev, "error writing register, can't disable channels\n");
  156. return err;
  157. }
  158. static int tmp421_read(struct device *dev, enum hwmon_sensor_types type,
  159. u32 attr, int channel, long *val)
  160. {
  161. struct tmp421_data *tmp421 = dev_get_drvdata(dev);
  162. int ret = 0;
  163. ret = tmp421_update_device(tmp421);
  164. if (ret)
  165. return ret;
  166. switch (attr) {
  167. case hwmon_temp_input:
  168. if (!tmp421->channel[channel].enabled)
  169. return -ENODATA;
  170. *val = temp_from_raw(tmp421->channel[channel].temp,
  171. tmp421->config & TMP421_CONFIG_RANGE);
  172. return 0;
  173. case hwmon_temp_fault:
  174. if (!tmp421->channel[channel].enabled)
  175. return -ENODATA;
  176. /*
  177. * Any of OPEN or /PVLD bits indicate a hardware mulfunction
  178. * and the conversion result may be incorrect
  179. */
  180. *val = !!(tmp421->channel[channel].temp & 0x03);
  181. return 0;
  182. case hwmon_temp_enable:
  183. *val = tmp421->channel[channel].enabled;
  184. return 0;
  185. default:
  186. return -EOPNOTSUPP;
  187. }
  188. }
  189. static int tmp421_read_string(struct device *dev, enum hwmon_sensor_types type,
  190. u32 attr, int channel, const char **str)
  191. {
  192. struct tmp421_data *data = dev_get_drvdata(dev);
  193. *str = data->channel[channel].label;
  194. return 0;
  195. }
  196. static int tmp421_write(struct device *dev, enum hwmon_sensor_types type,
  197. u32 attr, int channel, long val)
  198. {
  199. struct tmp421_data *data = dev_get_drvdata(dev);
  200. int ret;
  201. switch (attr) {
  202. case hwmon_temp_enable:
  203. data->channel[channel].enabled = val;
  204. ret = tmp421_enable_channels(data);
  205. break;
  206. default:
  207. ret = -EOPNOTSUPP;
  208. }
  209. return ret;
  210. }
  211. static umode_t tmp421_is_visible(const void *data, enum hwmon_sensor_types type,
  212. u32 attr, int channel)
  213. {
  214. switch (attr) {
  215. case hwmon_temp_fault:
  216. case hwmon_temp_input:
  217. case hwmon_temp_label:
  218. return 0444;
  219. case hwmon_temp_enable:
  220. return 0644;
  221. default:
  222. return 0;
  223. }
  224. }
  225. static int tmp421_init_client(struct tmp421_data *data)
  226. {
  227. int config, config_orig;
  228. struct i2c_client *client = data->client;
  229. /* Set the conversion rate to 2 Hz */
  230. i2c_smbus_write_byte_data(client, TMP421_CONVERSION_RATE_REG, 0x05);
  231. /* Start conversions (disable shutdown if necessary) */
  232. config = i2c_smbus_read_byte_data(client, TMP421_CONFIG_REG_1);
  233. if (config < 0) {
  234. dev_err(&client->dev,
  235. "Could not read configuration register (%d)\n", config);
  236. return config;
  237. }
  238. config_orig = config;
  239. config &= ~TMP421_CONFIG_SHUTDOWN;
  240. if (config != config_orig) {
  241. dev_info(&client->dev, "Enable monitoring chip\n");
  242. i2c_smbus_write_byte_data(client, TMP421_CONFIG_REG_1, config);
  243. }
  244. return tmp421_enable_channels(data);
  245. }
  246. static int tmp421_detect(struct i2c_client *client,
  247. struct i2c_board_info *info)
  248. {
  249. enum chips kind;
  250. struct i2c_adapter *adapter = client->adapter;
  251. static const char * const names[] = {
  252. "TMP421", "TMP422", "TMP423",
  253. "TMP441", "TMP442"
  254. };
  255. int addr = client->addr;
  256. u8 reg;
  257. if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
  258. return -ENODEV;
  259. reg = i2c_smbus_read_byte_data(client, TMP421_MANUFACTURER_ID_REG);
  260. if (reg != TMP421_MANUFACTURER_ID)
  261. return -ENODEV;
  262. reg = i2c_smbus_read_byte_data(client, TMP421_CONVERSION_RATE_REG);
  263. if (reg & 0xf8)
  264. return -ENODEV;
  265. reg = i2c_smbus_read_byte_data(client, TMP421_STATUS_REG);
  266. if (reg & 0x7f)
  267. return -ENODEV;
  268. reg = i2c_smbus_read_byte_data(client, TMP421_DEVICE_ID_REG);
  269. switch (reg) {
  270. case TMP421_DEVICE_ID:
  271. kind = tmp421;
  272. break;
  273. case TMP422_DEVICE_ID:
  274. if (addr == 0x2a)
  275. return -ENODEV;
  276. kind = tmp422;
  277. break;
  278. case TMP423_DEVICE_ID:
  279. if (addr != 0x4c && addr != 0x4d)
  280. return -ENODEV;
  281. kind = tmp423;
  282. break;
  283. case TMP441_DEVICE_ID:
  284. kind = tmp441;
  285. break;
  286. case TMP442_DEVICE_ID:
  287. if (addr != 0x4c && addr != 0x4d)
  288. return -ENODEV;
  289. kind = tmp442;
  290. break;
  291. default:
  292. return -ENODEV;
  293. }
  294. strscpy(info->type, tmp421_id[kind].name, I2C_NAME_SIZE);
  295. dev_info(&adapter->dev, "Detected TI %s chip at 0x%02x\n",
  296. names[kind], client->addr);
  297. return 0;
  298. }
  299. static int tmp421_probe_child_from_dt(struct i2c_client *client,
  300. struct device_node *child,
  301. struct tmp421_data *data)
  302. {
  303. struct device *dev = &client->dev;
  304. u32 i;
  305. s32 val;
  306. int err;
  307. err = of_property_read_u32(child, "reg", &i);
  308. if (err) {
  309. dev_err(dev, "missing reg property of %pOFn\n", child);
  310. return err;
  311. }
  312. if (i >= data->channels) {
  313. dev_err(dev, "invalid reg %d of %pOFn\n", i, child);
  314. return -EINVAL;
  315. }
  316. err = of_property_read_string(child, "label", &data->channel[i].label);
  317. if (err == -ENODATA || err == -EILSEQ) {
  318. dev_err(dev, "invalid label property in %pOFn\n", child);
  319. return err;
  320. }
  321. if (data->channel[i].label)
  322. data->temp_config[i] |= HWMON_T_LABEL;
  323. data->channel[i].enabled = of_device_is_available(child);
  324. err = of_property_read_s32(child, "ti,n-factor", &val);
  325. if (!err) {
  326. if (i == 0) {
  327. dev_err(dev, "n-factor can't be set for internal channel\n");
  328. return -EINVAL;
  329. }
  330. if (val > 127 || val < -128) {
  331. dev_err(dev, "n-factor for channel %d invalid (%d)\n",
  332. i, val);
  333. return -EINVAL;
  334. }
  335. i2c_smbus_write_byte_data(client, TMP421_N_FACTOR_REG_1 + i - 1,
  336. val);
  337. }
  338. return 0;
  339. }
  340. static int tmp421_probe_from_dt(struct i2c_client *client, struct tmp421_data *data)
  341. {
  342. struct device *dev = &client->dev;
  343. const struct device_node *np = dev->of_node;
  344. int err;
  345. for_each_child_of_node_scoped(np, child) {
  346. if (strcmp(child->name, "channel"))
  347. continue;
  348. err = tmp421_probe_child_from_dt(client, child, data);
  349. if (err)
  350. return err;
  351. }
  352. return 0;
  353. }
  354. static const struct hwmon_ops tmp421_ops = {
  355. .is_visible = tmp421_is_visible,
  356. .read = tmp421_read,
  357. .read_string = tmp421_read_string,
  358. .write = tmp421_write,
  359. };
  360. static int tmp421_probe(struct i2c_client *client)
  361. {
  362. struct device *dev = &client->dev;
  363. struct device *hwmon_dev;
  364. struct tmp421_data *data;
  365. int i, err;
  366. data = devm_kzalloc(dev, sizeof(struct tmp421_data), GFP_KERNEL);
  367. if (!data)
  368. return -ENOMEM;
  369. data->channels = (unsigned long)i2c_get_match_data(client);
  370. data->client = client;
  371. for (i = 0; i < data->channels; i++) {
  372. data->temp_config[i] = HWMON_T_INPUT | HWMON_T_FAULT | HWMON_T_ENABLE;
  373. data->channel[i].enabled = true;
  374. }
  375. err = tmp421_probe_from_dt(client, data);
  376. if (err)
  377. return err;
  378. err = tmp421_init_client(data);
  379. if (err)
  380. return err;
  381. data->chip.ops = &tmp421_ops;
  382. data->chip.info = data->info;
  383. data->info[0] = &data->temp_info;
  384. data->temp_info.type = hwmon_temp;
  385. data->temp_info.config = data->temp_config;
  386. hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
  387. data,
  388. &data->chip,
  389. NULL);
  390. return PTR_ERR_OR_ZERO(hwmon_dev);
  391. }
  392. static struct i2c_driver tmp421_driver = {
  393. .class = I2C_CLASS_HWMON,
  394. .driver = {
  395. .name = "tmp421",
  396. .of_match_table = of_match_ptr(tmp421_of_match),
  397. },
  398. .probe = tmp421_probe,
  399. .id_table = tmp421_id,
  400. .detect = tmp421_detect,
  401. .address_list = normal_i2c,
  402. };
  403. module_i2c_driver(tmp421_driver);
  404. MODULE_AUTHOR("Andre Prendel <andre.prendel@gmx.de>");
  405. MODULE_DESCRIPTION("Texas Instruments TMP421/422/423/441/442 temperature sensor driver");
  406. MODULE_LICENSE("GPL");