forked from mirrors/linux
		
	usb: Add driver/usb/core/(port.c,hub.h) files
This patch is to create driver/usb/core/(port.c,hub.h) files and move usb port related code into port.c. Signed-off-by: Lan Tianyu <tianyu.lan@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									a29c408521
								
							
						
					
					
						commit
						6e30d7cba9
					
				
					 4 changed files with 165 additions and 106 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,7 +30,7 @@
 | 
			
		|||
#include <asm/uaccess.h>
 | 
			
		||||
#include <asm/byteorder.h>
 | 
			
		||||
 | 
			
		||||
#include "usb.h"
 | 
			
		||||
#include "hub.h"
 | 
			
		||||
 | 
			
		||||
/* if we are in debug mode, always announce new devices */
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
| 
						 | 
				
			
			@ -42,62 +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;
 | 
			
		||||
	struct kref		kref;
 | 
			
		||||
	struct urb		*urb;		/* for interrupt polling pipe */
 | 
			
		||||
 | 
			
		||||
	/* buffer for urb ... with extra space in case of babble */
 | 
			
		||||
	char			(*buffer)[8];
 | 
			
		||||
	union {
 | 
			
		||||
		struct usb_hub_status	hub;
 | 
			
		||||
		struct usb_port_status	port;
 | 
			
		||||
	}			*status;	/* buffer for status reports */
 | 
			
		||||
	struct mutex		status_mutex;	/* for the status buffer */
 | 
			
		||||
 | 
			
		||||
	int			error;		/* last reported error */
 | 
			
		||||
	int			nerrors;	/* track consecutive errors */
 | 
			
		||||
 | 
			
		||||
	struct list_head	event_list;	/* hubs w/data or errs ready */
 | 
			
		||||
	unsigned long		event_bits[1];	/* status change bitmask */
 | 
			
		||||
	unsigned long		change_bits[1];	/* ports with logical connect
 | 
			
		||||
							status change */
 | 
			
		||||
	unsigned long		busy_bits[1];	/* ports being reset or
 | 
			
		||||
							resumed */
 | 
			
		||||
	unsigned long		removed_bits[1]; /* ports with a "removed"
 | 
			
		||||
							device present */
 | 
			
		||||
	unsigned long		wakeup_bits[1];	/* ports that have signaled
 | 
			
		||||
							remote wakeup */
 | 
			
		||||
#if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */
 | 
			
		||||
#error event_bits[] is too short!
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	struct usb_hub_descriptor *descriptor;	/* class descriptor */
 | 
			
		||||
	struct usb_tt		tt;		/* Transaction Translator */
 | 
			
		||||
 | 
			
		||||
	unsigned		mA_per_port;	/* current for each child */
 | 
			
		||||
 | 
			
		||||
	unsigned		limited_power:1;
 | 
			
		||||
	unsigned		quiescing:1;
 | 
			
		||||
	unsigned		disconnected:1;
 | 
			
		||||
 | 
			
		||||
	unsigned		quirk_check_port_auto_suspend:1;
 | 
			
		||||
 | 
			
		||||
	unsigned		has_indicators:1;
 | 
			
		||||
	u8			indicator[USB_MAXCHILDREN];
 | 
			
		||||
	struct delayed_work	leds;
 | 
			
		||||
	struct delayed_work	init_work;
 | 
			
		||||
	struct usb_port		**ports;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static inline int hub_is_superspeed(struct usb_device *hdev)
 | 
			
		||||
{
 | 
			
		||||
	return (hdev->descriptor.bDeviceProtocol == USB_HUB_PR_SS);
 | 
			
		||||
| 
						 | 
				
			
			@ -168,9 +112,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)
 | 
			
		||||
| 
						 | 
				
			
			@ -1294,52 +1235,6 @@ 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);
 | 
			
		||||
 | 
			
		||||
	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.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;
 | 
			
		||||
	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)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										97
									
								
								drivers/usb/core/hub.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								drivers/usb/core/hub.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,97 @@
 | 
			
		|||
/*
 | 
			
		||||
 * usb hub driver head file
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 1999 Linus Torvalds
 | 
			
		||||
 * Copyright (C) 1999 Johannes Erdfelt
 | 
			
		||||
 * Copyright (C) 1999 Gregory P. Smith
 | 
			
		||||
 * Copyright (C) 2001 Brad Hards (bhards@bigpond.net.au)
 | 
			
		||||
 * Copyright (C) 2012 Intel Corp (tianyu.lan@intel.com)
 | 
			
		||||
 *
 | 
			
		||||
 *  move struct usb_hub to this file.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License version 2 as
 | 
			
		||||
 * published by the Free Software Foundation.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful, but
 | 
			
		||||
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 | 
			
		||||
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 | 
			
		||||
 * for more details.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/usb.h>
 | 
			
		||||
#include <linux/usb/ch11.h>
 | 
			
		||||
#include <linux/usb/hcd.h>
 | 
			
		||||
#include "usb.h"
 | 
			
		||||
 | 
			
		||||
struct usb_hub {
 | 
			
		||||
	struct device		*intfdev;	/* the "interface" device */
 | 
			
		||||
	struct usb_device	*hdev;
 | 
			
		||||
	struct kref		kref;
 | 
			
		||||
	struct urb		*urb;		/* for interrupt polling pipe */
 | 
			
		||||
 | 
			
		||||
	/* buffer for urb ... with extra space in case of babble */
 | 
			
		||||
	char			(*buffer)[8];
 | 
			
		||||
	union {
 | 
			
		||||
		struct usb_hub_status	hub;
 | 
			
		||||
		struct usb_port_status	port;
 | 
			
		||||
	}			*status;	/* buffer for status reports */
 | 
			
		||||
	struct mutex		status_mutex;	/* for the status buffer */
 | 
			
		||||
 | 
			
		||||
	int			error;		/* last reported error */
 | 
			
		||||
	int			nerrors;	/* track consecutive errors */
 | 
			
		||||
 | 
			
		||||
	struct list_head	event_list;	/* hubs w/data or errs ready */
 | 
			
		||||
	unsigned long		event_bits[1];	/* status change bitmask */
 | 
			
		||||
	unsigned long		change_bits[1];	/* ports with logical connect
 | 
			
		||||
							status change */
 | 
			
		||||
	unsigned long		busy_bits[1];	/* ports being reset or
 | 
			
		||||
							resumed */
 | 
			
		||||
	unsigned long		removed_bits[1]; /* ports with a "removed"
 | 
			
		||||
							device present */
 | 
			
		||||
	unsigned long		wakeup_bits[1];	/* ports that have signaled
 | 
			
		||||
							remote wakeup */
 | 
			
		||||
#if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */
 | 
			
		||||
#error event_bits[] is too short!
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	struct usb_hub_descriptor *descriptor;	/* class descriptor */
 | 
			
		||||
	struct usb_tt		tt;		/* Transaction Translator */
 | 
			
		||||
 | 
			
		||||
	unsigned		mA_per_port;	/* current for each child */
 | 
			
		||||
 | 
			
		||||
	unsigned		limited_power:1;
 | 
			
		||||
	unsigned		quiescing:1;
 | 
			
		||||
	unsigned		disconnected:1;
 | 
			
		||||
 | 
			
		||||
	unsigned		quirk_check_port_auto_suspend:1;
 | 
			
		||||
 | 
			
		||||
	unsigned		has_indicators:1;
 | 
			
		||||
	u8			indicator[USB_MAXCHILDREN];
 | 
			
		||||
	struct delayed_work	leds;
 | 
			
		||||
	struct delayed_work	init_work;
 | 
			
		||||
	struct usb_port		**ports;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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)
 | 
			
		||||
 | 
			
		||||
extern int usb_hub_create_port_device(struct usb_hub *hub,
 | 
			
		||||
		int port1);
 | 
			
		||||
extern void usb_hub_remove_port_device(struct usb_hub *hub,
 | 
			
		||||
		int port1);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										66
									
								
								drivers/usb/core/port.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								drivers/usb/core/port.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,66 @@
 | 
			
		|||
/*
 | 
			
		||||
 * usb port device code
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2012 Intel Corp
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Lan Tianyu <tianyu.lan@intel.com>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License version 2 as
 | 
			
		||||
 * published by the Free Software Foundation.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful, but
 | 
			
		||||
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 | 
			
		||||
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 | 
			
		||||
 * for more details.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "hub.h"
 | 
			
		||||
 | 
			
		||||
static void usb_port_device_release(struct device *dev)
 | 
			
		||||
{
 | 
			
		||||
	struct usb_port *port_dev = to_usb_port(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 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.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;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
error_register:
 | 
			
		||||
	put_device(&port_dev->dev);
 | 
			
		||||
exit:
 | 
			
		||||
	return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void usb_hub_remove_port_device(struct usb_hub *hub,
 | 
			
		||||
				       int port1)
 | 
			
		||||
{
 | 
			
		||||
	device_unregister(&hub->ports[port1 - 1]->dev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in a new issue