Browse Source

greybus: bundle: Initialize all bundles on link-up

An interface can have 1 or more bundles. On link-up event, we must initialize
all the bundles associated with the interface.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Viresh Kumar 10 years ago
parent
commit
bb97ea813b
3 changed files with 23 additions and 11 deletions
  1. 1 3
      drivers/staging/greybus/ap.c
  2. 20 7
      drivers/staging/greybus/bundle.c
  3. 2 1
      drivers/staging/greybus/bundle.h

+ 1 - 3
drivers/staging/greybus/ap.c

@@ -146,9 +146,7 @@ static void svc_management(struct svc_function_unipro_management *management,
 				management->link_up.interface_id);
 			return;
 		}
-		ret = gb_bundle_init(intf,
-				management->link_up.interface_id,
-				management->link_up.device_id);
+		ret = gb_bundles_init(intf, management->link_up.device_id);
 		if (ret) {
 			dev_err(hd->parent,
 				"error %d initializing bundles for interface %hhu\n",

+ 20 - 7
drivers/staging/greybus/bundle.c

@@ -146,16 +146,11 @@ void gb_bundle_destroy(struct gb_interface *intf)
 	}
 }
 
-int gb_bundle_init(struct gb_interface *intf, u8 bundle_id, u8 device_id)
+int gb_bundle_init(struct gb_bundle *bundle, u8 device_id)
 {
-	struct gb_bundle *bundle;
+	struct gb_interface *intf = bundle->intf;
 	int ret;
 
-	bundle = gb_bundle_find(intf, bundle_id);
-	if (!bundle) {
-		dev_err(intf->hd->parent, "bundle %hhu not found\n", bundle_id);
-		return -ENOENT;
-	}
 	bundle->device_id = device_id;
 
 	ret = svc_set_route_send(bundle, intf->hd);
@@ -175,6 +170,24 @@ int gb_bundle_init(struct gb_interface *intf, u8 bundle_id, u8 device_id)
 	return 0;
 }
 
+int gb_bundles_init(struct gb_interface *intf, u8 device_id)
+{
+	struct gb_bundle *bundle;
+	int ret = 0;
+
+	list_for_each_entry(bundle, &intf->bundles, links) {
+		ret = gb_bundle_init(bundle, device_id);
+		if (ret) {
+			dev_err(intf->hd->parent,
+				"Failed to initialize bundle %hhu\n",
+				bundle->id);
+			break;
+		}
+	}
+
+	return ret;
+}
+
 struct gb_bundle *gb_bundle_find(struct gb_interface *intf, u8 bundle_id)
 {
 	struct gb_bundle *bundle;

+ 2 - 1
drivers/staging/greybus/bundle.h

@@ -31,7 +31,8 @@ struct gb_bundle {
 struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id,
 				   u8 class_type);
 void gb_bundle_destroy(struct gb_interface *intf);
-int gb_bundle_init(struct gb_interface *intf, u8 module_id, u8 device_id);
+int gb_bundle_init(struct gb_bundle *bundle, u8 device_id);
+int gb_bundles_init(struct gb_interface *intf, u8 device_id);
 
 struct gb_bundle *gb_bundle_find(struct gb_interface *intf, u8 bundle_id);
 void gb_bundle_bind_protocols(void);