]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/hwmon/pmbus/ltc2978.c
hwmon: (ltc2978) Introduce helper functions for min and max values
[mirror_ubuntu-artful-kernel.git] / drivers / hwmon / pmbus / ltc2978.c
CommitLineData
c3ff9a67 1/*
649ca820 2 * Hardware monitoring driver for LTC2978 and compatible chips.
c3ff9a67
GR
3 *
4 * Copyright (c) 2011 Ericsson AB.
649ca820 5 * Copyright (c) 2013, 2014, 2015 Guenter Roeck
c3ff9a67
GR
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
c3ff9a67
GR
16 */
17
18#include <linux/kernel.h>
19#include <linux/module.h>
20#include <linux/init.h>
21#include <linux/err.h>
22#include <linux/slab.h>
23#include <linux/i2c.h>
77aa3585 24#include <linux/regulator/driver.h>
c3ff9a67
GR
25#include "pmbus.h"
26
649ca820
GR
27enum chips { ltc2974, ltc2975, ltc2977, ltc2978, ltc3880, ltc3882, ltc3883,
28 ltc3887, ltm4676 };
c3ff9a67 29
fd9175d2 30/* Common for all chips */
c3ff9a67
GR
31#define LTC2978_MFR_VOUT_PEAK 0xdd
32#define LTC2978_MFR_VIN_PEAK 0xde
33#define LTC2978_MFR_TEMPERATURE_PEAK 0xdf
bf89386f 34#define LTC2978_MFR_SPECIAL_ID 0xe7 /* Not on LTC3882 */
c3ff9a67 35
649ca820 36/* LTC2974, LTC2975, LCT2977, and LTC2978 */
c3ff9a67
GR
37#define LTC2978_MFR_VOUT_MIN 0xfb
38#define LTC2978_MFR_VIN_MIN 0xfc
39#define LTC2978_MFR_TEMPERATURE_MIN 0xfd
40
649ca820 41/* LTC2974, LTC2975 */
fd9175d2
GR
42#define LTC2974_MFR_IOUT_PEAK 0xd7
43#define LTC2974_MFR_IOUT_MIN 0xd8
44
15398566 45/* LTC3880, LTC3882, LTC3883, LTC3887, and LTM4676 */
ddfb41ca
GR
46#define LTC3880_MFR_IOUT_PEAK 0xd7
47#define LTC3880_MFR_CLEAR_PEAKS 0xe3
48#define LTC3880_MFR_TEMPERATURE2_PEAK 0xf4
49
fd9175d2
GR
50/* LTC3883 only */
51#define LTC3883_MFR_IIN_PEAK 0xe1
52
649ca820
GR
53/* LTC2975 only */
54#define LTC2975_MFR_IIN_PEAK 0xc4
55#define LTC2975_MFR_IIN_MIN 0xc5
56#define LTC2975_MFR_PIN_PEAK 0xc6
57#define LTC2975_MFR_PIN_MIN 0xc7
58
a2e15107
GR
59#define LTC2974_ID_REV1 0x0212
60#define LTC2974_ID_REV2 0x0213
649ca820 61#define LTC2975_ID 0x0223
c24c407e 62#define LTC2977_ID 0x0130
c3ff9a67
GR
63#define LTC2978_ID_REV1 0x0121
64#define LTC2978_ID_REV2 0x0122
3f08d7f4 65#define LTC2978A_ID 0x0124
ddfb41ca
GR
66#define LTC3880_ID 0x4000
67#define LTC3880_ID_MASK 0xff00
fd9175d2
GR
68#define LTC3883_ID 0x4300
69#define LTC3883_ID_MASK 0xff00
15398566
GR
70#define LTC3887_ID 0x4700
71#define LTC3887_ID_MASK 0xff00
e8047a26
GR
72#define LTM4676_ID 0x4400
73#define LTM4676_ID_2 0x4480
15398566 74#define LTM4676A_ID 0x47e0
f76992b0 75#define LTM4676_ID_MASK 0xfff0
c3ff9a67 76
fd9175d2 77#define LTC2974_NUM_PAGES 4
3d0d2839
GR
78#define LTC2978_NUM_PAGES 8
79#define LTC3880_NUM_PAGES 2
fd9175d2 80#define LTC3883_NUM_PAGES 1
3d0d2839 81
c3ff9a67
GR
82/*
83 * LTC2978 clears peak data whenever the CLEAR_FAULTS command is executed, which
84 * happens pretty much each time chip data is updated. Raw peak data therefore
85 * does not provide much value. To be able to provide useful peak data, keep an
86 * internal cache of measured peak data, which is only cleared if an explicit
87 * "clear peak" command is executed for the sensor in question.
88 */
3d0d2839 89
c3ff9a67
GR
90struct ltc2978_data {
91 enum chips id;
3d0d2839 92 u16 vin_min, vin_max;
fd9175d2 93 u16 temp_min[LTC2974_NUM_PAGES], temp_max[LTC2974_NUM_PAGES];
3d0d2839 94 u16 vout_min[LTC2978_NUM_PAGES], vout_max[LTC2978_NUM_PAGES];
fd9175d2 95 u16 iout_min[LTC2974_NUM_PAGES], iout_max[LTC2974_NUM_PAGES];
649ca820
GR
96 u16 iin_min, iin_max;
97 u16 pin_min, pin_max;
3d0d2839 98 u16 temp2_max;
c3ff9a67 99 struct pmbus_driver_info info;
8582bcc8 100 u32 features;
c3ff9a67 101};
c3ff9a67
GR
102#define to_ltc2978_data(x) container_of(x, struct ltc2978_data, info)
103
8582bcc8
GR
104#define FEAT_CLEAR_PEAKS BIT(0)
105
106#define has_clear_peaks(d) ((d)->features & FEAT_CLEAR_PEAKS)
107
c3ff9a67
GR
108static inline int lin11_to_val(int data)
109{
110 s16 e = ((s16)data) >> 11;
111 s32 m = (((s16)(data << 5)) >> 5);
112
113 /*
114 * mantissa is 10 bit + sign, exponent adds up to 15 bit.
115 * Add 6 bit to exponent for maximum accuracy (10 + 15 + 6 = 31).
116 */
117 e += 6;
118 return (e < 0 ? m >> -e : m << e);
119}
120
ee847a25
GR
121static int ltc_get_max(struct ltc2978_data *data, struct i2c_client *client,
122 int page, int reg, u16 *pmax)
123{
124 int ret;
125
126 ret = pmbus_read_word_data(client, page, reg);
127 if (ret >= 0) {
128 if (lin11_to_val(ret) > lin11_to_val(*pmax))
129 *pmax = ret;
130 ret = *pmax;
131 }
132 return ret;
133}
134
135static int ltc_get_min(struct ltc2978_data *data, struct i2c_client *client,
136 int page, int reg, u16 *pmin)
137{
138 int ret;
139
140 ret = pmbus_read_word_data(client, page, reg);
141 if (ret >= 0) {
142 if (lin11_to_val(ret) < lin11_to_val(*pmin))
143 *pmin = ret;
144 ret = *pmin;
145 }
146 return ret;
147}
148
ddfb41ca
GR
149static int ltc2978_read_word_data_common(struct i2c_client *client, int page,
150 int reg)
c3ff9a67
GR
151{
152 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
153 struct ltc2978_data *data = to_ltc2978_data(info);
154 int ret;
155
156 switch (reg) {
157 case PMBUS_VIRT_READ_VIN_MAX:
ee847a25
GR
158 ret = ltc_get_max(data, client, page, LTC2978_MFR_VIN_PEAK,
159 &data->vin_max);
c3ff9a67
GR
160 break;
161 case PMBUS_VIRT_READ_VOUT_MAX:
162 ret = pmbus_read_word_data(client, page, LTC2978_MFR_VOUT_PEAK);
163 if (ret >= 0) {
164 /*
165 * VOUT is 16 bit unsigned with fixed exponent,
166 * so we can compare it directly
167 */
168 if (ret > data->vout_max[page])
169 data->vout_max[page] = ret;
170 ret = data->vout_max[page];
171 }
172 break;
173 case PMBUS_VIRT_READ_TEMP_MAX:
ee847a25
GR
174 ret = ltc_get_max(data, client, page,
175 LTC2978_MFR_TEMPERATURE_PEAK,
176 &data->temp_max[page]);
c3ff9a67 177 break;
ddfb41ca
GR
178 case PMBUS_VIRT_RESET_VOUT_HISTORY:
179 case PMBUS_VIRT_RESET_VIN_HISTORY:
180 case PMBUS_VIRT_RESET_TEMP_HISTORY:
181 ret = 0;
182 break;
183 default:
184 ret = -ENODATA;
185 break;
186 }
187 return ret;
188}
189
190static int ltc2978_read_word_data(struct i2c_client *client, int page, int reg)
191{
192 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
193 struct ltc2978_data *data = to_ltc2978_data(info);
194 int ret;
195
196 switch (reg) {
c3ff9a67 197 case PMBUS_VIRT_READ_VIN_MIN:
ee847a25
GR
198 ret = ltc_get_min(data, client, page, LTC2978_MFR_VIN_MIN,
199 &data->vin_min);
c3ff9a67
GR
200 break;
201 case PMBUS_VIRT_READ_VOUT_MIN:
202 ret = pmbus_read_word_data(client, page, LTC2978_MFR_VOUT_MIN);
203 if (ret >= 0) {
204 /*
205 * VOUT_MIN is known to not be supported on some lots
206 * of LTC2978 revision 1, and will return the maximum
207 * possible voltage if read. If VOUT_MAX is valid and
208 * lower than the reading of VOUT_MIN, use it instead.
209 */
210 if (data->vout_max[page] && ret > data->vout_max[page])
211 ret = data->vout_max[page];
212 if (ret < data->vout_min[page])
213 data->vout_min[page] = ret;
214 ret = data->vout_min[page];
215 }
216 break;
217 case PMBUS_VIRT_READ_TEMP_MIN:
ee847a25
GR
218 ret = ltc_get_min(data, client, page,
219 LTC2978_MFR_TEMPERATURE_MIN,
220 &data->temp_min[page]);
c3ff9a67 221 break;
ddfb41ca
GR
222 case PMBUS_VIRT_READ_IOUT_MAX:
223 case PMBUS_VIRT_RESET_IOUT_HISTORY:
224 case PMBUS_VIRT_READ_TEMP2_MAX:
225 case PMBUS_VIRT_RESET_TEMP2_HISTORY:
226 ret = -ENXIO;
227 break;
228 default:
229 ret = ltc2978_read_word_data_common(client, page, reg);
230 break;
231 }
232 return ret;
233}
234
fd9175d2
GR
235static int ltc2974_read_word_data(struct i2c_client *client, int page, int reg)
236{
237 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
238 struct ltc2978_data *data = to_ltc2978_data(info);
239 int ret;
240
241 switch (reg) {
242 case PMBUS_VIRT_READ_IOUT_MAX:
ee847a25
GR
243 ret = ltc_get_max(data, client, page, LTC2974_MFR_IOUT_PEAK,
244 &data->iout_max[page]);
fd9175d2
GR
245 break;
246 case PMBUS_VIRT_READ_IOUT_MIN:
ee847a25
GR
247 ret = ltc_get_min(data, client, page, LTC2974_MFR_IOUT_MIN,
248 &data->iout_min[page]);
fd9175d2
GR
249 break;
250 case PMBUS_VIRT_RESET_IOUT_HISTORY:
251 ret = 0;
252 break;
253 default:
254 ret = ltc2978_read_word_data(client, page, reg);
255 break;
256 }
257 return ret;
258}
259
649ca820
GR
260static int ltc2975_read_word_data(struct i2c_client *client, int page, int reg)
261{
262 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
263 struct ltc2978_data *data = to_ltc2978_data(info);
264 int ret;
265
266 switch (reg) {
267 case PMBUS_VIRT_READ_IIN_MAX:
ee847a25
GR
268 ret = ltc_get_max(data, client, page, LTC2975_MFR_IIN_PEAK,
269 &data->iin_max);
649ca820
GR
270 break;
271 case PMBUS_VIRT_READ_IIN_MIN:
ee847a25
GR
272 ret = ltc_get_min(data, client, page, LTC2975_MFR_IIN_MIN,
273 &data->iin_min);
649ca820
GR
274 break;
275 case PMBUS_VIRT_READ_PIN_MAX:
ee847a25
GR
276 ret = ltc_get_max(data, client, page, LTC2975_MFR_PIN_PEAK,
277 &data->pin_max);
649ca820
GR
278 break;
279 case PMBUS_VIRT_READ_PIN_MIN:
ee847a25
GR
280 ret = ltc_get_min(data, client, page, LTC2975_MFR_PIN_MIN,
281 &data->pin_min);
649ca820
GR
282 break;
283 case PMBUS_VIRT_RESET_IIN_HISTORY:
284 case PMBUS_VIRT_RESET_PIN_HISTORY:
285 ret = 0;
286 break;
287 default:
288 ret = ltc2978_read_word_data(client, page, reg);
289 break;
290 }
291 return ret;
292}
293
ddfb41ca
GR
294static int ltc3880_read_word_data(struct i2c_client *client, int page, int reg)
295{
296 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
297 struct ltc2978_data *data = to_ltc2978_data(info);
298 int ret;
299
300 switch (reg) {
301 case PMBUS_VIRT_READ_IOUT_MAX:
ee847a25
GR
302 ret = ltc_get_max(data, client, page, LTC3880_MFR_IOUT_PEAK,
303 &data->iout_max[page]);
ddfb41ca
GR
304 break;
305 case PMBUS_VIRT_READ_TEMP2_MAX:
ee847a25
GR
306 ret = ltc_get_max(data, client, page,
307 LTC3880_MFR_TEMPERATURE2_PEAK,
308 &data->temp2_max);
ddfb41ca
GR
309 break;
310 case PMBUS_VIRT_READ_VIN_MIN:
311 case PMBUS_VIRT_READ_VOUT_MIN:
312 case PMBUS_VIRT_READ_TEMP_MIN:
313 ret = -ENXIO;
314 break;
315 case PMBUS_VIRT_RESET_IOUT_HISTORY:
316 case PMBUS_VIRT_RESET_TEMP2_HISTORY:
c3ff9a67
GR
317 ret = 0;
318 break;
319 default:
ddfb41ca 320 ret = ltc2978_read_word_data_common(client, page, reg);
c3ff9a67
GR
321 break;
322 }
323 return ret;
324}
325
fd9175d2
GR
326static int ltc3883_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_IIN_MAX:
ee847a25
GR
334 ret = ltc_get_max(data, client, page, LTC3883_MFR_IIN_PEAK,
335 &data->iin_max);
fd9175d2
GR
336 break;
337 case PMBUS_VIRT_RESET_IIN_HISTORY:
338 ret = 0;
339 break;
340 default:
341 ret = ltc3880_read_word_data(client, page, reg);
342 break;
343 }
344 return ret;
345}
346
8582bcc8
GR
347static int ltc2978_clear_peaks(struct ltc2978_data *data,
348 struct i2c_client *client, int page)
ddfb41ca
GR
349{
350 int ret;
351
8582bcc8 352 if (has_clear_peaks(data))
ddfb41ca 353 ret = pmbus_write_byte(client, 0, LTC3880_MFR_CLEAR_PEAKS);
fd9175d2
GR
354 else
355 ret = pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS);
ddfb41ca
GR
356
357 return ret;
358}
359
c3ff9a67
GR
360static int ltc2978_write_word_data(struct i2c_client *client, int page,
361 int reg, u16 word)
362{
363 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
364 struct ltc2978_data *data = to_ltc2978_data(info);
365 int ret;
366
367 switch (reg) {
fd9175d2
GR
368 case PMBUS_VIRT_RESET_IIN_HISTORY:
369 data->iin_max = 0x7c00;
649ca820 370 data->iin_min = 0x7bff;
8582bcc8 371 ret = ltc2978_clear_peaks(data, client, 0);
649ca820
GR
372 break;
373 case PMBUS_VIRT_RESET_PIN_HISTORY:
374 data->pin_max = 0x7c00;
375 data->pin_min = 0x7bff;
8582bcc8 376 ret = ltc2978_clear_peaks(data, client, 0);
fd9175d2 377 break;
ddfb41ca 378 case PMBUS_VIRT_RESET_IOUT_HISTORY:
dbd712c2 379 data->iout_max[page] = 0x7c00;
fd9175d2 380 data->iout_min[page] = 0xfbff;
8582bcc8 381 ret = ltc2978_clear_peaks(data, client, page);
ddfb41ca
GR
382 break;
383 case PMBUS_VIRT_RESET_TEMP2_HISTORY:
dbd712c2 384 data->temp2_max = 0x7c00;
8582bcc8 385 ret = ltc2978_clear_peaks(data, client, page);
ddfb41ca 386 break;
c3ff9a67
GR
387 case PMBUS_VIRT_RESET_VOUT_HISTORY:
388 data->vout_min[page] = 0xffff;
389 data->vout_max[page] = 0;
8582bcc8 390 ret = ltc2978_clear_peaks(data, client, page);
c3ff9a67
GR
391 break;
392 case PMBUS_VIRT_RESET_VIN_HISTORY:
393 data->vin_min = 0x7bff;
dbd712c2 394 data->vin_max = 0x7c00;
8582bcc8 395 ret = ltc2978_clear_peaks(data, client, page);
c3ff9a67
GR
396 break;
397 case PMBUS_VIRT_RESET_TEMP_HISTORY:
fd9175d2 398 data->temp_min[page] = 0x7bff;
8c958c70 399 data->temp_max[page] = 0x7c00;
8582bcc8 400 ret = ltc2978_clear_peaks(data, client, page);
c3ff9a67
GR
401 break;
402 default:
403 ret = -ENODATA;
404 break;
405 }
406 return ret;
407}
408
409static const struct i2c_device_id ltc2978_id[] = {
fd9175d2 410 {"ltc2974", ltc2974},
649ca820 411 {"ltc2975", ltc2975},
c24c407e 412 {"ltc2977", ltc2977},
c3ff9a67 413 {"ltc2978", ltc2978},
ddfb41ca 414 {"ltc3880", ltc3880},
bf89386f 415 {"ltc3882", ltc3882},
fd9175d2 416 {"ltc3883", ltc3883},
15398566 417 {"ltc3887", ltc3887},
f76992b0 418 {"ltm4676", ltm4676},
c3ff9a67
GR
419 {}
420};
421MODULE_DEVICE_TABLE(i2c, ltc2978_id);
422
77aa3585
AT
423#if IS_ENABLED(CONFIG_SENSORS_LTC2978_REGULATOR)
424static const struct regulator_desc ltc2978_reg_desc[] = {
425 PMBUS_REGULATOR("vout", 0),
426 PMBUS_REGULATOR("vout", 1),
427 PMBUS_REGULATOR("vout", 2),
428 PMBUS_REGULATOR("vout", 3),
429 PMBUS_REGULATOR("vout", 4),
430 PMBUS_REGULATOR("vout", 5),
431 PMBUS_REGULATOR("vout", 6),
432 PMBUS_REGULATOR("vout", 7),
433};
434#endif /* CONFIG_SENSORS_LTC2978_REGULATOR */
435
836954da
GR
436static int ltc2978_get_id(struct i2c_client *client)
437{
438 int chip_id;
439
440 chip_id = i2c_smbus_read_word_data(client, LTC2978_MFR_SPECIAL_ID);
bf89386f
GR
441 if (chip_id < 0) {
442 const struct i2c_device_id *id;
443 u8 buf[I2C_SMBUS_BLOCK_MAX];
444 int ret;
445
446 if (!i2c_check_functionality(client->adapter,
447 I2C_FUNC_SMBUS_READ_BLOCK_DATA))
448 return -ENODEV;
449
450 ret = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, buf);
451 if (ret < 0)
452 return ret;
453 if (ret < 3 || strncmp(buf, "LTC", 3))
454 return -ENODEV;
455
456 ret = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, buf);
457 if (ret < 0)
458 return ret;
459 for (id = &ltc2978_id[0]; strlen(id->name); id++) {
460 if (!strncasecmp(id->name, buf, strlen(id->name)))
461 return (int)id->driver_data;
462 }
463 return -ENODEV;
464 }
836954da
GR
465
466 if (chip_id == LTC2974_ID_REV1 || chip_id == LTC2974_ID_REV2)
467 return ltc2974;
649ca820
GR
468 else if (chip_id == LTC2975_ID)
469 return ltc2975;
836954da
GR
470 else if (chip_id == LTC2977_ID)
471 return ltc2977;
472 else if (chip_id == LTC2978_ID_REV1 || chip_id == LTC2978_ID_REV2 ||
473 chip_id == LTC2978A_ID)
474 return ltc2978;
475 else if ((chip_id & LTC3880_ID_MASK) == LTC3880_ID)
476 return ltc3880;
477 else if ((chip_id & LTC3883_ID_MASK) == LTC3883_ID)
478 return ltc3883;
15398566
GR
479 else if ((chip_id & LTC3887_ID_MASK) == LTC3887_ID)
480 return ltc3887;
e8047a26
GR
481 else if ((chip_id & LTM4676_ID_MASK) == LTM4676_ID ||
482 (chip_id & LTM4676_ID_MASK) == LTM4676_ID_2 ||
483 (chip_id & LTM4676_ID_MASK) == LTM4676A_ID)
836954da
GR
484 return ltm4676;
485
486 dev_err(&client->dev, "Unsupported chip ID 0x%x\n", chip_id);
487 return -ENODEV;
488}
489
c3ff9a67
GR
490static int ltc2978_probe(struct i2c_client *client,
491 const struct i2c_device_id *id)
492{
836954da 493 int i, chip_id;
c3ff9a67
GR
494 struct ltc2978_data *data;
495 struct pmbus_driver_info *info;
496
497 if (!i2c_check_functionality(client->adapter,
498 I2C_FUNC_SMBUS_READ_WORD_DATA))
499 return -ENODEV;
500
8b313ca7
GR
501 data = devm_kzalloc(&client->dev, sizeof(struct ltc2978_data),
502 GFP_KERNEL);
c3ff9a67
GR
503 if (!data)
504 return -ENOMEM;
505
836954da 506 chip_id = ltc2978_get_id(client);
8b313ca7
GR
507 if (chip_id < 0)
508 return chip_id;
c3ff9a67 509
836954da 510 data->id = chip_id;
c3ff9a67
GR
511 if (data->id != id->driver_data)
512 dev_warn(&client->dev,
513 "Device mismatch: Configured %s, detected %s\n",
514 id->name,
515 ltc2978_id[data->id].name);
516
517 info = &data->info;
c3ff9a67
GR
518 info->write_word_data = ltc2978_write_word_data;
519
c3ff9a67 520 data->vin_min = 0x7bff;
dbd712c2 521 data->vin_max = 0x7c00;
3d0d2839
GR
522 for (i = 0; i < ARRAY_SIZE(data->vout_min); i++)
523 data->vout_min[i] = 0xffff;
fd9175d2
GR
524 for (i = 0; i < ARRAY_SIZE(data->iout_min); i++)
525 data->iout_min[i] = 0xfbff;
526 for (i = 0; i < ARRAY_SIZE(data->iout_max); i++)
527 data->iout_max[i] = 0x7c00;
528 for (i = 0; i < ARRAY_SIZE(data->temp_min); i++)
529 data->temp_min[i] = 0x7bff;
8c958c70
GR
530 for (i = 0; i < ARRAY_SIZE(data->temp_max); i++)
531 data->temp_max[i] = 0x7c00;
dbd712c2 532 data->temp2_max = 0x7c00;
c3ff9a67 533
f366fccd 534 switch (data->id) {
fd9175d2
GR
535 case ltc2974:
536 info->read_word_data = ltc2974_read_word_data;
537 info->pages = LTC2974_NUM_PAGES;
538 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
539 | PMBUS_HAVE_TEMP2;
540 for (i = 0; i < info->pages; i++) {
541 info->func[i] |= PMBUS_HAVE_VOUT
542 | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_POUT
543 | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
544 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
545 }
546 break;
649ca820
GR
547 case ltc2975:
548 info->read_word_data = ltc2975_read_word_data;
549 info->pages = LTC2974_NUM_PAGES;
550 info->func[0] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN
551 | PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
552 | PMBUS_HAVE_TEMP2;
553 for (i = 0; i < info->pages; i++) {
554 info->func[i] |= PMBUS_HAVE_VOUT
555 | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_POUT
556 | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
557 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
558 }
559 break;
c24c407e 560 case ltc2977:
c3ff9a67 561 case ltc2978:
ddfb41ca 562 info->read_word_data = ltc2978_read_word_data;
3d0d2839 563 info->pages = LTC2978_NUM_PAGES;
c3ff9a67
GR
564 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
565 | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
566 | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
3d0d2839 567 for (i = 1; i < LTC2978_NUM_PAGES; i++) {
c3ff9a67
GR
568 info->func[i] = PMBUS_HAVE_VOUT
569 | PMBUS_HAVE_STATUS_VOUT;
c3ff9a67
GR
570 }
571 break;
ddfb41ca 572 case ltc3880:
15398566 573 case ltc3887:
f76992b0 574 case ltm4676:
8582bcc8 575 data->features |= FEAT_CLEAR_PEAKS;
ddfb41ca 576 info->read_word_data = ltc3880_read_word_data;
3d0d2839 577 info->pages = LTC3880_NUM_PAGES;
ddfb41ca
GR
578 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
579 | PMBUS_HAVE_STATUS_INPUT
580 | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
581 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
582 | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
583 | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
584 info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
585 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
586 | PMBUS_HAVE_POUT
587 | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
fd9175d2 588 break;
bf89386f 589 case ltc3882:
8582bcc8 590 data->features |= FEAT_CLEAR_PEAKS;
bf89386f
GR
591 info->read_word_data = ltc3880_read_word_data;
592 info->pages = LTC3880_NUM_PAGES;
593 info->func[0] = PMBUS_HAVE_VIN
594 | PMBUS_HAVE_STATUS_INPUT
595 | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
596 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
597 | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
598 | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
599 info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
600 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
601 | PMBUS_HAVE_POUT
602 | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
603 break;
fd9175d2 604 case ltc3883:
8582bcc8 605 data->features |= FEAT_CLEAR_PEAKS;
fd9175d2
GR
606 info->read_word_data = ltc3883_read_word_data;
607 info->pages = LTC3883_NUM_PAGES;
608 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
609 | PMBUS_HAVE_STATUS_INPUT
610 | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
611 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
612 | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
613 | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
ddfb41ca 614 break;
c3ff9a67 615 default:
8b313ca7 616 return -ENODEV;
c3ff9a67 617 }
77aa3585
AT
618
619#if IS_ENABLED(CONFIG_SENSORS_LTC2978_REGULATOR)
620 info->num_regulators = info->pages;
621 info->reg_desc = ltc2978_reg_desc;
622 if (info->num_regulators > ARRAY_SIZE(ltc2978_reg_desc)) {
623 dev_err(&client->dev, "num_regulators too large!");
624 info->num_regulators = ARRAY_SIZE(ltc2978_reg_desc);
625 }
626#endif
627
8b313ca7 628 return pmbus_do_probe(client, id, info);
c3ff9a67
GR
629}
630
77aa3585
AT
631#ifdef CONFIG_OF
632static const struct of_device_id ltc2978_of_match[] = {
633 { .compatible = "lltc,ltc2974" },
649ca820 634 { .compatible = "lltc,ltc2975" },
77aa3585
AT
635 { .compatible = "lltc,ltc2977" },
636 { .compatible = "lltc,ltc2978" },
637 { .compatible = "lltc,ltc3880" },
bf89386f 638 { .compatible = "lltc,ltc3882" },
77aa3585 639 { .compatible = "lltc,ltc3883" },
15398566 640 { .compatible = "lltc,ltc3887" },
77aa3585
AT
641 { .compatible = "lltc,ltm4676" },
642 { }
643};
644MODULE_DEVICE_TABLE(of, ltc2978_of_match);
645#endif
646
c3ff9a67
GR
647static struct i2c_driver ltc2978_driver = {
648 .driver = {
649 .name = "ltc2978",
77aa3585 650 .of_match_table = of_match_ptr(ltc2978_of_match),
c3ff9a67
GR
651 },
652 .probe = ltc2978_probe,
dd285ad7 653 .remove = pmbus_do_remove,
c3ff9a67
GR
654 .id_table = ltc2978_id,
655};
656
f0967eea 657module_i2c_driver(ltc2978_driver);
c3ff9a67
GR
658
659MODULE_AUTHOR("Guenter Roeck");
649ca820 660MODULE_DESCRIPTION("PMBus driver for LTC2978 and comppatible chips");
c3ff9a67 661MODULE_LICENSE("GPL");