|
@@ -39,6 +39,7 @@
|
|
* nct6779d 15 5 5 2+6 0xc560 0xc1 0x5ca3
|
|
* nct6779d 15 5 5 2+6 0xc560 0xc1 0x5ca3
|
|
* nct6791d 15 6 6 2+6 0xc800 0xc1 0x5ca3
|
|
* nct6791d 15 6 6 2+6 0xc800 0xc1 0x5ca3
|
|
* nct6792d 15 6 6 2+6 0xc910 0xc1 0x5ca3
|
|
* nct6792d 15 6 6 2+6 0xc910 0xc1 0x5ca3
|
|
|
|
+ * nct6793d 15 6 6 2+6 0xd120 0xc1 0x5ca3
|
|
*
|
|
*
|
|
* #temp lists the number of monitored temperature sources (first value) plus
|
|
* #temp lists the number of monitored temperature sources (first value) plus
|
|
* the number of directly connectable temperature sensors (second value).
|
|
* the number of directly connectable temperature sensors (second value).
|
|
@@ -63,7 +64,7 @@
|
|
|
|
|
|
#define USE_ALTERNATE
|
|
#define USE_ALTERNATE
|
|
|
|
|
|
-enum kinds { nct6106, nct6775, nct6776, nct6779, nct6791, nct6792 };
|
|
|
|
|
|
+enum kinds { nct6106, nct6775, nct6776, nct6779, nct6791, nct6792, nct6793 };
|
|
|
|
|
|
/* used to set data->name = nct6775_device_names[data->sio_kind] */
|
|
/* used to set data->name = nct6775_device_names[data->sio_kind] */
|
|
static const char * const nct6775_device_names[] = {
|
|
static const char * const nct6775_device_names[] = {
|
|
@@ -73,6 +74,17 @@ static const char * const nct6775_device_names[] = {
|
|
"nct6779",
|
|
"nct6779",
|
|
"nct6791",
|
|
"nct6791",
|
|
"nct6792",
|
|
"nct6792",
|
|
|
|
+ "nct6793",
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static const char * const nct6775_sio_names[] __initconst = {
|
|
|
|
+ "NCT6106D",
|
|
|
|
+ "NCT6775F",
|
|
|
|
+ "NCT6776D/F",
|
|
|
|
+ "NCT6779D",
|
|
|
|
+ "NCT6791D",
|
|
|
|
+ "NCT6792D",
|
|
|
|
+ "NCT6793D",
|
|
};
|
|
};
|
|
|
|
|
|
static unsigned short force_id;
|
|
static unsigned short force_id;
|
|
@@ -104,6 +116,7 @@ MODULE_PARM_DESC(fan_debounce, "Enable debouncing for fan RPM signal");
|
|
#define SIO_NCT6779_ID 0xc560
|
|
#define SIO_NCT6779_ID 0xc560
|
|
#define SIO_NCT6791_ID 0xc800
|
|
#define SIO_NCT6791_ID 0xc800
|
|
#define SIO_NCT6792_ID 0xc910
|
|
#define SIO_NCT6792_ID 0xc910
|
|
|
|
+#define SIO_NCT6793_ID 0xd120
|
|
#define SIO_ID_MASK 0xFFF0
|
|
#define SIO_ID_MASK 0xFFF0
|
|
|
|
|
|
enum pwm_enable { off, manual, thermal_cruise, speed_cruise, sf3, sf4 };
|
|
enum pwm_enable { off, manual, thermal_cruise, speed_cruise, sf3, sf4 };
|
|
@@ -537,7 +550,7 @@ static const s8 NCT6791_ALARM_BITS[] = {
|
|
4, 5, 13, -1, -1, -1, /* temp1..temp6 */
|
|
4, 5, 13, -1, -1, -1, /* temp1..temp6 */
|
|
12, 9 }; /* intrusion0, intrusion1 */
|
|
12, 9 }; /* intrusion0, intrusion1 */
|
|
|
|
|
|
-/* NCT6792 specific data */
|
|
|
|
|
|
+/* NCT6792/NCT6793 specific data */
|
|
|
|
|
|
static const u16 NCT6792_REG_TEMP_MON[] = {
|
|
static const u16 NCT6792_REG_TEMP_MON[] = {
|
|
0x73, 0x75, 0x77, 0x79, 0x7b, 0x7d };
|
|
0x73, 0x75, 0x77, 0x79, 0x7b, 0x7d };
|
|
@@ -1060,6 +1073,7 @@ static bool is_word_sized(struct nct6775_data *data, u16 reg)
|
|
case nct6779:
|
|
case nct6779:
|
|
case nct6791:
|
|
case nct6791:
|
|
case nct6792:
|
|
case nct6792:
|
|
|
|
+ case nct6793:
|
|
return reg == 0x150 || reg == 0x153 || reg == 0x155 ||
|
|
return reg == 0x150 || reg == 0x153 || reg == 0x155 ||
|
|
((reg & 0xfff0) == 0x4b0 && (reg & 0x000f) < 0x0b) ||
|
|
((reg & 0xfff0) == 0x4b0 && (reg & 0x000f) < 0x0b) ||
|
|
reg == 0x402 ||
|
|
reg == 0x402 ||
|
|
@@ -1411,6 +1425,7 @@ static void nct6775_update_pwm_limits(struct device *dev)
|
|
case nct6779:
|
|
case nct6779:
|
|
case nct6791:
|
|
case nct6791:
|
|
case nct6792:
|
|
case nct6792:
|
|
|
|
+ case nct6793:
|
|
reg = nct6775_read_value(data,
|
|
reg = nct6775_read_value(data,
|
|
data->REG_CRITICAL_PWM_ENABLE[i]);
|
|
data->REG_CRITICAL_PWM_ENABLE[i]);
|
|
if (reg & data->CRITICAL_PWM_ENABLE_MASK)
|
|
if (reg & data->CRITICAL_PWM_ENABLE_MASK)
|
|
@@ -2826,6 +2841,7 @@ store_auto_pwm(struct device *dev, struct device_attribute *attr,
|
|
case nct6779:
|
|
case nct6779:
|
|
case nct6791:
|
|
case nct6791:
|
|
case nct6792:
|
|
case nct6792:
|
|
|
|
+ case nct6793:
|
|
nct6775_write_value(data, data->REG_CRITICAL_PWM[nr],
|
|
nct6775_write_value(data, data->REG_CRITICAL_PWM[nr],
|
|
val);
|
|
val);
|
|
reg = nct6775_read_value(data,
|
|
reg = nct6775_read_value(data,
|
|
@@ -3260,7 +3276,7 @@ nct6775_check_fan_inputs(struct nct6775_data *data)
|
|
pwm4pin = false;
|
|
pwm4pin = false;
|
|
pwm5pin = false;
|
|
pwm5pin = false;
|
|
pwm6pin = false;
|
|
pwm6pin = false;
|
|
- } else { /* NCT6779D, NCT6791D, or NCT6792D */
|
|
|
|
|
|
+ } else { /* NCT6779D, NCT6791D, NCT6792D, or NCT6793D */
|
|
regval = superio_inb(sioreg, 0x1c);
|
|
regval = superio_inb(sioreg, 0x1c);
|
|
|
|
|
|
fan3pin = !(regval & (1 << 5));
|
|
fan3pin = !(regval & (1 << 5));
|
|
@@ -3273,7 +3289,8 @@ nct6775_check_fan_inputs(struct nct6775_data *data)
|
|
|
|
|
|
fan4min = fan4pin;
|
|
fan4min = fan4pin;
|
|
|
|
|
|
- if (data->kind == nct6791 || data->kind == nct6792) {
|
|
|
|
|
|
+ if (data->kind == nct6791 || data->kind == nct6792 ||
|
|
|
|
+ data->kind == nct6793) {
|
|
regval = superio_inb(sioreg, 0x2d);
|
|
regval = superio_inb(sioreg, 0x2d);
|
|
fan6pin = (regval & (1 << 1));
|
|
fan6pin = (regval & (1 << 1));
|
|
pwm6pin = (regval & (1 << 0));
|
|
pwm6pin = (regval & (1 << 0));
|
|
@@ -3647,6 +3664,7 @@ static int nct6775_probe(struct platform_device *pdev)
|
|
break;
|
|
break;
|
|
case nct6791:
|
|
case nct6791:
|
|
case nct6792:
|
|
case nct6792:
|
|
|
|
+ case nct6793:
|
|
data->in_num = 15;
|
|
data->in_num = 15;
|
|
data->pwm_num = 6;
|
|
data->pwm_num = 6;
|
|
data->auto_pwm_num = 4;
|
|
data->auto_pwm_num = 4;
|
|
@@ -3922,6 +3940,7 @@ static int nct6775_probe(struct platform_device *pdev)
|
|
case nct6779:
|
|
case nct6779:
|
|
case nct6791:
|
|
case nct6791:
|
|
case nct6792:
|
|
case nct6792:
|
|
|
|
+ case nct6793:
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3954,6 +3973,7 @@ static int nct6775_probe(struct platform_device *pdev)
|
|
break;
|
|
break;
|
|
case nct6791:
|
|
case nct6791:
|
|
case nct6792:
|
|
case nct6792:
|
|
|
|
+ case nct6793:
|
|
tmp |= 0x7e;
|
|
tmp |= 0x7e;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -4051,7 +4071,8 @@ static int __maybe_unused nct6775_resume(struct device *dev)
|
|
if (reg != data->sio_reg_enable)
|
|
if (reg != data->sio_reg_enable)
|
|
superio_outb(sioreg, SIO_REG_ENABLE, data->sio_reg_enable);
|
|
superio_outb(sioreg, SIO_REG_ENABLE, data->sio_reg_enable);
|
|
|
|
|
|
- if (data->kind == nct6791 || data->kind == nct6792)
|
|
|
|
|
|
+ if (data->kind == nct6791 || data->kind == nct6792 ||
|
|
|
|
+ data->kind == nct6793)
|
|
nct6791_enable_io_mapping(sioreg);
|
|
nct6791_enable_io_mapping(sioreg);
|
|
|
|
|
|
superio_exit(sioreg);
|
|
superio_exit(sioreg);
|
|
@@ -4110,15 +4131,6 @@ static struct platform_driver nct6775_driver = {
|
|
.probe = nct6775_probe,
|
|
.probe = nct6775_probe,
|
|
};
|
|
};
|
|
|
|
|
|
-static const char * const nct6775_sio_names[] __initconst = {
|
|
|
|
- "NCT6106D",
|
|
|
|
- "NCT6775F",
|
|
|
|
- "NCT6776D/F",
|
|
|
|
- "NCT6779D",
|
|
|
|
- "NCT6791D",
|
|
|
|
- "NCT6792D",
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
/* nct6775_find() looks for a '627 in the Super-I/O config space */
|
|
/* nct6775_find() looks for a '627 in the Super-I/O config space */
|
|
static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data)
|
|
static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data)
|
|
{
|
|
{
|
|
@@ -4154,6 +4166,9 @@ static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data)
|
|
case SIO_NCT6792_ID:
|
|
case SIO_NCT6792_ID:
|
|
sio_data->kind = nct6792;
|
|
sio_data->kind = nct6792;
|
|
break;
|
|
break;
|
|
|
|
+ case SIO_NCT6793_ID:
|
|
|
|
+ sio_data->kind = nct6793;
|
|
|
|
+ break;
|
|
default:
|
|
default:
|
|
if (val != 0xffff)
|
|
if (val != 0xffff)
|
|
pr_debug("unsupported chip ID: 0x%04x\n", val);
|
|
pr_debug("unsupported chip ID: 0x%04x\n", val);
|
|
@@ -4179,7 +4194,8 @@ static int __init nct6775_find(int sioaddr, struct nct6775_sio_data *sio_data)
|
|
superio_outb(sioaddr, SIO_REG_ENABLE, val | 0x01);
|
|
superio_outb(sioaddr, SIO_REG_ENABLE, val | 0x01);
|
|
}
|
|
}
|
|
|
|
|
|
- if (sio_data->kind == nct6791 || sio_data->kind == nct6792)
|
|
|
|
|
|
+ if (sio_data->kind == nct6791 || sio_data->kind == nct6792 ||
|
|
|
|
+ sio_data->kind == nct6793)
|
|
nct6791_enable_io_mapping(sioaddr);
|
|
nct6791_enable_io_mapping(sioaddr);
|
|
|
|
|
|
superio_exit(sioaddr);
|
|
superio_exit(sioaddr);
|
|
@@ -4289,7 +4305,7 @@ static void __exit sensors_nct6775_exit(void)
|
|
}
|
|
}
|
|
|
|
|
|
MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
|
|
MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
|
|
-MODULE_DESCRIPTION("NCT6106D/NCT6775F/NCT6776F/NCT6779D/NCT6791D/NCT6792D driver");
|
|
|
|
|
|
+MODULE_DESCRIPTION("Driver for NCT6775F and compatible chips");
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_LICENSE("GPL");
|
|
|
|
|
|
module_init(sensors_nct6775_init);
|
|
module_init(sensors_nct6775_init);
|