This patch is to create driver/usb/core/port.c and move usb port related
code into it.

Signed-off-by: Lan Tianyu <tianyu....@intel.com>
---
 drivers/usb/core/Makefile |    1 +
 drivers/usb/core/hub.c    |  113 +++++++--------------------------------------
 drivers/usb/core/port.c   |   82 ++++++++++++++++++++++++++++++++
 drivers/usb/core/usb.h    |    3 ++
 include/linux/usb.h       |   16 +++++++
 5 files changed, 118 insertions(+), 97 deletions(-)
 create mode 100644 drivers/usb/core/port.c

diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
index 26059b9..5e847ad 100644
--- a/drivers/usb/core/Makefile
+++ b/drivers/usb/core/Makefile
@@ -7,6 +7,7 @@ ccflags-$(CONFIG_USB_DEBUG) := -DDEBUG
 usbcore-y := usb.o hub.o hcd.o urb.o message.o driver.o
 usbcore-y += config.o file.o buffer.o sysfs.o endpoint.o
 usbcore-y += devio.o notify.o generic.o quirks.o devices.o
+usbcore-y += port.o
 
 usbcore-$(CONFIG_PCI)          += hcd-pci.o
 usbcore-$(CONFIG_ACPI)         += usb-acpi.o
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 3c85fe1c..60746aa 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -42,13 +42,6 @@
 #define USB_VENDOR_GENESYS_LOGIC               0x05e3
 #define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND       0x01
 
-struct usb_port {
-       struct usb_device *child;
-       struct device dev;
-       struct dev_state *port_owner;
-       enum usb_port_connect_type connect_type;
-};
-
 struct usb_hub {
        struct device           *intfdev;       /* the "interface" device */
        struct usb_device       *hdev;
@@ -170,9 +163,6 @@ EXPORT_SYMBOL_GPL(ehci_cf_port_reset_rwsem);
 #define HUB_DEBOUNCE_STEP        25
 #define HUB_DEBOUNCE_STABLE     100
 
-#define to_usb_port(_dev) \
-       container_of(_dev, struct usb_port, dev)
-
 static int usb_reset_and_verify_device(struct usb_device *udev);
 
 static inline char *portspeed(struct usb_hub *hub, int portstatus)
@@ -1237,57 +1227,12 @@ static int hub_post_reset(struct usb_interface *intf)
        return 0;
 }
 
-static void usb_port_device_release(struct device *dev)
-{
-       struct usb_port *port_dev = to_usb_port(dev);
-
-       usb_acpi_unregister_power_resources(dev);
-       kfree(port_dev);
-}
-
 static void usb_hub_remove_port_device(struct usb_hub *hub,
                                       int port1)
 {
        device_unregister(&hub->ports[port1 - 1]->dev);
 }
 
-struct device_type usb_port_device_type = {
-       .name =         "usb_port",
-       .release =      usb_port_device_release,
-};
-
-static int usb_hub_create_port_device(struct usb_hub *hub,
-                                     int port1)
-{
-       struct usb_port *port_dev = NULL;
-       int retval;
-
-       port_dev = kzalloc(sizeof(*port_dev), GFP_KERNEL);
-       if (!port_dev) {
-               retval = -ENOMEM;
-               goto exit;
-       }
-
-       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);
-
-       retval = device_register(&port_dev->dev);
-       if (retval)
-               goto error_register;
-
-       usb_acpi_register_power_resources(&port_dev->dev);
-
-       return 0;
-
-error_register:
-       put_device(&port_dev->dev);
-exit:
-       return retval;
-}
-
 static int hub_configure(struct usb_hub *hub,
        struct usb_endpoint_descriptor *endpoint)
 {
@@ -1548,10 +1493,24 @@ static int hub_configure(struct usb_hub *hub,
        if (hub->has_indicators && blinkenlights)
                hub->indicator [0] = INDICATOR_CYCLE;
 
-       for (i = 0; i < hdev->maxchild; i++)
-               if (usb_hub_create_port_device(hub, i + 1) < 0)
+       for (i = 0; i < hdev->maxchild; i++) {
+               struct usb_port *port_dev = NULL;
+
+               port_dev = kzalloc(sizeof(*port_dev), GFP_KERNEL);
+               if (!port_dev) {
+                       dev_err(hub->intfdev,
+                               "couldn't create port%d device due to lack 
mem.\n", i + 1);
+                       continue;
+               }
+
+               hub->ports[i] = port_dev;
+
+               if (usb_hub_create_port_device(hub->intfdev, i + 1, port_dev) < 
0) {
                        dev_err(hub->intfdev,
                                "couldn't create port%d device.\n", i + 1);
+                       hub->ports[i] = NULL;
+               }
+       }
 
        if (!hub_is_superspeed(hdev)) {
                for (i = 1; i <= hdev->maxchild; i++)
@@ -4765,46 +4724,6 @@ static int hub_thread(void *__unused)
        return 0;
 }
 
-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 const struct usb_device_id hub_id_table[] = {
     { .match_flags = USB_DEVICE_ID_MATCH_VENDOR
                   | USB_DEVICE_ID_MATCH_INT_CLASS,
diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c
new file mode 100644
index 0000000..6523a03
--- /dev/null
+++ b/drivers/usb/core/port.c
@@ -0,0 +1,82 @@
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/module.h>
+#include <linux/usb.h>
+
+#include "usb.h"
+
+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);
+
+       usb_acpi_unregister_power_resources(dev);
+       kfree(port_dev);
+}
+
+struct device_type usb_port_device_type = {
+       .name =         "usb_port",
+       .release =      usb_port_device_release,
+};
+
+int usb_hub_create_port_device(struct device *intfdev,
+               int port1, struct usb_port *port_dev)
+{
+       int retval;
+
+       port_dev->dev.parent = 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);
+
+       retval = device_register(&port_dev->dev);
+       if (retval)
+               goto error_register;
+
+       usb_acpi_register_power_resources(&port_dev->dev);
+
+       return 0;
+
+error_register:
+       put_device(&port_dev->dev);
+       return retval;
+}
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h
index 38958fb..de7434b 100644
--- a/drivers/usb/core/usb.h
+++ b/drivers/usb/core/usb.h
@@ -60,6 +60,9 @@ extern void usb_hub_cleanup(void);
 extern int usb_major_init(void);
 extern void usb_major_cleanup(void);
 
+extern int usb_hub_create_port_device(struct device *intfdev,
+               int port1, struct usb_port *port_dev);
+
 #ifdef CONFIG_PM
 
 extern int usb_suspend(struct device *dev, pm_message_t msg);
diff --git a/include/linux/usb.h b/include/linux/usb.h
index e996bb6..c1f1346 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -572,6 +572,22 @@ struct usb_device {
 };
 #define        to_usb_device(d) container_of(d, struct usb_device, dev)
 
+/**
+ * struct usb port - kernel's representation of a usb port
+ * @child: usb device attatched to the port
+ * @dev: generic device interface
+ * @port_owner: port's owner
+ * @connect_type: port's connect type
+ */
+struct usb_port {
+       struct usb_device *child;
+       struct device dev;
+       struct dev_state *port_owner;
+       enum usb_port_connect_type connect_type;
+};
+#define to_usb_port(_dev) \
+       container_of(_dev, struct usb_port, dev)
+
 static inline struct usb_device *interface_to_usbdev(struct usb_interface 
*intf)
 {
        return to_usb_device(intf->dev.parent);
-- 
1.7.10.4

--
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