xref: /OK3568_Linux_fs/kernel/drivers/hwmon/ltc4261.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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