]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/hwmon/lm78.c
hwmon: (lm78) Fix I/O resource conflict with PNP
[linux-2.6-omap-h63xx.git] / drivers / hwmon / lm78.c
index ed7859f0e16a952c8b63cefc376e0edb92d56934..2c96d8a548f7ab4398b03ff04ac812445d91d90b 100644 (file)
@@ -655,7 +655,7 @@ static int __devinit lm78_isa_probe(struct platform_device *pdev)
 
        /* Reserve the ISA region */
        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
-       if (!request_region(res->start, LM78_EXTENT, "lm78")) {
+       if (!request_region(res->start + LM78_ADDR_REG_OFFSET, 2, "lm78")) {
                err = -EBUSY;
                goto exit;
        }
@@ -699,7 +699,7 @@ static int __devinit lm78_isa_probe(struct platform_device *pdev)
        device_remove_file(&pdev->dev, &dev_attr_name);
        kfree(data);
  exit_release_region:
-       release_region(res->start, LM78_EXTENT);
+       release_region(res->start + LM78_ADDR_REG_OFFSET, 2);
  exit:
        return err;
 }
@@ -711,7 +711,7 @@ static int __devexit lm78_isa_remove(struct platform_device *pdev)
        hwmon_device_unregister(data->hwmon_dev);
        sysfs_remove_group(&pdev->dev.kobj, &lm78_group);
        device_remove_file(&pdev->dev, &dev_attr_name);
-       release_region(data->client.addr, LM78_EXTENT);
+       release_region(data->client.addr + LM78_ADDR_REG_OFFSET, 2);
        kfree(data);
 
        return 0;
@@ -837,8 +837,17 @@ static int __init lm78_isa_found(unsigned short address)
 {
        int val, save, found = 0;
 
-       if (!request_region(address, LM78_EXTENT, "lm78"))
+       /* We have to request the region in two parts because some
+          boards declare base+4 to base+7 as a PNP device */
+       if (!request_region(address, 4, "lm78")) {
+               pr_debug("lm78: Failed to request low part of region\n");
                return 0;
+       }
+       if (!request_region(address + 4, 4, "lm78")) {
+               pr_debug("lm78: Failed to request high part of region\n");
+               release_region(address, 4);
+               return 0;
+       }
 
 #define REALLY_SLOW_IO
        /* We need the timeouts for at least some LM78-like
@@ -901,7 +910,8 @@ static int __init lm78_isa_found(unsigned short address)
                        val & 0x80 ? "LM79" : "LM78", (int)address);
 
  release:
-       release_region(address, LM78_EXTENT);
+       release_region(address + 4, 4);
+       release_region(address, 4);
        return found;
 }