diff options
author | Johan Hovold | 2016-03-09 12:20:36 +0100 |
---|---|---|
committer | Greg Kroah-Hartman | 2016-03-10 22:57:42 +0100 |
commit | 7a137fb290df63f24242fc4996decd0b339ba3b1 (patch) | |
tree | a977d0c2845747f32274a0b801cc855fcff38e02 /drivers | |
parent | greybus: svc: refactor interface-route destruction (diff) | |
download | kernel-qcow2-linux-7a137fb290df63f24242fc4996decd0b339ba3b1.tar.gz kernel-qcow2-linux-7a137fb290df63f24242fc4996decd0b339ba3b1.tar.xz kernel-qcow2-linux-7a137fb290df63f24242fc4996decd0b339ba3b1.zip |
greybus: interface: separate initialisation and registration
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/staging/greybus/interface.c | 31 | ||||
-rw-r--r-- | drivers/staging/greybus/interface.h | 1 | ||||
-rw-r--r-- | drivers/staging/greybus/svc.c | 4 |
3 files changed, 22 insertions, 14 deletions
diff --git a/drivers/staging/greybus/interface.c b/drivers/staging/greybus/interface.c index 63dd2854ea70..a32e564851d8 100644 --- a/drivers/staging/greybus/interface.c +++ b/drivers/staging/greybus/interface.c @@ -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; } diff --git a/drivers/staging/greybus/interface.h b/drivers/staging/greybus/interface.h index 8d48cfa378e1..5238804e236b 100644 --- a/drivers/staging/greybus/interface.h +++ b/drivers/staging/greybus/interface.h @@ -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); diff --git a/drivers/staging/greybus/svc.c b/drivers/staging/greybus/svc.c index efa418a1916c..0a6c0393e20e 100644 --- a/drivers/staging/greybus/svc.c +++ b/drivers/staging/greybus/svc.c @@ -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: |