1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * Hardware monitoring driver for Maxim MAX34440/MAX34441
4 *
5 * Copyright (c) 2011 Ericsson AB.
6 * Copyright (c) 2012 Guenter Roeck
7 */
8
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>
15 #include <linux/delay.h>
16 #include "pmbus.h"
17
18 enum chips {
19 adpm12160,
20 max34440,
21 max34441,
22 max34446,
23 max34451,
24 max34460,
25 max34461,
26 };
27
28 /*
29 * Firmware is sometimes not ready if we try and read the
30 * data from the page immediately after setting. Maxim
31 * recommends 50us delay due to the chip failing to clock
32 * stretch long enough here.
33 */
34 #define MAX34440_PAGE_CHANGE_DELAY 50
35
36 #define MAX34440_MFR_VOUT_PEAK 0xd4
37 #define MAX34440_MFR_IOUT_PEAK 0xd5
38 #define MAX34440_MFR_TEMPERATURE_PEAK 0xd6
39 #define MAX34440_MFR_VOUT_MIN 0xd7
40
41 #define MAX34446_MFR_POUT_PEAK 0xe0
42 #define MAX34446_MFR_POUT_AVG 0xe1
43 #define MAX34446_MFR_IOUT_AVG 0xe2
44 #define MAX34446_MFR_TEMPERATURE_AVG 0xe3
45
46 #define MAX34440_STATUS_OC_WARN BIT(0)
47 #define MAX34440_STATUS_OC_FAULT BIT(1)
48 #define MAX34440_STATUS_OT_FAULT BIT(5)
49 #define MAX34440_STATUS_OT_WARN BIT(6)
50
51 /*
52 * The whole max344* family have IOUT_OC_WARN_LIMIT and IOUT_OC_FAULT_LIMIT
53 * swapped from the standard pmbus spec addresses.
54 * For max34451, version MAX34451ETNA6+ and later has this issue fixed.
55 */
56 #define MAX34440_IOUT_OC_WARN_LIMIT 0x46
57 #define MAX34440_IOUT_OC_FAULT_LIMIT 0x4A
58
59 #define MAX34451ETNA6_MFR_REV 0x0012
60
61 #define MAX34451_MFR_CHANNEL_CONFIG 0xe4
62 #define MAX34451_MFR_CHANNEL_CONFIG_SEL_MASK 0x3f
63
64 struct max34440_data {
65 int id;
66 struct pmbus_driver_info info;
67 u8 iout_oc_warn_limit;
68 u8 iout_oc_fault_limit;
69 };
70
71 #define to_max34440_data(x) container_of(x, struct max34440_data, info)
72
73 static const struct i2c_device_id max34440_id[];
74
max34440_read_word_data(struct i2c_client * client,int page,int phase,int reg)75 static int max34440_read_word_data(struct i2c_client *client, int page,
76 int phase, int reg)
77 {
78 int ret;
79 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
80 const struct max34440_data *data = to_max34440_data(info);
81
82 switch (reg) {
83 case PMBUS_IOUT_OC_FAULT_LIMIT:
84 ret = pmbus_read_word_data(client, page, phase,
85 data->iout_oc_fault_limit);
86 break;
87 case PMBUS_IOUT_OC_WARN_LIMIT:
88 ret = pmbus_read_word_data(client, page, phase,
89 data->iout_oc_warn_limit);
90 break;
91 case PMBUS_VIRT_READ_VOUT_MIN:
92 ret = pmbus_read_word_data(client, page, phase,
93 MAX34440_MFR_VOUT_MIN);
94 break;
95 case PMBUS_VIRT_READ_VOUT_MAX:
96 ret = pmbus_read_word_data(client, page, phase,
97 MAX34440_MFR_VOUT_PEAK);
98 break;
99 case PMBUS_VIRT_READ_IOUT_AVG:
100 if (data->id != max34446 && data->id != max34451 &&
101 data->id != adpm12160)
102 return -ENXIO;
103 ret = pmbus_read_word_data(client, page, phase,
104 MAX34446_MFR_IOUT_AVG);
105 break;
106 case PMBUS_VIRT_READ_IOUT_MAX:
107 ret = pmbus_read_word_data(client, page, phase,
108 MAX34440_MFR_IOUT_PEAK);
109 break;
110 case PMBUS_VIRT_READ_POUT_AVG:
111 if (data->id != max34446)
112 return -ENXIO;
113 ret = pmbus_read_word_data(client, page, phase,
114 MAX34446_MFR_POUT_AVG);
115 break;
116 case PMBUS_VIRT_READ_POUT_MAX:
117 if (data->id != max34446)
118 return -ENXIO;
119 ret = pmbus_read_word_data(client, page, phase,
120 MAX34446_MFR_POUT_PEAK);
121 break;
122 case PMBUS_VIRT_READ_TEMP_AVG:
123 if (data->id != max34446 && data->id != max34460 &&
124 data->id != max34461)
125 return -ENXIO;
126 ret = pmbus_read_word_data(client, page, phase,
127 MAX34446_MFR_TEMPERATURE_AVG);
128 break;
129 case PMBUS_VIRT_READ_TEMP_MAX:
130 ret = pmbus_read_word_data(client, page, phase,
131 MAX34440_MFR_TEMPERATURE_PEAK);
132 break;
133 case PMBUS_VIRT_RESET_POUT_HISTORY:
134 if (data->id != max34446)
135 return -ENXIO;
136 ret = 0;
137 break;
138 case PMBUS_VIRT_RESET_VOUT_HISTORY:
139 case PMBUS_VIRT_RESET_IOUT_HISTORY:
140 case PMBUS_VIRT_RESET_TEMP_HISTORY:
141 ret = 0;
142 break;
143 default:
144 ret = -ENODATA;
145 break;
146 }
147 return ret;
148 }
149
max34440_write_word_data(struct i2c_client * client,int page,int reg,u16 word)150 static int max34440_write_word_data(struct i2c_client *client, int page,
151 int reg, u16 word)
152 {
153 const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
154 const struct max34440_data *data = to_max34440_data(info);
155 int ret;
156
157 switch (reg) {
158 case PMBUS_IOUT_OC_FAULT_LIMIT:
159 ret = pmbus_write_word_data(client, page, data->iout_oc_fault_limit,
160 word);
161 break;
162 case PMBUS_IOUT_OC_WARN_LIMIT:
163 ret = pmbus_write_word_data(client, page, data->iout_oc_warn_limit,
164 word);
165 break;
166 case PMBUS_VIRT_RESET_POUT_HISTORY:
167 ret = pmbus_write_word_data(client, page,
168 MAX34446_MFR_POUT_PEAK, 0);
169 if (ret)
170 break;
171 ret = pmbus_write_word_data(client, page,
172 MAX34446_MFR_POUT_AVG, 0);
173 break;
174 case PMBUS_VIRT_RESET_VOUT_HISTORY:
175 ret = pmbus_write_word_data(client, page,
176 MAX34440_MFR_VOUT_MIN, 0x7fff);
177 if (ret)
178 break;
179 ret = pmbus_write_word_data(client, page,
180 MAX34440_MFR_VOUT_PEAK, 0);
181 break;
182 case PMBUS_VIRT_RESET_IOUT_HISTORY:
183 ret = pmbus_write_word_data(client, page,
184 MAX34440_MFR_IOUT_PEAK, 0);
185 if (!ret && (data->id == max34446 || data->id == max34451 ||
186 data->id == adpm12160))
187 ret = pmbus_write_word_data(client, page,
188 MAX34446_MFR_IOUT_AVG, 0);
189
190 break;
191 case PMBUS_VIRT_RESET_TEMP_HISTORY:
192 ret = pmbus_write_word_data(client, page,
193 MAX34440_MFR_TEMPERATURE_PEAK,
194 0x8000);
195 if (!ret && data->id == max34446)
196 ret = pmbus_write_word_data(client, page,
197 MAX34446_MFR_TEMPERATURE_AVG, 0);
198 break;
199 default:
200 ret = -ENODATA;
201 break;
202 }
203 return ret;
204 }
205
max34440_read_byte_data(struct i2c_client * client,int page,int reg)206 static int max34440_read_byte_data(struct i2c_client *client, int page, int reg)
207 {
208 int ret = 0;
209 int mfg_status;
210
211 if (page >= 0) {
212 ret = pmbus_set_page(client, page, 0xff);
213 if (ret < 0)
214 return ret;
215 }
216
217 switch (reg) {
218 case PMBUS_STATUS_IOUT:
219 mfg_status = pmbus_read_word_data(client, 0, 0xff,
220 PMBUS_STATUS_MFR_SPECIFIC);
221 if (mfg_status < 0)
222 return mfg_status;
223 if (mfg_status & MAX34440_STATUS_OC_WARN)
224 ret |= PB_IOUT_OC_WARNING;
225 if (mfg_status & MAX34440_STATUS_OC_FAULT)
226 ret |= PB_IOUT_OC_FAULT;
227 break;
228 case PMBUS_STATUS_TEMPERATURE:
229 mfg_status = pmbus_read_word_data(client, 0, 0xff,
230 PMBUS_STATUS_MFR_SPECIFIC);
231 if (mfg_status < 0)
232 return mfg_status;
233 if (mfg_status & MAX34440_STATUS_OT_WARN)
234 ret |= PB_TEMP_OT_WARNING;
235 if (mfg_status & MAX34440_STATUS_OT_FAULT)
236 ret |= PB_TEMP_OT_FAULT;
237 break;
238 default:
239 ret = -ENODATA;
240 break;
241 }
242 return ret;
243 }
244
max34451_set_supported_funcs(struct i2c_client * client,struct max34440_data * data)245 static int max34451_set_supported_funcs(struct i2c_client *client,
246 struct max34440_data *data)
247 {
248 /*
249 * Each of the channel 0-15 can be configured to monitor the following
250 * functions based on MFR_CHANNEL_CONFIG[5:0]
251 * 0x10: Sequencing + voltage monitoring (only valid for PAGES 0–11)
252 * 0x20: Voltage monitoring (no sequencing)
253 * 0x21: Voltage read only
254 * 0x22: Current monitoring
255 * 0x23: Current read only
256 * 0x30: General-purpose input active low
257 * 0x34: General-purpose input active high
258 * 0x00: Disabled
259 */
260
261 int page, rv;
262 bool max34451_na6 = false;
263
264 rv = i2c_smbus_read_word_data(client, PMBUS_MFR_REVISION);
265 if (rv < 0)
266 return rv;
267
268 if (rv >= MAX34451ETNA6_MFR_REV) {
269 max34451_na6 = true;
270 data->info.format[PSC_VOLTAGE_IN] = direct;
271 data->info.format[PSC_CURRENT_IN] = direct;
272 data->info.m[PSC_VOLTAGE_IN] = 1;
273 data->info.b[PSC_VOLTAGE_IN] = 0;
274 data->info.R[PSC_VOLTAGE_IN] = 3;
275 data->info.m[PSC_CURRENT_IN] = 1;
276 data->info.b[PSC_CURRENT_IN] = 0;
277 data->info.R[PSC_CURRENT_IN] = 2;
278 data->iout_oc_fault_limit = PMBUS_IOUT_OC_FAULT_LIMIT;
279 data->iout_oc_warn_limit = PMBUS_IOUT_OC_WARN_LIMIT;
280 }
281
282 for (page = 0; page < 16; page++) {
283 rv = i2c_smbus_write_byte_data(client, PMBUS_PAGE, page);
284 fsleep(MAX34440_PAGE_CHANGE_DELAY);
285 if (rv < 0)
286 return rv;
287
288 rv = i2c_smbus_read_word_data(client,
289 MAX34451_MFR_CHANNEL_CONFIG);
290 if (rv < 0)
291 return rv;
292
293 switch (rv & MAX34451_MFR_CHANNEL_CONFIG_SEL_MASK) {
294 case 0x10:
295 case 0x20:
296 data->info.func[page] = PMBUS_HAVE_VOUT |
297 PMBUS_HAVE_STATUS_VOUT;
298
299 if (max34451_na6)
300 data->info.func[page] |= PMBUS_HAVE_VIN |
301 PMBUS_HAVE_STATUS_INPUT;
302 break;
303 case 0x21:
304 data->info.func[page] = PMBUS_HAVE_VOUT;
305
306 if (max34451_na6)
307 data->info.func[page] |= PMBUS_HAVE_VIN;
308 break;
309 case 0x22:
310 data->info.func[page] = PMBUS_HAVE_IOUT |
311 PMBUS_HAVE_STATUS_IOUT;
312
313 if (max34451_na6)
314 data->info.func[page] |= PMBUS_HAVE_IIN |
315 PMBUS_HAVE_STATUS_INPUT;
316 break;
317 case 0x23:
318 data->info.func[page] = PMBUS_HAVE_IOUT;
319
320 if (max34451_na6)
321 data->info.func[page] |= PMBUS_HAVE_IIN;
322 break;
323 default:
324 break;
325 }
326 }
327
328 return 0;
329 }
330
331 static struct pmbus_driver_info max34440_info[] = {
332 [adpm12160] = {
333 .pages = 19,
334 .format[PSC_VOLTAGE_IN] = direct,
335 .format[PSC_VOLTAGE_OUT] = direct,
336 .format[PSC_CURRENT_IN] = direct,
337 .format[PSC_CURRENT_OUT] = direct,
338 .format[PSC_TEMPERATURE] = direct,
339 .m[PSC_VOLTAGE_IN] = 125,
340 .b[PSC_VOLTAGE_IN] = 0,
341 .R[PSC_VOLTAGE_IN] = 0,
342 .m[PSC_VOLTAGE_OUT] = 125,
343 .b[PSC_VOLTAGE_OUT] = 0,
344 .R[PSC_VOLTAGE_OUT] = 0,
345 .m[PSC_CURRENT_IN] = 250,
346 .b[PSC_CURRENT_IN] = 0,
347 .R[PSC_CURRENT_IN] = -1,
348 .m[PSC_CURRENT_OUT] = 250,
349 .b[PSC_CURRENT_OUT] = 0,
350 .R[PSC_CURRENT_OUT] = -1,
351 .m[PSC_TEMPERATURE] = 1,
352 .b[PSC_TEMPERATURE] = 0,
353 .R[PSC_TEMPERATURE] = 2,
354 /* absent func below [18] are not for monitoring */
355 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
356 .func[4] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
357 .func[5] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
358 .func[6] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
359 .func[7] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
360 .func[8] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
361 .func[9] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT,
362 .func[10] = PMBUS_HAVE_IIN | PMBUS_HAVE_STATUS_INPUT,
363 .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
364 .read_word_data = max34440_read_word_data,
365 .write_word_data = max34440_write_word_data,
366 },
367 [max34440] = {
368 .pages = 14,
369 .format[PSC_VOLTAGE_IN] = direct,
370 .format[PSC_VOLTAGE_OUT] = direct,
371 .format[PSC_TEMPERATURE] = direct,
372 .format[PSC_CURRENT_OUT] = direct,
373 .m[PSC_VOLTAGE_IN] = 1,
374 .b[PSC_VOLTAGE_IN] = 0,
375 .R[PSC_VOLTAGE_IN] = 3, /* R = 0 in datasheet reflects mV */
376 .m[PSC_VOLTAGE_OUT] = 1,
377 .b[PSC_VOLTAGE_OUT] = 0,
378 .R[PSC_VOLTAGE_OUT] = 3, /* R = 0 in datasheet reflects mV */
379 .m[PSC_CURRENT_OUT] = 1,
380 .b[PSC_CURRENT_OUT] = 0,
381 .R[PSC_CURRENT_OUT] = 3, /* R = 0 in datasheet reflects mA */
382 .m[PSC_TEMPERATURE] = 1,
383 .b[PSC_TEMPERATURE] = 0,
384 .R[PSC_TEMPERATURE] = 2,
385 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
386 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
387 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
388 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
389 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
390 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
391 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
392 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
393 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
394 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
395 .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
396 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
397 .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
398 .func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
399 .func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
400 .func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
401 .func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
402 .func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
403 .func[12] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
404 .func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
405 .read_byte_data = max34440_read_byte_data,
406 .read_word_data = max34440_read_word_data,
407 .write_word_data = max34440_write_word_data,
408 .page_change_delay = MAX34440_PAGE_CHANGE_DELAY,
409 },
410 [max34441] = {
411 .pages = 12,
412 .format[PSC_VOLTAGE_IN] = direct,
413 .format[PSC_VOLTAGE_OUT] = direct,
414 .format[PSC_TEMPERATURE] = direct,
415 .format[PSC_CURRENT_OUT] = direct,
416 .format[PSC_FAN] = direct,
417 .m[PSC_VOLTAGE_IN] = 1,
418 .b[PSC_VOLTAGE_IN] = 0,
419 .R[PSC_VOLTAGE_IN] = 3,
420 .m[PSC_VOLTAGE_OUT] = 1,
421 .b[PSC_VOLTAGE_OUT] = 0,
422 .R[PSC_VOLTAGE_OUT] = 3,
423 .m[PSC_CURRENT_OUT] = 1,
424 .b[PSC_CURRENT_OUT] = 0,
425 .R[PSC_CURRENT_OUT] = 3,
426 .m[PSC_TEMPERATURE] = 1,
427 .b[PSC_TEMPERATURE] = 0,
428 .R[PSC_TEMPERATURE] = 2,
429 .m[PSC_FAN] = 1,
430 .b[PSC_FAN] = 0,
431 .R[PSC_FAN] = 0,
432 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
433 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
434 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
435 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
436 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
437 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
438 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
439 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
440 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
441 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
442 .func[5] = PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12,
443 .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
444 .func[7] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
445 .func[8] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
446 .func[9] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
447 .func[10] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
448 .func[11] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
449 .read_byte_data = max34440_read_byte_data,
450 .read_word_data = max34440_read_word_data,
451 .write_word_data = max34440_write_word_data,
452 .page_change_delay = MAX34440_PAGE_CHANGE_DELAY,
453 },
454 [max34446] = {
455 .pages = 7,
456 .format[PSC_VOLTAGE_IN] = direct,
457 .format[PSC_VOLTAGE_OUT] = direct,
458 .format[PSC_TEMPERATURE] = direct,
459 .format[PSC_CURRENT_OUT] = direct,
460 .format[PSC_POWER] = direct,
461 .m[PSC_VOLTAGE_IN] = 1,
462 .b[PSC_VOLTAGE_IN] = 0,
463 .R[PSC_VOLTAGE_IN] = 3,
464 .m[PSC_VOLTAGE_OUT] = 1,
465 .b[PSC_VOLTAGE_OUT] = 0,
466 .R[PSC_VOLTAGE_OUT] = 3,
467 .m[PSC_CURRENT_OUT] = 1,
468 .b[PSC_CURRENT_OUT] = 0,
469 .R[PSC_CURRENT_OUT] = 3,
470 .m[PSC_POWER] = 1,
471 .b[PSC_POWER] = 0,
472 .R[PSC_POWER] = 3,
473 .m[PSC_TEMPERATURE] = 1,
474 .b[PSC_TEMPERATURE] = 0,
475 .R[PSC_TEMPERATURE] = 2,
476 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
477 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
478 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
479 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
480 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
481 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT,
482 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
483 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
484 .func[4] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
485 .func[5] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
486 .func[6] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
487 .read_byte_data = max34440_read_byte_data,
488 .read_word_data = max34440_read_word_data,
489 .write_word_data = max34440_write_word_data,
490 .page_change_delay = MAX34440_PAGE_CHANGE_DELAY,
491 },
492 [max34451] = {
493 .pages = 21,
494 .format[PSC_VOLTAGE_OUT] = direct,
495 .format[PSC_TEMPERATURE] = direct,
496 .format[PSC_CURRENT_OUT] = direct,
497 .m[PSC_VOLTAGE_OUT] = 1,
498 .b[PSC_VOLTAGE_OUT] = 0,
499 .R[PSC_VOLTAGE_OUT] = 3,
500 .m[PSC_CURRENT_OUT] = 1,
501 .b[PSC_CURRENT_OUT] = 0,
502 .R[PSC_CURRENT_OUT] = 2,
503 .m[PSC_TEMPERATURE] = 1,
504 .b[PSC_TEMPERATURE] = 0,
505 .R[PSC_TEMPERATURE] = 2,
506 /* func 0-15 is set dynamically before probing */
507 .func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
508 .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
509 .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
510 .func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
511 .func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
512 .read_word_data = max34440_read_word_data,
513 .write_word_data = max34440_write_word_data,
514 .page_change_delay = MAX34440_PAGE_CHANGE_DELAY,
515 },
516 [max34460] = {
517 .pages = 18,
518 .format[PSC_VOLTAGE_OUT] = direct,
519 .format[PSC_TEMPERATURE] = direct,
520 .m[PSC_VOLTAGE_OUT] = 1,
521 .b[PSC_VOLTAGE_OUT] = 0,
522 .R[PSC_VOLTAGE_OUT] = 3,
523 .m[PSC_TEMPERATURE] = 1,
524 .b[PSC_TEMPERATURE] = 0,
525 .R[PSC_TEMPERATURE] = 2,
526 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
527 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
528 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
529 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
530 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
531 .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
532 .func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
533 .func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
534 .func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
535 .func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
536 .func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
537 .func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
538 .func[13] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
539 .func[14] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
540 .func[15] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
541 .func[16] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
542 .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
543 .read_word_data = max34440_read_word_data,
544 .write_word_data = max34440_write_word_data,
545 .page_change_delay = MAX34440_PAGE_CHANGE_DELAY,
546 },
547 [max34461] = {
548 .pages = 23,
549 .format[PSC_VOLTAGE_OUT] = direct,
550 .format[PSC_TEMPERATURE] = direct,
551 .m[PSC_VOLTAGE_OUT] = 1,
552 .b[PSC_VOLTAGE_OUT] = 0,
553 .R[PSC_VOLTAGE_OUT] = 3,
554 .m[PSC_TEMPERATURE] = 1,
555 .b[PSC_TEMPERATURE] = 0,
556 .R[PSC_TEMPERATURE] = 2,
557 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
558 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
559 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
560 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
561 .func[4] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
562 .func[5] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
563 .func[6] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
564 .func[7] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
565 .func[8] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
566 .func[9] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
567 .func[10] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
568 .func[11] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
569 .func[12] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
570 .func[13] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
571 .func[14] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
572 .func[15] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
573 /* page 16 is reserved */
574 .func[17] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
575 .func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
576 .func[19] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
577 .func[20] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
578 .func[21] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
579 .read_word_data = max34440_read_word_data,
580 .write_word_data = max34440_write_word_data,
581 .page_change_delay = MAX34440_PAGE_CHANGE_DELAY,
582 },
583 };
584
max34440_probe(struct i2c_client * client)585 static int max34440_probe(struct i2c_client *client)
586 {
587 struct max34440_data *data;
588 int rv;
589
590 data = devm_kzalloc(&client->dev, sizeof(struct max34440_data),
591 GFP_KERNEL);
592 if (!data)
593 return -ENOMEM;
594 data->id = i2c_match_id(max34440_id, client)->driver_data;
595 data->info = max34440_info[data->id];
596 data->iout_oc_fault_limit = MAX34440_IOUT_OC_FAULT_LIMIT;
597 data->iout_oc_warn_limit = MAX34440_IOUT_OC_WARN_LIMIT;
598
599 if (data->id == max34451) {
600 rv = max34451_set_supported_funcs(client, data);
601 if (rv)
602 return rv;
603 } else if (data->id == adpm12160) {
604 data->iout_oc_fault_limit = PMBUS_IOUT_OC_FAULT_LIMIT;
605 data->iout_oc_warn_limit = PMBUS_IOUT_OC_WARN_LIMIT;
606 }
607
608 return pmbus_do_probe(client, &data->info);
609 }
610
611 static const struct i2c_device_id max34440_id[] = {
612 {"adpm12160", adpm12160},
613 {"max34440", max34440},
614 {"max34441", max34441},
615 {"max34446", max34446},
616 {"max34451", max34451},
617 {"max34460", max34460},
618 {"max34461", max34461},
619 {}
620 };
621 MODULE_DEVICE_TABLE(i2c, max34440_id);
622
623 /* This is the driver that will be inserted */
624 static struct i2c_driver max34440_driver = {
625 .driver = {
626 .name = "max34440",
627 },
628 .probe = max34440_probe,
629 .id_table = max34440_id,
630 };
631
632 module_i2c_driver(max34440_driver);
633
634 MODULE_AUTHOR("Guenter Roeck");
635 MODULE_DESCRIPTION("PMBus driver for Maxim MAX34440/MAX34441");
636 MODULE_LICENSE("GPL");
637 MODULE_IMPORT_NS("PMBUS");
638