xref: /openbmc/linux/drivers/hwmon/pmbus/max16601.c (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
12138f885SGuenter Roeck // SPDX-License-Identifier: GPL-2.0
22138f885SGuenter Roeck /*
3a6f7c5d0SGuenter Roeck  * Hardware monitoring driver for Maxim MAX16508, MAX16600, MAX16601,
4a6f7c5d0SGuenter Roeck  * and MAX16602.
52138f885SGuenter Roeck  *
62138f885SGuenter Roeck  * Implementation notes:
72138f885SGuenter Roeck  *
866102281SGuenter Roeck  * This chip series supports two rails, VCORE and VSA. Telemetry information
966102281SGuenter Roeck  * for the two rails is reported in two subsequent I2C addresses. The driver
102138f885SGuenter Roeck  * instantiates a dummy I2C client at the second I2C address to report
112138f885SGuenter Roeck  * information for the VSA rail in a single instance of the driver.
122138f885SGuenter Roeck  * Telemetry for the VSA rail is reported to the PMBus core in PMBus page 2.
132138f885SGuenter Roeck  *
142138f885SGuenter Roeck  * The chip reports input current using two separate methods. The input current
152138f885SGuenter Roeck  * reported with the standard READ_IIN command is derived from the output
162138f885SGuenter Roeck  * current. The first method is reported to the PMBus core with PMBus page 0,
172138f885SGuenter Roeck  * the second method is reported with PMBus page 1.
182138f885SGuenter Roeck  *
192138f885SGuenter Roeck  * The chip supports reading per-phase temperatures and per-phase input/output
202138f885SGuenter Roeck  * currents for VCORE. Telemetry is reported in vendor specific registers.
212138f885SGuenter Roeck  * The driver translates the vendor specific register values to PMBus standard
222138f885SGuenter Roeck  * register values and reports per-phase information in PMBus page 0.
232138f885SGuenter Roeck  *
242138f885SGuenter Roeck  * Copyright 2019, 2020 Google LLC.
252138f885SGuenter Roeck  */
262138f885SGuenter Roeck 
272138f885SGuenter Roeck #include <linux/bits.h>
282138f885SGuenter Roeck #include <linux/i2c.h>
292138f885SGuenter Roeck #include <linux/init.h>
302138f885SGuenter Roeck #include <linux/kernel.h>
312138f885SGuenter Roeck #include <linux/module.h>
322138f885SGuenter Roeck 
332138f885SGuenter Roeck #include "pmbus.h"
342138f885SGuenter Roeck 
35a6f7c5d0SGuenter Roeck enum chips { max16508, max16600, max16601, max16602 };
3666102281SGuenter Roeck 
37220c404dSGuenter Roeck #define REG_DEFAULT_NUM_POP	0xc4
382138f885SGuenter Roeck #define REG_SETPT_DVID		0xd1
392138f885SGuenter Roeck #define  DAC_10MV_MODE		BIT(4)
402138f885SGuenter Roeck #define REG_IOUT_AVG_PK		0xee
412138f885SGuenter Roeck #define REG_IIN_SENSOR		0xf1
422138f885SGuenter Roeck #define REG_TOTAL_INPUT_POWER	0xf2
432138f885SGuenter Roeck #define REG_PHASE_ID		0xf3
442138f885SGuenter Roeck #define  CORE_RAIL_INDICATOR	BIT(7)
452138f885SGuenter Roeck #define REG_PHASE_REPORTING	0xf4
462138f885SGuenter Roeck 
47220c404dSGuenter Roeck #define MAX16601_NUM_PHASES	8
48220c404dSGuenter Roeck 
492138f885SGuenter Roeck struct max16601_data {
5066102281SGuenter Roeck 	enum chips id;
512138f885SGuenter Roeck 	struct pmbus_driver_info info;
522138f885SGuenter Roeck 	struct i2c_client *vsa;
532138f885SGuenter Roeck 	int iout_avg_pkg;
542138f885SGuenter Roeck };
552138f885SGuenter Roeck 
562138f885SGuenter Roeck #define to_max16601_data(x) container_of(x, struct max16601_data, info)
572138f885SGuenter Roeck 
max16601_read_byte(struct i2c_client * client,int page,int reg)582138f885SGuenter Roeck static int max16601_read_byte(struct i2c_client *client, int page, int reg)
592138f885SGuenter Roeck {
602138f885SGuenter Roeck 	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
612138f885SGuenter Roeck 	struct max16601_data *data = to_max16601_data(info);
622138f885SGuenter Roeck 
632138f885SGuenter Roeck 	if (page > 0) {
642138f885SGuenter Roeck 		if (page == 2)	/* VSA */
652138f885SGuenter Roeck 			return i2c_smbus_read_byte_data(data->vsa, reg);
662138f885SGuenter Roeck 		return -EOPNOTSUPP;
672138f885SGuenter Roeck 	}
682138f885SGuenter Roeck 	return -ENODATA;
692138f885SGuenter Roeck }
702138f885SGuenter Roeck 
max16601_read_word(struct i2c_client * client,int page,int phase,int reg)712138f885SGuenter Roeck static int max16601_read_word(struct i2c_client *client, int page, int phase,
722138f885SGuenter Roeck 			      int reg)
732138f885SGuenter Roeck {
742138f885SGuenter Roeck 	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
752138f885SGuenter Roeck 	struct max16601_data *data = to_max16601_data(info);
762138f885SGuenter Roeck 	u8 buf[I2C_SMBUS_BLOCK_MAX + 1];
772138f885SGuenter Roeck 	int ret;
782138f885SGuenter Roeck 
792138f885SGuenter Roeck 	switch (page) {
802138f885SGuenter Roeck 	case 0:		/* VCORE */
812138f885SGuenter Roeck 		if (phase == 0xff)
822138f885SGuenter Roeck 			return -ENODATA;
832138f885SGuenter Roeck 		switch (reg) {
842138f885SGuenter Roeck 		case PMBUS_READ_IIN:
852138f885SGuenter Roeck 		case PMBUS_READ_IOUT:
862138f885SGuenter Roeck 		case PMBUS_READ_TEMPERATURE_1:
872138f885SGuenter Roeck 			ret = i2c_smbus_write_byte_data(client, REG_PHASE_ID,
882138f885SGuenter Roeck 							phase);
892138f885SGuenter Roeck 			if (ret)
902138f885SGuenter Roeck 				return ret;
912138f885SGuenter Roeck 			ret = i2c_smbus_read_block_data(client,
922138f885SGuenter Roeck 							REG_PHASE_REPORTING,
932138f885SGuenter Roeck 							buf);
942138f885SGuenter Roeck 			if (ret < 0)
952138f885SGuenter Roeck 				return ret;
962138f885SGuenter Roeck 			if (ret < 6)
972138f885SGuenter Roeck 				return -EIO;
982138f885SGuenter Roeck 			switch (reg) {
992138f885SGuenter Roeck 			case PMBUS_READ_TEMPERATURE_1:
1002138f885SGuenter Roeck 				return buf[1] << 8 | buf[0];
1012138f885SGuenter Roeck 			case PMBUS_READ_IOUT:
1022138f885SGuenter Roeck 				return buf[3] << 8 | buf[2];
1032138f885SGuenter Roeck 			case PMBUS_READ_IIN:
1042138f885SGuenter Roeck 				return buf[5] << 8 | buf[4];
1052138f885SGuenter Roeck 			default:
1062138f885SGuenter Roeck 				break;
1072138f885SGuenter Roeck 			}
1082138f885SGuenter Roeck 		}
1092138f885SGuenter Roeck 		return -EOPNOTSUPP;
1102138f885SGuenter Roeck 	case 1:		/* VCORE, read IIN/PIN from sensor element */
1112138f885SGuenter Roeck 		switch (reg) {
1122138f885SGuenter Roeck 		case PMBUS_READ_IIN:
1132138f885SGuenter Roeck 			return i2c_smbus_read_word_data(client, REG_IIN_SENSOR);
1142138f885SGuenter Roeck 		case PMBUS_READ_PIN:
1152138f885SGuenter Roeck 			return i2c_smbus_read_word_data(client,
1162138f885SGuenter Roeck 							REG_TOTAL_INPUT_POWER);
1172138f885SGuenter Roeck 		default:
1182138f885SGuenter Roeck 			break;
1192138f885SGuenter Roeck 		}
1202138f885SGuenter Roeck 		return -EOPNOTSUPP;
1212138f885SGuenter Roeck 	case 2:		/* VSA */
1222138f885SGuenter Roeck 		switch (reg) {
1232138f885SGuenter Roeck 		case PMBUS_VIRT_READ_IOUT_MAX:
1242138f885SGuenter Roeck 			ret = i2c_smbus_read_word_data(data->vsa,
1252138f885SGuenter Roeck 						       REG_IOUT_AVG_PK);
1262138f885SGuenter Roeck 			if (ret < 0)
1272138f885SGuenter Roeck 				return ret;
1282138f885SGuenter Roeck 			if (sign_extend32(ret, 10) >
1292138f885SGuenter Roeck 			    sign_extend32(data->iout_avg_pkg, 10))
1302138f885SGuenter Roeck 				data->iout_avg_pkg = ret;
1312138f885SGuenter Roeck 			return data->iout_avg_pkg;
1322138f885SGuenter Roeck 		case PMBUS_VIRT_RESET_IOUT_HISTORY:
1332138f885SGuenter Roeck 			return 0;
1342138f885SGuenter Roeck 		case PMBUS_IOUT_OC_FAULT_LIMIT:
1352138f885SGuenter Roeck 		case PMBUS_IOUT_OC_WARN_LIMIT:
1362138f885SGuenter Roeck 		case PMBUS_OT_FAULT_LIMIT:
1372138f885SGuenter Roeck 		case PMBUS_OT_WARN_LIMIT:
1382138f885SGuenter Roeck 		case PMBUS_READ_IIN:
1392138f885SGuenter Roeck 		case PMBUS_READ_IOUT:
1402138f885SGuenter Roeck 		case PMBUS_READ_TEMPERATURE_1:
1412138f885SGuenter Roeck 		case PMBUS_STATUS_WORD:
1422138f885SGuenter Roeck 			return i2c_smbus_read_word_data(data->vsa, reg);
1432138f885SGuenter Roeck 		default:
1442138f885SGuenter Roeck 			return -EOPNOTSUPP;
1452138f885SGuenter Roeck 		}
1462138f885SGuenter Roeck 	default:
1472138f885SGuenter Roeck 		return -EOPNOTSUPP;
1482138f885SGuenter Roeck 	}
1492138f885SGuenter Roeck }
1502138f885SGuenter Roeck 
max16601_write_byte(struct i2c_client * client,int page,u8 reg)1512138f885SGuenter Roeck static int max16601_write_byte(struct i2c_client *client, int page, u8 reg)
1522138f885SGuenter Roeck {
1532138f885SGuenter Roeck 	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
1542138f885SGuenter Roeck 	struct max16601_data *data = to_max16601_data(info);
1552138f885SGuenter Roeck 
1562138f885SGuenter Roeck 	if (page == 2) {
1572138f885SGuenter Roeck 		if (reg == PMBUS_CLEAR_FAULTS)
1582138f885SGuenter Roeck 			return i2c_smbus_write_byte(data->vsa, reg);
1592138f885SGuenter Roeck 		return -EOPNOTSUPP;
1602138f885SGuenter Roeck 	}
1612138f885SGuenter Roeck 	return -ENODATA;
1622138f885SGuenter Roeck }
1632138f885SGuenter Roeck 
max16601_write_word(struct i2c_client * client,int page,int reg,u16 value)1642138f885SGuenter Roeck static int max16601_write_word(struct i2c_client *client, int page, int reg,
1652138f885SGuenter Roeck 			       u16 value)
1662138f885SGuenter Roeck {
1672138f885SGuenter Roeck 	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
1682138f885SGuenter Roeck 	struct max16601_data *data = to_max16601_data(info);
1692138f885SGuenter Roeck 
1702138f885SGuenter Roeck 	switch (page) {
1712138f885SGuenter Roeck 	case 0:		/* VCORE */
1722138f885SGuenter Roeck 		return -ENODATA;
1732138f885SGuenter Roeck 	case 1:		/* VCORE IIN/PIN from sensor element */
1742138f885SGuenter Roeck 	default:
1752138f885SGuenter Roeck 		return -EOPNOTSUPP;
1762138f885SGuenter Roeck 	case 2:		/* VSA */
1772138f885SGuenter Roeck 		switch (reg) {
1782138f885SGuenter Roeck 		case PMBUS_VIRT_RESET_IOUT_HISTORY:
1792138f885SGuenter Roeck 			data->iout_avg_pkg = 0xfc00;
1802138f885SGuenter Roeck 			return 0;
1812138f885SGuenter Roeck 		case PMBUS_IOUT_OC_FAULT_LIMIT:
1822138f885SGuenter Roeck 		case PMBUS_IOUT_OC_WARN_LIMIT:
1832138f885SGuenter Roeck 		case PMBUS_OT_FAULT_LIMIT:
1842138f885SGuenter Roeck 		case PMBUS_OT_WARN_LIMIT:
1852138f885SGuenter Roeck 			return i2c_smbus_write_word_data(data->vsa, reg, value);
1862138f885SGuenter Roeck 		default:
1872138f885SGuenter Roeck 			return -EOPNOTSUPP;
1882138f885SGuenter Roeck 		}
1892138f885SGuenter Roeck 	}
1902138f885SGuenter Roeck }
1912138f885SGuenter Roeck 
max16601_identify(struct i2c_client * client,struct pmbus_driver_info * info)1922138f885SGuenter Roeck static int max16601_identify(struct i2c_client *client,
1932138f885SGuenter Roeck 			     struct pmbus_driver_info *info)
1942138f885SGuenter Roeck {
19566102281SGuenter Roeck 	struct max16601_data *data = to_max16601_data(info);
1962138f885SGuenter Roeck 	int reg;
1972138f885SGuenter Roeck 
1982138f885SGuenter Roeck 	reg = i2c_smbus_read_byte_data(client, REG_SETPT_DVID);
1992138f885SGuenter Roeck 	if (reg < 0)
2002138f885SGuenter Roeck 		return reg;
2012138f885SGuenter Roeck 	if (reg & DAC_10MV_MODE)
2022138f885SGuenter Roeck 		info->vrm_version[0] = vr13;
2032138f885SGuenter Roeck 	else
2042138f885SGuenter Roeck 		info->vrm_version[0] = vr12;
2052138f885SGuenter Roeck 
206a6f7c5d0SGuenter Roeck 	if (data->id != max16600 && data->id != max16601 && data->id != max16602)
20766102281SGuenter Roeck 		return 0;
20866102281SGuenter Roeck 
209220c404dSGuenter Roeck 	reg = i2c_smbus_read_byte_data(client, REG_DEFAULT_NUM_POP);
210220c404dSGuenter Roeck 	if (reg < 0)
211220c404dSGuenter Roeck 		return reg;
212220c404dSGuenter Roeck 
213220c404dSGuenter Roeck 	/*
214220c404dSGuenter Roeck 	 * If REG_DEFAULT_NUM_POP returns 0, we don't know how many phases
215220c404dSGuenter Roeck 	 * are populated. Stick with the default in that case.
216220c404dSGuenter Roeck 	 */
217220c404dSGuenter Roeck 	reg &= 0x0f;
218220c404dSGuenter Roeck 	if (reg && reg <= MAX16601_NUM_PHASES)
219220c404dSGuenter Roeck 		info->phases[0] = reg;
220220c404dSGuenter Roeck 
2212138f885SGuenter Roeck 	return 0;
2222138f885SGuenter Roeck }
2232138f885SGuenter Roeck 
2242138f885SGuenter Roeck static struct pmbus_driver_info max16601_info = {
2252138f885SGuenter Roeck 	.pages = 3,
2262138f885SGuenter Roeck 	.format[PSC_VOLTAGE_IN] = linear,
2272138f885SGuenter Roeck 	.format[PSC_VOLTAGE_OUT] = vid,
2282138f885SGuenter Roeck 	.format[PSC_CURRENT_IN] = linear,
2292138f885SGuenter Roeck 	.format[PSC_CURRENT_OUT] = linear,
2302138f885SGuenter Roeck 	.format[PSC_TEMPERATURE] = linear,
2312138f885SGuenter Roeck 	.format[PSC_POWER] = linear,
2322138f885SGuenter Roeck 	.func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN | PMBUS_HAVE_PIN |
2332138f885SGuenter Roeck 		PMBUS_HAVE_STATUS_INPUT |
2342138f885SGuenter Roeck 		PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
2352138f885SGuenter Roeck 		PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
2362138f885SGuenter Roeck 		PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP |
2372138f885SGuenter Roeck 		PMBUS_HAVE_POUT | PMBUS_PAGE_VIRTUAL | PMBUS_PHASE_VIRTUAL,
2382138f885SGuenter Roeck 	.func[1] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN | PMBUS_PAGE_VIRTUAL,
2392138f885SGuenter Roeck 	.func[2] = PMBUS_HAVE_IIN | PMBUS_HAVE_STATUS_INPUT |
2402138f885SGuenter Roeck 		PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
2412138f885SGuenter Roeck 		PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP | PMBUS_PAGE_VIRTUAL,
242220c404dSGuenter Roeck 	.phases[0] = MAX16601_NUM_PHASES,
2432138f885SGuenter Roeck 	.pfunc[0] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_TEMP,
2442138f885SGuenter Roeck 	.pfunc[1] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT,
2452138f885SGuenter Roeck 	.pfunc[2] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_TEMP,
2462138f885SGuenter Roeck 	.pfunc[3] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT,
2472138f885SGuenter Roeck 	.pfunc[4] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_TEMP,
2482138f885SGuenter Roeck 	.pfunc[5] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT,
2492138f885SGuenter Roeck 	.pfunc[6] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_TEMP,
2502138f885SGuenter Roeck 	.pfunc[7] = PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT,
2512138f885SGuenter Roeck 	.identify = max16601_identify,
2522138f885SGuenter Roeck 	.read_byte_data = max16601_read_byte,
2532138f885SGuenter Roeck 	.read_word_data = max16601_read_word,
2542138f885SGuenter Roeck 	.write_byte = max16601_write_byte,
2552138f885SGuenter Roeck 	.write_word_data = max16601_write_word,
2562138f885SGuenter Roeck };
2572138f885SGuenter Roeck 
max16601_remove(void * _data)2582138f885SGuenter Roeck static void max16601_remove(void *_data)
2592138f885SGuenter Roeck {
2602138f885SGuenter Roeck 	struct max16601_data *data = _data;
2612138f885SGuenter Roeck 
2622138f885SGuenter Roeck 	i2c_unregister_device(data->vsa);
2632138f885SGuenter Roeck }
2642138f885SGuenter Roeck 
26566102281SGuenter Roeck static const struct i2c_device_id max16601_id[] = {
26666102281SGuenter Roeck 	{"max16508", max16508},
267a6f7c5d0SGuenter Roeck 	{"max16600", max16600},
26866102281SGuenter Roeck 	{"max16601", max16601},
269e5c498ccSAtif Ofluoglu 	{"max16602", max16602},
27066102281SGuenter Roeck 	{}
27166102281SGuenter Roeck };
27266102281SGuenter Roeck MODULE_DEVICE_TABLE(i2c, max16601_id);
27366102281SGuenter Roeck 
max16601_get_id(struct i2c_client * client)27466102281SGuenter Roeck static int max16601_get_id(struct i2c_client *client)
2752138f885SGuenter Roeck {
2762138f885SGuenter Roeck 	struct device *dev = &client->dev;
2772138f885SGuenter Roeck 	u8 buf[I2C_SMBUS_BLOCK_MAX + 1];
27866102281SGuenter Roeck 	enum chips id;
2792138f885SGuenter Roeck 	int ret;
2802138f885SGuenter Roeck 
28166102281SGuenter Roeck 	ret = i2c_smbus_read_block_data(client, PMBUS_IC_DEVICE_ID, buf);
28266102281SGuenter Roeck 	if (ret < 0 || ret < 11)
28366102281SGuenter Roeck 		return -ENODEV;
28466102281SGuenter Roeck 
28566102281SGuenter Roeck 	/*
286*450d1a8cSGuenter Roeck 	 * PMBUS_IC_DEVICE_ID is expected to return MAX1660[012]y.xx",
287*450d1a8cSGuenter Roeck 	 * "MAX16500y.xx".cdxxcccccccccc, or "MAX16508y.xx".
28866102281SGuenter Roeck 	 */
289*450d1a8cSGuenter Roeck 	if (!strncmp(buf, "MAX16500", 8) || !strncmp(buf, "MAX16508", 8)) {
29066102281SGuenter Roeck 		id = max16508;
291a6f7c5d0SGuenter Roeck 	} else if (!strncmp(buf, "MAX16600", 8)) {
292a6f7c5d0SGuenter Roeck 		id = max16600;
29366102281SGuenter Roeck 	} else if (!strncmp(buf, "MAX16601", 8)) {
29466102281SGuenter Roeck 		id = max16601;
295e5c498ccSAtif Ofluoglu 	} else if (!strncmp(buf, "MAX16602", 8)) {
296e5c498ccSAtif Ofluoglu 		id = max16602;
29766102281SGuenter Roeck 	} else {
29866102281SGuenter Roeck 		buf[ret] = '\0';
29966102281SGuenter Roeck 		dev_err(dev, "Unsupported chip '%s'\n", buf);
30066102281SGuenter Roeck 		return -ENODEV;
30166102281SGuenter Roeck 	}
30266102281SGuenter Roeck 	return id;
30366102281SGuenter Roeck }
30466102281SGuenter Roeck 
max16601_probe(struct i2c_client * client)30566102281SGuenter Roeck static int max16601_probe(struct i2c_client *client)
30666102281SGuenter Roeck {
30766102281SGuenter Roeck 	struct device *dev = &client->dev;
30866102281SGuenter Roeck 	const struct i2c_device_id *id;
30966102281SGuenter Roeck 	struct max16601_data *data;
31066102281SGuenter Roeck 	int ret, chip_id;
31166102281SGuenter Roeck 
3122138f885SGuenter Roeck 	if (!i2c_check_functionality(client->adapter,
3132138f885SGuenter Roeck 				     I2C_FUNC_SMBUS_READ_BYTE_DATA |
3142138f885SGuenter Roeck 				     I2C_FUNC_SMBUS_READ_BLOCK_DATA))
3152138f885SGuenter Roeck 		return -ENODEV;
3162138f885SGuenter Roeck 
31766102281SGuenter Roeck 	chip_id = max16601_get_id(client);
31866102281SGuenter Roeck 	if (chip_id < 0)
31966102281SGuenter Roeck 		return chip_id;
3202138f885SGuenter Roeck 
32166102281SGuenter Roeck 	id = i2c_match_id(max16601_id, client);
32266102281SGuenter Roeck 	if (chip_id != id->driver_data)
32366102281SGuenter Roeck 		dev_warn(&client->dev,
32466102281SGuenter Roeck 			 "Device mismatch: Configured %s (%d), detected %d\n",
32566102281SGuenter Roeck 			 id->name, (int) id->driver_data, chip_id);
3262138f885SGuenter Roeck 
3272138f885SGuenter Roeck 	ret = i2c_smbus_read_byte_data(client, REG_PHASE_ID);
3282138f885SGuenter Roeck 	if (ret < 0)
3292138f885SGuenter Roeck 		return ret;
3302138f885SGuenter Roeck 	if (!(ret & CORE_RAIL_INDICATOR)) {
3312138f885SGuenter Roeck 		dev_err(dev,
3322138f885SGuenter Roeck 			"Driver must be instantiated on CORE rail I2C address\n");
3332138f885SGuenter Roeck 		return -ENODEV;
3342138f885SGuenter Roeck 	}
3352138f885SGuenter Roeck 
3362138f885SGuenter Roeck 	data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
3372138f885SGuenter Roeck 	if (!data)
3382138f885SGuenter Roeck 		return -ENOMEM;
3392138f885SGuenter Roeck 
34066102281SGuenter Roeck 	data->id = chip_id;
3412138f885SGuenter Roeck 	data->iout_avg_pkg = 0xfc00;
3422138f885SGuenter Roeck 	data->vsa = i2c_new_dummy_device(client->adapter, client->addr + 1);
3432138f885SGuenter Roeck 	if (IS_ERR(data->vsa)) {
3442138f885SGuenter Roeck 		dev_err(dev, "Failed to register VSA client\n");
3452138f885SGuenter Roeck 		return PTR_ERR(data->vsa);
3462138f885SGuenter Roeck 	}
3472138f885SGuenter Roeck 	ret = devm_add_action_or_reset(dev, max16601_remove, data);
3482138f885SGuenter Roeck 	if (ret)
3492138f885SGuenter Roeck 		return ret;
3502138f885SGuenter Roeck 
3512138f885SGuenter Roeck 	data->info = max16601_info;
3522138f885SGuenter Roeck 
353dd431939SStephen Kitt 	return pmbus_do_probe(client, &data->info);
3542138f885SGuenter Roeck }
3552138f885SGuenter Roeck 
3562138f885SGuenter Roeck static struct i2c_driver max16601_driver = {
3572138f885SGuenter Roeck 	.driver = {
3582138f885SGuenter Roeck 		   .name = "max16601",
3592138f885SGuenter Roeck 		   },
3601975d167SUwe Kleine-König 	.probe = max16601_probe,
3612138f885SGuenter Roeck 	.id_table = max16601_id,
3622138f885SGuenter Roeck };
3632138f885SGuenter Roeck 
3642138f885SGuenter Roeck module_i2c_driver(max16601_driver);
3652138f885SGuenter Roeck 
3662138f885SGuenter Roeck MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
3672138f885SGuenter Roeck MODULE_DESCRIPTION("PMBus driver for Maxim MAX16601");
3682138f885SGuenter Roeck MODULE_LICENSE("GPL v2");
369b94ca77eSGuenter Roeck MODULE_IMPORT_NS(PMBUS);
370