diff options
-rw-r--r-- | drivers/hwmon/pmbus/pmbus.c | 1 | ||||
-rw-r--r-- | drivers/hwmon/pmbus/pmbus.h | 2 | ||||
-rw-r--r-- | drivers/hwmon/pmbus/pmbus_core.c | 16 |
3 files changed, 15 insertions, 4 deletions
diff --git a/drivers/hwmon/pmbus/pmbus.c b/drivers/hwmon/pmbus/pmbus.c index 554d0249dcde..bbfa35d82e42 100644 --- a/drivers/hwmon/pmbus/pmbus.c +++ b/drivers/hwmon/pmbus/pmbus.c | |||
@@ -129,6 +129,7 @@ static int pmbus_identify(struct i2c_client *client, | |||
129 | break; | 129 | break; |
130 | case 1: | 130 | case 1: |
131 | info->format[PSC_VOLTAGE_OUT] = vid; | 131 | info->format[PSC_VOLTAGE_OUT] = vid; |
132 | info->vrm_version = vr11; | ||
132 | break; | 133 | break; |
133 | case 2: | 134 | case 2: |
134 | info->format[PSC_VOLTAGE_OUT] = direct; | 135 | info->format[PSC_VOLTAGE_OUT] = direct; |
diff --git a/drivers/hwmon/pmbus/pmbus.h b/drivers/hwmon/pmbus/pmbus.h index 2427f6e7c641..eece5f5e2282 100644 --- a/drivers/hwmon/pmbus/pmbus.h +++ b/drivers/hwmon/pmbus/pmbus.h | |||
@@ -338,10 +338,12 @@ enum pmbus_sensor_classes { | |||
338 | #define PMBUS_HAVE_STATUS_VMON (1 << 19) | 338 | #define PMBUS_HAVE_STATUS_VMON (1 << 19) |
339 | 339 | ||
340 | enum pmbus_data_format { linear = 0, direct, vid }; | 340 | enum pmbus_data_format { linear = 0, direct, vid }; |
341 | enum vrm_version { vr11 = 0, vr12 }; | ||
341 | 342 | ||
342 | struct pmbus_driver_info { | 343 | struct pmbus_driver_info { |
343 | int pages; /* Total number of pages */ | 344 | int pages; /* Total number of pages */ |
344 | enum pmbus_data_format format[PSC_NUM_CLASSES]; | 345 | enum pmbus_data_format format[PSC_NUM_CLASSES]; |
346 | enum vrm_version vrm_version; | ||
345 | /* | 347 | /* |
346 | * Support one set of coefficients for each sensor type | 348 | * Support one set of coefficients for each sensor type |
347 | * Used for chips providing data in direct mode. | 349 | * 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 306a1b175557..398198140b81 100644 --- a/drivers/hwmon/pmbus/pmbus_core.c +++ b/drivers/hwmon/pmbus/pmbus_core.c | |||
@@ -515,16 +515,24 @@ static long pmbus_reg2data_direct(struct pmbus_data *data, | |||
515 | /* | 515 | /* |
516 | * Convert VID sensor values to milli- or micro-units | 516 | * Convert VID sensor values to milli- or micro-units |
517 | * depending on sensor type. | 517 | * depending on sensor type. |
518 | * We currently only support VR11. | ||
519 | */ | 518 | */ |
520 | static long pmbus_reg2data_vid(struct pmbus_data *data, | 519 | static long pmbus_reg2data_vid(struct pmbus_data *data, |
521 | struct pmbus_sensor *sensor) | 520 | struct pmbus_sensor *sensor) |
522 | { | 521 | { |
523 | long val = sensor->data; | 522 | long val = sensor->data; |
523 | long rv = 0; | ||
524 | 524 | ||
525 | if (val < 0x02 || val > 0xb2) | 525 | switch (data->info->vrm_version) { |
526 | return 0; | 526 | case vr11: |
527 | return DIV_ROUND_CLOSEST(160000 - (val - 2) * 625, 100); | 527 | if (val >= 0x02 && val <= 0xb2) |
528 | rv = DIV_ROUND_CLOSEST(160000 - (val - 2) * 625, 100); | ||
529 | break; | ||
530 | case vr12: | ||
531 | if (val >= 0x01) | ||
532 | rv = 250 + (val - 1) * 5; | ||
533 | break; | ||
534 | } | ||
535 | return rv; | ||
528 | } | 536 | } |
529 | 537 | ||
530 | static long pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor) | 538 | static long pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor) |