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