hwmon: (w83627ehf) Add fan debounce support for NCT6775F and NCT6776F
authorIan Dobson <i.dobson@planet-ian.com>
Mon, 7 Mar 2011 22:21:12 +0000 (14:21 -0800)
committerGuenter Roeck <guenter.roeck@ericsson.com>
Tue, 15 Mar 2011 05:39:19 +0000 (22:39 -0700)
NCT6776F and NCT6775F support debouncing the fan RPM signal. This can
help improve the stability of th RPM signal for some fans (Arctic cooling
fans for example).
This patch adds a module parameter fan_debounce, which when set to 1 enables
debounce for all fans that the chip supports.

Signed-off-by: Ian Dobson <i.dobson@planet-ian.com>
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
drivers/hwmon/w83627ehf.c

index 460292bad74ab0ac5619aa81750c3f05079f5224..d1803194496065cc470c103796794a9e698bf352 100644 (file)
@@ -79,6 +79,10 @@ static unsigned short force_id;
 module_param(force_id, ushort, 0);
 MODULE_PARM_DESC(force_id, "Override the detected device ID");
 
+static unsigned short fan_debounce;
+module_param(fan_debounce, ushort, 0);
+MODULE_PARM_DESC(fan_debounce, "Enable debouncing for fan RPM signal");
+
 #define DRVNAME "w83627ehf"
 
 /*
@@ -187,6 +191,7 @@ static const u16 W83627EHF_REG_TEMP_CONFIG[] = { 0, 0x152, 0x252, 0 };
 /* NCT6775F has its own fan divider registers */
 #define NCT6775_REG_FANDIV1            0x506
 #define NCT6775_REG_FANDIV2            0x507
+#define NCT6775_REG_FAN_DEBOUNCE       0xf0
 
 #define W83627EHF_REG_ALARM1           0x459
 #define W83627EHF_REG_ALARM2           0x45A
@@ -2089,6 +2094,22 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)
                fan5pin = !(superio_inb(sio_data->sioreg, 0x24) & 0x02);
                fan4min = fan4pin;
        }
+
+       if (fan_debounce &&
+           (sio_data->kind == nct6775 || sio_data->kind == nct6776)) {
+               u8 tmp;
+
+               superio_select(sio_data->sioreg, W83627EHF_LD_HWM);
+               tmp = superio_inb(sio_data->sioreg, NCT6775_REG_FAN_DEBOUNCE);
+               if (sio_data->kind == nct6776)
+                       superio_outb(sio_data->sioreg, NCT6775_REG_FAN_DEBOUNCE,
+                                    0x3e | tmp);
+               else
+                       superio_outb(sio_data->sioreg, NCT6775_REG_FAN_DEBOUNCE,
+                                    0x1e | tmp);
+               pr_info("Enabled fan debounce for chip %s\n", data->name);
+       }
+
        superio_exit(sio_data->sioreg);
 
        /* It looks like fan4 and fan5 pins can be alternatively used