This patch is to create driver/usb/core/port.c and move usb port related code into it. Signed-off-by: Lan Tianyu <tianyu.lan@xxxxxxxxx> --- 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html