1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Driver for Linear Technology LTC4261 I2C Negative Voltage Hot Swap Controller
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2010 Ericsson AB.
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Derived from:
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * Driver for Linear Technology LTC4245 I2C Multiple Supply Hot Swap Controller
10*4882a593Smuzhiyun * Copyright (C) 2008 Ira W. Snyder <iws@ovro.caltech.edu>
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun * Datasheet: http://cds.linear.com/docs/Datasheet/42612fb.pdf
13*4882a593Smuzhiyun */
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #include <linux/kernel.h>
16*4882a593Smuzhiyun #include <linux/module.h>
17*4882a593Smuzhiyun #include <linux/init.h>
18*4882a593Smuzhiyun #include <linux/err.h>
19*4882a593Smuzhiyun #include <linux/slab.h>
20*4882a593Smuzhiyun #include <linux/i2c.h>
21*4882a593Smuzhiyun #include <linux/hwmon.h>
22*4882a593Smuzhiyun #include <linux/hwmon-sysfs.h>
23*4882a593Smuzhiyun #include <linux/jiffies.h>
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun /* chip registers */
26*4882a593Smuzhiyun #define LTC4261_STATUS 0x00 /* readonly */
27*4882a593Smuzhiyun #define LTC4261_FAULT 0x01
28*4882a593Smuzhiyun #define LTC4261_ALERT 0x02
29*4882a593Smuzhiyun #define LTC4261_CONTROL 0x03
30*4882a593Smuzhiyun #define LTC4261_SENSE_H 0x04
31*4882a593Smuzhiyun #define LTC4261_SENSE_L 0x05
32*4882a593Smuzhiyun #define LTC4261_ADIN2_H 0x06
33*4882a593Smuzhiyun #define LTC4261_ADIN2_L 0x07
34*4882a593Smuzhiyun #define LTC4261_ADIN_H 0x08
35*4882a593Smuzhiyun #define LTC4261_ADIN_L 0x09
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun /*
38*4882a593Smuzhiyun * Fault register bits
39*4882a593Smuzhiyun */
40*4882a593Smuzhiyun #define FAULT_OV (1<<0)
41*4882a593Smuzhiyun #define FAULT_UV (1<<1)
42*4882a593Smuzhiyun #define FAULT_OC (1<<2)
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun struct ltc4261_data {
45*4882a593Smuzhiyun struct i2c_client *client;
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun struct mutex update_lock;
48*4882a593Smuzhiyun bool valid;
49*4882a593Smuzhiyun unsigned long last_updated; /* in jiffies */
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun /* Registers */
52*4882a593Smuzhiyun u8 regs[10];
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun
ltc4261_update_device(struct device * dev)55*4882a593Smuzhiyun static struct ltc4261_data *ltc4261_update_device(struct device *dev)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun struct ltc4261_data *data = dev_get_drvdata(dev);
58*4882a593Smuzhiyun struct i2c_client *client = data->client;
59*4882a593Smuzhiyun struct ltc4261_data *ret = data;
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun mutex_lock(&data->update_lock);
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun if (time_after(jiffies, data->last_updated + HZ / 4) || !data->valid) {
64*4882a593Smuzhiyun int i;
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun /* Read registers -- 0x00 to 0x09 */
67*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(data->regs); i++) {
68*4882a593Smuzhiyun int val;
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun val = i2c_smbus_read_byte_data(client, i);
71*4882a593Smuzhiyun if (unlikely(val < 0)) {
72*4882a593Smuzhiyun dev_dbg(dev,
73*4882a593Smuzhiyun "Failed to read ADC value: error %d\n",
74*4882a593Smuzhiyun val);
75*4882a593Smuzhiyun ret = ERR_PTR(val);
76*4882a593Smuzhiyun data->valid = 0;
77*4882a593Smuzhiyun goto abort;
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun data->regs[i] = val;
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun data->last_updated = jiffies;
82*4882a593Smuzhiyun data->valid = 1;
83*4882a593Smuzhiyun }
84*4882a593Smuzhiyun abort:
85*4882a593Smuzhiyun mutex_unlock(&data->update_lock);
86*4882a593Smuzhiyun return ret;
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun /* Return the voltage from the given register in mV or mA */
ltc4261_get_value(struct ltc4261_data * data,u8 reg)90*4882a593Smuzhiyun static int ltc4261_get_value(struct ltc4261_data *data, u8 reg)
91*4882a593Smuzhiyun {
92*4882a593Smuzhiyun u32 val;
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun val = (data->regs[reg] << 2) + (data->regs[reg + 1] >> 6);
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun switch (reg) {
97*4882a593Smuzhiyun case LTC4261_ADIN_H:
98*4882a593Smuzhiyun case LTC4261_ADIN2_H:
99*4882a593Smuzhiyun /* 2.5mV resolution. Convert to mV. */
100*4882a593Smuzhiyun val = val * 25 / 10;
101*4882a593Smuzhiyun break;
102*4882a593Smuzhiyun case LTC4261_SENSE_H:
103*4882a593Smuzhiyun /*
104*4882a593Smuzhiyun * 62.5uV resolution. Convert to current as measured with
105*4882a593Smuzhiyun * an 1 mOhm sense resistor, in mA. If a different sense
106*4882a593Smuzhiyun * resistor is installed, calculate the actual current by
107*4882a593Smuzhiyun * dividing the reported current by the sense resistor value
108*4882a593Smuzhiyun * in mOhm.
109*4882a593Smuzhiyun */
110*4882a593Smuzhiyun val = val * 625 / 10;
111*4882a593Smuzhiyun break;
112*4882a593Smuzhiyun default:
113*4882a593Smuzhiyun /* If we get here, the developer messed up */
114*4882a593Smuzhiyun WARN_ON_ONCE(1);
115*4882a593Smuzhiyun val = 0;
116*4882a593Smuzhiyun break;
117*4882a593Smuzhiyun }
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun return val;
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun
ltc4261_value_show(struct device * dev,struct device_attribute * da,char * buf)122*4882a593Smuzhiyun static ssize_t ltc4261_value_show(struct device *dev,
123*4882a593Smuzhiyun struct device_attribute *da, char *buf)
124*4882a593Smuzhiyun {
125*4882a593Smuzhiyun struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
126*4882a593Smuzhiyun struct ltc4261_data *data = ltc4261_update_device(dev);
127*4882a593Smuzhiyun int value;
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun if (IS_ERR(data))
130*4882a593Smuzhiyun return PTR_ERR(data);
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun value = ltc4261_get_value(data, attr->index);
133*4882a593Smuzhiyun return snprintf(buf, PAGE_SIZE, "%d\n", value);
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun
ltc4261_bool_show(struct device * dev,struct device_attribute * da,char * buf)136*4882a593Smuzhiyun static ssize_t ltc4261_bool_show(struct device *dev,
137*4882a593Smuzhiyun struct device_attribute *da, char *buf)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
140*4882a593Smuzhiyun struct ltc4261_data *data = ltc4261_update_device(dev);
141*4882a593Smuzhiyun u8 fault;
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun if (IS_ERR(data))
144*4882a593Smuzhiyun return PTR_ERR(data);
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun fault = data->regs[LTC4261_FAULT] & attr->index;
147*4882a593Smuzhiyun if (fault) /* Clear reported faults in chip register */
148*4882a593Smuzhiyun i2c_smbus_write_byte_data(data->client, LTC4261_FAULT, ~fault);
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun return snprintf(buf, PAGE_SIZE, "%d\n", fault ? 1 : 0);
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun /*
154*4882a593Smuzhiyun * Input voltages.
155*4882a593Smuzhiyun */
156*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(in1_input, ltc4261_value, LTC4261_ADIN_H);
157*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(in2_input, ltc4261_value, LTC4261_ADIN2_H);
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun /*
160*4882a593Smuzhiyun * Voltage alarms. The chip has only one set of voltage alarm status bits,
161*4882a593Smuzhiyun * triggered by input voltage alarms. In many designs, those alarms are
162*4882a593Smuzhiyun * associated with the ADIN2 sensor, due to the proximity of the ADIN2 pin
163*4882a593Smuzhiyun * to the OV pin. ADIN2 is, however, not available on all chip variants.
164*4882a593Smuzhiyun * To ensure that the alarm condition is reported to the user, report it
165*4882a593Smuzhiyun * with both voltage sensors.
166*4882a593Smuzhiyun */
167*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(in1_min_alarm, ltc4261_bool, FAULT_UV);
168*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(in1_max_alarm, ltc4261_bool, FAULT_OV);
169*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(in2_min_alarm, ltc4261_bool, FAULT_UV);
170*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(in2_max_alarm, ltc4261_bool, FAULT_OV);
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun /* Currents (via sense resistor) */
173*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(curr1_input, ltc4261_value, LTC4261_SENSE_H);
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun /* Overcurrent alarm */
176*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(curr1_max_alarm, ltc4261_bool, FAULT_OC);
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun static struct attribute *ltc4261_attrs[] = {
179*4882a593Smuzhiyun &sensor_dev_attr_in1_input.dev_attr.attr,
180*4882a593Smuzhiyun &sensor_dev_attr_in1_min_alarm.dev_attr.attr,
181*4882a593Smuzhiyun &sensor_dev_attr_in1_max_alarm.dev_attr.attr,
182*4882a593Smuzhiyun &sensor_dev_attr_in2_input.dev_attr.attr,
183*4882a593Smuzhiyun &sensor_dev_attr_in2_min_alarm.dev_attr.attr,
184*4882a593Smuzhiyun &sensor_dev_attr_in2_max_alarm.dev_attr.attr,
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun &sensor_dev_attr_curr1_input.dev_attr.attr,
187*4882a593Smuzhiyun &sensor_dev_attr_curr1_max_alarm.dev_attr.attr,
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun NULL,
190*4882a593Smuzhiyun };
191*4882a593Smuzhiyun ATTRIBUTE_GROUPS(ltc4261);
192*4882a593Smuzhiyun
ltc4261_probe(struct i2c_client * client)193*4882a593Smuzhiyun static int ltc4261_probe(struct i2c_client *client)
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun struct i2c_adapter *adapter = client->adapter;
196*4882a593Smuzhiyun struct device *dev = &client->dev;
197*4882a593Smuzhiyun struct ltc4261_data *data;
198*4882a593Smuzhiyun struct device *hwmon_dev;
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
201*4882a593Smuzhiyun return -ENODEV;
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun if (i2c_smbus_read_byte_data(client, LTC4261_STATUS) < 0) {
204*4882a593Smuzhiyun dev_err(dev, "Failed to read status register\n");
205*4882a593Smuzhiyun return -ENODEV;
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
209*4882a593Smuzhiyun if (!data)
210*4882a593Smuzhiyun return -ENOMEM;
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun data->client = client;
213*4882a593Smuzhiyun mutex_init(&data->update_lock);
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun /* Clear faults */
216*4882a593Smuzhiyun i2c_smbus_write_byte_data(client, LTC4261_FAULT, 0x00);
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
219*4882a593Smuzhiyun data,
220*4882a593Smuzhiyun ltc4261_groups);
221*4882a593Smuzhiyun return PTR_ERR_OR_ZERO(hwmon_dev);
222*4882a593Smuzhiyun }
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun static const struct i2c_device_id ltc4261_id[] = {
225*4882a593Smuzhiyun {"ltc4261", 0},
226*4882a593Smuzhiyun {}
227*4882a593Smuzhiyun };
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, ltc4261_id);
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun /* This is the driver that will be inserted */
232*4882a593Smuzhiyun static struct i2c_driver ltc4261_driver = {
233*4882a593Smuzhiyun .driver = {
234*4882a593Smuzhiyun .name = "ltc4261",
235*4882a593Smuzhiyun },
236*4882a593Smuzhiyun .probe_new = ltc4261_probe,
237*4882a593Smuzhiyun .id_table = ltc4261_id,
238*4882a593Smuzhiyun };
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun module_i2c_driver(ltc4261_driver);
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
243*4882a593Smuzhiyun MODULE_DESCRIPTION("LTC4261 driver");
244*4882a593Smuzhiyun MODULE_LICENSE("GPL");
245