Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

hwmon: (pmbus/core) Add support for vid mode detection per page bases

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>

authored by

Vadim Pasternak and committed by
Guenter Roeck
b9fa0a3a d9c8ae69

+47 -40
+1 -1
drivers/hwmon/pmbus/max20751.c
··· 16 16 .pages = 1, 17 17 .format[PSC_VOLTAGE_IN] = linear, 18 18 .format[PSC_VOLTAGE_OUT] = vid, 19 - .vrm_version = vr12, 19 + .vrm_version[0] = vr12, 20 20 .format[PSC_TEMPERATURE] = linear, 21 21 .format[PSC_CURRENT_OUT] = linear, 22 22 .format[PSC_POWER] = linear,
+3 -2
drivers/hwmon/pmbus/pmbus.c
··· 115 115 } 116 116 117 117 if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) { 118 - int vout_mode; 118 + int vout_mode, i; 119 119 120 120 vout_mode = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE); 121 121 if (vout_mode >= 0 && vout_mode != 0xff) { ··· 124 124 break; 125 125 case 1: 126 126 info->format[PSC_VOLTAGE_OUT] = vid; 127 - info->vrm_version = vr11; 127 + for (i = 0; i < info->pages; i++) 128 + info->vrm_version[i] = vr11; 128 129 break; 129 130 case 2: 130 131 info->format[PSC_VOLTAGE_OUT] = direct;
+1 -1
drivers/hwmon/pmbus/pmbus.h
··· 393 393 struct pmbus_driver_info { 394 394 int pages; /* Total number of pages */ 395 395 enum pmbus_data_format format[PSC_NUM_CLASSES]; 396 - enum vrm_version vrm_version; 396 + enum vrm_version vrm_version[PMBUS_PAGES]; /* vrm version per page */ 397 397 /* 398 398 * Support one set of coefficients for each sensor type 399 399 * Used for chips providing data in direct mode.
+1 -1
drivers/hwmon/pmbus/pmbus_core.c
··· 696 696 long val = sensor->data; 697 697 long rv = 0; 698 698 699 - switch (data->info->vrm_version) { 699 + switch (data->info->vrm_version[sensor->page]) { 700 700 case vr11: 701 701 if (val >= 0x02 && val <= 0xb2) 702 702 rv = DIV_ROUND_CLOSEST(160000 - (val - 2) * 625, 100);
+21 -17
drivers/hwmon/pmbus/pxe1610.c
··· 19 19 static int pxe1610_identify(struct i2c_client *client, 20 20 struct pmbus_driver_info *info) 21 21 { 22 - if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) { 23 - u8 vout_mode; 24 - int ret; 22 + int i; 25 23 26 - /* Read the register with VOUT scaling value.*/ 27 - ret = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE); 28 - if (ret < 0) 29 - return ret; 24 + for (i = 0; i < PXE1610_NUM_PAGES; i++) { 25 + if (pmbus_check_byte_register(client, i, PMBUS_VOUT_MODE)) { 26 + u8 vout_mode; 27 + int ret; 30 28 31 - vout_mode = ret & GENMASK(4, 0); 29 + /* Read the register with VOUT scaling value.*/ 30 + ret = pmbus_read_byte_data(client, i, PMBUS_VOUT_MODE); 31 + if (ret < 0) 32 + return ret; 32 33 33 - switch (vout_mode) { 34 - case 1: 35 - info->vrm_version = vr12; 36 - break; 37 - case 2: 38 - info->vrm_version = vr13; 39 - break; 40 - default: 41 - return -ENODEV; 34 + vout_mode = ret & GENMASK(4, 0); 35 + 36 + switch (vout_mode) { 37 + case 1: 38 + info->vrm_version[i] = vr12; 39 + break; 40 + case 2: 41 + info->vrm_version[i] = vr13; 42 + break; 43 + default: 44 + return -ENODEV; 45 + } 42 46 } 43 47 } 44 48
+20 -18
drivers/hwmon/pmbus/tps53679.c
··· 24 24 struct pmbus_driver_info *info) 25 25 { 26 26 u8 vout_params; 27 - int ret; 27 + int i, ret; 28 28 29 - /* Read the register with VOUT scaling value.*/ 30 - ret = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE); 31 - if (ret < 0) 32 - return ret; 29 + for (i = 0; i < TPS53679_PAGE_NUM; i++) { 30 + /* Read the register with VOUT scaling value.*/ 31 + ret = pmbus_read_byte_data(client, i, PMBUS_VOUT_MODE); 32 + if (ret < 0) 33 + return ret; 33 34 34 - vout_params = ret & GENMASK(4, 0); 35 + vout_params = ret & GENMASK(4, 0); 35 36 36 - switch (vout_params) { 37 - case TPS53679_PROT_VR13_10MV: 38 - case TPS53679_PROT_VR12_5_10MV: 39 - info->vrm_version = vr13; 40 - break; 41 - case TPS53679_PROT_VR13_5MV: 42 - case TPS53679_PROT_VR12_5MV: 43 - case TPS53679_PROT_IMVP8_5MV: 44 - info->vrm_version = vr12; 45 - break; 46 - default: 47 - return -EINVAL; 37 + switch (vout_params) { 38 + case TPS53679_PROT_VR13_10MV: 39 + case TPS53679_PROT_VR12_5_10MV: 40 + info->vrm_version[i] = vr13; 41 + break; 42 + case TPS53679_PROT_VR13_5MV: 43 + case TPS53679_PROT_VR12_5MV: 44 + case TPS53679_PROT_IMVP8_5MV: 45 + info->vrm_version[i] = vr12; 46 + break; 47 + default: 48 + return -EINVAL; 49 + } 48 50 } 49 51 50 52 return 0;