summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJohan Hovold2016-03-09 12:20:36 +0100
committerGreg Kroah-Hartman2016-03-10 22:57:42 +0100
commit7a137fb290df63f24242fc4996decd0b339ba3b1 (patch)
treea977d0c2845747f32274a0b801cc855fcff38e02 /drivers
parentgreybus: svc: refactor interface-route destruction (diff)
downloadkernel-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.c31
-rw-r--r--drivers/staging/greybus/interface.h1
-rw-r--r--drivers/staging/greybus/svc.c4
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: