File Index
Files and directories
Sign in
FILE

max34440.c

File preview with syntax highlighting.

linux-6.19.14/drivers/hwmon/pmbus/max34440.c C
  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
 18enum 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
 65struct 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
 74static const struct i2c_device_id max34440_id[];
 75
 76static 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
151static 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
207static 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
246static 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
332static 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
622static 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
648static 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};
659MODULE_DEVICE_TABLE(i2c, max34440_id);
660
661/* This is the driver that will be inserted */
662static struct i2c_driver max34440_driver = {
663	.driver = {
664		   .name = "max34440",
665		   },
666	.probe = max34440_probe,
667	.id_table = max34440_id,
668};
669
670module_i2c_driver(max34440_driver);
671
672MODULE_AUTHOR("Guenter Roeck");
673MODULE_DESCRIPTION("PMBus driver for Maxim MAX34440/MAX34441");
674MODULE_LICENSE("GPL");
675MODULE_IMPORT_NS("PMBUS");
~/ Read-only file preview.