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