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