Skip to content

Commit fdf042d

Browse files
committed
Merge tag 'hwmon-for-v6.11-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging
Pull hwmon fix from Guenter Roeck: - Fix clearing status register bits for chips supporting older PMBus versions * tag 'hwmon-for-v6.11-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging: hwmon: (pmbus) Conditionally clear individual status bits for pmbus rev >= 1.2
2 parents 5da0288 + 2047107 commit fdf042d

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

drivers/hwmon/pmbus/pmbus.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,12 @@ enum pmbus_sensor_classes {
418418
enum pmbus_data_format { linear = 0, ieee754, direct, vid };
419419
enum vrm_version { vr11 = 0, vr12, vr13, imvp9, amd625mv };
420420

421+
/* PMBus revision identifiers */
422+
#define PMBUS_REV_10 0x00 /* PMBus revision 1.0 */
423+
#define PMBUS_REV_11 0x11 /* PMBus revision 1.1 */
424+
#define PMBUS_REV_12 0x22 /* PMBus revision 1.2 */
425+
#define PMBUS_REV_13 0x33 /* PMBus revision 1.3 */
426+
421427
struct pmbus_driver_info {
422428
int pages; /* Total number of pages */
423429
u8 phases[PMBUS_PAGES]; /* Number of phases per page */

drivers/hwmon/pmbus/pmbus_core.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ struct pmbus_data {
8585

8686
u32 flags; /* from platform data */
8787

88+
u8 revision; /* The PMBus revision the device is compliant with */
89+
8890
int exponent[PMBUS_PAGES];
8991
/* linear mode: exponent for output voltages */
9092

@@ -1095,9 +1097,14 @@ static int pmbus_get_boolean(struct i2c_client *client, struct pmbus_boolean *b,
10951097

10961098
regval = status & mask;
10971099
if (regval) {
1098-
ret = _pmbus_write_byte_data(client, page, reg, regval);
1099-
if (ret)
1100-
goto unlock;
1100+
if (data->revision >= PMBUS_REV_12) {
1101+
ret = _pmbus_write_byte_data(client, page, reg, regval);
1102+
if (ret)
1103+
goto unlock;
1104+
} else {
1105+
pmbus_clear_fault_page(client, page);
1106+
}
1107+
11011108
}
11021109
if (s1 && s2) {
11031110
s64 v1, v2;
@@ -2640,6 +2647,10 @@ static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data,
26402647
data->flags |= PMBUS_WRITE_PROTECTED | PMBUS_SKIP_STATUS_CHECK;
26412648
}
26422649

2650+
ret = i2c_smbus_read_byte_data(client, PMBUS_REVISION);
2651+
if (ret >= 0)
2652+
data->revision = ret;
2653+
26432654
if (data->info->pages)
26442655
pmbus_clear_faults(client);
26452656
else

0 commit comments

Comments
 (0)