component: ignore multiple additions of the same component
authorRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 18 Apr 2014 19:16:22 +0000 (20:16 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 3 Jul 2014 10:32:40 +0000 (11:32 +0100)
Permit masters to call component_master_add_child() and match the same
child multiple times.  This may happen if there's multiple connections
to a single component device from other devices.  In such scenarios,
we should not return a failure, but instead ignore the attempt.

Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
drivers/base/component.c

index d0ebd4431736381f0dc4c30adfe91653b8787e57..55813e91bf0d423ea7a134847019c1dd5d5b8244 100644 (file)
@@ -69,6 +69,11 @@ static void component_detach_master(struct master *master, struct component *c)
        c->master = NULL;
 }
 
+/*
+ * Add a component to a master, finding the component via the compare
+ * function and compare data.  This is safe to call for duplicate matches
+ * and will not result in the same component being added multiple times.
+ */
 int component_master_add_child(struct master *master,
        int (*compare)(struct device *, void *), void *compare_data)
 {
@@ -76,11 +81,12 @@ int component_master_add_child(struct master *master,
        int ret = -ENXIO;
 
        list_for_each_entry(c, &component_list, node) {
-               if (c->master)
+               if (c->master && c->master != master)
                        continue;
 
                if (compare(c->dev, compare_data)) {
-                       component_attach_master(master, c);
+                       if (!c->master)
+                               component_attach_master(master, c);
                        ret = 0;
                        break;
                }