aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/pc87427.c
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2007-05-08 11:21:59 -0400
committerJean Delvare <khali@hyperion.delvare>2007-05-08 11:21:59 -0400
commitce7ee4e80a72d3b1009ca232be8981de93c015f6 (patch)
treeb5160fd4a2b2276f7bd332f753b43f6d9752476b /drivers/hwmon/pc87427.c
parent00cb4739053fa0ce4594a7798a4095007a1c7c79 (diff)
hwmon: Request the I/O regions in platform drivers
My understanding of the resource management in the Linux 2.6 device driver model is that the devices should declare their resources, and then when a driver attaches to a device, it should request the resources it will be using, so as to mark them busy. This is how the PCI and PNP subsystems work, you can clearly see the two levels of resources (declaration and request) in /proc/ioports for these devices. So I believe that our platform hardware monitoring drivers should follow the same logic. At the moment, we only declare the resources but we do not request them. This patch adds the I/O region request and release calls. Signed-off-by: Jean Delvare <khali@linux-fr.org> Acked-by: Juerg Haefliger <juergh@gmail.com>
Diffstat (limited to 'drivers/hwmon/pc87427.c')
-rw-r--r--drivers/hwmon/pc87427.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/hwmon/pc87427.c b/drivers/hwmon/pc87427.c
index affa21a5ccf..29354fa26f8 100644
--- a/drivers/hwmon/pc87427.c
+++ b/drivers/hwmon/pc87427.c
@@ -31,6 +31,7 @@
31#include <linux/err.h> 31#include <linux/err.h>
32#include <linux/mutex.h> 32#include <linux/mutex.h>
33#include <linux/sysfs.h> 33#include <linux/sysfs.h>
34#include <linux/ioport.h>
34#include <asm/io.h> 35#include <asm/io.h>
35 36
36static struct platform_device *pdev; 37static struct platform_device *pdev;
@@ -429,6 +430,12 @@ static int __devinit pc87427_probe(struct platform_device *pdev)
429 /* This will need to be revisited when we add support for 430 /* This will need to be revisited when we add support for
430 temperature and voltage monitoring. */ 431 temperature and voltage monitoring. */
431 res = platform_get_resource(pdev, IORESOURCE_IO, 0); 432 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
433 if (!request_region(res->start, res->end - res->start + 1, DRVNAME)) {
434 err = -EBUSY;
435 dev_err(&pdev->dev, "Failed to request region 0x%lx-0x%lx\n",
436 (unsigned long)res->start, (unsigned long)res->end);
437 goto exit_kfree;
438 }
432 data->address[0] = res->start; 439 data->address[0] = res->start;
433 440
434 mutex_init(&data->lock); 441 mutex_init(&data->lock);
@@ -438,7 +445,7 @@ static int __devinit pc87427_probe(struct platform_device *pdev)
438 445
439 /* Register sysfs hooks */ 446 /* Register sysfs hooks */
440 if ((err = device_create_file(&pdev->dev, &dev_attr_name))) 447 if ((err = device_create_file(&pdev->dev, &dev_attr_name)))
441 goto exit_kfree; 448 goto exit_release_region;
442 for (i = 0; i < 8; i++) { 449 for (i = 0; i < 8; i++) {
443 if (!(data->fan_enabled & (1 << i))) 450 if (!(data->fan_enabled & (1 << i)))
444 continue; 451 continue;
@@ -462,6 +469,8 @@ exit_remove_files:
462 continue; 469 continue;
463 sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_fan[i]); 470 sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_fan[i]);
464 } 471 }
472exit_release_region:
473 release_region(res->start, res->end - res->start + 1);
465exit_kfree: 474exit_kfree:
466 platform_set_drvdata(pdev, NULL); 475 platform_set_drvdata(pdev, NULL);
467 kfree(data); 476 kfree(data);
@@ -472,6 +481,7 @@ exit:
472static int __devexit pc87427_remove(struct platform_device *pdev) 481static int __devexit pc87427_remove(struct platform_device *pdev)
473{ 482{
474 struct pc87427_data *data = platform_get_drvdata(pdev); 483 struct pc87427_data *data = platform_get_drvdata(pdev);
484 struct resource *res;
475 int i; 485 int i;
476 486
477 platform_set_drvdata(pdev, NULL); 487 platform_set_drvdata(pdev, NULL);
@@ -484,6 +494,9 @@ static int __devexit pc87427_remove(struct platform_device *pdev)
484 } 494 }
485 kfree(data); 495 kfree(data);
486 496
497 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
498 release_region(res->start, res->end - res->start + 1);
499
487 return 0; 500 return 0;
488} 501}
489 502