[PATCH 3/4] hwmon: f71882fg: add watchdog detection code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Factor out code for detecting the hardware monitor into a separate
function. Then add a function for detecting the watchdog.

Signed-off-by: Giel van Schijndel <me@xxxxxxxxx>
---
 drivers/hwmon/f71882fg.c |   74 ++++++++++++++++++++++++++++++++++++----------
 1 files changed, 58 insertions(+), 16 deletions(-)

diff --git a/drivers/hwmon/f71882fg.c b/drivers/hwmon/f71882fg.c
index 7b31e14..8006271 100644
--- a/drivers/hwmon/f71882fg.c
+++ b/drivers/hwmon/f71882fg.c
@@ -2233,6 +2233,54 @@ static int f71882fg_remove(struct platform_device *pdev)
 	return 0;
 }
 
+static int __init f71882fg_find_watchdog(int sioaddr,
+	const struct f71882fg_sio_data *sio_data)
+{
+	switch (sio_data->type) {
+	case f71808fg:
+		break;
+
+	case f71862fg:
+	case f71882fg:
+	case f71889fg:
+		/* These have a watchdog, though it isn't implemented (yet). */
+		return -ENOSYS;
+
+	case f71858fg:
+	default:
+		/*
+		 * Confirmed (by datasheet) not to have a watchdog. That is,
+		 * except for chips matched by the 'default' label of course.
+		 */
+		return -ENODEV;
+	}
+
+	return 0;
+}
+
+static int __init f71882fg_find_hwmon(int sioaddr, unsigned short *hwmon_addr,
+	struct f71882fg_sio_data *sio_data)
+{
+	if (sio_data->type == f71858fg)
+		superio_select(sioaddr, SIO_F71858FG_LD_HWM);
+	else
+		superio_select(sioaddr, SIO_F71882FG_LD_HWM);
+
+	if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) {
+		printk(KERN_WARNING DRVNAME ": Device not activated\n");
+		return -ENODEV;
+	}
+
+	*hwmon_addr = superio_inw(sioaddr, SIO_REG_ADDR);
+	if (*hwmon_addr == 0) {
+		printk(KERN_WARNING DRVNAME ": Base address not set\n");
+		return -ENODEV;
+	}
+	*hwmon_addr &= ~(REGION_LENGTH - 1);	/* Ignore 3 LSB */
+
+	return 0;
+}
+
 static int __init f71882fg_find(int sioaddr, unsigned short *hwmon_addr,
 	struct f71882fg_sio_data *sio_data)
 {
@@ -2280,27 +2328,21 @@ static int __init f71882fg_find(int sioaddr, unsigned short *hwmon_addr,
 		goto exit;
 	}
 
-	if (sio_data->type == f71858fg)
-		superio_select(sioaddr, SIO_F71858FG_LD_HWM);
-	else
-		superio_select(sioaddr, SIO_F71882FG_LD_HWM);
-
-	if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) {
-		printk(KERN_WARNING DRVNAME ": Device not activated\n");
-		goto exit;
-	}
-
-	*hwmon_addr = superio_inw(sioaddr, SIO_REG_ADDR);
-	if (*hwmon_addr == 0) {
-		printk(KERN_WARNING DRVNAME ": Base address not set\n");
+	err = f71882fg_find_hwmon(sioaddr, hwmon_addr, sio_data);
+	if (err)
 		goto exit;
-	}
-	*hwmon_addr &= ~(REGION_LENGTH - 1);	/* Ignore 3 LSB */
 
-	err = 0;
 	printk(KERN_INFO DRVNAME ": Found %s chip at %#x, revision %d\n",
 		f71882fg_names[sio_data->type],	(unsigned int)*hwmon_addr,
 		(int)superio_inb(sioaddr, SIO_REG_DEVREV));
+
+	err = f71882fg_find_watchdog(sioaddr, sio_data);
+	if (err == 0)
+		printk(KERN_INFO DRVNAME ": has supported watchdog\n");
+	else if (err != -ENODEV && err != -ENOSYS)
+		goto exit;
+
+	err = 0;
 exit:
 	superio_exit(sioaddr);
 	release_region(sioaddr, 2);
-- 
1.6.4.4


_______________________________________________
lm-sensors mailing list
lm-sensors@xxxxxxxxxxxxxx
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux