greybus: interface: separate initialisation and registration
authorJohan Hovold <johan@hovoldconsulting.com>
Wed, 9 Mar 2016 11:20:36 +0000 (12:20 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Thu, 10 Mar 2016 21:57:42 +0000 (13:57 -0800)
Separate interface initialisation from registration of the interface and
its bundles.

This is a step towards registering also interfaces that failed to
initialise (e.g. a dummy interface).

Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Reviewed-by: Jeffrey Carlyle <jcarlyle@google.com>
Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/interface.c
drivers/staging/greybus/interface.h
drivers/staging/greybus/svc.c

index 63dd2854ea703224149b49e8f9c773782fe25b54..a32e564851d81fa0fee10069fef48fa6a503b471 100644 (file)
@@ -179,16 +179,12 @@ void gb_interfaces_remove(struct gb_host_device *hd)
                gb_interface_remove(intf);
 }
 
-/**
- * gb_interface_init
- *
- * Create connection for control CPort and then request/parse manifest.
- * Finally initialize all the bundles to set routes via SVC and initialize all
- * connections.
+/*
+ * Intialise an interface by enabling the control connection and fetching the
+ * manifest and other information over it.
  */
 int gb_interface_init(struct gb_interface *intf)
 {
-       struct gb_bundle *bundle, *tmp;
        int ret, size;
        void *manifest;
 
@@ -236,11 +232,22 @@ int gb_interface_init(struct gb_interface *intf)
        if (ret)
                goto free_manifest;
 
-       /* Register the interface and its bundles. */
+free_manifest:
+       kfree(manifest);
+
+       return ret;
+}
+
+/* Register an interface and its bundles. */
+int gb_interface_add(struct gb_interface *intf)
+{
+       struct gb_bundle *bundle, *tmp;
+       int ret;
+
        ret = device_add(&intf->dev);
        if (ret) {
                dev_err(&intf->dev, "failed to register interface: %d\n", ret);
-               goto free_manifest;
+               return ret;
        }
 
        dev_info(&intf->dev, "Interface added: VID=0x%08x, PID=0x%08x\n",
@@ -256,9 +263,5 @@ int gb_interface_init(struct gb_interface *intf)
                }
        }
 
-       ret = 0;
-
-free_manifest:
-       kfree(manifest);
-       return ret;
+       return 0;
 }
index 8d48cfa378e1afaa4530ccbdae5f47a0acf6cbd5..5238804e236bc33eac31ba526fdd11e08d59771f 100644 (file)
@@ -48,6 +48,7 @@ struct gb_interface *gb_interface_find(struct gb_host_device *hd,
 struct gb_interface *gb_interface_create(struct gb_host_device *hd,
                                         u8 interface_id);
 int gb_interface_init(struct gb_interface *intf);
+int gb_interface_add(struct gb_interface *intf);
 void gb_interface_remove(struct gb_interface *intf);
 void gb_interfaces_remove(struct gb_host_device *hd);
 
index efa418a1916c38c80f15864c91c26234d68f263c..0a6c0393e20e489b98e0f94b666c8860c759d476 100644 (file)
@@ -629,6 +629,10 @@ static void gb_svc_process_intf_hotplug(struct gb_operation *operation)
                goto destroy_route;
        }
 
+       ret = gb_interface_add(intf);
+       if (ret)
+               goto destroy_route;
+
        return;
 
 destroy_route: