-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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>
- Loading branch information
Lan Tianyu
authored and
Greg Kroah-Hartman
committed
Jan 18, 2013
1 parent
a29c408
commit 6e30d7c
Showing
4 changed files
with
165 additions
and
106 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} | ||
|