Message ID | 20200113150841.17670-2-vadimp@mellanox.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | hwmon: (pmbus) Add support for vid mode calculation per page bases | expand |
On Mon, Jan 13, 2020 at 03:08:36PM +0000, Vadim Pasternak wrote: > 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> Applied to hwmon-next. Thanks, Guenter > --- > drivers/hwmon/pmbus/max20751.c | 2 +- > drivers/hwmon/pmbus/pmbus.c | 5 +++-- > drivers/hwmon/pmbus/pmbus.h | 2 +- > drivers/hwmon/pmbus/pmbus_core.c | 2 +- > drivers/hwmon/pmbus/pxe1610.c | 44 ++++++++++++++++++++++------------------ > drivers/hwmon/pmbus/tps53679.c | 44 +++++++++++++++++++++------------------- > 6 files changed, 53 insertions(+), 46 deletions(-) > > diff --git a/drivers/hwmon/pmbus/max20751.c b/drivers/hwmon/pmbus/max20751.c > index ee5f0cdbde06..da3c38cb9a5c 100644 > --- a/drivers/hwmon/pmbus/max20751.c > +++ b/drivers/hwmon/pmbus/max20751.c > @@ -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, > diff --git a/drivers/hwmon/pmbus/pmbus.c b/drivers/hwmon/pmbus/pmbus.c > index c0bc43d01018..9109f305ebbb 100644 > --- a/drivers/hwmon/pmbus/pmbus.c > +++ b/drivers/hwmon/pmbus/pmbus.c > @@ -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; > diff --git a/drivers/hwmon/pmbus/pmbus.h b/drivers/hwmon/pmbus/pmbus.h > index d198af3a92b6..2bdebd0ea9c1 100644 > --- a/drivers/hwmon/pmbus/pmbus.h > +++ b/drivers/hwmon/pmbus/pmbus.h > @@ -382,7 +382,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. > diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c > index 8470097907bc..98226e84b351 100644 > --- a/drivers/hwmon/pmbus/pmbus_core.c > +++ b/drivers/hwmon/pmbus/pmbus_core.c > @@ -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); > diff --git a/drivers/hwmon/pmbus/pxe1610.c b/drivers/hwmon/pmbus/pxe1610.c > index ebe3f023f840..517584cff3de 100644 > --- a/drivers/hwmon/pmbus/pxe1610.c > +++ b/drivers/hwmon/pmbus/pxe1610.c > @@ -19,26 +19,30 @@ > 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; > + } > } > } > > diff --git a/drivers/hwmon/pmbus/tps53679.c b/drivers/hwmon/pmbus/tps53679.c > index 86bb3aca09ed..163e8c6aaa8e 100644 > --- a/drivers/hwmon/pmbus/tps53679.c > +++ b/drivers/hwmon/pmbus/tps53679.c > @@ -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;
diff --git a/drivers/hwmon/pmbus/max20751.c b/drivers/hwmon/pmbus/max20751.c index ee5f0cdbde06..da3c38cb9a5c 100644 --- a/drivers/hwmon/pmbus/max20751.c +++ b/drivers/hwmon/pmbus/max20751.c @@ -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, diff --git a/drivers/hwmon/pmbus/pmbus.c b/drivers/hwmon/pmbus/pmbus.c index c0bc43d01018..9109f305ebbb 100644 --- a/drivers/hwmon/pmbus/pmbus.c +++ b/drivers/hwmon/pmbus/pmbus.c @@ -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; diff --git a/drivers/hwmon/pmbus/pmbus.h b/drivers/hwmon/pmbus/pmbus.h index d198af3a92b6..2bdebd0ea9c1 100644 --- a/drivers/hwmon/pmbus/pmbus.h +++ b/drivers/hwmon/pmbus/pmbus.h @@ -382,7 +382,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. diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c index 8470097907bc..98226e84b351 100644 --- a/drivers/hwmon/pmbus/pmbus_core.c +++ b/drivers/hwmon/pmbus/pmbus_core.c @@ -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); diff --git a/drivers/hwmon/pmbus/pxe1610.c b/drivers/hwmon/pmbus/pxe1610.c index ebe3f023f840..517584cff3de 100644 --- a/drivers/hwmon/pmbus/pxe1610.c +++ b/drivers/hwmon/pmbus/pxe1610.c @@ -19,26 +19,30 @@ 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; + } } } diff --git a/drivers/hwmon/pmbus/tps53679.c b/drivers/hwmon/pmbus/tps53679.c index 86bb3aca09ed..163e8c6aaa8e 100644 --- a/drivers/hwmon/pmbus/tps53679.c +++ b/drivers/hwmon/pmbus/tps53679.c @@ -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;
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> --- drivers/hwmon/pmbus/max20751.c | 2 +- drivers/hwmon/pmbus/pmbus.c | 5 +++-- drivers/hwmon/pmbus/pmbus.h | 2 +- drivers/hwmon/pmbus/pmbus_core.c | 2 +- drivers/hwmon/pmbus/pxe1610.c | 44 ++++++++++++++++++++++------------------ drivers/hwmon/pmbus/tps53679.c | 44 +++++++++++++++++++++------------------- 6 files changed, 53 insertions(+), 46 deletions(-)