xref: /linux/drivers/hwmon/pmbus/max34440.c (revision 3f1c07fc21c68bd3bd2df9d2c9441f6485e934d9)
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