summaryrefslogtreecommitdiffstats
path: root/drivers/staging
diff options
context:
space:
mode:
authorAlex Elder <elder@linaro.org>2014-10-22 02:04:32 -0500
committerGreg Kroah-Hartman <greg@kroah.com>2014-10-22 17:22:22 +0800
commitc41b4f121240df46e5d901ad8aa9b9051b6c58e1 (patch)
treeecdce71ca5de3935ab367764abfc6ade618a9268 /drivers/staging
parent525f1467bc22ad7d0866444b3a57c21ba64a0dd2 (diff)
downloadlinux-c41b4f121240df46e5d901ad8aa9b9051b6c58e1.tar.gz
linux-c41b4f121240df46e5d901ad8aa9b9051b6c58e1.tar.bz2
linux-c41b4f121240df46e5d901ad8aa9b9051b6c58e1.zip
greybus: only initialize interfaces when up
Rather than bringing up all interfaces described in the manifest, wait until we get a link up message, and at that time go initialize the link. Signed-off-by: Alex Elder <elder@linaro.org> Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
Diffstat (limited to 'drivers/staging')
-rw-r--r--drivers/staging/greybus/ap.c17
-rw-r--r--drivers/staging/greybus/core.c2
-rw-r--r--drivers/staging/greybus/module.c24
-rw-r--r--drivers/staging/greybus/module.h3
4 files changed, 27 insertions, 19 deletions
diff --git a/drivers/staging/greybus/ap.c b/drivers/staging/greybus/ap.c
index 7ea329cfa1eb..1a9112a21bbb 100644
--- a/drivers/staging/greybus/ap.c
+++ b/drivers/staging/greybus/ap.c
@@ -126,7 +126,7 @@ static void svc_management(struct svc_function_unipro_management *management,
int payload_length, struct greybus_host_device *hd)
{
struct gb_module *module;
- struct gb_interface *interface;
+ int ret;
if (payload_length != sizeof(struct svc_function_unipro_management)) {
dev_err(hd->parent,
@@ -143,15 +143,14 @@ static void svc_management(struct svc_function_unipro_management *management,
management->link_up.module_id);
return;
}
- interface = gb_interface_find(module,
- management->link_up.interface_id);
- if (!interface) {
- dev_err(hd->parent, "Interface ID %d not found\n",
+ ret = gb_module_interface_init(module,
+ management->link_up.interface_id,
+ management->link_up.device_id);
+ if (ret)
+ dev_err(hd->parent, "error %d initializing"
+ "module %hhu interface %hhu\n",
+ ret, management->link_up.module_id,
management->link_up.interface_id);
- return;
- }
- interface->device_id = management->link_up.device_id;
- (void)svc_set_route_send(interface, hd);
break;
case SVC_MANAGEMENT_AP_DEVICE_ID:
hd->device_id = management->ap_device_id.device_id;
diff --git a/drivers/staging/greybus/core.c b/drivers/staging/greybus/core.c
index 480e12bac84a..9f4ae1c63fa0 100644
--- a/drivers/staging/greybus/core.c
+++ b/drivers/staging/greybus/core.c
@@ -181,8 +181,6 @@ void gb_add_module(struct greybus_host_device *hd, u8 module_id,
if (retval)
goto err_device;
- gb_module_interfaces_init(gmod);
-
return;
err_device:
put_device(&gmod->dev);
diff --git a/drivers/staging/greybus/module.c b/drivers/staging/greybus/module.c
index 50139f41fe20..bcb0ff098164 100644
--- a/drivers/staging/greybus/module.c
+++ b/drivers/staging/greybus/module.c
@@ -118,15 +118,25 @@ struct gb_module *gb_module_find(struct greybus_host_device *hd, u8 module_id)
return NULL;
}
-void gb_module_interfaces_init(struct gb_module *gmod)
+int
+gb_module_interface_init(struct gb_module *gmod, u8 interface_id, u8 device_id)
{
struct gb_interface *interface;
- int ret = 0;
+ int ret;
- list_for_each_entry(interface, &gmod->interfaces, links) {
- ret = gb_interface_connections_init(interface);
- if (ret)
- dev_err(gmod->hd->parent,
- "module interface init error %d\n", ret);
+ interface = gb_interface_find(gmod, interface_id);
+ if (!interface) {
+ dev_err(gmod->hd->parent, "module %hhu not found\n",
+ interface_id);
+ return -ENOENT;
}
+ ret = gb_interface_connections_init(interface);
+ if (ret) {
+ dev_err(gmod->hd->parent, "module interface init error %d\n",
+ ret);
+ return ret;
+ }
+ interface->device_id = device_id;
+
+ return svc_set_route_send(interface, gmod->hd);
}
diff --git a/drivers/staging/greybus/module.h b/drivers/staging/greybus/module.h
index 82def46e5ab1..74ac4fdd3c83 100644
--- a/drivers/staging/greybus/module.h
+++ b/drivers/staging/greybus/module.h
@@ -55,6 +55,7 @@ void gb_module_destroy(struct gb_module *module);
struct gb_module *gb_module_find(struct greybus_host_device *hd,
u8 module_id);
-void gb_module_interfaces_init(struct gb_module *gmod);
+int gb_module_interface_init(struct gb_module *gmod, u8 module_id,
+ u8 device_id);
#endif /* __MODULE_H */