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