Some platforms provide usb port connect types through ACPI. This
patch is to add this new attribute to expose these information
to user space.

Acked-by: Alan Stern <st...@rowland.harvard.edu>
Signed-off-by: Lan Tianyu <tianyu....@intel.com>
---
 Documentation/ABI/testing/sysfs-bus-usb |    9 +++++++
 drivers/usb/core/port.c                 |   43 +++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+)

diff --git a/Documentation/ABI/testing/sysfs-bus-usb 
b/Documentation/ABI/testing/sysfs-bus-usb
index b6fbe51..c8baaf5 100644
--- a/Documentation/ABI/testing/sysfs-bus-usb
+++ b/Documentation/ABI/testing/sysfs-bus-usb
@@ -227,3 +227,12 @@ Contact:   Lan Tianyu <tianyu....@intel.com>
 Description:
                The /sys/bus/usb/devices/.../(hub interface)/portX
                is usb port device's sysfs directory.
+
+What:          /sys/bus/usb/devices/.../(hub interface)/portX/connect_type
+Date:          January 2013
+Contact:       Lan Tianyu <tianyu....@intel.com>
+Description:
+               Some platforms provide usb port connect types through ACPI.
+               This attribute is to expose these information to user space.
+               The file will read "hotplug", "wired" and "not used" if the
+               information is available, and "unknown" otherwise.
diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c
index 3734850..fe5959f 100644
--- a/drivers/usb/core/port.c
+++ b/drivers/usb/core/port.c
@@ -20,6 +20,48 @@
 
 #include "hub.h"
 
+static const struct attribute_group *port_dev_group[];
+
+static ssize_t show_port_connect_type(struct device *dev,
+       struct device_attribute *attr, char *buf)
+{
+       struct usb_port *port_dev = to_usb_port(dev);
+       char *result;
+
+       switch (port_dev->connect_type) {
+       case USB_PORT_CONNECT_TYPE_HOT_PLUG:
+               result = "hotplug";
+               break;
+       case USB_PORT_CONNECT_TYPE_HARD_WIRED:
+               result = "hardwired";
+               break;
+       case USB_PORT_NOT_USED:
+               result = "not used";
+               break;
+       default:
+               result = "unknown";
+               break;
+       }
+
+       return sprintf(buf, "%s\n", result);
+}
+static DEVICE_ATTR(connect_type, S_IRUGO, show_port_connect_type,
+               NULL);
+
+static struct attribute *port_dev_attrs[] = {
+       &dev_attr_connect_type.attr,
+       NULL,
+};
+
+static struct attribute_group port_dev_attr_grp = {
+       .attrs = port_dev_attrs,
+};
+
+static const struct attribute_group *port_dev_group[] = {
+       &port_dev_attr_grp,
+       NULL,
+};
+
 static void usb_port_device_release(struct device *dev)
 {
        struct usb_port *port_dev = to_usb_port(dev);
@@ -45,6 +87,7 @@ int usb_hub_create_port_device(struct usb_hub *hub, int port1)
 
        hub->ports[port1 - 1] = port_dev;
        port_dev->dev.parent = hub->intfdev;
+       port_dev->dev.groups = port_dev_group;
        port_dev->dev.type = &usb_port_device_type;
        dev_set_name(&port_dev->dev, "port%d", port1);
 
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to