/*
* 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;
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;