aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-probe.c
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-04-17 18:46:23 -0400
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-04-17 18:46:23 -0400
commitf74c91413ec6140ee0553180c5f56fdd27c22a2e (patch)
tree75ba3f7000ba290dc19b1523b12ab95dc5c7b1ea /drivers/ide/ide-probe.c
parent50672e5d7486c9ab312432cbe180ac071f1de8e0 (diff)
ide: add warm-plug support for IDE devices (take 2)
* Add 'struct class ide_port_class' ('ide_port' class) and a 'struct device *portdev' ('ide_port' class device) in ide_hwif_t. * Register 'ide_port' class in ide_init() and unregister it in cleanup_module(). * Create ->portdev in ide_register_port () and unregister it in ide_unregister(). * Add "delete_devices" class device attribute for unregistering IDE devices on a port and "scan" one for probing+registering IDE devices on a port. * Add ide_sysfs_register_port() helper for registering "delete_devices" and "scan" attributes with ->portdev. Call it in ide_device_add_all(). * Document IDE warm-plug support in Documentation/ide/warm-plug-howto.txt. v2: * Convert patch from using 'struct class_device' to use 'struct device'. (thanks to Kay Sievers for doing it) Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/ide-probe.c')
-rw-r--r--drivers/ide/ide-probe.c71
1 files changed, 69 insertions, 2 deletions
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
index 468c4ac4181d..510254ab3c9b 100644
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -623,7 +623,7 @@ static void hwif_release_dev (struct device *dev)
623 complete(&hwif->gendev_rel_comp); 623 complete(&hwif->gendev_rel_comp);
624} 624}
625 625
626static void ide_register_port(ide_hwif_t *hwif) 626static int ide_register_port(ide_hwif_t *hwif)
627{ 627{
628 int ret; 628 int ret;
629 629
@@ -639,9 +639,23 @@ static void ide_register_port(ide_hwif_t *hwif)
639 } 639 }
640 hwif->gendev.release = hwif_release_dev; 640 hwif->gendev.release = hwif_release_dev;
641 ret = device_register(&hwif->gendev); 641 ret = device_register(&hwif->gendev);
642 if (ret < 0) 642 if (ret < 0) {
643 printk(KERN_WARNING "IDE: %s: device_register error: %d\n", 643 printk(KERN_WARNING "IDE: %s: device_register error: %d\n",
644 __FUNCTION__, ret); 644 __FUNCTION__, ret);
645 goto out;
646 }
647
648 get_device(&hwif->gendev);
649
650 hwif->portdev = device_create(ide_port_class, &hwif->gendev,
651 MKDEV(0, 0), hwif->name);
652 if (IS_ERR(hwif->portdev)) {
653 ret = PTR_ERR(hwif->portdev);
654 device_unregister(&hwif->gendev);
655 }
656 dev_set_drvdata(hwif->portdev, hwif);
657out:
658 return ret;
645} 659}
646 660
647/** 661/**
@@ -1378,6 +1392,58 @@ static void ide_port_cable_detect(ide_hwif_t *hwif)
1378 } 1392 }
1379} 1393}
1380 1394
1395static ssize_t store_delete_devices(struct device *portdev,
1396 struct device_attribute *attr,
1397 const char *buf, size_t n)
1398{
1399 ide_hwif_t *hwif = dev_get_drvdata(portdev);
1400
1401 if (strncmp(buf, "1", n))
1402 return -EINVAL;
1403
1404 ide_port_unregister_devices(hwif);
1405
1406 return n;
1407};
1408
1409static DEVICE_ATTR(delete_devices, S_IWUSR, NULL, store_delete_devices);
1410
1411static ssize_t store_scan(struct device *portdev,
1412 struct device_attribute *attr,
1413 const char *buf, size_t n)
1414{
1415 ide_hwif_t *hwif = dev_get_drvdata(portdev);
1416
1417 if (strncmp(buf, "1", n))
1418 return -EINVAL;
1419
1420 ide_port_unregister_devices(hwif);
1421 ide_port_scan(hwif);
1422
1423 return n;
1424};
1425
1426static DEVICE_ATTR(scan, S_IWUSR, NULL, store_scan);
1427
1428static struct device_attribute *ide_port_attrs[] = {
1429 &dev_attr_delete_devices,
1430 &dev_attr_scan,
1431 NULL
1432};
1433
1434static int ide_sysfs_register_port(ide_hwif_t *hwif)
1435{
1436 int i, rc;
1437
1438 for (i = 0; ide_port_attrs[i]; i++) {
1439 rc = device_create_file(hwif->portdev, ide_port_attrs[i]);
1440 if (rc)
1441 break;
1442 }
1443
1444 return rc;
1445}
1446
1381int ide_device_add_all(u8 *idx, const struct ide_port_info *d) 1447int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
1382{ 1448{
1383 ide_hwif_t *hwif, *mate = NULL; 1449 ide_hwif_t *hwif, *mate = NULL;
@@ -1474,6 +1540,7 @@ int ide_device_add_all(u8 *idx, const struct ide_port_info *d)
1474 hwif = &ide_hwifs[idx[i]]; 1540 hwif = &ide_hwifs[idx[i]];
1475 1541
1476 if (hwif->present) { 1542 if (hwif->present) {
1543 ide_sysfs_register_port(hwif);
1477 ide_proc_register_port(hwif); 1544 ide_proc_register_port(hwif);
1478 ide_proc_port_register_devices(hwif); 1545 ide_proc_port_register_devices(hwif);
1479 } 1546 }