diff options
Diffstat (limited to 'drivers/hwmon/pc87427.c')
-rw-r--r-- | drivers/hwmon/pc87427.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/hwmon/pc87427.c b/drivers/hwmon/pc87427.c index affa21a5ccfd..29354fa26f81 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 | ||
36 | static struct platform_device *pdev; | 37 | static 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 | } |
472 | exit_release_region: | ||
473 | release_region(res->start, res->end - res->start + 1); | ||
465 | exit_kfree: | 474 | exit_kfree: |
466 | platform_set_drvdata(pdev, NULL); | 475 | platform_set_drvdata(pdev, NULL); |
467 | kfree(data); | 476 | kfree(data); |
@@ -472,6 +481,7 @@ exit: | |||
472 | static int __devexit pc87427_remove(struct platform_device *pdev) | 481 | static 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 | ||