summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/staging/greybus/Documentation/sysfs-bus-greybus28
-rw-r--r--drivers/staging/greybus/control.c29
-rw-r--r--drivers/staging/greybus/control.h3
-rw-r--r--drivers/staging/greybus/interface.c7
-rw-r--r--drivers/staging/greybus/interface.h4
-rw-r--r--drivers/staging/greybus/manifest.c13
6 files changed, 53 insertions, 31 deletions
diff --git a/drivers/staging/greybus/Documentation/sysfs-bus-greybus b/drivers/staging/greybus/Documentation/sysfs-bus-greybus
index d8bf30e90586..4831efb9d0f7 100644
--- a/drivers/staging/greybus/Documentation/sysfs-bus-greybus
+++ b/drivers/staging/greybus/Documentation/sysfs-bus-greybus
@@ -52,13 +52,6 @@ Contact: Greg Kroah-Hartman <greg@kroah.com>
Description:
Product ID of a Greybus interface.
-What: /sys/bus/greybus/device/N-I/product_string
-Date: October 2015
-KernelVersion: 4.XX
-Contact: Greg Kroah-Hartman <greg@kroah.com>
-Description:
- Product ID string of a Greybus interface.
-
What: /sys/bus/greybus/device/N-I/vendor_id
Date: October 2015
KernelVersion: 4.XX
@@ -66,13 +59,6 @@ Contact: Greg Kroah-Hartman <greg@kroah.com>
Description:
Vendor ID of a Greybus interface.
-What: /sys/bus/greybus/device/N-I/vendor_string
-Date: October 2015
-KernelVersion: 4.XX
-Contact: Greg Kroah-Hartman <greg@kroah.com>
-Description:
- Vendor ID string of a Greybus interface block.
-
What: /sys/bus/greybus/device/N-I/version
Date: October 2015
KernelVersion: 4.XX
@@ -110,6 +96,20 @@ Description:
A bundle B on the Interface I, B is replaced by a 1-byte
number representing the bundle.
+What: /sys/bus/greybus/device/N-I.ctrl/product_string
+Date: October 2015
+KernelVersion: 4.XX
+Contact: Greg Kroah-Hartman <greg@kroah.com>
+Description:
+ Product ID string of a Greybus interface.
+
+What: /sys/bus/greybus/device/N-I.ctrl/vendor_string
+Date: October 2015
+KernelVersion: 4.XX
+Contact: Greg Kroah-Hartman <greg@kroah.com>
+Description:
+ Vendor ID string of a Greybus interface.
+
What: /sys/bus/greybus/device/N-I.B/bundle_class
Date: October 2015
KernelVersion: 4.XX
diff --git a/drivers/staging/greybus/control.c b/drivers/staging/greybus/control.c
index 606361906482..58a3d6089701 100644
--- a/drivers/staging/greybus/control.c
+++ b/drivers/staging/greybus/control.c
@@ -213,12 +213,40 @@ int gb_control_timesync_authoritative(struct gb_control *control,
NULL, 0);
}
+static ssize_t vendor_string_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct gb_control *control = to_gb_control(dev);
+
+ return scnprintf(buf, PAGE_SIZE, "%s\n", control->vendor_string);
+}
+static DEVICE_ATTR_RO(vendor_string);
+
+static ssize_t product_string_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct gb_control *control = to_gb_control(dev);
+
+ return scnprintf(buf, PAGE_SIZE, "%s\n", control->product_string);
+}
+static DEVICE_ATTR_RO(product_string);
+
+static struct attribute *control_attrs[] = {
+ &dev_attr_vendor_string.attr,
+ &dev_attr_product_string.attr,
+ NULL,
+};
+ATTRIBUTE_GROUPS(control);
+
static void gb_control_release(struct device *dev)
{
struct gb_control *control = to_gb_control(dev);
gb_connection_destroy(control->connection);
+ kfree(control->vendor_string);
+ kfree(control->product_string);
+
kfree(control);
}
@@ -249,6 +277,7 @@ struct gb_control *gb_control_create(struct gb_interface *intf)
control->dev.parent = &intf->dev;
control->dev.bus = &greybus_bus_type;
control->dev.type = &greybus_control_type;
+ control->dev.groups = control_groups;
control->dev.dma_mask = intf->dev.dma_mask;
device_initialize(&control->dev);
dev_set_name(&control->dev, "%s.ctrl", dev_name(&intf->dev));
diff --git a/drivers/staging/greybus/control.h b/drivers/staging/greybus/control.h
index 102e937a982c..56fa2592762b 100644
--- a/drivers/staging/greybus/control.h
+++ b/drivers/staging/greybus/control.h
@@ -20,6 +20,9 @@ struct gb_control {
u8 protocol_minor;
bool has_bundle_version;
+
+ char *vendor_string;
+ char *product_string;
};
#define to_gb_control(d) container_of(d, struct gb_control, dev)
diff --git a/drivers/staging/greybus/interface.c b/drivers/staging/greybus/interface.c
index e0e08731c055..ed56f2de7dbd 100644
--- a/drivers/staging/greybus/interface.c
+++ b/drivers/staging/greybus/interface.c
@@ -249,8 +249,6 @@ gb_interface_attr(ddbl1_product_id, "0x%08x");
gb_interface_attr(interface_id, "%u");
gb_interface_attr(vendor_id, "0x%08x");
gb_interface_attr(product_id, "0x%08x");
-gb_interface_attr(vendor_string, "%s");
-gb_interface_attr(product_string, "%s");
gb_interface_attr(serial_number, "0x%016llx");
static ssize_t version_show(struct device *dev, struct device_attribute *attr,
@@ -326,8 +324,6 @@ static struct attribute *interface_attrs[] = {
&dev_attr_interface_id.attr,
&dev_attr_vendor_id.attr,
&dev_attr_product_id.attr,
- &dev_attr_vendor_string.attr,
- &dev_attr_product_string.attr,
&dev_attr_serial_number.attr,
&dev_attr_version.attr,
&dev_attr_voltage_now.attr,
@@ -356,9 +352,6 @@ static void gb_interface_release(struct device *dev)
{
struct gb_interface *intf = to_gb_interface(dev);
- kfree(intf->product_string);
- kfree(intf->vendor_string);
-
if (intf->control)
gb_control_put(intf->control);
diff --git a/drivers/staging/greybus/interface.h b/drivers/staging/greybus/interface.h
index 15c687f5dbc1..567b6c8ae713 100644
--- a/drivers/staging/greybus/interface.h
+++ b/drivers/staging/greybus/interface.h
@@ -25,10 +25,6 @@ struct gb_interface {
u8 interface_id; /* Physical location within the Endo */
u8 device_id;
- /* Information taken from the manifest descriptor */
- char *vendor_string;
- char *product_string;
-
u32 ddbl1_manufacturer_id;
u32 ddbl1_product_id;
u32 vendor_id;
diff --git a/drivers/staging/greybus/manifest.c b/drivers/staging/greybus/manifest.c
index cca4592c15ad..886c5fb91d9f 100644
--- a/drivers/staging/greybus/manifest.c
+++ b/drivers/staging/greybus/manifest.c
@@ -384,18 +384,19 @@ static bool gb_manifest_parse_interface(struct gb_interface *intf,
struct manifest_desc *interface_desc)
{
struct greybus_descriptor_interface *desc_intf = interface_desc->data;
+ struct gb_control *control = intf->control;
char *str;
/* Handle the strings first--they can fail */
str = gb_string_get(intf, desc_intf->vendor_stringid);
if (IS_ERR(str))
return false;
- intf->vendor_string = str;
+ control->vendor_string = str;
str = gb_string_get(intf, desc_intf->product_stringid);
if (IS_ERR(str))
goto out_free_vendor_string;
- intf->product_string = str;
+ control->product_string = str;
/* Release the interface descriptor, now that we're done with it */
release_manifest_descriptor(interface_desc);
@@ -408,11 +409,11 @@ static bool gb_manifest_parse_interface(struct gb_interface *intf,
return true;
out_err:
- kfree(intf->product_string);
- intf->product_string = NULL;
+ kfree(control->product_string);
+ control->product_string = NULL;
out_free_vendor_string:
- kfree(intf->vendor_string);
- intf->vendor_string = NULL;
+ kfree(control->vendor_string);
+ control->vendor_string = NULL;
return false;
}