Commit 9e33c1db authored by Carl Lee's avatar Carl Lee Committed by Guenter Roeck
Browse files

hwmon: (pmbus/mpq8785) fix VOUT_MODE mismatch during identification



When MPQ8785 reports VOUT_MODE as VID mode, mpq8785_identify()
configures the driver for direct mode. The subsequent
pmbus_identify_common() check then fails due to a mismatch
between the reported mode and the configured mode, causing
device initialization to fail.

Override the reported VOUT_MODE to direct mode to keep the
driver configuration consistent with the reported mode and
allow successful device initialization.

This does not change how voltages are interpreted, but avoids
a false identification failure caused by mismatched mode
handling.

Fixes: f20b4a93 ("hwmon: Add driver for MPS MPQ8785 Synchronous Step-Down Converter")
Signed-off-by: default avatarCarl Lee <carl.lee@amd.com>
Link: https://lore.kernel.org/r/20260210-dt-bindings-hwmon-pmbus-mpq8785-add-mpq8786-support-v3-1-84636ccfe76f@amd.com


Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 8bde3e39
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -47,6 +47,33 @@ static int mpq8785_identify(struct i2c_client *client,
	return 0;
};

static int mpq8785_read_byte_data(struct i2c_client *client, int page, int reg)
{
	int ret;

	switch (reg) {
	case PMBUS_VOUT_MODE:
		ret = pmbus_read_byte_data(client, page, reg);
		if (ret < 0)
			return ret;

		if ((ret >> 5) == 1) {
			/*
			 * The MPQ8785 chip reports VOUT_MODE as VID mode, but the driver
			 * treats VID as direct mode. Without this, identification would fail
			 * due to mode mismatch.
			 * This override ensures the reported mode matches the driver
			 * configuration, allowing successful initialization.
			 */
			return PB_VOUT_MODE_DIRECT;
		}

		return ret;
	default:
		return -ENODATA;
	}
}

static int mpm82504_read_word_data(struct i2c_client *client, int page,
				   int phase, int reg)
{
@@ -129,6 +156,7 @@ static int mpq8785_probe(struct i2c_client *client)
		break;
	case mpq8785:
		info->identify = mpq8785_identify;
		info->read_byte_data = mpq8785_read_byte_data;
		break;
	default:
		return -ENODEV;