summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/staging/greybus/bundle.c33
-rw-r--r--drivers/staging/greybus/bundle.h1
-rw-r--r--drivers/staging/greybus/manifest.c26
3 files changed, 39 insertions, 21 deletions
diff --git a/drivers/staging/greybus/bundle.c b/drivers/staging/greybus/bundle.c
index 0f3a00d8d4f2..fb775ff1895d 100644
--- a/drivers/staging/greybus/bundle.c
+++ b/drivers/staging/greybus/bundle.c
@@ -107,7 +107,6 @@ struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id,
u8 class)
{
struct gb_bundle *bundle;
- int retval;
/*
* Reject any attempt to reuse a bundle id. We initialize
@@ -128,8 +127,6 @@ struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id,
bundle->class = class;
INIT_LIST_HEAD(&bundle->connections);
- /* Build up the bundle device structures and register it with the
- * driver core */
bundle->dev.parent = &intf->dev;
bundle->dev.bus = &greybus_bus_type;
bundle->dev.type = &greybus_bundle_type;
@@ -137,18 +134,24 @@ struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id,
device_initialize(&bundle->dev);
dev_set_name(&bundle->dev, "%s.%d", dev_name(&intf->dev), bundle_id);
- retval = device_add(&bundle->dev);
- if (retval) {
- pr_err("failed to add bundle device for id %u\n", bundle_id);
- put_device(&bundle->dev);
- return NULL;
- }
-
list_add(&bundle->links, &intf->bundles);
return bundle;
}
+int gb_bundle_add(struct gb_bundle *bundle)
+{
+ int ret;
+
+ ret = device_add(&bundle->dev);
+ if (ret) {
+ dev_err(&bundle->dev, "failed to register bundle: %d\n", ret);
+ return ret;
+ }
+
+ return 0;
+}
+
static void gb_bundle_connections_exit(struct gb_bundle *bundle)
{
struct gb_connection *connection;
@@ -162,10 +165,12 @@ static void gb_bundle_connections_exit(struct gb_bundle *bundle)
*/
void gb_bundle_destroy(struct gb_bundle *bundle)
{
- list_del(&bundle->links);
-
gb_bundle_connections_exit(bundle);
- device_unregister(&bundle->dev);
-}
+ if (device_is_registered(&bundle->dev))
+ device_del(&bundle->dev);
+ list_del(&bundle->links);
+
+ put_device(&bundle->dev);
+}
diff --git a/drivers/staging/greybus/bundle.h b/drivers/staging/greybus/bundle.h
index eae375c12100..682ec327f8a3 100644
--- a/drivers/staging/greybus/bundle.h
+++ b/drivers/staging/greybus/bundle.h
@@ -31,6 +31,7 @@ struct gb_bundle {
/* Greybus "private" definitions" */
struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id,
u8 class);
+int gb_bundle_add(struct gb_bundle *bundle);
void gb_bundle_destroy(struct gb_bundle *bundle);
#endif /* __BUNDLE_H */
diff --git a/drivers/staging/greybus/manifest.c b/drivers/staging/greybus/manifest.c
index 8310f199f0f1..51201128498d 100644
--- a/drivers/staging/greybus/manifest.c
+++ b/drivers/staging/greybus/manifest.c
@@ -236,7 +236,6 @@ static u32 gb_manifest_parse_cports(struct gb_bundle *bundle)
u8 protocol_id;
u16 cport_id;
u32 count = 0;
- int ret;
/* Set up all cport descriptors associated with this bundle */
list_for_each_entry_safe(desc, next, &intf->manifest_descs, links) {
@@ -262,12 +261,6 @@ static u32 gb_manifest_parse_cports(struct gb_bundle *bundle)
if (!connection)
goto exit;
- ret = gb_connection_init(connection);
- if (ret) {
- gb_connection_destroy(connection);
- goto exit;
- }
-
count++;
/* Release the cport descriptor */
@@ -293,12 +286,14 @@ exit:
*/
static u32 gb_manifest_parse_bundles(struct gb_interface *intf)
{
+ struct gb_connection *connection;
struct manifest_desc *desc;
struct gb_bundle *bundle;
struct gb_bundle *bundle_next;
u32 count = 0;
u8 bundle_id;
u8 class;
+ int ret;
while ((desc = get_next_bundle_desc(intf))) {
struct greybus_descriptor_bundle *desc_bundle;
@@ -354,6 +349,23 @@ static u32 gb_manifest_parse_bundles(struct gb_interface *intf)
continue;
}
+ ret = gb_bundle_add(bundle);
+ if (ret) {
+ gb_bundle_destroy(bundle);
+ continue;
+ }
+
+ list_for_each_entry(connection, &bundle->connections,
+ bundle_links) {
+ ret = gb_connection_init(connection);
+ if (ret)
+ break;
+ }
+ if (ret) {
+ gb_bundle_destroy(bundle);
+ continue;
+ }
+
count++;
}