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