aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--drivers/hwmon/f71805f.c16
-rw-r--r--drivers/hwmon/pc87427.c15
-rw-r--r--drivers/hwmon/vt1211.c13
3 files changed, 42 insertions, 2 deletions
diff --git a/drivers/hwmon/f71805f.c b/drivers/hwmon/f71805f.c
index 7c2973487122..cdbe309b8fc4 100644
--- a/drivers/hwmon/f71805f.c
+++ b/drivers/hwmon/f71805f.c
@@ -35,6 +35,7 @@
35#include <linux/err.h> 35#include <linux/err.h>
36#include <linux/mutex.h> 36#include <linux/mutex.h>
37#include <linux/sysfs.h> 37#include <linux/sysfs.h>
38#include <linux/ioport.h>
38#include <asm/io.h> 39#include <asm/io.h>
39 40
40static struct platform_device *pdev; 41static struct platform_device *pdev;
@@ -1140,6 +1141,13 @@ static int __devinit f71805f_probe(struct platform_device *pdev)
1140 } 1141 }
1141 1142
1142 res = platform_get_resource(pdev, IORESOURCE_IO, 0); 1143 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1144 if (!request_region(res->start + ADDR_REG_OFFSET, 2, DRVNAME)) {
1145 err = -EBUSY;
1146 dev_err(&pdev->dev, "Failed to request region 0x%lx-0x%lx\n",
1147 (unsigned long)(res->start + ADDR_REG_OFFSET),
1148 (unsigned long)(res->start + ADDR_REG_OFFSET + 1));
1149 goto exit_free;
1150 }
1143 data->addr = res->start; 1151 data->addr = res->start;
1144 data->name = names[sio_data->kind]; 1152 data->name = names[sio_data->kind];
1145 mutex_init(&data->update_lock); 1153 mutex_init(&data->update_lock);
@@ -1165,7 +1173,7 @@ static int __devinit f71805f_probe(struct platform_device *pdev)
1165 1173
1166 /* Register sysfs interface files */ 1174 /* Register sysfs interface files */
1167 if ((err = sysfs_create_group(&pdev->dev.kobj, &f71805f_group))) 1175 if ((err = sysfs_create_group(&pdev->dev.kobj, &f71805f_group)))
1168 goto exit_free; 1176 goto exit_release_region;
1169 if (data->has_in & (1 << 4)) { /* in4 */ 1177 if (data->has_in & (1 << 4)) { /* in4 */
1170 if ((err = sysfs_create_group(&pdev->dev.kobj, 1178 if ((err = sysfs_create_group(&pdev->dev.kobj,
1171 &f71805f_group_optin[0]))) 1179 &f71805f_group_optin[0])))
@@ -1219,6 +1227,8 @@ exit_remove_files:
1219 for (i = 0; i < 4; i++) 1227 for (i = 0; i < 4; i++)
1220 sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_optin[i]); 1228 sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_optin[i]);
1221 sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_pwm_freq); 1229 sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_pwm_freq);
1230exit_release_region:
1231 release_region(res->start + ADDR_REG_OFFSET, 2);
1222exit_free: 1232exit_free:
1223 platform_set_drvdata(pdev, NULL); 1233 platform_set_drvdata(pdev, NULL);
1224 kfree(data); 1234 kfree(data);
@@ -1229,6 +1239,7 @@ exit:
1229static int __devexit f71805f_remove(struct platform_device *pdev) 1239static int __devexit f71805f_remove(struct platform_device *pdev)
1230{ 1240{
1231 struct f71805f_data *data = platform_get_drvdata(pdev); 1241 struct f71805f_data *data = platform_get_drvdata(pdev);
1242 struct resource *res;
1232 int i; 1243 int i;
1233 1244
1234 platform_set_drvdata(pdev, NULL); 1245 platform_set_drvdata(pdev, NULL);
@@ -1239,6 +1250,9 @@ static int __devexit f71805f_remove(struct platform_device *pdev)
1239 sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_pwm_freq); 1250 sysfs_remove_group(&pdev->dev.kobj, &f71805f_group_pwm_freq);
1240 kfree(data); 1251 kfree(data);
1241 1252
1253 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1254 release_region(res->start + ADDR_REG_OFFSET, 2);
1255
1242 return 0; 1256 return 0;
1243} 1257}
1244 1258
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
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
diff --git a/drivers/hwmon/vt1211.c b/drivers/hwmon/vt1211.c
index 89c23d6add7b..9f3e332c5b7f 100644
--- a/drivers/hwmon/vt1211.c
+++ b/drivers/hwmon/vt1211.c
@@ -31,6 +31,7 @@
31#include <linux/hwmon-vid.h> 31#include <linux/hwmon-vid.h>
32#include <linux/err.h> 32#include <linux/err.h>
33#include <linux/mutex.h> 33#include <linux/mutex.h>
34#include <linux/ioport.h>
34#include <asm/io.h> 35#include <asm/io.h>
35 36
36static int uch_config = -1; 37static int uch_config = -1;
@@ -1130,6 +1131,12 @@ static int __devinit vt1211_probe(struct platform_device *pdev)
1130 } 1131 }
1131 1132
1132 res = platform_get_resource(pdev, IORESOURCE_IO, 0); 1133 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1134 if (!request_region(res->start, res->end - res->start + 1, DRVNAME)) {
1135 err = -EBUSY;
1136 dev_err(dev, "Failed to request region 0x%lx-0x%lx\n",
1137 (unsigned long)res->start, (unsigned long)res->end);
1138 goto EXIT_KFREE;
1139 }
1133 data->addr = res->start; 1140 data->addr = res->start;
1134 data->name = DRVNAME; 1141 data->name = DRVNAME;
1135 mutex_init(&data->update_lock); 1142 mutex_init(&data->update_lock);
@@ -1197,6 +1204,8 @@ EXIT_DEV_REMOVE:
1197 dev_err(dev, "Sysfs interface creation failed (%d)\n", err); 1204 dev_err(dev, "Sysfs interface creation failed (%d)\n", err);
1198EXIT_DEV_REMOVE_SILENT: 1205EXIT_DEV_REMOVE_SILENT:
1199 vt1211_remove_sysfs(pdev); 1206 vt1211_remove_sysfs(pdev);
1207 release_region(res->start, res->end - res->start + 1);
1208EXIT_KFREE:
1200 platform_set_drvdata(pdev, NULL); 1209 platform_set_drvdata(pdev, NULL);
1201 kfree(data); 1210 kfree(data);
1202EXIT: 1211EXIT:
@@ -1206,12 +1215,16 @@ EXIT:
1206static int __devexit vt1211_remove(struct platform_device *pdev) 1215static int __devexit vt1211_remove(struct platform_device *pdev)
1207{ 1216{
1208 struct vt1211_data *data = platform_get_drvdata(pdev); 1217 struct vt1211_data *data = platform_get_drvdata(pdev);
1218 struct resource *res;
1209 1219
1210 hwmon_device_unregister(data->class_dev); 1220 hwmon_device_unregister(data->class_dev);
1211 vt1211_remove_sysfs(pdev); 1221 vt1211_remove_sysfs(pdev);
1212 platform_set_drvdata(pdev, NULL); 1222 platform_set_drvdata(pdev, NULL);
1213 kfree(data); 1223 kfree(data);
1214 1224
1225 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1226 release_region(res->start, res->end - res->start + 1);
1227
1215 return 0; 1228 return 0;
1216} 1229}
1217 1230