diff options
author | Guenter Roeck <linux@roeck-us.net> | 2018-02-21 16:09:37 -0500 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2018-03-10 22:00:14 -0500 |
commit | 00fd4cfe5bf86cb26ce8623408d2945da92dffcd (patch) | |
tree | 9d130d49e72529149238ba0426c4c7e967e37e84 | |
parent | e2617262f14b8b9eaa44b3dc1bf0cd573fcfc275 (diff) |
hwmon: (nct6775) Improve fan6/pwm6 support
Improve fan6/pwm6 detection on NCT6795D. Add support for fan pulses
for fans 4..6 and fan min limits for fan6.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
-rw-r--r-- | drivers/hwmon/nct6775.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/drivers/hwmon/nct6775.c b/drivers/hwmon/nct6775.c index 01d0225cd92b..cebd716ddc91 100644 --- a/drivers/hwmon/nct6775.c +++ b/drivers/hwmon/nct6775.c | |||
@@ -419,8 +419,10 @@ static const u16 NCT6776_REG_TOLERANCE_H[] = { | |||
419 | static const u8 NCT6776_REG_PWM_MODE[] = { 0x04, 0, 0, 0, 0, 0 }; | 419 | static const u8 NCT6776_REG_PWM_MODE[] = { 0x04, 0, 0, 0, 0, 0 }; |
420 | static const u8 NCT6776_PWM_MODE_MASK[] = { 0x01, 0, 0, 0, 0, 0 }; | 420 | static const u8 NCT6776_PWM_MODE_MASK[] = { 0x01, 0, 0, 0, 0, 0 }; |
421 | 421 | ||
422 | static const u16 NCT6776_REG_FAN_MIN[] = { 0x63a, 0x63c, 0x63e, 0x640, 0x642 }; | 422 | static const u16 NCT6776_REG_FAN_MIN[] = { |
423 | static const u16 NCT6776_REG_FAN_PULSES[] = { 0x644, 0x645, 0x646, 0, 0 }; | 423 | 0x63a, 0x63c, 0x63e, 0x640, 0x642, 0x64a }; |
424 | static const u16 NCT6776_REG_FAN_PULSES[] = { | ||
425 | 0x644, 0x645, 0x646, 0x647, 0x648, 0x649 }; | ||
424 | 426 | ||
425 | static const u16 NCT6776_REG_WEIGHT_DUTY_BASE[] = { | 427 | static const u16 NCT6776_REG_WEIGHT_DUTY_BASE[] = { |
426 | 0x13e, 0x23e, 0x33e, 0x83e, 0x93e, 0xa3e }; | 428 | 0x13e, 0x23e, 0x33e, 0x83e, 0x93e, 0xa3e }; |
@@ -1235,7 +1237,7 @@ static bool is_word_sized(struct nct6775_data *data, u16 reg) | |||
1235 | ((reg & 0xfff0) == 0x4b0 && (reg & 0x000f) < 0x0b) || | 1237 | ((reg & 0xfff0) == 0x4b0 && (reg & 0x000f) < 0x0b) || |
1236 | reg == 0x402 || | 1238 | reg == 0x402 || |
1237 | reg == 0x63a || reg == 0x63c || reg == 0x63e || | 1239 | reg == 0x63a || reg == 0x63c || reg == 0x63e || |
1238 | reg == 0x640 || reg == 0x642 || | 1240 | reg == 0x640 || reg == 0x642 || reg == 0x64a || |
1239 | reg == 0x73 || reg == 0x75 || reg == 0x77 || reg == 0x79 || | 1241 | reg == 0x73 || reg == 0x75 || reg == 0x77 || reg == 0x79 || |
1240 | reg == 0x7b || reg == 0x7d; | 1242 | reg == 0x7b || reg == 0x7d; |
1241 | } | 1243 | } |
@@ -3439,7 +3441,8 @@ nct6775_check_fan_inputs(struct nct6775_data *data) | |||
3439 | pwm5pin = false; | 3441 | pwm5pin = false; |
3440 | pwm6pin = false; | 3442 | pwm6pin = false; |
3441 | } else { /* NCT6779D, NCT6791D, NCT6792D, NCT6793D, or NCT6795D */ | 3443 | } else { /* NCT6779D, NCT6791D, NCT6792D, NCT6793D, or NCT6795D */ |
3442 | int regval_1b, regval_2a, regval_eb; | 3444 | int regval_1b, regval_2a, regval_2f, regval_eb; |
3445 | bool dsw_en; | ||
3443 | 3446 | ||
3444 | regval = superio_inb(sioreg, 0x1c); | 3447 | regval = superio_inb(sioreg, 0x1c); |
3445 | 3448 | ||
@@ -3462,14 +3465,22 @@ nct6775_check_fan_inputs(struct nct6775_data *data) | |||
3462 | case nct6795: | 3465 | case nct6795: |
3463 | regval_1b = superio_inb(sioreg, 0x1b); | 3466 | regval_1b = superio_inb(sioreg, 0x1b); |
3464 | regval_2a = superio_inb(sioreg, 0x2a); | 3467 | regval_2a = superio_inb(sioreg, 0x2a); |
3468 | regval_2f = superio_inb(sioreg, 0x2f); | ||
3469 | dsw_en = regval_2f & BIT(3); | ||
3465 | 3470 | ||
3466 | if (!pwm5pin) | 3471 | if (!pwm5pin) |
3467 | pwm5pin = regval & BIT(7); | 3472 | pwm5pin = regval & BIT(7); |
3468 | fan6pin = regval & BIT(1); | 3473 | |
3469 | pwm6pin = regval & BIT(0); | ||
3470 | if (!fan5pin) | 3474 | if (!fan5pin) |
3471 | fan5pin = regval_1b & BIT(5); | 3475 | fan5pin = regval_1b & BIT(5); |
3472 | 3476 | ||
3477 | fan6pin = false; | ||
3478 | pwm6pin = false; | ||
3479 | if (!dsw_en) { | ||
3480 | fan6pin = regval & BIT(1); | ||
3481 | pwm6pin = regval & BIT(0); | ||
3482 | } | ||
3483 | |||
3473 | superio_select(sioreg, NCT6775_LD_12); | 3484 | superio_select(sioreg, NCT6775_LD_12); |
3474 | regval_eb = superio_inb(sioreg, 0xeb); | 3485 | regval_eb = superio_inb(sioreg, 0xeb); |
3475 | if (!fan5pin) | 3486 | if (!fan5pin) |
@@ -3481,6 +3492,18 @@ nct6775_check_fan_inputs(struct nct6775_data *data) | |||
3481 | fan6pin = regval_eb & BIT(3); | 3492 | fan6pin = regval_eb & BIT(3); |
3482 | if (!pwm6pin) | 3493 | if (!pwm6pin) |
3483 | pwm6pin = regval_eb & BIT(2); | 3494 | pwm6pin = regval_eb & BIT(2); |
3495 | |||
3496 | if (data->kind == nct6795) { | ||
3497 | int regval_ed = superio_inb(sioreg, 0xed); | ||
3498 | |||
3499 | if (!fan6pin) | ||
3500 | fan6pin = (regval_2a & BIT(4)) && | ||
3501 | (!dsw_en || | ||
3502 | (dsw_en && (regval_ed & BIT(4)))); | ||
3503 | if (!pwm6pin) | ||
3504 | pwm6pin = (regval_2a & BIT(3)) && | ||
3505 | (regval_ed & BIT(2)); | ||
3506 | } | ||
3484 | break; | 3507 | break; |
3485 | default: /* NCT6779D */ | 3508 | default: /* NCT6779D */ |
3486 | fan6pin = false; | 3509 | fan6pin = false; |
@@ -3495,7 +3518,7 @@ nct6775_check_fan_inputs(struct nct6775_data *data) | |||
3495 | data->has_fan = 0x03 | (fan3pin << 2) | (fan4pin << 3) | | 3518 | data->has_fan = 0x03 | (fan3pin << 2) | (fan4pin << 3) | |
3496 | (fan5pin << 4) | (fan6pin << 5); | 3519 | (fan5pin << 4) | (fan6pin << 5); |
3497 | data->has_fan_min = 0x03 | (fan3pin << 2) | (fan4min << 3) | | 3520 | data->has_fan_min = 0x03 | (fan3pin << 2) | (fan4min << 3) | |
3498 | (fan5pin << 4); | 3521 | (fan5pin << 4) | (fan6pin << 5); |
3499 | data->has_pwm = 0x03 | (pwm3pin << 2) | (pwm4pin << 3) | | 3522 | data->has_pwm = 0x03 | (pwm3pin << 2) | (pwm4pin << 3) | |
3500 | (pwm5pin << 4) | (pwm6pin << 5); | 3523 | (pwm5pin << 4) | (pwm6pin << 5); |
3501 | } | 3524 | } |