From 7a24a3f6ce507a3169bbc38fc70b9d0919a44cd5 Mon Sep 17 00:00:00 2001 From: Viresh Kumar Date: Tue, 21 Jul 2015 17:44:17 +0530 Subject: [PATCH] greybus: interface: Update gb_create_control_connection() to support SVC protocol We need to create bundle/connection for svc cport after the endo layout and interface id is known to the AP. gb_create_control_connection() can be reused for this, but it should be renamed to something more appropriate, as its not about control-connection anymore. Lets name it gb_create_bundle_connection(). Signed-off-by: Viresh Kumar Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/interface.c | 34 +++++++++++++++++++++++------ drivers/staging/greybus/interface.h | 2 +- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/drivers/staging/greybus/interface.c b/drivers/staging/greybus/interface.c index dfc31a0d074d..6d6128570837 100644 --- a/drivers/staging/greybus/interface.c +++ b/drivers/staging/greybus/interface.c @@ -70,19 +70,39 @@ struct device_type greybus_interface_type = { /* * Create kernel structures corresponding to a bundle and connection for - * managing control CPort. + * managing control/svc CPort. */ -static int gb_create_control_connection(struct gb_interface *intf) +int gb_create_bundle_connection(struct gb_interface *intf, u8 class) { struct gb_bundle *bundle; + u32 ida_start, ida_end; + u8 bundle_id, protocol_id; + u16 cport_id; + + if (class == GREYBUS_CLASS_CONTROL) { + protocol_id = GREYBUS_PROTOCOL_CONTROL; + bundle_id = GB_CONTROL_BUNDLE_ID; + cport_id = GB_CONTROL_CPORT_ID; + ida_start = 0; + ida_end = CPORT_ID_MAX; + } else if (class == GREYBUS_CLASS_SVC) { + protocol_id = GREYBUS_PROTOCOL_SVC; + bundle_id = GB_SVC_BUNDLE_ID; + cport_id = GB_SVC_CPORT_ID; + ida_start = GB_SVC_CPORT_ID; + ida_end = GB_SVC_CPORT_ID + 1; + } else { + WARN_ON(1); + return -EINVAL; + } - bundle = gb_bundle_create(intf, GB_CONTROL_BUNDLE_ID, - GREYBUS_CLASS_CONTROL); + bundle = gb_bundle_create(intf, bundle_id, class); if (!bundle) return -EINVAL; - if (!gb_connection_create(bundle, GB_CONTROL_CPORT_ID, - GREYBUS_PROTOCOL_CONTROL)) + if (!gb_connection_create_range(bundle->intf->hd, bundle, &bundle->dev, + cport_id, protocol_id, ida_start, + ida_end)) return -EINVAL; return 0; @@ -202,7 +222,7 @@ int gb_interface_init(struct gb_interface *intf, u8 device_id) intf->device_id = device_id; /* Establish control CPort connection */ - ret = gb_create_control_connection(intf); + ret = gb_create_bundle_connection(intf, GREYBUS_CLASS_CONTROL); if (ret) { dev_err(&intf->dev, "Failed to create control CPort connection (%d)\n", ret); return ret; diff --git a/drivers/staging/greybus/interface.h b/drivers/staging/greybus/interface.h index c2bcb92dacdb..04d330c297e1 100644 --- a/drivers/staging/greybus/interface.h +++ b/drivers/staging/greybus/interface.h @@ -56,5 +56,5 @@ int gb_interface_init(struct gb_interface *intf, u8 device_id); void gb_interface_remove(struct greybus_host_device *hd, u8 interface_id); void gb_interfaces_remove(struct greybus_host_device *hd); - +int gb_create_bundle_connection(struct gb_interface *intf, u8 class); #endif /* __INTERFACE_H */ -- 2.20.1