xref: /openbmc/linux/drivers/hwmon/pmbus/ltc2978.c (revision 3932b9ca)
1 /*
2  * Hardware monitoring driver for LTC2974, LTC2977, LTC2978, LTC3880,
3  * LTC3883, and LTM4676
4  *
5  * Copyright (c) 2011 Ericsson AB.
6  * Copyright (c) 2013, 2014 Guenter Roeck
7  *
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.
12  *
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.
17  */
18 
19 #include <linux/kernel.h>
20 #include <linux/module.h>
21 #include <linux/init.h>
22 #include <linux/err.h>
23 #include <linux/slab.h>
24 #include <linux/i2c.h>
25 #include "pmbus.h"
26 
27 enum chips { ltc2974, ltc2977, ltc2978, ltc3880, ltc3883, ltm4676 };
28 
29 /* Common for all chips */
30 #define LTC2978_MFR_VOUT_PEAK		0xdd
31 #define LTC2978_MFR_VIN_PEAK		0xde
32 #define LTC2978_MFR_TEMPERATURE_PEAK	0xdf
33 #define LTC2978_MFR_SPECIAL_ID		0xe7
34 
35 /* LTC2974, LCT2977, and LTC2978 */
36 #define LTC2978_MFR_VOUT_MIN		0xfb
37 #define LTC2978_MFR_VIN_MIN		0xfc
38 #define LTC2978_MFR_TEMPERATURE_MIN	0xfd
39 
40 /* LTC2974 only */
41 #define LTC2974_MFR_IOUT_PEAK		0xd7
42 #define LTC2974_MFR_IOUT_MIN		0xd8
43 
44 /* LTC3880, LTC3883, and LTM4676 */
45 #define LTC3880_MFR_IOUT_PEAK		0xd7
46 #define LTC3880_MFR_CLEAR_PEAKS		0xe3
47 #define LTC3880_MFR_TEMPERATURE2_PEAK	0xf4
48 
49 /* LTC3883 only */
50 #define LTC3883_MFR_IIN_PEAK		0xe1
51 
52 #define LTC2974_ID_REV1			0x0212
53 #define LTC2974_ID_REV2			0x0213
54 #define LTC2977_ID			0x0130
55 #define LTC2978_ID_REV1			0x0121
56 #define LTC2978_ID_REV2			0x0122
57 #define LTC2978A_ID			0x0124
58 #define LTC3880_ID			0x4000
59 #define LTC3880_ID_MASK			0xff00
60 #define LTC3883_ID			0x4300
61 #define LTC3883_ID_MASK			0xff00
62 #define LTM4676_ID			0x4480	/* datasheet claims 0x440X */
63 #define LTM4676_ID_MASK			0xfff0
64 
65 #define LTC2974_NUM_PAGES		4
66 #define LTC2978_NUM_PAGES		8
67 #define LTC3880_NUM_PAGES		2
68 #define LTC3883_NUM_PAGES		1
69 
70 /*
71  * LTC2978 clears peak data whenever the CLEAR_FAULTS command is executed, which
72  * happens pretty much each time chip data is updated. Raw peak data therefore
73  * does not provide much value. To be able to provide useful peak data, keep an
74  * internal cache of measured peak data, which is only cleared if an explicit
75  * "clear peak" command is executed for the sensor in question.
76  */
77 
78 struct ltc2978_data {
79 	enum chips id;
80 	u16 vin_min, vin_max;
81 	u16 temp_min[LTC2974_NUM_PAGES], temp_max[LTC2974_NUM_PAGES];
82 	u16 vout_min[LTC2978_NUM_PAGES], vout_max[LTC2978_NUM_PAGES];
83 	u16 iout_min[LTC2974_NUM_PAGES], iout_max[LTC2974_NUM_PAGES];
84 	u16 iin_max;
85 	u16 temp2_max;
86 	struct pmbus_driver_info info;
87 };
88 
89 #define to_ltc2978_data(x)  container_of(x, struct ltc2978_data, info)
90 
91 static inline int lin11_to_val(int data)
92 {
93 	s16 e = ((s16)data) >> 11;
94 	s32 m = (((s16)(data << 5)) >> 5);
95 
96 	/*
97 	 * mantissa is 10 bit + sign, exponent adds up to 15 bit.
98 	 * Add 6 bit to exponent for maximum accuracy (10 + 15 + 6 = 31).
99 	 */
100 	e += 6;
101 	return (e < 0 ? m >> -e : m << e);
102 }
103 
104 static int ltc2978_read_word_data_common(struct i2c_client *client, int page,
105 					 int reg)
106 {
107 	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
108 	struct ltc2978_data *data = to_ltc2978_data(info);
109 	int ret;
110 
111 	switch (reg) {
112 	case PMBUS_VIRT_READ_VIN_MAX:
113 		ret = pmbus_read_word_data(client, page, LTC2978_MFR_VIN_PEAK);
114 		if (ret >= 0) {
115 			if (lin11_to_val(ret) > lin11_to_val(data->vin_max))
116 				data->vin_max = ret;
117 			ret = data->vin_max;
118 		}
119 		break;
120 	case PMBUS_VIRT_READ_VOUT_MAX:
121 		ret = pmbus_read_word_data(client, page, LTC2978_MFR_VOUT_PEAK);
122 		if (ret >= 0) {
123 			/*
124 			 * VOUT is 16 bit unsigned with fixed exponent,
125 			 * so we can compare it directly
126 			 */
127 			if (ret > data->vout_max[page])
128 				data->vout_max[page] = ret;
129 			ret = data->vout_max[page];
130 		}
131 		break;
132 	case PMBUS_VIRT_READ_TEMP_MAX:
133 		ret = pmbus_read_word_data(client, page,
134 					   LTC2978_MFR_TEMPERATURE_PEAK);
135 		if (ret >= 0) {
136 			if (lin11_to_val(ret)
137 			    > lin11_to_val(data->temp_max[page]))
138 				data->temp_max[page] = ret;
139 			ret = data->temp_max[page];
140 		}
141 		break;
142 	case PMBUS_VIRT_RESET_VOUT_HISTORY:
143 	case PMBUS_VIRT_RESET_VIN_HISTORY:
144 	case PMBUS_VIRT_RESET_TEMP_HISTORY:
145 		ret = 0;
146 		break;
147 	default:
148 		ret = -ENODATA;
149 		break;
150 	}
151 	return ret;
152 }
153 
154 static int ltc2978_read_word_data(struct i2c_client *client, int page, int reg)
155 {
156 	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
157 	struct ltc2978_data *data = to_ltc2978_data(info);
158 	int ret;
159 
160 	switch (reg) {
161 	case PMBUS_VIRT_READ_VIN_MIN:
162 		ret = pmbus_read_word_data(client, page, LTC2978_MFR_VIN_MIN);
163 		if (ret >= 0) {
164 			if (lin11_to_val(ret) < lin11_to_val(data->vin_min))
165 				data->vin_min = ret;
166 			ret = data->vin_min;
167 		}
168 		break;
169 	case PMBUS_VIRT_READ_VOUT_MIN:
170 		ret = pmbus_read_word_data(client, page, LTC2978_MFR_VOUT_MIN);
171 		if (ret >= 0) {
172 			/*
173 			 * VOUT_MIN is known to not be supported on some lots
174 			 * of LTC2978 revision 1, and will return the maximum
175 			 * possible voltage if read. If VOUT_MAX is valid and
176 			 * lower than the reading of VOUT_MIN, use it instead.
177 			 */
178 			if (data->vout_max[page] && ret > data->vout_max[page])
179 				ret = data->vout_max[page];
180 			if (ret < data->vout_min[page])
181 				data->vout_min[page] = ret;
182 			ret = data->vout_min[page];
183 		}
184 		break;
185 	case PMBUS_VIRT_READ_TEMP_MIN:
186 		ret = pmbus_read_word_data(client, page,
187 					   LTC2978_MFR_TEMPERATURE_MIN);
188 		if (ret >= 0) {
189 			if (lin11_to_val(ret)
190 			    < lin11_to_val(data->temp_min[page]))
191 				data->temp_min[page] = ret;
192 			ret = data->temp_min[page];
193 		}
194 		break;
195 	case PMBUS_VIRT_READ_IOUT_MAX:
196 	case PMBUS_VIRT_RESET_IOUT_HISTORY:
197 	case PMBUS_VIRT_READ_TEMP2_MAX:
198 	case PMBUS_VIRT_RESET_TEMP2_HISTORY:
199 		ret = -ENXIO;
200 		break;
201 	default:
202 		ret = ltc2978_read_word_data_common(client, page, reg);
203 		break;
204 	}
205 	return ret;
206 }
207 
208 static int ltc2974_read_word_data(struct i2c_client *client, int page, int reg)
209 {
210 	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
211 	struct ltc2978_data *data = to_ltc2978_data(info);
212 	int ret;
213 
214 	switch (reg) {
215 	case PMBUS_VIRT_READ_IOUT_MAX:
216 		ret = pmbus_read_word_data(client, page, LTC2974_MFR_IOUT_PEAK);
217 		if (ret >= 0) {
218 			if (lin11_to_val(ret)
219 			    > lin11_to_val(data->iout_max[page]))
220 				data->iout_max[page] = ret;
221 			ret = data->iout_max[page];
222 		}
223 		break;
224 	case PMBUS_VIRT_READ_IOUT_MIN:
225 		ret = pmbus_read_word_data(client, page, LTC2974_MFR_IOUT_MIN);
226 		if (ret >= 0) {
227 			if (lin11_to_val(ret)
228 			    < lin11_to_val(data->iout_min[page]))
229 				data->iout_min[page] = ret;
230 			ret = data->iout_min[page];
231 		}
232 		break;
233 	case PMBUS_VIRT_RESET_IOUT_HISTORY:
234 		ret = 0;
235 		break;
236 	default:
237 		ret = ltc2978_read_word_data(client, page, reg);
238 		break;
239 	}
240 	return ret;
241 }
242 
243 static int ltc3880_read_word_data(struct i2c_client *client, int page, int reg)
244 {
245 	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
246 	struct ltc2978_data *data = to_ltc2978_data(info);
247 	int ret;
248 
249 	switch (reg) {
250 	case PMBUS_VIRT_READ_IOUT_MAX:
251 		ret = pmbus_read_word_data(client, page, LTC3880_MFR_IOUT_PEAK);
252 		if (ret >= 0) {
253 			if (lin11_to_val(ret)
254 			    > lin11_to_val(data->iout_max[page]))
255 				data->iout_max[page] = ret;
256 			ret = data->iout_max[page];
257 		}
258 		break;
259 	case PMBUS_VIRT_READ_TEMP2_MAX:
260 		ret = pmbus_read_word_data(client, page,
261 					   LTC3880_MFR_TEMPERATURE2_PEAK);
262 		if (ret >= 0) {
263 			if (lin11_to_val(ret) > lin11_to_val(data->temp2_max))
264 				data->temp2_max = ret;
265 			ret = data->temp2_max;
266 		}
267 		break;
268 	case PMBUS_VIRT_READ_VIN_MIN:
269 	case PMBUS_VIRT_READ_VOUT_MIN:
270 	case PMBUS_VIRT_READ_TEMP_MIN:
271 		ret = -ENXIO;
272 		break;
273 	case PMBUS_VIRT_RESET_IOUT_HISTORY:
274 	case PMBUS_VIRT_RESET_TEMP2_HISTORY:
275 		ret = 0;
276 		break;
277 	default:
278 		ret = ltc2978_read_word_data_common(client, page, reg);
279 		break;
280 	}
281 	return ret;
282 }
283 
284 static int ltc3883_read_word_data(struct i2c_client *client, int page, int reg)
285 {
286 	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
287 	struct ltc2978_data *data = to_ltc2978_data(info);
288 	int ret;
289 
290 	switch (reg) {
291 	case PMBUS_VIRT_READ_IIN_MAX:
292 		ret = pmbus_read_word_data(client, page, LTC3883_MFR_IIN_PEAK);
293 		if (ret >= 0) {
294 			if (lin11_to_val(ret)
295 			    > lin11_to_val(data->iin_max))
296 				data->iin_max = ret;
297 			ret = data->iin_max;
298 		}
299 		break;
300 	case PMBUS_VIRT_RESET_IIN_HISTORY:
301 		ret = 0;
302 		break;
303 	default:
304 		ret = ltc3880_read_word_data(client, page, reg);
305 		break;
306 	}
307 	return ret;
308 }
309 
310 static int ltc2978_clear_peaks(struct i2c_client *client, int page,
311 			       enum chips id)
312 {
313 	int ret;
314 
315 	if (id == ltc3880 || id == ltc3883)
316 		ret = pmbus_write_byte(client, 0, LTC3880_MFR_CLEAR_PEAKS);
317 	else
318 		ret = pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS);
319 
320 	return ret;
321 }
322 
323 static int ltc2978_write_word_data(struct i2c_client *client, int page,
324 				    int reg, u16 word)
325 {
326 	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
327 	struct ltc2978_data *data = to_ltc2978_data(info);
328 	int ret;
329 
330 	switch (reg) {
331 	case PMBUS_VIRT_RESET_IIN_HISTORY:
332 		data->iin_max = 0x7c00;
333 		ret = ltc2978_clear_peaks(client, page, data->id);
334 		break;
335 	case PMBUS_VIRT_RESET_IOUT_HISTORY:
336 		data->iout_max[page] = 0x7c00;
337 		data->iout_min[page] = 0xfbff;
338 		ret = ltc2978_clear_peaks(client, page, data->id);
339 		break;
340 	case PMBUS_VIRT_RESET_TEMP2_HISTORY:
341 		data->temp2_max = 0x7c00;
342 		ret = ltc2978_clear_peaks(client, page, data->id);
343 		break;
344 	case PMBUS_VIRT_RESET_VOUT_HISTORY:
345 		data->vout_min[page] = 0xffff;
346 		data->vout_max[page] = 0;
347 		ret = ltc2978_clear_peaks(client, page, data->id);
348 		break;
349 	case PMBUS_VIRT_RESET_VIN_HISTORY:
350 		data->vin_min = 0x7bff;
351 		data->vin_max = 0x7c00;
352 		ret = ltc2978_clear_peaks(client, page, data->id);
353 		break;
354 	case PMBUS_VIRT_RESET_TEMP_HISTORY:
355 		data->temp_min[page] = 0x7bff;
356 		data->temp_max[page] = 0x7c00;
357 		ret = ltc2978_clear_peaks(client, page, data->id);
358 		break;
359 	default:
360 		ret = -ENODATA;
361 		break;
362 	}
363 	return ret;
364 }
365 
366 static const struct i2c_device_id ltc2978_id[] = {
367 	{"ltc2974", ltc2974},
368 	{"ltc2977", ltc2977},
369 	{"ltc2978", ltc2978},
370 	{"ltc3880", ltc3880},
371 	{"ltc3883", ltc3883},
372 	{"ltm4676", ltm4676},
373 	{}
374 };
375 MODULE_DEVICE_TABLE(i2c, ltc2978_id);
376 
377 static int ltc2978_probe(struct i2c_client *client,
378 			 const struct i2c_device_id *id)
379 {
380 	int chip_id, i;
381 	struct ltc2978_data *data;
382 	struct pmbus_driver_info *info;
383 
384 	if (!i2c_check_functionality(client->adapter,
385 				     I2C_FUNC_SMBUS_READ_WORD_DATA))
386 		return -ENODEV;
387 
388 	data = devm_kzalloc(&client->dev, sizeof(struct ltc2978_data),
389 			    GFP_KERNEL);
390 	if (!data)
391 		return -ENOMEM;
392 
393 	chip_id = i2c_smbus_read_word_data(client, LTC2978_MFR_SPECIAL_ID);
394 	if (chip_id < 0)
395 		return chip_id;
396 
397 	if (chip_id == LTC2974_ID_REV1 || chip_id == LTC2974_ID_REV2) {
398 		data->id = ltc2974;
399 	} else if (chip_id == LTC2977_ID) {
400 		data->id = ltc2977;
401 	} else if (chip_id == LTC2978_ID_REV1 || chip_id == LTC2978_ID_REV2 ||
402 		   chip_id == LTC2978A_ID) {
403 		data->id = ltc2978;
404 	} else if ((chip_id & LTC3880_ID_MASK) == LTC3880_ID) {
405 		data->id = ltc3880;
406 	} else if ((chip_id & LTC3883_ID_MASK) == LTC3883_ID) {
407 		data->id = ltc3883;
408 	} else if ((chip_id & LTM4676_ID_MASK) == LTM4676_ID) {
409 		data->id = ltm4676;
410 	} else {
411 		dev_err(&client->dev, "Unsupported chip ID 0x%x\n", chip_id);
412 		return -ENODEV;
413 	}
414 	if (data->id != id->driver_data)
415 		dev_warn(&client->dev,
416 			 "Device mismatch: Configured %s, detected %s\n",
417 			 id->name,
418 			 ltc2978_id[data->id].name);
419 
420 	info = &data->info;
421 	info->write_word_data = ltc2978_write_word_data;
422 
423 	data->vin_min = 0x7bff;
424 	data->vin_max = 0x7c00;
425 	for (i = 0; i < ARRAY_SIZE(data->vout_min); i++)
426 		data->vout_min[i] = 0xffff;
427 	for (i = 0; i < ARRAY_SIZE(data->iout_min); i++)
428 		data->iout_min[i] = 0xfbff;
429 	for (i = 0; i < ARRAY_SIZE(data->iout_max); i++)
430 		data->iout_max[i] = 0x7c00;
431 	for (i = 0; i < ARRAY_SIZE(data->temp_min); i++)
432 		data->temp_min[i] = 0x7bff;
433 	for (i = 0; i < ARRAY_SIZE(data->temp_max); i++)
434 		data->temp_max[i] = 0x7c00;
435 	data->temp2_max = 0x7c00;
436 
437 	switch (data->id) {
438 	case ltc2974:
439 		info->read_word_data = ltc2974_read_word_data;
440 		info->pages = LTC2974_NUM_PAGES;
441 		info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
442 		  | PMBUS_HAVE_TEMP2;
443 		for (i = 0; i < info->pages; i++) {
444 			info->func[i] |= PMBUS_HAVE_VOUT
445 			  | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_POUT
446 			  | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
447 			  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
448 		}
449 		break;
450 	case ltc2977:
451 	case ltc2978:
452 		info->read_word_data = ltc2978_read_word_data;
453 		info->pages = LTC2978_NUM_PAGES;
454 		info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
455 		  | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
456 		  | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
457 		for (i = 1; i < LTC2978_NUM_PAGES; i++) {
458 			info->func[i] = PMBUS_HAVE_VOUT
459 			  | PMBUS_HAVE_STATUS_VOUT;
460 		}
461 		break;
462 	case ltc3880:
463 	case ltm4676:
464 		info->read_word_data = ltc3880_read_word_data;
465 		info->pages = LTC3880_NUM_PAGES;
466 		info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
467 		  | PMBUS_HAVE_STATUS_INPUT
468 		  | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
469 		  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
470 		  | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
471 		  | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
472 		info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
473 		  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
474 		  | PMBUS_HAVE_POUT
475 		  | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
476 		break;
477 	case ltc3883:
478 		info->read_word_data = ltc3883_read_word_data;
479 		info->pages = LTC3883_NUM_PAGES;
480 		info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
481 		  | PMBUS_HAVE_STATUS_INPUT
482 		  | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
483 		  | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
484 		  | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
485 		  | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
486 		break;
487 	default:
488 		return -ENODEV;
489 	}
490 	return pmbus_do_probe(client, id, info);
491 }
492 
493 /* This is the driver that will be inserted */
494 static struct i2c_driver ltc2978_driver = {
495 	.driver = {
496 		   .name = "ltc2978",
497 		   },
498 	.probe = ltc2978_probe,
499 	.remove = pmbus_do_remove,
500 	.id_table = ltc2978_id,
501 };
502 
503 module_i2c_driver(ltc2978_driver);
504 
505 MODULE_AUTHOR("Guenter Roeck");
506 MODULE_DESCRIPTION("PMBus driver for LTC2974, LTC2978, LTC3880, LTC3883, and LTM4676");
507 MODULE_LICENSE("GPL");
508