1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Driver for TI ADC128D818 System Monitor with Temperature Sensor
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (c) 2014 Guenter Roeck
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Derived from lm80.c
8*4882a593Smuzhiyun * Copyright (C) 1998, 1999 Frodo Looijaard <frodol@dds.nl>
9*4882a593Smuzhiyun * and Philip Edelbrock <phil@netroedge.com>
10*4882a593Smuzhiyun */
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #include <linux/module.h>
13*4882a593Smuzhiyun #include <linux/slab.h>
14*4882a593Smuzhiyun #include <linux/jiffies.h>
15*4882a593Smuzhiyun #include <linux/i2c.h>
16*4882a593Smuzhiyun #include <linux/hwmon.h>
17*4882a593Smuzhiyun #include <linux/hwmon-sysfs.h>
18*4882a593Smuzhiyun #include <linux/err.h>
19*4882a593Smuzhiyun #include <linux/regulator/consumer.h>
20*4882a593Smuzhiyun #include <linux/mutex.h>
21*4882a593Smuzhiyun #include <linux/bitops.h>
22*4882a593Smuzhiyun #include <linux/of.h>
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun /* Addresses to scan
25*4882a593Smuzhiyun * The chip also supports addresses 0x35..0x37. Don't scan those addresses
26*4882a593Smuzhiyun * since they are also used by some EEPROMs, which may result in false
27*4882a593Smuzhiyun * positives.
28*4882a593Smuzhiyun */
29*4882a593Smuzhiyun static const unsigned short normal_i2c[] = {
30*4882a593Smuzhiyun 0x1d, 0x1e, 0x1f, 0x2d, 0x2e, 0x2f, I2C_CLIENT_END };
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun /* registers */
33*4882a593Smuzhiyun #define ADC128_REG_IN_MAX(nr) (0x2a + (nr) * 2)
34*4882a593Smuzhiyun #define ADC128_REG_IN_MIN(nr) (0x2b + (nr) * 2)
35*4882a593Smuzhiyun #define ADC128_REG_IN(nr) (0x20 + (nr))
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun #define ADC128_REG_TEMP 0x27
38*4882a593Smuzhiyun #define ADC128_REG_TEMP_MAX 0x38
39*4882a593Smuzhiyun #define ADC128_REG_TEMP_HYST 0x39
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun #define ADC128_REG_CONFIG 0x00
42*4882a593Smuzhiyun #define ADC128_REG_ALARM 0x01
43*4882a593Smuzhiyun #define ADC128_REG_MASK 0x03
44*4882a593Smuzhiyun #define ADC128_REG_CONV_RATE 0x07
45*4882a593Smuzhiyun #define ADC128_REG_ONESHOT 0x09
46*4882a593Smuzhiyun #define ADC128_REG_SHUTDOWN 0x0a
47*4882a593Smuzhiyun #define ADC128_REG_CONFIG_ADV 0x0b
48*4882a593Smuzhiyun #define ADC128_REG_BUSY_STATUS 0x0c
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun #define ADC128_REG_MAN_ID 0x3e
51*4882a593Smuzhiyun #define ADC128_REG_DEV_ID 0x3f
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun /* No. of voltage entries in adc128_attrs */
54*4882a593Smuzhiyun #define ADC128_ATTR_NUM_VOLT (8 * 4)
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun /* Voltage inputs visible per operation mode */
57*4882a593Smuzhiyun static const u8 num_inputs[] = { 7, 8, 4, 6 };
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun struct adc128_data {
60*4882a593Smuzhiyun struct i2c_client *client;
61*4882a593Smuzhiyun struct regulator *regulator;
62*4882a593Smuzhiyun int vref; /* Reference voltage in mV */
63*4882a593Smuzhiyun struct mutex update_lock;
64*4882a593Smuzhiyun u8 mode; /* Operation mode */
65*4882a593Smuzhiyun bool valid; /* true if following fields are valid */
66*4882a593Smuzhiyun unsigned long last_updated; /* In jiffies */
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun u16 in[3][8]; /* Register value, normalized to 12 bit
69*4882a593Smuzhiyun * 0: input voltage
70*4882a593Smuzhiyun * 1: min limit
71*4882a593Smuzhiyun * 2: max limit
72*4882a593Smuzhiyun */
73*4882a593Smuzhiyun s16 temp[3]; /* Register value, normalized to 9 bit
74*4882a593Smuzhiyun * 0: sensor 1: limit 2: hyst
75*4882a593Smuzhiyun */
76*4882a593Smuzhiyun u8 alarms; /* alarm register value */
77*4882a593Smuzhiyun };
78*4882a593Smuzhiyun
adc128_update_device(struct device * dev)79*4882a593Smuzhiyun static struct adc128_data *adc128_update_device(struct device *dev)
80*4882a593Smuzhiyun {
81*4882a593Smuzhiyun struct adc128_data *data = dev_get_drvdata(dev);
82*4882a593Smuzhiyun struct i2c_client *client = data->client;
83*4882a593Smuzhiyun struct adc128_data *ret = data;
84*4882a593Smuzhiyun int i, rv;
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun mutex_lock(&data->update_lock);
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
89*4882a593Smuzhiyun for (i = 0; i < num_inputs[data->mode]; i++) {
90*4882a593Smuzhiyun rv = i2c_smbus_read_word_swapped(client,
91*4882a593Smuzhiyun ADC128_REG_IN(i));
92*4882a593Smuzhiyun if (rv < 0)
93*4882a593Smuzhiyun goto abort;
94*4882a593Smuzhiyun data->in[0][i] = rv >> 4;
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun rv = i2c_smbus_read_byte_data(client,
97*4882a593Smuzhiyun ADC128_REG_IN_MIN(i));
98*4882a593Smuzhiyun if (rv < 0)
99*4882a593Smuzhiyun goto abort;
100*4882a593Smuzhiyun data->in[1][i] = rv << 4;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun rv = i2c_smbus_read_byte_data(client,
103*4882a593Smuzhiyun ADC128_REG_IN_MAX(i));
104*4882a593Smuzhiyun if (rv < 0)
105*4882a593Smuzhiyun goto abort;
106*4882a593Smuzhiyun data->in[2][i] = rv << 4;
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun if (data->mode != 1) {
110*4882a593Smuzhiyun rv = i2c_smbus_read_word_swapped(client,
111*4882a593Smuzhiyun ADC128_REG_TEMP);
112*4882a593Smuzhiyun if (rv < 0)
113*4882a593Smuzhiyun goto abort;
114*4882a593Smuzhiyun data->temp[0] = rv >> 7;
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun rv = i2c_smbus_read_byte_data(client,
117*4882a593Smuzhiyun ADC128_REG_TEMP_MAX);
118*4882a593Smuzhiyun if (rv < 0)
119*4882a593Smuzhiyun goto abort;
120*4882a593Smuzhiyun data->temp[1] = rv << 1;
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun rv = i2c_smbus_read_byte_data(client,
123*4882a593Smuzhiyun ADC128_REG_TEMP_HYST);
124*4882a593Smuzhiyun if (rv < 0)
125*4882a593Smuzhiyun goto abort;
126*4882a593Smuzhiyun data->temp[2] = rv << 1;
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun rv = i2c_smbus_read_byte_data(client, ADC128_REG_ALARM);
130*4882a593Smuzhiyun if (rv < 0)
131*4882a593Smuzhiyun goto abort;
132*4882a593Smuzhiyun data->alarms |= rv;
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun data->last_updated = jiffies;
135*4882a593Smuzhiyun data->valid = true;
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun goto done;
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun abort:
140*4882a593Smuzhiyun ret = ERR_PTR(rv);
141*4882a593Smuzhiyun data->valid = false;
142*4882a593Smuzhiyun done:
143*4882a593Smuzhiyun mutex_unlock(&data->update_lock);
144*4882a593Smuzhiyun return ret;
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun
adc128_in_show(struct device * dev,struct device_attribute * attr,char * buf)147*4882a593Smuzhiyun static ssize_t adc128_in_show(struct device *dev,
148*4882a593Smuzhiyun struct device_attribute *attr, char *buf)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun struct adc128_data *data = adc128_update_device(dev);
151*4882a593Smuzhiyun int index = to_sensor_dev_attr_2(attr)->index;
152*4882a593Smuzhiyun int nr = to_sensor_dev_attr_2(attr)->nr;
153*4882a593Smuzhiyun int val;
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun if (IS_ERR(data))
156*4882a593Smuzhiyun return PTR_ERR(data);
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun val = DIV_ROUND_CLOSEST(data->in[index][nr] * data->vref, 4095);
159*4882a593Smuzhiyun return sprintf(buf, "%d\n", val);
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun
adc128_in_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)162*4882a593Smuzhiyun static ssize_t adc128_in_store(struct device *dev,
163*4882a593Smuzhiyun struct device_attribute *attr, const char *buf,
164*4882a593Smuzhiyun size_t count)
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun struct adc128_data *data = dev_get_drvdata(dev);
167*4882a593Smuzhiyun int index = to_sensor_dev_attr_2(attr)->index;
168*4882a593Smuzhiyun int nr = to_sensor_dev_attr_2(attr)->nr;
169*4882a593Smuzhiyun u8 reg, regval;
170*4882a593Smuzhiyun long val;
171*4882a593Smuzhiyun int err;
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun err = kstrtol(buf, 10, &val);
174*4882a593Smuzhiyun if (err < 0)
175*4882a593Smuzhiyun return err;
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun mutex_lock(&data->update_lock);
178*4882a593Smuzhiyun /* 10 mV LSB on limit registers */
179*4882a593Smuzhiyun regval = clamp_val(DIV_ROUND_CLOSEST(val, 10), 0, 255);
180*4882a593Smuzhiyun data->in[index][nr] = regval << 4;
181*4882a593Smuzhiyun reg = index == 1 ? ADC128_REG_IN_MIN(nr) : ADC128_REG_IN_MAX(nr);
182*4882a593Smuzhiyun i2c_smbus_write_byte_data(data->client, reg, regval);
183*4882a593Smuzhiyun mutex_unlock(&data->update_lock);
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun return count;
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun
adc128_temp_show(struct device * dev,struct device_attribute * attr,char * buf)188*4882a593Smuzhiyun static ssize_t adc128_temp_show(struct device *dev,
189*4882a593Smuzhiyun struct device_attribute *attr, char *buf)
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun struct adc128_data *data = adc128_update_device(dev);
192*4882a593Smuzhiyun int index = to_sensor_dev_attr(attr)->index;
193*4882a593Smuzhiyun int temp;
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun if (IS_ERR(data))
196*4882a593Smuzhiyun return PTR_ERR(data);
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun temp = sign_extend32(data->temp[index], 8);
199*4882a593Smuzhiyun return sprintf(buf, "%d\n", temp * 500);/* 0.5 degrees C resolution */
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun
adc128_temp_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)202*4882a593Smuzhiyun static ssize_t adc128_temp_store(struct device *dev,
203*4882a593Smuzhiyun struct device_attribute *attr,
204*4882a593Smuzhiyun const char *buf, size_t count)
205*4882a593Smuzhiyun {
206*4882a593Smuzhiyun struct adc128_data *data = dev_get_drvdata(dev);
207*4882a593Smuzhiyun int index = to_sensor_dev_attr(attr)->index;
208*4882a593Smuzhiyun long val;
209*4882a593Smuzhiyun int err;
210*4882a593Smuzhiyun s8 regval;
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun err = kstrtol(buf, 10, &val);
213*4882a593Smuzhiyun if (err < 0)
214*4882a593Smuzhiyun return err;
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun mutex_lock(&data->update_lock);
217*4882a593Smuzhiyun regval = clamp_val(DIV_ROUND_CLOSEST(val, 1000), -128, 127);
218*4882a593Smuzhiyun data->temp[index] = regval << 1;
219*4882a593Smuzhiyun i2c_smbus_write_byte_data(data->client,
220*4882a593Smuzhiyun index == 1 ? ADC128_REG_TEMP_MAX
221*4882a593Smuzhiyun : ADC128_REG_TEMP_HYST,
222*4882a593Smuzhiyun regval);
223*4882a593Smuzhiyun mutex_unlock(&data->update_lock);
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun return count;
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun
adc128_alarm_show(struct device * dev,struct device_attribute * attr,char * buf)228*4882a593Smuzhiyun static ssize_t adc128_alarm_show(struct device *dev,
229*4882a593Smuzhiyun struct device_attribute *attr, char *buf)
230*4882a593Smuzhiyun {
231*4882a593Smuzhiyun struct adc128_data *data = adc128_update_device(dev);
232*4882a593Smuzhiyun int mask = 1 << to_sensor_dev_attr(attr)->index;
233*4882a593Smuzhiyun u8 alarms;
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun if (IS_ERR(data))
236*4882a593Smuzhiyun return PTR_ERR(data);
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun /*
239*4882a593Smuzhiyun * Clear an alarm after reporting it to user space. If it is still
240*4882a593Smuzhiyun * active, the next update sequence will set the alarm bit again.
241*4882a593Smuzhiyun */
242*4882a593Smuzhiyun alarms = data->alarms;
243*4882a593Smuzhiyun data->alarms &= ~mask;
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun return sprintf(buf, "%u\n", !!(alarms & mask));
246*4882a593Smuzhiyun }
247*4882a593Smuzhiyun
adc128_is_visible(struct kobject * kobj,struct attribute * attr,int index)248*4882a593Smuzhiyun static umode_t adc128_is_visible(struct kobject *kobj,
249*4882a593Smuzhiyun struct attribute *attr, int index)
250*4882a593Smuzhiyun {
251*4882a593Smuzhiyun struct device *dev = container_of(kobj, struct device, kobj);
252*4882a593Smuzhiyun struct adc128_data *data = dev_get_drvdata(dev);
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun if (index < ADC128_ATTR_NUM_VOLT) {
255*4882a593Smuzhiyun /* Voltage, visible according to num_inputs[] */
256*4882a593Smuzhiyun if (index >= num_inputs[data->mode] * 4)
257*4882a593Smuzhiyun return 0;
258*4882a593Smuzhiyun } else {
259*4882a593Smuzhiyun /* Temperature, visible if not in mode 1 */
260*4882a593Smuzhiyun if (data->mode == 1)
261*4882a593Smuzhiyun return 0;
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun return attr->mode;
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RO(in0_input, adc128_in, 0, 0);
268*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in0_min, adc128_in, 0, 1);
269*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in0_max, adc128_in, 0, 2);
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RO(in1_input, adc128_in, 1, 0);
272*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in1_min, adc128_in, 1, 1);
273*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in1_max, adc128_in, 1, 2);
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RO(in2_input, adc128_in, 2, 0);
276*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in2_min, adc128_in, 2, 1);
277*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in2_max, adc128_in, 2, 2);
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RO(in3_input, adc128_in, 3, 0);
280*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in3_min, adc128_in, 3, 1);
281*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in3_max, adc128_in, 3, 2);
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RO(in4_input, adc128_in, 4, 0);
284*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in4_min, adc128_in, 4, 1);
285*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in4_max, adc128_in, 4, 2);
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RO(in5_input, adc128_in, 5, 0);
288*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in5_min, adc128_in, 5, 1);
289*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in5_max, adc128_in, 5, 2);
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RO(in6_input, adc128_in, 6, 0);
292*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in6_min, adc128_in, 6, 1);
293*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in6_max, adc128_in, 6, 2);
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RO(in7_input, adc128_in, 7, 0);
296*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in7_min, adc128_in, 7, 1);
297*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_2_RW(in7_max, adc128_in, 7, 2);
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(temp1_input, adc128_temp, 0);
300*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RW(temp1_max, adc128_temp, 1);
301*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RW(temp1_max_hyst, adc128_temp, 2);
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(in0_alarm, adc128_alarm, 0);
304*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(in1_alarm, adc128_alarm, 1);
305*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(in2_alarm, adc128_alarm, 2);
306*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(in3_alarm, adc128_alarm, 3);
307*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(in4_alarm, adc128_alarm, 4);
308*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(in5_alarm, adc128_alarm, 5);
309*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(in6_alarm, adc128_alarm, 6);
310*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(in7_alarm, adc128_alarm, 7);
311*4882a593Smuzhiyun static SENSOR_DEVICE_ATTR_RO(temp1_max_alarm, adc128_alarm, 7);
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun static struct attribute *adc128_attrs[] = {
314*4882a593Smuzhiyun &sensor_dev_attr_in0_alarm.dev_attr.attr,
315*4882a593Smuzhiyun &sensor_dev_attr_in0_input.dev_attr.attr,
316*4882a593Smuzhiyun &sensor_dev_attr_in0_max.dev_attr.attr,
317*4882a593Smuzhiyun &sensor_dev_attr_in0_min.dev_attr.attr,
318*4882a593Smuzhiyun &sensor_dev_attr_in1_alarm.dev_attr.attr,
319*4882a593Smuzhiyun &sensor_dev_attr_in1_input.dev_attr.attr,
320*4882a593Smuzhiyun &sensor_dev_attr_in1_max.dev_attr.attr,
321*4882a593Smuzhiyun &sensor_dev_attr_in1_min.dev_attr.attr,
322*4882a593Smuzhiyun &sensor_dev_attr_in2_alarm.dev_attr.attr,
323*4882a593Smuzhiyun &sensor_dev_attr_in2_input.dev_attr.attr,
324*4882a593Smuzhiyun &sensor_dev_attr_in2_max.dev_attr.attr,
325*4882a593Smuzhiyun &sensor_dev_attr_in2_min.dev_attr.attr,
326*4882a593Smuzhiyun &sensor_dev_attr_in3_alarm.dev_attr.attr,
327*4882a593Smuzhiyun &sensor_dev_attr_in3_input.dev_attr.attr,
328*4882a593Smuzhiyun &sensor_dev_attr_in3_max.dev_attr.attr,
329*4882a593Smuzhiyun &sensor_dev_attr_in3_min.dev_attr.attr,
330*4882a593Smuzhiyun &sensor_dev_attr_in4_alarm.dev_attr.attr,
331*4882a593Smuzhiyun &sensor_dev_attr_in4_input.dev_attr.attr,
332*4882a593Smuzhiyun &sensor_dev_attr_in4_max.dev_attr.attr,
333*4882a593Smuzhiyun &sensor_dev_attr_in4_min.dev_attr.attr,
334*4882a593Smuzhiyun &sensor_dev_attr_in5_alarm.dev_attr.attr,
335*4882a593Smuzhiyun &sensor_dev_attr_in5_input.dev_attr.attr,
336*4882a593Smuzhiyun &sensor_dev_attr_in5_max.dev_attr.attr,
337*4882a593Smuzhiyun &sensor_dev_attr_in5_min.dev_attr.attr,
338*4882a593Smuzhiyun &sensor_dev_attr_in6_alarm.dev_attr.attr,
339*4882a593Smuzhiyun &sensor_dev_attr_in6_input.dev_attr.attr,
340*4882a593Smuzhiyun &sensor_dev_attr_in6_max.dev_attr.attr,
341*4882a593Smuzhiyun &sensor_dev_attr_in6_min.dev_attr.attr,
342*4882a593Smuzhiyun &sensor_dev_attr_in7_alarm.dev_attr.attr,
343*4882a593Smuzhiyun &sensor_dev_attr_in7_input.dev_attr.attr,
344*4882a593Smuzhiyun &sensor_dev_attr_in7_max.dev_attr.attr,
345*4882a593Smuzhiyun &sensor_dev_attr_in7_min.dev_attr.attr,
346*4882a593Smuzhiyun &sensor_dev_attr_temp1_input.dev_attr.attr,
347*4882a593Smuzhiyun &sensor_dev_attr_temp1_max.dev_attr.attr,
348*4882a593Smuzhiyun &sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
349*4882a593Smuzhiyun &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
350*4882a593Smuzhiyun NULL
351*4882a593Smuzhiyun };
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun static const struct attribute_group adc128_group = {
354*4882a593Smuzhiyun .attrs = adc128_attrs,
355*4882a593Smuzhiyun .is_visible = adc128_is_visible,
356*4882a593Smuzhiyun };
357*4882a593Smuzhiyun __ATTRIBUTE_GROUPS(adc128);
358*4882a593Smuzhiyun
adc128_detect(struct i2c_client * client,struct i2c_board_info * info)359*4882a593Smuzhiyun static int adc128_detect(struct i2c_client *client, struct i2c_board_info *info)
360*4882a593Smuzhiyun {
361*4882a593Smuzhiyun int man_id, dev_id;
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun if (!i2c_check_functionality(client->adapter,
364*4882a593Smuzhiyun I2C_FUNC_SMBUS_BYTE_DATA |
365*4882a593Smuzhiyun I2C_FUNC_SMBUS_WORD_DATA))
366*4882a593Smuzhiyun return -ENODEV;
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun man_id = i2c_smbus_read_byte_data(client, ADC128_REG_MAN_ID);
369*4882a593Smuzhiyun dev_id = i2c_smbus_read_byte_data(client, ADC128_REG_DEV_ID);
370*4882a593Smuzhiyun if (man_id != 0x01 || dev_id != 0x09)
371*4882a593Smuzhiyun return -ENODEV;
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun /* Check unused bits for confirmation */
374*4882a593Smuzhiyun if (i2c_smbus_read_byte_data(client, ADC128_REG_CONFIG) & 0xf4)
375*4882a593Smuzhiyun return -ENODEV;
376*4882a593Smuzhiyun if (i2c_smbus_read_byte_data(client, ADC128_REG_CONV_RATE) & 0xfe)
377*4882a593Smuzhiyun return -ENODEV;
378*4882a593Smuzhiyun if (i2c_smbus_read_byte_data(client, ADC128_REG_ONESHOT) & 0xfe)
379*4882a593Smuzhiyun return -ENODEV;
380*4882a593Smuzhiyun if (i2c_smbus_read_byte_data(client, ADC128_REG_SHUTDOWN) & 0xfe)
381*4882a593Smuzhiyun return -ENODEV;
382*4882a593Smuzhiyun if (i2c_smbus_read_byte_data(client, ADC128_REG_CONFIG_ADV) & 0xf8)
383*4882a593Smuzhiyun return -ENODEV;
384*4882a593Smuzhiyun if (i2c_smbus_read_byte_data(client, ADC128_REG_BUSY_STATUS) & 0xfc)
385*4882a593Smuzhiyun return -ENODEV;
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun strlcpy(info->type, "adc128d818", I2C_NAME_SIZE);
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun return 0;
390*4882a593Smuzhiyun }
391*4882a593Smuzhiyun
adc128_init_client(struct adc128_data * data)392*4882a593Smuzhiyun static int adc128_init_client(struct adc128_data *data)
393*4882a593Smuzhiyun {
394*4882a593Smuzhiyun struct i2c_client *client = data->client;
395*4882a593Smuzhiyun int err;
396*4882a593Smuzhiyun u8 regval = 0x0;
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun /*
399*4882a593Smuzhiyun * Reset chip to defaults.
400*4882a593Smuzhiyun * This makes most other initializations unnecessary.
401*4882a593Smuzhiyun */
402*4882a593Smuzhiyun err = i2c_smbus_write_byte_data(client, ADC128_REG_CONFIG, 0x80);
403*4882a593Smuzhiyun if (err)
404*4882a593Smuzhiyun return err;
405*4882a593Smuzhiyun
406*4882a593Smuzhiyun /* Set operation mode, if non-default */
407*4882a593Smuzhiyun if (data->mode != 0)
408*4882a593Smuzhiyun regval |= data->mode << 1;
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun /* If external vref is selected, configure the chip to use it */
411*4882a593Smuzhiyun if (data->regulator)
412*4882a593Smuzhiyun regval |= 0x01;
413*4882a593Smuzhiyun
414*4882a593Smuzhiyun /* Write advanced configuration register */
415*4882a593Smuzhiyun if (regval != 0x0) {
416*4882a593Smuzhiyun err = i2c_smbus_write_byte_data(client, ADC128_REG_CONFIG_ADV,
417*4882a593Smuzhiyun regval);
418*4882a593Smuzhiyun if (err)
419*4882a593Smuzhiyun return err;
420*4882a593Smuzhiyun }
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun /* Start monitoring */
423*4882a593Smuzhiyun err = i2c_smbus_write_byte_data(client, ADC128_REG_CONFIG, 0x01);
424*4882a593Smuzhiyun if (err)
425*4882a593Smuzhiyun return err;
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun return 0;
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun
adc128_probe(struct i2c_client * client)430*4882a593Smuzhiyun static int adc128_probe(struct i2c_client *client)
431*4882a593Smuzhiyun {
432*4882a593Smuzhiyun struct device *dev = &client->dev;
433*4882a593Smuzhiyun struct regulator *regulator;
434*4882a593Smuzhiyun struct device *hwmon_dev;
435*4882a593Smuzhiyun struct adc128_data *data;
436*4882a593Smuzhiyun int err, vref;
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun data = devm_kzalloc(dev, sizeof(struct adc128_data), GFP_KERNEL);
439*4882a593Smuzhiyun if (!data)
440*4882a593Smuzhiyun return -ENOMEM;
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun /* vref is optional. If specified, is used as chip reference voltage */
443*4882a593Smuzhiyun regulator = devm_regulator_get_optional(dev, "vref");
444*4882a593Smuzhiyun if (!IS_ERR(regulator)) {
445*4882a593Smuzhiyun data->regulator = regulator;
446*4882a593Smuzhiyun err = regulator_enable(regulator);
447*4882a593Smuzhiyun if (err < 0)
448*4882a593Smuzhiyun return err;
449*4882a593Smuzhiyun vref = regulator_get_voltage(regulator);
450*4882a593Smuzhiyun if (vref < 0) {
451*4882a593Smuzhiyun err = vref;
452*4882a593Smuzhiyun goto error;
453*4882a593Smuzhiyun }
454*4882a593Smuzhiyun data->vref = DIV_ROUND_CLOSEST(vref, 1000);
455*4882a593Smuzhiyun } else {
456*4882a593Smuzhiyun data->vref = 2560; /* 2.56V, in mV */
457*4882a593Smuzhiyun }
458*4882a593Smuzhiyun
459*4882a593Smuzhiyun /* Operation mode is optional. If unspecified, keep current mode */
460*4882a593Smuzhiyun if (of_property_read_u8(dev->of_node, "ti,mode", &data->mode) == 0) {
461*4882a593Smuzhiyun if (data->mode > 3) {
462*4882a593Smuzhiyun dev_err(dev, "invalid operation mode %d\n",
463*4882a593Smuzhiyun data->mode);
464*4882a593Smuzhiyun err = -EINVAL;
465*4882a593Smuzhiyun goto error;
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun } else {
468*4882a593Smuzhiyun err = i2c_smbus_read_byte_data(client, ADC128_REG_CONFIG_ADV);
469*4882a593Smuzhiyun if (err < 0)
470*4882a593Smuzhiyun goto error;
471*4882a593Smuzhiyun data->mode = (err >> 1) & ADC128_REG_MASK;
472*4882a593Smuzhiyun }
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun data->client = client;
475*4882a593Smuzhiyun i2c_set_clientdata(client, data);
476*4882a593Smuzhiyun mutex_init(&data->update_lock);
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun /* Initialize the chip */
479*4882a593Smuzhiyun err = adc128_init_client(data);
480*4882a593Smuzhiyun if (err < 0)
481*4882a593Smuzhiyun goto error;
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
484*4882a593Smuzhiyun data, adc128_groups);
485*4882a593Smuzhiyun if (IS_ERR(hwmon_dev)) {
486*4882a593Smuzhiyun err = PTR_ERR(hwmon_dev);
487*4882a593Smuzhiyun goto error;
488*4882a593Smuzhiyun }
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun return 0;
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun error:
493*4882a593Smuzhiyun if (data->regulator)
494*4882a593Smuzhiyun regulator_disable(data->regulator);
495*4882a593Smuzhiyun return err;
496*4882a593Smuzhiyun }
497*4882a593Smuzhiyun
adc128_remove(struct i2c_client * client)498*4882a593Smuzhiyun static int adc128_remove(struct i2c_client *client)
499*4882a593Smuzhiyun {
500*4882a593Smuzhiyun struct adc128_data *data = i2c_get_clientdata(client);
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun if (data->regulator)
503*4882a593Smuzhiyun regulator_disable(data->regulator);
504*4882a593Smuzhiyun
505*4882a593Smuzhiyun return 0;
506*4882a593Smuzhiyun }
507*4882a593Smuzhiyun
508*4882a593Smuzhiyun static const struct i2c_device_id adc128_id[] = {
509*4882a593Smuzhiyun { "adc128d818", 0 },
510*4882a593Smuzhiyun { }
511*4882a593Smuzhiyun };
512*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, adc128_id);
513*4882a593Smuzhiyun
514*4882a593Smuzhiyun static const struct of_device_id __maybe_unused adc128_of_match[] = {
515*4882a593Smuzhiyun { .compatible = "ti,adc128d818" },
516*4882a593Smuzhiyun { },
517*4882a593Smuzhiyun };
518*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, adc128_of_match);
519*4882a593Smuzhiyun
520*4882a593Smuzhiyun static struct i2c_driver adc128_driver = {
521*4882a593Smuzhiyun .class = I2C_CLASS_HWMON,
522*4882a593Smuzhiyun .driver = {
523*4882a593Smuzhiyun .name = "adc128d818",
524*4882a593Smuzhiyun .of_match_table = of_match_ptr(adc128_of_match),
525*4882a593Smuzhiyun },
526*4882a593Smuzhiyun .probe_new = adc128_probe,
527*4882a593Smuzhiyun .remove = adc128_remove,
528*4882a593Smuzhiyun .id_table = adc128_id,
529*4882a593Smuzhiyun .detect = adc128_detect,
530*4882a593Smuzhiyun .address_list = normal_i2c,
531*4882a593Smuzhiyun };
532*4882a593Smuzhiyun
533*4882a593Smuzhiyun module_i2c_driver(adc128_driver);
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun MODULE_AUTHOR("Guenter Roeck");
536*4882a593Smuzhiyun MODULE_DESCRIPTION("Driver for ADC128D818");
537*4882a593Smuzhiyun MODULE_LICENSE("GPL");
538