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