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:
Коммит
eb9a29f9e5
|
@ -207,8 +207,6 @@ superio_exit(int ioreg)
|
|||
|
||||
#define NUM_FAN 7
|
||||
|
||||
#define TEMP_SOURCE_VIRTUAL 0x1f
|
||||
|
||||
/* Common and NCT6775 specific data */
|
||||
|
||||
/* 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_MIN[] = { 0x3b, 0x3c, 0x3d };
|
||||
static const u16 NCT6775_REG_FAN_PULSES[] = { 0x641, 0x642, 0x643, 0x644, 0 };
|
||||
static const u16 NCT6775_FAN_PULSE_SHIFT[] = { 0, 0, 0, 0, 0, 0 };
|
||||
static const u16 NCT6775_REG_FAN_PULSES[NUM_FAN] = {
|
||||
0x641, 0x642, 0x643, 0x644 };
|
||||
static const u16 NCT6775_FAN_PULSE_SHIFT[NUM_FAN] = { };
|
||||
|
||||
static const u16 NCT6775_REG_TEMP[] = {
|
||||
0x27, 0x150, 0x250, 0x62b, 0x62c, 0x62d };
|
||||
|
@ -373,6 +372,7 @@ static const char *const nct6775_temp_label[] = {
|
|||
};
|
||||
|
||||
#define NCT6775_TEMP_MASK 0x001ffffe
|
||||
#define NCT6775_VIRT_TEMP_MASK 0x00000000
|
||||
|
||||
static const u16 NCT6775_REG_TEMP_ALTERNATE[32] = {
|
||||
[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[] = {
|
||||
0x63a, 0x63c, 0x63e, 0x640, 0x642, 0x64a, 0x64c };
|
||||
static const u16 NCT6776_REG_FAN_PULSES[] = {
|
||||
0x644, 0x645, 0x646, 0x647, 0x648, 0x649, 0 };
|
||||
static const u16 NCT6776_REG_FAN_PULSES[NUM_FAN] = {
|
||||
0x644, 0x645, 0x646, 0x647, 0x648, 0x649 };
|
||||
|
||||
static const u16 NCT6776_REG_WEIGHT_DUTY_BASE[] = {
|
||||
0x13e, 0x23e, 0x33e, 0x83e, 0x93e, 0xa3e };
|
||||
|
@ -461,6 +461,7 @@ static const char *const nct6776_temp_label[] = {
|
|||
};
|
||||
|
||||
#define NCT6776_TEMP_MASK 0x007ffffe
|
||||
#define NCT6776_VIRT_TEMP_MASK 0x00000000
|
||||
|
||||
static const u16 NCT6776_REG_TEMP_ALTERNATE[32] = {
|
||||
[14] = 0x401,
|
||||
|
@ -501,9 +502,9 @@ static const s8 NCT6779_BEEP_BITS[] = {
|
|||
30, 31 }; /* intrusion0, intrusion1 */
|
||||
|
||||
static const u16 NCT6779_REG_FAN[] = {
|
||||
0x4b0, 0x4b2, 0x4b4, 0x4b6, 0x4b8, 0x4ba, 0x660 };
|
||||
static const u16 NCT6779_REG_FAN_PULSES[] = {
|
||||
0x644, 0x645, 0x646, 0x647, 0x648, 0x649, 0 };
|
||||
0x4c0, 0x4c2, 0x4c4, 0x4c6, 0x4c8, 0x4ca, 0x4ce };
|
||||
static const u16 NCT6779_REG_FAN_PULSES[NUM_FAN] = {
|
||||
0x644, 0x645, 0x646, 0x647, 0x648, 0x649 };
|
||||
|
||||
static const u16 NCT6779_REG_CRITICAL_PWM_ENABLE[] = {
|
||||
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_VIRT_TEMP_MASK 0x00000000
|
||||
#define NCT6791_TEMP_MASK 0x87ffff7e
|
||||
#define NCT6791_VIRT_TEMP_MASK 0x80000000
|
||||
|
||||
static const u16 NCT6779_REG_TEMP_ALTERNATE[32]
|
||||
= { 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_VIRT_TEMP_MASK 0x80000000
|
||||
|
||||
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_VIRT_TEMP_MASK 0x80000000
|
||||
|
||||
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_VIRT_TEMP_MASK 0x80000000
|
||||
|
||||
static const char *const nct6796_temp_label[] = {
|
||||
"",
|
||||
|
@ -724,8 +730,8 @@ static const char *const nct6796_temp_label[] = {
|
|||
"AUXTIN4",
|
||||
"SMBUSMASTER 0",
|
||||
"SMBUSMASTER 1",
|
||||
"",
|
||||
"",
|
||||
"Virtual_TEMP",
|
||||
"Virtual_TEMP",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
|
@ -748,7 +754,8 @@ static const char *const nct6796_temp_label[] = {
|
|||
"Virtual_TEMP"
|
||||
};
|
||||
|
||||
#define NCT6796_TEMP_MASK 0xbfff03fe
|
||||
#define NCT6796_TEMP_MASK 0xbfff0ffe
|
||||
#define NCT6796_VIRT_TEMP_MASK 0x80000c00
|
||||
|
||||
/* 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_MIN[] = { 0xe0, 0xe2, 0xe4 };
|
||||
static const u16 NCT6106_REG_FAN_PULSES[] = { 0xf6, 0xf6, 0xf6, 0, 0 };
|
||||
static const u16 NCT6106_FAN_PULSE_SHIFT[] = { 0, 2, 4, 0, 0 };
|
||||
static const u16 NCT6106_REG_FAN_PULSES[] = { 0xf6, 0xf6, 0xf6 };
|
||||
static const u16 NCT6106_FAN_PULSE_SHIFT[] = { 0, 2, 4 };
|
||||
|
||||
static const u8 NCT6106_REG_PWM_MODE[] = { 0xf3, 0xf3, 0xf3 };
|
||||
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);
|
||||
}
|
||||
|
||||
static unsigned int fan_from_reg_rpm(u16 reg, unsigned int divreg)
|
||||
{
|
||||
return reg;
|
||||
}
|
||||
|
||||
static u16 fan_to_reg(u32 fan, unsigned int divreg)
|
||||
{
|
||||
if (!fan)
|
||||
|
@ -969,6 +981,7 @@ struct nct6775_data {
|
|||
u16 reg_temp_config[NUM_TEMP];
|
||||
const char * const *temp_label;
|
||||
u32 temp_mask;
|
||||
u32 virt_temp_mask;
|
||||
|
||||
u16 REG_CONFIG;
|
||||
u16 REG_VBAT;
|
||||
|
@ -1276,11 +1289,11 @@ static bool is_word_sized(struct nct6775_data *data, u16 reg)
|
|||
case nct6795:
|
||||
case nct6796:
|
||||
return reg == 0x150 || reg == 0x153 || reg == 0x155 ||
|
||||
((reg & 0xfff0) == 0x4b0 && (reg & 0x000f) < 0x0b) ||
|
||||
(reg & 0xfff0) == 0x4c0 ||
|
||||
reg == 0x402 ||
|
||||
reg == 0x63a || reg == 0x63c || reg == 0x63e ||
|
||||
reg == 0x640 || reg == 0x642 || reg == 0x64a ||
|
||||
reg == 0x64c || reg == 0x660 ||
|
||||
reg == 0x64c ||
|
||||
reg == 0x73 || reg == 0x75 || reg == 0x77 || reg == 0x79 ||
|
||||
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]);
|
||||
data->pwm_weight_temp_sel[i] = reg & 0x1f;
|
||||
/* If weight is disabled, report weight source as 0 */
|
||||
if (j == 1 && !(reg & 0x80))
|
||||
if (!(reg & 0x80))
|
||||
data->pwm_weight_temp_sel[i] = 0;
|
||||
|
||||
/* Weight temp data */
|
||||
|
@ -1682,9 +1695,13 @@ static struct nct6775_data *nct6775_update_device(struct device *dev)
|
|||
if (data->has_fan_min & BIT(i))
|
||||
data->fan_min[i] = nct6775_read_value(data,
|
||||
data->REG_FAN_MIN[i]);
|
||||
data->fan_pulses[i] =
|
||||
(nct6775_read_value(data, data->REG_FAN_PULSES[i])
|
||||
>> data->FAN_PULSE_SHIFT[i]) & 0x03;
|
||||
|
||||
if (data->REG_FAN_PULSES[i]) {
|
||||
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);
|
||||
}
|
||||
|
@ -3639,6 +3656,7 @@ static int nct6775_probe(struct platform_device *pdev)
|
|||
|
||||
data->temp_label = nct6776_temp_label;
|
||||
data->temp_mask = NCT6776_TEMP_MASK;
|
||||
data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK;
|
||||
|
||||
data->REG_VBAT = NCT6106_REG_VBAT;
|
||||
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_mask = NCT6775_TEMP_MASK;
|
||||
data->virt_temp_mask = NCT6775_VIRT_TEMP_MASK;
|
||||
|
||||
data->REG_CONFIG = NCT6775_REG_CONFIG;
|
||||
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_mask = NCT6776_TEMP_MASK;
|
||||
data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK;
|
||||
|
||||
data->REG_CONFIG = NCT6775_REG_CONFIG;
|
||||
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->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->target_temp_mask = 0xff;
|
||||
data->tolerance_mask = 0x07;
|
||||
|
@ -3861,6 +3881,7 @@ static int nct6775_probe(struct platform_device *pdev)
|
|||
|
||||
data->temp_label = nct6779_temp_label;
|
||||
data->temp_mask = NCT6779_TEMP_MASK;
|
||||
data->virt_temp_mask = NCT6779_VIRT_TEMP_MASK;
|
||||
|
||||
data->REG_CONFIG = NCT6775_REG_CONFIG;
|
||||
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->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->target_temp_mask = 0xff;
|
||||
data->tolerance_mask = 0x07;
|
||||
|
@ -3944,22 +3965,27 @@ static int nct6775_probe(struct platform_device *pdev)
|
|||
case nct6791:
|
||||
data->temp_label = nct6779_temp_label;
|
||||
data->temp_mask = NCT6791_TEMP_MASK;
|
||||
data->virt_temp_mask = NCT6791_VIRT_TEMP_MASK;
|
||||
break;
|
||||
case nct6792:
|
||||
data->temp_label = nct6792_temp_label;
|
||||
data->temp_mask = NCT6792_TEMP_MASK;
|
||||
data->virt_temp_mask = NCT6792_VIRT_TEMP_MASK;
|
||||
break;
|
||||
case nct6793:
|
||||
data->temp_label = nct6793_temp_label;
|
||||
data->temp_mask = NCT6793_TEMP_MASK;
|
||||
data->virt_temp_mask = NCT6793_VIRT_TEMP_MASK;
|
||||
break;
|
||||
case nct6795:
|
||||
data->temp_label = nct6795_temp_label;
|
||||
data->temp_mask = NCT6795_TEMP_MASK;
|
||||
data->virt_temp_mask = NCT6795_VIRT_TEMP_MASK;
|
||||
break;
|
||||
case nct6796:
|
||||
data->temp_label = nct6796_temp_label;
|
||||
data->temp_mask = NCT6796_TEMP_MASK;
|
||||
data->virt_temp_mask = NCT6796_VIRT_TEMP_MASK;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -4143,7 +4169,7 @@ static int nct6775_probe(struct platform_device *pdev)
|
|||
* for each fan reflects a different temperature, and there
|
||||
* are no duplicates.
|
||||
*/
|
||||
if (src != TEMP_SOURCE_VIRTUAL) {
|
||||
if (!(data->virt_temp_mask & BIT(src))) {
|
||||
if (mask & BIT(src))
|
||||
continue;
|
||||
mask |= BIT(src);
|
||||
|
|
Загрузка…
Ссылка в новой задаче