Commit b9acb64a authored by Jean Delvare's avatar Jean Delvare Committed by Jean Delvare

hwmon: Check for ACPI resource conflicts

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: default avatarJean Delvare <jdelvare@suse.de>
Acked-by: default avatarDavid Hubbard <david.c.hubbard@gmail.com>
parent c8ac32e4
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include <linux/hwmon-vid.h> #include <linux/hwmon-vid.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/acpi.h>
#include <asm/io.h> #include <asm/io.h>
/* ISA device, if found */ /* ISA device, if found */
...@@ -2361,6 +2362,10 @@ static int __init dme1737_isa_device_add(unsigned short addr) ...@@ -2361,6 +2362,10 @@ static int __init dme1737_isa_device_add(unsigned short addr)
}; };
int err; int err;
err = acpi_check_resource_conflict(&res);
if (err)
goto exit;
if (!(pdev = platform_device_alloc("dme1737", addr))) { if (!(pdev = platform_device_alloc("dme1737", addr))) {
printk(KERN_ERR "dme1737: Failed to allocate device.\n"); printk(KERN_ERR "dme1737: Failed to allocate device.\n");
err = -ENOMEM; err = -ENOMEM;
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/sysfs.h> #include <linux/sysfs.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/acpi.h>
#include <asm/io.h> #include <asm/io.h>
static unsigned short force_id; static unsigned short force_id;
...@@ -1455,6 +1456,10 @@ static int __init f71805f_device_add(unsigned short address, ...@@ -1455,6 +1456,10 @@ static int __init f71805f_device_add(unsigned short address,
} }
res.name = pdev->name; res.name = pdev->name;
err = acpi_check_resource_conflict(&res);
if (err)
goto exit_device_put;
err = platform_device_add_resources(pdev, &res, 1); err = platform_device_add_resources(pdev, &res, 1);
if (err) { if (err) {
printk(KERN_ERR DRVNAME ": Device resource addition failed " printk(KERN_ERR DRVNAME ": Device resource addition failed "
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/acpi.h>
#define DRVNAME "f71882fg" #define DRVNAME "f71882fg"
...@@ -1929,6 +1930,10 @@ static int __init f71882fg_device_add(unsigned short address, ...@@ -1929,6 +1930,10 @@ static int __init f71882fg_device_add(unsigned short address,
return -ENOMEM; return -ENOMEM;
res.name = f71882fg_pdev->name; res.name = f71882fg_pdev->name;
err = acpi_check_resource_conflict(&res);
if (err)
return err;
err = platform_device_add_resources(f71882fg_pdev, &res, 1); err = platform_device_add_resources(f71882fg_pdev, &res, 1);
if (err) { if (err) {
printk(KERN_ERR DRVNAME ": Device resource addition failed\n"); printk(KERN_ERR DRVNAME ": Device resource addition failed\n");
......
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
#include <linux/sysfs.h> #include <linux/sysfs.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/dmi.h> #include <linux/dmi.h>
#include <linux/acpi.h>
#include <asm/io.h> #include <asm/io.h>
#define DRVNAME "it87" #define DRVNAME "it87"
...@@ -1552,6 +1553,10 @@ static int __init it87_device_add(unsigned short address, ...@@ -1552,6 +1553,10 @@ static int __init it87_device_add(unsigned short address,
}; };
int err; int err;
err = acpi_check_resource_conflict(&res);
if (err)
goto exit;
pdev = platform_device_alloc(DRVNAME, address); pdev = platform_device_alloc(DRVNAME, address);
if (!pdev) { if (!pdev) {
err = -ENOMEM; err = -ENOMEM;
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include <linux/hwmon-vid.h> #include <linux/hwmon-vid.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/acpi.h>
#include <asm/io.h> #include <asm/io.h>
static u8 devid; static u8 devid;
...@@ -1627,6 +1628,11 @@ static int __init pc87360_device_add(unsigned short address) ...@@ -1627,6 +1628,11 @@ static int __init pc87360_device_add(unsigned short address)
continue; continue;
res.start = extra_isa[i]; res.start = extra_isa[i];
res.end = extra_isa[i] + PC87360_EXTENT - 1; 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); err = platform_device_add_resources(pdev, &res, 1);
if (err) { if (err) {
printk(KERN_ERR "pc87360: Device resource[%d] " printk(KERN_ERR "pc87360: Device resource[%d] "
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/sysfs.h> #include <linux/sysfs.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/acpi.h>
#include <asm/io.h> #include <asm/io.h>
static unsigned short force_id; static unsigned short force_id;
...@@ -524,6 +525,10 @@ static int __init pc87427_device_add(unsigned short address) ...@@ -524,6 +525,10 @@ static int __init pc87427_device_add(unsigned short address)
}; };
int err; int err;
err = acpi_check_resource_conflict(&res);
if (err)
goto exit;
pdev = platform_device_alloc(DRVNAME, address); pdev = platform_device_alloc(DRVNAME, address);
if (!pdev) { if (!pdev) {
err = -ENOMEM; err = -ENOMEM;
......
...@@ -62,6 +62,7 @@ ...@@ -62,6 +62,7 @@
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/sysfs.h> #include <linux/sysfs.h>
#include <linux/acpi.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -727,6 +728,10 @@ static int __devinit sis5595_device_add(unsigned short address) ...@@ -727,6 +728,10 @@ static int __devinit sis5595_device_add(unsigned short address)
}; };
int err; int err;
err = acpi_check_resource_conflict(&res);
if (err)
goto exit;
pdev = platform_device_alloc("sis5595", address); pdev = platform_device_alloc("sis5595", address);
if (!pdev) { if (!pdev) {
err = -ENOMEM; err = -ENOMEM;
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/acpi.h>
#include <asm/io.h> #include <asm/io.h>
static unsigned short force_id; static unsigned short force_id;
...@@ -303,6 +304,10 @@ static int __init smsc47b397_device_add(unsigned short address) ...@@ -303,6 +304,10 @@ static int __init smsc47b397_device_add(unsigned short address)
}; };
int err; int err;
err = acpi_check_resource_conflict(&res);
if (err)
goto exit;
pdev = platform_device_alloc(DRVNAME, address); pdev = platform_device_alloc(DRVNAME, address);
if (!pdev) { if (!pdev) {
err = -ENOMEM; err = -ENOMEM;
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/sysfs.h> #include <linux/sysfs.h>
#include <linux/acpi.h>
#include <asm/io.h> #include <asm/io.h>
static unsigned short force_id; static unsigned short force_id;
...@@ -705,6 +706,10 @@ static int __init smsc47m1_device_add(unsigned short address, ...@@ -705,6 +706,10 @@ static int __init smsc47m1_device_add(unsigned short address,
}; };
int err; int err;
err = acpi_check_resource_conflict(&res);
if (err)
goto exit;
pdev = platform_device_alloc(DRVNAME, address); pdev = platform_device_alloc(DRVNAME, address);
if (!pdev) { if (!pdev) {
err = -ENOMEM; err = -ENOMEM;
......
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/sysfs.h> #include <linux/sysfs.h>
#include <linux/acpi.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -783,6 +784,10 @@ static int __devinit via686a_device_add(unsigned short address) ...@@ -783,6 +784,10 @@ static int __devinit via686a_device_add(unsigned short address)
}; };
int err; int err;
err = acpi_check_resource_conflict(&res);
if (err)
goto exit;
pdev = platform_device_alloc("via686a", address); pdev = platform_device_alloc("via686a", address);
if (!pdev) { if (!pdev) {
err = -ENOMEM; err = -ENOMEM;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/acpi.h>
#include <asm/io.h> #include <asm/io.h>
static int uch_config = -1; static int uch_config = -1;
...@@ -1259,6 +1260,10 @@ static int __init vt1211_device_add(unsigned short address) ...@@ -1259,6 +1260,10 @@ static int __init vt1211_device_add(unsigned short address)
} }
res.name = pdev->name; res.name = pdev->name;
err = acpi_check_resource_conflict(&res);
if (err)
goto EXIT;
err = platform_device_add_resources(pdev, &res, 1); err = platform_device_add_resources(pdev, &res, 1);
if (err) { if (err) {
printk(KERN_ERR DRVNAME ": Device resource addition failed " printk(KERN_ERR DRVNAME ": Device resource addition failed "
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <linux/hwmon-vid.h> #include <linux/hwmon-vid.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/acpi.h>
#include <asm/io.h> #include <asm/io.h>
static int force_addr; static int force_addr;
...@@ -894,6 +895,10 @@ static int __devinit vt8231_device_add(unsigned short address) ...@@ -894,6 +895,10 @@ static int __devinit vt8231_device_add(unsigned short address)
}; };
int err; int err;
err = acpi_check_resource_conflict(&res);
if (err)
goto exit;
pdev = platform_device_alloc("vt8231", address); pdev = platform_device_alloc("vt8231", address);
if (!pdev) { if (!pdev) {
err = -ENOMEM; err = -ENOMEM;
......
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include <linux/hwmon-vid.h> #include <linux/hwmon-vid.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/acpi.h>
#include <asm/io.h> #include <asm/io.h>
#include "lm75.h" #include "lm75.h"
...@@ -1544,6 +1545,11 @@ static int __init sensors_w83627ehf_init(void) ...@@ -1544,6 +1545,11 @@ static int __init sensors_w83627ehf_init(void)
res.start = address + IOREGION_OFFSET; res.start = address + IOREGION_OFFSET;
res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1; res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1;
res.flags = IORESOURCE_IO; res.flags = IORESOURCE_IO;
err = acpi_check_resource_conflict(&res);
if (err)
goto exit;
err = platform_device_add_resources(pdev, &res, 1); err = platform_device_add_resources(pdev, &res, 1);
if (err) { if (err) {
printk(KERN_ERR DRVNAME ": Device resource addition failed " printk(KERN_ERR DRVNAME ": Device resource addition failed "
......
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/acpi.h>
#include <asm/io.h> #include <asm/io.h>
#include "lm75.h" #include "lm75.h"
...@@ -1793,6 +1794,10 @@ static int __init w83627hf_device_add(unsigned short address, ...@@ -1793,6 +1794,10 @@ static int __init w83627hf_device_add(unsigned short address,
}; };
int err; int err;
err = acpi_check_resource_conflict(&res);
if (err)
goto exit;
pdev = platform_device_alloc(DRVNAME, address); pdev = platform_device_alloc(DRVNAME, address);
if (!pdev) { if (!pdev) {
err = -ENOMEM; err = -ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment