ltc4222.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Driver for Linear Technology LTC4222 Dual Hot Swap controller
  4. *
  5. * Copyright (c) 2014 Guenter Roeck
  6. */
  7. #include <linux/kernel.h>
  8. #include <linux/module.h>
  9. #include <linux/err.h>
  10. #include <linux/slab.h>
  11. #include <linux/bitops.h>
  12. #include <linux/i2c.h>
  13. #include <linux/hwmon.h>
  14. #include <linux/hwmon-sysfs.h>
  15. #include <linux/jiffies.h>
  16. #include <linux/regmap.h>
  17. /* chip registers */
  18. #define LTC4222_CONTROL1 0xd0
  19. #define LTC4222_ALERT1 0xd1
  20. #define LTC4222_STATUS1 0xd2
  21. #define LTC4222_FAULT1 0xd3
  22. #define LTC4222_CONTROL2 0xd4
  23. #define LTC4222_ALERT2 0xd5
  24. #define LTC4222_STATUS2 0xd6
  25. #define LTC4222_FAULT2 0xd7
  26. #define LTC4222_SOURCE1 0xd8
  27. #define LTC4222_SOURCE2 0xda
  28. #define LTC4222_ADIN1 0xdc
  29. #define LTC4222_ADIN2 0xde
  30. #define LTC4222_SENSE1 0xe0
  31. #define LTC4222_SENSE2 0xe2
  32. #define LTC4222_ADC_CONTROL 0xe4
  33. /*
  34. * Fault register bits
  35. */
  36. #define FAULT_OV BIT(0)
  37. #define FAULT_UV BIT(1)
  38. #define FAULT_OC BIT(2)
  39. #define FAULT_POWER_BAD BIT(3)
  40. #define FAULT_FET_BAD BIT(5)
  41. /* Return the voltage from the given register in mV or mA */
  42. static int ltc4222_get_value(struct device *dev, u8 reg)
  43. {
  44. struct regmap *regmap = dev_get_drvdata(dev);
  45. unsigned int val;
  46. u8 buf[2];
  47. int ret;
  48. ret = regmap_bulk_read(regmap, reg, buf, 2);
  49. if (ret < 0)
  50. return ret;
  51. val = ((buf[0] << 8) + buf[1]) >> 6;
  52. switch (reg) {
  53. case LTC4222_ADIN1:
  54. case LTC4222_ADIN2:
  55. /* 1.25 mV resolution. Convert to mV. */
  56. val = DIV_ROUND_CLOSEST(val * 5, 4);
  57. break;
  58. case LTC4222_SOURCE1:
  59. case LTC4222_SOURCE2:
  60. /* 31.25 mV resolution. Convert to mV. */
  61. val = DIV_ROUND_CLOSEST(val * 125, 4);
  62. break;
  63. case LTC4222_SENSE1:
  64. case LTC4222_SENSE2:
  65. /*
  66. * 62.5 uV resolution. Convert to current as measured with
  67. * an 1 mOhm sense resistor, in mA. If a different sense
  68. * resistor is installed, calculate the actual current by
  69. * dividing the reported current by the sense resistor value
  70. * in mOhm.
  71. */
  72. val = DIV_ROUND_CLOSEST(val * 125, 2);
  73. break;
  74. default:
  75. return -EINVAL;
  76. }
  77. return val;
  78. }
  79. static ssize_t ltc4222_value_show(struct device *dev,
  80. struct device_attribute *da, char *buf)
  81. {
  82. struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
  83. int value;
  84. value = ltc4222_get_value(dev, attr->index);
  85. if (value < 0)
  86. return value;
  87. return sysfs_emit(buf, "%d\n", value);
  88. }
  89. static ssize_t ltc4222_bool_show(struct device *dev,
  90. struct device_attribute *da, char *buf)
  91. {
  92. struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(da);
  93. struct regmap *regmap = dev_get_drvdata(dev);
  94. unsigned int fault;
  95. int ret;
  96. ret = regmap_read(regmap, attr->nr, &fault);
  97. if (ret < 0)
  98. return ret;
  99. fault &= attr->index;
  100. if (fault) /* Clear reported faults in chip register */
  101. regmap_update_bits(regmap, attr->nr, attr->index, 0);
  102. return sysfs_emit(buf, "%d\n", !!fault);
  103. }
  104. /* Voltages */
  105. static SENSOR_DEVICE_ATTR_RO(in1_input, ltc4222_value, LTC4222_SOURCE1);
  106. static SENSOR_DEVICE_ATTR_RO(in2_input, ltc4222_value, LTC4222_ADIN1);
  107. static SENSOR_DEVICE_ATTR_RO(in3_input, ltc4222_value, LTC4222_SOURCE2);
  108. static SENSOR_DEVICE_ATTR_RO(in4_input, ltc4222_value, LTC4222_ADIN2);
  109. /*
  110. * Voltage alarms
  111. * UV/OV faults are associated with the input voltage, and power bad and fet
  112. * faults are associated with the output voltage.
  113. */
  114. static SENSOR_DEVICE_ATTR_2_RO(in1_min_alarm, ltc4222_bool, LTC4222_FAULT1,
  115. FAULT_UV);
  116. static SENSOR_DEVICE_ATTR_2_RO(in1_max_alarm, ltc4222_bool, LTC4222_FAULT1,
  117. FAULT_OV);
  118. static SENSOR_DEVICE_ATTR_2_RO(in2_alarm, ltc4222_bool, LTC4222_FAULT1,
  119. FAULT_POWER_BAD | FAULT_FET_BAD);
  120. static SENSOR_DEVICE_ATTR_2_RO(in3_min_alarm, ltc4222_bool, LTC4222_FAULT2,
  121. FAULT_UV);
  122. static SENSOR_DEVICE_ATTR_2_RO(in3_max_alarm, ltc4222_bool, LTC4222_FAULT2,
  123. FAULT_OV);
  124. static SENSOR_DEVICE_ATTR_2_RO(in4_alarm, ltc4222_bool, LTC4222_FAULT2,
  125. FAULT_POWER_BAD | FAULT_FET_BAD);
  126. /* Current (via sense resistor) */
  127. static SENSOR_DEVICE_ATTR_RO(curr1_input, ltc4222_value, LTC4222_SENSE1);
  128. static SENSOR_DEVICE_ATTR_RO(curr2_input, ltc4222_value, LTC4222_SENSE2);
  129. /* Overcurrent alarm */
  130. static SENSOR_DEVICE_ATTR_2_RO(curr1_max_alarm, ltc4222_bool, LTC4222_FAULT1,
  131. FAULT_OC);
  132. static SENSOR_DEVICE_ATTR_2_RO(curr2_max_alarm, ltc4222_bool, LTC4222_FAULT2,
  133. FAULT_OC);
  134. static struct attribute *ltc4222_attrs[] = {
  135. &sensor_dev_attr_in1_input.dev_attr.attr,
  136. &sensor_dev_attr_in1_min_alarm.dev_attr.attr,
  137. &sensor_dev_attr_in1_max_alarm.dev_attr.attr,
  138. &sensor_dev_attr_in2_input.dev_attr.attr,
  139. &sensor_dev_attr_in2_alarm.dev_attr.attr,
  140. &sensor_dev_attr_in3_input.dev_attr.attr,
  141. &sensor_dev_attr_in3_min_alarm.dev_attr.attr,
  142. &sensor_dev_attr_in3_max_alarm.dev_attr.attr,
  143. &sensor_dev_attr_in4_input.dev_attr.attr,
  144. &sensor_dev_attr_in4_alarm.dev_attr.attr,
  145. &sensor_dev_attr_curr1_input.dev_attr.attr,
  146. &sensor_dev_attr_curr1_max_alarm.dev_attr.attr,
  147. &sensor_dev_attr_curr2_input.dev_attr.attr,
  148. &sensor_dev_attr_curr2_max_alarm.dev_attr.attr,
  149. NULL,
  150. };
  151. ATTRIBUTE_GROUPS(ltc4222);
  152. static const struct regmap_config ltc4222_regmap_config = {
  153. .reg_bits = 8,
  154. .val_bits = 8,
  155. .max_register = LTC4222_ADC_CONTROL,
  156. };
  157. static int ltc4222_probe(struct i2c_client *client)
  158. {
  159. struct device *dev = &client->dev;
  160. struct device *hwmon_dev;
  161. struct regmap *regmap;
  162. regmap = devm_regmap_init_i2c(client, &ltc4222_regmap_config);
  163. if (IS_ERR(regmap)) {
  164. dev_err(dev, "failed to allocate register map\n");
  165. return PTR_ERR(regmap);
  166. }
  167. /* Clear faults */
  168. regmap_write(regmap, LTC4222_FAULT1, 0x00);
  169. regmap_write(regmap, LTC4222_FAULT2, 0x00);
  170. hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
  171. regmap,
  172. ltc4222_groups);
  173. return PTR_ERR_OR_ZERO(hwmon_dev);
  174. }
  175. static const struct i2c_device_id ltc4222_id[] = {
  176. {"ltc4222", 0},
  177. { }
  178. };
  179. MODULE_DEVICE_TABLE(i2c, ltc4222_id);
  180. static struct i2c_driver ltc4222_driver = {
  181. .driver = {
  182. .name = "ltc4222",
  183. },
  184. .probe_new = ltc4222_probe,
  185. .id_table = ltc4222_id,
  186. };
  187. module_i2c_driver(ltc4222_driver);
  188. MODULE_AUTHOR("Guenter Roeck <[email protected]>");
  189. MODULE_DESCRIPTION("LTC4222 driver");
  190. MODULE_LICENSE("GPL");