2 * Hardware monitoring driver for LTC2974, LTC2977, LTC2978, LTC3880,
5 * Copyright (c) 2011 Ericsson AB.
6 * Copyright (c) 2013 Guenter Roeck
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include <linux/kernel.h>
24 #include <linux/module.h>
25 #include <linux/init.h>
26 #include <linux/err.h>
27 #include <linux/slab.h>
28 #include <linux/i2c.h>
31 enum chips
{ ltc2974
, ltc2977
, ltc2978
, ltc3880
, ltc3883
};
33 /* Common for all chips */
34 #define LTC2978_MFR_VOUT_PEAK 0xdd
35 #define LTC2978_MFR_VIN_PEAK 0xde
36 #define LTC2978_MFR_TEMPERATURE_PEAK 0xdf
37 #define LTC2978_MFR_SPECIAL_ID 0xe7
39 /* LTC2974, LCT2977, and LTC2978 */
40 #define LTC2978_MFR_VOUT_MIN 0xfb
41 #define LTC2978_MFR_VIN_MIN 0xfc
42 #define LTC2978_MFR_TEMPERATURE_MIN 0xfd
45 #define LTC2974_MFR_IOUT_PEAK 0xd7
46 #define LTC2974_MFR_IOUT_MIN 0xd8
48 /* LTC3880 and LTC3883 */
49 #define LTC3880_MFR_IOUT_PEAK 0xd7
50 #define LTC3880_MFR_CLEAR_PEAKS 0xe3
51 #define LTC3880_MFR_TEMPERATURE2_PEAK 0xf4
54 #define LTC3883_MFR_IIN_PEAK 0xe1
56 #define LTC2974_ID 0x0212
57 #define LTC2977_ID 0x0130
58 #define LTC2978_ID_REV1 0x0121
59 #define LTC2978_ID_REV2 0x0122
60 #define LTC2978A_ID 0x0124
61 #define LTC3880_ID 0x4000
62 #define LTC3880_ID_MASK 0xff00
63 #define LTC3883_ID 0x4300
64 #define LTC3883_ID_MASK 0xff00
66 #define LTC2974_NUM_PAGES 4
67 #define LTC2978_NUM_PAGES 8
68 #define LTC3880_NUM_PAGES 2
69 #define LTC3883_NUM_PAGES 1
72 * LTC2978 clears peak data whenever the CLEAR_FAULTS command is executed, which
73 * happens pretty much each time chip data is updated. Raw peak data therefore
74 * does not provide much value. To be able to provide useful peak data, keep an
75 * internal cache of measured peak data, which is only cleared if an explicit
76 * "clear peak" command is executed for the sensor in question.
82 u16 temp_min
[LTC2974_NUM_PAGES
], temp_max
[LTC2974_NUM_PAGES
];
83 u16 vout_min
[LTC2978_NUM_PAGES
], vout_max
[LTC2978_NUM_PAGES
];
84 u16 iout_min
[LTC2974_NUM_PAGES
], iout_max
[LTC2974_NUM_PAGES
];
87 struct pmbus_driver_info info
;
90 #define to_ltc2978_data(x) container_of(x, struct ltc2978_data, info)
92 static inline int lin11_to_val(int data
)
94 s16 e
= ((s16
)data
) >> 11;
95 s32 m
= (((s16
)(data
<< 5)) >> 5);
98 * mantissa is 10 bit + sign, exponent adds up to 15 bit.
99 * Add 6 bit to exponent for maximum accuracy (10 + 15 + 6 = 31).
102 return (e
< 0 ? m
>> -e
: m
<< e
);
105 static int ltc2978_read_word_data_common(struct i2c_client
*client
, int page
,
108 const struct pmbus_driver_info
*info
= pmbus_get_driver_info(client
);
109 struct ltc2978_data
*data
= to_ltc2978_data(info
);
113 case PMBUS_VIRT_READ_VIN_MAX
:
114 ret
= pmbus_read_word_data(client
, page
, LTC2978_MFR_VIN_PEAK
);
116 if (lin11_to_val(ret
) > lin11_to_val(data
->vin_max
))
121 case PMBUS_VIRT_READ_VOUT_MAX
:
122 ret
= pmbus_read_word_data(client
, page
, LTC2978_MFR_VOUT_PEAK
);
125 * VOUT is 16 bit unsigned with fixed exponent,
126 * so we can compare it directly
128 if (ret
> data
->vout_max
[page
])
129 data
->vout_max
[page
] = ret
;
130 ret
= data
->vout_max
[page
];
133 case PMBUS_VIRT_READ_TEMP_MAX
:
134 ret
= pmbus_read_word_data(client
, page
,
135 LTC2978_MFR_TEMPERATURE_PEAK
);
137 if (lin11_to_val(ret
)
138 > lin11_to_val(data
->temp_max
[page
]))
139 data
->temp_max
[page
] = ret
;
140 ret
= data
->temp_max
[page
];
143 case PMBUS_VIRT_RESET_VOUT_HISTORY
:
144 case PMBUS_VIRT_RESET_VIN_HISTORY
:
145 case PMBUS_VIRT_RESET_TEMP_HISTORY
:
155 static int ltc2978_read_word_data(struct i2c_client
*client
, int page
, int reg
)
157 const struct pmbus_driver_info
*info
= pmbus_get_driver_info(client
);
158 struct ltc2978_data
*data
= to_ltc2978_data(info
);
162 case PMBUS_VIRT_READ_VIN_MIN
:
163 ret
= pmbus_read_word_data(client
, page
, LTC2978_MFR_VIN_MIN
);
165 if (lin11_to_val(ret
) < lin11_to_val(data
->vin_min
))
170 case PMBUS_VIRT_READ_VOUT_MIN
:
171 ret
= pmbus_read_word_data(client
, page
, LTC2978_MFR_VOUT_MIN
);
174 * VOUT_MIN is known to not be supported on some lots
175 * of LTC2978 revision 1, and will return the maximum
176 * possible voltage if read. If VOUT_MAX is valid and
177 * lower than the reading of VOUT_MIN, use it instead.
179 if (data
->vout_max
[page
] && ret
> data
->vout_max
[page
])
180 ret
= data
->vout_max
[page
];
181 if (ret
< data
->vout_min
[page
])
182 data
->vout_min
[page
] = ret
;
183 ret
= data
->vout_min
[page
];
186 case PMBUS_VIRT_READ_TEMP_MIN
:
187 ret
= pmbus_read_word_data(client
, page
,
188 LTC2978_MFR_TEMPERATURE_MIN
);
190 if (lin11_to_val(ret
)
191 < lin11_to_val(data
->temp_min
[page
]))
192 data
->temp_min
[page
] = ret
;
193 ret
= data
->temp_min
[page
];
196 case PMBUS_VIRT_READ_IOUT_MAX
:
197 case PMBUS_VIRT_RESET_IOUT_HISTORY
:
198 case PMBUS_VIRT_READ_TEMP2_MAX
:
199 case PMBUS_VIRT_RESET_TEMP2_HISTORY
:
203 ret
= ltc2978_read_word_data_common(client
, page
, reg
);
209 static int ltc2974_read_word_data(struct i2c_client
*client
, int page
, int reg
)
211 const struct pmbus_driver_info
*info
= pmbus_get_driver_info(client
);
212 struct ltc2978_data
*data
= to_ltc2978_data(info
);
216 case PMBUS_VIRT_READ_IOUT_MAX
:
217 ret
= pmbus_read_word_data(client
, page
, LTC2974_MFR_IOUT_PEAK
);
219 if (lin11_to_val(ret
)
220 > lin11_to_val(data
->iout_max
[page
]))
221 data
->iout_max
[page
] = ret
;
222 ret
= data
->iout_max
[page
];
225 case PMBUS_VIRT_READ_IOUT_MIN
:
226 ret
= pmbus_read_word_data(client
, page
, LTC2974_MFR_IOUT_MIN
);
228 if (lin11_to_val(ret
)
229 < lin11_to_val(data
->iout_min
[page
]))
230 data
->iout_min
[page
] = ret
;
231 ret
= data
->iout_min
[page
];
234 case PMBUS_VIRT_RESET_IOUT_HISTORY
:
238 ret
= ltc2978_read_word_data(client
, page
, reg
);
244 static int ltc3880_read_word_data(struct i2c_client
*client
, int page
, int reg
)
246 const struct pmbus_driver_info
*info
= pmbus_get_driver_info(client
);
247 struct ltc2978_data
*data
= to_ltc2978_data(info
);
251 case PMBUS_VIRT_READ_IOUT_MAX
:
252 ret
= pmbus_read_word_data(client
, page
, LTC3880_MFR_IOUT_PEAK
);
254 if (lin11_to_val(ret
)
255 > lin11_to_val(data
->iout_max
[page
]))
256 data
->iout_max
[page
] = ret
;
257 ret
= data
->iout_max
[page
];
260 case PMBUS_VIRT_READ_TEMP2_MAX
:
261 ret
= pmbus_read_word_data(client
, page
,
262 LTC3880_MFR_TEMPERATURE2_PEAK
);
264 if (lin11_to_val(ret
) > lin11_to_val(data
->temp2_max
))
265 data
->temp2_max
= ret
;
266 ret
= data
->temp2_max
;
269 case PMBUS_VIRT_READ_VIN_MIN
:
270 case PMBUS_VIRT_READ_VOUT_MIN
:
271 case PMBUS_VIRT_READ_TEMP_MIN
:
274 case PMBUS_VIRT_RESET_IOUT_HISTORY
:
275 case PMBUS_VIRT_RESET_TEMP2_HISTORY
:
279 ret
= ltc2978_read_word_data_common(client
, page
, reg
);
285 static int ltc3883_read_word_data(struct i2c_client
*client
, int page
, int reg
)
287 const struct pmbus_driver_info
*info
= pmbus_get_driver_info(client
);
288 struct ltc2978_data
*data
= to_ltc2978_data(info
);
292 case PMBUS_VIRT_READ_IIN_MAX
:
293 ret
= pmbus_read_word_data(client
, page
, LTC3883_MFR_IIN_PEAK
);
295 if (lin11_to_val(ret
)
296 > lin11_to_val(data
->iin_max
))
301 case PMBUS_VIRT_RESET_IIN_HISTORY
:
305 ret
= ltc3880_read_word_data(client
, page
, reg
);
311 static int ltc2978_clear_peaks(struct i2c_client
*client
, int page
,
316 if (id
== ltc3880
|| id
== ltc3883
)
317 ret
= pmbus_write_byte(client
, 0, LTC3880_MFR_CLEAR_PEAKS
);
319 ret
= pmbus_write_byte(client
, page
, PMBUS_CLEAR_FAULTS
);
324 static int ltc2978_write_word_data(struct i2c_client
*client
, int page
,
327 const struct pmbus_driver_info
*info
= pmbus_get_driver_info(client
);
328 struct ltc2978_data
*data
= to_ltc2978_data(info
);
332 case PMBUS_VIRT_RESET_IIN_HISTORY
:
333 data
->iin_max
= 0x7c00;
334 ret
= ltc2978_clear_peaks(client
, page
, data
->id
);
336 case PMBUS_VIRT_RESET_IOUT_HISTORY
:
337 data
->iout_max
[page
] = 0x7c00;
338 data
->iout_min
[page
] = 0xfbff;
339 ret
= ltc2978_clear_peaks(client
, page
, data
->id
);
341 case PMBUS_VIRT_RESET_TEMP2_HISTORY
:
342 data
->temp2_max
= 0x7c00;
343 ret
= ltc2978_clear_peaks(client
, page
, data
->id
);
345 case PMBUS_VIRT_RESET_VOUT_HISTORY
:
346 data
->vout_min
[page
] = 0xffff;
347 data
->vout_max
[page
] = 0;
348 ret
= ltc2978_clear_peaks(client
, page
, data
->id
);
350 case PMBUS_VIRT_RESET_VIN_HISTORY
:
351 data
->vin_min
= 0x7bff;
352 data
->vin_max
= 0x7c00;
353 ret
= ltc2978_clear_peaks(client
, page
, data
->id
);
355 case PMBUS_VIRT_RESET_TEMP_HISTORY
:
356 data
->temp_min
[page
] = 0x7bff;
357 data
->temp_max
[page
] = 0x7c00;
358 ret
= ltc2978_clear_peaks(client
, page
, data
->id
);
367 static const struct i2c_device_id ltc2978_id
[] = {
368 {"ltc2974", ltc2974
},
369 {"ltc2977", ltc2977
},
370 {"ltc2978", ltc2978
},
371 {"ltc3880", ltc3880
},
372 {"ltc3883", ltc3883
},
375 MODULE_DEVICE_TABLE(i2c
, ltc2978_id
);
377 static int ltc2978_probe(struct i2c_client
*client
,
378 const struct i2c_device_id
*id
)
381 struct ltc2978_data
*data
;
382 struct pmbus_driver_info
*info
;
384 if (!i2c_check_functionality(client
->adapter
,
385 I2C_FUNC_SMBUS_READ_WORD_DATA
))
388 data
= devm_kzalloc(&client
->dev
, sizeof(struct ltc2978_data
),
393 chip_id
= i2c_smbus_read_word_data(client
, LTC2978_MFR_SPECIAL_ID
);
397 if (chip_id
== LTC2974_ID
) {
399 } else if (chip_id
== LTC2977_ID
) {
401 } else if (chip_id
== LTC2978_ID_REV1
|| chip_id
== LTC2978_ID_REV2
||
402 chip_id
== LTC2978A_ID
) {
404 } else if ((chip_id
& LTC3880_ID_MASK
) == LTC3880_ID
) {
406 } else if ((chip_id
& LTC3883_ID_MASK
) == LTC3883_ID
) {
409 dev_err(&client
->dev
, "Unsupported chip ID 0x%x\n", chip_id
);
412 if (data
->id
!= id
->driver_data
)
413 dev_warn(&client
->dev
,
414 "Device mismatch: Configured %s, detected %s\n",
416 ltc2978_id
[data
->id
].name
);
419 info
->write_word_data
= ltc2978_write_word_data
;
421 data
->vin_min
= 0x7bff;
422 data
->vin_max
= 0x7c00;
423 for (i
= 0; i
< ARRAY_SIZE(data
->vout_min
); i
++)
424 data
->vout_min
[i
] = 0xffff;
425 for (i
= 0; i
< ARRAY_SIZE(data
->iout_min
); i
++)
426 data
->iout_min
[i
] = 0xfbff;
427 for (i
= 0; i
< ARRAY_SIZE(data
->iout_max
); i
++)
428 data
->iout_max
[i
] = 0x7c00;
429 for (i
= 0; i
< ARRAY_SIZE(data
->temp_min
); i
++)
430 data
->temp_min
[i
] = 0x7bff;
431 for (i
= 0; i
< ARRAY_SIZE(data
->temp_max
); i
++)
432 data
->temp_max
[i
] = 0x7c00;
433 data
->temp2_max
= 0x7c00;
437 info
->read_word_data
= ltc2974_read_word_data
;
438 info
->pages
= LTC2974_NUM_PAGES
;
439 info
->func
[0] = PMBUS_HAVE_VIN
| PMBUS_HAVE_STATUS_INPUT
441 for (i
= 0; i
< info
->pages
; i
++) {
442 info
->func
[i
] |= PMBUS_HAVE_VOUT
443 | PMBUS_HAVE_STATUS_VOUT
| PMBUS_HAVE_POUT
444 | PMBUS_HAVE_TEMP
| PMBUS_HAVE_STATUS_TEMP
445 | PMBUS_HAVE_IOUT
| PMBUS_HAVE_STATUS_IOUT
;
450 info
->read_word_data
= ltc2978_read_word_data
;
451 info
->pages
= LTC2978_NUM_PAGES
;
452 info
->func
[0] = PMBUS_HAVE_VIN
| PMBUS_HAVE_STATUS_INPUT
453 | PMBUS_HAVE_VOUT
| PMBUS_HAVE_STATUS_VOUT
454 | PMBUS_HAVE_TEMP
| PMBUS_HAVE_STATUS_TEMP
;
455 for (i
= 1; i
< LTC2978_NUM_PAGES
; i
++) {
456 info
->func
[i
] = PMBUS_HAVE_VOUT
457 | PMBUS_HAVE_STATUS_VOUT
;
461 info
->read_word_data
= ltc3880_read_word_data
;
462 info
->pages
= LTC3880_NUM_PAGES
;
463 info
->func
[0] = PMBUS_HAVE_VIN
| PMBUS_HAVE_IIN
464 | PMBUS_HAVE_STATUS_INPUT
465 | PMBUS_HAVE_VOUT
| PMBUS_HAVE_STATUS_VOUT
466 | PMBUS_HAVE_IOUT
| PMBUS_HAVE_STATUS_IOUT
467 | PMBUS_HAVE_POUT
| PMBUS_HAVE_TEMP
468 | PMBUS_HAVE_TEMP2
| PMBUS_HAVE_STATUS_TEMP
;
469 info
->func
[1] = PMBUS_HAVE_VOUT
| PMBUS_HAVE_STATUS_VOUT
470 | PMBUS_HAVE_IOUT
| PMBUS_HAVE_STATUS_IOUT
472 | PMBUS_HAVE_TEMP
| PMBUS_HAVE_STATUS_TEMP
;
475 info
->read_word_data
= ltc3883_read_word_data
;
476 info
->pages
= LTC3883_NUM_PAGES
;
477 info
->func
[0] = PMBUS_HAVE_VIN
| PMBUS_HAVE_IIN
478 | PMBUS_HAVE_STATUS_INPUT
479 | PMBUS_HAVE_VOUT
| PMBUS_HAVE_STATUS_VOUT
480 | PMBUS_HAVE_IOUT
| PMBUS_HAVE_STATUS_IOUT
481 | PMBUS_HAVE_PIN
| PMBUS_HAVE_POUT
| PMBUS_HAVE_TEMP
482 | PMBUS_HAVE_TEMP2
| PMBUS_HAVE_STATUS_TEMP
;
487 return pmbus_do_probe(client
, id
, info
);
490 /* This is the driver that will be inserted */
491 static struct i2c_driver ltc2978_driver
= {
495 .probe
= ltc2978_probe
,
496 .remove
= pmbus_do_remove
,
497 .id_table
= ltc2978_id
,
500 module_i2c_driver(ltc2978_driver
);
502 MODULE_AUTHOR("Guenter Roeck");
503 MODULE_DESCRIPTION("PMBus driver for LTC2974, LTC2978, LTC3880, and LTC3883");
504 MODULE_LICENSE("GPL");