diff --git a/drivers/staging/greybus/Documentation/sysfs-bus-greybus b/drivers/staging/greybus/Documentation/sysfs-bus-greybus index 0268dd24d2a4..808fde96f56b 100644 --- a/drivers/staging/greybus/Documentation/sysfs-bus-greybus +++ b/drivers/staging/greybus/Documentation/sysfs-bus-greybus @@ -105,6 +105,13 @@ Contact: Greg Kroah-Hartman Description: Vendor ID string of a Greybus interface block. +What: /sys/bus/greybus/device/.../device_id +Date: October 2015 +KernelVersion: 4.XX +Contact: Greg Kroah-Hartman +Description: + The device ID of a Greybus interface block. + What: /sys/bus/greybus/device/.../state Date: October 2015 KernelVersion: 4.XX @@ -126,13 +133,6 @@ Contact: Greg Kroah-Hartman Description: The protocol ID of a Greybus connection. -What: /sys/bus/greybus/device/.../device_id -Date: October 2015 -KernelVersion: 4.XX -Contact: Greg Kroah-Hartman -Description: - The device ID of a Greybus bundle. - What: /sys/bus/greybus/device/.../state Date: October 2015 KernelVersion: 4.XX diff --git a/drivers/staging/greybus/bundle.c b/drivers/staging/greybus/bundle.c index e636230144c7..c6694aebb65b 100644 --- a/drivers/staging/greybus/bundle.c +++ b/drivers/staging/greybus/bundle.c @@ -13,15 +13,6 @@ static void gb_bundle_connections_exit(struct gb_bundle *bundle); static int gb_bundle_connections_init(struct gb_bundle *bundle); -static ssize_t device_id_show(struct device *dev, struct device_attribute *attr, - char *buf) -{ - struct gb_bundle *bundle = to_gb_bundle(dev); - - return sprintf(buf, "%d\n", bundle->device_id); -} -static DEVICE_ATTR_RO(device_id); - static ssize_t class_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -61,7 +52,6 @@ static DEVICE_ATTR_RW(state); static struct attribute *bundle_attrs[] = { - &dev_attr_device_id.attr, &dev_attr_class.attr, &dev_attr_state.attr, NULL, @@ -184,9 +174,6 @@ struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id, bundle->class = class; INIT_LIST_HEAD(&bundle->connections); - /* Invalid device id to start with */ - bundle->device_id = GB_DEVICE_ID_BAD; - /* Build up the bundle device structures and register it with the * driver core */ bundle->dev.parent = &intf->dev; @@ -225,7 +212,7 @@ void gb_bundle_destroy(struct gb_bundle *bundle) device_unregister(&bundle->dev); } -int gb_bundle_init(struct gb_bundle *bundle, u8 device_id) +int gb_bundle_init(struct gb_bundle *bundle) { struct gb_interface *intf = bundle->intf; int ret; @@ -234,8 +221,6 @@ int gb_bundle_init(struct gb_bundle *bundle, u8 device_id) if (intf->control && bundle->id == GB_CONTROL_BUNDLE_ID) return 0; - bundle->device_id = device_id; - ret = gb_bundle_connections_init(bundle); if (ret) { dev_err(intf->hd->parent, "interface bundle init error %d\n", @@ -247,13 +232,13 @@ int gb_bundle_init(struct gb_bundle *bundle, u8 device_id) return 0; } -int gb_bundles_init(struct gb_interface *intf, u8 device_id) +int gb_bundles_init(struct gb_interface *intf) { struct gb_bundle *bundle; int ret = 0; list_for_each_entry(bundle, &intf->bundles, links) { - ret = gb_bundle_init(bundle, device_id); + ret = gb_bundle_init(bundle); if (ret) { dev_err(intf->hd->parent, "Failed to initialize bundle %hhu\n", diff --git a/drivers/staging/greybus/bundle.h b/drivers/staging/greybus/bundle.h index 887883dabfc0..60033b82ab3f 100644 --- a/drivers/staging/greybus/bundle.h +++ b/drivers/staging/greybus/bundle.h @@ -18,7 +18,6 @@ struct gb_bundle { struct gb_interface *intf; u8 id; u8 class; - u8 device_id; struct list_head connections; u8 *state; @@ -32,8 +31,8 @@ struct gb_bundle { struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id, u8 class); void gb_bundle_destroy(struct gb_bundle *bundle); -int gb_bundle_init(struct gb_bundle *bundle, u8 device_id); -int gb_bundles_init(struct gb_interface *intf, u8 device_id); +int gb_bundle_init(struct gb_bundle *bundle); +int gb_bundles_init(struct gb_interface *intf); struct gb_bundle *gb_bundle_find(struct gb_interface *intf, u8 bundle_id); void gb_bundle_bind_protocols(void); diff --git a/drivers/staging/greybus/connection.c b/drivers/staging/greybus/connection.c index 85b2a3370744..2e306d13ac28 100644 --- a/drivers/staging/greybus/connection.c +++ b/drivers/staging/greybus/connection.c @@ -102,7 +102,7 @@ struct device_type greybus_connection_type = { void gb_connection_bind_protocol(struct gb_connection *connection) { - struct gb_bundle *bundle; + struct gb_interface *intf; struct gb_protocol *protocol; /* If we already have a protocol bound here, just return */ @@ -117,11 +117,11 @@ void gb_connection_bind_protocol(struct gb_connection *connection) connection->protocol = protocol; /* - * If we have a valid device_id for the bundle, then we have an active - * device, so bring up the connection at the same time. + * If we have a valid device_id for the interface block, then we have an + * active device, so bring up the connection at the same time. * */ - bundle = connection->bundle; - if (bundle->device_id != GB_DEVICE_ID_BAD) + intf = connection->bundle->intf; + if (intf->device_id != GB_DEVICE_ID_BAD) gb_connection_init(connection); } diff --git a/drivers/staging/greybus/interface.c b/drivers/staging/greybus/interface.c index 901c4acc2421..f9fd479bfd8b 100644 --- a/drivers/staging/greybus/interface.c +++ b/drivers/staging/greybus/interface.c @@ -20,6 +20,7 @@ static ssize_t field##_show(struct device *dev, \ } \ static DEVICE_ATTR_RO(field) +gb_interface_attr(device_id, d); gb_interface_attr(vendor, x); gb_interface_attr(product, x); gb_interface_attr(unique_id, llX); @@ -27,6 +28,7 @@ gb_interface_attr(vendor_string, s); gb_interface_attr(product_string, s); static struct attribute *interface_attrs[] = { + &dev_attr_device_id.attr, &dev_attr_vendor.attr, &dev_attr_product.attr, &dev_attr_unique_id.attr, @@ -71,10 +73,9 @@ struct device_type greybus_interface_type = { * managing control CPort. Also initialize the bundle, which will request SVC to * set route and will initialize the control protocol for this connection. */ -static int gb_create_control_connection(struct gb_interface *intf, u8 device_id) +static int gb_create_control_connection(struct gb_interface *intf) { struct gb_bundle *bundle; - int ret; bundle = gb_bundle_create(intf, GB_CONTROL_BUNDLE_ID, GREYBUS_CLASS_CONTROL); @@ -85,14 +86,6 @@ static int gb_create_control_connection(struct gb_interface *intf, u8 device_id) GREYBUS_PROTOCOL_CONTROL)) return -EINVAL; - ret = gb_bundle_init(bundle, device_id); - if (ret) { - dev_err(&intf->dev, - "error %d initializing bundles for interface %hu\n", - ret, intf->interface_id); - return ret; - } - return 0; } @@ -136,6 +129,9 @@ struct gb_interface *gb_interface_create(struct greybus_host_device *hd, INIT_LIST_HEAD(&intf->bundles); INIT_LIST_HEAD(&intf->manifest_descs); + /* Invalid device id to start with */ + intf->device_id = GB_DEVICE_ID_BAD; + intf->dev.parent = &module->dev; intf->dev.bus = &greybus_bus_type; intf->dev.type = &greybus_interface_type; @@ -204,8 +200,10 @@ int gb_interface_init(struct gb_interface *intf, u8 device_id) int ret, size; void *manifest; + intf->device_id = device_id; + /* Establish control CPort connection */ - ret = gb_create_control_connection(intf, device_id); + ret = gb_create_control_connection(intf); if (ret) { dev_err(&intf->dev, "Failed to create control CPort connection (%d)\n", ret); return ret; @@ -243,12 +241,6 @@ int gb_interface_init(struct gb_interface *intf, u8 device_id) goto free_manifest; } - ret = gb_bundles_init(intf, device_id); - if (ret) - dev_err(&intf->dev, - "Error %d initializing bundles for interface %hu\n", - ret, intf->interface_id); - /* * XXX * We've successfully parsed the manifest. Now we need to diff --git a/drivers/staging/greybus/interface.h b/drivers/staging/greybus/interface.h index 90dbff13e977..86eb8947a3d6 100644 --- a/drivers/staging/greybus/interface.h +++ b/drivers/staging/greybus/interface.h @@ -19,6 +19,7 @@ struct gb_interface { struct list_head links; /* greybus_host_device->interfaces */ struct list_head manifest_descs; u8 interface_id; /* Physical location within the Endo */ + u8 device_id; /* Device id allocated for the interface block by the SVC */ /* Information taken from the manifest descriptor */ u16 vendor;