1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Hardware monitoring driver for Maxim MAX34440/MAX34441
5 * Copyright (c) 2011 Ericsson AB.
6 * Copyright (c) 2012 Guenter Roeck
9 #include <linux/bitops.h>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/init.h>
13 #include <linux/err.h>
14 #include <linux/i2c.h>
17 enum chips { max34440, max34441, max34446, max34451, max34460, max34461 };
19 #define MAX34440_MFR_VOUT_PEAK 0xd4
20 #define MAX34440_MFR_IOUT_PEAK 0xd5
21 #define MAX34440_MFR_TEMPERATURE_PEAK 0xd6
22 #define MAX34440_MFR_VOUT_MIN 0xd7
24 #define MAX34446_MFR_POUT_PEAK 0xe0
25 #define MAX34446_MFR_POUT_AVG 0xe1
26 #define MAX34446_MFR_IOUT_AVG 0xe2
27 #define MAX34446_MFR_TEMPERATURE_AVG 0xe3
29 #define MAX34440_STATUS_OC_WARN BIT(0)
30 #define MAX34440_STATUS_OC_FAULT BIT(1)
31 #define MAX34440_STATUS_OT_FAULT BIT(5)
32 #define MAX34440_STATUS_OT_WARN BIT(6)
34 #define MAX34451_MFR_CHANNEL_CONFIG 0xe4
35 #define MAX34451_MFR_CHANNEL_CONFIG_SEL_MASK 0x3f
37 struct max34440_data {
39 struct pmbus_driver_info info;
42 #define to_max34440_data(x) container_of(x, struct max34440_data, info)
44 static int max34440_read_word_data(struct i2c_client *client, int page,
48 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
49 const struct max34440_data *data = to_max34440_data(info);
52 case PMBUS_VIRT_READ_VOUT_MIN:
53 ret = pmbus_read_word_data(client, page, phase,
54 MAX34440_MFR_VOUT_MIN);
56 case PMBUS_VIRT_READ_VOUT_MAX:
57 ret = pmbus_read_word_data(client, page, phase,
58 MAX34440_MFR_VOUT_PEAK);
60 case PMBUS_VIRT_READ_IOUT_AVG:
61 if (data->id != max34446 && data->id != max34451)
63 ret = pmbus_read_word_data(client, page, phase,
64 MAX34446_MFR_IOUT_AVG);
66 case PMBUS_VIRT_READ_IOUT_MAX:
67 ret = pmbus_read_word_data(client, page, phase,
68 MAX34440_MFR_IOUT_PEAK);
70 case PMBUS_VIRT_READ_POUT_AVG:
71 if (data->id != max34446)
73 ret = pmbus_read_word_data(client, page, phase,
74 MAX34446_MFR_POUT_AVG);
76 case PMBUS_VIRT_READ_POUT_MAX:
77 if (data->id != max34446)
79 ret = pmbus_read_word_data(client, page, phase,
80 MAX34446_MFR_POUT_PEAK);
82 case PMBUS_VIRT_READ_TEMP_AVG:
83 if (data->id != max34446 && data->id != max34460 &&
86 ret = pmbus_read_word_data(client, page, phase,
87 MAX34446_MFR_TEMPERATURE_AVG);
89 case PMBUS_VIRT_READ_TEMP_MAX:
90 ret = pmbus_read_word_data(client, page, phase,
91 MAX34440_MFR_TEMPERATURE_PEAK);
93 case PMBUS_VIRT_RESET_POUT_HISTORY:
94 if (data->id != max34446)
98 case PMBUS_VIRT_RESET_VOUT_HISTORY:
99 case PMBUS_VIRT_RESET_IOUT_HISTORY:
100 case PMBUS_VIRT_RESET_TEMP_HISTORY:
110 static int max34440_write_word_data(struct i2c_client *client, int page,
113 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
114 const struct max34440_data *data = to_max34440_data(info);
118 case PMBUS_VIRT_RESET_POUT_HISTORY:
119 ret = pmbus_write_word_data(client, page,
120 MAX34446_MFR_POUT_PEAK, 0);
123 ret = pmbus_write_word_data(client, page,
124 MAX34446_MFR_POUT_AVG, 0);
126 case PMBUS_VIRT_RESET_VOUT_HISTORY:
127 ret = pmbus_write_word_data(client, page,
128 MAX34440_MFR_VOUT_MIN, 0x7fff);
131 ret = pmbus_write_word_data(client, page,
132 MAX34440_MFR_VOUT_PEAK, 0);
134 case PMBUS_VIRT_RESET_IOUT_HISTORY:
135 ret = pmbus_write_word_data(client, page,
136 MAX34440_MFR_IOUT_PEAK, 0);
137 if (!ret && (data->id == max34446 || data->id == max34451))
138 ret = pmbus_write_word_data(client, page,
139 MAX34446_MFR_IOUT_AVG, 0);
142 case PMBUS_VIRT_RESET_TEMP_HISTORY:
143 ret = pmbus_write_word_data(client, page,
144 MAX34440_MFR_TEMPERATURE_PEAK,
146 if (!ret && data->id == max34446)
147 ret = pmbus_write_word_data(client, page,
148 MAX34446_MFR_TEMPERATURE_AVG, 0);
157 static int max34440_read_byte_data(struct i2c_client *client, int page, int reg)
163 ret = pmbus_set_page(client, page, 0xff);
169 case PMBUS_STATUS_IOUT:
170 mfg_status = pmbus_read_word_data(client, 0, 0xff,
171 PMBUS_STATUS_MFR_SPECIFIC);
174 if (mfg_status & MAX34440_STATUS_OC_WARN)
175 ret |= PB_IOUT_OC_WARNING;
176 if (mfg_status & MAX34440_STATUS_OC_FAULT)
177 ret |= PB_IOUT_OC_FAULT;
179 case PMBUS_STATUS_TEMPERATURE:
180 mfg_status = pmbus_read_word_data(client, 0, 0xff,
181 PMBUS_STATUS_MFR_SPECIFIC);
184 if (mfg_status & MAX34440_STATUS_OT_WARN)
185 ret |= PB_TEMP_OT_WARNING;
186 if (mfg_status & MAX34440_STATUS_OT_FAULT)
187 ret |= PB_TEMP_OT_FAULT;
196 static int max34451_set_supported_funcs(struct i2c_client *client,
197 struct max34440_data *data)
200 * Each of the channel 0-15 can be configured to monitor the following
201 * functions based on MFR_CHANNEL_CONFIG[5:0]
202 * 0x10: Sequencing + voltage monitoring (only valid for PAGES 0–11)
203 * 0x20: Voltage monitoring (no sequencing)
204 * 0x21: Voltage read only
205 * 0x22: Current monitoring
206 * 0x23: Current read only
207 * 0x30: General-purpose input active low
208 * 0x34: General-purpose input active high
214 for (page = 0; page < 16; page++) {
215 rv = i2c_smbus_write_byte_data(client, PMBUS_PAGE, page);
219 rv = i2c_smbus_read_word_data(client,
220 MAX34451_MFR_CHANNEL_CONFIG);
224 switch (rv & MAX34451_MFR_CHANNEL_CONFIG_SEL_MASK) {
227 data->info.func[page] = PMBUS_HAVE_VOUT |
228 PMBUS_HAVE_STATUS_VOUT;
231 data->info.func[page] = PMBUS_HAVE_VOUT;
234 data->info.func[page] = PMBUS_HAVE_IOUT |
235 PMBUS_HAVE_STATUS_IOUT;
238 data->info.func[page] = PMBUS_HAVE_IOUT;
248 static struct pmbus_driver_info max34440_info[] = {
251 .format[PSC_VOLTAGE_IN] = direct,
252 .format[PSC_VOLTAGE_OUT] = direct,
253 .format[PSC_TEMPERATURE] = direct,
254 .format[PSC_CURRENT_OUT] = direct,
255 .m[PSC_VOLTAGE_IN] = 1,
256 .b[PSC_VOLTAGE_IN] = 0,
257 .R[PSC_VOLTAGE_IN] = 3, /* R = 0 in datasheet reflects mV */
258 .m[PSC_VOLTAGE_OUT] = 1,
259 .b[PSC_VOLTAGE_OUT] = 0,
260 .R[PSC_VOLTAGE_OUT] = 3, /* R = 0 in datasheet reflects mV */
261 .m[PSC_CURRENT_OUT] = 1,
262 .b[PSC_CURRENT_OUT] = 0,
263 .R[PSC_CURRENT_OUT] = 3, /* R = 0 in datasheet reflects mA */
264 .m[PSC_TEMPERATURE] = 1,
265 .b[PSC_TEMPERATURE] = 0,
266 .R[PSC_TEMPERATURE] = 2,
267 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
268 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
269 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
270 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
271 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
272 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
273 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
274 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
275 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
276 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
277 .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
278 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
279 .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
280 .func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
281 .func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
282 .func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
283 .func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
284 .func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
285 .func[12] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
286 .func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
287 .read_byte_data = max34440_read_byte_data,
288 .read_word_data = max34440_read_word_data,
289 .write_word_data = max34440_write_word_data,
293 .format[PSC_VOLTAGE_IN] = direct,
294 .format[PSC_VOLTAGE_OUT] = direct,
295 .format[PSC_TEMPERATURE] = direct,
296 .format[PSC_CURRENT_OUT] = direct,
297 .format[PSC_FAN] = direct,
298 .m[PSC_VOLTAGE_IN] = 1,
299 .b[PSC_VOLTAGE_IN] = 0,
300 .R[PSC_VOLTAGE_IN] = 3,
301 .m[PSC_VOLTAGE_OUT] = 1,
302 .b[PSC_VOLTAGE_OUT] = 0,
303 .R[PSC_VOLTAGE_OUT] = 3,
304 .m[PSC_CURRENT_OUT] = 1,
305 .b[PSC_CURRENT_OUT] = 0,
306 .R[PSC_CURRENT_OUT] = 3,
307 .m[PSC_TEMPERATURE] = 1,
308 .b[PSC_TEMPERATURE] = 0,
309 .R[PSC_TEMPERATURE] = 2,
313 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
314 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
315 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
316 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
317 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
318 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
319 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
320 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
321 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
322 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
323 .func[5] = PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12,
324 .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
325 .func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
326 .func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
327 .func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
328 .func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
329 .func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
330 .read_byte_data = max34440_read_byte_data,
331 .read_word_data = max34440_read_word_data,
332 .write_word_data = max34440_write_word_data,
336 .format[PSC_VOLTAGE_IN] = direct,
337 .format[PSC_VOLTAGE_OUT] = direct,
338 .format[PSC_TEMPERATURE] = direct,
339 .format[PSC_CURRENT_OUT] = direct,
340 .format[PSC_POWER] = direct,
341 .m[PSC_VOLTAGE_IN] = 1,
342 .b[PSC_VOLTAGE_IN] = 0,
343 .R[PSC_VOLTAGE_IN] = 3,
344 .m[PSC_VOLTAGE_OUT] = 1,
345 .b[PSC_VOLTAGE_OUT] = 0,
346 .R[PSC_VOLTAGE_OUT] = 3,
347 .m[PSC_CURRENT_OUT] = 1,
348 .b[PSC_CURRENT_OUT] = 0,
349 .R[PSC_CURRENT_OUT] = 3,
353 .m[PSC_TEMPERATURE] = 1,
354 .b[PSC_TEMPERATURE] = 0,
355 .R[PSC_TEMPERATURE] = 2,
356 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
357 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
358 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
359 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
360 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
361 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
362 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
363 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
364 .func[4] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
365 .func[5] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
366 .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
367 .read_byte_data = max34440_read_byte_data,
368 .read_word_data = max34440_read_word_data,
369 .write_word_data = max34440_write_word_data,
373 .format[PSC_VOLTAGE_OUT] = direct,
374 .format[PSC_TEMPERATURE] = direct,
375 .format[PSC_CURRENT_OUT] = direct,
376 .m[PSC_VOLTAGE_OUT] = 1,
377 .b[PSC_VOLTAGE_OUT] = 0,
378 .R[PSC_VOLTAGE_OUT] = 3,
379 .m[PSC_CURRENT_OUT] = 1,
380 .b[PSC_CURRENT_OUT] = 0,
381 .R[PSC_CURRENT_OUT] = 2,
382 .m[PSC_TEMPERATURE] = 1,
383 .b[PSC_TEMPERATURE] = 0,
384 .R[PSC_TEMPERATURE] = 2,
385 /* func 0-15 is set dynamically before probing */
386 .func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
387 .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
388 .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
389 .func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
390 .func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
391 .read_byte_data = max34440_read_byte_data,
392 .read_word_data = max34440_read_word_data,
393 .write_word_data = max34440_write_word_data,
397 .format[PSC_VOLTAGE_OUT] = direct,
398 .format[PSC_TEMPERATURE] = direct,
399 .m[PSC_VOLTAGE_OUT] = 1,
400 .b[PSC_VOLTAGE_OUT] = 0,
401 .R[PSC_VOLTAGE_OUT] = 3,
402 .m[PSC_TEMPERATURE] = 1,
403 .b[PSC_TEMPERATURE] = 0,
404 .R[PSC_TEMPERATURE] = 2,
405 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
406 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
407 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
408 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
409 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
410 .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
411 .func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
412 .func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
413 .func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
414 .func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
415 .func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
416 .func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
417 .func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
418 .func[14] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
419 .func[15] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
420 .func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
421 .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
422 .read_byte_data = max34440_read_byte_data,
423 .read_word_data = max34440_read_word_data,
424 .write_word_data = max34440_write_word_data,
428 .format[PSC_VOLTAGE_OUT] = direct,
429 .format[PSC_TEMPERATURE] = direct,
430 .m[PSC_VOLTAGE_OUT] = 1,
431 .b[PSC_VOLTAGE_OUT] = 0,
432 .R[PSC_VOLTAGE_OUT] = 3,
433 .m[PSC_TEMPERATURE] = 1,
434 .b[PSC_TEMPERATURE] = 0,
435 .R[PSC_TEMPERATURE] = 2,
436 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
437 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
438 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
439 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
440 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
441 .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
442 .func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
443 .func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
444 .func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
445 .func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
446 .func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
447 .func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
448 .func[12] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
449 .func[13] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
450 .func[14] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
451 .func[15] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
452 /* page 16 is reserved */
453 .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
454 .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
455 .func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
456 .func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
457 .func[21] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
458 .read_byte_data = max34440_read_byte_data,
459 .read_word_data = max34440_read_word_data,
460 .write_word_data = max34440_write_word_data,
464 static int max34440_probe(struct i2c_client *client,
465 const struct i2c_device_id *id)
467 struct max34440_data *data;
470 data = devm_kzalloc(&client->dev, sizeof(struct max34440_data),
474 data->id = id->driver_data;
475 data->info = max34440_info[id->driver_data];
477 if (data->id == max34451) {
478 rv = max34451_set_supported_funcs(client, data);
483 return pmbus_do_probe(client, id, &data->info);
486 static const struct i2c_device_id max34440_id[] = {
487 {"max34440", max34440},
488 {"max34441", max34441},
489 {"max34446", max34446},
490 {"max34451", max34451},
491 {"max34460", max34460},
492 {"max34461", max34461},
495 MODULE_DEVICE_TABLE(i2c, max34440_id);
497 /* This is the driver that will be inserted */
498 static struct i2c_driver max34440_driver = {
502 .probe = max34440_probe,
503 .remove = pmbus_do_remove,
504 .id_table = max34440_id,
507 module_i2c_driver(max34440_driver);
509 MODULE_AUTHOR("Guenter Roeck");
510 MODULE_DESCRIPTION("PMBus driver for Maxim MAX34440/MAX34441");
511 MODULE_LICENSE("GPL");