Various bug fixes for nct6775 driver

-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABAgAGBQJbon6nAAoJEMsfJm/On5mByxoP/3Z5fQWqWKZHlOYgej2xPR8I
 9gMTwCca95awTgD/0toiQLOlwfevIwbdk0MWJSkr3fIqoFY/hOwwvF3mqOo/i6oN
 f8/oFTE0IKoaW0glNWkKK+kZb3d1WopJ1SP9is6KGYhx3b462mS0/i/on6VgQ1Yv
 HitLKs+UF+8rEDnXRMECnbg3gw8lznoxExOSIsxW3m8uWIgIQECdN1DHDza9QYux
 4CLf1gHhk4q4eCgZCRXVPM4NeQlXrPCevnTbLkBUfqR1lCNohqJf2oNcDZYLlCYs
 uQAcByLkfPcifP7a9zMB7QVsWrZmOFgiTIS+Ct9d1XhA2n1+hUA+W3up79JXpr/n
 GS2V1b9KktL5XyRIUmRR5OoV09x2eAuuwLfq/d/Ff7z2KT+gZHdJqz1II0lzivtb
 xgNql/JBjmQvu1fX+g3PYqtXY/BVyNtUMWOtNnfgTBX39Z7L28P1HPCdRjglVKZi
 JVGD5G8XYhVfB3RMSE7b19lFOeRDvnoCNCiU4fmKPRI8IeT6aQUT5sOwjkxtrKkP
 pmSaHqYgawWvTojpD9DrhwHR77WIi1n482OFwB5XjCxc70LaJ0RC0wtRCPhQ1HtB
 cOY/JUt0biqHoX3UD1tcjMl+x3sQ23TViI5hik3iOJ7rwg6gwjL/Mj+LzJRKPfZ0
 906DisKO8TUM/tJlULx9
 =rHpH
 -----END PGP SIGNATURE-----

Merge tag 'hwmon-for-linus-v4.19-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging

Guenter writes:
   "Various bug fixes for nct6775 driver"
This commit is contained in:
Greg Kroah-Hartman 2018-09-19 22:59:30 +02:00
commit eb9a29f9e5
1 changed files with 49 additions and 23 deletions

View File

@ -207,8 +207,6 @@ superio_exit(int ioreg)
#define NUM_FAN 7 #define NUM_FAN 7
#define TEMP_SOURCE_VIRTUAL 0x1f
/* Common and NCT6775 specific data */ /* Common and NCT6775 specific data */
/* Voltage min/max registers for nr=7..14 are in bank 5 */ /* Voltage min/max registers for nr=7..14 are in bank 5 */
@ -299,8 +297,9 @@ static const u16 NCT6775_REG_PWM_READ[] = {
static const u16 NCT6775_REG_FAN[] = { 0x630, 0x632, 0x634, 0x636, 0x638 }; static const u16 NCT6775_REG_FAN[] = { 0x630, 0x632, 0x634, 0x636, 0x638 };
static const u16 NCT6775_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d }; static const u16 NCT6775_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d };
static const u16 NCT6775_REG_FAN_PULSES[] = { 0x641, 0x642, 0x643, 0x644, 0 }; static const u16 NCT6775_REG_FAN_PULSES[NUM_FAN] = {
static const u16 NCT6775_FAN_PULSE_SHIFT[] = { 0, 0, 0, 0, 0, 0 }; 0x641, 0x642, 0x643, 0x644 };
static const u16 NCT6775_FAN_PULSE_SHIFT[NUM_FAN] = { };
static const u16 NCT6775_REG_TEMP[] = { static const u16 NCT6775_REG_TEMP[] = {
0x27, 0x150, 0x250, 0x62b, 0x62c, 0x62d }; 0x27, 0x150, 0x250, 0x62b, 0x62c, 0x62d };
@ -373,6 +372,7 @@ static const char *const nct6775_temp_label[] = {
}; };
#define NCT6775_TEMP_MASK 0x001ffffe #define NCT6775_TEMP_MASK 0x001ffffe
#define NCT6775_VIRT_TEMP_MASK 0x00000000
static const u16 NCT6775_REG_TEMP_ALTERNATE[32] = { static const u16 NCT6775_REG_TEMP_ALTERNATE[32] = {
[13] = 0x661, [13] = 0x661,
@ -425,8 +425,8 @@ static const u8 NCT6776_PWM_MODE_MASK[] = { 0x01, 0, 0, 0, 0, 0 };
static const u16 NCT6776_REG_FAN_MIN[] = { static const u16 NCT6776_REG_FAN_MIN[] = {
0x63a, 0x63c, 0x63e, 0x640, 0x642, 0x64a, 0x64c }; 0x63a, 0x63c, 0x63e, 0x640, 0x642, 0x64a, 0x64c };
static const u16 NCT6776_REG_FAN_PULSES[] = { static const u16 NCT6776_REG_FAN_PULSES[NUM_FAN] = {
0x644, 0x645, 0x646, 0x647, 0x648, 0x649, 0 }; 0x644, 0x645, 0x646, 0x647, 0x648, 0x649 };
static const u16 NCT6776_REG_WEIGHT_DUTY_BASE[] = { static const u16 NCT6776_REG_WEIGHT_DUTY_BASE[] = {
0x13e, 0x23e, 0x33e, 0x83e, 0x93e, 0xa3e }; 0x13e, 0x23e, 0x33e, 0x83e, 0x93e, 0xa3e };
@ -461,6 +461,7 @@ static const char *const nct6776_temp_label[] = {
}; };
#define NCT6776_TEMP_MASK 0x007ffffe #define NCT6776_TEMP_MASK 0x007ffffe
#define NCT6776_VIRT_TEMP_MASK 0x00000000
static const u16 NCT6776_REG_TEMP_ALTERNATE[32] = { static const u16 NCT6776_REG_TEMP_ALTERNATE[32] = {
[14] = 0x401, [14] = 0x401,
@ -501,9 +502,9 @@ static const s8 NCT6779_BEEP_BITS[] = {
30, 31 }; /* intrusion0, intrusion1 */ 30, 31 }; /* intrusion0, intrusion1 */
static const u16 NCT6779_REG_FAN[] = { static const u16 NCT6779_REG_FAN[] = {
0x4b0, 0x4b2, 0x4b4, 0x4b6, 0x4b8, 0x4ba, 0x660 }; 0x4c0, 0x4c2, 0x4c4, 0x4c6, 0x4c8, 0x4ca, 0x4ce };
static const u16 NCT6779_REG_FAN_PULSES[] = { static const u16 NCT6779_REG_FAN_PULSES[NUM_FAN] = {
0x644, 0x645, 0x646, 0x647, 0x648, 0x649, 0 }; 0x644, 0x645, 0x646, 0x647, 0x648, 0x649 };
static const u16 NCT6779_REG_CRITICAL_PWM_ENABLE[] = { static const u16 NCT6779_REG_CRITICAL_PWM_ENABLE[] = {
0x136, 0x236, 0x336, 0x836, 0x936, 0xa36, 0xb36 }; 0x136, 0x236, 0x336, 0x836, 0x936, 0xa36, 0xb36 };
@ -559,7 +560,9 @@ static const char *const nct6779_temp_label[] = {
}; };
#define NCT6779_TEMP_MASK 0x07ffff7e #define NCT6779_TEMP_MASK 0x07ffff7e
#define NCT6779_VIRT_TEMP_MASK 0x00000000
#define NCT6791_TEMP_MASK 0x87ffff7e #define NCT6791_TEMP_MASK 0x87ffff7e
#define NCT6791_VIRT_TEMP_MASK 0x80000000
static const u16 NCT6779_REG_TEMP_ALTERNATE[32] static const u16 NCT6779_REG_TEMP_ALTERNATE[32]
= { 0x490, 0x491, 0x492, 0x493, 0x494, 0x495, 0, 0, = { 0x490, 0x491, 0x492, 0x493, 0x494, 0x495, 0, 0,
@ -638,6 +641,7 @@ static const char *const nct6792_temp_label[] = {
}; };
#define NCT6792_TEMP_MASK 0x9fffff7e #define NCT6792_TEMP_MASK 0x9fffff7e
#define NCT6792_VIRT_TEMP_MASK 0x80000000
static const char *const nct6793_temp_label[] = { static const char *const nct6793_temp_label[] = {
"", "",
@ -675,6 +679,7 @@ static const char *const nct6793_temp_label[] = {
}; };
#define NCT6793_TEMP_MASK 0xbfff037e #define NCT6793_TEMP_MASK 0xbfff037e
#define NCT6793_VIRT_TEMP_MASK 0x80000000
static const char *const nct6795_temp_label[] = { static const char *const nct6795_temp_label[] = {
"", "",
@ -712,6 +717,7 @@ static const char *const nct6795_temp_label[] = {
}; };
#define NCT6795_TEMP_MASK 0xbfffff7e #define NCT6795_TEMP_MASK 0xbfffff7e
#define NCT6795_VIRT_TEMP_MASK 0x80000000
static const char *const nct6796_temp_label[] = { static const char *const nct6796_temp_label[] = {
"", "",
@ -724,8 +730,8 @@ static const char *const nct6796_temp_label[] = {
"AUXTIN4", "AUXTIN4",
"SMBUSMASTER 0", "SMBUSMASTER 0",
"SMBUSMASTER 1", "SMBUSMASTER 1",
"", "Virtual_TEMP",
"", "Virtual_TEMP",
"", "",
"", "",
"", "",
@ -748,7 +754,8 @@ static const char *const nct6796_temp_label[] = {
"Virtual_TEMP" "Virtual_TEMP"
}; };
#define NCT6796_TEMP_MASK 0xbfff03fe #define NCT6796_TEMP_MASK 0xbfff0ffe
#define NCT6796_VIRT_TEMP_MASK 0x80000c00
/* NCT6102D/NCT6106D specific data */ /* NCT6102D/NCT6106D specific data */
@ -779,8 +786,8 @@ static const u16 NCT6106_REG_TEMP_CONFIG[] = {
static const u16 NCT6106_REG_FAN[] = { 0x20, 0x22, 0x24 }; static const u16 NCT6106_REG_FAN[] = { 0x20, 0x22, 0x24 };
static const u16 NCT6106_REG_FAN_MIN[] = { 0xe0, 0xe2, 0xe4 }; static const u16 NCT6106_REG_FAN_MIN[] = { 0xe0, 0xe2, 0xe4 };
static const u16 NCT6106_REG_FAN_PULSES[] = { 0xf6, 0xf6, 0xf6, 0, 0 }; static const u16 NCT6106_REG_FAN_PULSES[] = { 0xf6, 0xf6, 0xf6 };
static const u16 NCT6106_FAN_PULSE_SHIFT[] = { 0, 2, 4, 0, 0 }; static const u16 NCT6106_FAN_PULSE_SHIFT[] = { 0, 2, 4 };
static const u8 NCT6106_REG_PWM_MODE[] = { 0xf3, 0xf3, 0xf3 }; static const u8 NCT6106_REG_PWM_MODE[] = { 0xf3, 0xf3, 0xf3 };
static const u8 NCT6106_PWM_MODE_MASK[] = { 0x01, 0x02, 0x04 }; static const u8 NCT6106_PWM_MODE_MASK[] = { 0x01, 0x02, 0x04 };
@ -917,6 +924,11 @@ static unsigned int fan_from_reg16(u16 reg, unsigned int divreg)
return 1350000U / (reg << divreg); return 1350000U / (reg << divreg);
} }
static unsigned int fan_from_reg_rpm(u16 reg, unsigned int divreg)
{
return reg;
}
static u16 fan_to_reg(u32 fan, unsigned int divreg) static u16 fan_to_reg(u32 fan, unsigned int divreg)
{ {
if (!fan) if (!fan)
@ -969,6 +981,7 @@ struct nct6775_data {
u16 reg_temp_config[NUM_TEMP]; u16 reg_temp_config[NUM_TEMP];
const char * const *temp_label; const char * const *temp_label;
u32 temp_mask; u32 temp_mask;
u32 virt_temp_mask;
u16 REG_CONFIG; u16 REG_CONFIG;
u16 REG_VBAT; u16 REG_VBAT;
@ -1276,11 +1289,11 @@ static bool is_word_sized(struct nct6775_data *data, u16 reg)
case nct6795: case nct6795:
case nct6796: case nct6796:
return reg == 0x150 || reg == 0x153 || reg == 0x155 || return reg == 0x150 || reg == 0x153 || reg == 0x155 ||
((reg & 0xfff0) == 0x4b0 && (reg & 0x000f) < 0x0b) || (reg & 0xfff0) == 0x4c0 ||
reg == 0x402 || reg == 0x402 ||
reg == 0x63a || reg == 0x63c || reg == 0x63e || reg == 0x63a || reg == 0x63c || reg == 0x63e ||
reg == 0x640 || reg == 0x642 || reg == 0x64a || reg == 0x640 || reg == 0x642 || reg == 0x64a ||
reg == 0x64c || reg == 0x660 || reg == 0x64c ||
reg == 0x73 || reg == 0x75 || reg == 0x77 || reg == 0x79 || reg == 0x73 || reg == 0x75 || reg == 0x77 || reg == 0x79 ||
reg == 0x7b || reg == 0x7d; reg == 0x7b || reg == 0x7d;
} }
@ -1558,7 +1571,7 @@ static void nct6775_update_pwm(struct device *dev)
reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[i]); reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[i]);
data->pwm_weight_temp_sel[i] = reg & 0x1f; data->pwm_weight_temp_sel[i] = reg & 0x1f;
/* If weight is disabled, report weight source as 0 */ /* If weight is disabled, report weight source as 0 */
if (j == 1 && !(reg & 0x80)) if (!(reg & 0x80))
data->pwm_weight_temp_sel[i] = 0; data->pwm_weight_temp_sel[i] = 0;
/* Weight temp data */ /* Weight temp data */
@ -1682,9 +1695,13 @@ static struct nct6775_data *nct6775_update_device(struct device *dev)
if (data->has_fan_min & BIT(i)) if (data->has_fan_min & BIT(i))
data->fan_min[i] = nct6775_read_value(data, data->fan_min[i] = nct6775_read_value(data,
data->REG_FAN_MIN[i]); data->REG_FAN_MIN[i]);
data->fan_pulses[i] =
(nct6775_read_value(data, data->REG_FAN_PULSES[i]) if (data->REG_FAN_PULSES[i]) {
>> data->FAN_PULSE_SHIFT[i]) & 0x03; data->fan_pulses[i] =
(nct6775_read_value(data,
data->REG_FAN_PULSES[i])
>> data->FAN_PULSE_SHIFT[i]) & 0x03;
}
nct6775_select_fan_div(dev, data, i, reg); nct6775_select_fan_div(dev, data, i, reg);
} }
@ -3639,6 +3656,7 @@ static int nct6775_probe(struct platform_device *pdev)
data->temp_label = nct6776_temp_label; data->temp_label = nct6776_temp_label;
data->temp_mask = NCT6776_TEMP_MASK; data->temp_mask = NCT6776_TEMP_MASK;
data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK;
data->REG_VBAT = NCT6106_REG_VBAT; data->REG_VBAT = NCT6106_REG_VBAT;
data->REG_DIODE = NCT6106_REG_DIODE; data->REG_DIODE = NCT6106_REG_DIODE;
@ -3717,6 +3735,7 @@ static int nct6775_probe(struct platform_device *pdev)
data->temp_label = nct6775_temp_label; data->temp_label = nct6775_temp_label;
data->temp_mask = NCT6775_TEMP_MASK; data->temp_mask = NCT6775_TEMP_MASK;
data->virt_temp_mask = NCT6775_VIRT_TEMP_MASK;
data->REG_CONFIG = NCT6775_REG_CONFIG; data->REG_CONFIG = NCT6775_REG_CONFIG;
data->REG_VBAT = NCT6775_REG_VBAT; data->REG_VBAT = NCT6775_REG_VBAT;
@ -3789,6 +3808,7 @@ static int nct6775_probe(struct platform_device *pdev)
data->temp_label = nct6776_temp_label; data->temp_label = nct6776_temp_label;
data->temp_mask = NCT6776_TEMP_MASK; data->temp_mask = NCT6776_TEMP_MASK;
data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK;
data->REG_CONFIG = NCT6775_REG_CONFIG; data->REG_CONFIG = NCT6775_REG_CONFIG;
data->REG_VBAT = NCT6775_REG_VBAT; data->REG_VBAT = NCT6775_REG_VBAT;
@ -3853,7 +3873,7 @@ static int nct6775_probe(struct platform_device *pdev)
data->ALARM_BITS = NCT6779_ALARM_BITS; data->ALARM_BITS = NCT6779_ALARM_BITS;
data->BEEP_BITS = NCT6779_BEEP_BITS; data->BEEP_BITS = NCT6779_BEEP_BITS;
data->fan_from_reg = fan_from_reg13; data->fan_from_reg = fan_from_reg_rpm;
data->fan_from_reg_min = fan_from_reg13; data->fan_from_reg_min = fan_from_reg13;
data->target_temp_mask = 0xff; data->target_temp_mask = 0xff;
data->tolerance_mask = 0x07; data->tolerance_mask = 0x07;
@ -3861,6 +3881,7 @@ static int nct6775_probe(struct platform_device *pdev)
data->temp_label = nct6779_temp_label; data->temp_label = nct6779_temp_label;
data->temp_mask = NCT6779_TEMP_MASK; data->temp_mask = NCT6779_TEMP_MASK;
data->virt_temp_mask = NCT6779_VIRT_TEMP_MASK;
data->REG_CONFIG = NCT6775_REG_CONFIG; data->REG_CONFIG = NCT6775_REG_CONFIG;
data->REG_VBAT = NCT6775_REG_VBAT; data->REG_VBAT = NCT6775_REG_VBAT;
@ -3933,7 +3954,7 @@ static int nct6775_probe(struct platform_device *pdev)
data->ALARM_BITS = NCT6791_ALARM_BITS; data->ALARM_BITS = NCT6791_ALARM_BITS;
data->BEEP_BITS = NCT6779_BEEP_BITS; data->BEEP_BITS = NCT6779_BEEP_BITS;
data->fan_from_reg = fan_from_reg13; data->fan_from_reg = fan_from_reg_rpm;
data->fan_from_reg_min = fan_from_reg13; data->fan_from_reg_min = fan_from_reg13;
data->target_temp_mask = 0xff; data->target_temp_mask = 0xff;
data->tolerance_mask = 0x07; data->tolerance_mask = 0x07;
@ -3944,22 +3965,27 @@ static int nct6775_probe(struct platform_device *pdev)
case nct6791: case nct6791:
data->temp_label = nct6779_temp_label; data->temp_label = nct6779_temp_label;
data->temp_mask = NCT6791_TEMP_MASK; data->temp_mask = NCT6791_TEMP_MASK;
data->virt_temp_mask = NCT6791_VIRT_TEMP_MASK;
break; break;
case nct6792: case nct6792:
data->temp_label = nct6792_temp_label; data->temp_label = nct6792_temp_label;
data->temp_mask = NCT6792_TEMP_MASK; data->temp_mask = NCT6792_TEMP_MASK;
data->virt_temp_mask = NCT6792_VIRT_TEMP_MASK;
break; break;
case nct6793: case nct6793:
data->temp_label = nct6793_temp_label; data->temp_label = nct6793_temp_label;
data->temp_mask = NCT6793_TEMP_MASK; data->temp_mask = NCT6793_TEMP_MASK;
data->virt_temp_mask = NCT6793_VIRT_TEMP_MASK;
break; break;
case nct6795: case nct6795:
data->temp_label = nct6795_temp_label; data->temp_label = nct6795_temp_label;
data->temp_mask = NCT6795_TEMP_MASK; data->temp_mask = NCT6795_TEMP_MASK;
data->virt_temp_mask = NCT6795_VIRT_TEMP_MASK;
break; break;
case nct6796: case nct6796:
data->temp_label = nct6796_temp_label; data->temp_label = nct6796_temp_label;
data->temp_mask = NCT6796_TEMP_MASK; data->temp_mask = NCT6796_TEMP_MASK;
data->virt_temp_mask = NCT6796_VIRT_TEMP_MASK;
break; break;
} }
@ -4143,7 +4169,7 @@ static int nct6775_probe(struct platform_device *pdev)
* for each fan reflects a different temperature, and there * for each fan reflects a different temperature, and there
* are no duplicates. * are no duplicates.
*/ */
if (src != TEMP_SOURCE_VIRTUAL) { if (!(data->virt_temp_mask & BIT(src))) {
if (mask & BIT(src)) if (mask & BIT(src))
continue; continue;
mask |= BIT(src); mask |= BIT(src);