]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
hwmon: (pmbus/mpq8785) fix VOUT_MODE mismatch during identification
authorCarl Lee <carl.lee@amd.com>
Tue, 10 Feb 2026 07:26:34 +0000 (15:26 +0800)
committerGuenter Roeck <linux@roeck-us.net>
Tue, 10 Feb 2026 15:14:45 +0000 (07:14 -0800)
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: f20b4a931130c ("hwmon: Add driver for MPS MPQ8785 Synchronous Step-Down Converter")
Signed-off-by: Carl 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: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/pmbus/mpq8785.c

index 1f56aaf4dde807d49c14ac9b372129c040a400ea..87bd039c77b9b3fa846dc0270afba29d91bc5a0f 100644 (file)
@@ -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;