aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/core.c
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2006-09-13 09:34:05 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2006-09-26 00:08:38 -0400
commitc47ed219ba81632595e9f02e27318151fec16c9e (patch)
tree7c6d6c07122c26c12719c676b6a81f731122347d /drivers/base/core.c
parentc205ef4880273d2de4ee5388d4e52227ff688cc4 (diff)
Class: add support for class interfaces for devices
When moving class_device usage over to device, we need to handle class_interfaces properly with devices. This patch adds that support. Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/base/core.c')
-rw-r--r--drivers/base/core.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/base/core.c b/drivers/base/core.c
index e21a65fc043..1d3d3582fcc 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -372,6 +372,7 @@ int device_add(struct device *dev)
372{ 372{
373 struct device *parent = NULL; 373 struct device *parent = NULL;
374 char *class_name = NULL; 374 char *class_name = NULL;
375 struct class_interface *class_intf;
375 int error = -EINVAL; 376 int error = -EINVAL;
376 377
377 dev = get_device(dev); 378 dev = get_device(dev);
@@ -451,9 +452,14 @@ int device_add(struct device *dev)
451 klist_add_tail(&dev->knode_parent, &parent->klist_children); 452 klist_add_tail(&dev->knode_parent, &parent->klist_children);
452 453
453 if (dev->class) { 454 if (dev->class) {
454 /* tie the class to the device */
455 down(&dev->class->sem); 455 down(&dev->class->sem);
456 /* tie the class to the device */
456 list_add_tail(&dev->node, &dev->class->devices); 457 list_add_tail(&dev->node, &dev->class->devices);
458
459 /* notify any interfaces that the device is here */
460 list_for_each_entry(class_intf, &dev->class->interfaces, node)
461 if (class_intf->add_dev)
462 class_intf->add_dev(dev, class_intf);
457 up(&dev->class->sem); 463 up(&dev->class->sem);
458 } 464 }
459 465
@@ -548,6 +554,7 @@ void device_del(struct device * dev)
548{ 554{
549 struct device * parent = dev->parent; 555 struct device * parent = dev->parent;
550 char *class_name = NULL; 556 char *class_name = NULL;
557 struct class_interface *class_intf;
551 558
552 if (parent) 559 if (parent)
553 klist_del(&dev->knode_parent); 560 klist_del(&dev->knode_parent);
@@ -563,6 +570,11 @@ void device_del(struct device * dev)
563 } 570 }
564 kfree(class_name); 571 kfree(class_name);
565 down(&dev->class->sem); 572 down(&dev->class->sem);
573 /* notify any interfaces that the device is now gone */
574 list_for_each_entry(class_intf, &dev->class->interfaces, node)
575 if (class_intf->remove_dev)
576 class_intf->remove_dev(dev, class_intf);
577 /* remove the device from the class list */
566 list_del_init(&dev->node); 578 list_del_init(&dev->node);
567 up(&dev->class->sem); 579 up(&dev->class->sem);
568 } 580 }