aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuenter Roeck <linux@roeck-us.net>2018-02-21 16:09:37 -0500
committerGuenter Roeck <linux@roeck-us.net>2018-03-10 22:00:14 -0500
commit00fd4cfe5bf86cb26ce8623408d2945da92dffcd (patch)
tree9d130d49e72529149238ba0426c4c7e967e37e84
parente2617262f14b8b9eaa44b3dc1bf0cd573fcfc275 (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.c37
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[] = {
419static const u8 NCT6776_REG_PWM_MODE[] = { 0x04, 0, 0, 0, 0, 0 }; 419static const u8 NCT6776_REG_PWM_MODE[] = { 0x04, 0, 0, 0, 0, 0 };
420static const u8 NCT6776_PWM_MODE_MASK[] = { 0x01, 0, 0, 0, 0, 0 }; 420static const u8 NCT6776_PWM_MODE_MASK[] = { 0x01, 0, 0, 0, 0, 0 };
421 421
422static const u16 NCT6776_REG_FAN_MIN[] = { 0x63a, 0x63c, 0x63e, 0x640, 0x642 }; 422static const u16 NCT6776_REG_FAN_MIN[] = {
423static const u16 NCT6776_REG_FAN_PULSES[] = { 0x644, 0x645, 0x646, 0, 0 }; 423 0x63a, 0x63c, 0x63e, 0x640, 0x642, 0x64a };
424static const u16 NCT6776_REG_FAN_PULSES[] = {
425 0x644, 0x645, 0x646, 0x647, 0x648, 0x649 };
424 426
425static const u16 NCT6776_REG_WEIGHT_DUTY_BASE[] = { 427static 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}