ltc4151.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Driver for Linear Technology LTC4151 High Voltage I2C Current
  4. * and Voltage Monitor
  5. *
  6. * Copyright (C) 2011 AppearTV AS
  7. *
  8. * Derived from:
  9. *
  10. * Driver for Linear Technology LTC4261 I2C Negative Voltage Hot
  11. * Swap Controller
  12. * Copyright (C) 2010 Ericsson AB.
  13. *
  14. * Datasheet: http://www.linear.com/docs/Datasheet/4151fc.pdf
  15. */
  16. #include <linux/kernel.h>
  17. #include <linux/module.h>
  18. #include <linux/of.h>
  19. #include <linux/init.h>
  20. #include <linux/err.h>
  21. #include <linux/slab.h>
  22. #include <linux/i2c.h>
  23. #include <linux/hwmon.h>
  24. #include <linux/hwmon-sysfs.h>
  25. #include <linux/jiffies.h>
  26. /* chip registers */
  27. #define LTC4151_SENSE_H 0x00
  28. #define LTC4151_SENSE_L 0x01
  29. #define LTC4151_VIN_H 0x02
  30. #define LTC4151_VIN_L 0x03
  31. #define LTC4151_ADIN_H 0x04
  32. #define LTC4151_ADIN_L 0x05
  33. struct ltc4151_data {
  34. struct i2c_client *client;
  35. struct mutex update_lock;
  36. bool valid;
  37. unsigned long last_updated; /* in jiffies */
  38. unsigned int shunt; /* in micro ohms */
  39. /* Registers */
  40. u8 regs[6];
  41. };
  42. static struct ltc4151_data *ltc4151_update_device(struct device *dev)
  43. {
  44. struct ltc4151_data *data = dev_get_drvdata(dev);
  45. struct i2c_client *client = data->client;
  46. struct ltc4151_data *ret = data;
  47. mutex_lock(&data->update_lock);
  48. /*
  49. * The chip's A/D updates 6 times per second
  50. * (Conversion Rate 6 - 9 Hz)
  51. */
  52. if (time_after(jiffies, data->last_updated + HZ / 6) || !data->valid) {
  53. int i;
  54. dev_dbg(&client->dev, "Starting ltc4151 update\n");
  55. /* Read all registers */
  56. for (i = 0; i < ARRAY_SIZE(data->regs); i++) {
  57. int val;
  58. val = i2c_smbus_read_byte_data(client, i);
  59. if (unlikely(val < 0)) {
  60. dev_dbg(dev,
  61. "Failed to read ADC value: error %d\n",
  62. val);
  63. ret = ERR_PTR(val);
  64. goto abort;
  65. }
  66. data->regs[i] = val;
  67. }
  68. data->last_updated = jiffies;
  69. data->valid = true;
  70. }
  71. abort:
  72. mutex_unlock(&data->update_lock);
  73. return ret;
  74. }
  75. /* Return the voltage from the given register in mV */
  76. static int ltc4151_get_value(struct ltc4151_data *data, u8 reg)
  77. {
  78. u32 val;
  79. val = (data->regs[reg] << 4) + (data->regs[reg + 1] >> 4);
  80. switch (reg) {
  81. case LTC4151_ADIN_H:
  82. /* 500uV resolution. Convert to mV. */
  83. val = val * 500 / 1000;
  84. break;
  85. case LTC4151_SENSE_H:
  86. /*
  87. * 20uV resolution. Convert to current as measured with
  88. * a given sense resistor, in mA.
  89. */
  90. val = val * 20 * 1000 / data->shunt;
  91. break;
  92. case LTC4151_VIN_H:
  93. /* 25 mV per increment */
  94. val = val * 25;
  95. break;
  96. default:
  97. /* If we get here, the developer messed up */
  98. WARN_ON_ONCE(1);
  99. val = 0;
  100. break;
  101. }
  102. return val;
  103. }
  104. static ssize_t ltc4151_value_show(struct device *dev,
  105. struct device_attribute *da, char *buf)
  106. {
  107. struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
  108. struct ltc4151_data *data = ltc4151_update_device(dev);
  109. int value;
  110. if (IS_ERR(data))
  111. return PTR_ERR(data);
  112. value = ltc4151_get_value(data, attr->index);
  113. return sysfs_emit(buf, "%d\n", value);
  114. }
  115. /*
  116. * Input voltages.
  117. */
  118. static SENSOR_DEVICE_ATTR_RO(in1_input, ltc4151_value, LTC4151_VIN_H);
  119. static SENSOR_DEVICE_ATTR_RO(in2_input, ltc4151_value, LTC4151_ADIN_H);
  120. /* Currents (via sense resistor) */
  121. static SENSOR_DEVICE_ATTR_RO(curr1_input, ltc4151_value, LTC4151_SENSE_H);
  122. /*
  123. * Finally, construct an array of pointers to members of the above objects,
  124. * as required for sysfs_create_group()
  125. */
  126. static struct attribute *ltc4151_attrs[] = {
  127. &sensor_dev_attr_in1_input.dev_attr.attr,
  128. &sensor_dev_attr_in2_input.dev_attr.attr,
  129. &sensor_dev_attr_curr1_input.dev_attr.attr,
  130. NULL,
  131. };
  132. ATTRIBUTE_GROUPS(ltc4151);
  133. static int ltc4151_probe(struct i2c_client *client)
  134. {
  135. struct i2c_adapter *adapter = client->adapter;
  136. struct device *dev = &client->dev;
  137. struct ltc4151_data *data;
  138. struct device *hwmon_dev;
  139. u32 shunt;
  140. if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
  141. return -ENODEV;
  142. data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
  143. if (!data)
  144. return -ENOMEM;
  145. if (of_property_read_u32(client->dev.of_node,
  146. "shunt-resistor-micro-ohms", &shunt))
  147. shunt = 1000; /* 1 mOhm if not set via DT */
  148. if (shunt == 0)
  149. return -EINVAL;
  150. data->shunt = shunt;
  151. data->client = client;
  152. mutex_init(&data->update_lock);
  153. hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
  154. data,
  155. ltc4151_groups);
  156. return PTR_ERR_OR_ZERO(hwmon_dev);
  157. }
  158. static const struct i2c_device_id ltc4151_id[] = {
  159. { "ltc4151", 0 },
  160. { }
  161. };
  162. MODULE_DEVICE_TABLE(i2c, ltc4151_id);
  163. static const struct of_device_id __maybe_unused ltc4151_match[] = {
  164. { .compatible = "lltc,ltc4151" },
  165. {},
  166. };
  167. MODULE_DEVICE_TABLE(of, ltc4151_match);
  168. /* This is the driver that will be inserted */
  169. static struct i2c_driver ltc4151_driver = {
  170. .driver = {
  171. .name = "ltc4151",
  172. .of_match_table = of_match_ptr(ltc4151_match),
  173. },
  174. .probe_new = ltc4151_probe,
  175. .id_table = ltc4151_id,
  176. };
  177. module_i2c_driver(ltc4151_driver);
  178. MODULE_AUTHOR("Per Dalen <[email protected]>");
  179. MODULE_DESCRIPTION("LTC4151 driver");
  180. MODULE_LICENSE("GPL");