hwmon: (tmp421) Restore missing inputs
[safe/jmp/linux-2.6] / drivers / hwmon / pc87427.c
index 2915bc4..3170b26 100644 (file)
 #include <linux/mutex.h>
 #include <linux/sysfs.h>
 #include <linux/ioport.h>
-#include <asm/io.h>
+#include <linux/acpi.h>
+#include <linux/io.h>
+
+static unsigned short force_id;
+module_param(force_id, ushort, 0);
+MODULE_PARM_DESC(force_id, "Override the detected device ID");
 
 static struct platform_device *pdev;
 
@@ -42,7 +47,7 @@ static struct platform_device *pdev;
    device is using banked registers) and the register cache (needed to keep
    the data in the registers and the cache in sync at any time). */
 struct pc87427_data {
-       struct class_device *class_dev;
+       struct device *hwmon_dev;
        struct mutex lock;
        int address[2];
        const char *name;
@@ -430,7 +435,7 @@ static int __devinit pc87427_probe(struct platform_device *pdev)
        /* This will need to be revisited when we add support for
           temperature and voltage monitoring. */
        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
-       if (!request_region(res->start, res->end - res->start + 1, DRVNAME)) {
+       if (!request_region(res->start, resource_size(res), DRVNAME)) {
                err = -EBUSY;
                dev_err(&pdev->dev, "Failed to request region 0x%lx-0x%lx\n",
                        (unsigned long)res->start, (unsigned long)res->end);
@@ -454,9 +459,9 @@ static int __devinit pc87427_probe(struct platform_device *pdev)
                        goto exit_remove_files;
        }
 
-       data->class_dev = hwmon_device_register(&pdev->dev);
-       if (IS_ERR(data->class_dev)) {
-               err = PTR_ERR(data->class_dev);
+       data->hwmon_dev = hwmon_device_register(&pdev->dev);
+       if (IS_ERR(data->hwmon_dev)) {
+               err = PTR_ERR(data->hwmon_dev);
                dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
                goto exit_remove_files;
        }
@@ -470,7 +475,7 @@ exit_remove_files:
                sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_fan[i]);
        }
 exit_release_region:
-       release_region(res->start, res->end - res->start + 1);
+       release_region(res->start, resource_size(res));
 exit_kfree:
        platform_set_drvdata(pdev, NULL);
        kfree(data);
@@ -484,7 +489,7 @@ static int __devexit pc87427_remove(struct platform_device *pdev)
        struct resource *res;
        int i;
 
-       hwmon_device_unregister(data->class_dev);
+       hwmon_device_unregister(data->hwmon_dev);
        device_remove_file(&pdev->dev, &dev_attr_name);
        for (i = 0; i < 8; i++) {
                if (!(data->fan_enabled & (1 << i)))
@@ -495,7 +500,7 @@ static int __devexit pc87427_remove(struct platform_device *pdev)
        kfree(data);
 
        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
-       release_region(res->start, res->end - res->start + 1);
+       release_region(res->start, resource_size(res));
 
        return 0;
 }
@@ -520,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;
@@ -555,7 +564,7 @@ static int __init pc87427_find(int sioaddr, unsigned short *address)
        int i, err = 0;
 
        /* Identify device */
-       val = superio_inb(sioaddr, SIOREG_DEVID);
+       val = force_id ? force_id : superio_inb(sioaddr, SIOREG_DEVID);
        if (val != 0xf2) {      /* PC87427 */
                err = -ENODEV;
                goto exit;