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