hwmon: Check for ACPI resource conflicts
authorJean Delvare <jdelvare@suse.de>
Wed, 7 Jan 2009 15:37:35 +0000 (16:37 +0100)
committerJean Delvare <khali@linux-fr.org>
Wed, 7 Jan 2009 15:37:35 +0000 (16:37 +0100)
Check for ACPI resource conflicts in hwmon drivers. I've included
all Super-I/O and PCI drivers.

I've voluntarily left out:
* Vendor-specific drivers: if they conflicted on any system, this would
  pretty much mean that they conflict on all systems, and we would know
  by now.
* Legacy ISA drivers (lm78 and w83781d): they only support chips found
  on old designs were ACPI either wasn't supported or didn't deal with
  thermal management.
* Drivers accessing the I/O resources indirectly (e.g. through SMBus):
  the checks are already done where they belong, i.e. in the bus drivers.

Signed-off-by: Jean Delvare <jdelvare@suse.de>
Acked-by: David Hubbard <david.c.hubbard@gmail.com>
14 files changed:
drivers/hwmon/dme1737.c
drivers/hwmon/f71805f.c
drivers/hwmon/f71882fg.c
drivers/hwmon/it87.c
drivers/hwmon/pc87360.c
drivers/hwmon/pc87427.c
drivers/hwmon/sis5595.c
drivers/hwmon/smsc47b397.c
drivers/hwmon/smsc47m1.c
drivers/hwmon/via686a.c
drivers/hwmon/vt1211.c
drivers/hwmon/vt8231.c
drivers/hwmon/w83627ehf.c
drivers/hwmon/w83627hf.c

index 27a5d397f9a127f40b4d9eedbac8f3a205444414..3df202a9ad723737ef89e148f9f9ff25f6691b84 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/hwmon-vid.h>
 #include <linux/err.h>
 #include <linux/mutex.h>
+#include <linux/acpi.h>
 #include <asm/io.h>
 
 /* ISA device, if found */
@@ -2361,6 +2362,10 @@ static int __init dme1737_isa_device_add(unsigned short addr)
        };
        int err;
 
+       err = acpi_check_resource_conflict(&res);
+       if (err)
+               goto exit;
+
        if (!(pdev = platform_device_alloc("dme1737", addr))) {
                printk(KERN_ERR "dme1737: Failed to allocate device.\n");
                err = -ENOMEM;
index 7a14a2dbb752e8835fcc652f97d9f57277f53783..89987657925361fa108a762993286ac2ba6a8788 100644 (file)
@@ -39,6 +39,7 @@
 #include <linux/mutex.h>
 #include <linux/sysfs.h>
 #include <linux/ioport.h>
+#include <linux/acpi.h>
 #include <asm/io.h>
 
 static unsigned short force_id;
@@ -1455,6 +1456,10 @@ static int __init f71805f_device_add(unsigned short address,
        }
 
        res.name = pdev->name;
+       err = acpi_check_resource_conflict(&res);
+       if (err)
+               goto exit_device_put;
+
        err = platform_device_add_resources(pdev, &res, 1);
        if (err) {
                printk(KERN_ERR DRVNAME ": Device resource addition failed "
index d867b377d4e961291bae51dd7cc0cf6fcfa57c34..609cafff86bc2ce23c364831f959c2dbcd310baf 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/err.h>
 #include <linux/mutex.h>
 #include <linux/io.h>
+#include <linux/acpi.h>
 
 #define DRVNAME "f71882fg"
 
@@ -1929,6 +1930,10 @@ static int __init f71882fg_device_add(unsigned short address,
                return -ENOMEM;
 
        res.name = f71882fg_pdev->name;
+       err = acpi_check_resource_conflict(&res);
+       if (err)
+               return err;
+
        err = platform_device_add_resources(f71882fg_pdev, &res, 1);
        if (err) {
                printk(KERN_ERR DRVNAME ": Device resource addition failed\n");
index 0e0d692f0c9e460d661588ab0b3c33335ee57e19..88e71f195ec71e5e5d68c4ab5b816f288d64d336 100644 (file)
@@ -49,6 +49,7 @@
 #include <linux/sysfs.h>
 #include <linux/string.h>
 #include <linux/dmi.h>
+#include <linux/acpi.h>
 #include <asm/io.h>
 
 #define DRVNAME "it87"
@@ -1552,6 +1553,10 @@ static int __init it87_device_add(unsigned short address,
        };
        int err;
 
+       err = acpi_check_resource_conflict(&res);
+       if (err)
+               goto exit;
+
        pdev = platform_device_alloc(DRVNAME, address);
        if (!pdev) {
                err = -ENOMEM;
index 5fbfa34c110e36e455e632363eaff7228f4b0aaf..fb052fea374401cfdb7edd78c662f6cda33292b4 100644 (file)
@@ -43,6 +43,7 @@
 #include <linux/hwmon-vid.h>
 #include <linux/err.h>
 #include <linux/mutex.h>
+#include <linux/acpi.h>
 #include <asm/io.h>
 
 static u8 devid;
@@ -1627,6 +1628,11 @@ static int __init pc87360_device_add(unsigned short address)
                        continue;
                res.start = extra_isa[i];
                res.end = extra_isa[i] + PC87360_EXTENT - 1;
+
+               err = acpi_check_resource_conflict(&res);
+               if (err)
+                       goto exit_device_put;
+
                err = platform_device_add_resources(pdev, &res, 1);
                if (err) {
                        printk(KERN_ERR "pc87360: Device resource[%d] "
index 7265f22ae5cd1d6762822c67756e8f1f8967d422..3a8a0f7a7736dd48468ca3dfdd3cb839d046083e 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/mutex.h>
 #include <linux/sysfs.h>
 #include <linux/ioport.h>
+#include <linux/acpi.h>
 #include <asm/io.h>
 
 static unsigned short force_id;
@@ -524,6 +525,10 @@ static int __init pc87427_device_add(unsigned short address)
        };
        int err;
 
+       err = acpi_check_resource_conflict(&res);
+       if (err)
+               goto exit;
+
        pdev = platform_device_alloc(DRVNAME, address);
        if (!pdev) {
                err = -ENOMEM;
index a276806f3d53cd8b9ab192f3283019b7550531c5..aa2e8318f167e83cb9b6a32a47c1db6899fe191f 100644 (file)
@@ -62,6 +62,7 @@
 #include <linux/jiffies.h>
 #include <linux/mutex.h>
 #include <linux/sysfs.h>
+#include <linux/acpi.h>
 #include <asm/io.h>
 
 
@@ -727,6 +728,10 @@ static int __devinit sis5595_device_add(unsigned short address)
        };
        int err;
 
+       err = acpi_check_resource_conflict(&res);
+       if (err)
+               goto exit;
+
        pdev = platform_device_alloc("sis5595", address);
        if (!pdev) {
                err = -ENOMEM;
index eb03544c731ca47dd94c6d7d940b3f66a43dbcdd..6f6d52b4fb64520f67581682acb3d63995343805 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/err.h>
 #include <linux/init.h>
 #include <linux/mutex.h>
+#include <linux/acpi.h>
 #include <asm/io.h>
 
 static unsigned short force_id;
@@ -303,6 +304,10 @@ static int __init smsc47b397_device_add(unsigned short address)
        };
        int err;
 
+       err = acpi_check_resource_conflict(&res);
+       if (err)
+               goto exit;
+
        pdev = platform_device_alloc(DRVNAME, address);
        if (!pdev) {
                err = -ENOMEM;
index d1b4985487365b1ce23217d1ddfb09316e3e6689..a92dbb97ee999255e1ad3d79da106894e83282ef 100644 (file)
@@ -37,6 +37,7 @@
 #include <linux/init.h>
 #include <linux/mutex.h>
 #include <linux/sysfs.h>
+#include <linux/acpi.h>
 #include <asm/io.h>
 
 static unsigned short force_id;
@@ -705,6 +706,10 @@ static int __init smsc47m1_device_add(unsigned short address,
        };
        int err;
 
+       err = acpi_check_resource_conflict(&res);
+       if (err)
+               goto exit;
+
        pdev = platform_device_alloc(DRVNAME, address);
        if (!pdev) {
                err = -ENOMEM;
index f1ee5e731968d7e5edd0c2e3b0ab1cdd521bd2ba..a022aedcaacbe58b8377f42c96469105582990c4 100644 (file)
@@ -41,6 +41,7 @@
 #include <linux/init.h>
 #include <linux/mutex.h>
 #include <linux/sysfs.h>
+#include <linux/acpi.h>
 #include <asm/io.h>
 
 
@@ -783,6 +784,10 @@ static int __devinit via686a_device_add(unsigned short address)
        };
        int err;
 
+       err = acpi_check_resource_conflict(&res);
+       if (err)
+               goto exit;
+
        pdev = platform_device_alloc("via686a", address);
        if (!pdev) {
                err = -ENOMEM;
index 12b43590fa53e7a5aa80e325b409437277be8dc1..b0ce3785228101f6cf8ff388497e57e5b0f44f98 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/err.h>
 #include <linux/mutex.h>
 #include <linux/ioport.h>
+#include <linux/acpi.h>
 #include <asm/io.h>
 
 static int uch_config = -1;
@@ -1259,6 +1260,10 @@ static int __init vt1211_device_add(unsigned short address)
        }
 
        res.name = pdev->name;
+       err = acpi_check_resource_conflict(&res);
+       if (err)
+               goto EXIT;
+
        err = platform_device_add_resources(pdev, &res, 1);
        if (err) {
                printk(KERN_ERR DRVNAME ": Device resource addition failed "
index 5bc57275cae8e6e8a700373d1670510e442403e9..9982b45fbb1488aa1160683ada5f92cac4c88f24 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/hwmon-vid.h>
 #include <linux/err.h>
 #include <linux/mutex.h>
+#include <linux/acpi.h>
 #include <asm/io.h>
 
 static int force_addr;
@@ -894,6 +895,10 @@ static int __devinit vt8231_device_add(unsigned short address)
        };
        int err;
 
+       err = acpi_check_resource_conflict(&res);
+       if (err)
+               goto exit;
+
        pdev = platform_device_alloc("vt8231", address);
        if (!pdev) {
                err = -ENOMEM;
index 075164dd65a7a6716965538ac56d7b0320e14541..a3a01dc35a3154d92bf3695f0f75d621a166adaf 100644 (file)
@@ -48,6 +48,7 @@
 #include <linux/hwmon-vid.h>
 #include <linux/err.h>
 #include <linux/mutex.h>
+#include <linux/acpi.h>
 #include <asm/io.h>
 #include "lm75.h"
 
@@ -1544,6 +1545,11 @@ static int __init sensors_w83627ehf_init(void)
        res.start = address + IOREGION_OFFSET;
        res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1;
        res.flags = IORESOURCE_IO;
+
+       err = acpi_check_resource_conflict(&res);
+       if (err)
+               goto exit;
+
        err = platform_device_add_resources(pdev, &res, 1);
        if (err) {
                printk(KERN_ERR DRVNAME ": Device resource addition failed "
index b30e5796cb26fcc646096571a994c5ee9b5cd7a8..389150ba30d364ffd46ce1121684531f18297754 100644 (file)
@@ -50,6 +50,7 @@
 #include <linux/err.h>
 #include <linux/mutex.h>
 #include <linux/ioport.h>
+#include <linux/acpi.h>
 #include <asm/io.h>
 #include "lm75.h"
 
@@ -1793,6 +1794,10 @@ static int __init w83627hf_device_add(unsigned short address,
        };
        int err;
 
+       err = acpi_check_resource_conflict(&res);
+       if (err)
+               goto exit;
+
        pdev = platform_device_alloc(DRVNAME, address);
        if (!pdev) {
                err = -ENOMEM;