git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ring-buffer: typecast cmpxchg to fix PowerPC warning
[safe/jmp/linux-2.6]
/
drivers
/
hwmon
/
pc87427.c
diff --git
a/drivers/hwmon/pc87427.c
b/drivers/hwmon/pc87427.c
index
affa21a
..
3a8a0f7
100644
(file)
--- a/
drivers/hwmon/pc87427.c
+++ b/
drivers/hwmon/pc87427.c
@@
-31,8
+31,14
@@
#include <linux/err.h>
#include <linux/mutex.h>
#include <linux/sysfs.h>
#include <linux/err.h>
#include <linux/mutex.h>
#include <linux/sysfs.h>
+#include <linux/ioport.h>
+#include <linux/acpi.h>
#include <asm/io.h>
#include <asm/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;
#define DRVNAME "pc87427"
static struct platform_device *pdev;
#define DRVNAME "pc87427"
@@
-41,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 {
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;
struct mutex lock;
int address[2];
const char *name;
@@
-429,6
+435,12
@@
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);
/* 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)) {
+ err = -EBUSY;
+ dev_err(&pdev->dev, "Failed to request region 0x%lx-0x%lx\n",
+ (unsigned long)res->start, (unsigned long)res->end);
+ goto exit_kfree;
+ }
data->address[0] = res->start;
mutex_init(&data->lock);
data->address[0] = res->start;
mutex_init(&data->lock);
@@
-438,7
+450,7
@@
static int __devinit pc87427_probe(struct platform_device *pdev)
/* Register sysfs hooks */
if ((err = device_create_file(&pdev->dev, &dev_attr_name)))
/* Register sysfs hooks */
if ((err = device_create_file(&pdev->dev, &dev_attr_name)))
- goto exit_
kfree
;
+ goto exit_
release_region
;
for (i = 0; i < 8; i++) {
if (!(data->fan_enabled & (1 << i)))
continue;
for (i = 0; i < 8; i++) {
if (!(data->fan_enabled & (1 << i)))
continue;
@@
-447,9
+459,9
@@
static int __devinit pc87427_probe(struct platform_device *pdev)
goto exit_remove_files;
}
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;
}
dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
goto exit_remove_files;
}
@@
-462,6
+474,8
@@
exit_remove_files:
continue;
sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_fan[i]);
}
continue;
sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_fan[i]);
}
+exit_release_region:
+ release_region(res->start, res->end - res->start + 1);
exit_kfree:
platform_set_drvdata(pdev, NULL);
kfree(data);
exit_kfree:
platform_set_drvdata(pdev, NULL);
kfree(data);
@@
-472,18
+486,22
@@
exit:
static int __devexit pc87427_remove(struct platform_device *pdev)
{
struct pc87427_data *data = platform_get_drvdata(pdev);
static int __devexit pc87427_remove(struct platform_device *pdev)
{
struct pc87427_data *data = platform_get_drvdata(pdev);
+ struct resource *res;
int i;
int i;
- platform_set_drvdata(pdev, NULL);
- 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)))
continue;
sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_fan[i]);
}
device_remove_file(&pdev->dev, &dev_attr_name);
for (i = 0; i < 8; i++) {
if (!(data->fan_enabled & (1 << i)))
continue;
sysfs_remove_group(&pdev->dev.kobj, &pc87427_group_fan[i]);
}
+ platform_set_drvdata(pdev, NULL);
kfree(data);
kfree(data);
+ res = platform_get_resource(pdev, IORESOURCE_IO, 0);
+ release_region(res->start, res->end - res->start + 1);
+
return 0;
}
return 0;
}
@@
-507,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);
if (!pdev) {
err = -ENOMEM;
pdev = platform_device_alloc(DRVNAME, address);
if (!pdev) {
err = -ENOMEM;
@@
-542,7
+564,7
@@
static int __init pc87427_find(int sioaddr, unsigned short *address)
int i, err = 0;
/* Identify device */
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;
if (val != 0xf2) { /* PC87427 */
err = -ENODEV;
goto exit;