hwmon: (pmbus/core) Add support for vid mode detection per page bases
authorVadim Pasternak <vadimp@mellanox.com>
Mon, 13 Jan 2020 15:08:36 +0000 (15:08 +0000)
committerGuenter Roeck <linux@roeck-us.net>
Thu, 23 Jan 2020 21:15:10 +0000 (13:15 -0800)
Add support for VID protocol detection per page bases, instead of
detecting it based on "PMBU_VOUT" readout from page 0 for all the pages
supported by particular device.
The reason that some devices allows to configure different VID modes
per page within the same device.
Patch modifies the field "vrm_version" within the structure
"pmbus_driver_info" to be per page array.

Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>
Link: https://lore.kernel.org/r/20200113150841.17670-2-vadimp@mellanox.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/pmbus/max20751.c
drivers/hwmon/pmbus/pmbus.c
drivers/hwmon/pmbus/pmbus.h
drivers/hwmon/pmbus/pmbus_core.c
drivers/hwmon/pmbus/pxe1610.c
drivers/hwmon/pmbus/tps53679.c

index ee5f0cd..da3c38c 100644 (file)
@@ -16,7 +16,7 @@ static struct pmbus_driver_info max20751_info = {
        .pages = 1,
        .format[PSC_VOLTAGE_IN] = linear,
        .format[PSC_VOLTAGE_OUT] = vid,
-       .vrm_version = vr12,
+       .vrm_version[0] = vr12,
        .format[PSC_TEMPERATURE] = linear,
        .format[PSC_CURRENT_OUT] = linear,
        .format[PSC_POWER] = linear,
index 879aac6..51e8312 100644 (file)
@@ -115,7 +115,7 @@ static int pmbus_identify(struct i2c_client *client,
        }
 
        if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) {
-               int vout_mode;
+               int vout_mode, i;
 
                vout_mode = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE);
                if (vout_mode >= 0 && vout_mode != 0xff) {
@@ -124,7 +124,8 @@ static int pmbus_identify(struct i2c_client *client,
                                break;
                        case 1:
                                info->format[PSC_VOLTAGE_OUT] = vid;
-                               info->vrm_version = vr11;
+                               for (i = 0; i < info->pages; i++)
+                                       info->vrm_version[i] = vr11;
                                break;
                        case 2:
                                info->format[PSC_VOLTAGE_OUT] = direct;
index 90d6c9e..423c146 100644 (file)
@@ -393,7 +393,7 @@ enum vrm_version { vr11 = 0, vr12, vr13 };
 struct pmbus_driver_info {
        int pages;              /* Total number of pages */
        enum pmbus_data_format format[PSC_NUM_CLASSES];
-       enum vrm_version vrm_version;
+       enum vrm_version vrm_version[PMBUS_PAGES]; /* vrm version per page */
        /*
         * Support one set of coefficients for each sensor type
         * Used for chips providing data in direct mode.
index 2c196ed..5ba92d1 100644 (file)
@@ -696,7 +696,7 @@ static long pmbus_reg2data_vid(struct pmbus_data *data,
        long val = sensor->data;
        long rv = 0;
 
-       switch (data->info->vrm_version) {
+       switch (data->info->vrm_version[sensor->page]) {
        case vr11:
                if (val >= 0x02 && val <= 0xb2)
                        rv = DIV_ROUND_CLOSEST(160000 - (val - 2) * 625, 100);
index ebe3f02..517584c 100644 (file)
 static int pxe1610_identify(struct i2c_client *client,
                             struct pmbus_driver_info *info)
 {
-       if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) {
-               u8 vout_mode;
-               int ret;
-
-               /* Read the register with VOUT scaling value.*/
-               ret = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE);
-               if (ret < 0)
-                       return ret;
-
-               vout_mode = ret & GENMASK(4, 0);
-
-               switch (vout_mode) {
-               case 1:
-                       info->vrm_version = vr12;
-                       break;
-               case 2:
-                       info->vrm_version = vr13;
-                       break;
-               default:
-                       return -ENODEV;
+       int i;
+
+       for (i = 0; i < PXE1610_NUM_PAGES; i++) {
+               if (pmbus_check_byte_register(client, i, PMBUS_VOUT_MODE)) {
+                       u8 vout_mode;
+                       int ret;
+
+                       /* Read the register with VOUT scaling value.*/
+                       ret = pmbus_read_byte_data(client, i, PMBUS_VOUT_MODE);
+                       if (ret < 0)
+                               return ret;
+
+                       vout_mode = ret & GENMASK(4, 0);
+
+                       switch (vout_mode) {
+                       case 1:
+                               info->vrm_version[i] = vr12;
+                               break;
+                       case 2:
+                               info->vrm_version[i] = vr13;
+                               break;
+                       default:
+                               return -ENODEV;
+                       }
                }
        }
 
index 86bb3ac..163e8c6 100644 (file)
@@ -24,27 +24,29 @@ static int tps53679_identify(struct i2c_client *client,
                             struct pmbus_driver_info *info)
 {
        u8 vout_params;
-       int ret;
-
-       /* Read the register with VOUT scaling value.*/
-       ret = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE);
-       if (ret < 0)
-               return ret;
-
-       vout_params = ret & GENMASK(4, 0);
-
-       switch (vout_params) {
-       case TPS53679_PROT_VR13_10MV:
-       case TPS53679_PROT_VR12_5_10MV:
-               info->vrm_version = vr13;
-               break;
-       case TPS53679_PROT_VR13_5MV:
-       case TPS53679_PROT_VR12_5MV:
-       case TPS53679_PROT_IMVP8_5MV:
-               info->vrm_version = vr12;
-               break;
-       default:
-               return -EINVAL;
+       int i, ret;
+
+       for (i = 0; i < TPS53679_PAGE_NUM; i++) {
+               /* Read the register with VOUT scaling value.*/
+               ret = pmbus_read_byte_data(client, i, PMBUS_VOUT_MODE);
+               if (ret < 0)
+                       return ret;
+
+               vout_params = ret & GENMASK(4, 0);
+
+               switch (vout_params) {
+               case TPS53679_PROT_VR13_10MV:
+               case TPS53679_PROT_VR12_5_10MV:
+                       info->vrm_version[i] = vr13;
+                       break;
+               case TPS53679_PROT_VR13_5MV:
+               case TPS53679_PROT_VR12_5MV:
+               case TPS53679_PROT_IMVP8_5MV:
+                       info->vrm_version[i] = vr12;
+                       break;
+               default:
+                       return -EINVAL;
+               }
        }
 
        return 0;