blob: 29c0b7219aaa73253fe8cb10543cca9bc5e0c771 [file] [log] [blame]
Guenter Roeckc3ff9a62011-09-02 09:58:37 -07001/*
Guenter Roeck649ca822015-06-08 09:56:20 -07002 * Hardware monitoring driver for LTC2978 and compatible chips.
Guenter Roeckc3ff9a62011-09-02 09:58:37 -07003 *
4 * Copyright (c) 2011 Ericsson AB.
Guenter Roeck649ca822015-06-08 09:56:20 -07005 * Copyright (c) 2013, 2014, 2015 Guenter Roeck
Michael Jonese04d1ce2015-08-17 17:45:32 -07006 * Copyright (c) 2015 Linear Technology
Michael Hennerich4e15d052018-08-14 14:18:28 +02007 * Copyright (c) 2018 Analog Devices Inc.
Guenter Roeckc3ff9a62011-09-02 09:58:37 -07008 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
Guenter Roeckc3ff9a62011-09-02 09:58:37 -070018 */
19
Michael Jonese04d1ce2015-08-17 17:45:32 -070020#include <linux/delay.h>
21#include <linux/jiffies.h>
Guenter Roeckc3ff9a62011-09-02 09:58:37 -070022#include <linux/kernel.h>
23#include <linux/module.h>
24#include <linux/init.h>
25#include <linux/err.h>
26#include <linux/slab.h>
27#include <linux/i2c.h>
Alan Tull77aa3582014-10-15 13:55:10 -050028#include <linux/regulator/driver.h>
Guenter Roeckc3ff9a62011-09-02 09:58:37 -070029#include "pmbus.h"
30
Guenter Roeck52aae6a2015-08-17 06:38:01 -070031enum chips { ltc2974, ltc2975, ltc2977, ltc2978, ltc2980, ltc3880, ltc3882,
Michael Hennerich4e15d052018-08-14 14:18:28 +020032 ltc3883, ltc3886, ltc3887, ltm2987, ltm4675, ltm4676, ltm4686 };
Guenter Roeckc3ff9a62011-09-02 09:58:37 -070033
Guenter Roeckfd9175d2013-01-27 09:24:28 -080034/* Common for all chips */
Guenter Roeckc3ff9a62011-09-02 09:58:37 -070035#define LTC2978_MFR_VOUT_PEAK 0xdd
36#define LTC2978_MFR_VIN_PEAK 0xde
37#define LTC2978_MFR_TEMPERATURE_PEAK 0xdf
Guenter Roeckacb092c2015-08-17 06:27:56 -070038#define LTC2978_MFR_SPECIAL_ID 0xe7 /* Undocumented on LTC3882 */
Michael Jonese04d1ce2015-08-17 17:45:32 -070039#define LTC2978_MFR_COMMON 0xef
Guenter Roeckc3ff9a62011-09-02 09:58:37 -070040
Guenter Roeck52aae6a2015-08-17 06:38:01 -070041/* LTC2974, LTC2975, LCT2977, LTC2980, LTC2978, and LTM2987 */
Guenter Roeckc3ff9a62011-09-02 09:58:37 -070042#define LTC2978_MFR_VOUT_MIN 0xfb
43#define LTC2978_MFR_VIN_MIN 0xfc
44#define LTC2978_MFR_TEMPERATURE_MIN 0xfd
45
Guenter Roeck649ca822015-06-08 09:56:20 -070046/* LTC2974, LTC2975 */
Guenter Roeckfd9175d2013-01-27 09:24:28 -080047#define LTC2974_MFR_IOUT_PEAK 0xd7
48#define LTC2974_MFR_IOUT_MIN 0xd8
49
Guenter Roeckccf2dc52015-08-17 20:08:09 -070050/* LTC3880, LTC3882, LTC3883, LTC3887, LTM4675, and LTM4676 */
Guenter Roeckddfb41c2011-09-11 20:31:09 -070051#define LTC3880_MFR_IOUT_PEAK 0xd7
52#define LTC3880_MFR_CLEAR_PEAKS 0xe3
53#define LTC3880_MFR_TEMPERATURE2_PEAK 0xf4
54
Guenter Roeck228b6872015-08-17 07:21:43 -070055/* LTC3883 and LTC3886 only */
Guenter Roeckfd9175d2013-01-27 09:24:28 -080056#define LTC3883_MFR_IIN_PEAK 0xe1
57
Guenter Roeck649ca822015-06-08 09:56:20 -070058/* LTC2975 only */
59#define LTC2975_MFR_IIN_PEAK 0xc4
60#define LTC2975_MFR_IIN_MIN 0xc5
61#define LTC2975_MFR_PIN_PEAK 0xc6
62#define LTC2975_MFR_PIN_MIN 0xc7
63
Guenter Roeck00c83372015-08-17 06:21:01 -070064#define LTC2978_ID_MASK 0xfff0
65
66#define LTC2974_ID 0x0210
67#define LTC2975_ID 0x0220
Guenter Roeckc24c407e2013-09-23 10:56:48 -070068#define LTC2977_ID 0x0130
Guenter Roeckacb092c2015-08-17 06:27:56 -070069#define LTC2978_ID_REV1 0x0110 /* Early revision */
70#define LTC2978_ID_REV2 0x0120
Guenter Roeck52aae6a2015-08-17 06:38:01 -070071#define LTC2980_ID_A 0x8030 /* A/B for two die IDs */
72#define LTC2980_ID_B 0x8040
Guenter Roeck00c83372015-08-17 06:21:01 -070073#define LTC3880_ID 0x4020
Guenter Roeckacb092c2015-08-17 06:27:56 -070074#define LTC3882_ID 0x4200
75#define LTC3882_ID_D1 0x4240 /* Dash 1 */
Guenter Roeckfd9175d2013-01-27 09:24:28 -080076#define LTC3883_ID 0x4300
Guenter Roeck228b6872015-08-17 07:21:43 -070077#define LTC3886_ID 0x4600
Guenter Roeck15398562015-08-07 09:06:37 -070078#define LTC3887_ID 0x4700
Guenter Roeck52aae6a2015-08-17 06:38:01 -070079#define LTM2987_ID_A 0x8010 /* A/B for two die IDs */
80#define LTM2987_ID_B 0x8020
Guenter Roeckccf2dc52015-08-17 20:08:09 -070081#define LTM4675_ID 0x47a0
Guenter Roeck00c83372015-08-17 06:21:01 -070082#define LTM4676_ID_REV1 0x4400
83#define LTM4676_ID_REV2 0x4480
Guenter Roeck15398562015-08-07 09:06:37 -070084#define LTM4676A_ID 0x47e0
Michael Hennerich4e15d052018-08-14 14:18:28 +020085#define LTM4686_ID 0x4770
Guenter Roeckc3ff9a62011-09-02 09:58:37 -070086
Guenter Roeckfd9175d2013-01-27 09:24:28 -080087#define LTC2974_NUM_PAGES 4
Guenter Roeck3d0d2832013-02-28 08:14:45 -080088#define LTC2978_NUM_PAGES 8
89#define LTC3880_NUM_PAGES 2
Guenter Roeckfd9175d2013-01-27 09:24:28 -080090#define LTC3883_NUM_PAGES 1
Guenter Roeck3d0d2832013-02-28 08:14:45 -080091
Michael Jonese04d1ce2015-08-17 17:45:32 -070092#define LTC_POLL_TIMEOUT 100 /* in milli-seconds */
93
94#define LTC_NOT_BUSY BIT(5)
95#define LTC_NOT_PENDING BIT(4)
96
Guenter Roeckc3ff9a62011-09-02 09:58:37 -070097/*
98 * LTC2978 clears peak data whenever the CLEAR_FAULTS command is executed, which
99 * happens pretty much each time chip data is updated. Raw peak data therefore
100 * does not provide much value. To be able to provide useful peak data, keep an
101 * internal cache of measured peak data, which is only cleared if an explicit
102 * "clear peak" command is executed for the sensor in question.
103 */
Guenter Roeck3d0d2832013-02-28 08:14:45 -0800104
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700105struct ltc2978_data {
106 enum chips id;
Guenter Roeck3d0d2832013-02-28 08:14:45 -0800107 u16 vin_min, vin_max;
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800108 u16 temp_min[LTC2974_NUM_PAGES], temp_max[LTC2974_NUM_PAGES];
Guenter Roeck3d0d2832013-02-28 08:14:45 -0800109 u16 vout_min[LTC2978_NUM_PAGES], vout_max[LTC2978_NUM_PAGES];
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800110 u16 iout_min[LTC2974_NUM_PAGES], iout_max[LTC2974_NUM_PAGES];
Guenter Roeck649ca822015-06-08 09:56:20 -0700111 u16 iin_min, iin_max;
112 u16 pin_min, pin_max;
Guenter Roeck3d0d2832013-02-28 08:14:45 -0800113 u16 temp2_max;
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700114 struct pmbus_driver_info info;
Guenter Roeck8582bcc2015-08-15 17:02:09 -0700115 u32 features;
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700116};
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700117#define to_ltc2978_data(x) container_of(x, struct ltc2978_data, info)
118
Guenter Roeck8582bcc2015-08-15 17:02:09 -0700119#define FEAT_CLEAR_PEAKS BIT(0)
Michael Jonese04d1ce2015-08-17 17:45:32 -0700120#define FEAT_NEEDS_POLLING BIT(1)
Guenter Roeck8582bcc2015-08-15 17:02:09 -0700121
122#define has_clear_peaks(d) ((d)->features & FEAT_CLEAR_PEAKS)
Michael Jonese04d1ce2015-08-17 17:45:32 -0700123#define needs_polling(d) ((d)->features & FEAT_NEEDS_POLLING)
124
125static int ltc_wait_ready(struct i2c_client *client)
126{
127 unsigned long timeout = jiffies + msecs_to_jiffies(LTC_POLL_TIMEOUT);
128 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
129 struct ltc2978_data *data = to_ltc2978_data(info);
130 int status;
131 u8 mask;
132
133 if (!needs_polling(data))
134 return 0;
135
136 /*
137 * LTC3883 does not support LTC_NOT_PENDING, even though
138 * the datasheet claims that it does.
139 */
140 mask = LTC_NOT_BUSY;
141 if (data->id != ltc3883)
142 mask |= LTC_NOT_PENDING;
143
144 do {
145 status = pmbus_read_byte_data(client, 0, LTC2978_MFR_COMMON);
146 if (status == -EBADMSG || status == -ENXIO) {
147 /* PEC error or NACK: chip may be busy, try again */
148 usleep_range(50, 100);
149 continue;
150 }
151 if (status < 0)
152 return status;
153
154 if ((status & mask) == mask)
155 return 0;
156
157 usleep_range(50, 100);
158 } while (time_before(jiffies, timeout));
159
160 return -ETIMEDOUT;
161}
162
163static int ltc_read_word_data(struct i2c_client *client, int page, int reg)
164{
165 int ret;
166
167 ret = ltc_wait_ready(client);
168 if (ret < 0)
169 return ret;
170
171 return pmbus_read_word_data(client, page, reg);
172}
173
174static int ltc_read_byte_data(struct i2c_client *client, int page, int reg)
175{
176 int ret;
177
178 ret = ltc_wait_ready(client);
179 if (ret < 0)
180 return ret;
181
182 return pmbus_read_byte_data(client, page, reg);
183}
184
185static int ltc_write_byte(struct i2c_client *client, int page, u8 byte)
186{
187 int ret;
188
189 ret = ltc_wait_ready(client);
190 if (ret < 0)
191 return ret;
192
193 return pmbus_write_byte(client, page, byte);
194}
Guenter Roeck8582bcc2015-08-15 17:02:09 -0700195
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700196static inline int lin11_to_val(int data)
197{
198 s16 e = ((s16)data) >> 11;
199 s32 m = (((s16)(data << 5)) >> 5);
200
201 /*
202 * mantissa is 10 bit + sign, exponent adds up to 15 bit.
203 * Add 6 bit to exponent for maximum accuracy (10 + 15 + 6 = 31).
204 */
205 e += 6;
206 return (e < 0 ? m >> -e : m << e);
207}
208
Guenter Roeckee847a22015-08-15 17:17:53 -0700209static int ltc_get_max(struct ltc2978_data *data, struct i2c_client *client,
210 int page, int reg, u16 *pmax)
211{
212 int ret;
213
Michael Jonese04d1ce2015-08-17 17:45:32 -0700214 ret = ltc_read_word_data(client, page, reg);
Guenter Roeckee847a22015-08-15 17:17:53 -0700215 if (ret >= 0) {
216 if (lin11_to_val(ret) > lin11_to_val(*pmax))
217 *pmax = ret;
218 ret = *pmax;
219 }
220 return ret;
221}
222
223static int ltc_get_min(struct ltc2978_data *data, struct i2c_client *client,
224 int page, int reg, u16 *pmin)
225{
226 int ret;
227
Michael Jonese04d1ce2015-08-17 17:45:32 -0700228 ret = ltc_read_word_data(client, page, reg);
Guenter Roeckee847a22015-08-15 17:17:53 -0700229 if (ret >= 0) {
230 if (lin11_to_val(ret) < lin11_to_val(*pmin))
231 *pmin = ret;
232 ret = *pmin;
233 }
234 return ret;
235}
236
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700237static int ltc2978_read_word_data_common(struct i2c_client *client, int page,
238 int reg)
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700239{
240 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
241 struct ltc2978_data *data = to_ltc2978_data(info);
242 int ret;
243
244 switch (reg) {
245 case PMBUS_VIRT_READ_VIN_MAX:
Guenter Roeckee847a22015-08-15 17:17:53 -0700246 ret = ltc_get_max(data, client, page, LTC2978_MFR_VIN_PEAK,
247 &data->vin_max);
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700248 break;
249 case PMBUS_VIRT_READ_VOUT_MAX:
Michael Jonese04d1ce2015-08-17 17:45:32 -0700250 ret = ltc_read_word_data(client, page, LTC2978_MFR_VOUT_PEAK);
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700251 if (ret >= 0) {
252 /*
253 * VOUT is 16 bit unsigned with fixed exponent,
254 * so we can compare it directly
255 */
256 if (ret > data->vout_max[page])
257 data->vout_max[page] = ret;
258 ret = data->vout_max[page];
259 }
260 break;
261 case PMBUS_VIRT_READ_TEMP_MAX:
Guenter Roeckee847a22015-08-15 17:17:53 -0700262 ret = ltc_get_max(data, client, page,
263 LTC2978_MFR_TEMPERATURE_PEAK,
264 &data->temp_max[page]);
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700265 break;
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700266 case PMBUS_VIRT_RESET_VOUT_HISTORY:
267 case PMBUS_VIRT_RESET_VIN_HISTORY:
268 case PMBUS_VIRT_RESET_TEMP_HISTORY:
269 ret = 0;
270 break;
271 default:
Michael Jonese04d1ce2015-08-17 17:45:32 -0700272 ret = ltc_wait_ready(client);
273 if (ret < 0)
274 return ret;
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700275 ret = -ENODATA;
276 break;
277 }
278 return ret;
279}
280
281static int ltc2978_read_word_data(struct i2c_client *client, int page, int reg)
282{
283 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
284 struct ltc2978_data *data = to_ltc2978_data(info);
285 int ret;
286
287 switch (reg) {
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700288 case PMBUS_VIRT_READ_VIN_MIN:
Guenter Roeckee847a22015-08-15 17:17:53 -0700289 ret = ltc_get_min(data, client, page, LTC2978_MFR_VIN_MIN,
290 &data->vin_min);
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700291 break;
292 case PMBUS_VIRT_READ_VOUT_MIN:
Michael Jonese04d1ce2015-08-17 17:45:32 -0700293 ret = ltc_read_word_data(client, page, LTC2978_MFR_VOUT_MIN);
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700294 if (ret >= 0) {
295 /*
296 * VOUT_MIN is known to not be supported on some lots
297 * of LTC2978 revision 1, and will return the maximum
298 * possible voltage if read. If VOUT_MAX is valid and
299 * lower than the reading of VOUT_MIN, use it instead.
300 */
301 if (data->vout_max[page] && ret > data->vout_max[page])
302 ret = data->vout_max[page];
303 if (ret < data->vout_min[page])
304 data->vout_min[page] = ret;
305 ret = data->vout_min[page];
306 }
307 break;
308 case PMBUS_VIRT_READ_TEMP_MIN:
Guenter Roeckee847a22015-08-15 17:17:53 -0700309 ret = ltc_get_min(data, client, page,
310 LTC2978_MFR_TEMPERATURE_MIN,
311 &data->temp_min[page]);
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700312 break;
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700313 case PMBUS_VIRT_READ_IOUT_MAX:
314 case PMBUS_VIRT_RESET_IOUT_HISTORY:
315 case PMBUS_VIRT_READ_TEMP2_MAX:
316 case PMBUS_VIRT_RESET_TEMP2_HISTORY:
317 ret = -ENXIO;
318 break;
319 default:
320 ret = ltc2978_read_word_data_common(client, page, reg);
321 break;
322 }
323 return ret;
324}
325
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800326static int ltc2974_read_word_data(struct i2c_client *client, int page, int reg)
327{
328 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
329 struct ltc2978_data *data = to_ltc2978_data(info);
330 int ret;
331
332 switch (reg) {
333 case PMBUS_VIRT_READ_IOUT_MAX:
Guenter Roeckee847a22015-08-15 17:17:53 -0700334 ret = ltc_get_max(data, client, page, LTC2974_MFR_IOUT_PEAK,
335 &data->iout_max[page]);
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800336 break;
337 case PMBUS_VIRT_READ_IOUT_MIN:
Guenter Roeckee847a22015-08-15 17:17:53 -0700338 ret = ltc_get_min(data, client, page, LTC2974_MFR_IOUT_MIN,
339 &data->iout_min[page]);
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800340 break;
341 case PMBUS_VIRT_RESET_IOUT_HISTORY:
342 ret = 0;
343 break;
344 default:
345 ret = ltc2978_read_word_data(client, page, reg);
346 break;
347 }
348 return ret;
349}
350
Guenter Roeck649ca822015-06-08 09:56:20 -0700351static int ltc2975_read_word_data(struct i2c_client *client, int page, int reg)
352{
353 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
354 struct ltc2978_data *data = to_ltc2978_data(info);
355 int ret;
356
357 switch (reg) {
358 case PMBUS_VIRT_READ_IIN_MAX:
Guenter Roeckee847a22015-08-15 17:17:53 -0700359 ret = ltc_get_max(data, client, page, LTC2975_MFR_IIN_PEAK,
360 &data->iin_max);
Guenter Roeck649ca822015-06-08 09:56:20 -0700361 break;
362 case PMBUS_VIRT_READ_IIN_MIN:
Guenter Roeckee847a22015-08-15 17:17:53 -0700363 ret = ltc_get_min(data, client, page, LTC2975_MFR_IIN_MIN,
364 &data->iin_min);
Guenter Roeck649ca822015-06-08 09:56:20 -0700365 break;
366 case PMBUS_VIRT_READ_PIN_MAX:
Guenter Roeckee847a22015-08-15 17:17:53 -0700367 ret = ltc_get_max(data, client, page, LTC2975_MFR_PIN_PEAK,
368 &data->pin_max);
Guenter Roeck649ca822015-06-08 09:56:20 -0700369 break;
370 case PMBUS_VIRT_READ_PIN_MIN:
Guenter Roeckee847a22015-08-15 17:17:53 -0700371 ret = ltc_get_min(data, client, page, LTC2975_MFR_PIN_MIN,
372 &data->pin_min);
Guenter Roeck649ca822015-06-08 09:56:20 -0700373 break;
374 case PMBUS_VIRT_RESET_IIN_HISTORY:
375 case PMBUS_VIRT_RESET_PIN_HISTORY:
376 ret = 0;
377 break;
378 default:
379 ret = ltc2978_read_word_data(client, page, reg);
380 break;
381 }
382 return ret;
383}
384
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700385static int ltc3880_read_word_data(struct i2c_client *client, int page, int reg)
386{
387 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
388 struct ltc2978_data *data = to_ltc2978_data(info);
389 int ret;
390
391 switch (reg) {
392 case PMBUS_VIRT_READ_IOUT_MAX:
Guenter Roeckee847a22015-08-15 17:17:53 -0700393 ret = ltc_get_max(data, client, page, LTC3880_MFR_IOUT_PEAK,
394 &data->iout_max[page]);
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700395 break;
396 case PMBUS_VIRT_READ_TEMP2_MAX:
Guenter Roeckee847a22015-08-15 17:17:53 -0700397 ret = ltc_get_max(data, client, page,
398 LTC3880_MFR_TEMPERATURE2_PEAK,
399 &data->temp2_max);
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700400 break;
401 case PMBUS_VIRT_READ_VIN_MIN:
402 case PMBUS_VIRT_READ_VOUT_MIN:
403 case PMBUS_VIRT_READ_TEMP_MIN:
404 ret = -ENXIO;
405 break;
406 case PMBUS_VIRT_RESET_IOUT_HISTORY:
407 case PMBUS_VIRT_RESET_TEMP2_HISTORY:
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700408 ret = 0;
409 break;
410 default:
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700411 ret = ltc2978_read_word_data_common(client, page, reg);
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700412 break;
413 }
414 return ret;
415}
416
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800417static int ltc3883_read_word_data(struct i2c_client *client, int page, int reg)
418{
419 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
420 struct ltc2978_data *data = to_ltc2978_data(info);
421 int ret;
422
423 switch (reg) {
424 case PMBUS_VIRT_READ_IIN_MAX:
Guenter Roeckee847a22015-08-15 17:17:53 -0700425 ret = ltc_get_max(data, client, page, LTC3883_MFR_IIN_PEAK,
426 &data->iin_max);
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800427 break;
428 case PMBUS_VIRT_RESET_IIN_HISTORY:
429 ret = 0;
430 break;
431 default:
432 ret = ltc3880_read_word_data(client, page, reg);
433 break;
434 }
435 return ret;
436}
437
Guenter Roeck8582bcc2015-08-15 17:02:09 -0700438static int ltc2978_clear_peaks(struct ltc2978_data *data,
439 struct i2c_client *client, int page)
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700440{
441 int ret;
442
Guenter Roeck8582bcc2015-08-15 17:02:09 -0700443 if (has_clear_peaks(data))
Michael Jonese04d1ce2015-08-17 17:45:32 -0700444 ret = ltc_write_byte(client, 0, LTC3880_MFR_CLEAR_PEAKS);
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800445 else
Michael Jonese04d1ce2015-08-17 17:45:32 -0700446 ret = ltc_write_byte(client, page, PMBUS_CLEAR_FAULTS);
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700447
448 return ret;
449}
450
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700451static int ltc2978_write_word_data(struct i2c_client *client, int page,
452 int reg, u16 word)
453{
454 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
455 struct ltc2978_data *data = to_ltc2978_data(info);
456 int ret;
457
458 switch (reg) {
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800459 case PMBUS_VIRT_RESET_IIN_HISTORY:
460 data->iin_max = 0x7c00;
Guenter Roeck649ca822015-06-08 09:56:20 -0700461 data->iin_min = 0x7bff;
Guenter Roeck8582bcc2015-08-15 17:02:09 -0700462 ret = ltc2978_clear_peaks(data, client, 0);
Guenter Roeck649ca822015-06-08 09:56:20 -0700463 break;
464 case PMBUS_VIRT_RESET_PIN_HISTORY:
465 data->pin_max = 0x7c00;
466 data->pin_min = 0x7bff;
Guenter Roeck8582bcc2015-08-15 17:02:09 -0700467 ret = ltc2978_clear_peaks(data, client, 0);
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800468 break;
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700469 case PMBUS_VIRT_RESET_IOUT_HISTORY:
Guenter Roeckdbd712c2013-02-21 09:33:25 -0800470 data->iout_max[page] = 0x7c00;
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800471 data->iout_min[page] = 0xfbff;
Guenter Roeck8582bcc2015-08-15 17:02:09 -0700472 ret = ltc2978_clear_peaks(data, client, page);
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700473 break;
474 case PMBUS_VIRT_RESET_TEMP2_HISTORY:
Guenter Roeckdbd712c2013-02-21 09:33:25 -0800475 data->temp2_max = 0x7c00;
Guenter Roeck8582bcc2015-08-15 17:02:09 -0700476 ret = ltc2978_clear_peaks(data, client, page);
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700477 break;
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700478 case PMBUS_VIRT_RESET_VOUT_HISTORY:
479 data->vout_min[page] = 0xffff;
480 data->vout_max[page] = 0;
Guenter Roeck8582bcc2015-08-15 17:02:09 -0700481 ret = ltc2978_clear_peaks(data, client, page);
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700482 break;
483 case PMBUS_VIRT_RESET_VIN_HISTORY:
484 data->vin_min = 0x7bff;
Guenter Roeckdbd712c2013-02-21 09:33:25 -0800485 data->vin_max = 0x7c00;
Guenter Roeck8582bcc2015-08-15 17:02:09 -0700486 ret = ltc2978_clear_peaks(data, client, page);
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700487 break;
488 case PMBUS_VIRT_RESET_TEMP_HISTORY:
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800489 data->temp_min[page] = 0x7bff;
Guenter Roeck8c958c72013-02-21 10:27:54 -0800490 data->temp_max[page] = 0x7c00;
Guenter Roeck8582bcc2015-08-15 17:02:09 -0700491 ret = ltc2978_clear_peaks(data, client, page);
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700492 break;
493 default:
Michael Jonese04d1ce2015-08-17 17:45:32 -0700494 ret = ltc_wait_ready(client);
495 if (ret < 0)
496 return ret;
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700497 ret = -ENODATA;
498 break;
499 }
500 return ret;
501}
502
503static const struct i2c_device_id ltc2978_id[] = {
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800504 {"ltc2974", ltc2974},
Guenter Roeck649ca822015-06-08 09:56:20 -0700505 {"ltc2975", ltc2975},
Guenter Roeckc24c407e2013-09-23 10:56:48 -0700506 {"ltc2977", ltc2977},
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700507 {"ltc2978", ltc2978},
Guenter Roeck52aae6a2015-08-17 06:38:01 -0700508 {"ltc2980", ltc2980},
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700509 {"ltc3880", ltc3880},
Guenter Roeckbf893862015-06-08 10:29:45 -0700510 {"ltc3882", ltc3882},
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800511 {"ltc3883", ltc3883},
Guenter Roeck228b6872015-08-17 07:21:43 -0700512 {"ltc3886", ltc3886},
Guenter Roeck15398562015-08-07 09:06:37 -0700513 {"ltc3887", ltc3887},
Guenter Roeck52aae6a2015-08-17 06:38:01 -0700514 {"ltm2987", ltm2987},
Guenter Roeckccf2dc52015-08-17 20:08:09 -0700515 {"ltm4675", ltm4675},
Guenter Roeckf76992b2014-03-05 21:23:01 -0800516 {"ltm4676", ltm4676},
Michael Hennerich4e15d052018-08-14 14:18:28 +0200517 {"ltm4686", ltm4686},
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700518 {}
519};
520MODULE_DEVICE_TABLE(i2c, ltc2978_id);
521
Alan Tull77aa3582014-10-15 13:55:10 -0500522#if IS_ENABLED(CONFIG_SENSORS_LTC2978_REGULATOR)
523static const struct regulator_desc ltc2978_reg_desc[] = {
524 PMBUS_REGULATOR("vout", 0),
525 PMBUS_REGULATOR("vout", 1),
526 PMBUS_REGULATOR("vout", 2),
527 PMBUS_REGULATOR("vout", 3),
528 PMBUS_REGULATOR("vout", 4),
529 PMBUS_REGULATOR("vout", 5),
530 PMBUS_REGULATOR("vout", 6),
531 PMBUS_REGULATOR("vout", 7),
532};
533#endif /* CONFIG_SENSORS_LTC2978_REGULATOR */
534
Guenter Roeck836954d2015-06-08 10:14:00 -0700535static int ltc2978_get_id(struct i2c_client *client)
536{
537 int chip_id;
538
539 chip_id = i2c_smbus_read_word_data(client, LTC2978_MFR_SPECIAL_ID);
Guenter Roeckbf893862015-06-08 10:29:45 -0700540 if (chip_id < 0) {
541 const struct i2c_device_id *id;
542 u8 buf[I2C_SMBUS_BLOCK_MAX];
543 int ret;
544
545 if (!i2c_check_functionality(client->adapter,
546 I2C_FUNC_SMBUS_READ_BLOCK_DATA))
547 return -ENODEV;
548
549 ret = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, buf);
550 if (ret < 0)
551 return ret;
552 if (ret < 3 || strncmp(buf, "LTC", 3))
553 return -ENODEV;
554
555 ret = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, buf);
556 if (ret < 0)
557 return ret;
558 for (id = &ltc2978_id[0]; strlen(id->name); id++) {
559 if (!strncasecmp(id->name, buf, strlen(id->name)))
560 return (int)id->driver_data;
561 }
562 return -ENODEV;
563 }
Guenter Roeck836954d2015-06-08 10:14:00 -0700564
Guenter Roeck00c83372015-08-17 06:21:01 -0700565 chip_id &= LTC2978_ID_MASK;
566
567 if (chip_id == LTC2974_ID)
Guenter Roeck836954d2015-06-08 10:14:00 -0700568 return ltc2974;
Guenter Roeck649ca822015-06-08 09:56:20 -0700569 else if (chip_id == LTC2975_ID)
570 return ltc2975;
Guenter Roeck836954d2015-06-08 10:14:00 -0700571 else if (chip_id == LTC2977_ID)
572 return ltc2977;
Guenter Roeckacb092c2015-08-17 06:27:56 -0700573 else if (chip_id == LTC2978_ID_REV1 || chip_id == LTC2978_ID_REV2)
Guenter Roeck836954d2015-06-08 10:14:00 -0700574 return ltc2978;
Guenter Roeck52aae6a2015-08-17 06:38:01 -0700575 else if (chip_id == LTC2980_ID_A || chip_id == LTC2980_ID_B)
576 return ltc2980;
Guenter Roeck00c83372015-08-17 06:21:01 -0700577 else if (chip_id == LTC3880_ID)
Guenter Roeck836954d2015-06-08 10:14:00 -0700578 return ltc3880;
Guenter Roeckacb092c2015-08-17 06:27:56 -0700579 else if (chip_id == LTC3882_ID || chip_id == LTC3882_ID_D1)
580 return ltc3882;
Guenter Roeck00c83372015-08-17 06:21:01 -0700581 else if (chip_id == LTC3883_ID)
Guenter Roeck836954d2015-06-08 10:14:00 -0700582 return ltc3883;
Guenter Roeck228b6872015-08-17 07:21:43 -0700583 else if (chip_id == LTC3886_ID)
584 return ltc3886;
Guenter Roeck00c83372015-08-17 06:21:01 -0700585 else if (chip_id == LTC3887_ID)
Guenter Roeck15398562015-08-07 09:06:37 -0700586 return ltc3887;
Guenter Roeck52aae6a2015-08-17 06:38:01 -0700587 else if (chip_id == LTM2987_ID_A || chip_id == LTM2987_ID_B)
588 return ltm2987;
Guenter Roeckccf2dc52015-08-17 20:08:09 -0700589 else if (chip_id == LTM4675_ID)
590 return ltm4675;
Guenter Roeck00c83372015-08-17 06:21:01 -0700591 else if (chip_id == LTM4676_ID_REV1 || chip_id == LTM4676_ID_REV2 ||
592 chip_id == LTM4676A_ID)
Guenter Roeck836954d2015-06-08 10:14:00 -0700593 return ltm4676;
Michael Hennerich4e15d052018-08-14 14:18:28 +0200594 else if (chip_id == LTM4686_ID)
595 return ltm4686;
Guenter Roeck836954d2015-06-08 10:14:00 -0700596
597 dev_err(&client->dev, "Unsupported chip ID 0x%x\n", chip_id);
598 return -ENODEV;
599}
600
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700601static int ltc2978_probe(struct i2c_client *client,
602 const struct i2c_device_id *id)
603{
Guenter Roeck836954d2015-06-08 10:14:00 -0700604 int i, chip_id;
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700605 struct ltc2978_data *data;
606 struct pmbus_driver_info *info;
607
608 if (!i2c_check_functionality(client->adapter,
609 I2C_FUNC_SMBUS_READ_WORD_DATA))
610 return -ENODEV;
611
Guenter Roeck8b313ca2012-02-22 08:56:43 -0800612 data = devm_kzalloc(&client->dev, sizeof(struct ltc2978_data),
613 GFP_KERNEL);
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700614 if (!data)
615 return -ENOMEM;
616
Guenter Roeck836954d2015-06-08 10:14:00 -0700617 chip_id = ltc2978_get_id(client);
Guenter Roeck8b313ca2012-02-22 08:56:43 -0800618 if (chip_id < 0)
619 return chip_id;
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700620
Guenter Roeck836954d2015-06-08 10:14:00 -0700621 data->id = chip_id;
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700622 if (data->id != id->driver_data)
623 dev_warn(&client->dev,
624 "Device mismatch: Configured %s, detected %s\n",
625 id->name,
626 ltc2978_id[data->id].name);
627
628 info = &data->info;
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700629 info->write_word_data = ltc2978_write_word_data;
Michael Jonese04d1ce2015-08-17 17:45:32 -0700630 info->write_byte = ltc_write_byte;
631 info->read_word_data = ltc_read_word_data;
632 info->read_byte_data = ltc_read_byte_data;
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700633
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700634 data->vin_min = 0x7bff;
Guenter Roeckdbd712c2013-02-21 09:33:25 -0800635 data->vin_max = 0x7c00;
Guenter Roeck3d0d2832013-02-28 08:14:45 -0800636 for (i = 0; i < ARRAY_SIZE(data->vout_min); i++)
637 data->vout_min[i] = 0xffff;
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800638 for (i = 0; i < ARRAY_SIZE(data->iout_min); i++)
639 data->iout_min[i] = 0xfbff;
640 for (i = 0; i < ARRAY_SIZE(data->iout_max); i++)
641 data->iout_max[i] = 0x7c00;
642 for (i = 0; i < ARRAY_SIZE(data->temp_min); i++)
643 data->temp_min[i] = 0x7bff;
Guenter Roeck8c958c72013-02-21 10:27:54 -0800644 for (i = 0; i < ARRAY_SIZE(data->temp_max); i++)
645 data->temp_max[i] = 0x7c00;
Guenter Roeckdbd712c2013-02-21 09:33:25 -0800646 data->temp2_max = 0x7c00;
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700647
Guenter Roeckf366fcc2013-02-21 10:49:40 -0800648 switch (data->id) {
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800649 case ltc2974:
650 info->read_word_data = ltc2974_read_word_data;
651 info->pages = LTC2974_NUM_PAGES;
652 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
653 | PMBUS_HAVE_TEMP2;
654 for (i = 0; i < info->pages; i++) {
655 info->func[i] |= PMBUS_HAVE_VOUT
656 | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_POUT
657 | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
658 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
659 }
660 break;
Guenter Roeck649ca822015-06-08 09:56:20 -0700661 case ltc2975:
662 info->read_word_data = ltc2975_read_word_data;
663 info->pages = LTC2974_NUM_PAGES;
664 info->func[0] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN
665 | PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
666 | PMBUS_HAVE_TEMP2;
667 for (i = 0; i < info->pages; i++) {
668 info->func[i] |= PMBUS_HAVE_VOUT
669 | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_POUT
670 | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
671 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
672 }
673 break;
Guenter Roeckc24c407e2013-09-23 10:56:48 -0700674 case ltc2977:
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700675 case ltc2978:
Guenter Roeck52aae6a2015-08-17 06:38:01 -0700676 case ltc2980:
677 case ltm2987:
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700678 info->read_word_data = ltc2978_read_word_data;
Guenter Roeck3d0d2832013-02-28 08:14:45 -0800679 info->pages = LTC2978_NUM_PAGES;
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700680 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
681 | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
682 | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
Guenter Roeck3d0d2832013-02-28 08:14:45 -0800683 for (i = 1; i < LTC2978_NUM_PAGES; i++) {
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700684 info->func[i] = PMBUS_HAVE_VOUT
685 | PMBUS_HAVE_STATUS_VOUT;
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700686 }
687 break;
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700688 case ltc3880:
Guenter Roeck15398562015-08-07 09:06:37 -0700689 case ltc3887:
Guenter Roeckccf2dc52015-08-17 20:08:09 -0700690 case ltm4675:
Guenter Roeckf76992b2014-03-05 21:23:01 -0800691 case ltm4676:
Michael Hennerich4e15d052018-08-14 14:18:28 +0200692 case ltm4686:
Michael Jonese04d1ce2015-08-17 17:45:32 -0700693 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING;
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700694 info->read_word_data = ltc3880_read_word_data;
Guenter Roeck3d0d2832013-02-28 08:14:45 -0800695 info->pages = LTC3880_NUM_PAGES;
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700696 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
697 | PMBUS_HAVE_STATUS_INPUT
698 | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
699 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
700 | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
701 | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
702 info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
703 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
704 | PMBUS_HAVE_POUT
705 | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800706 break;
Guenter Roeckbf893862015-06-08 10:29:45 -0700707 case ltc3882:
Michael Jonese04d1ce2015-08-17 17:45:32 -0700708 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING;
Guenter Roeckbf893862015-06-08 10:29:45 -0700709 info->read_word_data = ltc3880_read_word_data;
710 info->pages = LTC3880_NUM_PAGES;
711 info->func[0] = PMBUS_HAVE_VIN
712 | PMBUS_HAVE_STATUS_INPUT
713 | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
714 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
715 | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
716 | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
717 info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
718 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
719 | PMBUS_HAVE_POUT
720 | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
721 break;
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800722 case ltc3883:
Michael Jonese04d1ce2015-08-17 17:45:32 -0700723 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING;
Guenter Roeckfd9175d2013-01-27 09:24:28 -0800724 info->read_word_data = ltc3883_read_word_data;
725 info->pages = LTC3883_NUM_PAGES;
726 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
727 | PMBUS_HAVE_STATUS_INPUT
728 | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
729 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
730 | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
731 | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
Guenter Roeckddfb41c2011-09-11 20:31:09 -0700732 break;
Guenter Roeck228b6872015-08-17 07:21:43 -0700733 case ltc3886:
Michael Jonese04d1ce2015-08-17 17:45:32 -0700734 data->features |= FEAT_CLEAR_PEAKS | FEAT_NEEDS_POLLING;
Guenter Roeck228b6872015-08-17 07:21:43 -0700735 info->read_word_data = ltc3883_read_word_data;
736 info->pages = LTC3880_NUM_PAGES;
737 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
738 | PMBUS_HAVE_STATUS_INPUT
739 | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
740 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
741 | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
742 | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
743 info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
744 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
745 | PMBUS_HAVE_POUT
746 | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
747 break;
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700748 default:
Guenter Roeck8b313ca2012-02-22 08:56:43 -0800749 return -ENODEV;
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700750 }
Alan Tull77aa3582014-10-15 13:55:10 -0500751
752#if IS_ENABLED(CONFIG_SENSORS_LTC2978_REGULATOR)
753 info->num_regulators = info->pages;
754 info->reg_desc = ltc2978_reg_desc;
755 if (info->num_regulators > ARRAY_SIZE(ltc2978_reg_desc)) {
756 dev_err(&client->dev, "num_regulators too large!");
757 info->num_regulators = ARRAY_SIZE(ltc2978_reg_desc);
758 }
759#endif
760
Guenter Roeck8b313ca2012-02-22 08:56:43 -0800761 return pmbus_do_probe(client, id, info);
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700762}
763
Alan Tull77aa3582014-10-15 13:55:10 -0500764#ifdef CONFIG_OF
765static const struct of_device_id ltc2978_of_match[] = {
766 { .compatible = "lltc,ltc2974" },
Guenter Roeck649ca822015-06-08 09:56:20 -0700767 { .compatible = "lltc,ltc2975" },
Alan Tull77aa3582014-10-15 13:55:10 -0500768 { .compatible = "lltc,ltc2977" },
769 { .compatible = "lltc,ltc2978" },
Guenter Roeck52aae6a2015-08-17 06:38:01 -0700770 { .compatible = "lltc,ltc2980" },
Alan Tull77aa3582014-10-15 13:55:10 -0500771 { .compatible = "lltc,ltc3880" },
Guenter Roeckbf893862015-06-08 10:29:45 -0700772 { .compatible = "lltc,ltc3882" },
Alan Tull77aa3582014-10-15 13:55:10 -0500773 { .compatible = "lltc,ltc3883" },
Guenter Roeck228b6872015-08-17 07:21:43 -0700774 { .compatible = "lltc,ltc3886" },
Guenter Roeck15398562015-08-07 09:06:37 -0700775 { .compatible = "lltc,ltc3887" },
Guenter Roeck52aae6a2015-08-17 06:38:01 -0700776 { .compatible = "lltc,ltm2987" },
Guenter Roeckccf2dc52015-08-17 20:08:09 -0700777 { .compatible = "lltc,ltm4675" },
Alan Tull77aa3582014-10-15 13:55:10 -0500778 { .compatible = "lltc,ltm4676" },
Michael Hennerich4e15d052018-08-14 14:18:28 +0200779 { .compatible = "lltc,ltm4686" },
Alan Tull77aa3582014-10-15 13:55:10 -0500780 { }
781};
782MODULE_DEVICE_TABLE(of, ltc2978_of_match);
783#endif
784
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700785static struct i2c_driver ltc2978_driver = {
786 .driver = {
787 .name = "ltc2978",
Alan Tull77aa3582014-10-15 13:55:10 -0500788 .of_match_table = of_match_ptr(ltc2978_of_match),
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700789 },
790 .probe = ltc2978_probe,
Guenter Roeckdd285ad2012-02-22 08:56:44 -0800791 .remove = pmbus_do_remove,
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700792 .id_table = ltc2978_id,
793};
794
Axel Linf0967ee2012-01-20 15:38:18 +0800795module_i2c_driver(ltc2978_driver);
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700796
797MODULE_AUTHOR("Guenter Roeck");
Colin Ian King89688e82018-11-26 16:28:32 +0000798MODULE_DESCRIPTION("PMBus driver for LTC2978 and compatible chips");
Guenter Roeckc3ff9a62011-09-02 09:58:37 -0700799MODULE_LICENSE("GPL");