1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Hardware monitoring driver for LTC2978 and compatible chips.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (c) 2011 Ericsson AB.
6*4882a593Smuzhiyun * Copyright (c) 2013, 2014, 2015 Guenter Roeck
7*4882a593Smuzhiyun * Copyright (c) 2015 Linear Technology
8*4882a593Smuzhiyun * Copyright (c) 2018 Analog Devices Inc.
9*4882a593Smuzhiyun */
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <linux/delay.h>
12*4882a593Smuzhiyun #include <linux/jiffies.h>
13*4882a593Smuzhiyun #include <linux/kernel.h>
14*4882a593Smuzhiyun #include <linux/module.h>
15*4882a593Smuzhiyun #include <linux/init.h>
16*4882a593Smuzhiyun #include <linux/err.h>
17*4882a593Smuzhiyun #include <linux/slab.h>
18*4882a593Smuzhiyun #include <linux/i2c.h>
19*4882a593Smuzhiyun #include <linux/regulator/driver.h>
20*4882a593Smuzhiyun #include "pmbus.h"
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun enum chips {
23*4882a593Smuzhiyun /* Managers */
24*4882a593Smuzhiyun ltc2972, ltc2974, ltc2975, ltc2977, ltc2978, ltc2979, ltc2980,
25*4882a593Smuzhiyun /* Controllers */
26*4882a593Smuzhiyun ltc3880, ltc3882, ltc3883, ltc3884, ltc3886, ltc3887, ltc3889, ltc7880,
27*4882a593Smuzhiyun /* Modules */
28*4882a593Smuzhiyun ltm2987, ltm4664, ltm4675, ltm4676, ltm4677, ltm4678, ltm4680, ltm4686,
29*4882a593Smuzhiyun ltm4700,
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun /* Common for all chips */
33*4882a593Smuzhiyun #define LTC2978_MFR_VOUT_PEAK 0xdd
34*4882a593Smuzhiyun #define LTC2978_MFR_VIN_PEAK 0xde
35*4882a593Smuzhiyun #define LTC2978_MFR_TEMPERATURE_PEAK 0xdf
36*4882a593Smuzhiyun #define LTC2978_MFR_SPECIAL_ID 0xe7 /* Undocumented on LTC3882 */
37*4882a593Smuzhiyun #define LTC2978_MFR_COMMON 0xef
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun /* LTC2974, LTC2975, LCT2977, LTC2980, LTC2978, and LTM2987 */
40*4882a593Smuzhiyun #define LTC2978_MFR_VOUT_MIN 0xfb
41*4882a593Smuzhiyun #define LTC2978_MFR_VIN_MIN 0xfc
42*4882a593Smuzhiyun #define LTC2978_MFR_TEMPERATURE_MIN 0xfd
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun /* LTC2974, LTC2975 */
45*4882a593Smuzhiyun #define LTC2974_MFR_IOUT_PEAK 0xd7
46*4882a593Smuzhiyun #define LTC2974_MFR_IOUT_MIN 0xd8
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun /* LTC3880, LTC3882, LTC3883, LTC3887, LTM4675, and LTM4676 */
49*4882a593Smuzhiyun #define LTC3880_MFR_IOUT_PEAK 0xd7
50*4882a593Smuzhiyun #define LTC3880_MFR_CLEAR_PEAKS 0xe3
51*4882a593Smuzhiyun #define LTC3880_MFR_TEMPERATURE2_PEAK 0xf4
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun /* LTC3883, LTC3884, LTC3886, LTC3889 and LTC7880 only */
54*4882a593Smuzhiyun #define LTC3883_MFR_IIN_PEAK 0xe1
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun /* LTC2975 only */
58*4882a593Smuzhiyun #define LTC2975_MFR_IIN_PEAK 0xc4
59*4882a593Smuzhiyun #define LTC2975_MFR_IIN_MIN 0xc5
60*4882a593Smuzhiyun #define LTC2975_MFR_PIN_PEAK 0xc6
61*4882a593Smuzhiyun #define LTC2975_MFR_PIN_MIN 0xc7
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun #define LTC2978_ID_MASK 0xfff0
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun #define LTC2972_ID 0x0310
66*4882a593Smuzhiyun #define LTC2974_ID 0x0210
67*4882a593Smuzhiyun #define LTC2975_ID 0x0220
68*4882a593Smuzhiyun #define LTC2977_ID 0x0130
69*4882a593Smuzhiyun #define LTC2978_ID_REV1 0x0110 /* Early revision */
70*4882a593Smuzhiyun #define LTC2978_ID_REV2 0x0120
71*4882a593Smuzhiyun #define LTC2979_ID_A 0x8060
72*4882a593Smuzhiyun #define LTC2979_ID_B 0x8070
73*4882a593Smuzhiyun #define LTC2980_ID_A 0x8030 /* A/B for two die IDs */
74*4882a593Smuzhiyun #define LTC2980_ID_B 0x8040
75*4882a593Smuzhiyun #define LTC3880_ID 0x4020
76*4882a593Smuzhiyun #define LTC3882_ID 0x4200
77*4882a593Smuzhiyun #define LTC3882_ID_D1 0x4240 /* Dash 1 */
78*4882a593Smuzhiyun #define LTC3883_ID 0x4300
79*4882a593Smuzhiyun #define LTC3884_ID 0x4C00
80*4882a593Smuzhiyun #define LTC3886_ID 0x4600
81*4882a593Smuzhiyun #define LTC3887_ID 0x4700
82*4882a593Smuzhiyun #define LTM2987_ID_A 0x8010 /* A/B for two die IDs */
83*4882a593Smuzhiyun #define LTM2987_ID_B 0x8020
84*4882a593Smuzhiyun #define LTC3889_ID 0x4900
85*4882a593Smuzhiyun #define LTC7880_ID 0x49E0
86*4882a593Smuzhiyun #define LTM4664_ID 0x4120
87*4882a593Smuzhiyun #define LTM4675_ID 0x47a0
88*4882a593Smuzhiyun #define LTM4676_ID_REV1 0x4400
89*4882a593Smuzhiyun #define LTM4676_ID_REV2 0x4480
90*4882a593Smuzhiyun #define LTM4676A_ID 0x47e0
91*4882a593Smuzhiyun #define LTM4677_ID_REV1 0x47B0
92*4882a593Smuzhiyun #define LTM4677_ID_REV2 0x47D0
93*4882a593Smuzhiyun #define LTM4678_ID_REV1 0x4100
94*4882a593Smuzhiyun #define LTM4678_ID_REV2 0x4110
95*4882a593Smuzhiyun #define LTM4680_ID 0x4140
96*4882a593Smuzhiyun #define LTM4686_ID 0x4770
97*4882a593Smuzhiyun #define LTM4700_ID 0x4130
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun #define LTC2972_NUM_PAGES 2
100*4882a593Smuzhiyun #define LTC2974_NUM_PAGES 4
101*4882a593Smuzhiyun #define LTC2978_NUM_PAGES 8
102*4882a593Smuzhiyun #define LTC3880_NUM_PAGES 2
103*4882a593Smuzhiyun #define LTC3883_NUM_PAGES 1
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun #define LTC_POLL_TIMEOUT 100 /* in milli-seconds */
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun #define LTC_NOT_BUSY BIT(6)
108*4882a593Smuzhiyun #define LTC_NOT_PENDING BIT(5)
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun /*
111*4882a593Smuzhiyun * LTC2978 clears peak data whenever the CLEAR_FAULTS command is executed, which
112*4882a593Smuzhiyun * happens pretty much each time chip data is updated. Raw peak data therefore
113*4882a593Smuzhiyun * does not provide much value. To be able to provide useful peak data, keep an
114*4882a593Smuzhiyun * internal cache of measured peak data, which is only cleared if an explicit
115*4882a593Smuzhiyun * "clear peak" command is executed for the sensor in question.
116*4882a593Smuzhiyun */
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun struct ltc2978_data {
119*4882a593Smuzhiyun enum chips id;
120*4882a593Smuzhiyun u16 vin_min, vin_max;
121*4882a593Smuzhiyun u16 temp_min[LTC2974_NUM_PAGES], temp_max[LTC2974_NUM_PAGES];
122*4882a593Smuzhiyun u16 vout_min[LTC2978_NUM_PAGES], vout_max[LTC2978_NUM_PAGES];
123*4882a593Smuzhiyun u16 iout_min[LTC2974_NUM_PAGES], iout_max[LTC2974_NUM_PAGES];
124*4882a593Smuzhiyun u16 iin_min, iin_max;
125*4882a593Smuzhiyun u16 pin_min, pin_max;
126*4882a593Smuzhiyun u16 temp2_max;
127*4882a593Smuzhiyun struct pmbus_driver_info info;
128*4882a593Smuzhiyun u32 features;
129*4882a593Smuzhiyun };
130*4882a593Smuzhiyun #define to_ltc2978_data(x) container_of(x, struct ltc2978_data, info)
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun #define FEAT_CLEAR_PEAKS BIT(0)
133*4882a593Smuzhiyun #define FEAT_NEEDS_POLLING BIT(1)
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun #define has_clear_peaks(d) ((d)->features & FEAT_CLEAR_PEAKS)
136*4882a593Smuzhiyun #define needs_polling(d) ((d)->features & FEAT_NEEDS_POLLING)
137*4882a593Smuzhiyun
ltc_wait_ready(struct i2c_client * client)138*4882a593Smuzhiyun static int ltc_wait_ready(struct i2c_client *client)
139*4882a593Smuzhiyun {
140*4882a593Smuzhiyun unsigned long timeout = jiffies + msecs_to_jiffies(LTC_POLL_TIMEOUT);
141*4882a593Smuzhiyun const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
142*4882a593Smuzhiyun struct ltc2978_data *data = to_ltc2978_data(info);
143*4882a593Smuzhiyun int status;
144*4882a593Smuzhiyun u8 mask;
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun if (!needs_polling(data))
147*4882a593Smuzhiyun return 0;
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun /*
150*4882a593Smuzhiyun * LTC3883 does not support LTC_NOT_PENDING, even though
151*4882a593Smuzhiyun * the datasheet claims that it does.
152*4882a593Smuzhiyun */
153*4882a593Smuzhiyun mask = LTC_NOT_BUSY;
154*4882a593Smuzhiyun if (data->id != ltc3883)
155*4882a593Smuzhiyun mask |= LTC_NOT_PENDING;
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun do {
158*4882a593Smuzhiyun status = pmbus_read_byte_data(client, 0, LTC2978_MFR_COMMON);
159*4882a593Smuzhiyun if (status == -EBADMSG || status == -ENXIO) {
160*4882a593Smuzhiyun /* PEC error or NACK: chip may be busy, try again */
161*4882a593Smuzhiyun usleep_range(50, 100);
162*4882a593Smuzhiyun continue;
163*4882a593Smuzhiyun }
164*4882a593Smuzhiyun if (status < 0)
165*4882a593Smuzhiyun return status;
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun if ((status & mask) == mask)
168*4882a593Smuzhiyun return 0;
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun usleep_range(50, 100);
171*4882a593Smuzhiyun } while (time_before(jiffies, timeout));
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun return -ETIMEDOUT;
174*4882a593Smuzhiyun }
175*4882a593Smuzhiyun
ltc_read_word_data(struct i2c_client * client,int page,int phase,int reg)176*4882a593Smuzhiyun static int ltc_read_word_data(struct i2c_client *client, int page, int phase,
177*4882a593Smuzhiyun int reg)
178*4882a593Smuzhiyun {
179*4882a593Smuzhiyun int ret;
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun ret = ltc_wait_ready(client);
182*4882a593Smuzhiyun if (ret < 0)
183*4882a593Smuzhiyun return ret;
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun return pmbus_read_word_data(client, page, 0xff, reg);
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun
ltc_read_byte_data(struct i2c_client * client,int page,int reg)188*4882a593Smuzhiyun static int ltc_read_byte_data(struct i2c_client *client, int page, int reg)
189*4882a593Smuzhiyun {
190*4882a593Smuzhiyun int ret;
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun ret = ltc_wait_ready(client);
193*4882a593Smuzhiyun if (ret < 0)
194*4882a593Smuzhiyun return ret;
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun return pmbus_read_byte_data(client, page, reg);
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun
ltc_write_byte(struct i2c_client * client,int page,u8 byte)199*4882a593Smuzhiyun static int ltc_write_byte(struct i2c_client *client, int page, u8 byte)
200*4882a593Smuzhiyun {
201*4882a593Smuzhiyun int ret;
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun ret = ltc_wait_ready(client);
204*4882a593Smuzhiyun if (ret < 0)
205*4882a593Smuzhiyun return ret;
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun return pmbus_write_byte(client, page, byte);
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun
lin11_to_val(int data)210*4882a593Smuzhiyun static inline int lin11_to_val(int data)
211*4882a593Smuzhiyun {
212*4882a593Smuzhiyun s16 e = ((s16)data) >> 11;
213*4882a593Smuzhiyun s32 m = (((s16)(data << 5)) >> 5);
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun /*
216*4882a593Smuzhiyun * mantissa is 10 bit + sign, exponent adds up to 15 bit.
217*4882a593Smuzhiyun * Add 6 bit to exponent for maximum accuracy (10 + 15 + 6 = 31).
218*4882a593Smuzhiyun */
219*4882a593Smuzhiyun e += 6;
220*4882a593Smuzhiyun return (e < 0 ? m >> -e : m << e);
221*4882a593Smuzhiyun }
222*4882a593Smuzhiyun
ltc_get_max(struct ltc2978_data * data,struct i2c_client * client,int page,int reg,u16 * pmax)223*4882a593Smuzhiyun static int ltc_get_max(struct ltc2978_data *data, struct i2c_client *client,
224*4882a593Smuzhiyun int page, int reg, u16 *pmax)
225*4882a593Smuzhiyun {
226*4882a593Smuzhiyun int ret;
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun ret = ltc_read_word_data(client, page, 0xff, reg);
229*4882a593Smuzhiyun if (ret >= 0) {
230*4882a593Smuzhiyun if (lin11_to_val(ret) > lin11_to_val(*pmax))
231*4882a593Smuzhiyun *pmax = ret;
232*4882a593Smuzhiyun ret = *pmax;
233*4882a593Smuzhiyun }
234*4882a593Smuzhiyun return ret;
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun
ltc_get_min(struct ltc2978_data * data,struct i2c_client * client,int page,int reg,u16 * pmin)237*4882a593Smuzhiyun static int ltc_get_min(struct ltc2978_data *data, struct i2c_client *client,
238*4882a593Smuzhiyun int page, int reg, u16 *pmin)
239*4882a593Smuzhiyun {
240*4882a593Smuzhiyun int ret;
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun ret = ltc_read_word_data(client, page, 0xff, reg);
243*4882a593Smuzhiyun if (ret >= 0) {
244*4882a593Smuzhiyun if (lin11_to_val(ret) < lin11_to_val(*pmin))
245*4882a593Smuzhiyun *pmin = ret;
246*4882a593Smuzhiyun ret = *pmin;
247*4882a593Smuzhiyun }
248*4882a593Smuzhiyun return ret;
249*4882a593Smuzhiyun }
250*4882a593Smuzhiyun
ltc2978_read_word_data_common(struct i2c_client * client,int page,int reg)251*4882a593Smuzhiyun static int ltc2978_read_word_data_common(struct i2c_client *client, int page,
252*4882a593Smuzhiyun int reg)
253*4882a593Smuzhiyun {
254*4882a593Smuzhiyun const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
255*4882a593Smuzhiyun struct ltc2978_data *data = to_ltc2978_data(info);
256*4882a593Smuzhiyun int ret;
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun switch (reg) {
259*4882a593Smuzhiyun case PMBUS_VIRT_READ_VIN_MAX:
260*4882a593Smuzhiyun ret = ltc_get_max(data, client, page, LTC2978_MFR_VIN_PEAK,
261*4882a593Smuzhiyun &data->vin_max);
262*4882a593Smuzhiyun break;
263*4882a593Smuzhiyun case PMBUS_VIRT_READ_VOUT_MAX:
264*4882a593Smuzhiyun ret = ltc_read_word_data(client, page, 0xff,
265*4882a593Smuzhiyun LTC2978_MFR_VOUT_PEAK);
266*4882a593Smuzhiyun if (ret >= 0) {
267*4882a593Smuzhiyun /*
268*4882a593Smuzhiyun * VOUT is 16 bit unsigned with fixed exponent,
269*4882a593Smuzhiyun * so we can compare it directly
270*4882a593Smuzhiyun */
271*4882a593Smuzhiyun if (ret > data->vout_max[page])
272*4882a593Smuzhiyun data->vout_max[page] = ret;
273*4882a593Smuzhiyun ret = data->vout_max[page];
274*4882a593Smuzhiyun }
275*4882a593Smuzhiyun break;
276*4882a593Smuzhiyun case PMBUS_VIRT_READ_TEMP_MAX:
277*4882a593Smuzhiyun ret = ltc_get_max(data, client, page,
278*4882a593Smuzhiyun LTC2978_MFR_TEMPERATURE_PEAK,
279*4882a593Smuzhiyun &data->temp_max[page]);
280*4882a593Smuzhiyun break;
281*4882a593Smuzhiyun case PMBUS_VIRT_RESET_VOUT_HISTORY:
282*4882a593Smuzhiyun case PMBUS_VIRT_RESET_VIN_HISTORY:
283*4882a593Smuzhiyun case PMBUS_VIRT_RESET_TEMP_HISTORY:
284*4882a593Smuzhiyun ret = 0;
285*4882a593Smuzhiyun break;
286*4882a593Smuzhiyun default:
287*4882a593Smuzhiyun ret = ltc_wait_ready(client);
288*4882a593Smuzhiyun if (ret < 0)
289*4882a593Smuzhiyun return ret;
290*4882a593Smuzhiyun ret = -ENODATA;
291*4882a593Smuzhiyun break;
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun return ret;
294*4882a593Smuzhiyun }
295*4882a593Smuzhiyun
ltc2978_read_word_data(struct i2c_client * client,int page,int phase,int reg)296*4882a593Smuzhiyun static int ltc2978_read_word_data(struct i2c_client *client, int page,
297*4882a593Smuzhiyun int phase, int reg)
298*4882a593Smuzhiyun {
299*4882a593Smuzhiyun const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
300*4882a593Smuzhiyun struct ltc2978_data *data = to_ltc2978_data(info);
301*4882a593Smuzhiyun int ret;
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun switch (reg) {
304*4882a593Smuzhiyun case PMBUS_VIRT_READ_VIN_MIN:
305*4882a593Smuzhiyun ret = ltc_get_min(data, client, page, LTC2978_MFR_VIN_MIN,
306*4882a593Smuzhiyun &data->vin_min);
307*4882a593Smuzhiyun break;
308*4882a593Smuzhiyun case PMBUS_VIRT_READ_VOUT_MIN:
309*4882a593Smuzhiyun ret = ltc_read_word_data(client, page, phase,
310*4882a593Smuzhiyun LTC2978_MFR_VOUT_MIN);
311*4882a593Smuzhiyun if (ret >= 0) {
312*4882a593Smuzhiyun /*
313*4882a593Smuzhiyun * VOUT_MIN is known to not be supported on some lots
314*4882a593Smuzhiyun * of LTC2978 revision 1, and will return the maximum
315*4882a593Smuzhiyun * possible voltage if read. If VOUT_MAX is valid and
316*4882a593Smuzhiyun * lower than the reading of VOUT_MIN, use it instead.
317*4882a593Smuzhiyun */
318*4882a593Smuzhiyun if (data->vout_max[page] && ret > data->vout_max[page])
319*4882a593Smuzhiyun ret = data->vout_max[page];
320*4882a593Smuzhiyun if (ret < data->vout_min[page])
321*4882a593Smuzhiyun data->vout_min[page] = ret;
322*4882a593Smuzhiyun ret = data->vout_min[page];
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun break;
325*4882a593Smuzhiyun case PMBUS_VIRT_READ_TEMP_MIN:
326*4882a593Smuzhiyun ret = ltc_get_min(data, client, page,
327*4882a593Smuzhiyun LTC2978_MFR_TEMPERATURE_MIN,
328*4882a593Smuzhiyun &data->temp_min[page]);
329*4882a593Smuzhiyun break;
330*4882a593Smuzhiyun case PMBUS_VIRT_READ_IOUT_MAX:
331*4882a593Smuzhiyun case PMBUS_VIRT_RESET_IOUT_HISTORY:
332*4882a593Smuzhiyun case PMBUS_VIRT_READ_TEMP2_MAX:
333*4882a593Smuzhiyun case PMBUS_VIRT_RESET_TEMP2_HISTORY:
334*4882a593Smuzhiyun ret = -ENXIO;
335*4882a593Smuzhiyun break;
336*4882a593Smuzhiyun default:
337*4882a593Smuzhiyun ret = ltc2978_read_word_data_common(client, page, reg);
338*4882a593Smuzhiyun break;
339*4882a593Smuzhiyun }
340*4882a593Smuzhiyun return ret;
341*4882a593Smuzhiyun }
342*4882a593Smuzhiyun
ltc2974_read_word_data(struct i2c_client * client,int page,int phase,int reg)343*4882a593Smuzhiyun static int ltc2974_read_word_data(struct i2c_client *client, int page,
344*4882a593Smuzhiyun int phase, int reg)
345*4882a593Smuzhiyun {
346*4882a593Smuzhiyun const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
347*4882a593Smuzhiyun struct ltc2978_data *data = to_ltc2978_data(info);
348*4882a593Smuzhiyun int ret;
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun switch (reg) {
351*4882a593Smuzhiyun case PMBUS_VIRT_READ_IOUT_MAX:
352*4882a593Smuzhiyun ret = ltc_get_max(data, client, page, LTC2974_MFR_IOUT_PEAK,
353*4882a593Smuzhiyun &data->iout_max[page]);
354*4882a593Smuzhiyun break;
355*4882a593Smuzhiyun case PMBUS_VIRT_READ_IOUT_MIN:
356*4882a593Smuzhiyun ret = ltc_get_min(data, client, page, LTC2974_MFR_IOUT_MIN,
357*4882a593Smuzhiyun &data->iout_min[page]);
358*4882a593Smuzhiyun break;
359*4882a593Smuzhiyun case PMBUS_VIRT_RESET_IOUT_HISTORY:
360*4882a593Smuzhiyun ret = 0;
361*4882a593Smuzhiyun break;
362*4882a593Smuzhiyun default:
363*4882a593Smuzhiyun ret = ltc2978_read_word_data(client, page, phase, reg);
364*4882a593Smuzhiyun break;
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun return ret;
367*4882a593Smuzhiyun }
368*4882a593Smuzhiyun
ltc2975_read_word_data(struct i2c_client * client,int page,int phase,int reg)369*4882a593Smuzhiyun static int ltc2975_read_word_data(struct i2c_client *client, int page,
370*4882a593Smuzhiyun int phase, int reg)
371*4882a593Smuzhiyun {
372*4882a593Smuzhiyun const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
373*4882a593Smuzhiyun struct ltc2978_data *data = to_ltc2978_data(info);
374*4882a593Smuzhiyun int ret;
375*4882a593Smuzhiyun
376*4882a593Smuzhiyun switch (reg) {
377*4882a593Smuzhiyun case PMBUS_VIRT_READ_IIN_MAX:
378*4882a593Smuzhiyun ret = ltc_get_max(data, client, page, LTC2975_MFR_IIN_PEAK,
379*4882a593Smuzhiyun &data->iin_max);
380*4882a593Smuzhiyun break;
381*4882a593Smuzhiyun case PMBUS_VIRT_READ_IIN_MIN:
382*4882a593Smuzhiyun ret = ltc_get_min(data, client, page, LTC2975_MFR_IIN_MIN,
383*4882a593Smuzhiyun &data->iin_min);
384*4882a593Smuzhiyun break;
385*4882a593Smuzhiyun case PMBUS_VIRT_READ_PIN_MAX:
386*4882a593Smuzhiyun ret = ltc_get_max(data, client, page, LTC2975_MFR_PIN_PEAK,
387*4882a593Smuzhiyun &data->pin_max);
388*4882a593Smuzhiyun break;
389*4882a593Smuzhiyun case PMBUS_VIRT_READ_PIN_MIN:
390*4882a593Smuzhiyun ret = ltc_get_min(data, client, page, LTC2975_MFR_PIN_MIN,
391*4882a593Smuzhiyun &data->pin_min);
392*4882a593Smuzhiyun break;
393*4882a593Smuzhiyun case PMBUS_VIRT_RESET_IIN_HISTORY:
394*4882a593Smuzhiyun case PMBUS_VIRT_RESET_PIN_HISTORY:
395*4882a593Smuzhiyun ret = 0;
396*4882a593Smuzhiyun break;
397*4882a593Smuzhiyun default:
398*4882a593Smuzhiyun ret = ltc2978_read_word_data(client, page, phase, reg);
399*4882a593Smuzhiyun break;
400*4882a593Smuzhiyun }
401*4882a593Smuzhiyun return ret;
402*4882a593Smuzhiyun }
403*4882a593Smuzhiyun
ltc3880_read_word_data(struct i2c_client * client,int page,int phase,int reg)404*4882a593Smuzhiyun static int ltc3880_read_word_data(struct i2c_client *client, int page,
405*4882a593Smuzhiyun int phase, int reg)
406*4882a593Smuzhiyun {
407*4882a593Smuzhiyun const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
408*4882a593Smuzhiyun struct ltc2978_data *data = to_ltc2978_data(info);
409*4882a593Smuzhiyun int ret;
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun switch (reg) {
412*4882a593Smuzhiyun case PMBUS_VIRT_READ_IOUT_MAX:
413*4882a593Smuzhiyun ret = ltc_get_max(data, client, page, LTC3880_MFR_IOUT_PEAK,
414*4882a593Smuzhiyun &data->iout_max[page]);
415*4882a593Smuzhiyun break;
416*4882a593Smuzhiyun case PMBUS_VIRT_READ_TEMP2_MAX:
417*4882a593Smuzhiyun ret = ltc_get_max(data, client, page,
418*4882a593Smuzhiyun LTC3880_MFR_TEMPERATURE2_PEAK,
419*4882a593Smuzhiyun &data->temp2_max);
420*4882a593Smuzhiyun break;
421*4882a593Smuzhiyun case PMBUS_VIRT_READ_VIN_MIN:
422*4882a593Smuzhiyun case PMBUS_VIRT_READ_VOUT_MIN:
423*4882a593Smuzhiyun case PMBUS_VIRT_READ_TEMP_MIN:
424*4882a593Smuzhiyun ret = -ENXIO;
425*4882a593Smuzhiyun break;
426*4882a593Smuzhiyun case PMBUS_VIRT_RESET_IOUT_HISTORY:
427*4882a593Smuzhiyun case PMBUS_VIRT_RESET_TEMP2_HISTORY:
428*4882a593Smuzhiyun ret = 0;
429*4882a593Smuzhiyun break;
430*4882a593Smuzhiyun default:
431*4882a593Smuzhiyun ret = ltc2978_read_word_data_common(client, page, reg);
432*4882a593Smuzhiyun break;
433*4882a593Smuzhiyun }
434*4882a593Smuzhiyun return ret;
435*4882a593Smuzhiyun }
436*4882a593Smuzhiyun
ltc3883_read_word_data(struct i2c_client * client,int page,int phase,int reg)437*4882a593Smuzhiyun static int ltc3883_read_word_data(struct i2c_client *client, int page,
438*4882a593Smuzhiyun int phase, int reg)
439*4882a593Smuzhiyun {
440*4882a593Smuzhiyun const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
441*4882a593Smuzhiyun struct ltc2978_data *data = to_ltc2978_data(info);
442*4882a593Smuzhiyun int ret;
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun switch (reg) {
445*4882a593Smuzhiyun case PMBUS_VIRT_READ_IIN_MAX:
446*4882a593Smuzhiyun ret = ltc_get_max(data, client, page, LTC3883_MFR_IIN_PEAK,
447*4882a593Smuzhiyun &data->iin_max);
448*4882a593Smuzhiyun break;
449*4882a593Smuzhiyun case PMBUS_VIRT_RESET_IIN_HISTORY:
450*4882a593Smuzhiyun ret = 0;
451*4882a593Smuzhiyun break;
452*4882a593Smuzhiyun default:
453*4882a593Smuzhiyun ret = ltc3880_read_word_data(client, page, phase, reg);
454*4882a593Smuzhiyun break;
455*4882a593Smuzhiyun }
456*4882a593Smuzhiyun return ret;
457*4882a593Smuzhiyun }
458*4882a593Smuzhiyun
ltc2978_clear_peaks(struct ltc2978_data * data,struct i2c_client * client,int page)459*4882a593Smuzhiyun static int ltc2978_clear_peaks(struct ltc2978_data *data,
460*4882a593Smuzhiyun struct i2c_client *client, int page)
461*4882a593Smuzhiyun {
462*4882a593Smuzhiyun int ret;
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun if (has_clear_peaks(data))
465*4882a593Smuzhiyun ret = ltc_write_byte(client, 0, LTC3880_MFR_CLEAR_PEAKS);
466*4882a593Smuzhiyun else
467*4882a593Smuzhiyun ret = ltc_write_byte(client, page, PMBUS_CLEAR_FAULTS);
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun return ret;
470*4882a593Smuzhiyun }
471*4882a593Smuzhiyun
ltc2978_write_word_data(struct i2c_client * client,int page,int reg,u16 word)472*4882a593Smuzhiyun static int ltc2978_write_word_data(struct i2c_client *client, int page,
473*4882a593Smuzhiyun int reg, u16 word)
474*4882a593Smuzhiyun {
475*4882a593Smuzhiyun const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
476*4882a593Smuzhiyun struct ltc2978_data *data = to_ltc2978_data(info);
477*4882a593Smuzhiyun int ret;
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun switch (reg) {
480*4882a593Smuzhiyun case PMBUS_VIRT_RESET_IIN_HISTORY:
481*4882a593Smuzhiyun data->iin_max = 0x7c00;
482*4882a593Smuzhiyun data->iin_min = 0x7bff;
483*4882a593Smuzhiyun ret = ltc2978_clear_peaks(data, client, 0);
484*4882a593Smuzhiyun break;
485*4882a593Smuzhiyun case PMBUS_VIRT_RESET_PIN_HISTORY:
486*4882a593Smuzhiyun data->pin_max = 0x7c00;
487*4882a593Smuzhiyun data->pin_min = 0x7bff;
488*4882a593Smuzhiyun ret = ltc2978_clear_peaks(data, client, 0);
489*4882a593Smuzhiyun break;
490*4882a593Smuzhiyun case PMBUS_VIRT_RESET_IOUT_HISTORY:
491*4882a593Smuzhiyun data->iout_max[page] = 0x7c00;
492*4882a593Smuzhiyun data->iout_min[page] = 0xfbff;
493*4882a593Smuzhiyun ret = ltc2978_clear_peaks(data, client, page);
494*4882a593Smuzhiyun break;
495*4882a593Smuzhiyun case PMBUS_VIRT_RESET_TEMP2_HISTORY:
496*4882a593Smuzhiyun data->temp2_max = 0x7c00;
497*4882a593Smuzhiyun ret = ltc2978_clear_peaks(data, client, page);
498*4882a593Smuzhiyun break;
499*4882a593Smuzhiyun case PMBUS_VIRT_RESET_VOUT_HISTORY:
500*4882a593Smuzhiyun data->vout_min[page] = 0xffff;
501*4882a593Smuzhiyun data->vout_max[page] = 0;
502*4882a593Smuzhiyun ret = ltc2978_clear_peaks(data, client, page);
503*4882a593Smuzhiyun break;
504*4882a593Smuzhiyun case PMBUS_VIRT_RESET_VIN_HISTORY:
505*4882a593Smuzhiyun data->vin_min = 0x7bff;
506*4882a593Smuzhiyun data->vin_max = 0x7c00;
507*4882a593Smuzhiyun ret = ltc2978_clear_peaks(data, client, page);
508*4882a593Smuzhiyun break;
509*4882a593Smuzhiyun case PMBUS_VIRT_RESET_TEMP_HISTORY:
510*4882a593Smuzhiyun data->temp_min[page] = 0x7bff;
511*4882a593Smuzhiyun data->temp_max[page] = 0x7c00;
512*4882a593Smuzhiyun ret = ltc2978_clear_peaks(data, client, page);
513*4882a593Smuzhiyun break;
514*4882a593Smuzhiyun default:
515*4882a593Smuzhiyun ret = ltc_wait_ready(client);
516*4882a593Smuzhiyun if (ret < 0)
517*4882a593Smuzhiyun return ret;
518*4882a593Smuzhiyun ret = -ENODATA;
519*4882a593Smuzhiyun break;
520*4882a593Smuzhiyun }
521*4882a593Smuzhiyun return ret;
522*4882a593Smuzhiyun }
523*4882a593Smuzhiyun
524*4882a593Smuzhiyun static const struct i2c_device_id ltc2978_id[] = {
525*4882a593Smuzhiyun {"ltc2972", ltc2972},
526*4882a593Smuzhiyun {"ltc2974", ltc2974},
527*4882a593Smuzhiyun {"ltc2975", ltc2975},
528*4882a593Smuzhiyun {"ltc2977", ltc2977},
529*4882a593Smuzhiyun {"ltc2978", ltc2978},
530*4882a593Smuzhiyun {"ltc2979", ltc2979},
531*4882a593Smuzhiyun {"ltc2980", ltc2980},
532*4882a593Smuzhiyun {"ltc3880", ltc3880},
533*4882a593Smuzhiyun {"ltc3882", ltc3882},
534*4882a593Smuzhiyun {"ltc3883", ltc3883},
535*4882a593Smuzhiyun {"ltc3884", ltc3884},
536*4882a593Smuzhiyun {"ltc3886", ltc3886},
537*4882a593Smuzhiyun {"ltc3887", ltc3887},
538*4882a593Smuzhiyun {"ltc3889", ltc3889},
539*4882a593Smuzhiyun {"ltc7880", ltc7880},
540*4882a593Smuzhiyun {"ltm2987", ltm2987},
541*4882a593Smuzhiyun {"ltm4664", ltm4664},
542*4882a593Smuzhiyun {"ltm4675", ltm4675},
543*4882a593Smuzhiyun {"ltm4676", ltm4676},
544*4882a593Smuzhiyun {"ltm4677", ltm4677},
545*4882a593Smuzhiyun {"ltm4678", ltm4678},
546*4882a593Smuzhiyun {"ltm4680", ltm4680},
547*4882a593Smuzhiyun {"ltm4686", ltm4686},
548*4882a593Smuzhiyun {"ltm4700", ltm4700},
549*4882a593Smuzhiyun {}
550*4882a593Smuzhiyun };
551*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, ltc2978_id);
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_SENSORS_LTC2978_REGULATOR)
554*4882a593Smuzhiyun static const struct regulator_desc ltc2978_reg_desc[] = {
555*4882a593Smuzhiyun PMBUS_REGULATOR("vout", 0),
556*4882a593Smuzhiyun PMBUS_REGULATOR("vout", 1),
557*4882a593Smuzhiyun PMBUS_REGULATOR("vout", 2),
558*4882a593Smuzhiyun PMBUS_REGULATOR("vout", 3),
559*4882a593Smuzhiyun PMBUS_REGULATOR("vout", 4),
560*4882a593Smuzhiyun PMBUS_REGULATOR("vout", 5),
561*4882a593Smuzhiyun PMBUS_REGULATOR("vout", 6),
562*4882a593Smuzhiyun PMBUS_REGULATOR("vout", 7),
563*4882a593Smuzhiyun };
564*4882a593Smuzhiyun #endif /* CONFIG_SENSORS_LTC2978_REGULATOR */
565*4882a593Smuzhiyun
ltc2978_get_id(struct i2c_client * client)566*4882a593Smuzhiyun static int ltc2978_get_id(struct i2c_client *client)
567*4882a593Smuzhiyun {
568*4882a593Smuzhiyun int chip_id;
569*4882a593Smuzhiyun
570*4882a593Smuzhiyun chip_id = i2c_smbus_read_word_data(client, LTC2978_MFR_SPECIAL_ID);
571*4882a593Smuzhiyun if (chip_id < 0) {
572*4882a593Smuzhiyun const struct i2c_device_id *id;
573*4882a593Smuzhiyun u8 buf[I2C_SMBUS_BLOCK_MAX];
574*4882a593Smuzhiyun int ret;
575*4882a593Smuzhiyun
576*4882a593Smuzhiyun if (!i2c_check_functionality(client->adapter,
577*4882a593Smuzhiyun I2C_FUNC_SMBUS_READ_BLOCK_DATA))
578*4882a593Smuzhiyun return -ENODEV;
579*4882a593Smuzhiyun
580*4882a593Smuzhiyun ret = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, buf);
581*4882a593Smuzhiyun if (ret < 0)
582*4882a593Smuzhiyun return ret;
583*4882a593Smuzhiyun if (ret < 3 || strncmp(buf, "LTC", 3))
584*4882a593Smuzhiyun return -ENODEV;
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun ret = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, buf);
587*4882a593Smuzhiyun if (ret < 0)
588*4882a593Smuzhiyun return ret;
589*4882a593Smuzhiyun for (id = <c2978_id[0]; strlen(id->name); id++) {
590*4882a593Smuzhiyun if (!strncasecmp(id->name, buf, strlen(id->name)))
591*4882a593Smuzhiyun return (int)id->driver_data;
592*4882a593Smuzhiyun }
593*4882a593Smuzhiyun return -ENODEV;
594*4882a593Smuzhiyun }
595*4882a593Smuzhiyun
596*4882a593Smuzhiyun chip_id &= LTC2978_ID_MASK;
597*4882a593Smuzhiyun
598*4882a593Smuzhiyun if (chip_id == LTC2972_ID)
599*4882a593Smuzhiyun return ltc2972;
600*4882a593Smuzhiyun else if (chip_id == LTC2974_ID)
601*4882a593Smuzhiyun return ltc2974;
602*4882a593Smuzhiyun else if (chip_id == LTC2975_ID)
603*4882a593Smuzhiyun return ltc2975;
604*4882a593Smuzhiyun else if (chip_id == LTC2977_ID)
605*4882a593Smuzhiyun return ltc2977;
606*4882a593Smuzhiyun else if (chip_id == LTC2978_ID_REV1 || chip_id == LTC2978_ID_REV2)
607*4882a593Smuzhiyun return ltc2978;
608*4882a593Smuzhiyun else if (chip_id == LTC2979_ID_A || chip_id == LTC2979_ID_B)
609*4882a593Smuzhiyun return ltc2979;
610*4882a593Smuzhiyun else if (chip_id == LTC2980_ID_A || chip_id == LTC2980_ID_B)
611*4882a593Smuzhiyun return ltc2980;
612*4882a593Smuzhiyun else if (chip_id == LTC3880_ID)
613*4882a593Smuzhiyun return ltc3880;
614*4882a593Smuzhiyun else if (chip_id == LTC3882_ID || chip_id == LTC3882_ID_D1)
615*4882a593Smuzhiyun return ltc3882;
616*4882a593Smuzhiyun else if (chip_id == LTC3883_ID)
617*4882a593Smuzhiyun return ltc3883;
618*4882a593Smuzhiyun else if (chip_id == LTC3884_ID)
619*4882a593Smuzhiyun return ltc3884;
620*4882a593Smuzhiyun else if (chip_id == LTC3886_ID)
621*4882a593Smuzhiyun return ltc3886;
622*4882a593Smuzhiyun else if (chip_id == LTC3887_ID)
623*4882a593Smuzhiyun return ltc3887;
624*4882a593Smuzhiyun else if (chip_id == LTC3889_ID)
625*4882a593Smuzhiyun return ltc3889;
626*4882a593Smuzhiyun else if (chip_id == LTC7880_ID)
627*4882a593Smuzhiyun return ltc7880;
628*4882a593Smuzhiyun else if (chip_id == LTM2987_ID_A || chip_id == LTM2987_ID_B)
629*4882a593Smuzhiyun return ltm2987;
630*4882a593Smuzhiyun else if (chip_id == LTM4664_ID)
631*4882a593Smuzhiyun return ltm4664;
632*4882a593Smuzhiyun else if (chip_id == LTM4675_ID)
633*4882a593Smuzhiyun return ltm4675;
634*4882a593Smuzhiyun else if (chip_id == LTM4676_ID_REV1 || chip_id == LTM4676_ID_REV2 ||
635*4882a593Smuzhiyun chip_id == LTM4676A_ID)
636*4882a593Smuzhiyun return ltm4676;
637*4882a593Smuzhiyun else if (chip_id == LTM4677_ID_REV1 || chip_id == LTM4677_ID_REV2)
638*4882a593Smuzhiyun return ltm4677;
639*4882a593Smuzhiyun else if (chip_id == LTM4678_ID_REV1 || chip_id == LTM4678_ID_REV2)
640*4882a593Smuzhiyun return ltm4678;
641*4882a593Smuzhiyun else if (chip_id == LTM4680_ID)
642*4882a593Smuzhiyun return ltm4680;
643*4882a593Smuzhiyun else if (chip_id == LTM4686_ID)
644*4882a593Smuzhiyun return ltm4686;
645*4882a593Smuzhiyun else if (chip_id == LTM4700_ID)
646*4882a593Smuzhiyun return ltm4700;
647*4882a593Smuzhiyun
648*4882a593Smuzhiyun dev_err(&client->dev, "Unsupported chip ID 0x%x\n", chip_id);
649*4882a593Smuzhiyun return -ENODEV;
650*4882a593Smuzhiyun }
651*4882a593Smuzhiyun
ltc2978_probe(struct i2c_client * client)652*4882a593Smuzhiyun static int ltc2978_probe(struct i2c_client *client)
653*4882a593Smuzhiyun {
654*4882a593Smuzhiyun int i, chip_id;
655*4882a593Smuzhiyun struct ltc2978_data *data;
656*4882a593Smuzhiyun struct pmbus_driver_info *info;
657*4882a593Smuzhiyun const struct i2c_device_id *id;
658*4882a593Smuzhiyun
659*4882a593Smuzhiyun if (!i2c_check_functionality(client->adapter,
660*4882a593Smuzhiyun I2C_FUNC_SMBUS_READ_WORD_DATA))
661*4882a593Smuzhiyun return -ENODEV;
662*4882a593Smuzhiyun
663*4882a593Smuzhiyun data = devm_kzalloc(&client->dev, sizeof(struct ltc2978_data),
664*4882a593Smuzhiyun GFP_KERNEL);
665*4882a593Smuzhiyun if (!data)
666*4882a593Smuzhiyun return -ENOMEM;
667*4882a593Smuzhiyun
668*4882a593Smuzhiyun chip_id = ltc2978_get_id(client);
669*4882a593Smuzhiyun if (chip_id < 0)
670*4882a593Smuzhiyun return chip_id;
671*4882a593Smuzhiyun
672*4882a593Smuzhiyun data->id = chip_id;
673*4882a593Smuzhiyun id = i2c_match_id(ltc2978_id, client);
674*4882a593Smuzhiyun if (data->id != id->driver_data)
675*4882a593Smuzhiyun dev_warn(&client->dev,
676*4882a593Smuzhiyun "Device mismatch: Configured %s (%d), detected %d\n",
677*4882a593Smuzhiyun id->name,
678*4882a593Smuzhiyun (int) id->driver_data,
679*4882a593Smuzhiyun chip_id);
680*4882a593Smuzhiyun
681*4882a593Smuzhiyun info = &data->info;
682*4882a593Smuzhiyun info->write_word_data = ltc2978_write_word_data;
683*4882a593Smuzhiyun info->write_byte = ltc_write_byte;
684*4882a593Smuzhiyun info->read_word_data = ltc_read_word_data;
685*4882a593Smuzhiyun info->read_byte_data = ltc_read_byte_data;
686*4882a593Smuzhiyun
687*4882a593Smuzhiyun data->vin_min = 0x7bff;
688*4882a593Smuzhiyun data->vin_max = 0x7c00;
689*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(data->vout_min); i++)
690*4882a593Smuzhiyun data->vout_min[i] = 0xffff;
691*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(data->iout_min); i++)
692*4882a593Smuzhiyun data->iout_min[i] = 0xfbff;
693*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(data->iout_max); i++)
694*4882a593Smuzhiyun data->iout_max[i] = 0x7c00;
695*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(data->temp_min); i++)
696*4882a593Smuzhiyun data->temp_min[i] = 0x7bff;
697*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(data->temp_max); i++)
698*4882a593Smuzhiyun data->temp_max[i] = 0x7c00;
699*4882a593Smuzhiyun data->temp2_max = 0x7c00;
700*4882a593Smuzhiyun
701*4882a593Smuzhiyun switch (data->id) {
702*4882a593Smuzhiyun case ltc2972:
703*4882a593Smuzhiyun info->read_word_data = ltc2975_read_word_data;
704*4882a593Smuzhiyun info->pages = LTC2972_NUM_PAGES;
705*4882a593Smuzhiyun info->func[0] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN
706*4882a593Smuzhiyun | PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
707*4882a593Smuzhiyun | PMBUS_HAVE_TEMP2;
708*4882a593Smuzhiyun for (i = 0; i < info->pages; i++) {
709*4882a593Smuzhiyun info->func[i] |= PMBUS_HAVE_VOUT
710*4882a593Smuzhiyun | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_POUT
711*4882a593Smuzhiyun | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
712*4882a593Smuzhiyun | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
713*4882a593Smuzhiyun }
714*4882a593Smuzhiyun break;
715*4882a593Smuzhiyun case ltc2974:
716*4882a593Smuzhiyun info->read_word_data = ltc2974_read_word_data;
717*4882a593Smuzhiyun info->pages = LTC2974_NUM_PAGES;
718*4882a593Smuzhiyun info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
719*4882a593Smuzhiyun | PMBUS_HAVE_TEMP2;
720*4882a593Smuzhiyun for (i = 0; i < info->pages; i++) {
721*4882a593Smuzhiyun info->func[i] |= PMBUS_HAVE_VOUT
722*4882a593Smuzhiyun | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_POUT
723*4882a593Smuzhiyun | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
724*4882a593Smuzhiyun | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
725*4882a593Smuzhiyun }
726*4882a593Smuzhiyun break;
727*4882a593Smuzhiyun case ltc2975:
728*4882a593Smuzhiyun info->read_word_data = ltc2975_read_word_data;
729*4882a593Smuzhiyun info->pages = LTC2974_NUM_PAGES;
730*4882a593Smuzhiyun info->func[0] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN
731*4882a593Smuzhiyun | PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
732*4882a593Smuzhiyun | PMBUS_HAVE_TEMP2;
733*4882a593Smuzhiyun for (i = 0; i < info->pages; i++) {
734*4882a593Smuzhiyun info->func[i] |= PMBUS_HAVE_VOUT
735*4882a593Smuzhiyun | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_POUT
736*4882a593Smuzhiyun | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
737*4882a593Smuzhiyun | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
738*4882a593Smuzhiyun }
739*4882a593Smuzhiyun break;
740*4882a593Smuzhiyun
741*4882a593Smuzhiyun case ltc2977:
742*4882a593Smuzhiyun case ltc2978:
743*4882a593Smuzhiyun case ltc2979:
744*4882a593Smuzhiyun case ltc2980:
745*4882a593Smuzhiyun case ltm2987:
746*4882a593Smuzhiyun info->read_word_data = ltc2978_read_word_data;
747*4882a593Smuzhiyun info->pages = LTC2978_NUM_PAGES;
748*4882a593Smuzhiyun info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
749*4882a593Smuzhiyun | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
750*4882a593Smuzhiyun | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
751*4882a593Smuzhiyun for (i = 1; i < LTC2978_NUM_PAGES; i++) {
752*4882a593Smuzhiyun info->func[i] = PMBUS_HAVE_VOUT
753*4882a593Smuzhiyun | PMBUS_HAVE_STATUS_VOUT;
754*4882a593Smuzhiyun }
755*4882a593Smuzhiyun break;
756*4882a593Smuzhiyun case ltc3880:
757*4882a593Smuzhiyun case ltc3887:
758*4882a593Smuzhiyun case ltm4675:
759*4882a593Smuzhiyun case ltm4676:
760*4882a593Smuzhiyun case ltm4677:
761*4882a593Smuzhiyun case ltm4686:
762*4882a593Smuzhiyun data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING;
763*4882a593Smuzhiyun info->read_word_data = ltc3880_read_word_data;
764*4882a593Smuzhiyun info->pages = LTC3880_NUM_PAGES;
765*4882a593Smuzhiyun info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
766*4882a593Smuzhiyun | PMBUS_HAVE_STATUS_INPUT
767*4882a593Smuzhiyun | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
768*4882a593Smuzhiyun | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
769*4882a593Smuzhiyun | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
770*4882a593Smuzhiyun | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
771*4882a593Smuzhiyun info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
772*4882a593Smuzhiyun | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
773*4882a593Smuzhiyun | PMBUS_HAVE_POUT
774*4882a593Smuzhiyun | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
775*4882a593Smuzhiyun break;
776*4882a593Smuzhiyun case ltc3882:
777*4882a593Smuzhiyun data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING;
778*4882a593Smuzhiyun info->read_word_data = ltc3880_read_word_data;
779*4882a593Smuzhiyun info->pages = LTC3880_NUM_PAGES;
780*4882a593Smuzhiyun info->func[0] = PMBUS_HAVE_VIN
781*4882a593Smuzhiyun | PMBUS_HAVE_STATUS_INPUT
782*4882a593Smuzhiyun | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
783*4882a593Smuzhiyun | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
784*4882a593Smuzhiyun | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
785*4882a593Smuzhiyun | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
786*4882a593Smuzhiyun info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
787*4882a593Smuzhiyun | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
788*4882a593Smuzhiyun | PMBUS_HAVE_POUT
789*4882a593Smuzhiyun | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
790*4882a593Smuzhiyun break;
791*4882a593Smuzhiyun case ltc3883:
792*4882a593Smuzhiyun data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING;
793*4882a593Smuzhiyun info->read_word_data = ltc3883_read_word_data;
794*4882a593Smuzhiyun info->pages = LTC3883_NUM_PAGES;
795*4882a593Smuzhiyun info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
796*4882a593Smuzhiyun | PMBUS_HAVE_STATUS_INPUT
797*4882a593Smuzhiyun | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
798*4882a593Smuzhiyun | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
799*4882a593Smuzhiyun | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
800*4882a593Smuzhiyun | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
801*4882a593Smuzhiyun break;
802*4882a593Smuzhiyun case ltc3884:
803*4882a593Smuzhiyun case ltc3886:
804*4882a593Smuzhiyun case ltc3889:
805*4882a593Smuzhiyun case ltc7880:
806*4882a593Smuzhiyun case ltm4664:
807*4882a593Smuzhiyun case ltm4678:
808*4882a593Smuzhiyun case ltm4680:
809*4882a593Smuzhiyun case ltm4700:
810*4882a593Smuzhiyun data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING;
811*4882a593Smuzhiyun info->read_word_data = ltc3883_read_word_data;
812*4882a593Smuzhiyun info->pages = LTC3880_NUM_PAGES;
813*4882a593Smuzhiyun info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
814*4882a593Smuzhiyun | PMBUS_HAVE_STATUS_INPUT
815*4882a593Smuzhiyun | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
816*4882a593Smuzhiyun | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
817*4882a593Smuzhiyun | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
818*4882a593Smuzhiyun | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
819*4882a593Smuzhiyun info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
820*4882a593Smuzhiyun | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
821*4882a593Smuzhiyun | PMBUS_HAVE_POUT
822*4882a593Smuzhiyun | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
823*4882a593Smuzhiyun break;
824*4882a593Smuzhiyun default:
825*4882a593Smuzhiyun return -ENODEV;
826*4882a593Smuzhiyun }
827*4882a593Smuzhiyun
828*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_SENSORS_LTC2978_REGULATOR)
829*4882a593Smuzhiyun info->num_regulators = info->pages;
830*4882a593Smuzhiyun info->reg_desc = ltc2978_reg_desc;
831*4882a593Smuzhiyun if (info->num_regulators > ARRAY_SIZE(ltc2978_reg_desc)) {
832*4882a593Smuzhiyun dev_err(&client->dev, "num_regulators too large!");
833*4882a593Smuzhiyun info->num_regulators = ARRAY_SIZE(ltc2978_reg_desc);
834*4882a593Smuzhiyun }
835*4882a593Smuzhiyun #endif
836*4882a593Smuzhiyun
837*4882a593Smuzhiyun return pmbus_do_probe(client, info);
838*4882a593Smuzhiyun }
839*4882a593Smuzhiyun
840*4882a593Smuzhiyun
841*4882a593Smuzhiyun #ifdef CONFIG_OF
842*4882a593Smuzhiyun static const struct of_device_id ltc2978_of_match[] = {
843*4882a593Smuzhiyun { .compatible = "lltc,ltc2972" },
844*4882a593Smuzhiyun { .compatible = "lltc,ltc2974" },
845*4882a593Smuzhiyun { .compatible = "lltc,ltc2975" },
846*4882a593Smuzhiyun { .compatible = "lltc,ltc2977" },
847*4882a593Smuzhiyun { .compatible = "lltc,ltc2978" },
848*4882a593Smuzhiyun { .compatible = "lltc,ltc2979" },
849*4882a593Smuzhiyun { .compatible = "lltc,ltc2980" },
850*4882a593Smuzhiyun { .compatible = "lltc,ltc3880" },
851*4882a593Smuzhiyun { .compatible = "lltc,ltc3882" },
852*4882a593Smuzhiyun { .compatible = "lltc,ltc3883" },
853*4882a593Smuzhiyun { .compatible = "lltc,ltc3884" },
854*4882a593Smuzhiyun { .compatible = "lltc,ltc3886" },
855*4882a593Smuzhiyun { .compatible = "lltc,ltc3887" },
856*4882a593Smuzhiyun { .compatible = "lltc,ltc3889" },
857*4882a593Smuzhiyun { .compatible = "lltc,ltc7880" },
858*4882a593Smuzhiyun { .compatible = "lltc,ltm2987" },
859*4882a593Smuzhiyun { .compatible = "lltc,ltm4664" },
860*4882a593Smuzhiyun { .compatible = "lltc,ltm4675" },
861*4882a593Smuzhiyun { .compatible = "lltc,ltm4676" },
862*4882a593Smuzhiyun { .compatible = "lltc,ltm4677" },
863*4882a593Smuzhiyun { .compatible = "lltc,ltm4678" },
864*4882a593Smuzhiyun { .compatible = "lltc,ltm4680" },
865*4882a593Smuzhiyun { .compatible = "lltc,ltm4686" },
866*4882a593Smuzhiyun { .compatible = "lltc,ltm4700" },
867*4882a593Smuzhiyun { }
868*4882a593Smuzhiyun };
869*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, ltc2978_of_match);
870*4882a593Smuzhiyun #endif
871*4882a593Smuzhiyun
872*4882a593Smuzhiyun static struct i2c_driver ltc2978_driver = {
873*4882a593Smuzhiyun .driver = {
874*4882a593Smuzhiyun .name = "ltc2978",
875*4882a593Smuzhiyun .of_match_table = of_match_ptr(ltc2978_of_match),
876*4882a593Smuzhiyun },
877*4882a593Smuzhiyun .probe_new = ltc2978_probe,
878*4882a593Smuzhiyun .remove = pmbus_do_remove,
879*4882a593Smuzhiyun .id_table = ltc2978_id,
880*4882a593Smuzhiyun };
881*4882a593Smuzhiyun
882*4882a593Smuzhiyun module_i2c_driver(ltc2978_driver);
883*4882a593Smuzhiyun
884*4882a593Smuzhiyun MODULE_AUTHOR("Guenter Roeck");
885*4882a593Smuzhiyun MODULE_DESCRIPTION("PMBus driver for LTC2978 and compatible chips");
886*4882a593Smuzhiyun MODULE_LICENSE("GPL");
887