diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-11 17:48:20 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-11 17:48:20 -0500 |
commit | 414a6750e59b0b687034764c464e9ddecac0f7a6 (patch) | |
tree | 18a5ceb11359cd72fcb2d31b5eabf3e35328697f | |
parent | c6bd5bcc4983f1a2d2f87a3769bf309482ee8c04 (diff) | |
parent | fb37ef98015f864d22be223a0e0d93547cd1d4ef (diff) |
Merge tag 'usb-3.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB patches from Greg Kroah-Hartman:
"Here's the big set of USB patches for 3.8-rc1.
Lots of USB host driver cleanups in here, and a bit of a reorg of the
EHCI driver to make it easier for the different EHCI platform drivers
to all work together nicer, which was a reduction in overall code. We
also deleted some unused firmware files, and got rid of the very old
file_storage usb gadget driver that had been broken for a long time.
This means we ended up removing way more code than added, always a
nice thing to see:
310 files changed, 3028 insertions(+), 10754 deletions(-)
Other than that, the usual set of new device ids, driver fixes, gadget
driver and controller updates and the like.
All of these have been in the linux-next tree for a number of weeks.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>"
* tag 'usb-3.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (228 commits)
USB: mark uas driver as BROKEN
xhci: Add Lynx Point LP to list of Intel switchable hosts
uwb: fix uwb_dev_unlock() missed at an error path in uwb_rc_cmd_async()
USB: ftdi_sio: Add support for Newport AGILIS motor drivers
MAINTAINERS: remove drivers/block/ub.c
USB: chipidea: fix use after free bug
ezusb: add dependency to USB
usb: ftdi_sio: fixup BeagleBone A5+ quirk
USB: cp210x: add Virtenio Preon32 device id
usb: storage: remove redundant memset() in usb_probe_stor1()
USB: option: blacklist network interface on Huawei E173
USB: OHCI: workaround for hardware bug: retired TDs not added to the Done Queue
USB: add new zte 3g-dongle's pid to option.c
USB: opticon: switch to generic read implementation
USB: opticon: refactor reab-urb processing
USB: opticon: use usb-serial bulk-in urb
USB: opticon: increase bulk-in size
USB: opticon: use port as urb context
USB: opticon: pass port to get_serial_info
USB: opticon: make private data port specific
...
310 files changed, 3028 insertions, 10754 deletions
diff --git a/Documentation/DocBook/gadget.tmpl b/Documentation/DocBook/gadget.tmpl index 6ef2f0073e5a..4017f147ba2f 100644 --- a/Documentation/DocBook/gadget.tmpl +++ b/Documentation/DocBook/gadget.tmpl | |||
@@ -671,7 +671,7 @@ than a kernel driver. | |||
671 | <para>There's a USB Mass Storage class driver, which provides | 671 | <para>There's a USB Mass Storage class driver, which provides |
672 | a different solution for interoperability with systems such | 672 | a different solution for interoperability with systems such |
673 | as MS-Windows and MacOS. | 673 | as MS-Windows and MacOS. |
674 | That <emphasis>File-backed Storage</emphasis> driver uses a | 674 | That <emphasis>Mass Storage</emphasis> driver uses a |
675 | file or block device as backing store for a drive, | 675 | file or block device as backing store for a drive, |
676 | like the <filename>loop</filename> driver. | 676 | like the <filename>loop</filename> driver. |
677 | The USB host uses the BBB, CB, or CBI versions of the mass | 677 | The USB host uses the BBB, CB, or CBI versions of the mass |
diff --git a/Documentation/devices.txt b/Documentation/devices.txt index b6251cca9263..08f01e79c41a 100644 --- a/Documentation/devices.txt +++ b/Documentation/devices.txt | |||
@@ -2561,9 +2561,6 @@ Your cooperation is appreciated. | |||
2561 | 192 = /dev/usb/yurex1 First USB Yurex device | 2561 | 192 = /dev/usb/yurex1 First USB Yurex device |
2562 | ... | 2562 | ... |
2563 | 209 = /dev/usb/yurex16 16th USB Yurex device | 2563 | 209 = /dev/usb/yurex16 16th USB Yurex device |
2564 | 240 = /dev/usb/dabusb0 First daubusb device | ||
2565 | ... | ||
2566 | 243 = /dev/usb/dabusb3 Fourth dabusb device | ||
2567 | 2564 | ||
2568 | 180 block USB block devices | 2565 | 180 block USB block devices |
2569 | 0 = /dev/uba First USB block device | 2566 | 0 = /dev/uba First USB block device |
diff --git a/Documentation/devicetree/bindings/usb/am33xx-usb.txt b/Documentation/devicetree/bindings/usb/am33xx-usb.txt index ca8fa56e9f03..a92250512a4e 100644 --- a/Documentation/devicetree/bindings/usb/am33xx-usb.txt +++ b/Documentation/devicetree/bindings/usb/am33xx-usb.txt | |||
@@ -3,12 +3,12 @@ AM33XX MUSB GLUE | |||
3 | - ti,hwmods : must be "usb_otg_hs" | 3 | - ti,hwmods : must be "usb_otg_hs" |
4 | - multipoint : Should be "1" indicating the musb controller supports | 4 | - multipoint : Should be "1" indicating the musb controller supports |
5 | multipoint. This is a MUSB configuration-specific setting. | 5 | multipoint. This is a MUSB configuration-specific setting. |
6 | - num_eps : Specifies the number of endpoints. This is also a | 6 | - num-eps : Specifies the number of endpoints. This is also a |
7 | MUSB configuration-specific setting. Should be set to "16" | 7 | MUSB configuration-specific setting. Should be set to "16" |
8 | - ram_bits : Specifies the ram address size. Should be set to "12" | 8 | - ram-bits : Specifies the ram address size. Should be set to "12" |
9 | - port0_mode : Should be "3" to represent OTG. "1" signifies HOST and "2" | 9 | - port0-mode : Should be "3" to represent OTG. "1" signifies HOST and "2" |
10 | represents PERIPHERAL. | 10 | represents PERIPHERAL. |
11 | - port1_mode : Should be "1" to represent HOST. "3" signifies OTG and "2" | 11 | - port1-mode : Should be "1" to represent HOST. "3" signifies OTG and "2" |
12 | represents PERIPHERAL. | 12 | represents PERIPHERAL. |
13 | - power : Should be "250". This signifies the controller can supply upto | 13 | - power : Should be "250". This signifies the controller can supply upto |
14 | 500mA when operating in host mode. | 14 | 500mA when operating in host mode. |
diff --git a/Documentation/usb/error-codes.txt b/Documentation/usb/error-codes.txt index b3f606b81a03..9c3eb845ebe5 100644 --- a/Documentation/usb/error-codes.txt +++ b/Documentation/usb/error-codes.txt | |||
@@ -21,6 +21,8 @@ Non-USB-specific: | |||
21 | 21 | ||
22 | USB-specific: | 22 | USB-specific: |
23 | 23 | ||
24 | -EBUSY The URB is already active. | ||
25 | |||
24 | -ENODEV specified USB-device or bus doesn't exist | 26 | -ENODEV specified USB-device or bus doesn't exist |
25 | 27 | ||
26 | -ENOENT specified interface or endpoint does not exist or | 28 | -ENOENT specified interface or endpoint does not exist or |
@@ -35,9 +37,8 @@ USB-specific: | |||
35 | d) ISO: number_of_packets is < 0 | 37 | d) ISO: number_of_packets is < 0 |
36 | e) various other cases | 38 | e) various other cases |
37 | 39 | ||
38 | -EAGAIN a) specified ISO start frame too early | 40 | -EXDEV ISO: URB_ISO_ASAP wasn't specified and all the frames |
39 | b) (using ISO-ASAP) too much scheduled for the future | 41 | the URB would be scheduled in have already expired. |
40 | wait some time and try again. | ||
41 | 42 | ||
42 | -EFBIG Host controller driver can't schedule that many ISO frames. | 43 | -EFBIG Host controller driver can't schedule that many ISO frames. |
43 | 44 | ||
diff --git a/Documentation/usb/mass-storage.txt b/Documentation/usb/mass-storage.txt index e9b9334627bf..59063ad7a60d 100644 --- a/Documentation/usb/mass-storage.txt +++ b/Documentation/usb/mass-storage.txt | |||
@@ -20,9 +20,9 @@ | |||
20 | 20 | ||
21 | This document describes how to use the gadget from user space, its | 21 | This document describes how to use the gadget from user space, its |
22 | relation to mass storage function (or MSF) and different gadgets | 22 | relation to mass storage function (or MSF) and different gadgets |
23 | using it, and how it differs from File Storage Gadget (or FSG). It | 23 | using it, and how it differs from File Storage Gadget (or FSG) |
24 | will talk only briefly about how to use MSF within composite | 24 | (which is no longer included in Linux). It will talk only briefly |
25 | gadgets. | 25 | about how to use MSF within composite gadgets. |
26 | 26 | ||
27 | * Module parameters | 27 | * Module parameters |
28 | 28 | ||
@@ -198,16 +198,15 @@ | |||
198 | The Mass Storage Function and thus the Mass Storage Gadget has been | 198 | The Mass Storage Function and thus the Mass Storage Gadget has been |
199 | based on the File Storage Gadget. The difference between the two is | 199 | based on the File Storage Gadget. The difference between the two is |
200 | that MSG is a composite gadget (ie. uses the composite framework) | 200 | that MSG is a composite gadget (ie. uses the composite framework) |
201 | while file storage gadget is a traditional gadget. From userspace | 201 | while file storage gadget was a traditional gadget. From userspace |
202 | point of view this distinction does not really matter, but from | 202 | point of view this distinction does not really matter, but from |
203 | kernel hacker's point of view, this means that (i) MSG does not | 203 | kernel hacker's point of view, this means that (i) MSG does not |
204 | duplicate code needed for handling basic USB protocol commands and | 204 | duplicate code needed for handling basic USB protocol commands and |
205 | (ii) MSF can be used in any other composite gadget. | 205 | (ii) MSF can be used in any other composite gadget. |
206 | 206 | ||
207 | Because of that, File Storage Gadget has been deprecated and | 207 | Because of that, File Storage Gadget has been removed in Linux 3.8. |
208 | scheduled to be removed in Linux 3.8. All users need to transition | 208 | All users need to transition to the Mass Storage Gadget. The two |
209 | to the Mass Storage Gadget by that time. The two gadgets behave | 209 | gadgets behave mostly the same from the outside except: |
210 | mostly the same from the outside except: | ||
211 | 210 | ||
212 | 1. In FSG the “removable” and “cdrom” module parameters set the flag | 211 | 1. In FSG the “removable” and “cdrom” module parameters set the flag |
213 | for all logical units whereas in MSG they accept a list of y/n | 212 | for all logical units whereas in MSG they accept a list of y/n |
diff --git a/MAINTAINERS b/MAINTAINERS index b68c3a10006c..23b9584c44cb 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -7587,12 +7587,6 @@ L: linux-scsi@vger.kernel.org | |||
7587 | S: Supported | 7587 | S: Supported |
7588 | F: drivers/usb/storage/uas.c | 7588 | F: drivers/usb/storage/uas.c |
7589 | 7589 | ||
7590 | USB BLOCK DRIVER (UB ub) | ||
7591 | M: Pete Zaitcev <zaitcev@redhat.com> | ||
7592 | L: linux-usb@vger.kernel.org | ||
7593 | S: Supported | ||
7594 | F: drivers/block/ub.c | ||
7595 | |||
7596 | USB CDC ETHERNET DRIVER | 7590 | USB CDC ETHERNET DRIVER |
7597 | M: Oliver Neukum <oliver@neukum.org> | 7591 | M: Oliver Neukum <oliver@neukum.org> |
7598 | L: linux-usb@vger.kernel.org | 7592 | L: linux-usb@vger.kernel.org |
diff --git a/arch/arm/configs/afeb9260_defconfig b/arch/arm/configs/afeb9260_defconfig index c285a9d777d9..a8dbc1e05253 100644 --- a/arch/arm/configs/afeb9260_defconfig +++ b/arch/arm/configs/afeb9260_defconfig | |||
@@ -79,7 +79,7 @@ CONFIG_USB_STORAGE=y | |||
79 | CONFIG_USB_GADGET=y | 79 | CONFIG_USB_GADGET=y |
80 | CONFIG_USB_ZERO=m | 80 | CONFIG_USB_ZERO=m |
81 | CONFIG_USB_GADGETFS=m | 81 | CONFIG_USB_GADGETFS=m |
82 | CONFIG_USB_FILE_STORAGE=m | 82 | CONFIG_USB_MASS_STORAGE=m |
83 | CONFIG_USB_G_SERIAL=m | 83 | CONFIG_USB_G_SERIAL=m |
84 | CONFIG_RTC_CLASS=y | 84 | CONFIG_RTC_CLASS=y |
85 | CONFIG_RTC_DEBUG=y | 85 | CONFIG_RTC_DEBUG=y |
diff --git a/arch/arm/configs/at91sam9260_defconfig b/arch/arm/configs/at91sam9260_defconfig index 505b3765f87e..0ea5d2c97fc4 100644 --- a/arch/arm/configs/at91sam9260_defconfig +++ b/arch/arm/configs/at91sam9260_defconfig | |||
@@ -75,7 +75,7 @@ CONFIG_USB_STORAGE_DEBUG=y | |||
75 | CONFIG_USB_GADGET=y | 75 | CONFIG_USB_GADGET=y |
76 | CONFIG_USB_ZERO=m | 76 | CONFIG_USB_ZERO=m |
77 | CONFIG_USB_GADGETFS=m | 77 | CONFIG_USB_GADGETFS=m |
78 | CONFIG_USB_FILE_STORAGE=m | 78 | CONFIG_USB_MASS_STORAGE=m |
79 | CONFIG_USB_G_SERIAL=m | 79 | CONFIG_USB_G_SERIAL=m |
80 | CONFIG_RTC_CLASS=y | 80 | CONFIG_RTC_CLASS=y |
81 | CONFIG_RTC_DRV_AT91SAM9=y | 81 | CONFIG_RTC_DRV_AT91SAM9=y |
diff --git a/arch/arm/configs/at91sam9261_defconfig b/arch/arm/configs/at91sam9261_defconfig index 1e8712ef062e..c87beb973b37 100644 --- a/arch/arm/configs/at91sam9261_defconfig +++ b/arch/arm/configs/at91sam9261_defconfig | |||
@@ -125,7 +125,7 @@ CONFIG_USB_GADGET=y | |||
125 | CONFIG_USB_ZERO=m | 125 | CONFIG_USB_ZERO=m |
126 | CONFIG_USB_ETH=m | 126 | CONFIG_USB_ETH=m |
127 | CONFIG_USB_GADGETFS=m | 127 | CONFIG_USB_GADGETFS=m |
128 | CONFIG_USB_FILE_STORAGE=m | 128 | CONFIG_USB_MASS_STORAGE=m |
129 | CONFIG_USB_G_SERIAL=m | 129 | CONFIG_USB_G_SERIAL=m |
130 | CONFIG_MMC=y | 130 | CONFIG_MMC=y |
131 | CONFIG_MMC_ATMELMCI=m | 131 | CONFIG_MMC_ATMELMCI=m |
diff --git a/arch/arm/configs/at91sam9263_defconfig b/arch/arm/configs/at91sam9263_defconfig index d2050cada82d..c5212f43eee6 100644 --- a/arch/arm/configs/at91sam9263_defconfig +++ b/arch/arm/configs/at91sam9263_defconfig | |||
@@ -133,7 +133,7 @@ CONFIG_USB_GADGET=y | |||
133 | CONFIG_USB_ZERO=m | 133 | CONFIG_USB_ZERO=m |
134 | CONFIG_USB_ETH=m | 134 | CONFIG_USB_ETH=m |
135 | CONFIG_USB_GADGETFS=m | 135 | CONFIG_USB_GADGETFS=m |
136 | CONFIG_USB_FILE_STORAGE=m | 136 | CONFIG_USB_MASS_STORAGE=m |
137 | CONFIG_USB_G_SERIAL=m | 137 | CONFIG_USB_G_SERIAL=m |
138 | CONFIG_MMC=y | 138 | CONFIG_MMC=y |
139 | CONFIG_SDIO_UART=m | 139 | CONFIG_SDIO_UART=m |
diff --git a/arch/arm/configs/at91sam9g20_defconfig b/arch/arm/configs/at91sam9g20_defconfig index e1b0e80b54a5..3b1881033ad8 100644 --- a/arch/arm/configs/at91sam9g20_defconfig +++ b/arch/arm/configs/at91sam9g20_defconfig | |||
@@ -96,7 +96,7 @@ CONFIG_USB_STORAGE=y | |||
96 | CONFIG_USB_GADGET=y | 96 | CONFIG_USB_GADGET=y |
97 | CONFIG_USB_ZERO=m | 97 | CONFIG_USB_ZERO=m |
98 | CONFIG_USB_GADGETFS=m | 98 | CONFIG_USB_GADGETFS=m |
99 | CONFIG_USB_FILE_STORAGE=m | 99 | CONFIG_USB_MASS_STORAGE=m |
100 | CONFIG_USB_G_SERIAL=m | 100 | CONFIG_USB_G_SERIAL=m |
101 | CONFIG_MMC=y | 101 | CONFIG_MMC=y |
102 | CONFIG_MMC_ATMELMCI=m | 102 | CONFIG_MMC_ATMELMCI=m |
diff --git a/arch/arm/configs/corgi_defconfig b/arch/arm/configs/corgi_defconfig index 4b8a25d9e686..1fd1d1de3220 100644 --- a/arch/arm/configs/corgi_defconfig +++ b/arch/arm/configs/corgi_defconfig | |||
@@ -218,7 +218,7 @@ CONFIG_USB_GADGET=y | |||
218 | CONFIG_USB_ZERO=m | 218 | CONFIG_USB_ZERO=m |
219 | CONFIG_USB_ETH=m | 219 | CONFIG_USB_ETH=m |
220 | CONFIG_USB_GADGETFS=m | 220 | CONFIG_USB_GADGETFS=m |
221 | CONFIG_USB_FILE_STORAGE=m | 221 | CONFIG_USB_MASS_STORAGE=m |
222 | CONFIG_USB_G_SERIAL=m | 222 | CONFIG_USB_G_SERIAL=m |
223 | CONFIG_MMC=y | 223 | CONFIG_MMC=y |
224 | CONFIG_MMC_PXA=y | 224 | CONFIG_MMC_PXA=y |
diff --git a/arch/arm/configs/davinci_all_defconfig b/arch/arm/configs/davinci_all_defconfig index 67b5abb6f857..4ea7c95719d2 100644 --- a/arch/arm/configs/davinci_all_defconfig +++ b/arch/arm/configs/davinci_all_defconfig | |||
@@ -144,7 +144,7 @@ CONFIG_USB_GADGET_DEBUG_FS=y | |||
144 | CONFIG_USB_ZERO=m | 144 | CONFIG_USB_ZERO=m |
145 | CONFIG_USB_ETH=m | 145 | CONFIG_USB_ETH=m |
146 | CONFIG_USB_GADGETFS=m | 146 | CONFIG_USB_GADGETFS=m |
147 | CONFIG_USB_FILE_STORAGE=m | 147 | CONFIG_USB_MASS_STORAGE=m |
148 | CONFIG_USB_G_SERIAL=m | 148 | CONFIG_USB_G_SERIAL=m |
149 | CONFIG_USB_G_PRINTER=m | 149 | CONFIG_USB_G_PRINTER=m |
150 | CONFIG_USB_CDC_COMPOSITE=m | 150 | CONFIG_USB_CDC_COMPOSITE=m |
diff --git a/arch/arm/configs/h7202_defconfig b/arch/arm/configs/h7202_defconfig index 69405a762423..e16d3f372e2a 100644 --- a/arch/arm/configs/h7202_defconfig +++ b/arch/arm/configs/h7202_defconfig | |||
@@ -34,8 +34,7 @@ CONFIG_FB_MODE_HELPERS=y | |||
34 | CONFIG_USB_GADGET=m | 34 | CONFIG_USB_GADGET=m |
35 | CONFIG_USB_ZERO=m | 35 | CONFIG_USB_ZERO=m |
36 | CONFIG_USB_GADGETFS=m | 36 | CONFIG_USB_GADGETFS=m |
37 | CONFIG_USB_FILE_STORAGE=m | 37 | CONFIG_USB_MASS_STORAGE=m |
38 | CONFIG_USB_FILE_STORAGE_TEST=y | ||
39 | CONFIG_USB_G_SERIAL=m | 38 | CONFIG_USB_G_SERIAL=m |
40 | CONFIG_EXT2_FS=y | 39 | CONFIG_EXT2_FS=y |
41 | CONFIG_TMPFS=y | 40 | CONFIG_TMPFS=y |
diff --git a/arch/arm/configs/magician_defconfig b/arch/arm/configs/magician_defconfig index a691ef4c6008..557dd291288b 100644 --- a/arch/arm/configs/magician_defconfig +++ b/arch/arm/configs/magician_defconfig | |||
@@ -136,7 +136,7 @@ CONFIG_USB_PXA27X=y | |||
136 | CONFIG_USB_ETH=m | 136 | CONFIG_USB_ETH=m |
137 | # CONFIG_USB_ETH_RNDIS is not set | 137 | # CONFIG_USB_ETH_RNDIS is not set |
138 | CONFIG_USB_GADGETFS=m | 138 | CONFIG_USB_GADGETFS=m |
139 | CONFIG_USB_FILE_STORAGE=m | 139 | CONFIG_USB_MASS_STORAGE=m |
140 | CONFIG_USB_G_SERIAL=m | 140 | CONFIG_USB_G_SERIAL=m |
141 | CONFIG_USB_CDC_COMPOSITE=m | 141 | CONFIG_USB_CDC_COMPOSITE=m |
142 | CONFIG_USB_GPIO_VBUS=y | 142 | CONFIG_USB_GPIO_VBUS=y |
diff --git a/arch/arm/configs/mini2440_defconfig b/arch/arm/configs/mini2440_defconfig index 00630e6af45c..a07948a87caa 100644 --- a/arch/arm/configs/mini2440_defconfig +++ b/arch/arm/configs/mini2440_defconfig | |||
@@ -240,7 +240,7 @@ CONFIG_USB_GADGET_S3C2410=y | |||
240 | CONFIG_USB_ZERO=m | 240 | CONFIG_USB_ZERO=m |
241 | CONFIG_USB_ETH=m | 241 | CONFIG_USB_ETH=m |
242 | CONFIG_USB_GADGETFS=m | 242 | CONFIG_USB_GADGETFS=m |
243 | CONFIG_USB_FILE_STORAGE=m | 243 | CONFIG_USB_MASS_STORAGE=m |
244 | CONFIG_USB_G_SERIAL=m | 244 | CONFIG_USB_G_SERIAL=m |
245 | CONFIG_USB_CDC_COMPOSITE=m | 245 | CONFIG_USB_CDC_COMPOSITE=m |
246 | CONFIG_MMC=y | 246 | CONFIG_MMC=y |
diff --git a/arch/arm/configs/omap1_defconfig b/arch/arm/configs/omap1_defconfig index dde2a1af7b39..42eab9a2a0fd 100644 --- a/arch/arm/configs/omap1_defconfig +++ b/arch/arm/configs/omap1_defconfig | |||
@@ -214,8 +214,7 @@ CONFIG_USB_TEST=y | |||
214 | CONFIG_USB_GADGET=y | 214 | CONFIG_USB_GADGET=y |
215 | CONFIG_USB_ETH=m | 215 | CONFIG_USB_ETH=m |
216 | # CONFIG_USB_ETH_RNDIS is not set | 216 | # CONFIG_USB_ETH_RNDIS is not set |
217 | CONFIG_USB_FILE_STORAGE=m | 217 | CONFIG_USB_MASS_STORAGE=m |
218 | CONFIG_USB_FILE_STORAGE_TEST=y | ||
219 | CONFIG_MMC=y | 218 | CONFIG_MMC=y |
220 | CONFIG_MMC_SDHCI=y | 219 | CONFIG_MMC_SDHCI=y |
221 | CONFIG_MMC_SDHCI_PLTFM=y | 220 | CONFIG_MMC_SDHCI_PLTFM=y |
diff --git a/arch/arm/configs/prima2_defconfig b/arch/arm/configs/prima2_defconfig index 807d4e2acb17..6a936c7c078a 100644 --- a/arch/arm/configs/prima2_defconfig +++ b/arch/arm/configs/prima2_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_SPI_SIRF=y | |||
37 | CONFIG_SPI_SPIDEV=y | 37 | CONFIG_SPI_SPIDEV=y |
38 | # CONFIG_HWMON is not set | 38 | # CONFIG_HWMON is not set |
39 | CONFIG_USB_GADGET=y | 39 | CONFIG_USB_GADGET=y |
40 | CONFIG_USB_FILE_STORAGE=m | ||
41 | CONFIG_USB_MASS_STORAGE=m | 40 | CONFIG_USB_MASS_STORAGE=m |
42 | CONFIG_MMC=y | 41 | CONFIG_MMC=y |
43 | CONFIG_MMC_SDHCI=y | 42 | CONFIG_MMC_SDHCI=y |
diff --git a/arch/arm/configs/spitz_defconfig b/arch/arm/configs/spitz_defconfig index df77931a4326..2e0419d1b964 100644 --- a/arch/arm/configs/spitz_defconfig +++ b/arch/arm/configs/spitz_defconfig | |||
@@ -214,7 +214,7 @@ CONFIG_USB_GADGET_DUMMY_HCD=y | |||
214 | CONFIG_USB_ZERO=m | 214 | CONFIG_USB_ZERO=m |
215 | CONFIG_USB_ETH=m | 215 | CONFIG_USB_ETH=m |
216 | CONFIG_USB_GADGETFS=m | 216 | CONFIG_USB_GADGETFS=m |
217 | CONFIG_USB_FILE_STORAGE=m | 217 | CONFIG_USB_MASS_STORAGE=m |
218 | CONFIG_USB_G_SERIAL=m | 218 | CONFIG_USB_G_SERIAL=m |
219 | CONFIG_MMC=y | 219 | CONFIG_MMC=y |
220 | CONFIG_MMC_PXA=y | 220 | CONFIG_MMC_PXA=y |
diff --git a/arch/arm/configs/stamp9g20_defconfig b/arch/arm/configs/stamp9g20_defconfig index 52f1488591c7..b845f5519bcc 100644 --- a/arch/arm/configs/stamp9g20_defconfig +++ b/arch/arm/configs/stamp9g20_defconfig | |||
@@ -97,7 +97,7 @@ CONFIG_USB_STORAGE=y | |||
97 | CONFIG_USB_GADGET=m | 97 | CONFIG_USB_GADGET=m |
98 | CONFIG_USB_ZERO=m | 98 | CONFIG_USB_ZERO=m |
99 | CONFIG_USB_ETH=m | 99 | CONFIG_USB_ETH=m |
100 | CONFIG_USB_FILE_STORAGE=m | 100 | CONFIG_USB_MASS_STORAGE=m |
101 | CONFIG_USB_G_SERIAL=m | 101 | CONFIG_USB_G_SERIAL=m |
102 | CONFIG_MMC=y | 102 | CONFIG_MMC=y |
103 | CONFIG_MMC_ATMELMCI=y | 103 | CONFIG_MMC_ATMELMCI=y |
diff --git a/arch/arm/configs/viper_defconfig b/arch/arm/configs/viper_defconfig index 1d01ddd33122..d36e0d3c86ec 100644 --- a/arch/arm/configs/viper_defconfig +++ b/arch/arm/configs/viper_defconfig | |||
@@ -139,7 +139,7 @@ CONFIG_USB_SERIAL_MCT_U232=m | |||
139 | CONFIG_USB_GADGET=m | 139 | CONFIG_USB_GADGET=m |
140 | CONFIG_USB_ETH=m | 140 | CONFIG_USB_ETH=m |
141 | CONFIG_USB_GADGETFS=m | 141 | CONFIG_USB_GADGETFS=m |
142 | CONFIG_USB_FILE_STORAGE=m | 142 | CONFIG_USB_MASS_STORAGE=m |
143 | CONFIG_USB_G_SERIAL=m | 143 | CONFIG_USB_G_SERIAL=m |
144 | CONFIG_USB_G_PRINTER=m | 144 | CONFIG_USB_G_PRINTER=m |
145 | CONFIG_RTC_CLASS=y | 145 | CONFIG_RTC_CLASS=y |
diff --git a/arch/arm/configs/zeus_defconfig b/arch/arm/configs/zeus_defconfig index 547a3c1e59db..731d4f985310 100644 --- a/arch/arm/configs/zeus_defconfig +++ b/arch/arm/configs/zeus_defconfig | |||
@@ -143,7 +143,7 @@ CONFIG_USB_GADGET=m | |||
143 | CONFIG_USB_PXA27X=y | 143 | CONFIG_USB_PXA27X=y |
144 | CONFIG_USB_ETH=m | 144 | CONFIG_USB_ETH=m |
145 | CONFIG_USB_GADGETFS=m | 145 | CONFIG_USB_GADGETFS=m |
146 | CONFIG_USB_FILE_STORAGE=m | 146 | CONFIG_USB_MASS_STORAGE=m |
147 | CONFIG_USB_G_SERIAL=m | 147 | CONFIG_USB_G_SERIAL=m |
148 | CONFIG_USB_G_PRINTER=m | 148 | CONFIG_USB_G_PRINTER=m |
149 | CONFIG_MMC=y | 149 | CONFIG_MMC=y |
diff --git a/arch/arm/mach-cns3xxx/cns3420vb.c b/arch/arm/mach-cns3xxx/cns3420vb.c index 2c5fb4c7e509..ae305397003c 100644 --- a/arch/arm/mach-cns3xxx/cns3420vb.c +++ b/arch/arm/mach-cns3xxx/cns3420vb.c | |||
@@ -24,6 +24,8 @@ | |||
24 | #include <linux/mtd/mtd.h> | 24 | #include <linux/mtd/mtd.h> |
25 | #include <linux/mtd/physmap.h> | 25 | #include <linux/mtd/physmap.h> |
26 | #include <linux/mtd/partitions.h> | 26 | #include <linux/mtd/partitions.h> |
27 | #include <linux/usb/ehci_pdriver.h> | ||
28 | #include <linux/usb/ohci_pdriver.h> | ||
27 | #include <asm/setup.h> | 29 | #include <asm/setup.h> |
28 | #include <asm/mach-types.h> | 30 | #include <asm/mach-types.h> |
29 | #include <asm/hardware/gic.h> | 31 | #include <asm/hardware/gic.h> |
@@ -32,6 +34,7 @@ | |||
32 | #include <asm/mach/time.h> | 34 | #include <asm/mach/time.h> |
33 | #include <mach/cns3xxx.h> | 35 | #include <mach/cns3xxx.h> |
34 | #include <mach/irqs.h> | 36 | #include <mach/irqs.h> |
37 | #include <mach/pm.h> | ||
35 | #include "core.h" | 38 | #include "core.h" |
36 | #include "devices.h" | 39 | #include "devices.h" |
37 | 40 | ||
@@ -125,13 +128,52 @@ static struct resource cns3xxx_usb_ehci_resources[] = { | |||
125 | 128 | ||
126 | static u64 cns3xxx_usb_ehci_dma_mask = DMA_BIT_MASK(32); | 129 | static u64 cns3xxx_usb_ehci_dma_mask = DMA_BIT_MASK(32); |
127 | 130 | ||
131 | static int csn3xxx_usb_power_on(struct platform_device *pdev) | ||
132 | { | ||
133 | /* | ||
134 | * EHCI and OHCI share the same clock and power, | ||
135 | * resetting twice would cause the 1st controller been reset. | ||
136 | * Therefore only do power up at the first up device, and | ||
137 | * power down at the last down device. | ||
138 | * | ||
139 | * Set USB AHB INCR length to 16 | ||
140 | */ | ||
141 | if (atomic_inc_return(&usb_pwr_ref) == 1) { | ||
142 | cns3xxx_pwr_power_up(1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_USB); | ||
143 | cns3xxx_pwr_clk_en(1 << PM_CLK_GATE_REG_OFFSET_USB_HOST); | ||
144 | cns3xxx_pwr_soft_rst(1 << PM_SOFT_RST_REG_OFFST_USB_HOST); | ||
145 | __raw_writel((__raw_readl(MISC_CHIP_CONFIG_REG) | (0X2 << 24)), | ||
146 | MISC_CHIP_CONFIG_REG); | ||
147 | } | ||
148 | |||
149 | return 0; | ||
150 | } | ||
151 | |||
152 | static void csn3xxx_usb_power_off(struct platform_device *pdev) | ||
153 | { | ||
154 | /* | ||
155 | * EHCI and OHCI share the same clock and power, | ||
156 | * resetting twice would cause the 1st controller been reset. | ||
157 | * Therefore only do power up at the first up device, and | ||
158 | * power down at the last down device. | ||
159 | */ | ||
160 | if (atomic_dec_return(&usb_pwr_ref) == 0) | ||
161 | cns3xxx_pwr_clk_dis(1 << PM_CLK_GATE_REG_OFFSET_USB_HOST); | ||
162 | } | ||
163 | |||
164 | static struct usb_ehci_pdata cns3xxx_usb_ehci_pdata = { | ||
165 | .power_on = csn3xxx_usb_power_on, | ||
166 | .power_off = csn3xxx_usb_power_off, | ||
167 | }; | ||
168 | |||
128 | static struct platform_device cns3xxx_usb_ehci_device = { | 169 | static struct platform_device cns3xxx_usb_ehci_device = { |
129 | .name = "cns3xxx-ehci", | 170 | .name = "ehci-platform", |
130 | .num_resources = ARRAY_SIZE(cns3xxx_usb_ehci_resources), | 171 | .num_resources = ARRAY_SIZE(cns3xxx_usb_ehci_resources), |
131 | .resource = cns3xxx_usb_ehci_resources, | 172 | .resource = cns3xxx_usb_ehci_resources, |
132 | .dev = { | 173 | .dev = { |
133 | .dma_mask = &cns3xxx_usb_ehci_dma_mask, | 174 | .dma_mask = &cns3xxx_usb_ehci_dma_mask, |
134 | .coherent_dma_mask = DMA_BIT_MASK(32), | 175 | .coherent_dma_mask = DMA_BIT_MASK(32), |
176 | .platform_data = &cns3xxx_usb_ehci_pdata, | ||
135 | }, | 177 | }, |
136 | }; | 178 | }; |
137 | 179 | ||
@@ -149,13 +191,20 @@ static struct resource cns3xxx_usb_ohci_resources[] = { | |||
149 | 191 | ||
150 | static u64 cns3xxx_usb_ohci_dma_mask = DMA_BIT_MASK(32); | 192 | static u64 cns3xxx_usb_ohci_dma_mask = DMA_BIT_MASK(32); |
151 | 193 | ||
194 | static struct usb_ohci_pdata cns3xxx_usb_ohci_pdata = { | ||
195 | .num_ports = 1, | ||
196 | .power_on = csn3xxx_usb_power_on, | ||
197 | .power_off = csn3xxx_usb_power_off, | ||
198 | }; | ||
199 | |||
152 | static struct platform_device cns3xxx_usb_ohci_device = { | 200 | static struct platform_device cns3xxx_usb_ohci_device = { |
153 | .name = "cns3xxx-ohci", | 201 | .name = "ohci-platform", |
154 | .num_resources = ARRAY_SIZE(cns3xxx_usb_ohci_resources), | 202 | .num_resources = ARRAY_SIZE(cns3xxx_usb_ohci_resources), |
155 | .resource = cns3xxx_usb_ohci_resources, | 203 | .resource = cns3xxx_usb_ohci_resources, |
156 | .dev = { | 204 | .dev = { |
157 | .dma_mask = &cns3xxx_usb_ohci_dma_mask, | 205 | .dma_mask = &cns3xxx_usb_ohci_dma_mask, |
158 | .coherent_dma_mask = DMA_BIT_MASK(32), | 206 | .coherent_dma_mask = DMA_BIT_MASK(32), |
207 | .platform_data = &cns3xxx_usb_ohci_pdata, | ||
159 | }, | 208 | }, |
160 | }; | 209 | }; |
161 | 210 | ||
diff --git a/arch/avr32/configs/atngw100_defconfig b/arch/avr32/configs/atngw100_defconfig index a06bfccc2840..f4025db184ff 100644 --- a/arch/avr32/configs/atngw100_defconfig +++ b/arch/avr32/configs/atngw100_defconfig | |||
@@ -109,7 +109,7 @@ CONFIG_USB_GADGET_VBUS_DRAW=350 | |||
109 | CONFIG_USB_ZERO=m | 109 | CONFIG_USB_ZERO=m |
110 | CONFIG_USB_ETH=m | 110 | CONFIG_USB_ETH=m |
111 | CONFIG_USB_GADGETFS=m | 111 | CONFIG_USB_GADGETFS=m |
112 | CONFIG_USB_FILE_STORAGE=m | 112 | CONFIG_USB_MASS_STORAGE=m |
113 | CONFIG_USB_G_SERIAL=m | 113 | CONFIG_USB_G_SERIAL=m |
114 | CONFIG_USB_CDC_COMPOSITE=m | 114 | CONFIG_USB_CDC_COMPOSITE=m |
115 | CONFIG_MMC=y | 115 | CONFIG_MMC=y |
diff --git a/arch/avr32/configs/atngw100_evklcd100_defconfig b/arch/avr32/configs/atngw100_evklcd100_defconfig index d8f1fe80d210..c76a49b9e9d0 100644 --- a/arch/avr32/configs/atngw100_evklcd100_defconfig +++ b/arch/avr32/configs/atngw100_evklcd100_defconfig | |||
@@ -125,7 +125,7 @@ CONFIG_USB_GADGET_VBUS_DRAW=350 | |||
125 | CONFIG_USB_ZERO=m | 125 | CONFIG_USB_ZERO=m |
126 | CONFIG_USB_ETH=m | 126 | CONFIG_USB_ETH=m |
127 | CONFIG_USB_GADGETFS=m | 127 | CONFIG_USB_GADGETFS=m |
128 | CONFIG_USB_FILE_STORAGE=m | 128 | CONFIG_USB_MASS_STORAGE=m |
129 | CONFIG_USB_G_SERIAL=m | 129 | CONFIG_USB_G_SERIAL=m |
130 | CONFIG_USB_CDC_COMPOSITE=m | 130 | CONFIG_USB_CDC_COMPOSITE=m |
131 | CONFIG_MMC=y | 131 | CONFIG_MMC=y |
diff --git a/arch/avr32/configs/atngw100_evklcd101_defconfig b/arch/avr32/configs/atngw100_evklcd101_defconfig index d4c5b19ec950..2d8ab089a64e 100644 --- a/arch/avr32/configs/atngw100_evklcd101_defconfig +++ b/arch/avr32/configs/atngw100_evklcd101_defconfig | |||
@@ -124,7 +124,7 @@ CONFIG_USB_GADGET_VBUS_DRAW=350 | |||
124 | CONFIG_USB_ZERO=m | 124 | CONFIG_USB_ZERO=m |
125 | CONFIG_USB_ETH=m | 125 | CONFIG_USB_ETH=m |
126 | CONFIG_USB_GADGETFS=m | 126 | CONFIG_USB_GADGETFS=m |
127 | CONFIG_USB_FILE_STORAGE=m | 127 | CONFIG_USB_MASS_STORAGE=m |
128 | CONFIG_USB_G_SERIAL=m | 128 | CONFIG_USB_G_SERIAL=m |
129 | CONFIG_USB_CDC_COMPOSITE=m | 129 | CONFIG_USB_CDC_COMPOSITE=m |
130 | CONFIG_MMC=y | 130 | CONFIG_MMC=y |
diff --git a/arch/avr32/configs/atngw100_mrmt_defconfig b/arch/avr32/configs/atngw100_mrmt_defconfig index 77ca4f905d2c..b189e0cab04b 100644 --- a/arch/avr32/configs/atngw100_mrmt_defconfig +++ b/arch/avr32/configs/atngw100_mrmt_defconfig | |||
@@ -99,7 +99,7 @@ CONFIG_SND_ATMEL_AC97C=m | |||
99 | # CONFIG_SND_SPI is not set | 99 | # CONFIG_SND_SPI is not set |
100 | CONFIG_USB_GADGET=m | 100 | CONFIG_USB_GADGET=m |
101 | CONFIG_USB_GADGET_DEBUG_FILES=y | 101 | CONFIG_USB_GADGET_DEBUG_FILES=y |
102 | CONFIG_USB_FILE_STORAGE=m | 102 | CONFIG_USB_MASS_STORAGE=m |
103 | CONFIG_USB_G_SERIAL=m | 103 | CONFIG_USB_G_SERIAL=m |
104 | CONFIG_MMC=y | 104 | CONFIG_MMC=y |
105 | CONFIG_MMC_ATMELMCI=y | 105 | CONFIG_MMC_ATMELMCI=y |
diff --git a/arch/avr32/configs/atngw100mkii_defconfig b/arch/avr32/configs/atngw100mkii_defconfig index 6e0dca4d3131..2e4de42a53c4 100644 --- a/arch/avr32/configs/atngw100mkii_defconfig +++ b/arch/avr32/configs/atngw100mkii_defconfig | |||
@@ -111,7 +111,7 @@ CONFIG_USB_GADGET_VBUS_DRAW=350 | |||
111 | CONFIG_USB_ZERO=m | 111 | CONFIG_USB_ZERO=m |
112 | CONFIG_USB_ETH=m | 112 | CONFIG_USB_ETH=m |
113 | CONFIG_USB_GADGETFS=m | 113 | CONFIG_USB_GADGETFS=m |
114 | CONFIG_USB_FILE_STORAGE=m | 114 | CONFIG_USB_MASS_STORAGE=m |
115 | CONFIG_USB_G_SERIAL=m | 115 | CONFIG_USB_G_SERIAL=m |
116 | CONFIG_USB_CDC_COMPOSITE=m | 116 | CONFIG_USB_CDC_COMPOSITE=m |
117 | CONFIG_MMC=y | 117 | CONFIG_MMC=y |
diff --git a/arch/avr32/configs/atngw100mkii_evklcd100_defconfig b/arch/avr32/configs/atngw100mkii_evklcd100_defconfig index 7f2a344a5fa8..fad3cd22dfd3 100644 --- a/arch/avr32/configs/atngw100mkii_evklcd100_defconfig +++ b/arch/avr32/configs/atngw100mkii_evklcd100_defconfig | |||
@@ -128,7 +128,7 @@ CONFIG_USB_GADGET_VBUS_DRAW=350 | |||
128 | CONFIG_USB_ZERO=m | 128 | CONFIG_USB_ZERO=m |
129 | CONFIG_USB_ETH=m | 129 | CONFIG_USB_ETH=m |
130 | CONFIG_USB_GADGETFS=m | 130 | CONFIG_USB_GADGETFS=m |
131 | CONFIG_USB_FILE_STORAGE=m | 131 | CONFIG_USB_MASS_STORAGE=m |
132 | CONFIG_USB_G_SERIAL=m | 132 | CONFIG_USB_G_SERIAL=m |
133 | CONFIG_USB_CDC_COMPOSITE=m | 133 | CONFIG_USB_CDC_COMPOSITE=m |
134 | CONFIG_MMC=y | 134 | CONFIG_MMC=y |
diff --git a/arch/avr32/configs/atngw100mkii_evklcd101_defconfig b/arch/avr32/configs/atngw100mkii_evklcd101_defconfig index 085eeba88f67..29986230aaa5 100644 --- a/arch/avr32/configs/atngw100mkii_evklcd101_defconfig +++ b/arch/avr32/configs/atngw100mkii_evklcd101_defconfig | |||
@@ -127,7 +127,7 @@ CONFIG_USB_GADGET_VBUS_DRAW=350 | |||
127 | CONFIG_USB_ZERO=m | 127 | CONFIG_USB_ZERO=m |
128 | CONFIG_USB_ETH=m | 128 | CONFIG_USB_ETH=m |
129 | CONFIG_USB_GADGETFS=m | 129 | CONFIG_USB_GADGETFS=m |
130 | CONFIG_USB_FILE_STORAGE=m | 130 | CONFIG_USB_MASS_STORAGE=m |
131 | CONFIG_USB_G_SERIAL=m | 131 | CONFIG_USB_G_SERIAL=m |
132 | CONFIG_USB_CDC_COMPOSITE=m | 132 | CONFIG_USB_CDC_COMPOSITE=m |
133 | CONFIG_MMC=y | 133 | CONFIG_MMC=y |
diff --git a/arch/avr32/configs/atstk1002_defconfig b/arch/avr32/configs/atstk1002_defconfig index d1a887e64055..a582465e1cef 100644 --- a/arch/avr32/configs/atstk1002_defconfig +++ b/arch/avr32/configs/atstk1002_defconfig | |||
@@ -126,7 +126,7 @@ CONFIG_USB_GADGET=y | |||
126 | CONFIG_USB_ZERO=m | 126 | CONFIG_USB_ZERO=m |
127 | CONFIG_USB_ETH=m | 127 | CONFIG_USB_ETH=m |
128 | CONFIG_USB_GADGETFS=m | 128 | CONFIG_USB_GADGETFS=m |
129 | CONFIG_USB_FILE_STORAGE=m | 129 | CONFIG_USB_MASS_STORAGE=m |
130 | CONFIG_USB_G_SERIAL=m | 130 | CONFIG_USB_G_SERIAL=m |
131 | CONFIG_USB_CDC_COMPOSITE=m | 131 | CONFIG_USB_CDC_COMPOSITE=m |
132 | CONFIG_MMC=y | 132 | CONFIG_MMC=y |
diff --git a/arch/avr32/configs/atstk1003_defconfig b/arch/avr32/configs/atstk1003_defconfig index 956f2819ad45..57a79df2ce5d 100644 --- a/arch/avr32/configs/atstk1003_defconfig +++ b/arch/avr32/configs/atstk1003_defconfig | |||
@@ -105,7 +105,7 @@ CONFIG_USB_GADGET=y | |||
105 | CONFIG_USB_ZERO=m | 105 | CONFIG_USB_ZERO=m |
106 | CONFIG_USB_ETH=m | 106 | CONFIG_USB_ETH=m |
107 | CONFIG_USB_GADGETFS=m | 107 | CONFIG_USB_GADGETFS=m |
108 | CONFIG_USB_FILE_STORAGE=m | 108 | CONFIG_USB_MASS_STORAGE=m |
109 | CONFIG_USB_G_SERIAL=m | 109 | CONFIG_USB_G_SERIAL=m |
110 | CONFIG_USB_CDC_COMPOSITE=m | 110 | CONFIG_USB_CDC_COMPOSITE=m |
111 | CONFIG_MMC=y | 111 | CONFIG_MMC=y |
diff --git a/arch/avr32/configs/atstk1004_defconfig b/arch/avr32/configs/atstk1004_defconfig index 40c69f38c61a..1a49bd8c6340 100644 --- a/arch/avr32/configs/atstk1004_defconfig +++ b/arch/avr32/configs/atstk1004_defconfig | |||
@@ -104,7 +104,7 @@ CONFIG_USB_GADGET=y | |||
104 | CONFIG_USB_ZERO=m | 104 | CONFIG_USB_ZERO=m |
105 | CONFIG_USB_ETH=m | 105 | CONFIG_USB_ETH=m |
106 | CONFIG_USB_GADGETFS=m | 106 | CONFIG_USB_GADGETFS=m |
107 | CONFIG_USB_FILE_STORAGE=m | 107 | CONFIG_USB_MASS_STORAGE=m |
108 | CONFIG_USB_G_SERIAL=m | 108 | CONFIG_USB_G_SERIAL=m |
109 | CONFIG_USB_CDC_COMPOSITE=m | 109 | CONFIG_USB_CDC_COMPOSITE=m |
110 | CONFIG_MMC=y | 110 | CONFIG_MMC=y |
diff --git a/arch/avr32/configs/atstk1006_defconfig b/arch/avr32/configs/atstk1006_defconfig index 511eb8af356d..206a1b67f763 100644 --- a/arch/avr32/configs/atstk1006_defconfig +++ b/arch/avr32/configs/atstk1006_defconfig | |||
@@ -129,7 +129,7 @@ CONFIG_USB_GADGET=y | |||
129 | CONFIG_USB_ZERO=m | 129 | CONFIG_USB_ZERO=m |
130 | CONFIG_USB_ETH=m | 130 | CONFIG_USB_ETH=m |
131 | CONFIG_USB_GADGETFS=m | 131 | CONFIG_USB_GADGETFS=m |
132 | CONFIG_USB_FILE_STORAGE=m | 132 | CONFIG_USB_MASS_STORAGE=m |
133 | CONFIG_USB_G_SERIAL=m | 133 | CONFIG_USB_G_SERIAL=m |
134 | CONFIG_USB_CDC_COMPOSITE=m | 134 | CONFIG_USB_CDC_COMPOSITE=m |
135 | CONFIG_MMC=y | 135 | CONFIG_MMC=y |
diff --git a/arch/avr32/configs/favr-32_defconfig b/arch/avr32/configs/favr-32_defconfig index 19973b06170c..0421498d666b 100644 --- a/arch/avr32/configs/favr-32_defconfig +++ b/arch/avr32/configs/favr-32_defconfig | |||
@@ -117,7 +117,7 @@ CONFIG_USB_GADGET=y | |||
117 | CONFIG_USB_ZERO=m | 117 | CONFIG_USB_ZERO=m |
118 | CONFIG_USB_ETH=m | 118 | CONFIG_USB_ETH=m |
119 | CONFIG_USB_GADGETFS=m | 119 | CONFIG_USB_GADGETFS=m |
120 | CONFIG_USB_FILE_STORAGE=m | 120 | CONFIG_USB_MASS_STORAGE=m |
121 | CONFIG_USB_G_SERIAL=m | 121 | CONFIG_USB_G_SERIAL=m |
122 | CONFIG_USB_CDC_COMPOSITE=m | 122 | CONFIG_USB_CDC_COMPOSITE=m |
123 | CONFIG_MMC=y | 123 | CONFIG_MMC=y |
diff --git a/arch/avr32/configs/hammerhead_defconfig b/arch/avr32/configs/hammerhead_defconfig index 6f45681196d1..82f24eb251bd 100644 --- a/arch/avr32/configs/hammerhead_defconfig +++ b/arch/avr32/configs/hammerhead_defconfig | |||
@@ -127,7 +127,7 @@ CONFIG_USB_GADGET=y | |||
127 | CONFIG_USB_ZERO=m | 127 | CONFIG_USB_ZERO=m |
128 | CONFIG_USB_ETH=m | 128 | CONFIG_USB_ETH=m |
129 | CONFIG_USB_GADGETFS=m | 129 | CONFIG_USB_GADGETFS=m |
130 | CONFIG_USB_FILE_STORAGE=m | 130 | CONFIG_USB_MASS_STORAGE=m |
131 | CONFIG_USB_G_SERIAL=m | 131 | CONFIG_USB_G_SERIAL=m |
132 | CONFIG_MMC=m | 132 | CONFIG_MMC=m |
133 | CONFIG_MMC_ATMELMCI=m | 133 | CONFIG_MMC_ATMELMCI=m |
diff --git a/arch/blackfin/configs/CM-BF527_defconfig b/arch/blackfin/configs/CM-BF527_defconfig index c280a50e7943..f59c80ee78e3 100644 --- a/arch/blackfin/configs/CM-BF527_defconfig +++ b/arch/blackfin/configs/CM-BF527_defconfig | |||
@@ -106,7 +106,7 @@ CONFIG_MUSB_PIO_ONLY=y | |||
106 | CONFIG_USB_STORAGE=m | 106 | CONFIG_USB_STORAGE=m |
107 | CONFIG_USB_GADGET=m | 107 | CONFIG_USB_GADGET=m |
108 | CONFIG_USB_ETH=m | 108 | CONFIG_USB_ETH=m |
109 | CONFIG_USB_FILE_STORAGE=m | 109 | CONFIG_USB_MASS_STORAGE=m |
110 | CONFIG_USB_G_SERIAL=m | 110 | CONFIG_USB_G_SERIAL=m |
111 | CONFIG_USB_G_PRINTER=m | 111 | CONFIG_USB_G_PRINTER=m |
112 | CONFIG_RTC_CLASS=y | 112 | CONFIG_RTC_CLASS=y |
diff --git a/arch/blackfin/configs/CM-BF548_defconfig b/arch/blackfin/configs/CM-BF548_defconfig index 349922be01f3..e961483f1879 100644 --- a/arch/blackfin/configs/CM-BF548_defconfig +++ b/arch/blackfin/configs/CM-BF548_defconfig | |||
@@ -107,7 +107,7 @@ CONFIG_USB_ZERO=m | |||
107 | CONFIG_USB_ETH=m | 107 | CONFIG_USB_ETH=m |
108 | # CONFIG_USB_ETH_RNDIS is not set | 108 | # CONFIG_USB_ETH_RNDIS is not set |
109 | CONFIG_USB_GADGETFS=m | 109 | CONFIG_USB_GADGETFS=m |
110 | CONFIG_USB_FILE_STORAGE=m | 110 | CONFIG_USB_MASS_STORAGE=m |
111 | CONFIG_USB_G_SERIAL=m | 111 | CONFIG_USB_G_SERIAL=m |
112 | CONFIG_USB_G_PRINTER=m | 112 | CONFIG_USB_G_PRINTER=m |
113 | CONFIG_MMC=m | 113 | CONFIG_MMC=m |
diff --git a/arch/blackfin/configs/CM-BF561_defconfig b/arch/blackfin/configs/CM-BF561_defconfig index 0456deaa2d6f..24936b91a6ee 100644 --- a/arch/blackfin/configs/CM-BF561_defconfig +++ b/arch/blackfin/configs/CM-BF561_defconfig | |||
@@ -83,7 +83,7 @@ CONFIG_GPIOLIB=y | |||
83 | CONFIG_GPIO_SYSFS=y | 83 | CONFIG_GPIO_SYSFS=y |
84 | CONFIG_USB_GADGET=m | 84 | CONFIG_USB_GADGET=m |
85 | CONFIG_USB_ETH=m | 85 | CONFIG_USB_ETH=m |
86 | CONFIG_USB_FILE_STORAGE=m | 86 | CONFIG_USB_MASS_STORAGE=m |
87 | CONFIG_USB_G_SERIAL=m | 87 | CONFIG_USB_G_SERIAL=m |
88 | CONFIG_USB_G_PRINTER=m | 88 | CONFIG_USB_G_PRINTER=m |
89 | CONFIG_MMC=y | 89 | CONFIG_MMC=y |
diff --git a/arch/mips/alchemy/common/Makefile b/arch/mips/alchemy/common/Makefile index 407ebc00e661..cb83d8d21aef 100644 --- a/arch/mips/alchemy/common/Makefile +++ b/arch/mips/alchemy/common/Makefile | |||
@@ -6,7 +6,7 @@ | |||
6 | # | 6 | # |
7 | 7 | ||
8 | obj-y += prom.o time.o clocks.o platform.o power.o setup.o \ | 8 | obj-y += prom.o time.o clocks.o platform.o power.o setup.o \ |
9 | sleeper.o dma.o dbdma.o vss.o irq.o | 9 | sleeper.o dma.o dbdma.o vss.o irq.o usb.o |
10 | 10 | ||
11 | # optional gpiolib support | 11 | # optional gpiolib support |
12 | ifeq ($(CONFIG_ALCHEMY_GPIO_INDIRECT),) | 12 | ifeq ($(CONFIG_ALCHEMY_GPIO_INDIRECT),) |
diff --git a/arch/mips/alchemy/common/platform.c b/arch/mips/alchemy/common/platform.c index c0f3ce6dcb56..7af941d8e717 100644 --- a/arch/mips/alchemy/common/platform.c +++ b/arch/mips/alchemy/common/platform.c | |||
@@ -17,6 +17,8 @@ | |||
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | #include <linux/serial_8250.h> | 18 | #include <linux/serial_8250.h> |
19 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
20 | #include <linux/usb/ehci_pdriver.h> | ||
21 | #include <linux/usb/ohci_pdriver.h> | ||
20 | 22 | ||
21 | #include <asm/mach-au1x00/au1000.h> | 23 | #include <asm/mach-au1x00/au1000.h> |
22 | #include <asm/mach-au1x00/au1xxx_dbdma.h> | 24 | #include <asm/mach-au1x00/au1xxx_dbdma.h> |
@@ -122,6 +124,53 @@ static void __init alchemy_setup_uarts(int ctype) | |||
122 | static u64 alchemy_ohci_dmamask = DMA_BIT_MASK(32); | 124 | static u64 alchemy_ohci_dmamask = DMA_BIT_MASK(32); |
123 | static u64 __maybe_unused alchemy_ehci_dmamask = DMA_BIT_MASK(32); | 125 | static u64 __maybe_unused alchemy_ehci_dmamask = DMA_BIT_MASK(32); |
124 | 126 | ||
127 | /* Power on callback for the ehci platform driver */ | ||
128 | static int alchemy_ehci_power_on(struct platform_device *pdev) | ||
129 | { | ||
130 | return alchemy_usb_control(ALCHEMY_USB_EHCI0, 1); | ||
131 | } | ||
132 | |||
133 | /* Power off/suspend callback for the ehci platform driver */ | ||
134 | static void alchemy_ehci_power_off(struct platform_device *pdev) | ||
135 | { | ||
136 | alchemy_usb_control(ALCHEMY_USB_EHCI0, 0); | ||
137 | } | ||
138 | |||
139 | static struct usb_ehci_pdata alchemy_ehci_pdata = { | ||
140 | .no_io_watchdog = 1, | ||
141 | .power_on = alchemy_ehci_power_on, | ||
142 | .power_off = alchemy_ehci_power_off, | ||
143 | .power_suspend = alchemy_ehci_power_off, | ||
144 | }; | ||
145 | |||
146 | /* Power on callback for the ohci platform driver */ | ||
147 | static int alchemy_ohci_power_on(struct platform_device *pdev) | ||
148 | { | ||
149 | int unit; | ||
150 | |||
151 | unit = (pdev->id == 1) ? | ||
152 | ALCHEMY_USB_OHCI1 : ALCHEMY_USB_OHCI0; | ||
153 | |||
154 | return alchemy_usb_control(unit, 1); | ||
155 | } | ||
156 | |||
157 | /* Power off/suspend callback for the ohci platform driver */ | ||
158 | static void alchemy_ohci_power_off(struct platform_device *pdev) | ||
159 | { | ||
160 | int unit; | ||
161 | |||
162 | unit = (pdev->id == 1) ? | ||
163 | ALCHEMY_USB_OHCI1 : ALCHEMY_USB_OHCI0; | ||
164 | |||
165 | alchemy_usb_control(unit, 0); | ||
166 | } | ||
167 | |||
168 | static struct usb_ohci_pdata alchemy_ohci_pdata = { | ||
169 | .power_on = alchemy_ohci_power_on, | ||
170 | .power_off = alchemy_ohci_power_off, | ||
171 | .power_suspend = alchemy_ohci_power_off, | ||
172 | }; | ||
173 | |||
125 | static unsigned long alchemy_ohci_data[][2] __initdata = { | 174 | static unsigned long alchemy_ohci_data[][2] __initdata = { |
126 | [ALCHEMY_CPU_AU1000] = { AU1000_USB_OHCI_PHYS_ADDR, AU1000_USB_HOST_INT }, | 175 | [ALCHEMY_CPU_AU1000] = { AU1000_USB_OHCI_PHYS_ADDR, AU1000_USB_HOST_INT }, |
127 | [ALCHEMY_CPU_AU1500] = { AU1000_USB_OHCI_PHYS_ADDR, AU1500_USB_HOST_INT }, | 176 | [ALCHEMY_CPU_AU1500] = { AU1000_USB_OHCI_PHYS_ADDR, AU1500_USB_HOST_INT }, |
@@ -169,9 +218,10 @@ static void __init alchemy_setup_usb(int ctype) | |||
169 | res[1].start = alchemy_ohci_data[ctype][1]; | 218 | res[1].start = alchemy_ohci_data[ctype][1]; |
170 | res[1].end = res[1].start; | 219 | res[1].end = res[1].start; |
171 | res[1].flags = IORESOURCE_IRQ; | 220 | res[1].flags = IORESOURCE_IRQ; |
172 | pdev->name = "au1xxx-ohci"; | 221 | pdev->name = "ohci-platform"; |
173 | pdev->id = 0; | 222 | pdev->id = 0; |
174 | pdev->dev.dma_mask = &alchemy_ohci_dmamask; | 223 | pdev->dev.dma_mask = &alchemy_ohci_dmamask; |
224 | pdev->dev.platform_data = &alchemy_ohci_pdata; | ||
175 | 225 | ||
176 | if (platform_device_register(pdev)) | 226 | if (platform_device_register(pdev)) |
177 | printk(KERN_INFO "Alchemy USB: cannot add OHCI0\n"); | 227 | printk(KERN_INFO "Alchemy USB: cannot add OHCI0\n"); |
@@ -188,9 +238,10 @@ static void __init alchemy_setup_usb(int ctype) | |||
188 | res[1].start = alchemy_ehci_data[ctype][1]; | 238 | res[1].start = alchemy_ehci_data[ctype][1]; |
189 | res[1].end = res[1].start; | 239 | res[1].end = res[1].start; |
190 | res[1].flags = IORESOURCE_IRQ; | 240 | res[1].flags = IORESOURCE_IRQ; |
191 | pdev->name = "au1xxx-ehci"; | 241 | pdev->name = "ehci-platform"; |
192 | pdev->id = 0; | 242 | pdev->id = 0; |
193 | pdev->dev.dma_mask = &alchemy_ehci_dmamask; | 243 | pdev->dev.dma_mask = &alchemy_ehci_dmamask; |
244 | pdev->dev.platform_data = &alchemy_ehci_pdata; | ||
194 | 245 | ||
195 | if (platform_device_register(pdev)) | 246 | if (platform_device_register(pdev)) |
196 | printk(KERN_INFO "Alchemy USB: cannot add EHCI0\n"); | 247 | printk(KERN_INFO "Alchemy USB: cannot add EHCI0\n"); |
@@ -207,9 +258,10 @@ static void __init alchemy_setup_usb(int ctype) | |||
207 | res[1].start = AU1300_USB_INT; | 258 | res[1].start = AU1300_USB_INT; |
208 | res[1].end = res[1].start; | 259 | res[1].end = res[1].start; |
209 | res[1].flags = IORESOURCE_IRQ; | 260 | res[1].flags = IORESOURCE_IRQ; |
210 | pdev->name = "au1xxx-ohci"; | 261 | pdev->name = "ohci-platform"; |
211 | pdev->id = 1; | 262 | pdev->id = 1; |
212 | pdev->dev.dma_mask = &alchemy_ohci_dmamask; | 263 | pdev->dev.dma_mask = &alchemy_ohci_dmamask; |
264 | pdev->dev.platform_data = &alchemy_ohci_pdata; | ||
213 | 265 | ||
214 | if (platform_device_register(pdev)) | 266 | if (platform_device_register(pdev)) |
215 | printk(KERN_INFO "Alchemy USB: cannot add OHCI1\n"); | 267 | printk(KERN_INFO "Alchemy USB: cannot add OHCI1\n"); |
diff --git a/drivers/usb/host/alchemy-common.c b/arch/mips/alchemy/common/usb.c index 936af8359fb2..936af8359fb2 100644 --- a/drivers/usb/host/alchemy-common.c +++ b/arch/mips/alchemy/common/usb.c | |||
diff --git a/arch/mips/ath79/dev-usb.c b/arch/mips/ath79/dev-usb.c index 072bb9be2304..bd2bc108e1b5 100644 --- a/arch/mips/ath79/dev-usb.c +++ b/arch/mips/ath79/dev-usb.c | |||
@@ -50,13 +50,11 @@ static u64 ath79_ehci_dmamask = DMA_BIT_MASK(32); | |||
50 | 50 | ||
51 | static struct usb_ehci_pdata ath79_ehci_pdata_v1 = { | 51 | static struct usb_ehci_pdata ath79_ehci_pdata_v1 = { |
52 | .has_synopsys_hc_bug = 1, | 52 | .has_synopsys_hc_bug = 1, |
53 | .port_power_off = 1, | ||
54 | }; | 53 | }; |
55 | 54 | ||
56 | static struct usb_ehci_pdata ath79_ehci_pdata_v2 = { | 55 | static struct usb_ehci_pdata ath79_ehci_pdata_v2 = { |
57 | .caps_offset = 0x100, | 56 | .caps_offset = 0x100, |
58 | .has_tt = 1, | 57 | .has_tt = 1, |
59 | .port_power_off = 1, | ||
60 | }; | 58 | }; |
61 | 59 | ||
62 | static struct platform_device ath79_ehci_device = { | 60 | static struct platform_device ath79_ehci_device = { |
diff --git a/arch/mips/configs/bcm47xx_defconfig b/arch/mips/configs/bcm47xx_defconfig index b6fde2bb51b6..4ca8e5c99225 100644 --- a/arch/mips/configs/bcm47xx_defconfig +++ b/arch/mips/configs/bcm47xx_defconfig | |||
@@ -473,7 +473,7 @@ CONFIG_USB_GADGET_NET2280=y | |||
473 | CONFIG_USB_ZERO=m | 473 | CONFIG_USB_ZERO=m |
474 | CONFIG_USB_ETH=m | 474 | CONFIG_USB_ETH=m |
475 | CONFIG_USB_GADGETFS=m | 475 | CONFIG_USB_GADGETFS=m |
476 | CONFIG_USB_FILE_STORAGE=m | 476 | CONFIG_USB_MASS_STORAGE=m |
477 | CONFIG_USB_G_SERIAL=m | 477 | CONFIG_USB_G_SERIAL=m |
478 | CONFIG_USB_MIDI_GADGET=m | 478 | CONFIG_USB_MIDI_GADGET=m |
479 | CONFIG_LEDS_CLASS=y | 479 | CONFIG_LEDS_CLASS=y |
diff --git a/arch/mips/configs/db1000_defconfig b/arch/mips/configs/db1000_defconfig index 17a36c125172..face9d26e6d5 100644 --- a/arch/mips/configs/db1000_defconfig +++ b/arch/mips/configs/db1000_defconfig | |||
@@ -233,6 +233,7 @@ CONFIG_USB_EHCI_HCD=y | |||
233 | CONFIG_USB_EHCI_ROOT_HUB_TT=y | 233 | CONFIG_USB_EHCI_ROOT_HUB_TT=y |
234 | CONFIG_USB_EHCI_TT_NEWSCHED=y | 234 | CONFIG_USB_EHCI_TT_NEWSCHED=y |
235 | CONFIG_USB_OHCI_HCD=y | 235 | CONFIG_USB_OHCI_HCD=y |
236 | CONFIG_USB_OHCI_HCD_PLATFORM=y | ||
236 | CONFIG_USB_UHCI_HCD=y | 237 | CONFIG_USB_UHCI_HCD=y |
237 | CONFIG_USB_STORAGE=y | 238 | CONFIG_USB_STORAGE=y |
238 | CONFIG_NEW_LEDS=y | 239 | CONFIG_NEW_LEDS=y |
diff --git a/arch/mips/configs/db1235_defconfig b/arch/mips/configs/db1235_defconfig index c48998ffd198..14752dde7540 100644 --- a/arch/mips/configs/db1235_defconfig +++ b/arch/mips/configs/db1235_defconfig | |||
@@ -346,8 +346,10 @@ CONFIG_USB=y | |||
346 | CONFIG_USB_DYNAMIC_MINORS=y | 346 | CONFIG_USB_DYNAMIC_MINORS=y |
347 | CONFIG_USB_SUSPEND=y | 347 | CONFIG_USB_SUSPEND=y |
348 | CONFIG_USB_EHCI_HCD=y | 348 | CONFIG_USB_EHCI_HCD=y |
349 | CONFIG_USB_EHCI_HCD_PLATFORM=y | ||
349 | CONFIG_USB_EHCI_ROOT_HUB_TT=y | 350 | CONFIG_USB_EHCI_ROOT_HUB_TT=y |
350 | CONFIG_USB_OHCI_HCD=y | 351 | CONFIG_USB_OHCI_HCD=y |
352 | CONFIG_USB_OHCI_HCD_PLATFORM=y | ||
351 | CONFIG_USB_STORAGE=y | 353 | CONFIG_USB_STORAGE=y |
352 | CONFIG_MMC=y | 354 | CONFIG_MMC=y |
353 | CONFIG_MMC_CLKGATE=y | 355 | CONFIG_MMC_CLKGATE=y |
diff --git a/arch/mips/configs/gpr_defconfig b/arch/mips/configs/gpr_defconfig index 48a40aefaf58..fb64589015fc 100644 --- a/arch/mips/configs/gpr_defconfig +++ b/arch/mips/configs/gpr_defconfig | |||
@@ -291,6 +291,7 @@ CONFIG_USB_MON=y | |||
291 | CONFIG_USB_EHCI_HCD=y | 291 | CONFIG_USB_EHCI_HCD=y |
292 | CONFIG_USB_EHCI_ROOT_HUB_TT=y | 292 | CONFIG_USB_EHCI_ROOT_HUB_TT=y |
293 | CONFIG_USB_OHCI_HCD=y | 293 | CONFIG_USB_OHCI_HCD=y |
294 | CONFIG_USB_OHCI_HCD_PLATFORM=y | ||
294 | CONFIG_USB_STORAGE=m | 295 | CONFIG_USB_STORAGE=m |
295 | CONFIG_USB_LIBUSUAL=y | 296 | CONFIG_USB_LIBUSUAL=y |
296 | CONFIG_USB_SERIAL=y | 297 | CONFIG_USB_SERIAL=y |
diff --git a/arch/mips/configs/ls1b_defconfig b/arch/mips/configs/ls1b_defconfig index 80cff8bea8e8..7eb75543ca1a 100644 --- a/arch/mips/configs/ls1b_defconfig +++ b/arch/mips/configs/ls1b_defconfig | |||
@@ -76,6 +76,7 @@ CONFIG_HID_GENERIC=m | |||
76 | CONFIG_USB=y | 76 | CONFIG_USB=y |
77 | CONFIG_USB_ANNOUNCE_NEW_DEVICES=y | 77 | CONFIG_USB_ANNOUNCE_NEW_DEVICES=y |
78 | CONFIG_USB_EHCI_HCD=y | 78 | CONFIG_USB_EHCI_HCD=y |
79 | CONFIG_USB_EHCI_HCD_PLATFORM=y | ||
79 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | 80 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set |
80 | CONFIG_USB_STORAGE=m | 81 | CONFIG_USB_STORAGE=m |
81 | CONFIG_USB_SERIAL=m | 82 | CONFIG_USB_SERIAL=m |
diff --git a/arch/mips/configs/mtx1_defconfig b/arch/mips/configs/mtx1_defconfig index 46c61edcdf7b..9fa8f16068d8 100644 --- a/arch/mips/configs/mtx1_defconfig +++ b/arch/mips/configs/mtx1_defconfig | |||
@@ -581,6 +581,7 @@ CONFIG_USB_MON=m | |||
581 | CONFIG_USB_EHCI_HCD=m | 581 | CONFIG_USB_EHCI_HCD=m |
582 | CONFIG_USB_EHCI_ROOT_HUB_TT=y | 582 | CONFIG_USB_EHCI_ROOT_HUB_TT=y |
583 | CONFIG_USB_OHCI_HCD=m | 583 | CONFIG_USB_OHCI_HCD=m |
584 | CONFIG_USB_OHCI_HCD_PLATFORM=y | ||
584 | CONFIG_USB_UHCI_HCD=m | 585 | CONFIG_USB_UHCI_HCD=m |
585 | CONFIG_USB_U132_HCD=m | 586 | CONFIG_USB_U132_HCD=m |
586 | CONFIG_USB_SL811_HCD=m | 587 | CONFIG_USB_SL811_HCD=m |
@@ -661,7 +662,7 @@ CONFIG_USB_GADGET_NET2280=y | |||
661 | CONFIG_USB_ZERO=m | 662 | CONFIG_USB_ZERO=m |
662 | CONFIG_USB_ETH=m | 663 | CONFIG_USB_ETH=m |
663 | CONFIG_USB_GADGETFS=m | 664 | CONFIG_USB_GADGETFS=m |
664 | CONFIG_USB_FILE_STORAGE=m | 665 | CONFIG_USB_MASS_STORAGE=m |
665 | CONFIG_USB_G_SERIAL=m | 666 | CONFIG_USB_G_SERIAL=m |
666 | CONFIG_USB_MIDI_GADGET=m | 667 | CONFIG_USB_MIDI_GADGET=m |
667 | CONFIG_MMC=m | 668 | CONFIG_MMC=m |
diff --git a/arch/mips/loongson1/common/platform.c b/arch/mips/loongson1/common/platform.c index e92d59c4bd78..0412ad61e290 100644 --- a/arch/mips/loongson1/common/platform.c +++ b/arch/mips/loongson1/common/platform.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/phy.h> | 13 | #include <linux/phy.h> |
14 | #include <linux/serial_8250.h> | 14 | #include <linux/serial_8250.h> |
15 | #include <linux/stmmac.h> | 15 | #include <linux/stmmac.h> |
16 | #include <linux/usb/ehci_pdriver.h> | ||
16 | #include <asm-generic/sizes.h> | 17 | #include <asm-generic/sizes.h> |
17 | 18 | ||
18 | #include <loongson1.h> | 19 | #include <loongson1.h> |
@@ -107,13 +108,17 @@ static struct resource ls1x_ehci_resources[] = { | |||
107 | }, | 108 | }, |
108 | }; | 109 | }; |
109 | 110 | ||
111 | static struct usb_ehci_pdata ls1x_ehci_pdata = { | ||
112 | }; | ||
113 | |||
110 | struct platform_device ls1x_ehci_device = { | 114 | struct platform_device ls1x_ehci_device = { |
111 | .name = "ls1x-ehci", | 115 | .name = "ehci-platform", |
112 | .id = -1, | 116 | .id = -1, |
113 | .num_resources = ARRAY_SIZE(ls1x_ehci_resources), | 117 | .num_resources = ARRAY_SIZE(ls1x_ehci_resources), |
114 | .resource = ls1x_ehci_resources, | 118 | .resource = ls1x_ehci_resources, |
115 | .dev = { | 119 | .dev = { |
116 | .dma_mask = &ls1x_ehci_dmamask, | 120 | .dma_mask = &ls1x_ehci_dmamask, |
121 | .platform_data = &ls1x_ehci_pdata, | ||
117 | }, | 122 | }, |
118 | }; | 123 | }; |
119 | 124 | ||
diff --git a/arch/mips/netlogic/xlr/platform.c b/arch/mips/netlogic/xlr/platform.c index 71b44d82621d..507230eeb768 100644 --- a/arch/mips/netlogic/xlr/platform.c +++ b/arch/mips/netlogic/xlr/platform.c | |||
@@ -15,6 +15,8 @@ | |||
15 | #include <linux/serial_8250.h> | 15 | #include <linux/serial_8250.h> |
16 | #include <linux/serial_reg.h> | 16 | #include <linux/serial_reg.h> |
17 | #include <linux/i2c.h> | 17 | #include <linux/i2c.h> |
18 | #include <linux/usb/ehci_pdriver.h> | ||
19 | #include <linux/usb/ohci_pdriver.h> | ||
18 | 20 | ||
19 | #include <asm/netlogic/haldefs.h> | 21 | #include <asm/netlogic/haldefs.h> |
20 | #include <asm/netlogic/xlr/iomap.h> | 22 | #include <asm/netlogic/xlr/iomap.h> |
@@ -123,12 +125,18 @@ static u64 xls_usb_dmamask = ~(u32)0; | |||
123 | }, \ | 125 | }, \ |
124 | } | 126 | } |
125 | 127 | ||
128 | static struct usb_ehci_pdata xls_usb_ehci_pdata = { | ||
129 | .caps_offset = 0, | ||
130 | }; | ||
131 | |||
132 | static struct usb_ohci_pdata xls_usb_ohci_pdata; | ||
133 | |||
126 | static struct platform_device xls_usb_ehci_device = | 134 | static struct platform_device xls_usb_ehci_device = |
127 | USB_PLATFORM_DEV("ehci-xls", 0, PIC_USB_IRQ); | 135 | USB_PLATFORM_DEV("ehci-platform", 0, PIC_USB_IRQ); |
128 | static struct platform_device xls_usb_ohci_device_0 = | 136 | static struct platform_device xls_usb_ohci_device_0 = |
129 | USB_PLATFORM_DEV("ohci-xls-0", 1, PIC_USB_IRQ); | 137 | USB_PLATFORM_DEV("ohci-platform", 1, PIC_USB_IRQ); |
130 | static struct platform_device xls_usb_ohci_device_1 = | 138 | static struct platform_device xls_usb_ohci_device_1 = |
131 | USB_PLATFORM_DEV("ohci-xls-1", 2, PIC_USB_IRQ); | 139 | USB_PLATFORM_DEV("ohci-platform", 2, PIC_USB_IRQ); |
132 | 140 | ||
133 | static struct platform_device *xls_platform_devices[] = { | 141 | static struct platform_device *xls_platform_devices[] = { |
134 | &xls_usb_ehci_device, | 142 | &xls_usb_ehci_device, |
@@ -172,14 +180,17 @@ int xls_platform_usb_init(void) | |||
172 | memres = CPHYSADDR((unsigned long)usb_mmio); | 180 | memres = CPHYSADDR((unsigned long)usb_mmio); |
173 | xls_usb_ehci_device.resource[0].start = memres; | 181 | xls_usb_ehci_device.resource[0].start = memres; |
174 | xls_usb_ehci_device.resource[0].end = memres + 0x400 - 1; | 182 | xls_usb_ehci_device.resource[0].end = memres + 0x400 - 1; |
183 | xls_usb_ehci_device.dev.platform_data = &xls_usb_ehci_pdata; | ||
175 | 184 | ||
176 | memres += 0x400; | 185 | memres += 0x400; |
177 | xls_usb_ohci_device_0.resource[0].start = memres; | 186 | xls_usb_ohci_device_0.resource[0].start = memres; |
178 | xls_usb_ohci_device_0.resource[0].end = memres + 0x400 - 1; | 187 | xls_usb_ohci_device_0.resource[0].end = memres + 0x400 - 1; |
188 | xls_usb_ohci_device_0.dev.platform_data = &xls_usb_ohci_pdata; | ||
179 | 189 | ||
180 | memres += 0x400; | 190 | memres += 0x400; |
181 | xls_usb_ohci_device_1.resource[0].start = memres; | 191 | xls_usb_ohci_device_1.resource[0].start = memres; |
182 | xls_usb_ohci_device_1.resource[0].end = memres + 0x400 - 1; | 192 | xls_usb_ohci_device_1.resource[0].end = memres + 0x400 - 1; |
193 | xls_usb_ohci_device_1.dev.platform_data = &xls_usb_ohci_pdata; | ||
183 | 194 | ||
184 | return platform_add_devices(xls_platform_devices, | 195 | return platform_add_devices(xls_platform_devices, |
185 | ARRAY_SIZE(xls_platform_devices)); | 196 | ARRAY_SIZE(xls_platform_devices)); |
diff --git a/arch/mips/pnx8550/common/platform.c b/arch/mips/pnx8550/common/platform.c index 5264cc09a27b..0a8faeaa7b70 100644 --- a/arch/mips/pnx8550/common/platform.c +++ b/arch/mips/pnx8550/common/platform.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/serial.h> | 20 | #include <linux/serial.h> |
21 | #include <linux/serial_pnx8xxx.h> | 21 | #include <linux/serial_pnx8xxx.h> |
22 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
23 | #include <linux/usb/ohci_pdriver.h> | ||
23 | 24 | ||
24 | #include <int.h> | 25 | #include <int.h> |
25 | #include <usb.h> | 26 | #include <usb.h> |
@@ -96,12 +97,40 @@ static u64 ohci_dmamask = DMA_BIT_MASK(32); | |||
96 | 97 | ||
97 | static u64 uart_dmamask = DMA_BIT_MASK(32); | 98 | static u64 uart_dmamask = DMA_BIT_MASK(32); |
98 | 99 | ||
100 | static int pnx8550_usb_ohci_power_on(struct platform_device *pdev) | ||
101 | { | ||
102 | /* | ||
103 | * Set register CLK48CTL to enable and 48MHz | ||
104 | */ | ||
105 | outl(0x00000003, PCI_BASE | 0x0004770c); | ||
106 | |||
107 | /* | ||
108 | * Set register CLK12CTL to enable and 48MHz | ||
109 | */ | ||
110 | outl(0x00000003, PCI_BASE | 0x00047710); | ||
111 | |||
112 | udelay(100); | ||
113 | |||
114 | return 0; | ||
115 | } | ||
116 | |||
117 | static void pnx8550_usb_ohci_power_off(struct platform_device *pdev) | ||
118 | { | ||
119 | udelay(10); | ||
120 | } | ||
121 | |||
122 | static struct usb_ohci_pdata pnx8550_usb_ohci_pdata = { | ||
123 | .power_on = pnx8550_usb_ohci_power_on, | ||
124 | .power_off = pnx8550_usb_ohci_power_off, | ||
125 | }; | ||
126 | |||
99 | static struct platform_device pnx8550_usb_ohci_device = { | 127 | static struct platform_device pnx8550_usb_ohci_device = { |
100 | .name = "pnx8550-ohci", | 128 | .name = "ohci-platform", |
101 | .id = -1, | 129 | .id = -1, |
102 | .dev = { | 130 | .dev = { |
103 | .dma_mask = &ohci_dmamask, | 131 | .dma_mask = &ohci_dmamask, |
104 | .coherent_dma_mask = DMA_BIT_MASK(32), | 132 | .coherent_dma_mask = DMA_BIT_MASK(32), |
133 | .platform_data = &pnx8550_usb_ohci_pdata, | ||
105 | }, | 134 | }, |
106 | .num_resources = ARRAY_SIZE(pnx8550_usb_ohci_resources), | 135 | .num_resources = ARRAY_SIZE(pnx8550_usb_ohci_resources), |
107 | .resource = pnx8550_usb_ohci_resources, | 136 | .resource = pnx8550_usb_ohci_resources, |
diff --git a/arch/sh/configs/ecovec24_defconfig b/arch/sh/configs/ecovec24_defconfig index 911e30c9abfd..c6c2becdc8ab 100644 --- a/arch/sh/configs/ecovec24_defconfig +++ b/arch/sh/configs/ecovec24_defconfig | |||
@@ -112,7 +112,7 @@ CONFIG_USB_MON=y | |||
112 | CONFIG_USB_R8A66597_HCD=y | 112 | CONFIG_USB_R8A66597_HCD=y |
113 | CONFIG_USB_STORAGE=y | 113 | CONFIG_USB_STORAGE=y |
114 | CONFIG_USB_GADGET=y | 114 | CONFIG_USB_GADGET=y |
115 | CONFIG_USB_FILE_STORAGE=m | 115 | CONFIG_USB_MASS_STORAGE=m |
116 | CONFIG_MMC=y | 116 | CONFIG_MMC=y |
117 | CONFIG_MMC_SPI=y | 117 | CONFIG_MMC_SPI=y |
118 | CONFIG_MMC_SDHI=y | 118 | CONFIG_MMC_SDHI=y |
diff --git a/arch/sh/configs/se7724_defconfig b/arch/sh/configs/se7724_defconfig index ed35093e3758..1faa788aecae 100644 --- a/arch/sh/configs/se7724_defconfig +++ b/arch/sh/configs/se7724_defconfig | |||
@@ -109,7 +109,7 @@ CONFIG_USB_STORAGE=y | |||
109 | CONFIG_USB_GADGET=y | 109 | CONFIG_USB_GADGET=y |
110 | CONFIG_USB_ETH=m | 110 | CONFIG_USB_ETH=m |
111 | CONFIG_USB_GADGETFS=m | 111 | CONFIG_USB_GADGETFS=m |
112 | CONFIG_USB_FILE_STORAGE=m | 112 | CONFIG_USB_MASS_STORAGE=m |
113 | CONFIG_USB_G_SERIAL=m | 113 | CONFIG_USB_G_SERIAL=m |
114 | CONFIG_MMC=y | 114 | CONFIG_MMC=y |
115 | CONFIG_MMC_SPI=y | 115 | CONFIG_MMC_SPI=y |
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7720.c b/arch/sh/kernel/cpu/sh3/setup-sh7720.c index 0c2f1b2c2e19..42d991f632b1 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh7720.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh7720.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/serial_sci.h> | 20 | #include <linux/serial_sci.h> |
21 | #include <linux/sh_timer.h> | 21 | #include <linux/sh_timer.h> |
22 | #include <linux/sh_intc.h> | 22 | #include <linux/sh_intc.h> |
23 | #include <linux/usb/ohci_pdriver.h> | ||
23 | #include <asm/rtc.h> | 24 | #include <asm/rtc.h> |
24 | #include <cpu/serial.h> | 25 | #include <cpu/serial.h> |
25 | 26 | ||
@@ -103,12 +104,15 @@ static struct resource usb_ohci_resources[] = { | |||
103 | 104 | ||
104 | static u64 usb_ohci_dma_mask = 0xffffffffUL; | 105 | static u64 usb_ohci_dma_mask = 0xffffffffUL; |
105 | 106 | ||
107 | static struct usb_ohci_pdata usb_ohci_pdata; | ||
108 | |||
106 | static struct platform_device usb_ohci_device = { | 109 | static struct platform_device usb_ohci_device = { |
107 | .name = "sh_ohci", | 110 | .name = "ohci-platform", |
108 | .id = -1, | 111 | .id = -1, |
109 | .dev = { | 112 | .dev = { |
110 | .dma_mask = &usb_ohci_dma_mask, | 113 | .dma_mask = &usb_ohci_dma_mask, |
111 | .coherent_dma_mask = 0xffffffff, | 114 | .coherent_dma_mask = 0xffffffff, |
115 | .platform_data = &usb_ohci_pdata, | ||
112 | }, | 116 | }, |
113 | .num_resources = ARRAY_SIZE(usb_ohci_resources), | 117 | .num_resources = ARRAY_SIZE(usb_ohci_resources), |
114 | .resource = usb_ohci_resources, | 118 | .resource = usb_ohci_resources, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c index 4a2f357f4df8..9079a0f9ea9b 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/sh_timer.h> | 19 | #include <linux/sh_timer.h> |
20 | #include <linux/sh_dma.h> | 20 | #include <linux/sh_dma.h> |
21 | #include <linux/sh_intc.h> | 21 | #include <linux/sh_intc.h> |
22 | #include <linux/usb/ohci_pdriver.h> | ||
22 | #include <cpu/dma-register.h> | 23 | #include <cpu/dma-register.h> |
23 | #include <cpu/sh7757.h> | 24 | #include <cpu/sh7757.h> |
24 | 25 | ||
@@ -750,12 +751,15 @@ static struct resource usb_ohci_resources[] = { | |||
750 | }, | 751 | }, |
751 | }; | 752 | }; |
752 | 753 | ||
754 | static struct usb_ohci_pdata usb_ohci_pdata; | ||
755 | |||
753 | static struct platform_device usb_ohci_device = { | 756 | static struct platform_device usb_ohci_device = { |
754 | .name = "sh_ohci", | 757 | .name = "ohci-platform", |
755 | .id = -1, | 758 | .id = -1, |
756 | .dev = { | 759 | .dev = { |
757 | .dma_mask = &usb_ohci_device.dev.coherent_dma_mask, | 760 | .dma_mask = &usb_ohci_device.dev.coherent_dma_mask, |
758 | .coherent_dma_mask = DMA_BIT_MASK(32), | 761 | .coherent_dma_mask = DMA_BIT_MASK(32), |
762 | .platform_data = &usb_ohci_pdata, | ||
759 | }, | 763 | }, |
760 | .num_resources = ARRAY_SIZE(usb_ohci_resources), | 764 | .num_resources = ARRAY_SIZE(usb_ohci_resources), |
761 | .resource = usb_ohci_resources, | 765 | .resource = usb_ohci_resources, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c index bd0a8fbe610f..1686acaaf45a 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/sh_intc.h> | 16 | #include <linux/sh_intc.h> |
17 | #include <linux/io.h> | 17 | #include <linux/io.h> |
18 | #include <linux/serial_sci.h> | 18 | #include <linux/serial_sci.h> |
19 | #include <linux/usb/ohci_pdriver.h> | ||
19 | 20 | ||
20 | static struct plat_sci_port scif0_platform_data = { | 21 | static struct plat_sci_port scif0_platform_data = { |
21 | .mapbase = 0xffe00000, | 22 | .mapbase = 0xffe00000, |
@@ -106,12 +107,15 @@ static struct resource usb_ohci_resources[] = { | |||
106 | 107 | ||
107 | static u64 usb_ohci_dma_mask = 0xffffffffUL; | 108 | static u64 usb_ohci_dma_mask = 0xffffffffUL; |
108 | 109 | ||
110 | static struct usb_ohci_pdata usb_ohci_pdata; | ||
111 | |||
109 | static struct platform_device usb_ohci_device = { | 112 | static struct platform_device usb_ohci_device = { |
110 | .name = "sh_ohci", | 113 | .name = "ohci-platform", |
111 | .id = -1, | 114 | .id = -1, |
112 | .dev = { | 115 | .dev = { |
113 | .dma_mask = &usb_ohci_dma_mask, | 116 | .dma_mask = &usb_ohci_dma_mask, |
114 | .coherent_dma_mask = 0xffffffff, | 117 | .coherent_dma_mask = 0xffffffff, |
118 | .platform_data = &usb_ohci_pdata, | ||
115 | }, | 119 | }, |
116 | .num_resources = ARRAY_SIZE(usb_ohci_resources), | 120 | .num_resources = ARRAY_SIZE(usb_ohci_resources), |
117 | .resource = usb_ohci_resources, | 121 | .resource = usb_ohci_resources, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c index 2e6952f87848..ab52d4d4484d 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/sh_timer.h> | 23 | #include <linux/sh_timer.h> |
24 | #include <linux/sh_dma.h> | 24 | #include <linux/sh_dma.h> |
25 | #include <linux/sh_intc.h> | 25 | #include <linux/sh_intc.h> |
26 | #include <linux/usb/ohci_pdriver.h> | ||
26 | #include <cpu/dma-register.h> | 27 | #include <cpu/dma-register.h> |
27 | #include <asm/mmzone.h> | 28 | #include <asm/mmzone.h> |
28 | 29 | ||
@@ -583,12 +584,15 @@ static struct resource usb_ohci_resources[] = { | |||
583 | }, | 584 | }, |
584 | }; | 585 | }; |
585 | 586 | ||
587 | static struct usb_ohci_pdata usb_ohci_pdata; | ||
588 | |||
586 | static struct platform_device usb_ohci_device = { | 589 | static struct platform_device usb_ohci_device = { |
587 | .name = "sh_ohci", | 590 | .name = "ohci-platform", |
588 | .id = -1, | 591 | .id = -1, |
589 | .dev = { | 592 | .dev = { |
590 | .dma_mask = &usb_ohci_device.dev.coherent_dma_mask, | 593 | .dma_mask = &usb_ohci_device.dev.coherent_dma_mask, |
591 | .coherent_dma_mask = DMA_BIT_MASK(32), | 594 | .coherent_dma_mask = DMA_BIT_MASK(32), |
595 | .platform_data = &usb_ohci_pdata, | ||
592 | }, | 596 | }, |
593 | .num_resources = ARRAY_SIZE(usb_ohci_resources), | 597 | .num_resources = ARRAY_SIZE(usb_ohci_resources), |
594 | .resource = usb_ohci_resources, | 598 | .resource = usb_ohci_resources, |
diff --git a/drivers/usb/c67x00/c67x00-drv.c b/drivers/usb/c67x00/c67x00-drv.c index 6f3b6e267398..fe815ecd557e 100644 --- a/drivers/usb/c67x00/c67x00-drv.c +++ b/drivers/usb/c67x00/c67x00-drv.c | |||
@@ -116,7 +116,7 @@ static irqreturn_t c67x00_irq(int irq, void *__dev) | |||
116 | 116 | ||
117 | /* ------------------------------------------------------------------------- */ | 117 | /* ------------------------------------------------------------------------- */ |
118 | 118 | ||
119 | static int __devinit c67x00_drv_probe(struct platform_device *pdev) | 119 | static int c67x00_drv_probe(struct platform_device *pdev) |
120 | { | 120 | { |
121 | struct c67x00_device *c67x00; | 121 | struct c67x00_device *c67x00; |
122 | struct c67x00_platform_data *pdata; | 122 | struct c67x00_platform_data *pdata; |
@@ -191,7 +191,7 @@ static int __devinit c67x00_drv_probe(struct platform_device *pdev) | |||
191 | return ret; | 191 | return ret; |
192 | } | 192 | } |
193 | 193 | ||
194 | static int __devexit c67x00_drv_remove(struct platform_device *pdev) | 194 | static int c67x00_drv_remove(struct platform_device *pdev) |
195 | { | 195 | { |
196 | struct c67x00_device *c67x00 = platform_get_drvdata(pdev); | 196 | struct c67x00_device *c67x00 = platform_get_drvdata(pdev); |
197 | struct resource *res; | 197 | struct resource *res; |
@@ -219,7 +219,7 @@ static int __devexit c67x00_drv_remove(struct platform_device *pdev) | |||
219 | 219 | ||
220 | static struct platform_driver c67x00_driver = { | 220 | static struct platform_driver c67x00_driver = { |
221 | .probe = c67x00_drv_probe, | 221 | .probe = c67x00_drv_probe, |
222 | .remove = __devexit_p(c67x00_drv_remove), | 222 | .remove = c67x00_drv_remove, |
223 | .driver = { | 223 | .driver = { |
224 | .owner = THIS_MODULE, | 224 | .owner = THIS_MODULE, |
225 | .name = "c67x00", | 225 | .name = "c67x00", |
diff --git a/drivers/usb/chipidea/Kconfig b/drivers/usb/chipidea/Kconfig index 1ea932a13685..608a2aeb400c 100644 --- a/drivers/usb/chipidea/Kconfig +++ b/drivers/usb/chipidea/Kconfig | |||
@@ -20,6 +20,7 @@ config USB_CHIPIDEA_UDC | |||
20 | config USB_CHIPIDEA_HOST | 20 | config USB_CHIPIDEA_HOST |
21 | bool "ChipIdea host controller" | 21 | bool "ChipIdea host controller" |
22 | depends on USB=y || USB=USB_CHIPIDEA | 22 | depends on USB=y || USB=USB_CHIPIDEA |
23 | depends on USB_EHCI_HCD | ||
23 | select USB_EHCI_ROOT_HUB_TT | 24 | select USB_EHCI_ROOT_HUB_TT |
24 | help | 25 | help |
25 | Say Y here to enable host controller functionality of the | 26 | Say Y here to enable host controller functionality of the |
diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c index 0f5ca4bea17f..8c291220be7f 100644 --- a/drivers/usb/chipidea/ci13xxx_imx.c +++ b/drivers/usb/chipidea/ci13xxx_imx.c | |||
@@ -85,7 +85,7 @@ EXPORT_SYMBOL_GPL(usbmisc_get_init_data); | |||
85 | 85 | ||
86 | /* End of common functions shared by usbmisc drivers*/ | 86 | /* End of common functions shared by usbmisc drivers*/ |
87 | 87 | ||
88 | static struct ci13xxx_platform_data ci13xxx_imx_platdata __devinitdata = { | 88 | static struct ci13xxx_platform_data ci13xxx_imx_platdata = { |
89 | .name = "ci13xxx_imx", | 89 | .name = "ci13xxx_imx", |
90 | .flags = CI13XXX_REQUIRE_TRANSCEIVER | | 90 | .flags = CI13XXX_REQUIRE_TRANSCEIVER | |
91 | CI13XXX_PULLUP_ON_VBUS | | 91 | CI13XXX_PULLUP_ON_VBUS | |
@@ -93,7 +93,7 @@ static struct ci13xxx_platform_data ci13xxx_imx_platdata __devinitdata = { | |||
93 | .capoffset = DEF_CAPOFFSET, | 93 | .capoffset = DEF_CAPOFFSET, |
94 | }; | 94 | }; |
95 | 95 | ||
96 | static int __devinit ci13xxx_imx_probe(struct platform_device *pdev) | 96 | static int ci13xxx_imx_probe(struct platform_device *pdev) |
97 | { | 97 | { |
98 | struct ci13xxx_imx_data *data; | 98 | struct ci13xxx_imx_data *data; |
99 | struct platform_device *plat_ci, *phy_pdev; | 99 | struct platform_device *plat_ci, *phy_pdev; |
@@ -220,7 +220,7 @@ put_np: | |||
220 | return ret; | 220 | return ret; |
221 | } | 221 | } |
222 | 222 | ||
223 | static int __devexit ci13xxx_imx_remove(struct platform_device *pdev) | 223 | static int ci13xxx_imx_remove(struct platform_device *pdev) |
224 | { | 224 | { |
225 | struct ci13xxx_imx_data *data = platform_get_drvdata(pdev); | 225 | struct ci13xxx_imx_data *data = platform_get_drvdata(pdev); |
226 | 226 | ||
@@ -252,7 +252,7 @@ MODULE_DEVICE_TABLE(of, ci13xxx_imx_dt_ids); | |||
252 | 252 | ||
253 | static struct platform_driver ci13xxx_imx_driver = { | 253 | static struct platform_driver ci13xxx_imx_driver = { |
254 | .probe = ci13xxx_imx_probe, | 254 | .probe = ci13xxx_imx_probe, |
255 | .remove = __devexit_p(ci13xxx_imx_remove), | 255 | .remove = ci13xxx_imx_remove, |
256 | .driver = { | 256 | .driver = { |
257 | .name = "imx_usb", | 257 | .name = "imx_usb", |
258 | .owner = THIS_MODULE, | 258 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/chipidea/ci13xxx_msm.c b/drivers/usb/chipidea/ci13xxx_msm.c index b01feb3be92e..7d16681fd3d2 100644 --- a/drivers/usb/chipidea/ci13xxx_msm.c +++ b/drivers/usb/chipidea/ci13xxx_msm.c | |||
@@ -55,7 +55,7 @@ static struct ci13xxx_platform_data ci13xxx_msm_platdata = { | |||
55 | .notify_event = ci13xxx_msm_notify_event, | 55 | .notify_event = ci13xxx_msm_notify_event, |
56 | }; | 56 | }; |
57 | 57 | ||
58 | static int __devinit ci13xxx_msm_probe(struct platform_device *pdev) | 58 | static int ci13xxx_msm_probe(struct platform_device *pdev) |
59 | { | 59 | { |
60 | struct platform_device *plat_ci; | 60 | struct platform_device *plat_ci; |
61 | 61 | ||
@@ -77,7 +77,7 @@ static int __devinit ci13xxx_msm_probe(struct platform_device *pdev) | |||
77 | return 0; | 77 | return 0; |
78 | } | 78 | } |
79 | 79 | ||
80 | static int __devexit ci13xxx_msm_remove(struct platform_device *pdev) | 80 | static int ci13xxx_msm_remove(struct platform_device *pdev) |
81 | { | 81 | { |
82 | struct platform_device *plat_ci = platform_get_drvdata(pdev); | 82 | struct platform_device *plat_ci = platform_get_drvdata(pdev); |
83 | 83 | ||
@@ -89,7 +89,7 @@ static int __devexit ci13xxx_msm_remove(struct platform_device *pdev) | |||
89 | 89 | ||
90 | static struct platform_driver ci13xxx_msm_driver = { | 90 | static struct platform_driver ci13xxx_msm_driver = { |
91 | .probe = ci13xxx_msm_probe, | 91 | .probe = ci13xxx_msm_probe, |
92 | .remove = __devexit_p(ci13xxx_msm_remove), | 92 | .remove = ci13xxx_msm_remove, |
93 | .driver = { .name = "msm_hsusb", }, | 93 | .driver = { .name = "msm_hsusb", }, |
94 | }; | 94 | }; |
95 | 95 | ||
diff --git a/drivers/usb/chipidea/ci13xxx_pci.c b/drivers/usb/chipidea/ci13xxx_pci.c index 918e14971f2b..9b227e39299a 100644 --- a/drivers/usb/chipidea/ci13xxx_pci.c +++ b/drivers/usb/chipidea/ci13xxx_pci.c | |||
@@ -48,7 +48,7 @@ struct ci13xxx_platform_data penwell_pci_platdata = { | |||
48 | * Allocates basic PCI resources for this USB device controller, and then | 48 | * Allocates basic PCI resources for this USB device controller, and then |
49 | * invokes the udc_probe() method to start the UDC associated with it | 49 | * invokes the udc_probe() method to start the UDC associated with it |
50 | */ | 50 | */ |
51 | static int __devinit ci13xxx_pci_probe(struct pci_dev *pdev, | 51 | static int ci13xxx_pci_probe(struct pci_dev *pdev, |
52 | const struct pci_device_id *id) | 52 | const struct pci_device_id *id) |
53 | { | 53 | { |
54 | struct ci13xxx_platform_data *platdata = (void *)id->driver_data; | 54 | struct ci13xxx_platform_data *platdata = (void *)id->driver_data; |
@@ -107,7 +107,7 @@ static int __devinit ci13xxx_pci_probe(struct pci_dev *pdev, | |||
107 | * first invoking the udc_remove() and then releases | 107 | * first invoking the udc_remove() and then releases |
108 | * all PCI resources allocated for this USB device controller | 108 | * all PCI resources allocated for this USB device controller |
109 | */ | 109 | */ |
110 | static void __devexit ci13xxx_pci_remove(struct pci_dev *pdev) | 110 | static void ci13xxx_pci_remove(struct pci_dev *pdev) |
111 | { | 111 | { |
112 | struct platform_device *plat_ci = pci_get_drvdata(pdev); | 112 | struct platform_device *plat_ci = pci_get_drvdata(pdev); |
113 | 113 | ||
@@ -147,7 +147,7 @@ static struct pci_driver ci13xxx_pci_driver = { | |||
147 | .name = UDC_DRIVER_NAME, | 147 | .name = UDC_DRIVER_NAME, |
148 | .id_table = ci13xxx_pci_id_table, | 148 | .id_table = ci13xxx_pci_id_table, |
149 | .probe = ci13xxx_pci_probe, | 149 | .probe = ci13xxx_pci_probe, |
150 | .remove = __devexit_p(ci13xxx_pci_remove), | 150 | .remove = ci13xxx_pci_remove, |
151 | }; | 151 | }; |
152 | 152 | ||
153 | module_pci_driver(ci13xxx_pci_driver); | 153 | module_pci_driver(ci13xxx_pci_driver); |
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index f69d029b4607..aebf695a9344 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c | |||
@@ -385,12 +385,13 @@ EXPORT_SYMBOL_GPL(ci13xxx_add_device); | |||
385 | 385 | ||
386 | void ci13xxx_remove_device(struct platform_device *pdev) | 386 | void ci13xxx_remove_device(struct platform_device *pdev) |
387 | { | 387 | { |
388 | int id = pdev->id; | ||
388 | platform_device_unregister(pdev); | 389 | platform_device_unregister(pdev); |
389 | ida_simple_remove(&ci_ida, pdev->id); | 390 | ida_simple_remove(&ci_ida, id); |
390 | } | 391 | } |
391 | EXPORT_SYMBOL_GPL(ci13xxx_remove_device); | 392 | EXPORT_SYMBOL_GPL(ci13xxx_remove_device); |
392 | 393 | ||
393 | static int __devinit ci_hdrc_probe(struct platform_device *pdev) | 394 | static int ci_hdrc_probe(struct platform_device *pdev) |
394 | { | 395 | { |
395 | struct device *dev = &pdev->dev; | 396 | struct device *dev = &pdev->dev; |
396 | struct ci13xxx *ci; | 397 | struct ci13xxx *ci; |
@@ -508,7 +509,7 @@ rm_wq: | |||
508 | return ret; | 509 | return ret; |
509 | } | 510 | } |
510 | 511 | ||
511 | static int __devexit ci_hdrc_remove(struct platform_device *pdev) | 512 | static int ci_hdrc_remove(struct platform_device *pdev) |
512 | { | 513 | { |
513 | struct ci13xxx *ci = platform_get_drvdata(pdev); | 514 | struct ci13xxx *ci = platform_get_drvdata(pdev); |
514 | 515 | ||
@@ -523,7 +524,7 @@ static int __devexit ci_hdrc_remove(struct platform_device *pdev) | |||
523 | 524 | ||
524 | static struct platform_driver ci_hdrc_driver = { | 525 | static struct platform_driver ci_hdrc_driver = { |
525 | .probe = ci_hdrc_probe, | 526 | .probe = ci_hdrc_probe, |
526 | .remove = __devexit_p(ci_hdrc_remove), | 527 | .remove = ci_hdrc_remove, |
527 | .driver = { | 528 | .driver = { |
528 | .name = "ci_hdrc", | 529 | .name = "ci_hdrc", |
529 | }, | 530 | }, |
diff --git a/drivers/usb/chipidea/debug.c b/drivers/usb/chipidea/debug.c index c6f50a257565..3bc244d2636a 100644 --- a/drivers/usb/chipidea/debug.c +++ b/drivers/usb/chipidea/debug.c | |||
@@ -160,9 +160,6 @@ static ssize_t show_device(struct device *dev, struct device_attribute *attr, | |||
160 | gadget->speed); | 160 | gadget->speed); |
161 | n += scnprintf(buf + n, PAGE_SIZE - n, "max_speed = %d\n", | 161 | n += scnprintf(buf + n, PAGE_SIZE - n, "max_speed = %d\n", |
162 | gadget->max_speed); | 162 | gadget->max_speed); |
163 | /* TODO: Scheduled for removal in 3.8. */ | ||
164 | n += scnprintf(buf + n, PAGE_SIZE - n, "is_dualspeed = %d\n", | ||
165 | gadget_is_dualspeed(gadget)); | ||
166 | n += scnprintf(buf + n, PAGE_SIZE - n, "is_otg = %d\n", | 163 | n += scnprintf(buf + n, PAGE_SIZE - n, "is_otg = %d\n", |
167 | gadget->is_otg); | 164 | gadget->is_otg); |
168 | n += scnprintf(buf + n, PAGE_SIZE - n, "is_a_peripheral = %d\n", | 165 | n += scnprintf(buf + n, PAGE_SIZE - n, "is_a_peripheral = %d\n", |
diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c index ebff9f4f56ec..caecad9213f5 100644 --- a/drivers/usb/chipidea/host.c +++ b/drivers/usb/chipidea/host.c | |||
@@ -20,77 +20,18 @@ | |||
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
23 | #include <linux/io.h> | ||
23 | #include <linux/usb.h> | 24 | #include <linux/usb.h> |
24 | #include <linux/usb/hcd.h> | 25 | #include <linux/usb/hcd.h> |
25 | #include <linux/usb/chipidea.h> | 26 | #include <linux/usb/chipidea.h> |
26 | 27 | ||
27 | #define CHIPIDEA_EHCI | 28 | #include "../host/ehci.h" |
28 | #include "../host/ehci-hcd.c" | ||
29 | 29 | ||
30 | #include "ci.h" | 30 | #include "ci.h" |
31 | #include "bits.h" | 31 | #include "bits.h" |
32 | #include "host.h" | 32 | #include "host.h" |
33 | 33 | ||
34 | static int ci_ehci_setup(struct usb_hcd *hcd) | 34 | static struct hc_driver __read_mostly ci_ehci_hc_driver; |
35 | { | ||
36 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
37 | int ret; | ||
38 | |||
39 | hcd->has_tt = 1; | ||
40 | |||
41 | ret = ehci_setup(hcd); | ||
42 | if (ret) | ||
43 | return ret; | ||
44 | |||
45 | ehci_port_power(ehci, 0); | ||
46 | |||
47 | return ret; | ||
48 | } | ||
49 | |||
50 | static const struct hc_driver ci_ehci_hc_driver = { | ||
51 | .description = "ehci_hcd", | ||
52 | .product_desc = "ChipIdea HDRC EHCI", | ||
53 | .hcd_priv_size = sizeof(struct ehci_hcd), | ||
54 | |||
55 | /* | ||
56 | * generic hardware linkage | ||
57 | */ | ||
58 | .irq = ehci_irq, | ||
59 | .flags = HCD_MEMORY | HCD_USB2, | ||
60 | |||
61 | /* | ||
62 | * basic lifecycle operations | ||
63 | */ | ||
64 | .reset = ci_ehci_setup, | ||
65 | .start = ehci_run, | ||
66 | .stop = ehci_stop, | ||
67 | .shutdown = ehci_shutdown, | ||
68 | |||
69 | /* | ||
70 | * managing i/o requests and associated device resources | ||
71 | */ | ||
72 | .urb_enqueue = ehci_urb_enqueue, | ||
73 | .urb_dequeue = ehci_urb_dequeue, | ||
74 | .endpoint_disable = ehci_endpoint_disable, | ||
75 | .endpoint_reset = ehci_endpoint_reset, | ||
76 | |||
77 | /* | ||
78 | * scheduling support | ||
79 | */ | ||
80 | .get_frame_number = ehci_get_frame, | ||
81 | |||
82 | /* | ||
83 | * root hub support | ||
84 | */ | ||
85 | .hub_status_data = ehci_hub_status_data, | ||
86 | .hub_control = ehci_hub_control, | ||
87 | .bus_suspend = ehci_bus_suspend, | ||
88 | .bus_resume = ehci_bus_resume, | ||
89 | .relinquish_port = ehci_relinquish_port, | ||
90 | .port_handed_over = ehci_port_handed_over, | ||
91 | |||
92 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
93 | }; | ||
94 | 35 | ||
95 | static irqreturn_t host_irq(struct ci13xxx *ci) | 36 | static irqreturn_t host_irq(struct ci13xxx *ci) |
96 | { | 37 | { |
@@ -157,5 +98,7 @@ int ci_hdrc_host_init(struct ci13xxx *ci) | |||
157 | rdrv->name = "host"; | 98 | rdrv->name = "host"; |
158 | ci->roles[CI_ROLE_HOST] = rdrv; | 99 | ci->roles[CI_ROLE_HOST] = rdrv; |
159 | 100 | ||
101 | ehci_init_driver(&ci_ehci_hc_driver, NULL); | ||
102 | |||
160 | return 0; | 103 | return 0; |
161 | } | 104 | } |
diff --git a/drivers/usb/chipidea/usbmisc_imx6q.c b/drivers/usb/chipidea/usbmisc_imx6q.c index 416e3fc58fd0..845efe29e6b9 100644 --- a/drivers/usb/chipidea/usbmisc_imx6q.c +++ b/drivers/usb/chipidea/usbmisc_imx6q.c | |||
@@ -82,7 +82,7 @@ static const struct of_device_id usbmisc_imx6q_dt_ids[] = { | |||
82 | { /* sentinel */ } | 82 | { /* sentinel */ } |
83 | }; | 83 | }; |
84 | 84 | ||
85 | static int __devinit usbmisc_imx6q_probe(struct platform_device *pdev) | 85 | static int usbmisc_imx6q_probe(struct platform_device *pdev) |
86 | { | 86 | { |
87 | struct resource *res; | 87 | struct resource *res; |
88 | struct imx6q_usbmisc *data; | 88 | struct imx6q_usbmisc *data; |
@@ -127,7 +127,7 @@ static int __devinit usbmisc_imx6q_probe(struct platform_device *pdev) | |||
127 | return 0; | 127 | return 0; |
128 | } | 128 | } |
129 | 129 | ||
130 | static int __devexit usbmisc_imx6q_remove(struct platform_device *pdev) | 130 | static int usbmisc_imx6q_remove(struct platform_device *pdev) |
131 | { | 131 | { |
132 | usbmisc_unset_ops(&imx6q_usbmisc_ops); | 132 | usbmisc_unset_ops(&imx6q_usbmisc_ops); |
133 | clk_disable_unprepare(usbmisc->clk); | 133 | clk_disable_unprepare(usbmisc->clk); |
@@ -136,7 +136,7 @@ static int __devexit usbmisc_imx6q_remove(struct platform_device *pdev) | |||
136 | 136 | ||
137 | static struct platform_driver usbmisc_imx6q_driver = { | 137 | static struct platform_driver usbmisc_imx6q_driver = { |
138 | .probe = usbmisc_imx6q_probe, | 138 | .probe = usbmisc_imx6q_probe, |
139 | .remove = __devexit_p(usbmisc_imx6q_remove), | 139 | .remove = usbmisc_imx6q_remove, |
140 | .driver = { | 140 | .driver = { |
141 | .name = "usbmisc_imx6q", | 141 | .name = "usbmisc_imx6q", |
142 | .owner = THIS_MODULE, | 142 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 6e49ec6f3adc..8d809a811e16 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -787,6 +787,10 @@ static int get_serial_info(struct acm *acm, struct serial_struct __user *info) | |||
787 | tmp.flags = ASYNC_LOW_LATENCY; | 787 | tmp.flags = ASYNC_LOW_LATENCY; |
788 | tmp.xmit_fifo_size = acm->writesize; | 788 | tmp.xmit_fifo_size = acm->writesize; |
789 | tmp.baud_base = le32_to_cpu(acm->line.dwDTERate); | 789 | tmp.baud_base = le32_to_cpu(acm->line.dwDTERate); |
790 | tmp.close_delay = acm->port.close_delay / 10; | ||
791 | tmp.closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? | ||
792 | ASYNC_CLOSING_WAIT_NONE : | ||
793 | acm->port.closing_wait / 10; | ||
790 | 794 | ||
791 | if (copy_to_user(info, &tmp, sizeof(tmp))) | 795 | if (copy_to_user(info, &tmp, sizeof(tmp))) |
792 | return -EFAULT; | 796 | return -EFAULT; |
@@ -794,6 +798,37 @@ static int get_serial_info(struct acm *acm, struct serial_struct __user *info) | |||
794 | return 0; | 798 | return 0; |
795 | } | 799 | } |
796 | 800 | ||
801 | static int set_serial_info(struct acm *acm, | ||
802 | struct serial_struct __user *newinfo) | ||
803 | { | ||
804 | struct serial_struct new_serial; | ||
805 | unsigned int closing_wait, close_delay; | ||
806 | int retval = 0; | ||
807 | |||
808 | if (copy_from_user(&new_serial, newinfo, sizeof(new_serial))) | ||
809 | return -EFAULT; | ||
810 | |||
811 | close_delay = new_serial.close_delay * 10; | ||
812 | closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ? | ||
813 | ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10; | ||
814 | |||
815 | mutex_lock(&acm->port.mutex); | ||
816 | |||
817 | if (!capable(CAP_SYS_ADMIN)) { | ||
818 | if ((close_delay != acm->port.close_delay) || | ||
819 | (closing_wait != acm->port.closing_wait)) | ||
820 | retval = -EPERM; | ||
821 | else | ||
822 | retval = -EOPNOTSUPP; | ||
823 | } else { | ||
824 | acm->port.close_delay = close_delay; | ||
825 | acm->port.closing_wait = closing_wait; | ||
826 | } | ||
827 | |||
828 | mutex_unlock(&acm->port.mutex); | ||
829 | return retval; | ||
830 | } | ||
831 | |||
797 | static int acm_tty_ioctl(struct tty_struct *tty, | 832 | static int acm_tty_ioctl(struct tty_struct *tty, |
798 | unsigned int cmd, unsigned long arg) | 833 | unsigned int cmd, unsigned long arg) |
799 | { | 834 | { |
@@ -804,6 +839,9 @@ static int acm_tty_ioctl(struct tty_struct *tty, | |||
804 | case TIOCGSERIAL: /* gets serial port data */ | 839 | case TIOCGSERIAL: /* gets serial port data */ |
805 | rv = get_serial_info(acm, (struct serial_struct __user *) arg); | 840 | rv = get_serial_info(acm, (struct serial_struct __user *) arg); |
806 | break; | 841 | break; |
842 | case TIOCSSERIAL: | ||
843 | rv = set_serial_info(acm, (struct serial_struct __user *) arg); | ||
844 | break; | ||
807 | } | 845 | } |
808 | 846 | ||
809 | return rv; | 847 | return rv; |
diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c index f460de31acee..cbacea933b18 100644 --- a/drivers/usb/core/devices.c +++ b/drivers/usb/core/devices.c | |||
@@ -591,16 +591,14 @@ static ssize_t usb_device_dump(char __user **buffer, size_t *nbytes, | |||
591 | 591 | ||
592 | /* Now look at all of this device's children. */ | 592 | /* Now look at all of this device's children. */ |
593 | usb_hub_for_each_child(usbdev, chix, childdev) { | 593 | usb_hub_for_each_child(usbdev, chix, childdev) { |
594 | if (childdev) { | 594 | usb_lock_device(childdev); |
595 | usb_lock_device(childdev); | 595 | ret = usb_device_dump(buffer, nbytes, skip_bytes, |
596 | ret = usb_device_dump(buffer, nbytes, skip_bytes, | 596 | file_offset, childdev, bus, |
597 | file_offset, childdev, bus, | 597 | level + 1, chix - 1, ++cnt); |
598 | level + 1, chix - 1, ++cnt); | 598 | usb_unlock_device(childdev); |
599 | usb_unlock_device(childdev); | 599 | if (ret == -EFAULT) |
600 | if (ret == -EFAULT) | 600 | return total_written; |
601 | return total_written; | 601 | total_written += ret; |
602 | total_written += ret; | ||
603 | } | ||
604 | } | 602 | } |
605 | return total_written; | 603 | return total_written; |
606 | } | 604 | } |
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index 6056db7af410..88dde95b6795 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c | |||
@@ -32,8 +32,6 @@ | |||
32 | #include "usb.h" | 32 | #include "usb.h" |
33 | 33 | ||
34 | 34 | ||
35 | #ifdef CONFIG_HOTPLUG | ||
36 | |||
37 | /* | 35 | /* |
38 | * Adds a new dynamic USBdevice ID to this driver, | 36 | * Adds a new dynamic USBdevice ID to this driver, |
39 | * and cause the driver to probe for all devices again. | 37 | * and cause the driver to probe for all devices again. |
@@ -194,20 +192,6 @@ static void usb_free_dynids(struct usb_driver *usb_drv) | |||
194 | } | 192 | } |
195 | spin_unlock(&usb_drv->dynids.lock); | 193 | spin_unlock(&usb_drv->dynids.lock); |
196 | } | 194 | } |
197 | #else | ||
198 | static inline int usb_create_newid_files(struct usb_driver *usb_drv) | ||
199 | { | ||
200 | return 0; | ||
201 | } | ||
202 | |||
203 | static void usb_remove_newid_files(struct usb_driver *usb_drv) | ||
204 | { | ||
205 | } | ||
206 | |||
207 | static inline void usb_free_dynids(struct usb_driver *usb_drv) | ||
208 | { | ||
209 | } | ||
210 | #endif | ||
211 | 195 | ||
212 | static const struct usb_device_id *usb_match_dynamic_id(struct usb_interface *intf, | 196 | static const struct usb_device_id *usb_match_dynamic_id(struct usb_interface *intf, |
213 | struct usb_driver *drv) | 197 | struct usb_driver *drv) |
@@ -790,7 +774,6 @@ static int usb_device_match(struct device *dev, struct device_driver *drv) | |||
790 | return 0; | 774 | return 0; |
791 | } | 775 | } |
792 | 776 | ||
793 | #ifdef CONFIG_HOTPLUG | ||
794 | static int usb_uevent(struct device *dev, struct kobj_uevent_env *env) | 777 | static int usb_uevent(struct device *dev, struct kobj_uevent_env *env) |
795 | { | 778 | { |
796 | struct usb_device *usb_dev; | 779 | struct usb_device *usb_dev; |
@@ -832,14 +815,6 @@ static int usb_uevent(struct device *dev, struct kobj_uevent_env *env) | |||
832 | return 0; | 815 | return 0; |
833 | } | 816 | } |
834 | 817 | ||
835 | #else | ||
836 | |||
837 | static int usb_uevent(struct device *dev, struct kobj_uevent_env *env) | ||
838 | { | ||
839 | return -ENODEV; | ||
840 | } | ||
841 | #endif /* CONFIG_HOTPLUG */ | ||
842 | |||
843 | /** | 818 | /** |
844 | * usb_register_device_driver - register a USB device (not interface) driver | 819 | * usb_register_device_driver - register a USB device (not interface) driver |
845 | * @new_udriver: USB operations for the device driver | 820 | * @new_udriver: USB operations for the device driver |
diff --git a/drivers/usb/core/generic.c b/drivers/usb/core/generic.c index 69ecd3c92311..eff2010eb63f 100644 --- a/drivers/usb/core/generic.c +++ b/drivers/usb/core/generic.c | |||
@@ -47,6 +47,9 @@ int usb_choose_configuration(struct usb_device *udev) | |||
47 | int insufficient_power = 0; | 47 | int insufficient_power = 0; |
48 | struct usb_host_config *c, *best; | 48 | struct usb_host_config *c, *best; |
49 | 49 | ||
50 | if (usb_device_is_owned(udev)) | ||
51 | return 0; | ||
52 | |||
50 | best = NULL; | 53 | best = NULL; |
51 | c = udev->config; | 54 | c = udev->config; |
52 | num_configs = udev->descriptor.bNumConfigurations; | 55 | num_configs = udev->descriptor.bNumConfigurations; |
@@ -160,9 +163,7 @@ static int generic_probe(struct usb_device *udev) | |||
160 | /* Choose and set the configuration. This registers the interfaces | 163 | /* Choose and set the configuration. This registers the interfaces |
161 | * with the driver core and lets interface drivers bind to them. | 164 | * with the driver core and lets interface drivers bind to them. |
162 | */ | 165 | */ |
163 | if (usb_device_is_owned(udev)) | 166 | if (udev->authorized == 0) |
164 | ; /* Don't configure if the device is owned */ | ||
165 | else if (udev->authorized == 0) | ||
166 | dev_err(&udev->dev, "Device is not authorized for usage\n"); | 167 | dev_err(&udev->dev, "Device is not authorized for usage\n"); |
167 | else { | 168 | else { |
168 | c = usb_choose_configuration(udev); | 169 | c = usb_choose_configuration(udev); |
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index f034716190ff..4225d5e72131 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -2039,8 +2039,9 @@ int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg) | |||
2039 | status = hcd->driver->bus_resume(hcd); | 2039 | status = hcd->driver->bus_resume(hcd); |
2040 | clear_bit(HCD_FLAG_WAKEUP_PENDING, &hcd->flags); | 2040 | clear_bit(HCD_FLAG_WAKEUP_PENDING, &hcd->flags); |
2041 | if (status == 0) { | 2041 | if (status == 0) { |
2042 | /* TRSMRCY = 10 msec */ | 2042 | struct usb_device *udev; |
2043 | msleep(10); | 2043 | int port1; |
2044 | |||
2044 | spin_lock_irq(&hcd_root_hub_lock); | 2045 | spin_lock_irq(&hcd_root_hub_lock); |
2045 | if (!HCD_DEAD(hcd)) { | 2046 | if (!HCD_DEAD(hcd)) { |
2046 | usb_set_device_state(rhdev, rhdev->actconfig | 2047 | usb_set_device_state(rhdev, rhdev->actconfig |
@@ -2050,6 +2051,20 @@ int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg) | |||
2050 | hcd->state = HC_STATE_RUNNING; | 2051 | hcd->state = HC_STATE_RUNNING; |
2051 | } | 2052 | } |
2052 | spin_unlock_irq(&hcd_root_hub_lock); | 2053 | spin_unlock_irq(&hcd_root_hub_lock); |
2054 | |||
2055 | /* | ||
2056 | * Check whether any of the enabled ports on the root hub are | ||
2057 | * unsuspended. If they are then a TRSMRCY delay is needed | ||
2058 | * (this is what the USB-2 spec calls a "global resume"). | ||
2059 | * Otherwise we can skip the delay. | ||
2060 | */ | ||
2061 | usb_hub_for_each_child(rhdev, port1, udev) { | ||
2062 | if (udev->state != USB_STATE_NOTATTACHED && | ||
2063 | !udev->port_is_suspended) { | ||
2064 | usleep_range(10000, 11000); /* TRSMRCY */ | ||
2065 | break; | ||
2066 | } | ||
2067 | } | ||
2053 | } else { | 2068 | } else { |
2054 | hcd->state = old_state; | 2069 | hcd->state = old_state; |
2055 | dev_dbg(&rhdev->dev, "bus %s fail, err %d\n", | 2070 | dev_dbg(&rhdev->dev, "bus %s fail, err %d\n", |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 1af04bdeaf0c..a815fd2cc5e7 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -39,6 +39,9 @@ | |||
39 | #endif | 39 | #endif |
40 | #endif | 40 | #endif |
41 | 41 | ||
42 | #define USB_VENDOR_GENESYS_LOGIC 0x05e3 | ||
43 | #define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND 0x01 | ||
44 | |||
42 | struct usb_port { | 45 | struct usb_port { |
43 | struct usb_device *child; | 46 | struct usb_device *child; |
44 | struct device dev; | 47 | struct device dev; |
@@ -86,6 +89,8 @@ struct usb_hub { | |||
86 | unsigned quiescing:1; | 89 | unsigned quiescing:1; |
87 | unsigned disconnected:1; | 90 | unsigned disconnected:1; |
88 | 91 | ||
92 | unsigned quirk_check_port_auto_suspend:1; | ||
93 | |||
89 | unsigned has_indicators:1; | 94 | unsigned has_indicators:1; |
90 | u8 indicator[USB_MAXCHILDREN]; | 95 | u8 indicator[USB_MAXCHILDREN]; |
91 | struct delayed_work leds; | 96 | struct delayed_work leds; |
@@ -736,7 +741,6 @@ static void hub_tt_work(struct work_struct *work) | |||
736 | struct usb_hub *hub = | 741 | struct usb_hub *hub = |
737 | container_of(work, struct usb_hub, tt.clear_work); | 742 | container_of(work, struct usb_hub, tt.clear_work); |
738 | unsigned long flags; | 743 | unsigned long flags; |
739 | int limit = 100; | ||
740 | 744 | ||
741 | spin_lock_irqsave (&hub->tt.lock, flags); | 745 | spin_lock_irqsave (&hub->tt.lock, flags); |
742 | while (!list_empty(&hub->tt.clear_list)) { | 746 | while (!list_empty(&hub->tt.clear_list)) { |
@@ -746,9 +750,6 @@ static void hub_tt_work(struct work_struct *work) | |||
746 | const struct hc_driver *drv; | 750 | const struct hc_driver *drv; |
747 | int status; | 751 | int status; |
748 | 752 | ||
749 | if (!hub->quiescing && --limit < 0) | ||
750 | break; | ||
751 | |||
752 | next = hub->tt.clear_list.next; | 753 | next = hub->tt.clear_list.next; |
753 | clear = list_entry (next, struct usb_tt_clear, clear_list); | 754 | clear = list_entry (next, struct usb_tt_clear, clear_list); |
754 | list_del (&clear->clear_list); | 755 | list_del (&clear->clear_list); |
@@ -1612,6 +1613,41 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
1612 | desc = intf->cur_altsetting; | 1613 | desc = intf->cur_altsetting; |
1613 | hdev = interface_to_usbdev(intf); | 1614 | hdev = interface_to_usbdev(intf); |
1614 | 1615 | ||
1616 | /* | ||
1617 | * Set default autosuspend delay as 0 to speedup bus suspend, | ||
1618 | * based on the below considerations: | ||
1619 | * | ||
1620 | * - Unlike other drivers, the hub driver does not rely on the | ||
1621 | * autosuspend delay to provide enough time to handle a wakeup | ||
1622 | * event, and the submitted status URB is just to check future | ||
1623 | * change on hub downstream ports, so it is safe to do it. | ||
1624 | * | ||
1625 | * - The patch might cause one or more auto supend/resume for | ||
1626 | * below very rare devices when they are plugged into hub | ||
1627 | * first time: | ||
1628 | * | ||
1629 | * devices having trouble initializing, and disconnect | ||
1630 | * themselves from the bus and then reconnect a second | ||
1631 | * or so later | ||
1632 | * | ||
1633 | * devices just for downloading firmware, and disconnects | ||
1634 | * themselves after completing it | ||
1635 | * | ||
1636 | * For these quite rare devices, their drivers may change the | ||
1637 | * autosuspend delay of their parent hub in the probe() to one | ||
1638 | * appropriate value to avoid the subtle problem if someone | ||
1639 | * does care it. | ||
1640 | * | ||
1641 | * - The patch may cause one or more auto suspend/resume on | ||
1642 | * hub during running 'lsusb', but it is probably too | ||
1643 | * infrequent to worry about. | ||
1644 | * | ||
1645 | * - Change autosuspend delay of hub can avoid unnecessary auto | ||
1646 | * suspend timer for hub, also may decrease power consumption | ||
1647 | * of USB bus. | ||
1648 | */ | ||
1649 | pm_runtime_set_autosuspend_delay(&hdev->dev, 0); | ||
1650 | |||
1615 | /* Hubs have proper suspend/resume support. */ | 1651 | /* Hubs have proper suspend/resume support. */ |
1616 | usb_enable_autosuspend(hdev); | 1652 | usb_enable_autosuspend(hdev); |
1617 | 1653 | ||
@@ -1670,6 +1706,9 @@ descriptor_error: | |||
1670 | if (hdev->speed == USB_SPEED_HIGH) | 1706 | if (hdev->speed == USB_SPEED_HIGH) |
1671 | highspeed_hubs++; | 1707 | highspeed_hubs++; |
1672 | 1708 | ||
1709 | if (id->driver_info & HUB_QUIRK_CHECK_PORT_AUTOSUSPEND) | ||
1710 | hub->quirk_check_port_auto_suspend = 1; | ||
1711 | |||
1673 | if (hub_configure(hub, endpoint) >= 0) | 1712 | if (hub_configure(hub, endpoint) >= 0) |
1674 | return 0; | 1713 | return 0; |
1675 | 1714 | ||
@@ -2012,7 +2051,7 @@ static void show_string(struct usb_device *udev, char *id, char *string) | |||
2012 | { | 2051 | { |
2013 | if (!string) | 2052 | if (!string) |
2014 | return; | 2053 | return; |
2015 | dev_printk(KERN_INFO, &udev->dev, "%s: %s\n", id, string); | 2054 | dev_info(&udev->dev, "%s: %s\n", id, string); |
2016 | } | 2055 | } |
2017 | 2056 | ||
2018 | static void announce_device(struct usb_device *udev) | 2057 | static void announce_device(struct usb_device *udev) |
@@ -2879,6 +2918,7 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) | |||
2879 | (PMSG_IS_AUTO(msg) ? "auto-" : ""), | 2918 | (PMSG_IS_AUTO(msg) ? "auto-" : ""), |
2880 | udev->do_remote_wakeup); | 2919 | udev->do_remote_wakeup); |
2881 | usb_set_device_state(udev, USB_STATE_SUSPENDED); | 2920 | usb_set_device_state(udev, USB_STATE_SUSPENDED); |
2921 | udev->port_is_suspended = 1; | ||
2882 | msleep(10); | 2922 | msleep(10); |
2883 | } | 2923 | } |
2884 | usb_mark_last_busy(hub->hdev); | 2924 | usb_mark_last_busy(hub->hdev); |
@@ -3043,6 +3083,7 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) | |||
3043 | 3083 | ||
3044 | SuspendCleared: | 3084 | SuspendCleared: |
3045 | if (status == 0) { | 3085 | if (status == 0) { |
3086 | udev->port_is_suspended = 0; | ||
3046 | if (hub_is_superspeed(hub->hdev)) { | 3087 | if (hub_is_superspeed(hub->hdev)) { |
3047 | if (portchange & USB_PORT_STAT_C_LINK_STATE) | 3088 | if (portchange & USB_PORT_STAT_C_LINK_STATE) |
3048 | clear_port_feature(hub->hdev, port1, | 3089 | clear_port_feature(hub->hdev, port1, |
@@ -3126,6 +3167,21 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) | |||
3126 | 3167 | ||
3127 | #endif | 3168 | #endif |
3128 | 3169 | ||
3170 | static int check_ports_changed(struct usb_hub *hub) | ||
3171 | { | ||
3172 | int port1; | ||
3173 | |||
3174 | for (port1 = 1; port1 <= hub->hdev->maxchild; ++port1) { | ||
3175 | u16 portstatus, portchange; | ||
3176 | int status; | ||
3177 | |||
3178 | status = hub_port_status(hub, port1, &portstatus, &portchange); | ||
3179 | if (!status && portchange) | ||
3180 | return 1; | ||
3181 | } | ||
3182 | return 0; | ||
3183 | } | ||
3184 | |||
3129 | static int hub_suspend(struct usb_interface *intf, pm_message_t msg) | 3185 | static int hub_suspend(struct usb_interface *intf, pm_message_t msg) |
3130 | { | 3186 | { |
3131 | struct usb_hub *hub = usb_get_intfdata (intf); | 3187 | struct usb_hub *hub = usb_get_intfdata (intf); |
@@ -3144,6 +3200,16 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) | |||
3144 | return -EBUSY; | 3200 | return -EBUSY; |
3145 | } | 3201 | } |
3146 | } | 3202 | } |
3203 | |||
3204 | if (hdev->do_remote_wakeup && hub->quirk_check_port_auto_suspend) { | ||
3205 | /* check if there are changes pending on hub ports */ | ||
3206 | if (check_ports_changed(hub)) { | ||
3207 | if (PMSG_IS_AUTO(msg)) | ||
3208 | return -EBUSY; | ||
3209 | pm_wakeup_event(&hdev->dev, 2000); | ||
3210 | } | ||
3211 | } | ||
3212 | |||
3147 | if (hub_is_superspeed(hdev) && hdev->do_remote_wakeup) { | 3213 | if (hub_is_superspeed(hdev) && hdev->do_remote_wakeup) { |
3148 | /* Enable hub to send remote wakeup for all ports. */ | 3214 | /* Enable hub to send remote wakeup for all ports. */ |
3149 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { | 3215 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { |
@@ -3972,6 +4038,9 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, | |||
3972 | if (retval) | 4038 | if (retval) |
3973 | goto fail; | 4039 | goto fail; |
3974 | 4040 | ||
4041 | if (hcd->phy && !hdev->parent) | ||
4042 | usb_phy_notify_connect(hcd->phy, udev->speed); | ||
4043 | |||
3975 | /* | 4044 | /* |
3976 | * Some superspeed devices have finished the link training process | 4045 | * Some superspeed devices have finished the link training process |
3977 | * and attached to a superspeed hub port, but the device descriptor | 4046 | * and attached to a superspeed hub port, but the device descriptor |
@@ -4166,8 +4235,12 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, | |||
4166 | } | 4235 | } |
4167 | 4236 | ||
4168 | /* Disconnect any existing devices under this port */ | 4237 | /* Disconnect any existing devices under this port */ |
4169 | if (udev) | 4238 | if (udev) { |
4239 | if (hcd->phy && !hdev->parent && | ||
4240 | !(portstatus & USB_PORT_STAT_CONNECTION)) | ||
4241 | usb_phy_notify_disconnect(hcd->phy, udev->speed); | ||
4170 | usb_disconnect(&hub->ports[port1 - 1]->child); | 4242 | usb_disconnect(&hub->ports[port1 - 1]->child); |
4243 | } | ||
4171 | clear_bit(port1, hub->change_bits); | 4244 | clear_bit(port1, hub->change_bits); |
4172 | 4245 | ||
4173 | /* We can forget about a "removed" device when there's a physical | 4246 | /* We can forget about a "removed" device when there's a physical |
@@ -4190,13 +4263,6 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, | |||
4190 | } | 4263 | } |
4191 | } | 4264 | } |
4192 | 4265 | ||
4193 | if (hcd->phy && !hdev->parent) { | ||
4194 | if (portstatus & USB_PORT_STAT_CONNECTION) | ||
4195 | usb_phy_notify_connect(hcd->phy, port1); | ||
4196 | else | ||
4197 | usb_phy_notify_disconnect(hcd->phy, port1); | ||
4198 | } | ||
4199 | |||
4200 | /* Return now if debouncing failed or nothing is connected or | 4266 | /* Return now if debouncing failed or nothing is connected or |
4201 | * the device was "removed". | 4267 | * the device was "removed". |
4202 | */ | 4268 | */ |
@@ -4648,6 +4714,11 @@ static int hub_thread(void *__unused) | |||
4648 | } | 4714 | } |
4649 | 4715 | ||
4650 | static const struct usb_device_id hub_id_table[] = { | 4716 | static const struct usb_device_id hub_id_table[] = { |
4717 | { .match_flags = USB_DEVICE_ID_MATCH_VENDOR | ||
4718 | | USB_DEVICE_ID_MATCH_INT_CLASS, | ||
4719 | .idVendor = USB_VENDOR_GENESYS_LOGIC, | ||
4720 | .bInterfaceClass = USB_CLASS_HUB, | ||
4721 | .driver_info = HUB_QUIRK_CHECK_PORT_AUTOSUSPEND}, | ||
4651 | { .match_flags = USB_DEVICE_ID_MATCH_DEV_CLASS, | 4722 | { .match_flags = USB_DEVICE_ID_MATCH_DEV_CLASS, |
4652 | .bDeviceClass = USB_CLASS_HUB}, | 4723 | .bDeviceClass = USB_CLASS_HUB}, |
4653 | { .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS, | 4724 | { .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS, |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 1ed5afd91e6d..131f73649b60 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
@@ -1540,7 +1540,6 @@ static void usb_release_interface(struct device *dev) | |||
1540 | kfree(intf); | 1540 | kfree(intf); |
1541 | } | 1541 | } |
1542 | 1542 | ||
1543 | #ifdef CONFIG_HOTPLUG | ||
1544 | static int usb_if_uevent(struct device *dev, struct kobj_uevent_env *env) | 1543 | static int usb_if_uevent(struct device *dev, struct kobj_uevent_env *env) |
1545 | { | 1544 | { |
1546 | struct usb_device *usb_dev; | 1545 | struct usb_device *usb_dev; |
@@ -1575,14 +1574,6 @@ static int usb_if_uevent(struct device *dev, struct kobj_uevent_env *env) | |||
1575 | return 0; | 1574 | return 0; |
1576 | } | 1575 | } |
1577 | 1576 | ||
1578 | #else | ||
1579 | |||
1580 | static int usb_if_uevent(struct device *dev, struct kobj_uevent_env *env) | ||
1581 | { | ||
1582 | return -ENODEV; | ||
1583 | } | ||
1584 | #endif /* CONFIG_HOTPLUG */ | ||
1585 | |||
1586 | struct device_type usb_if_device_type = { | 1577 | struct device_type usb_if_device_type = { |
1587 | .name = "usb_interface", | 1578 | .name = "usb_interface", |
1588 | .release = usb_release_interface, | 1579 | .release = usb_release_interface, |
@@ -1795,7 +1786,8 @@ free_interfaces: | |||
1795 | if (dev->actconfig && usb_disable_lpm(dev)) { | 1786 | if (dev->actconfig && usb_disable_lpm(dev)) { |
1796 | dev_err(&dev->dev, "%s Failed to disable LPM\n.", __func__); | 1787 | dev_err(&dev->dev, "%s Failed to disable LPM\n.", __func__); |
1797 | mutex_unlock(hcd->bandwidth_mutex); | 1788 | mutex_unlock(hcd->bandwidth_mutex); |
1798 | return -ENOMEM; | 1789 | ret = -ENOMEM; |
1790 | goto free_interfaces; | ||
1799 | } | 1791 | } |
1800 | ret = usb_hcd_alloc_bandwidth(dev, cp, NULL, NULL); | 1792 | ret = usb_hcd_alloc_bandwidth(dev, cp, NULL, NULL); |
1801 | if (ret < 0) { | 1793 | if (ret < 0) { |
@@ -1806,29 +1798,8 @@ free_interfaces: | |||
1806 | goto free_interfaces; | 1798 | goto free_interfaces; |
1807 | } | 1799 | } |
1808 | 1800 | ||
1809 | ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), | 1801 | /* |
1810 | USB_REQ_SET_CONFIGURATION, 0, configuration, 0, | 1802 | * Initialize the new interface structures and the |
1811 | NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
1812 | if (ret < 0) { | ||
1813 | /* All the old state is gone, so what else can we do? | ||
1814 | * The device is probably useless now anyway. | ||
1815 | */ | ||
1816 | cp = NULL; | ||
1817 | } | ||
1818 | |||
1819 | dev->actconfig = cp; | ||
1820 | if (!cp) { | ||
1821 | usb_set_device_state(dev, USB_STATE_ADDRESS); | ||
1822 | usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL); | ||
1823 | /* Leave LPM disabled while the device is unconfigured. */ | ||
1824 | mutex_unlock(hcd->bandwidth_mutex); | ||
1825 | usb_autosuspend_device(dev); | ||
1826 | goto free_interfaces; | ||
1827 | } | ||
1828 | mutex_unlock(hcd->bandwidth_mutex); | ||
1829 | usb_set_device_state(dev, USB_STATE_CONFIGURED); | ||
1830 | |||
1831 | /* Initialize the new interface structures and the | ||
1832 | * hc/hcd/usbcore interface/endpoint state. | 1803 | * hc/hcd/usbcore interface/endpoint state. |
1833 | */ | 1804 | */ |
1834 | for (i = 0; i < nintf; ++i) { | 1805 | for (i = 0; i < nintf; ++i) { |
@@ -1872,6 +1843,35 @@ free_interfaces: | |||
1872 | } | 1843 | } |
1873 | kfree(new_interfaces); | 1844 | kfree(new_interfaces); |
1874 | 1845 | ||
1846 | ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), | ||
1847 | USB_REQ_SET_CONFIGURATION, 0, configuration, 0, | ||
1848 | NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
1849 | if (ret < 0 && cp) { | ||
1850 | /* | ||
1851 | * All the old state is gone, so what else can we do? | ||
1852 | * The device is probably useless now anyway. | ||
1853 | */ | ||
1854 | usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL); | ||
1855 | for (i = 0; i < nintf; ++i) { | ||
1856 | usb_disable_interface(dev, cp->interface[i], true); | ||
1857 | put_device(&cp->interface[i]->dev); | ||
1858 | cp->interface[i] = NULL; | ||
1859 | } | ||
1860 | cp = NULL; | ||
1861 | } | ||
1862 | |||
1863 | dev->actconfig = cp; | ||
1864 | mutex_unlock(hcd->bandwidth_mutex); | ||
1865 | |||
1866 | if (!cp) { | ||
1867 | usb_set_device_state(dev, USB_STATE_ADDRESS); | ||
1868 | |||
1869 | /* Leave LPM disabled while the device is unconfigured. */ | ||
1870 | usb_autosuspend_device(dev); | ||
1871 | return ret; | ||
1872 | } | ||
1873 | usb_set_device_state(dev, USB_STATE_CONFIGURED); | ||
1874 | |||
1875 | if (cp->string == NULL && | 1875 | if (cp->string == NULL && |
1876 | !(dev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS)) | 1876 | !(dev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS)) |
1877 | cp->string = usb_cache_string(dev, cp->desc.iConfiguration); | 1877 | cp->string = usb_cache_string(dev, cp->desc.iConfiguration); |
diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c index 9d912bfdcffe..e0d9d948218c 100644 --- a/drivers/usb/core/urb.c +++ b/drivers/usb/core/urb.c | |||
@@ -214,9 +214,25 @@ EXPORT_SYMBOL_GPL(usb_unanchor_urb); | |||
214 | * urb->interval is modified to reflect the actual transfer period used | 214 | * urb->interval is modified to reflect the actual transfer period used |
215 | * (normally some power of two units). And for isochronous urbs, | 215 | * (normally some power of two units). And for isochronous urbs, |
216 | * urb->start_frame is modified to reflect when the URB's transfers were | 216 | * urb->start_frame is modified to reflect when the URB's transfers were |
217 | * scheduled to start. Not all isochronous transfer scheduling policies | 217 | * scheduled to start. |
218 | * will work, but most host controller drivers should easily handle ISO | 218 | * |
219 | * queues going from now until 10-200 msec into the future. | 219 | * Not all isochronous transfer scheduling policies will work, but most |
220 | * host controller drivers should easily handle ISO queues going from now | ||
221 | * until 10-200 msec into the future. Drivers should try to keep at | ||
222 | * least one or two msec of data in the queue; many controllers require | ||
223 | * that new transfers start at least 1 msec in the future when they are | ||
224 | * added. If the driver is unable to keep up and the queue empties out, | ||
225 | * the behavior for new submissions is governed by the URB_ISO_ASAP flag. | ||
226 | * If the flag is set, or if the queue is idle, then the URB is always | ||
227 | * assigned to the first available (and not yet expired) slot in the | ||
228 | * endpoint's schedule. If the flag is not set and the queue is active | ||
229 | * then the URB is always assigned to the next slot in the schedule | ||
230 | * following the end of the endpoint's previous URB, even if that slot is | ||
231 | * in the past. When a packet is assigned in this way to a slot that has | ||
232 | * already expired, the packet is not transmitted and the corresponding | ||
233 | * usb_iso_packet_descriptor's status field will return -EXDEV. If this | ||
234 | * would happen to all the packets in the URB, submission fails with a | ||
235 | * -EXDEV error code. | ||
220 | * | 236 | * |
221 | * For control endpoints, the synchronous usb_control_msg() call is | 237 | * For control endpoints, the synchronous usb_control_msg() call is |
222 | * often used (in non-interrupt context) instead of this call. | 238 | * often used (in non-interrupt context) instead of this call. |
@@ -305,8 +321,13 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) | |||
305 | struct usb_host_endpoint *ep; | 321 | struct usb_host_endpoint *ep; |
306 | int is_out; | 322 | int is_out; |
307 | 323 | ||
308 | if (!urb || urb->hcpriv || !urb->complete) | 324 | if (!urb || !urb->complete) |
309 | return -EINVAL; | 325 | return -EINVAL; |
326 | if (urb->hcpriv) { | ||
327 | WARN_ONCE(1, "URB %p submitted while active\n", urb); | ||
328 | return -EBUSY; | ||
329 | } | ||
330 | |||
310 | dev = urb->dev; | 331 | dev = urb->dev; |
311 | if ((!dev) || (dev->state < USB_STATE_UNAUTHENTICATED)) | 332 | if ((!dev) || (dev->state < USB_STATE_UNAUTHENTICATED)) |
312 | return -ENODEV; | 333 | return -ENODEV; |
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index cd8fb44a3e16..f81b92572735 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
@@ -233,7 +233,6 @@ static void usb_release_dev(struct device *dev) | |||
233 | kfree(udev); | 233 | kfree(udev); |
234 | } | 234 | } |
235 | 235 | ||
236 | #ifdef CONFIG_HOTPLUG | ||
237 | static int usb_dev_uevent(struct device *dev, struct kobj_uevent_env *env) | 236 | static int usb_dev_uevent(struct device *dev, struct kobj_uevent_env *env) |
238 | { | 237 | { |
239 | struct usb_device *usb_dev; | 238 | struct usb_device *usb_dev; |
@@ -249,14 +248,6 @@ static int usb_dev_uevent(struct device *dev, struct kobj_uevent_env *env) | |||
249 | return 0; | 248 | return 0; |
250 | } | 249 | } |
251 | 250 | ||
252 | #else | ||
253 | |||
254 | static int usb_dev_uevent(struct device *dev, struct kobj_uevent_env *env) | ||
255 | { | ||
256 | return -ENODEV; | ||
257 | } | ||
258 | #endif /* CONFIG_HOTPLUG */ | ||
259 | |||
260 | #ifdef CONFIG_PM | 251 | #ifdef CONFIG_PM |
261 | 252 | ||
262 | /* USB device Power-Management thunks. | 253 | /* USB device Power-Management thunks. |
@@ -370,14 +361,14 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, | |||
370 | struct usb_bus *bus, unsigned port1) | 361 | struct usb_bus *bus, unsigned port1) |
371 | { | 362 | { |
372 | struct usb_device *dev; | 363 | struct usb_device *dev; |
373 | struct usb_hcd *usb_hcd = container_of(bus, struct usb_hcd, self); | 364 | struct usb_hcd *usb_hcd = bus_to_hcd(bus); |
374 | unsigned root_hub = 0; | 365 | unsigned root_hub = 0; |
375 | 366 | ||
376 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | 367 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); |
377 | if (!dev) | 368 | if (!dev) |
378 | return NULL; | 369 | return NULL; |
379 | 370 | ||
380 | if (!usb_get_hcd(bus_to_hcd(bus))) { | 371 | if (!usb_get_hcd(usb_hcd)) { |
381 | kfree(dev); | 372 | kfree(dev); |
382 | return NULL; | 373 | return NULL; |
383 | } | 374 | } |
diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile index d441fe4c180b..4502648b8171 100644 --- a/drivers/usb/dwc3/Makefile +++ b/drivers/usb/dwc3/Makefile | |||
@@ -27,19 +27,7 @@ endif | |||
27 | ## | 27 | ## |
28 | 28 | ||
29 | obj-$(CONFIG_USB_DWC3) += dwc3-omap.o | 29 | obj-$(CONFIG_USB_DWC3) += dwc3-omap.o |
30 | 30 | obj-$(CONFIG_USB_DWC3) += dwc3-exynos.o | |
31 | ## | ||
32 | # REVISIT Samsung Exynos platform needs the clk API which isn't | ||
33 | # defined on all architectures. If we allow dwc3-exynos.c compile | ||
34 | # always we will fail the linking phase on those architectures | ||
35 | # which don't provide clk api implementation and that's unnaceptable. | ||
36 | # | ||
37 | # When Samsung's platform start supporting pm_runtime, this check | ||
38 | # for HAVE_CLK should be removed. | ||
39 | ## | ||
40 | ifneq ($(CONFIG_HAVE_CLK),) | ||
41 | obj-$(CONFIG_USB_DWC3) += dwc3-exynos.o | ||
42 | endif | ||
43 | 31 | ||
44 | ifneq ($(CONFIG_PCI),) | 32 | ifneq ($(CONFIG_PCI),) |
45 | obj-$(CONFIG_USB_DWC3) += dwc3-pci.o | 33 | obj-$(CONFIG_USB_DWC3) += dwc3-pci.o |
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index c14ebc975ba4..3a4004a620ad 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
@@ -66,45 +66,6 @@ MODULE_PARM_DESC(maximum_speed, "Maximum supported speed."); | |||
66 | 66 | ||
67 | /* -------------------------------------------------------------------------- */ | 67 | /* -------------------------------------------------------------------------- */ |
68 | 68 | ||
69 | #define DWC3_DEVS_POSSIBLE 32 | ||
70 | |||
71 | static DECLARE_BITMAP(dwc3_devs, DWC3_DEVS_POSSIBLE); | ||
72 | |||
73 | int dwc3_get_device_id(void) | ||
74 | { | ||
75 | int id; | ||
76 | |||
77 | again: | ||
78 | id = find_first_zero_bit(dwc3_devs, DWC3_DEVS_POSSIBLE); | ||
79 | if (id < DWC3_DEVS_POSSIBLE) { | ||
80 | int old; | ||
81 | |||
82 | old = test_and_set_bit(id, dwc3_devs); | ||
83 | if (old) | ||
84 | goto again; | ||
85 | } else { | ||
86 | pr_err("dwc3: no space for new device\n"); | ||
87 | id = -ENOMEM; | ||
88 | } | ||
89 | |||
90 | return id; | ||
91 | } | ||
92 | EXPORT_SYMBOL_GPL(dwc3_get_device_id); | ||
93 | |||
94 | void dwc3_put_device_id(int id) | ||
95 | { | ||
96 | int ret; | ||
97 | |||
98 | if (id < 0) | ||
99 | return; | ||
100 | |||
101 | ret = test_bit(id, dwc3_devs); | ||
102 | WARN(!ret, "dwc3: ID %d not in use\n", id); | ||
103 | smp_mb__before_clear_bit(); | ||
104 | clear_bit(id, dwc3_devs); | ||
105 | } | ||
106 | EXPORT_SYMBOL_GPL(dwc3_put_device_id); | ||
107 | |||
108 | void dwc3_set_mode(struct dwc3 *dwc, u32 mode) | 69 | void dwc3_set_mode(struct dwc3 *dwc, u32 mode) |
109 | { | 70 | { |
110 | u32 reg; | 71 | u32 reg; |
@@ -169,7 +130,6 @@ static void dwc3_free_one_event_buffer(struct dwc3 *dwc, | |||
169 | struct dwc3_event_buffer *evt) | 130 | struct dwc3_event_buffer *evt) |
170 | { | 131 | { |
171 | dma_free_coherent(dwc->dev, evt->length, evt->buf, evt->dma); | 132 | dma_free_coherent(dwc->dev, evt->length, evt->buf, evt->dma); |
172 | kfree(evt); | ||
173 | } | 133 | } |
174 | 134 | ||
175 | /** | 135 | /** |
@@ -180,12 +140,11 @@ static void dwc3_free_one_event_buffer(struct dwc3 *dwc, | |||
180 | * Returns a pointer to the allocated event buffer structure on success | 140 | * Returns a pointer to the allocated event buffer structure on success |
181 | * otherwise ERR_PTR(errno). | 141 | * otherwise ERR_PTR(errno). |
182 | */ | 142 | */ |
183 | static struct dwc3_event_buffer *__devinit | 143 | static struct dwc3_event_buffer *dwc3_alloc_one_event_buffer(struct dwc3 *dwc, unsigned length) |
184 | dwc3_alloc_one_event_buffer(struct dwc3 *dwc, unsigned length) | ||
185 | { | 144 | { |
186 | struct dwc3_event_buffer *evt; | 145 | struct dwc3_event_buffer *evt; |
187 | 146 | ||
188 | evt = kzalloc(sizeof(*evt), GFP_KERNEL); | 147 | evt = devm_kzalloc(dwc->dev, sizeof(*evt), GFP_KERNEL); |
189 | if (!evt) | 148 | if (!evt) |
190 | return ERR_PTR(-ENOMEM); | 149 | return ERR_PTR(-ENOMEM); |
191 | 150 | ||
@@ -193,10 +152,8 @@ dwc3_alloc_one_event_buffer(struct dwc3 *dwc, unsigned length) | |||
193 | evt->length = length; | 152 | evt->length = length; |
194 | evt->buf = dma_alloc_coherent(dwc->dev, length, | 153 | evt->buf = dma_alloc_coherent(dwc->dev, length, |
195 | &evt->dma, GFP_KERNEL); | 154 | &evt->dma, GFP_KERNEL); |
196 | if (!evt->buf) { | 155 | if (!evt->buf) |
197 | kfree(evt); | ||
198 | return ERR_PTR(-ENOMEM); | 156 | return ERR_PTR(-ENOMEM); |
199 | } | ||
200 | 157 | ||
201 | return evt; | 158 | return evt; |
202 | } | 159 | } |
@@ -215,8 +172,6 @@ static void dwc3_free_event_buffers(struct dwc3 *dwc) | |||
215 | if (evt) | 172 | if (evt) |
216 | dwc3_free_one_event_buffer(dwc, evt); | 173 | dwc3_free_one_event_buffer(dwc, evt); |
217 | } | 174 | } |
218 | |||
219 | kfree(dwc->ev_buffs); | ||
220 | } | 175 | } |
221 | 176 | ||
222 | /** | 177 | /** |
@@ -227,7 +182,7 @@ static void dwc3_free_event_buffers(struct dwc3 *dwc) | |||
227 | * Returns 0 on success otherwise negative errno. In the error case, dwc | 182 | * Returns 0 on success otherwise negative errno. In the error case, dwc |
228 | * may contain some buffers allocated but not all which were requested. | 183 | * may contain some buffers allocated but not all which were requested. |
229 | */ | 184 | */ |
230 | static int __devinit dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length) | 185 | static int dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length) |
231 | { | 186 | { |
232 | int num; | 187 | int num; |
233 | int i; | 188 | int i; |
@@ -235,7 +190,8 @@ static int __devinit dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length) | |||
235 | num = DWC3_NUM_INT(dwc->hwparams.hwparams1); | 190 | num = DWC3_NUM_INT(dwc->hwparams.hwparams1); |
236 | dwc->num_event_buffers = num; | 191 | dwc->num_event_buffers = num; |
237 | 192 | ||
238 | dwc->ev_buffs = kzalloc(sizeof(*dwc->ev_buffs) * num, GFP_KERNEL); | 193 | dwc->ev_buffs = devm_kzalloc(dwc->dev, sizeof(*dwc->ev_buffs) * num, |
194 | GFP_KERNEL); | ||
239 | if (!dwc->ev_buffs) { | 195 | if (!dwc->ev_buffs) { |
240 | dev_err(dwc->dev, "can't allocate event buffers array\n"); | 196 | dev_err(dwc->dev, "can't allocate event buffers array\n"); |
241 | return -ENOMEM; | 197 | return -ENOMEM; |
@@ -303,7 +259,7 @@ static void dwc3_event_buffers_cleanup(struct dwc3 *dwc) | |||
303 | } | 259 | } |
304 | } | 260 | } |
305 | 261 | ||
306 | static void __devinit dwc3_cache_hwparams(struct dwc3 *dwc) | 262 | static void dwc3_cache_hwparams(struct dwc3 *dwc) |
307 | { | 263 | { |
308 | struct dwc3_hwparams *parms = &dwc->hwparams; | 264 | struct dwc3_hwparams *parms = &dwc->hwparams; |
309 | 265 | ||
@@ -324,7 +280,7 @@ static void __devinit dwc3_cache_hwparams(struct dwc3 *dwc) | |||
324 | * | 280 | * |
325 | * Returns 0 on success otherwise negative errno. | 281 | * Returns 0 on success otherwise negative errno. |
326 | */ | 282 | */ |
327 | static int __devinit dwc3_core_init(struct dwc3 *dwc) | 283 | static int dwc3_core_init(struct dwc3 *dwc) |
328 | { | 284 | { |
329 | unsigned long timeout; | 285 | unsigned long timeout; |
330 | u32 reg; | 286 | u32 reg; |
@@ -358,8 +314,6 @@ static int __devinit dwc3_core_init(struct dwc3 *dwc) | |||
358 | 314 | ||
359 | dwc3_core_soft_reset(dwc); | 315 | dwc3_core_soft_reset(dwc); |
360 | 316 | ||
361 | dwc3_cache_hwparams(dwc); | ||
362 | |||
363 | reg = dwc3_readl(dwc->regs, DWC3_GCTL); | 317 | reg = dwc3_readl(dwc->regs, DWC3_GCTL); |
364 | reg &= ~DWC3_GCTL_SCALEDOWN_MASK; | 318 | reg &= ~DWC3_GCTL_SCALEDOWN_MASK; |
365 | reg &= ~DWC3_GCTL_DISSCRAMBLE; | 319 | reg &= ~DWC3_GCTL_DISSCRAMBLE; |
@@ -383,24 +337,14 @@ static int __devinit dwc3_core_init(struct dwc3 *dwc) | |||
383 | 337 | ||
384 | dwc3_writel(dwc->regs, DWC3_GCTL, reg); | 338 | dwc3_writel(dwc->regs, DWC3_GCTL, reg); |
385 | 339 | ||
386 | ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE); | ||
387 | if (ret) { | ||
388 | dev_err(dwc->dev, "failed to allocate event buffers\n"); | ||
389 | ret = -ENOMEM; | ||
390 | goto err1; | ||
391 | } | ||
392 | |||
393 | ret = dwc3_event_buffers_setup(dwc); | 340 | ret = dwc3_event_buffers_setup(dwc); |
394 | if (ret) { | 341 | if (ret) { |
395 | dev_err(dwc->dev, "failed to setup event buffers\n"); | 342 | dev_err(dwc->dev, "failed to setup event buffers\n"); |
396 | goto err1; | 343 | goto err0; |
397 | } | 344 | } |
398 | 345 | ||
399 | return 0; | 346 | return 0; |
400 | 347 | ||
401 | err1: | ||
402 | dwc3_free_event_buffers(dwc); | ||
403 | |||
404 | err0: | 348 | err0: |
405 | return ret; | 349 | return ret; |
406 | } | 350 | } |
@@ -408,16 +352,14 @@ err0: | |||
408 | static void dwc3_core_exit(struct dwc3 *dwc) | 352 | static void dwc3_core_exit(struct dwc3 *dwc) |
409 | { | 353 | { |
410 | dwc3_event_buffers_cleanup(dwc); | 354 | dwc3_event_buffers_cleanup(dwc); |
411 | dwc3_free_event_buffers(dwc); | ||
412 | 355 | ||
413 | usb_phy_shutdown(dwc->usb2_phy); | 356 | usb_phy_shutdown(dwc->usb2_phy); |
414 | usb_phy_shutdown(dwc->usb3_phy); | 357 | usb_phy_shutdown(dwc->usb3_phy); |
415 | |||
416 | } | 358 | } |
417 | 359 | ||
418 | #define DWC3_ALIGN_MASK (16 - 1) | 360 | #define DWC3_ALIGN_MASK (16 - 1) |
419 | 361 | ||
420 | static int __devinit dwc3_probe(struct platform_device *pdev) | 362 | static int dwc3_probe(struct platform_device *pdev) |
421 | { | 363 | { |
422 | struct device_node *node = pdev->dev.of_node; | 364 | struct device_node *node = pdev->dev.of_node; |
423 | struct resource *res; | 365 | struct resource *res; |
@@ -515,10 +457,19 @@ static int __devinit dwc3_probe(struct platform_device *pdev) | |||
515 | pm_runtime_get_sync(dev); | 457 | pm_runtime_get_sync(dev); |
516 | pm_runtime_forbid(dev); | 458 | pm_runtime_forbid(dev); |
517 | 459 | ||
460 | dwc3_cache_hwparams(dwc); | ||
461 | |||
462 | ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE); | ||
463 | if (ret) { | ||
464 | dev_err(dwc->dev, "failed to allocate event buffers\n"); | ||
465 | ret = -ENOMEM; | ||
466 | goto err0; | ||
467 | } | ||
468 | |||
518 | ret = dwc3_core_init(dwc); | 469 | ret = dwc3_core_init(dwc); |
519 | if (ret) { | 470 | if (ret) { |
520 | dev_err(dev, "failed to initialize core\n"); | 471 | dev_err(dev, "failed to initialize core\n"); |
521 | return ret; | 472 | goto err0; |
522 | } | 473 | } |
523 | 474 | ||
524 | mode = DWC3_MODE(dwc->hwparams.hwparams0); | 475 | mode = DWC3_MODE(dwc->hwparams.hwparams0); |
@@ -590,10 +541,13 @@ err2: | |||
590 | err1: | 541 | err1: |
591 | dwc3_core_exit(dwc); | 542 | dwc3_core_exit(dwc); |
592 | 543 | ||
544 | err0: | ||
545 | dwc3_free_event_buffers(dwc); | ||
546 | |||
593 | return ret; | 547 | return ret; |
594 | } | 548 | } |
595 | 549 | ||
596 | static int __devexit dwc3_remove(struct platform_device *pdev) | 550 | static int dwc3_remove(struct platform_device *pdev) |
597 | { | 551 | { |
598 | struct dwc3 *dwc = platform_get_drvdata(pdev); | 552 | struct dwc3 *dwc = platform_get_drvdata(pdev); |
599 | struct resource *res; | 553 | struct resource *res; |
@@ -628,7 +582,7 @@ static int __devexit dwc3_remove(struct platform_device *pdev) | |||
628 | 582 | ||
629 | static struct platform_driver dwc3_driver = { | 583 | static struct platform_driver dwc3_driver = { |
630 | .probe = dwc3_probe, | 584 | .probe = dwc3_probe, |
631 | .remove = __devexit_p(dwc3_remove), | 585 | .remove = dwc3_remove, |
632 | .driver = { | 586 | .driver = { |
633 | .name = "dwc3", | 587 | .name = "dwc3", |
634 | }, | 588 | }, |
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 243affc93431..499956344262 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h | |||
@@ -868,7 +868,4 @@ void dwc3_host_exit(struct dwc3 *dwc); | |||
868 | int dwc3_gadget_init(struct dwc3 *dwc); | 868 | int dwc3_gadget_init(struct dwc3 *dwc); |
869 | void dwc3_gadget_exit(struct dwc3 *dwc); | 869 | void dwc3_gadget_exit(struct dwc3 *dwc); |
870 | 870 | ||
871 | extern int dwc3_get_device_id(void); | ||
872 | extern void dwc3_put_device_id(int id); | ||
873 | |||
874 | #endif /* __DRIVERS_USB_DWC3_CORE_H */ | 871 | #endif /* __DRIVERS_USB_DWC3_CORE_H */ |
diff --git a/drivers/usb/dwc3/debugfs.c b/drivers/usb/dwc3/debugfs.c index d4a30f118724..92604b4f9712 100644 --- a/drivers/usb/dwc3/debugfs.c +++ b/drivers/usb/dwc3/debugfs.c | |||
@@ -652,7 +652,7 @@ static const struct file_operations dwc3_link_state_fops = { | |||
652 | .release = single_release, | 652 | .release = single_release, |
653 | }; | 653 | }; |
654 | 654 | ||
655 | int __devinit dwc3_debugfs_init(struct dwc3 *dwc) | 655 | int dwc3_debugfs_init(struct dwc3 *dwc) |
656 | { | 656 | { |
657 | struct dentry *root; | 657 | struct dentry *root; |
658 | struct dentry *file; | 658 | struct dentry *file; |
@@ -703,7 +703,7 @@ err0: | |||
703 | return ret; | 703 | return ret; |
704 | } | 704 | } |
705 | 705 | ||
706 | void __devexit dwc3_debugfs_exit(struct dwc3 *dwc) | 706 | void dwc3_debugfs_exit(struct dwc3 *dwc) |
707 | { | 707 | { |
708 | debugfs_remove_recursive(dwc->root); | 708 | debugfs_remove_recursive(dwc->root); |
709 | dwc->root = NULL; | 709 | dwc->root = NULL; |
diff --git a/drivers/usb/dwc3/dwc3-exynos.c b/drivers/usb/dwc3/dwc3-exynos.c index ca6597853f90..aae5328ac771 100644 --- a/drivers/usb/dwc3/dwc3-exynos.c +++ b/drivers/usb/dwc3/dwc3-exynos.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/clk.h> | 21 | #include <linux/clk.h> |
22 | #include <linux/usb/otg.h> | 22 | #include <linux/usb/otg.h> |
23 | #include <linux/usb/nop-usb-xceiv.h> | 23 | #include <linux/usb/nop-usb-xceiv.h> |
24 | #include <linux/of.h> | ||
24 | 25 | ||
25 | #include "core.h" | 26 | #include "core.h" |
26 | 27 | ||
@@ -33,7 +34,7 @@ struct dwc3_exynos { | |||
33 | struct clk *clk; | 34 | struct clk *clk; |
34 | }; | 35 | }; |
35 | 36 | ||
36 | static int __devinit dwc3_exynos_register_phys(struct dwc3_exynos *exynos) | 37 | static int dwc3_exynos_register_phys(struct dwc3_exynos *exynos) |
37 | { | 38 | { |
38 | struct nop_usb_xceiv_platform_data pdata; | 39 | struct nop_usb_xceiv_platform_data pdata; |
39 | struct platform_device *pdev; | 40 | struct platform_device *pdev; |
@@ -87,14 +88,14 @@ err1: | |||
87 | return ret; | 88 | return ret; |
88 | } | 89 | } |
89 | 90 | ||
90 | static int __devinit dwc3_exynos_probe(struct platform_device *pdev) | 91 | static u64 dwc3_exynos_dma_mask = DMA_BIT_MASK(32); |
92 | |||
93 | static int dwc3_exynos_probe(struct platform_device *pdev) | ||
91 | { | 94 | { |
92 | struct dwc3_exynos_data *pdata = pdev->dev.platform_data; | ||
93 | struct platform_device *dwc3; | 95 | struct platform_device *dwc3; |
94 | struct dwc3_exynos *exynos; | 96 | struct dwc3_exynos *exynos; |
95 | struct clk *clk; | 97 | struct clk *clk; |
96 | 98 | ||
97 | int devid; | ||
98 | int ret = -ENOMEM; | 99 | int ret = -ENOMEM; |
99 | 100 | ||
100 | exynos = kzalloc(sizeof(*exynos), GFP_KERNEL); | 101 | exynos = kzalloc(sizeof(*exynos), GFP_KERNEL); |
@@ -103,11 +104,15 @@ static int __devinit dwc3_exynos_probe(struct platform_device *pdev) | |||
103 | goto err0; | 104 | goto err0; |
104 | } | 105 | } |
105 | 106 | ||
106 | platform_set_drvdata(pdev, exynos); | 107 | /* |
108 | * Right now device-tree probed devices don't get dma_mask set. | ||
109 | * Since shared usb code relies on it, set it here for now. | ||
110 | * Once we move to full device tree support this will vanish off. | ||
111 | */ | ||
112 | if (!pdev->dev.dma_mask) | ||
113 | pdev->dev.dma_mask = &dwc3_exynos_dma_mask; | ||
107 | 114 | ||
108 | devid = dwc3_get_device_id(); | 115 | platform_set_drvdata(pdev, exynos); |
109 | if (devid < 0) | ||
110 | goto err1; | ||
111 | 116 | ||
112 | ret = dwc3_exynos_register_phys(exynos); | 117 | ret = dwc3_exynos_register_phys(exynos); |
113 | if (ret) { | 118 | if (ret) { |
@@ -115,10 +120,10 @@ static int __devinit dwc3_exynos_probe(struct platform_device *pdev) | |||
115 | goto err1; | 120 | goto err1; |
116 | } | 121 | } |
117 | 122 | ||
118 | dwc3 = platform_device_alloc("dwc3", devid); | 123 | dwc3 = platform_device_alloc("dwc3", PLATFORM_DEVID_AUTO); |
119 | if (!dwc3) { | 124 | if (!dwc3) { |
120 | dev_err(&pdev->dev, "couldn't allocate dwc3 device\n"); | 125 | dev_err(&pdev->dev, "couldn't allocate dwc3 device\n"); |
121 | goto err2; | 126 | goto err1; |
122 | } | 127 | } |
123 | 128 | ||
124 | clk = clk_get(&pdev->dev, "usbdrd30"); | 129 | clk = clk_get(&pdev->dev, "usbdrd30"); |
@@ -139,14 +144,6 @@ static int __devinit dwc3_exynos_probe(struct platform_device *pdev) | |||
139 | 144 | ||
140 | clk_enable(exynos->clk); | 145 | clk_enable(exynos->clk); |
141 | 146 | ||
142 | /* PHY initialization */ | ||
143 | if (!pdata) { | ||
144 | dev_dbg(&pdev->dev, "missing platform data\n"); | ||
145 | } else { | ||
146 | if (pdata->phy_init) | ||
147 | pdata->phy_init(pdev, pdata->phy_type); | ||
148 | } | ||
149 | |||
150 | ret = platform_device_add_resources(dwc3, pdev->resource, | 147 | ret = platform_device_add_resources(dwc3, pdev->resource, |
151 | pdev->num_resources); | 148 | pdev->num_resources); |
152 | if (ret) { | 149 | if (ret) { |
@@ -163,35 +160,24 @@ static int __devinit dwc3_exynos_probe(struct platform_device *pdev) | |||
163 | return 0; | 160 | return 0; |
164 | 161 | ||
165 | err4: | 162 | err4: |
166 | if (pdata && pdata->phy_exit) | ||
167 | pdata->phy_exit(pdev, pdata->phy_type); | ||
168 | |||
169 | clk_disable(clk); | 163 | clk_disable(clk); |
170 | clk_put(clk); | 164 | clk_put(clk); |
171 | err3: | 165 | err3: |
172 | platform_device_put(dwc3); | 166 | platform_device_put(dwc3); |
173 | err2: | ||
174 | dwc3_put_device_id(devid); | ||
175 | err1: | 167 | err1: |
176 | kfree(exynos); | 168 | kfree(exynos); |
177 | err0: | 169 | err0: |
178 | return ret; | 170 | return ret; |
179 | } | 171 | } |
180 | 172 | ||
181 | static int __devexit dwc3_exynos_remove(struct platform_device *pdev) | 173 | static int dwc3_exynos_remove(struct platform_device *pdev) |
182 | { | 174 | { |
183 | struct dwc3_exynos *exynos = platform_get_drvdata(pdev); | 175 | struct dwc3_exynos *exynos = platform_get_drvdata(pdev); |
184 | struct dwc3_exynos_data *pdata = pdev->dev.platform_data; | ||
185 | 176 | ||
186 | platform_device_unregister(exynos->dwc3); | 177 | platform_device_unregister(exynos->dwc3); |
187 | platform_device_unregister(exynos->usb2_phy); | 178 | platform_device_unregister(exynos->usb2_phy); |
188 | platform_device_unregister(exynos->usb3_phy); | 179 | platform_device_unregister(exynos->usb3_phy); |
189 | 180 | ||
190 | dwc3_put_device_id(exynos->dwc3->id); | ||
191 | |||
192 | if (pdata && pdata->phy_exit) | ||
193 | pdata->phy_exit(pdev, pdata->phy_type); | ||
194 | |||
195 | clk_disable(exynos->clk); | 181 | clk_disable(exynos->clk); |
196 | clk_put(exynos->clk); | 182 | clk_put(exynos->clk); |
197 | 183 | ||
@@ -200,11 +186,20 @@ static int __devexit dwc3_exynos_remove(struct platform_device *pdev) | |||
200 | return 0; | 186 | return 0; |
201 | } | 187 | } |
202 | 188 | ||
189 | #ifdef CONFIG_OF | ||
190 | static const struct of_device_id exynos_dwc3_match[] = { | ||
191 | { .compatible = "samsung,exynos-dwc3" }, | ||
192 | {}, | ||
193 | }; | ||
194 | MODULE_DEVICE_TABLE(of, exynos_dwc3_match); | ||
195 | #endif | ||
196 | |||
203 | static struct platform_driver dwc3_exynos_driver = { | 197 | static struct platform_driver dwc3_exynos_driver = { |
204 | .probe = dwc3_exynos_probe, | 198 | .probe = dwc3_exynos_probe, |
205 | .remove = __devexit_p(dwc3_exynos_remove), | 199 | .remove = dwc3_exynos_remove, |
206 | .driver = { | 200 | .driver = { |
207 | .name = "exynos-dwc3", | 201 | .name = "exynos-dwc3", |
202 | .of_match_table = of_match_ptr(exynos_dwc3_match), | ||
208 | }, | 203 | }, |
209 | }; | 204 | }; |
210 | 205 | ||
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c index ee57a10d90d0..f31867fd2574 100644 --- a/drivers/usb/dwc3/dwc3-omap.c +++ b/drivers/usb/dwc3/dwc3-omap.c | |||
@@ -157,7 +157,7 @@ static inline void dwc3_omap_writel(void __iomem *base, u32 offset, u32 value) | |||
157 | writel(value, base + offset); | 157 | writel(value, base + offset); |
158 | } | 158 | } |
159 | 159 | ||
160 | static int __devinit dwc3_omap_register_phys(struct dwc3_omap *omap) | 160 | static int dwc3_omap_register_phys(struct dwc3_omap *omap) |
161 | { | 161 | { |
162 | struct nop_usb_xceiv_platform_data pdata; | 162 | struct nop_usb_xceiv_platform_data pdata; |
163 | struct platform_device *pdev; | 163 | struct platform_device *pdev; |
@@ -262,7 +262,7 @@ static irqreturn_t dwc3_omap_interrupt(int irq, void *_omap) | |||
262 | return IRQ_HANDLED; | 262 | return IRQ_HANDLED; |
263 | } | 263 | } |
264 | 264 | ||
265 | static int __devinit dwc3_omap_probe(struct platform_device *pdev) | 265 | static int dwc3_omap_probe(struct platform_device *pdev) |
266 | { | 266 | { |
267 | struct dwc3_omap_data *pdata = pdev->dev.platform_data; | 267 | struct dwc3_omap_data *pdata = pdev->dev.platform_data; |
268 | struct device_node *node = pdev->dev.of_node; | 268 | struct device_node *node = pdev->dev.of_node; |
@@ -272,7 +272,6 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev) | |||
272 | struct resource *res; | 272 | struct resource *res; |
273 | struct device *dev = &pdev->dev; | 273 | struct device *dev = &pdev->dev; |
274 | 274 | ||
275 | int devid; | ||
276 | int size; | 275 | int size; |
277 | int ret = -ENOMEM; | 276 | int ret = -ENOMEM; |
278 | int irq; | 277 | int irq; |
@@ -315,14 +314,10 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev) | |||
315 | return ret; | 314 | return ret; |
316 | } | 315 | } |
317 | 316 | ||
318 | devid = dwc3_get_device_id(); | 317 | dwc3 = platform_device_alloc("dwc3", PLATFORM_DEVID_AUTO); |
319 | if (devid < 0) | ||
320 | return -ENODEV; | ||
321 | |||
322 | dwc3 = platform_device_alloc("dwc3", devid); | ||
323 | if (!dwc3) { | 318 | if (!dwc3) { |
324 | dev_err(dev, "couldn't allocate dwc3 device\n"); | 319 | dev_err(dev, "couldn't allocate dwc3 device\n"); |
325 | goto err1; | 320 | return -ENOMEM; |
326 | } | 321 | } |
327 | 322 | ||
328 | context = devm_kzalloc(dev, resource_size(res), GFP_KERNEL); | 323 | context = devm_kzalloc(dev, resource_size(res), GFP_KERNEL); |
@@ -423,23 +418,16 @@ static int __devinit dwc3_omap_probe(struct platform_device *pdev) | |||
423 | 418 | ||
424 | err2: | 419 | err2: |
425 | platform_device_put(dwc3); | 420 | platform_device_put(dwc3); |
426 | |||
427 | err1: | ||
428 | dwc3_put_device_id(devid); | ||
429 | |||
430 | return ret; | 421 | return ret; |
431 | } | 422 | } |
432 | 423 | ||
433 | static int __devexit dwc3_omap_remove(struct platform_device *pdev) | 424 | static int dwc3_omap_remove(struct platform_device *pdev) |
434 | { | 425 | { |
435 | struct dwc3_omap *omap = platform_get_drvdata(pdev); | 426 | struct dwc3_omap *omap = platform_get_drvdata(pdev); |
436 | 427 | ||
437 | platform_device_unregister(omap->dwc3); | 428 | platform_device_unregister(omap->dwc3); |
438 | platform_device_unregister(omap->usb2_phy); | 429 | platform_device_unregister(omap->usb2_phy); |
439 | platform_device_unregister(omap->usb3_phy); | 430 | platform_device_unregister(omap->usb3_phy); |
440 | |||
441 | dwc3_put_device_id(omap->dwc3->id); | ||
442 | |||
443 | return 0; | 431 | return 0; |
444 | } | 432 | } |
445 | 433 | ||
@@ -453,7 +441,7 @@ MODULE_DEVICE_TABLE(of, of_dwc3_matach); | |||
453 | 441 | ||
454 | static struct platform_driver dwc3_omap_driver = { | 442 | static struct platform_driver dwc3_omap_driver = { |
455 | .probe = dwc3_omap_probe, | 443 | .probe = dwc3_omap_probe, |
456 | .remove = __devexit_p(dwc3_omap_remove), | 444 | .remove = dwc3_omap_remove, |
457 | .driver = { | 445 | .driver = { |
458 | .name = "omap-dwc3", | 446 | .name = "omap-dwc3", |
459 | .of_match_table = of_dwc3_matach, | 447 | .of_match_table = of_dwc3_matach, |
diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c index 94f550e37f98..7d70f44567d2 100644 --- a/drivers/usb/dwc3/dwc3-pci.c +++ b/drivers/usb/dwc3/dwc3-pci.c | |||
@@ -58,7 +58,7 @@ struct dwc3_pci { | |||
58 | struct platform_device *usb3_phy; | 58 | struct platform_device *usb3_phy; |
59 | }; | 59 | }; |
60 | 60 | ||
61 | static int __devinit dwc3_pci_register_phys(struct dwc3_pci *glue) | 61 | static int dwc3_pci_register_phys(struct dwc3_pci *glue) |
62 | { | 62 | { |
63 | struct nop_usb_xceiv_platform_data pdata; | 63 | struct nop_usb_xceiv_platform_data pdata; |
64 | struct platform_device *pdev; | 64 | struct platform_device *pdev; |
@@ -112,14 +112,13 @@ err1: | |||
112 | return ret; | 112 | return ret; |
113 | } | 113 | } |
114 | 114 | ||
115 | static int __devinit dwc3_pci_probe(struct pci_dev *pci, | 115 | static int dwc3_pci_probe(struct pci_dev *pci, |
116 | const struct pci_device_id *id) | 116 | const struct pci_device_id *id) |
117 | { | 117 | { |
118 | struct resource res[2]; | 118 | struct resource res[2]; |
119 | struct platform_device *dwc3; | 119 | struct platform_device *dwc3; |
120 | struct dwc3_pci *glue; | 120 | struct dwc3_pci *glue; |
121 | int ret = -ENOMEM; | 121 | int ret = -ENOMEM; |
122 | int devid; | ||
123 | struct device *dev = &pci->dev; | 122 | struct device *dev = &pci->dev; |
124 | 123 | ||
125 | glue = devm_kzalloc(dev, sizeof(*glue), GFP_KERNEL); | 124 | glue = devm_kzalloc(dev, sizeof(*glue), GFP_KERNEL); |
@@ -145,13 +144,7 @@ static int __devinit dwc3_pci_probe(struct pci_dev *pci, | |||
145 | return ret; | 144 | return ret; |
146 | } | 145 | } |
147 | 146 | ||
148 | devid = dwc3_get_device_id(); | 147 | dwc3 = platform_device_alloc("dwc3", PLATFORM_DEVID_AUTO); |
149 | if (devid < 0) { | ||
150 | ret = -ENOMEM; | ||
151 | goto err1; | ||
152 | } | ||
153 | |||
154 | dwc3 = platform_device_alloc("dwc3", devid); | ||
155 | if (!dwc3) { | 148 | if (!dwc3) { |
156 | dev_err(dev, "couldn't allocate dwc3 device\n"); | 149 | dev_err(dev, "couldn't allocate dwc3 device\n"); |
157 | ret = -ENOMEM; | 150 | ret = -ENOMEM; |
@@ -172,7 +165,7 @@ static int __devinit dwc3_pci_probe(struct pci_dev *pci, | |||
172 | ret = platform_device_add_resources(dwc3, res, ARRAY_SIZE(res)); | 165 | ret = platform_device_add_resources(dwc3, res, ARRAY_SIZE(res)); |
173 | if (ret) { | 166 | if (ret) { |
174 | dev_err(dev, "couldn't add resources to dwc3 device\n"); | 167 | dev_err(dev, "couldn't add resources to dwc3 device\n"); |
175 | goto err2; | 168 | goto err1; |
176 | } | 169 | } |
177 | 170 | ||
178 | pci_set_drvdata(pci, glue); | 171 | pci_set_drvdata(pci, glue); |
@@ -195,23 +188,18 @@ static int __devinit dwc3_pci_probe(struct pci_dev *pci, | |||
195 | err3: | 188 | err3: |
196 | pci_set_drvdata(pci, NULL); | 189 | pci_set_drvdata(pci, NULL); |
197 | platform_device_put(dwc3); | 190 | platform_device_put(dwc3); |
198 | |||
199 | err2: | ||
200 | dwc3_put_device_id(devid); | ||
201 | |||
202 | err1: | 191 | err1: |
203 | pci_disable_device(pci); | 192 | pci_disable_device(pci); |
204 | 193 | ||
205 | return ret; | 194 | return ret; |
206 | } | 195 | } |
207 | 196 | ||
208 | static void __devexit dwc3_pci_remove(struct pci_dev *pci) | 197 | static void dwc3_pci_remove(struct pci_dev *pci) |
209 | { | 198 | { |
210 | struct dwc3_pci *glue = pci_get_drvdata(pci); | 199 | struct dwc3_pci *glue = pci_get_drvdata(pci); |
211 | 200 | ||
212 | platform_device_unregister(glue->usb2_phy); | 201 | platform_device_unregister(glue->usb2_phy); |
213 | platform_device_unregister(glue->usb3_phy); | 202 | platform_device_unregister(glue->usb3_phy); |
214 | dwc3_put_device_id(glue->dwc3->id); | ||
215 | platform_device_unregister(glue->dwc3); | 203 | platform_device_unregister(glue->dwc3); |
216 | pci_set_drvdata(pci, NULL); | 204 | pci_set_drvdata(pci, NULL); |
217 | pci_disable_device(pci); | 205 | pci_disable_device(pci); |
@@ -230,7 +218,7 @@ static struct pci_driver dwc3_pci_driver = { | |||
230 | .name = "dwc3-pci", | 218 | .name = "dwc3-pci", |
231 | .id_table = dwc3_pci_id_table, | 219 | .id_table = dwc3_pci_id_table, |
232 | .probe = dwc3_pci_probe, | 220 | .probe = dwc3_pci_probe, |
233 | .remove = __devexit_p(dwc3_pci_remove), | 221 | .remove = dwc3_pci_remove, |
234 | }; | 222 | }; |
235 | 223 | ||
236 | MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>"); | 224 | MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>"); |
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 7b7deddf6a52..2e43b332aae8 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -1579,7 +1579,7 @@ static const struct usb_gadget_ops dwc3_gadget_ops = { | |||
1579 | 1579 | ||
1580 | /* -------------------------------------------------------------------------- */ | 1580 | /* -------------------------------------------------------------------------- */ |
1581 | 1581 | ||
1582 | static int __devinit dwc3_gadget_init_endpoints(struct dwc3 *dwc) | 1582 | static int dwc3_gadget_init_endpoints(struct dwc3 *dwc) |
1583 | { | 1583 | { |
1584 | struct dwc3_ep *dep; | 1584 | struct dwc3_ep *dep; |
1585 | u8 epnum; | 1585 | u8 epnum; |
@@ -2374,7 +2374,7 @@ static irqreturn_t dwc3_interrupt(int irq, void *_dwc) | |||
2374 | * | 2374 | * |
2375 | * Returns 0 on success otherwise negative errno. | 2375 | * Returns 0 on success otherwise negative errno. |
2376 | */ | 2376 | */ |
2377 | int __devinit dwc3_gadget_init(struct dwc3 *dwc) | 2377 | int dwc3_gadget_init(struct dwc3 *dwc) |
2378 | { | 2378 | { |
2379 | u32 reg; | 2379 | u32 reg; |
2380 | int ret; | 2380 | int ret; |
diff --git a/drivers/usb/early/ehci-dbgp.c b/drivers/usb/early/ehci-dbgp.c index 4bfa78af379c..5e29ddeb4d33 100644 --- a/drivers/usb/early/ehci-dbgp.c +++ b/drivers/usb/early/ehci-dbgp.c | |||
@@ -974,7 +974,7 @@ struct console early_dbgp_console = { | |||
974 | .index = -1, | 974 | .index = -1, |
975 | }; | 975 | }; |
976 | 976 | ||
977 | #if IS_ENABLED(CONFIG_USB_EHCI_HCD) | 977 | #if IS_ENABLED(CONFIG_USB) |
978 | int dbgp_reset_prep(struct usb_hcd *hcd) | 978 | int dbgp_reset_prep(struct usb_hcd *hcd) |
979 | { | 979 | { |
980 | int ret = xen_dbgp_reset_prep(hcd); | 980 | int ret = xen_dbgp_reset_prep(hcd); |
@@ -1008,7 +1008,7 @@ int dbgp_external_startup(struct usb_hcd *hcd) | |||
1008 | return xen_dbgp_external_startup(hcd) ?: _dbgp_external_startup(); | 1008 | return xen_dbgp_external_startup(hcd) ?: _dbgp_external_startup(); |
1009 | } | 1009 | } |
1010 | EXPORT_SYMBOL_GPL(dbgp_external_startup); | 1010 | EXPORT_SYMBOL_GPL(dbgp_external_startup); |
1011 | #endif /* USB_EHCI_HCD */ | 1011 | #endif /* USB */ |
1012 | 1012 | ||
1013 | #ifdef CONFIG_KGDB | 1013 | #ifdef CONFIG_KGDB |
1014 | 1014 | ||
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index e0ff51b89529..14625fd2cecd 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
@@ -721,31 +721,6 @@ config USB_FUNCTIONFS_GENERIC | |||
721 | Include a configuration with the Function Filesystem alone with | 721 | Include a configuration with the Function Filesystem alone with |
722 | no Ethernet interface. | 722 | no Ethernet interface. |
723 | 723 | ||
724 | config USB_FILE_STORAGE | ||
725 | tristate "File-backed Storage Gadget (DEPRECATED)" | ||
726 | depends on BLOCK | ||
727 | help | ||
728 | The File-backed Storage Gadget acts as a USB Mass Storage | ||
729 | disk drive. As its storage repository it can use a regular | ||
730 | file or a block device (in much the same way as the "loop" | ||
731 | device driver), specified as a module parameter. | ||
732 | |||
733 | Say "y" to link the driver statically, or "m" to build a | ||
734 | dynamically linked module called "g_file_storage". | ||
735 | |||
736 | NOTE: This driver is deprecated. Its replacement is the | ||
737 | Mass Storage Gadget. | ||
738 | |||
739 | config USB_FILE_STORAGE_TEST | ||
740 | bool "File-backed Storage Gadget testing version" | ||
741 | depends on USB_FILE_STORAGE | ||
742 | default n | ||
743 | help | ||
744 | Say "y" to generate the larger testing version of the | ||
745 | File-backed Storage Gadget, useful for probing the | ||
746 | behavior of USB Mass Storage hosts. Not needed for | ||
747 | normal operation. | ||
748 | |||
749 | config USB_MASS_STORAGE | 724 | config USB_MASS_STORAGE |
750 | tristate "Mass Storage Gadget" | 725 | tristate "Mass Storage Gadget" |
751 | depends on BLOCK | 726 | depends on BLOCK |
@@ -756,8 +731,8 @@ config USB_MASS_STORAGE | |||
756 | device (in much the same way as the "loop" device driver), | 731 | device (in much the same way as the "loop" device driver), |
757 | specified as a module parameter or sysfs option. | 732 | specified as a module parameter or sysfs option. |
758 | 733 | ||
759 | This driver is an updated replacement for the deprecated | 734 | This driver is a replacement for now removed File-backed |
760 | File-backed Storage Gadget (g_file_storage). | 735 | Storage Gadget (g_file_storage). |
761 | 736 | ||
762 | Say "y" to link the driver statically, or "m" to build | 737 | Say "y" to link the driver statically, or "m" to build |
763 | a dynamically linked module called "g_mass_storage". | 738 | a dynamically linked module called "g_mass_storage". |
diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile index 307be5fa824c..8b4acfd92aa3 100644 --- a/drivers/usb/gadget/Makefile +++ b/drivers/usb/gadget/Makefile | |||
@@ -44,7 +44,6 @@ g_ether-y := ether.o | |||
44 | g_serial-y := serial.o | 44 | g_serial-y := serial.o |
45 | g_midi-y := gmidi.o | 45 | g_midi-y := gmidi.o |
46 | gadgetfs-y := inode.o | 46 | gadgetfs-y := inode.o |
47 | g_file_storage-y := file_storage.o | ||
48 | g_mass_storage-y := mass_storage.o | 47 | g_mass_storage-y := mass_storage.o |
49 | g_printer-y := printer.o | 48 | g_printer-y := printer.o |
50 | g_cdc-y := cdc2.o | 49 | g_cdc-y := cdc2.o |
@@ -62,7 +61,6 @@ obj-$(CONFIG_USB_AUDIO) += g_audio.o | |||
62 | obj-$(CONFIG_USB_ETH) += g_ether.o | 61 | obj-$(CONFIG_USB_ETH) += g_ether.o |
63 | obj-$(CONFIG_USB_GADGETFS) += gadgetfs.o | 62 | obj-$(CONFIG_USB_GADGETFS) += gadgetfs.o |
64 | obj-$(CONFIG_USB_FUNCTIONFS) += g_ffs.o | 63 | obj-$(CONFIG_USB_FUNCTIONFS) += g_ffs.o |
65 | obj-$(CONFIG_USB_FILE_STORAGE) += g_file_storage.o | ||
66 | obj-$(CONFIG_USB_MASS_STORAGE) += g_mass_storage.o | 64 | obj-$(CONFIG_USB_MASS_STORAGE) += g_mass_storage.o |
67 | obj-$(CONFIG_USB_G_SERIAL) += g_serial.o | 65 | obj-$(CONFIG_USB_G_SERIAL) += g_serial.o |
68 | obj-$(CONFIG_USB_G_PRINTER) += g_printer.o | 66 | obj-$(CONFIG_USB_G_PRINTER) += g_printer.o |
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 89d90b5fb787..e6135faabc3a 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c | |||
@@ -1673,7 +1673,7 @@ static void at91udc_shutdown(struct platform_device *dev) | |||
1673 | spin_unlock_irqrestore(&udc->lock, flags); | 1673 | spin_unlock_irqrestore(&udc->lock, flags); |
1674 | } | 1674 | } |
1675 | 1675 | ||
1676 | static void __devinit at91udc_of_init(struct at91_udc *udc, | 1676 | static void at91udc_of_init(struct at91_udc *udc, |
1677 | struct device_node *np) | 1677 | struct device_node *np) |
1678 | { | 1678 | { |
1679 | struct at91_udc_data *board = &udc->board; | 1679 | struct at91_udc_data *board = &udc->board; |
@@ -1693,7 +1693,7 @@ static void __devinit at91udc_of_init(struct at91_udc *udc, | |||
1693 | board->pullup_active_low = (flags & OF_GPIO_ACTIVE_LOW) ? 1 : 0; | 1693 | board->pullup_active_low = (flags & OF_GPIO_ACTIVE_LOW) ? 1 : 0; |
1694 | } | 1694 | } |
1695 | 1695 | ||
1696 | static int __devinit at91udc_probe(struct platform_device *pdev) | 1696 | static int at91udc_probe(struct platform_device *pdev) |
1697 | { | 1697 | { |
1698 | struct device *dev = &pdev->dev; | 1698 | struct device *dev = &pdev->dev; |
1699 | struct at91_udc *udc; | 1699 | struct at91_udc *udc; |
diff --git a/drivers/usb/gadget/bcm63xx_udc.c b/drivers/usb/gadget/bcm63xx_udc.c index 9ca792224cd4..47a49931361e 100644 --- a/drivers/usb/gadget/bcm63xx_udc.c +++ b/drivers/usb/gadget/bcm63xx_udc.c | |||
@@ -2323,7 +2323,7 @@ static void bcm63xx_udc_gadget_release(struct device *dev) | |||
2323 | * Note that platform data is required, because pd.port_no varies from chip | 2323 | * Note that platform data is required, because pd.port_no varies from chip |
2324 | * to chip and is used to switch the correct USB port to device mode. | 2324 | * to chip and is used to switch the correct USB port to device mode. |
2325 | */ | 2325 | */ |
2326 | static int __devinit bcm63xx_udc_probe(struct platform_device *pdev) | 2326 | static int bcm63xx_udc_probe(struct platform_device *pdev) |
2327 | { | 2327 | { |
2328 | struct device *dev = &pdev->dev; | 2328 | struct device *dev = &pdev->dev; |
2329 | struct bcm63xx_usbd_platform_data *pd = dev->platform_data; | 2329 | struct bcm63xx_usbd_platform_data *pd = dev->platform_data; |
@@ -2433,7 +2433,7 @@ out_uninit: | |||
2433 | * bcm63xx_udc_remove - Remove the device from the system. | 2433 | * bcm63xx_udc_remove - Remove the device from the system. |
2434 | * @pdev: Platform device struct from the bcm63xx BSP code. | 2434 | * @pdev: Platform device struct from the bcm63xx BSP code. |
2435 | */ | 2435 | */ |
2436 | static int __devexit bcm63xx_udc_remove(struct platform_device *pdev) | 2436 | static int bcm63xx_udc_remove(struct platform_device *pdev) |
2437 | { | 2437 | { |
2438 | struct bcm63xx_udc *udc = platform_get_drvdata(pdev); | 2438 | struct bcm63xx_udc *udc = platform_get_drvdata(pdev); |
2439 | 2439 | ||
@@ -2450,7 +2450,7 @@ static int __devexit bcm63xx_udc_remove(struct platform_device *pdev) | |||
2450 | 2450 | ||
2451 | static struct platform_driver bcm63xx_udc_driver = { | 2451 | static struct platform_driver bcm63xx_udc_driver = { |
2452 | .probe = bcm63xx_udc_probe, | 2452 | .probe = bcm63xx_udc_probe, |
2453 | .remove = __devexit_p(bcm63xx_udc_remove), | 2453 | .remove = bcm63xx_udc_remove, |
2454 | .driver = { | 2454 | .driver = { |
2455 | .name = DRV_MODULE_NAME, | 2455 | .name = DRV_MODULE_NAME, |
2456 | .owner = THIS_MODULE, | 2456 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 957f973dd96a..2a6bfe759c29 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c | |||
@@ -107,7 +107,7 @@ int config_ep_by_speed(struct usb_gadget *g, | |||
107 | } | 107 | } |
108 | /* else: fall through */ | 108 | /* else: fall through */ |
109 | default: | 109 | default: |
110 | speed_desc = f->descriptors; | 110 | speed_desc = f->fs_descriptors; |
111 | } | 111 | } |
112 | /* find descriptors */ | 112 | /* find descriptors */ |
113 | for_each_ep_desc(speed_desc, d_spd) { | 113 | for_each_ep_desc(speed_desc, d_spd) { |
@@ -200,7 +200,7 @@ int usb_add_function(struct usb_configuration *config, | |||
200 | * as full speed ... it's the function drivers that will need | 200 | * as full speed ... it's the function drivers that will need |
201 | * to avoid bulk and ISO transfers. | 201 | * to avoid bulk and ISO transfers. |
202 | */ | 202 | */ |
203 | if (!config->fullspeed && function->descriptors) | 203 | if (!config->fullspeed && function->fs_descriptors) |
204 | config->fullspeed = true; | 204 | config->fullspeed = true; |
205 | if (!config->highspeed && function->hs_descriptors) | 205 | if (!config->highspeed && function->hs_descriptors) |
206 | config->highspeed = true; | 206 | config->highspeed = true; |
@@ -363,7 +363,7 @@ static int config_buf(struct usb_configuration *config, | |||
363 | descriptors = f->hs_descriptors; | 363 | descriptors = f->hs_descriptors; |
364 | break; | 364 | break; |
365 | default: | 365 | default: |
366 | descriptors = f->descriptors; | 366 | descriptors = f->fs_descriptors; |
367 | } | 367 | } |
368 | 368 | ||
369 | if (!descriptors) | 369 | if (!descriptors) |
@@ -620,7 +620,7 @@ static int set_config(struct usb_composite_dev *cdev, | |||
620 | descriptors = f->hs_descriptors; | 620 | descriptors = f->hs_descriptors; |
621 | break; | 621 | break; |
622 | default: | 622 | default: |
623 | descriptors = f->descriptors; | 623 | descriptors = f->fs_descriptors; |
624 | } | 624 | } |
625 | 625 | ||
626 | for (; *descriptors; ++descriptors) { | 626 | for (; *descriptors; ++descriptors) { |
diff --git a/drivers/usb/gadget/config.c b/drivers/usb/gadget/config.c index e3a98929d346..34e12fc52c23 100644 --- a/drivers/usb/gadget/config.c +++ b/drivers/usb/gadget/config.c | |||
@@ -19,7 +19,7 @@ | |||
19 | 19 | ||
20 | #include <linux/usb/ch9.h> | 20 | #include <linux/usb/ch9.h> |
21 | #include <linux/usb/gadget.h> | 21 | #include <linux/usb/gadget.h> |
22 | 22 | #include <linux/usb/composite.h> | |
23 | 23 | ||
24 | /** | 24 | /** |
25 | * usb_descriptor_fillbuf - fill buffer with descriptors | 25 | * usb_descriptor_fillbuf - fill buffer with descriptors |
@@ -158,3 +158,40 @@ usb_copy_descriptors(struct usb_descriptor_header **src) | |||
158 | return ret; | 158 | return ret; |
159 | } | 159 | } |
160 | EXPORT_SYMBOL_GPL(usb_copy_descriptors); | 160 | EXPORT_SYMBOL_GPL(usb_copy_descriptors); |
161 | |||
162 | int usb_assign_descriptors(struct usb_function *f, | ||
163 | struct usb_descriptor_header **fs, | ||
164 | struct usb_descriptor_header **hs, | ||
165 | struct usb_descriptor_header **ss) | ||
166 | { | ||
167 | struct usb_gadget *g = f->config->cdev->gadget; | ||
168 | |||
169 | if (fs) { | ||
170 | f->fs_descriptors = usb_copy_descriptors(fs); | ||
171 | if (!f->fs_descriptors) | ||
172 | goto err; | ||
173 | } | ||
174 | if (hs && gadget_is_dualspeed(g)) { | ||
175 | f->hs_descriptors = usb_copy_descriptors(hs); | ||
176 | if (!f->hs_descriptors) | ||
177 | goto err; | ||
178 | } | ||
179 | if (ss && gadget_is_superspeed(g)) { | ||
180 | f->ss_descriptors = usb_copy_descriptors(ss); | ||
181 | if (!f->ss_descriptors) | ||
182 | goto err; | ||
183 | } | ||
184 | return 0; | ||
185 | err: | ||
186 | usb_free_all_descriptors(f); | ||
187 | return -ENOMEM; | ||
188 | } | ||
189 | EXPORT_SYMBOL_GPL(usb_assign_descriptors); | ||
190 | |||
191 | void usb_free_all_descriptors(struct usb_function *f) | ||
192 | { | ||
193 | usb_free_descriptors(f->fs_descriptors); | ||
194 | usb_free_descriptors(f->hs_descriptors); | ||
195 | usb_free_descriptors(f->ss_descriptors); | ||
196 | } | ||
197 | EXPORT_SYMBOL_GPL(usb_free_all_descriptors); | ||
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index 0f7541be28f3..95d584dbed13 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c | |||
@@ -63,16 +63,20 @@ MODULE_LICENSE("GPL"); | |||
63 | struct dummy_hcd_module_parameters { | 63 | struct dummy_hcd_module_parameters { |
64 | bool is_super_speed; | 64 | bool is_super_speed; |
65 | bool is_high_speed; | 65 | bool is_high_speed; |
66 | unsigned int num; | ||
66 | }; | 67 | }; |
67 | 68 | ||
68 | static struct dummy_hcd_module_parameters mod_data = { | 69 | static struct dummy_hcd_module_parameters mod_data = { |
69 | .is_super_speed = false, | 70 | .is_super_speed = false, |
70 | .is_high_speed = true, | 71 | .is_high_speed = true, |
72 | .num = 1, | ||
71 | }; | 73 | }; |
72 | module_param_named(is_super_speed, mod_data.is_super_speed, bool, S_IRUGO); | 74 | module_param_named(is_super_speed, mod_data.is_super_speed, bool, S_IRUGO); |
73 | MODULE_PARM_DESC(is_super_speed, "true to simulate SuperSpeed connection"); | 75 | MODULE_PARM_DESC(is_super_speed, "true to simulate SuperSpeed connection"); |
74 | module_param_named(is_high_speed, mod_data.is_high_speed, bool, S_IRUGO); | 76 | module_param_named(is_high_speed, mod_data.is_high_speed, bool, S_IRUGO); |
75 | MODULE_PARM_DESC(is_high_speed, "true to simulate HighSpeed connection"); | 77 | MODULE_PARM_DESC(is_high_speed, "true to simulate HighSpeed connection"); |
78 | module_param_named(num, mod_data.num, uint, S_IRUGO); | ||
79 | MODULE_PARM_DESC(num, "number of emulated controllers"); | ||
76 | /*-------------------------------------------------------------------------*/ | 80 | /*-------------------------------------------------------------------------*/ |
77 | 81 | ||
78 | /* gadget side driver data structres */ | 82 | /* gadget side driver data structres */ |
@@ -238,8 +242,6 @@ static inline struct dummy *gadget_dev_to_dummy(struct device *dev) | |||
238 | return container_of(dev, struct dummy, gadget.dev); | 242 | return container_of(dev, struct dummy, gadget.dev); |
239 | } | 243 | } |
240 | 244 | ||
241 | static struct dummy the_controller; | ||
242 | |||
243 | /*-------------------------------------------------------------------------*/ | 245 | /*-------------------------------------------------------------------------*/ |
244 | 246 | ||
245 | /* SLAVE/GADGET SIDE UTILITY ROUTINES */ | 247 | /* SLAVE/GADGET SIDE UTILITY ROUTINES */ |
@@ -973,9 +975,10 @@ static void init_dummy_udc_hw(struct dummy *dum) | |||
973 | 975 | ||
974 | static int dummy_udc_probe(struct platform_device *pdev) | 976 | static int dummy_udc_probe(struct platform_device *pdev) |
975 | { | 977 | { |
976 | struct dummy *dum = &the_controller; | 978 | struct dummy *dum; |
977 | int rc; | 979 | int rc; |
978 | 980 | ||
981 | dum = *((void **)dev_get_platdata(&pdev->dev)); | ||
979 | dum->gadget.name = gadget_name; | 982 | dum->gadget.name = gadget_name; |
980 | dum->gadget.ops = &dummy_ops; | 983 | dum->gadget.ops = &dummy_ops; |
981 | dum->gadget.max_speed = USB_SPEED_SUPER; | 984 | dum->gadget.max_speed = USB_SPEED_SUPER; |
@@ -2398,10 +2401,13 @@ static int dummy_h_get_frame(struct usb_hcd *hcd) | |||
2398 | 2401 | ||
2399 | static int dummy_setup(struct usb_hcd *hcd) | 2402 | static int dummy_setup(struct usb_hcd *hcd) |
2400 | { | 2403 | { |
2404 | struct dummy *dum; | ||
2405 | |||
2406 | dum = *((void **)dev_get_platdata(hcd->self.controller)); | ||
2401 | hcd->self.sg_tablesize = ~0; | 2407 | hcd->self.sg_tablesize = ~0; |
2402 | if (usb_hcd_is_primary_hcd(hcd)) { | 2408 | if (usb_hcd_is_primary_hcd(hcd)) { |
2403 | the_controller.hs_hcd = hcd_to_dummy_hcd(hcd); | 2409 | dum->hs_hcd = hcd_to_dummy_hcd(hcd); |
2404 | the_controller.hs_hcd->dum = &the_controller; | 2410 | dum->hs_hcd->dum = dum; |
2405 | /* | 2411 | /* |
2406 | * Mark the first roothub as being USB 2.0. | 2412 | * Mark the first roothub as being USB 2.0. |
2407 | * The USB 3.0 roothub will be registered later by | 2413 | * The USB 3.0 roothub will be registered later by |
@@ -2410,8 +2416,8 @@ static int dummy_setup(struct usb_hcd *hcd) | |||
2410 | hcd->speed = HCD_USB2; | 2416 | hcd->speed = HCD_USB2; |
2411 | hcd->self.root_hub->speed = USB_SPEED_HIGH; | 2417 | hcd->self.root_hub->speed = USB_SPEED_HIGH; |
2412 | } else { | 2418 | } else { |
2413 | the_controller.ss_hcd = hcd_to_dummy_hcd(hcd); | 2419 | dum->ss_hcd = hcd_to_dummy_hcd(hcd); |
2414 | the_controller.ss_hcd->dum = &the_controller; | 2420 | dum->ss_hcd->dum = dum; |
2415 | hcd->speed = HCD_USB3; | 2421 | hcd->speed = HCD_USB3; |
2416 | hcd->self.root_hub->speed = USB_SPEED_SUPER; | 2422 | hcd->self.root_hub->speed = USB_SPEED_SUPER; |
2417 | } | 2423 | } |
@@ -2524,11 +2530,13 @@ static struct hc_driver dummy_hcd = { | |||
2524 | 2530 | ||
2525 | static int dummy_hcd_probe(struct platform_device *pdev) | 2531 | static int dummy_hcd_probe(struct platform_device *pdev) |
2526 | { | 2532 | { |
2533 | struct dummy *dum; | ||
2527 | struct usb_hcd *hs_hcd; | 2534 | struct usb_hcd *hs_hcd; |
2528 | struct usb_hcd *ss_hcd; | 2535 | struct usb_hcd *ss_hcd; |
2529 | int retval; | 2536 | int retval; |
2530 | 2537 | ||
2531 | dev_info(&pdev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc); | 2538 | dev_info(&pdev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc); |
2539 | dum = *((void **)dev_get_platdata(&pdev->dev)); | ||
2532 | 2540 | ||
2533 | if (!mod_data.is_super_speed) | 2541 | if (!mod_data.is_super_speed) |
2534 | dummy_hcd.flags = HCD_USB2; | 2542 | dummy_hcd.flags = HCD_USB2; |
@@ -2561,7 +2569,7 @@ dealloc_usb2_hcd: | |||
2561 | usb_remove_hcd(hs_hcd); | 2569 | usb_remove_hcd(hs_hcd); |
2562 | put_usb2_hcd: | 2570 | put_usb2_hcd: |
2563 | usb_put_hcd(hs_hcd); | 2571 | usb_put_hcd(hs_hcd); |
2564 | the_controller.hs_hcd = the_controller.ss_hcd = NULL; | 2572 | dum->hs_hcd = dum->ss_hcd = NULL; |
2565 | return retval; | 2573 | return retval; |
2566 | } | 2574 | } |
2567 | 2575 | ||
@@ -2579,8 +2587,8 @@ static int dummy_hcd_remove(struct platform_device *pdev) | |||
2579 | usb_remove_hcd(dummy_hcd_to_hcd(dum->hs_hcd)); | 2587 | usb_remove_hcd(dummy_hcd_to_hcd(dum->hs_hcd)); |
2580 | usb_put_hcd(dummy_hcd_to_hcd(dum->hs_hcd)); | 2588 | usb_put_hcd(dummy_hcd_to_hcd(dum->hs_hcd)); |
2581 | 2589 | ||
2582 | the_controller.hs_hcd = NULL; | 2590 | dum->hs_hcd = NULL; |
2583 | the_controller.ss_hcd = NULL; | 2591 | dum->ss_hcd = NULL; |
2584 | 2592 | ||
2585 | return 0; | 2593 | return 0; |
2586 | } | 2594 | } |
@@ -2627,13 +2635,15 @@ static struct platform_driver dummy_hcd_driver = { | |||
2627 | }; | 2635 | }; |
2628 | 2636 | ||
2629 | /*-------------------------------------------------------------------------*/ | 2637 | /*-------------------------------------------------------------------------*/ |
2630 | 2638 | #define MAX_NUM_UDC 2 | |
2631 | static struct platform_device *the_udc_pdev; | 2639 | static struct platform_device *the_udc_pdev[MAX_NUM_UDC]; |
2632 | static struct platform_device *the_hcd_pdev; | 2640 | static struct platform_device *the_hcd_pdev[MAX_NUM_UDC]; |
2633 | 2641 | ||
2634 | static int __init init(void) | 2642 | static int __init init(void) |
2635 | { | 2643 | { |
2636 | int retval = -ENOMEM; | 2644 | int retval = -ENOMEM; |
2645 | int i; | ||
2646 | struct dummy *dum[MAX_NUM_UDC]; | ||
2637 | 2647 | ||
2638 | if (usb_disabled()) | 2648 | if (usb_disabled()) |
2639 | return -ENODEV; | 2649 | return -ENODEV; |
@@ -2641,65 +2651,129 @@ static int __init init(void) | |||
2641 | if (!mod_data.is_high_speed && mod_data.is_super_speed) | 2651 | if (!mod_data.is_high_speed && mod_data.is_super_speed) |
2642 | return -EINVAL; | 2652 | return -EINVAL; |
2643 | 2653 | ||
2644 | the_hcd_pdev = platform_device_alloc(driver_name, -1); | 2654 | if (mod_data.num < 1 || mod_data.num > MAX_NUM_UDC) { |
2645 | if (!the_hcd_pdev) | 2655 | pr_err("Number of emulated UDC must be in range of 1…%d\n", |
2646 | return retval; | 2656 | MAX_NUM_UDC); |
2647 | the_udc_pdev = platform_device_alloc(gadget_name, -1); | 2657 | return -EINVAL; |
2648 | if (!the_udc_pdev) | 2658 | } |
2649 | goto err_alloc_udc; | 2659 | |
2660 | for (i = 0; i < mod_data.num; i++) { | ||
2661 | the_hcd_pdev[i] = platform_device_alloc(driver_name, i); | ||
2662 | if (!the_hcd_pdev[i]) { | ||
2663 | i--; | ||
2664 | while (i >= 0) | ||
2665 | platform_device_put(the_hcd_pdev[i--]); | ||
2666 | return retval; | ||
2667 | } | ||
2668 | } | ||
2669 | for (i = 0; i < mod_data.num; i++) { | ||
2670 | the_udc_pdev[i] = platform_device_alloc(gadget_name, i); | ||
2671 | if (!the_udc_pdev[i]) { | ||
2672 | i--; | ||
2673 | while (i >= 0) | ||
2674 | platform_device_put(the_udc_pdev[i--]); | ||
2675 | goto err_alloc_udc; | ||
2676 | } | ||
2677 | } | ||
2678 | for (i = 0; i < mod_data.num; i++) { | ||
2679 | dum[i] = kzalloc(sizeof(struct dummy), GFP_KERNEL); | ||
2680 | if (!dum[i]) | ||
2681 | goto err_add_pdata; | ||
2682 | retval = platform_device_add_data(the_hcd_pdev[i], &dum[i], | ||
2683 | sizeof(void *)); | ||
2684 | if (retval) | ||
2685 | goto err_add_pdata; | ||
2686 | retval = platform_device_add_data(the_udc_pdev[i], &dum[i], | ||
2687 | sizeof(void *)); | ||
2688 | if (retval) | ||
2689 | goto err_add_pdata; | ||
2690 | } | ||
2650 | 2691 | ||
2651 | retval = platform_driver_register(&dummy_hcd_driver); | 2692 | retval = platform_driver_register(&dummy_hcd_driver); |
2652 | if (retval < 0) | 2693 | if (retval < 0) |
2653 | goto err_register_hcd_driver; | 2694 | goto err_add_pdata; |
2654 | retval = platform_driver_register(&dummy_udc_driver); | 2695 | retval = platform_driver_register(&dummy_udc_driver); |
2655 | if (retval < 0) | 2696 | if (retval < 0) |
2656 | goto err_register_udc_driver; | 2697 | goto err_register_udc_driver; |
2657 | 2698 | ||
2658 | retval = platform_device_add(the_hcd_pdev); | 2699 | for (i = 0; i < mod_data.num; i++) { |
2659 | if (retval < 0) | 2700 | retval = platform_device_add(the_hcd_pdev[i]); |
2660 | goto err_add_hcd; | 2701 | if (retval < 0) { |
2661 | if (!the_controller.hs_hcd || | 2702 | i--; |
2662 | (!the_controller.ss_hcd && mod_data.is_super_speed)) { | 2703 | while (i >= 0) |
2663 | /* | 2704 | platform_device_del(the_hcd_pdev[i--]); |
2664 | * The hcd was added successfully but its probe function failed | 2705 | goto err_add_hcd; |
2665 | * for some reason. | 2706 | } |
2666 | */ | ||
2667 | retval = -EINVAL; | ||
2668 | goto err_add_udc; | ||
2669 | } | 2707 | } |
2670 | retval = platform_device_add(the_udc_pdev); | 2708 | for (i = 0; i < mod_data.num; i++) { |
2671 | if (retval < 0) | 2709 | if (!dum[i]->hs_hcd || |
2672 | goto err_add_udc; | 2710 | (!dum[i]->ss_hcd && mod_data.is_super_speed)) { |
2673 | if (!platform_get_drvdata(the_udc_pdev)) { | 2711 | /* |
2674 | /* | 2712 | * The hcd was added successfully but its probe |
2675 | * The udc was added successfully but its probe function failed | 2713 | * function failed for some reason. |
2676 | * for some reason. | 2714 | */ |
2677 | */ | 2715 | retval = -EINVAL; |
2678 | retval = -EINVAL; | 2716 | goto err_add_udc; |
2679 | goto err_probe_udc; | 2717 | } |
2718 | } | ||
2719 | |||
2720 | for (i = 0; i < mod_data.num; i++) { | ||
2721 | retval = platform_device_add(the_udc_pdev[i]); | ||
2722 | if (retval < 0) { | ||
2723 | i--; | ||
2724 | while (i >= 0) | ||
2725 | platform_device_del(the_udc_pdev[i]); | ||
2726 | goto err_add_udc; | ||
2727 | } | ||
2728 | } | ||
2729 | |||
2730 | for (i = 0; i < mod_data.num; i++) { | ||
2731 | if (!platform_get_drvdata(the_udc_pdev[i])) { | ||
2732 | /* | ||
2733 | * The udc was added successfully but its probe | ||
2734 | * function failed for some reason. | ||
2735 | */ | ||
2736 | retval = -EINVAL; | ||
2737 | goto err_probe_udc; | ||
2738 | } | ||
2680 | } | 2739 | } |
2681 | return retval; | 2740 | return retval; |
2682 | 2741 | ||
2683 | err_probe_udc: | 2742 | err_probe_udc: |
2684 | platform_device_del(the_udc_pdev); | 2743 | for (i = 0; i < mod_data.num; i++) |
2744 | platform_device_del(the_udc_pdev[i]); | ||
2685 | err_add_udc: | 2745 | err_add_udc: |
2686 | platform_device_del(the_hcd_pdev); | 2746 | for (i = 0; i < mod_data.num; i++) |
2747 | platform_device_del(the_hcd_pdev[i]); | ||
2687 | err_add_hcd: | 2748 | err_add_hcd: |
2688 | platform_driver_unregister(&dummy_udc_driver); | 2749 | platform_driver_unregister(&dummy_udc_driver); |
2689 | err_register_udc_driver: | 2750 | err_register_udc_driver: |
2690 | platform_driver_unregister(&dummy_hcd_driver); | 2751 | platform_driver_unregister(&dummy_hcd_driver); |
2691 | err_register_hcd_driver: | 2752 | err_add_pdata: |
2692 | platform_device_put(the_udc_pdev); | 2753 | for (i = 0; i < mod_data.num; i++) |
2754 | kfree(dum[i]); | ||
2755 | for (i = 0; i < mod_data.num; i++) | ||
2756 | platform_device_put(the_udc_pdev[i]); | ||
2693 | err_alloc_udc: | 2757 | err_alloc_udc: |
2694 | platform_device_put(the_hcd_pdev); | 2758 | for (i = 0; i < mod_data.num; i++) |
2759 | platform_device_put(the_hcd_pdev[i]); | ||
2695 | return retval; | 2760 | return retval; |
2696 | } | 2761 | } |
2697 | module_init(init); | 2762 | module_init(init); |
2698 | 2763 | ||
2699 | static void __exit cleanup(void) | 2764 | static void __exit cleanup(void) |
2700 | { | 2765 | { |
2701 | platform_device_unregister(the_udc_pdev); | 2766 | int i; |
2702 | platform_device_unregister(the_hcd_pdev); | 2767 | |
2768 | for (i = 0; i < mod_data.num; i++) { | ||
2769 | struct dummy *dum; | ||
2770 | |||
2771 | dum = *((void **)dev_get_platdata(&the_udc_pdev[i]->dev)); | ||
2772 | |||
2773 | platform_device_unregister(the_udc_pdev[i]); | ||
2774 | platform_device_unregister(the_hcd_pdev[i]); | ||
2775 | kfree(dum); | ||
2776 | } | ||
2703 | platform_driver_unregister(&dummy_udc_driver); | 2777 | platform_driver_unregister(&dummy_udc_driver); |
2704 | platform_driver_unregister(&dummy_hcd_driver); | 2778 | platform_driver_unregister(&dummy_hcd_driver); |
2705 | } | 2779 | } |
diff --git a/drivers/usb/gadget/f_acm.c b/drivers/usb/gadget/f_acm.c index d672250a61fa..549174466c21 100644 --- a/drivers/usb/gadget/f_acm.c +++ b/drivers/usb/gadget/f_acm.c | |||
@@ -87,7 +87,7 @@ static inline struct f_acm *port_to_acm(struct gserial *p) | |||
87 | 87 | ||
88 | /* notification endpoint uses smallish and infrequent fixed-size messages */ | 88 | /* notification endpoint uses smallish and infrequent fixed-size messages */ |
89 | 89 | ||
90 | #define GS_LOG2_NOTIFY_INTERVAL 5 /* 1 << 5 == 32 msec */ | 90 | #define GS_NOTIFY_INTERVAL_MS 32 |
91 | #define GS_NOTIFY_MAXPACKET 10 /* notification + 2 bytes */ | 91 | #define GS_NOTIFY_MAXPACKET 10 /* notification + 2 bytes */ |
92 | 92 | ||
93 | /* interface and class descriptors: */ | 93 | /* interface and class descriptors: */ |
@@ -167,7 +167,7 @@ static struct usb_endpoint_descriptor acm_fs_notify_desc = { | |||
167 | .bEndpointAddress = USB_DIR_IN, | 167 | .bEndpointAddress = USB_DIR_IN, |
168 | .bmAttributes = USB_ENDPOINT_XFER_INT, | 168 | .bmAttributes = USB_ENDPOINT_XFER_INT, |
169 | .wMaxPacketSize = cpu_to_le16(GS_NOTIFY_MAXPACKET), | 169 | .wMaxPacketSize = cpu_to_le16(GS_NOTIFY_MAXPACKET), |
170 | .bInterval = 1 << GS_LOG2_NOTIFY_INTERVAL, | 170 | .bInterval = GS_NOTIFY_INTERVAL_MS, |
171 | }; | 171 | }; |
172 | 172 | ||
173 | static struct usb_endpoint_descriptor acm_fs_in_desc = { | 173 | static struct usb_endpoint_descriptor acm_fs_in_desc = { |
@@ -199,14 +199,13 @@ static struct usb_descriptor_header *acm_fs_function[] = { | |||
199 | }; | 199 | }; |
200 | 200 | ||
201 | /* high speed support: */ | 201 | /* high speed support: */ |
202 | |||
203 | static struct usb_endpoint_descriptor acm_hs_notify_desc = { | 202 | static struct usb_endpoint_descriptor acm_hs_notify_desc = { |
204 | .bLength = USB_DT_ENDPOINT_SIZE, | 203 | .bLength = USB_DT_ENDPOINT_SIZE, |
205 | .bDescriptorType = USB_DT_ENDPOINT, | 204 | .bDescriptorType = USB_DT_ENDPOINT, |
206 | .bEndpointAddress = USB_DIR_IN, | 205 | .bEndpointAddress = USB_DIR_IN, |
207 | .bmAttributes = USB_ENDPOINT_XFER_INT, | 206 | .bmAttributes = USB_ENDPOINT_XFER_INT, |
208 | .wMaxPacketSize = cpu_to_le16(GS_NOTIFY_MAXPACKET), | 207 | .wMaxPacketSize = cpu_to_le16(GS_NOTIFY_MAXPACKET), |
209 | .bInterval = GS_LOG2_NOTIFY_INTERVAL+4, | 208 | .bInterval = USB_MS_TO_HS_INTERVAL(GS_NOTIFY_INTERVAL_MS), |
210 | }; | 209 | }; |
211 | 210 | ||
212 | static struct usb_endpoint_descriptor acm_hs_in_desc = { | 211 | static struct usb_endpoint_descriptor acm_hs_in_desc = { |
@@ -659,37 +658,22 @@ acm_bind(struct usb_configuration *c, struct usb_function *f) | |||
659 | acm->notify_req->complete = acm_cdc_notify_complete; | 658 | acm->notify_req->complete = acm_cdc_notify_complete; |
660 | acm->notify_req->context = acm; | 659 | acm->notify_req->context = acm; |
661 | 660 | ||
662 | /* copy descriptors */ | ||
663 | f->descriptors = usb_copy_descriptors(acm_fs_function); | ||
664 | if (!f->descriptors) | ||
665 | goto fail; | ||
666 | |||
667 | /* support all relevant hardware speeds... we expect that when | 661 | /* support all relevant hardware speeds... we expect that when |
668 | * hardware is dual speed, all bulk-capable endpoints work at | 662 | * hardware is dual speed, all bulk-capable endpoints work at |
669 | * both speeds | 663 | * both speeds |
670 | */ | 664 | */ |
671 | if (gadget_is_dualspeed(c->cdev->gadget)) { | 665 | acm_hs_in_desc.bEndpointAddress = acm_fs_in_desc.bEndpointAddress; |
672 | acm_hs_in_desc.bEndpointAddress = | 666 | acm_hs_out_desc.bEndpointAddress = acm_fs_out_desc.bEndpointAddress; |
673 | acm_fs_in_desc.bEndpointAddress; | 667 | acm_hs_notify_desc.bEndpointAddress = |
674 | acm_hs_out_desc.bEndpointAddress = | 668 | acm_fs_notify_desc.bEndpointAddress; |
675 | acm_fs_out_desc.bEndpointAddress; | 669 | |
676 | acm_hs_notify_desc.bEndpointAddress = | 670 | acm_ss_in_desc.bEndpointAddress = acm_fs_in_desc.bEndpointAddress; |
677 | acm_fs_notify_desc.bEndpointAddress; | 671 | acm_ss_out_desc.bEndpointAddress = acm_fs_out_desc.bEndpointAddress; |
678 | 672 | ||
679 | /* copy descriptors */ | 673 | status = usb_assign_descriptors(f, acm_fs_function, acm_hs_function, |
680 | f->hs_descriptors = usb_copy_descriptors(acm_hs_function); | 674 | acm_ss_function); |
681 | } | 675 | if (status) |
682 | if (gadget_is_superspeed(c->cdev->gadget)) { | 676 | goto fail; |
683 | acm_ss_in_desc.bEndpointAddress = | ||
684 | acm_fs_in_desc.bEndpointAddress; | ||
685 | acm_ss_out_desc.bEndpointAddress = | ||
686 | acm_fs_out_desc.bEndpointAddress; | ||
687 | |||
688 | /* copy descriptors, and track endpoint copies */ | ||
689 | f->ss_descriptors = usb_copy_descriptors(acm_ss_function); | ||
690 | if (!f->ss_descriptors) | ||
691 | goto fail; | ||
692 | } | ||
693 | 677 | ||
694 | DBG(cdev, "acm ttyGS%d: %s speed IN/%s OUT/%s NOTIFY/%s\n", | 678 | DBG(cdev, "acm ttyGS%d: %s speed IN/%s OUT/%s NOTIFY/%s\n", |
695 | acm->port_num, | 679 | acm->port_num, |
@@ -721,11 +705,8 @@ acm_unbind(struct usb_configuration *c, struct usb_function *f) | |||
721 | { | 705 | { |
722 | struct f_acm *acm = func_to_acm(f); | 706 | struct f_acm *acm = func_to_acm(f); |
723 | 707 | ||
724 | if (gadget_is_dualspeed(c->cdev->gadget)) | 708 | acm_string_defs[0].id = 0; |
725 | usb_free_descriptors(f->hs_descriptors); | 709 | usb_free_all_descriptors(f); |
726 | if (gadget_is_superspeed(c->cdev->gadget)) | ||
727 | usb_free_descriptors(f->ss_descriptors); | ||
728 | usb_free_descriptors(f->descriptors); | ||
729 | gs_free_req(acm->notify, acm->notify_req); | 710 | gs_free_req(acm->notify, acm->notify_req); |
730 | kfree(acm); | 711 | kfree(acm); |
731 | } | 712 | } |
@@ -762,27 +743,15 @@ int acm_bind_config(struct usb_configuration *c, u8 port_num) | |||
762 | */ | 743 | */ |
763 | 744 | ||
764 | /* maybe allocate device-global string IDs, and patch descriptors */ | 745 | /* maybe allocate device-global string IDs, and patch descriptors */ |
765 | if (acm_string_defs[ACM_CTRL_IDX].id == 0) { | 746 | if (acm_string_defs[0].id == 0) { |
766 | status = usb_string_id(c->cdev); | 747 | status = usb_string_ids_tab(c->cdev, acm_string_defs); |
767 | if (status < 0) | 748 | if (status < 0) |
768 | return status; | 749 | return status; |
769 | acm_string_defs[ACM_CTRL_IDX].id = status; | 750 | acm_control_interface_desc.iInterface = |
770 | 751 | acm_string_defs[ACM_CTRL_IDX].id; | |
771 | acm_control_interface_desc.iInterface = status; | 752 | acm_data_interface_desc.iInterface = |
772 | 753 | acm_string_defs[ACM_DATA_IDX].id; | |
773 | status = usb_string_id(c->cdev); | 754 | acm_iad_descriptor.iFunction = acm_string_defs[ACM_IAD_IDX].id; |
774 | if (status < 0) | ||
775 | return status; | ||
776 | acm_string_defs[ACM_DATA_IDX].id = status; | ||
777 | |||
778 | acm_data_interface_desc.iInterface = status; | ||
779 | |||
780 | status = usb_string_id(c->cdev); | ||
781 | if (status < 0) | ||
782 | return status; | ||
783 | acm_string_defs[ACM_IAD_IDX].id = status; | ||
784 | |||
785 | acm_iad_descriptor.iFunction = status; | ||
786 | } | 755 | } |
787 | 756 | ||
788 | /* allocate and initialize one new instance */ | 757 | /* allocate and initialize one new instance */ |
diff --git a/drivers/usb/gadget/f_ecm.c b/drivers/usb/gadget/f_ecm.c index 95bc94f8e570..83420a310fb7 100644 --- a/drivers/usb/gadget/f_ecm.c +++ b/drivers/usb/gadget/f_ecm.c | |||
@@ -91,7 +91,7 @@ static inline unsigned ecm_bitrate(struct usb_gadget *g) | |||
91 | * encapsulated commands (vendor-specific, using control-OUT). | 91 | * encapsulated commands (vendor-specific, using control-OUT). |
92 | */ | 92 | */ |
93 | 93 | ||
94 | #define LOG2_STATUS_INTERVAL_MSEC 5 /* 1 << 5 == 32 msec */ | 94 | #define ECM_STATUS_INTERVAL_MS 32 |
95 | #define ECM_STATUS_BYTECOUNT 16 /* 8 byte header + data */ | 95 | #define ECM_STATUS_BYTECOUNT 16 /* 8 byte header + data */ |
96 | 96 | ||
97 | 97 | ||
@@ -192,7 +192,7 @@ static struct usb_endpoint_descriptor fs_ecm_notify_desc = { | |||
192 | .bEndpointAddress = USB_DIR_IN, | 192 | .bEndpointAddress = USB_DIR_IN, |
193 | .bmAttributes = USB_ENDPOINT_XFER_INT, | 193 | .bmAttributes = USB_ENDPOINT_XFER_INT, |
194 | .wMaxPacketSize = cpu_to_le16(ECM_STATUS_BYTECOUNT), | 194 | .wMaxPacketSize = cpu_to_le16(ECM_STATUS_BYTECOUNT), |
195 | .bInterval = 1 << LOG2_STATUS_INTERVAL_MSEC, | 195 | .bInterval = ECM_STATUS_INTERVAL_MS, |
196 | }; | 196 | }; |
197 | 197 | ||
198 | static struct usb_endpoint_descriptor fs_ecm_in_desc = { | 198 | static struct usb_endpoint_descriptor fs_ecm_in_desc = { |
@@ -239,7 +239,7 @@ static struct usb_endpoint_descriptor hs_ecm_notify_desc = { | |||
239 | .bEndpointAddress = USB_DIR_IN, | 239 | .bEndpointAddress = USB_DIR_IN, |
240 | .bmAttributes = USB_ENDPOINT_XFER_INT, | 240 | .bmAttributes = USB_ENDPOINT_XFER_INT, |
241 | .wMaxPacketSize = cpu_to_le16(ECM_STATUS_BYTECOUNT), | 241 | .wMaxPacketSize = cpu_to_le16(ECM_STATUS_BYTECOUNT), |
242 | .bInterval = LOG2_STATUS_INTERVAL_MSEC + 4, | 242 | .bInterval = USB_MS_TO_HS_INTERVAL(ECM_STATUS_INTERVAL_MS), |
243 | }; | 243 | }; |
244 | 244 | ||
245 | static struct usb_endpoint_descriptor hs_ecm_in_desc = { | 245 | static struct usb_endpoint_descriptor hs_ecm_in_desc = { |
@@ -288,7 +288,7 @@ static struct usb_endpoint_descriptor ss_ecm_notify_desc = { | |||
288 | .bEndpointAddress = USB_DIR_IN, | 288 | .bEndpointAddress = USB_DIR_IN, |
289 | .bmAttributes = USB_ENDPOINT_XFER_INT, | 289 | .bmAttributes = USB_ENDPOINT_XFER_INT, |
290 | .wMaxPacketSize = cpu_to_le16(ECM_STATUS_BYTECOUNT), | 290 | .wMaxPacketSize = cpu_to_le16(ECM_STATUS_BYTECOUNT), |
291 | .bInterval = LOG2_STATUS_INTERVAL_MSEC + 4, | 291 | .bInterval = USB_MS_TO_HS_INTERVAL(ECM_STATUS_INTERVAL_MS), |
292 | }; | 292 | }; |
293 | 293 | ||
294 | static struct usb_ss_ep_comp_descriptor ss_ecm_intr_comp_desc = { | 294 | static struct usb_ss_ep_comp_descriptor ss_ecm_intr_comp_desc = { |
@@ -330,6 +330,7 @@ static struct usb_ss_ep_comp_descriptor ss_ecm_bulk_comp_desc = { | |||
330 | 330 | ||
331 | static struct usb_descriptor_header *ecm_ss_function[] = { | 331 | static struct usb_descriptor_header *ecm_ss_function[] = { |
332 | /* CDC ECM control descriptors */ | 332 | /* CDC ECM control descriptors */ |
333 | (struct usb_descriptor_header *) &ecm_iad_descriptor, | ||
333 | (struct usb_descriptor_header *) &ecm_control_intf, | 334 | (struct usb_descriptor_header *) &ecm_control_intf, |
334 | (struct usb_descriptor_header *) &ecm_header_desc, | 335 | (struct usb_descriptor_header *) &ecm_header_desc, |
335 | (struct usb_descriptor_header *) &ecm_union_desc, | 336 | (struct usb_descriptor_header *) &ecm_union_desc, |
@@ -353,7 +354,7 @@ static struct usb_descriptor_header *ecm_ss_function[] = { | |||
353 | 354 | ||
354 | static struct usb_string ecm_string_defs[] = { | 355 | static struct usb_string ecm_string_defs[] = { |
355 | [0].s = "CDC Ethernet Control Model (ECM)", | 356 | [0].s = "CDC Ethernet Control Model (ECM)", |
356 | [1].s = NULL /* DYNAMIC */, | 357 | [1].s = "", |
357 | [2].s = "CDC Ethernet Data", | 358 | [2].s = "CDC Ethernet Data", |
358 | [3].s = "CDC ECM", | 359 | [3].s = "CDC ECM", |
359 | { } /* end of list */ | 360 | { } /* end of list */ |
@@ -742,42 +743,24 @@ ecm_bind(struct usb_configuration *c, struct usb_function *f) | |||
742 | ecm->notify_req->context = ecm; | 743 | ecm->notify_req->context = ecm; |
743 | ecm->notify_req->complete = ecm_notify_complete; | 744 | ecm->notify_req->complete = ecm_notify_complete; |
744 | 745 | ||
745 | /* copy descriptors, and track endpoint copies */ | ||
746 | f->descriptors = usb_copy_descriptors(ecm_fs_function); | ||
747 | if (!f->descriptors) | ||
748 | goto fail; | ||
749 | |||
750 | /* support all relevant hardware speeds... we expect that when | 746 | /* support all relevant hardware speeds... we expect that when |
751 | * hardware is dual speed, all bulk-capable endpoints work at | 747 | * hardware is dual speed, all bulk-capable endpoints work at |
752 | * both speeds | 748 | * both speeds |
753 | */ | 749 | */ |
754 | if (gadget_is_dualspeed(c->cdev->gadget)) { | 750 | hs_ecm_in_desc.bEndpointAddress = fs_ecm_in_desc.bEndpointAddress; |
755 | hs_ecm_in_desc.bEndpointAddress = | 751 | hs_ecm_out_desc.bEndpointAddress = fs_ecm_out_desc.bEndpointAddress; |
756 | fs_ecm_in_desc.bEndpointAddress; | 752 | hs_ecm_notify_desc.bEndpointAddress = |
757 | hs_ecm_out_desc.bEndpointAddress = | 753 | fs_ecm_notify_desc.bEndpointAddress; |
758 | fs_ecm_out_desc.bEndpointAddress; | 754 | |
759 | hs_ecm_notify_desc.bEndpointAddress = | 755 | ss_ecm_in_desc.bEndpointAddress = fs_ecm_in_desc.bEndpointAddress; |
760 | fs_ecm_notify_desc.bEndpointAddress; | 756 | ss_ecm_out_desc.bEndpointAddress = fs_ecm_out_desc.bEndpointAddress; |
761 | 757 | ss_ecm_notify_desc.bEndpointAddress = | |
762 | /* copy descriptors, and track endpoint copies */ | 758 | fs_ecm_notify_desc.bEndpointAddress; |
763 | f->hs_descriptors = usb_copy_descriptors(ecm_hs_function); | 759 | |
764 | if (!f->hs_descriptors) | 760 | status = usb_assign_descriptors(f, ecm_fs_function, ecm_hs_function, |
765 | goto fail; | 761 | ecm_ss_function); |
766 | } | 762 | if (status) |
767 | 763 | goto fail; | |
768 | if (gadget_is_superspeed(c->cdev->gadget)) { | ||
769 | ss_ecm_in_desc.bEndpointAddress = | ||
770 | fs_ecm_in_desc.bEndpointAddress; | ||
771 | ss_ecm_out_desc.bEndpointAddress = | ||
772 | fs_ecm_out_desc.bEndpointAddress; | ||
773 | ss_ecm_notify_desc.bEndpointAddress = | ||
774 | fs_ecm_notify_desc.bEndpointAddress; | ||
775 | |||
776 | /* copy descriptors, and track endpoint copies */ | ||
777 | f->ss_descriptors = usb_copy_descriptors(ecm_ss_function); | ||
778 | if (!f->ss_descriptors) | ||
779 | goto fail; | ||
780 | } | ||
781 | 764 | ||
782 | /* NOTE: all that is done without knowing or caring about | 765 | /* NOTE: all that is done without knowing or caring about |
783 | * the network link ... which is unavailable to this code | 766 | * the network link ... which is unavailable to this code |
@@ -795,11 +778,6 @@ ecm_bind(struct usb_configuration *c, struct usb_function *f) | |||
795 | return 0; | 778 | return 0; |
796 | 779 | ||
797 | fail: | 780 | fail: |
798 | if (f->descriptors) | ||
799 | usb_free_descriptors(f->descriptors); | ||
800 | if (f->hs_descriptors) | ||
801 | usb_free_descriptors(f->hs_descriptors); | ||
802 | |||
803 | if (ecm->notify_req) { | 781 | if (ecm->notify_req) { |
804 | kfree(ecm->notify_req->buf); | 782 | kfree(ecm->notify_req->buf); |
805 | usb_ep_free_request(ecm->notify, ecm->notify_req); | 783 | usb_ep_free_request(ecm->notify, ecm->notify_req); |
@@ -808,9 +786,9 @@ fail: | |||
808 | /* we might as well release our claims on endpoints */ | 786 | /* we might as well release our claims on endpoints */ |
809 | if (ecm->notify) | 787 | if (ecm->notify) |
810 | ecm->notify->driver_data = NULL; | 788 | ecm->notify->driver_data = NULL; |
811 | if (ecm->port.out_ep->desc) | 789 | if (ecm->port.out_ep) |
812 | ecm->port.out_ep->driver_data = NULL; | 790 | ecm->port.out_ep->driver_data = NULL; |
813 | if (ecm->port.in_ep->desc) | 791 | if (ecm->port.in_ep) |
814 | ecm->port.in_ep->driver_data = NULL; | 792 | ecm->port.in_ep->driver_data = NULL; |
815 | 793 | ||
816 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); | 794 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); |
@@ -825,16 +803,11 @@ ecm_unbind(struct usb_configuration *c, struct usb_function *f) | |||
825 | 803 | ||
826 | DBG(c->cdev, "ecm unbind\n"); | 804 | DBG(c->cdev, "ecm unbind\n"); |
827 | 805 | ||
828 | if (gadget_is_superspeed(c->cdev->gadget)) | 806 | ecm_string_defs[0].id = 0; |
829 | usb_free_descriptors(f->ss_descriptors); | 807 | usb_free_all_descriptors(f); |
830 | if (gadget_is_dualspeed(c->cdev->gadget)) | ||
831 | usb_free_descriptors(f->hs_descriptors); | ||
832 | usb_free_descriptors(f->descriptors); | ||
833 | 808 | ||
834 | kfree(ecm->notify_req->buf); | 809 | kfree(ecm->notify_req->buf); |
835 | usb_ep_free_request(ecm->notify, ecm->notify_req); | 810 | usb_ep_free_request(ecm->notify, ecm->notify_req); |
836 | |||
837 | ecm_string_defs[1].s = NULL; | ||
838 | kfree(ecm); | 811 | kfree(ecm); |
839 | } | 812 | } |
840 | 813 | ||
@@ -859,36 +832,15 @@ ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]) | |||
859 | if (!can_support_ecm(c->cdev->gadget) || !ethaddr) | 832 | if (!can_support_ecm(c->cdev->gadget) || !ethaddr) |
860 | return -EINVAL; | 833 | return -EINVAL; |
861 | 834 | ||
862 | /* maybe allocate device-global string IDs */ | ||
863 | if (ecm_string_defs[0].id == 0) { | 835 | if (ecm_string_defs[0].id == 0) { |
864 | 836 | status = usb_string_ids_tab(c->cdev, ecm_string_defs); | |
865 | /* control interface label */ | 837 | if (status) |
866 | status = usb_string_id(c->cdev); | ||
867 | if (status < 0) | ||
868 | return status; | ||
869 | ecm_string_defs[0].id = status; | ||
870 | ecm_control_intf.iInterface = status; | ||
871 | |||
872 | /* data interface label */ | ||
873 | status = usb_string_id(c->cdev); | ||
874 | if (status < 0) | ||
875 | return status; | 838 | return status; |
876 | ecm_string_defs[2].id = status; | ||
877 | ecm_data_intf.iInterface = status; | ||
878 | 839 | ||
879 | /* MAC address */ | 840 | ecm_control_intf.iInterface = ecm_string_defs[0].id; |
880 | status = usb_string_id(c->cdev); | 841 | ecm_data_intf.iInterface = ecm_string_defs[2].id; |
881 | if (status < 0) | 842 | ecm_desc.iMACAddress = ecm_string_defs[1].id; |
882 | return status; | 843 | ecm_iad_descriptor.iFunction = ecm_string_defs[3].id; |
883 | ecm_string_defs[1].id = status; | ||
884 | ecm_desc.iMACAddress = status; | ||
885 | |||
886 | /* IAD label */ | ||
887 | status = usb_string_id(c->cdev); | ||
888 | if (status < 0) | ||
889 | return status; | ||
890 | ecm_string_defs[3].id = status; | ||
891 | ecm_iad_descriptor.iFunction = status; | ||
892 | } | 844 | } |
893 | 845 | ||
894 | /* allocate and initialize one new instance */ | 846 | /* allocate and initialize one new instance */ |
@@ -913,9 +865,7 @@ ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]) | |||
913 | ecm->port.func.disable = ecm_disable; | 865 | ecm->port.func.disable = ecm_disable; |
914 | 866 | ||
915 | status = usb_add_function(c, &ecm->port.func); | 867 | status = usb_add_function(c, &ecm->port.func); |
916 | if (status) { | 868 | if (status) |
917 | ecm_string_defs[1].s = NULL; | ||
918 | kfree(ecm); | 869 | kfree(ecm); |
919 | } | ||
920 | return status; | 870 | return status; |
921 | } | 871 | } |
diff --git a/drivers/usb/gadget/f_eem.c b/drivers/usb/gadget/f_eem.c index 1a7b2dd7d408..cf0ebee85563 100644 --- a/drivers/usb/gadget/f_eem.c +++ b/drivers/usb/gadget/f_eem.c | |||
@@ -274,38 +274,20 @@ eem_bind(struct usb_configuration *c, struct usb_function *f) | |||
274 | 274 | ||
275 | status = -ENOMEM; | 275 | status = -ENOMEM; |
276 | 276 | ||
277 | /* copy descriptors, and track endpoint copies */ | ||
278 | f->descriptors = usb_copy_descriptors(eem_fs_function); | ||
279 | if (!f->descriptors) | ||
280 | goto fail; | ||
281 | |||
282 | /* support all relevant hardware speeds... we expect that when | 277 | /* support all relevant hardware speeds... we expect that when |
283 | * hardware is dual speed, all bulk-capable endpoints work at | 278 | * hardware is dual speed, all bulk-capable endpoints work at |
284 | * both speeds | 279 | * both speeds |
285 | */ | 280 | */ |
286 | if (gadget_is_dualspeed(c->cdev->gadget)) { | 281 | eem_hs_in_desc.bEndpointAddress = eem_fs_in_desc.bEndpointAddress; |
287 | eem_hs_in_desc.bEndpointAddress = | 282 | eem_hs_out_desc.bEndpointAddress = eem_fs_out_desc.bEndpointAddress; |
288 | eem_fs_in_desc.bEndpointAddress; | ||
289 | eem_hs_out_desc.bEndpointAddress = | ||
290 | eem_fs_out_desc.bEndpointAddress; | ||
291 | |||
292 | /* copy descriptors, and track endpoint copies */ | ||
293 | f->hs_descriptors = usb_copy_descriptors(eem_hs_function); | ||
294 | if (!f->hs_descriptors) | ||
295 | goto fail; | ||
296 | } | ||
297 | 283 | ||
298 | if (gadget_is_superspeed(c->cdev->gadget)) { | 284 | eem_ss_in_desc.bEndpointAddress = eem_fs_in_desc.bEndpointAddress; |
299 | eem_ss_in_desc.bEndpointAddress = | 285 | eem_ss_out_desc.bEndpointAddress = eem_fs_out_desc.bEndpointAddress; |
300 | eem_fs_in_desc.bEndpointAddress; | ||
301 | eem_ss_out_desc.bEndpointAddress = | ||
302 | eem_fs_out_desc.bEndpointAddress; | ||
303 | 286 | ||
304 | /* copy descriptors, and track endpoint copies */ | 287 | status = usb_assign_descriptors(f, eem_fs_function, eem_hs_function, |
305 | f->ss_descriptors = usb_copy_descriptors(eem_ss_function); | 288 | eem_ss_function); |
306 | if (!f->ss_descriptors) | 289 | if (status) |
307 | goto fail; | 290 | goto fail; |
308 | } | ||
309 | 291 | ||
310 | DBG(cdev, "CDC Ethernet (EEM): %s speed IN/%s OUT/%s\n", | 292 | DBG(cdev, "CDC Ethernet (EEM): %s speed IN/%s OUT/%s\n", |
311 | gadget_is_superspeed(c->cdev->gadget) ? "super" : | 293 | gadget_is_superspeed(c->cdev->gadget) ? "super" : |
@@ -314,15 +296,10 @@ eem_bind(struct usb_configuration *c, struct usb_function *f) | |||
314 | return 0; | 296 | return 0; |
315 | 297 | ||
316 | fail: | 298 | fail: |
317 | if (f->descriptors) | 299 | usb_free_all_descriptors(f); |
318 | usb_free_descriptors(f->descriptors); | 300 | if (eem->port.out_ep) |
319 | if (f->hs_descriptors) | ||
320 | usb_free_descriptors(f->hs_descriptors); | ||
321 | |||
322 | /* we might as well release our claims on endpoints */ | ||
323 | if (eem->port.out_ep->desc) | ||
324 | eem->port.out_ep->driver_data = NULL; | 301 | eem->port.out_ep->driver_data = NULL; |
325 | if (eem->port.in_ep->desc) | 302 | if (eem->port.in_ep) |
326 | eem->port.in_ep->driver_data = NULL; | 303 | eem->port.in_ep->driver_data = NULL; |
327 | 304 | ||
328 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); | 305 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); |
@@ -337,11 +314,7 @@ eem_unbind(struct usb_configuration *c, struct usb_function *f) | |||
337 | 314 | ||
338 | DBG(c->cdev, "eem unbind\n"); | 315 | DBG(c->cdev, "eem unbind\n"); |
339 | 316 | ||
340 | if (gadget_is_superspeed(c->cdev->gadget)) | 317 | usb_free_all_descriptors(f); |
341 | usb_free_descriptors(f->ss_descriptors); | ||
342 | if (gadget_is_dualspeed(c->cdev->gadget)) | ||
343 | usb_free_descriptors(f->hs_descriptors); | ||
344 | usb_free_descriptors(f->descriptors); | ||
345 | kfree(eem); | 318 | kfree(eem); |
346 | } | 319 | } |
347 | 320 | ||
diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c index 64c4ec10d1fc..4a6961c517f2 100644 --- a/drivers/usb/gadget/f_fs.c +++ b/drivers/usb/gadget/f_fs.c | |||
@@ -2097,7 +2097,7 @@ static int __ffs_func_bind_do_descs(enum ffs_entity_type type, u8 *valuep, | |||
2097 | if (isHS) | 2097 | if (isHS) |
2098 | func->function.hs_descriptors[(long)valuep] = desc; | 2098 | func->function.hs_descriptors[(long)valuep] = desc; |
2099 | else | 2099 | else |
2100 | func->function.descriptors[(long)valuep] = desc; | 2100 | func->function.fs_descriptors[(long)valuep] = desc; |
2101 | 2101 | ||
2102 | if (!desc || desc->bDescriptorType != USB_DT_ENDPOINT) | 2102 | if (!desc || desc->bDescriptorType != USB_DT_ENDPOINT) |
2103 | return 0; | 2103 | return 0; |
@@ -2249,7 +2249,7 @@ static int ffs_func_bind(struct usb_configuration *c, | |||
2249 | * numbers without worrying that it may be described later on. | 2249 | * numbers without worrying that it may be described later on. |
2250 | */ | 2250 | */ |
2251 | if (likely(full)) { | 2251 | if (likely(full)) { |
2252 | func->function.descriptors = data->fs_descs; | 2252 | func->function.fs_descriptors = data->fs_descs; |
2253 | ret = ffs_do_descs(ffs->fs_descs_count, | 2253 | ret = ffs_do_descs(ffs->fs_descs_count, |
2254 | data->raw_descs, | 2254 | data->raw_descs, |
2255 | sizeof data->raw_descs, | 2255 | sizeof data->raw_descs, |
diff --git a/drivers/usb/gadget/f_hid.c b/drivers/usb/gadget/f_hid.c index 511e527178e2..6e69a8e8d22a 100644 --- a/drivers/usb/gadget/f_hid.c +++ b/drivers/usb/gadget/f_hid.c | |||
@@ -573,7 +573,6 @@ static int __init hidg_bind(struct usb_configuration *c, struct usb_function *f) | |||
573 | goto fail; | 573 | goto fail; |
574 | hidg_interface_desc.bInterfaceNumber = status; | 574 | hidg_interface_desc.bInterfaceNumber = status; |
575 | 575 | ||
576 | |||
577 | /* allocate instance-specific endpoints */ | 576 | /* allocate instance-specific endpoints */ |
578 | status = -ENODEV; | 577 | status = -ENODEV; |
579 | ep = usb_ep_autoconfig(c->cdev->gadget, &hidg_fs_in_ep_desc); | 578 | ep = usb_ep_autoconfig(c->cdev->gadget, &hidg_fs_in_ep_desc); |
@@ -609,20 +608,15 @@ static int __init hidg_bind(struct usb_configuration *c, struct usb_function *f) | |||
609 | hidg_desc.desc[0].wDescriptorLength = | 608 | hidg_desc.desc[0].wDescriptorLength = |
610 | cpu_to_le16(hidg->report_desc_length); | 609 | cpu_to_le16(hidg->report_desc_length); |
611 | 610 | ||
612 | /* copy descriptors */ | 611 | hidg_hs_in_ep_desc.bEndpointAddress = |
613 | f->descriptors = usb_copy_descriptors(hidg_fs_descriptors); | 612 | hidg_fs_in_ep_desc.bEndpointAddress; |
614 | if (!f->descriptors) | 613 | hidg_hs_out_ep_desc.bEndpointAddress = |
615 | goto fail; | 614 | hidg_fs_out_ep_desc.bEndpointAddress; |
616 | 615 | ||
617 | if (gadget_is_dualspeed(c->cdev->gadget)) { | 616 | status = usb_assign_descriptors(f, hidg_fs_descriptors, |
618 | hidg_hs_in_ep_desc.bEndpointAddress = | 617 | hidg_hs_descriptors, NULL); |
619 | hidg_fs_in_ep_desc.bEndpointAddress; | 618 | if (status) |
620 | hidg_hs_out_ep_desc.bEndpointAddress = | 619 | goto fail; |
621 | hidg_fs_out_ep_desc.bEndpointAddress; | ||
622 | f->hs_descriptors = usb_copy_descriptors(hidg_hs_descriptors); | ||
623 | if (!f->hs_descriptors) | ||
624 | goto fail; | ||
625 | } | ||
626 | 620 | ||
627 | mutex_init(&hidg->lock); | 621 | mutex_init(&hidg->lock); |
628 | spin_lock_init(&hidg->spinlock); | 622 | spin_lock_init(&hidg->spinlock); |
@@ -649,9 +643,7 @@ fail: | |||
649 | usb_ep_free_request(hidg->in_ep, hidg->req); | 643 | usb_ep_free_request(hidg->in_ep, hidg->req); |
650 | } | 644 | } |
651 | 645 | ||
652 | usb_free_descriptors(f->hs_descriptors); | 646 | usb_free_all_descriptors(f); |
653 | usb_free_descriptors(f->descriptors); | ||
654 | |||
655 | return status; | 647 | return status; |
656 | } | 648 | } |
657 | 649 | ||
@@ -668,9 +660,7 @@ static void hidg_unbind(struct usb_configuration *c, struct usb_function *f) | |||
668 | kfree(hidg->req->buf); | 660 | kfree(hidg->req->buf); |
669 | usb_ep_free_request(hidg->in_ep, hidg->req); | 661 | usb_ep_free_request(hidg->in_ep, hidg->req); |
670 | 662 | ||
671 | /* free descriptors copies */ | 663 | usb_free_all_descriptors(f); |
672 | usb_free_descriptors(f->hs_descriptors); | ||
673 | usb_free_descriptors(f->descriptors); | ||
674 | 664 | ||
675 | kfree(hidg->report_desc); | 665 | kfree(hidg->report_desc); |
676 | kfree(hidg); | 666 | kfree(hidg); |
diff --git a/drivers/usb/gadget/f_loopback.c b/drivers/usb/gadget/f_loopback.c index 7275706caeb0..bb39cb2bb3a3 100644 --- a/drivers/usb/gadget/f_loopback.c +++ b/drivers/usb/gadget/f_loopback.c | |||
@@ -177,6 +177,7 @@ loopback_bind(struct usb_configuration *c, struct usb_function *f) | |||
177 | struct usb_composite_dev *cdev = c->cdev; | 177 | struct usb_composite_dev *cdev = c->cdev; |
178 | struct f_loopback *loop = func_to_loop(f); | 178 | struct f_loopback *loop = func_to_loop(f); |
179 | int id; | 179 | int id; |
180 | int ret; | ||
180 | 181 | ||
181 | /* allocate interface ID(s) */ | 182 | /* allocate interface ID(s) */ |
182 | id = usb_interface_id(c, f); | 183 | id = usb_interface_id(c, f); |
@@ -201,22 +202,19 @@ autoconf_fail: | |||
201 | loop->out_ep->driver_data = cdev; /* claim */ | 202 | loop->out_ep->driver_data = cdev; /* claim */ |
202 | 203 | ||
203 | /* support high speed hardware */ | 204 | /* support high speed hardware */ |
204 | if (gadget_is_dualspeed(c->cdev->gadget)) { | 205 | hs_loop_source_desc.bEndpointAddress = |
205 | hs_loop_source_desc.bEndpointAddress = | 206 | fs_loop_source_desc.bEndpointAddress; |
206 | fs_loop_source_desc.bEndpointAddress; | 207 | hs_loop_sink_desc.bEndpointAddress = fs_loop_sink_desc.bEndpointAddress; |
207 | hs_loop_sink_desc.bEndpointAddress = | ||
208 | fs_loop_sink_desc.bEndpointAddress; | ||
209 | f->hs_descriptors = hs_loopback_descs; | ||
210 | } | ||
211 | 208 | ||
212 | /* support super speed hardware */ | 209 | /* support super speed hardware */ |
213 | if (gadget_is_superspeed(c->cdev->gadget)) { | 210 | ss_loop_source_desc.bEndpointAddress = |
214 | ss_loop_source_desc.bEndpointAddress = | 211 | fs_loop_source_desc.bEndpointAddress; |
215 | fs_loop_source_desc.bEndpointAddress; | 212 | ss_loop_sink_desc.bEndpointAddress = fs_loop_sink_desc.bEndpointAddress; |
216 | ss_loop_sink_desc.bEndpointAddress = | 213 | |
217 | fs_loop_sink_desc.bEndpointAddress; | 214 | ret = usb_assign_descriptors(f, fs_loopback_descs, hs_loopback_descs, |
218 | f->ss_descriptors = ss_loopback_descs; | 215 | ss_loopback_descs); |
219 | } | 216 | if (ret) |
217 | return ret; | ||
220 | 218 | ||
221 | DBG(cdev, "%s speed %s: IN/%s, OUT/%s\n", | 219 | DBG(cdev, "%s speed %s: IN/%s, OUT/%s\n", |
222 | (gadget_is_superspeed(c->cdev->gadget) ? "super" : | 220 | (gadget_is_superspeed(c->cdev->gadget) ? "super" : |
@@ -228,6 +226,7 @@ autoconf_fail: | |||
228 | static void | 226 | static void |
229 | loopback_unbind(struct usb_configuration *c, struct usb_function *f) | 227 | loopback_unbind(struct usb_configuration *c, struct usb_function *f) |
230 | { | 228 | { |
229 | usb_free_all_descriptors(f); | ||
231 | kfree(func_to_loop(f)); | 230 | kfree(func_to_loop(f)); |
232 | } | 231 | } |
233 | 232 | ||
@@ -379,7 +378,6 @@ static int __init loopback_bind_config(struct usb_configuration *c) | |||
379 | return -ENOMEM; | 378 | return -ENOMEM; |
380 | 379 | ||
381 | loop->function.name = "loopback"; | 380 | loop->function.name = "loopback"; |
382 | loop->function.descriptors = fs_loopback_descs; | ||
383 | loop->function.bind = loopback_bind; | 381 | loop->function.bind = loopback_bind; |
384 | loop->function.unbind = loopback_unbind; | 382 | loop->function.unbind = loopback_unbind; |
385 | loop->function.set_alt = loopback_set_alt; | 383 | loop->function.set_alt = loopback_set_alt; |
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index 3a7668bde3ef..5d027b3e1ef0 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c | |||
@@ -228,10 +228,6 @@ | |||
228 | 228 | ||
229 | static const char fsg_string_interface[] = "Mass Storage"; | 229 | static const char fsg_string_interface[] = "Mass Storage"; |
230 | 230 | ||
231 | #define FSG_NO_DEVICE_STRINGS 1 | ||
232 | #define FSG_NO_OTG 1 | ||
233 | #define FSG_NO_INTR_EP 1 | ||
234 | |||
235 | #include "storage_common.c" | 231 | #include "storage_common.c" |
236 | 232 | ||
237 | 233 | ||
@@ -2904,9 +2900,7 @@ static void fsg_unbind(struct usb_configuration *c, struct usb_function *f) | |||
2904 | } | 2900 | } |
2905 | 2901 | ||
2906 | fsg_common_put(common); | 2902 | fsg_common_put(common); |
2907 | usb_free_descriptors(fsg->function.descriptors); | 2903 | usb_free_all_descriptors(&fsg->function); |
2908 | usb_free_descriptors(fsg->function.hs_descriptors); | ||
2909 | usb_free_descriptors(fsg->function.ss_descriptors); | ||
2910 | kfree(fsg); | 2904 | kfree(fsg); |
2911 | } | 2905 | } |
2912 | 2906 | ||
@@ -2916,6 +2910,8 @@ static int fsg_bind(struct usb_configuration *c, struct usb_function *f) | |||
2916 | struct usb_gadget *gadget = c->cdev->gadget; | 2910 | struct usb_gadget *gadget = c->cdev->gadget; |
2917 | int i; | 2911 | int i; |
2918 | struct usb_ep *ep; | 2912 | struct usb_ep *ep; |
2913 | unsigned max_burst; | ||
2914 | int ret; | ||
2919 | 2915 | ||
2920 | fsg->gadget = gadget; | 2916 | fsg->gadget = gadget; |
2921 | 2917 | ||
@@ -2939,45 +2935,27 @@ static int fsg_bind(struct usb_configuration *c, struct usb_function *f) | |||
2939 | ep->driver_data = fsg->common; /* claim the endpoint */ | 2935 | ep->driver_data = fsg->common; /* claim the endpoint */ |
2940 | fsg->bulk_out = ep; | 2936 | fsg->bulk_out = ep; |
2941 | 2937 | ||
2942 | /* Copy descriptors */ | 2938 | /* Assume endpoint addresses are the same for both speeds */ |
2943 | f->descriptors = usb_copy_descriptors(fsg_fs_function); | 2939 | fsg_hs_bulk_in_desc.bEndpointAddress = |
2944 | if (unlikely(!f->descriptors)) | 2940 | fsg_fs_bulk_in_desc.bEndpointAddress; |
2945 | return -ENOMEM; | 2941 | fsg_hs_bulk_out_desc.bEndpointAddress = |
2946 | 2942 | fsg_fs_bulk_out_desc.bEndpointAddress; | |
2947 | if (gadget_is_dualspeed(gadget)) { | ||
2948 | /* Assume endpoint addresses are the same for both speeds */ | ||
2949 | fsg_hs_bulk_in_desc.bEndpointAddress = | ||
2950 | fsg_fs_bulk_in_desc.bEndpointAddress; | ||
2951 | fsg_hs_bulk_out_desc.bEndpointAddress = | ||
2952 | fsg_fs_bulk_out_desc.bEndpointAddress; | ||
2953 | f->hs_descriptors = usb_copy_descriptors(fsg_hs_function); | ||
2954 | if (unlikely(!f->hs_descriptors)) { | ||
2955 | usb_free_descriptors(f->descriptors); | ||
2956 | return -ENOMEM; | ||
2957 | } | ||
2958 | } | ||
2959 | |||
2960 | if (gadget_is_superspeed(gadget)) { | ||
2961 | unsigned max_burst; | ||
2962 | 2943 | ||
2963 | /* Calculate bMaxBurst, we know packet size is 1024 */ | 2944 | /* Calculate bMaxBurst, we know packet size is 1024 */ |
2964 | max_burst = min_t(unsigned, FSG_BUFLEN / 1024, 15); | 2945 | max_burst = min_t(unsigned, FSG_BUFLEN / 1024, 15); |
2965 | 2946 | ||
2966 | fsg_ss_bulk_in_desc.bEndpointAddress = | 2947 | fsg_ss_bulk_in_desc.bEndpointAddress = |
2967 | fsg_fs_bulk_in_desc.bEndpointAddress; | 2948 | fsg_fs_bulk_in_desc.bEndpointAddress; |
2968 | fsg_ss_bulk_in_comp_desc.bMaxBurst = max_burst; | 2949 | fsg_ss_bulk_in_comp_desc.bMaxBurst = max_burst; |
2969 | 2950 | ||
2970 | fsg_ss_bulk_out_desc.bEndpointAddress = | 2951 | fsg_ss_bulk_out_desc.bEndpointAddress = |
2971 | fsg_fs_bulk_out_desc.bEndpointAddress; | 2952 | fsg_fs_bulk_out_desc.bEndpointAddress; |
2972 | fsg_ss_bulk_out_comp_desc.bMaxBurst = max_burst; | 2953 | fsg_ss_bulk_out_comp_desc.bMaxBurst = max_burst; |
2973 | 2954 | ||
2974 | f->ss_descriptors = usb_copy_descriptors(fsg_ss_function); | 2955 | ret = usb_assign_descriptors(f, fsg_fs_function, fsg_hs_function, |
2975 | if (unlikely(!f->ss_descriptors)) { | 2956 | fsg_ss_function); |
2976 | usb_free_descriptors(f->hs_descriptors); | 2957 | if (ret) |
2977 | usb_free_descriptors(f->descriptors); | 2958 | goto autoconf_fail; |
2978 | return -ENOMEM; | ||
2979 | } | ||
2980 | } | ||
2981 | 2959 | ||
2982 | return 0; | 2960 | return 0; |
2983 | 2961 | ||
@@ -2986,7 +2964,6 @@ autoconf_fail: | |||
2986 | return -ENOTSUPP; | 2964 | return -ENOTSUPP; |
2987 | } | 2965 | } |
2988 | 2966 | ||
2989 | |||
2990 | /****************************** ADD FUNCTION ******************************/ | 2967 | /****************************** ADD FUNCTION ******************************/ |
2991 | 2968 | ||
2992 | static struct usb_gadget_strings *fsg_strings_array[] = { | 2969 | static struct usb_gadget_strings *fsg_strings_array[] = { |
diff --git a/drivers/usb/gadget/f_midi.c b/drivers/usb/gadget/f_midi.c index 8ed1259fe80d..263e721c2694 100644 --- a/drivers/usb/gadget/f_midi.c +++ b/drivers/usb/gadget/f_midi.c | |||
@@ -414,7 +414,7 @@ static void f_midi_unbind(struct usb_configuration *c, struct usb_function *f) | |||
414 | kfree(midi->id); | 414 | kfree(midi->id); |
415 | midi->id = NULL; | 415 | midi->id = NULL; |
416 | 416 | ||
417 | usb_free_descriptors(f->descriptors); | 417 | usb_free_all_descriptors(f); |
418 | kfree(midi); | 418 | kfree(midi); |
419 | } | 419 | } |
420 | 420 | ||
@@ -881,19 +881,25 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) | |||
881 | * both speeds | 881 | * both speeds |
882 | */ | 882 | */ |
883 | /* copy descriptors, and track endpoint copies */ | 883 | /* copy descriptors, and track endpoint copies */ |
884 | f->fs_descriptors = usb_copy_descriptors(midi_function); | ||
885 | if (!f->fs_descriptors) | ||
886 | goto fail_f_midi; | ||
887 | |||
884 | if (gadget_is_dualspeed(c->cdev->gadget)) { | 888 | if (gadget_is_dualspeed(c->cdev->gadget)) { |
885 | c->highspeed = true; | ||
886 | bulk_in_desc.wMaxPacketSize = cpu_to_le16(512); | 889 | bulk_in_desc.wMaxPacketSize = cpu_to_le16(512); |
887 | bulk_out_desc.wMaxPacketSize = cpu_to_le16(512); | 890 | bulk_out_desc.wMaxPacketSize = cpu_to_le16(512); |
888 | f->hs_descriptors = usb_copy_descriptors(midi_function); | 891 | f->hs_descriptors = usb_copy_descriptors(midi_function); |
889 | } else { | 892 | if (!f->hs_descriptors) |
890 | f->descriptors = usb_copy_descriptors(midi_function); | 893 | goto fail_f_midi; |
891 | } | 894 | } |
892 | 895 | ||
893 | kfree(midi_function); | 896 | kfree(midi_function); |
894 | 897 | ||
895 | return 0; | 898 | return 0; |
896 | 899 | ||
900 | fail_f_midi: | ||
901 | kfree(midi_function); | ||
902 | usb_free_descriptors(f->hs_descriptors); | ||
897 | fail: | 903 | fail: |
898 | /* we might as well release our claims on endpoints */ | 904 | /* we might as well release our claims on endpoints */ |
899 | if (midi->out_ep) | 905 | if (midi->out_ep) |
diff --git a/drivers/usb/gadget/f_ncm.c b/drivers/usb/gadget/f_ncm.c index b651b529c67f..6c8362f937be 100644 --- a/drivers/usb/gadget/f_ncm.c +++ b/drivers/usb/gadget/f_ncm.c | |||
@@ -102,7 +102,7 @@ static inline unsigned ncm_bitrate(struct usb_gadget *g) | |||
102 | USB_CDC_NCM_NTB32_SUPPORTED) | 102 | USB_CDC_NCM_NTB32_SUPPORTED) |
103 | 103 | ||
104 | static struct usb_cdc_ncm_ntb_parameters ntb_parameters = { | 104 | static struct usb_cdc_ncm_ntb_parameters ntb_parameters = { |
105 | .wLength = sizeof ntb_parameters, | 105 | .wLength = cpu_to_le16(sizeof(ntb_parameters)), |
106 | .bmNtbFormatsSupported = cpu_to_le16(FORMATS_SUPPORTED), | 106 | .bmNtbFormatsSupported = cpu_to_le16(FORMATS_SUPPORTED), |
107 | .dwNtbInMaxSize = cpu_to_le32(NTB_DEFAULT_IN_SIZE), | 107 | .dwNtbInMaxSize = cpu_to_le32(NTB_DEFAULT_IN_SIZE), |
108 | .wNdpInDivisor = cpu_to_le16(4), | 108 | .wNdpInDivisor = cpu_to_le16(4), |
@@ -121,7 +121,7 @@ static struct usb_cdc_ncm_ntb_parameters ntb_parameters = { | |||
121 | * waste less bandwidth. | 121 | * waste less bandwidth. |
122 | */ | 122 | */ |
123 | 123 | ||
124 | #define LOG2_STATUS_INTERVAL_MSEC 5 /* 1 << 5 == 32 msec */ | 124 | #define NCM_STATUS_INTERVAL_MS 32 |
125 | #define NCM_STATUS_BYTECOUNT 16 /* 8 byte header + data */ | 125 | #define NCM_STATUS_BYTECOUNT 16 /* 8 byte header + data */ |
126 | 126 | ||
127 | static struct usb_interface_assoc_descriptor ncm_iad_desc __initdata = { | 127 | static struct usb_interface_assoc_descriptor ncm_iad_desc __initdata = { |
@@ -230,7 +230,7 @@ static struct usb_endpoint_descriptor fs_ncm_notify_desc __initdata = { | |||
230 | .bEndpointAddress = USB_DIR_IN, | 230 | .bEndpointAddress = USB_DIR_IN, |
231 | .bmAttributes = USB_ENDPOINT_XFER_INT, | 231 | .bmAttributes = USB_ENDPOINT_XFER_INT, |
232 | .wMaxPacketSize = cpu_to_le16(NCM_STATUS_BYTECOUNT), | 232 | .wMaxPacketSize = cpu_to_le16(NCM_STATUS_BYTECOUNT), |
233 | .bInterval = 1 << LOG2_STATUS_INTERVAL_MSEC, | 233 | .bInterval = NCM_STATUS_INTERVAL_MS, |
234 | }; | 234 | }; |
235 | 235 | ||
236 | static struct usb_endpoint_descriptor fs_ncm_in_desc __initdata = { | 236 | static struct usb_endpoint_descriptor fs_ncm_in_desc __initdata = { |
@@ -275,7 +275,7 @@ static struct usb_endpoint_descriptor hs_ncm_notify_desc __initdata = { | |||
275 | .bEndpointAddress = USB_DIR_IN, | 275 | .bEndpointAddress = USB_DIR_IN, |
276 | .bmAttributes = USB_ENDPOINT_XFER_INT, | 276 | .bmAttributes = USB_ENDPOINT_XFER_INT, |
277 | .wMaxPacketSize = cpu_to_le16(NCM_STATUS_BYTECOUNT), | 277 | .wMaxPacketSize = cpu_to_le16(NCM_STATUS_BYTECOUNT), |
278 | .bInterval = LOG2_STATUS_INTERVAL_MSEC + 4, | 278 | .bInterval = USB_MS_TO_HS_INTERVAL(NCM_STATUS_INTERVAL_MS), |
279 | }; | 279 | }; |
280 | static struct usb_endpoint_descriptor hs_ncm_in_desc __initdata = { | 280 | static struct usb_endpoint_descriptor hs_ncm_in_desc __initdata = { |
281 | .bLength = USB_DT_ENDPOINT_SIZE, | 281 | .bLength = USB_DT_ENDPOINT_SIZE, |
@@ -321,7 +321,7 @@ static struct usb_descriptor_header *ncm_hs_function[] __initdata = { | |||
321 | 321 | ||
322 | static struct usb_string ncm_string_defs[] = { | 322 | static struct usb_string ncm_string_defs[] = { |
323 | [STRING_CTRL_IDX].s = "CDC Network Control Model (NCM)", | 323 | [STRING_CTRL_IDX].s = "CDC Network Control Model (NCM)", |
324 | [STRING_MAC_IDX].s = NULL /* DYNAMIC */, | 324 | [STRING_MAC_IDX].s = "", |
325 | [STRING_DATA_IDX].s = "CDC Network Data", | 325 | [STRING_DATA_IDX].s = "CDC Network Data", |
326 | [STRING_IAD_IDX].s = "CDC NCM", | 326 | [STRING_IAD_IDX].s = "CDC NCM", |
327 | { } /* end of list */ | 327 | { } /* end of list */ |
@@ -869,15 +869,19 @@ static struct sk_buff *ncm_wrap_ntb(struct gether *port, | |||
869 | struct sk_buff *skb2; | 869 | struct sk_buff *skb2; |
870 | int ncb_len = 0; | 870 | int ncb_len = 0; |
871 | __le16 *tmp; | 871 | __le16 *tmp; |
872 | int div = ntb_parameters.wNdpInDivisor; | 872 | int div; |
873 | int rem = ntb_parameters.wNdpInPayloadRemainder; | 873 | int rem; |
874 | int pad; | 874 | int pad; |
875 | int ndp_align = ntb_parameters.wNdpInAlignment; | 875 | int ndp_align; |
876 | int ndp_pad; | 876 | int ndp_pad; |
877 | unsigned max_size = ncm->port.fixed_in_len; | 877 | unsigned max_size = ncm->port.fixed_in_len; |
878 | struct ndp_parser_opts *opts = ncm->parser_opts; | 878 | struct ndp_parser_opts *opts = ncm->parser_opts; |
879 | unsigned crc_len = ncm->is_crc ? sizeof(uint32_t) : 0; | 879 | unsigned crc_len = ncm->is_crc ? sizeof(uint32_t) : 0; |
880 | 880 | ||
881 | div = le16_to_cpu(ntb_parameters.wNdpInDivisor); | ||
882 | rem = le16_to_cpu(ntb_parameters.wNdpInPayloadRemainder); | ||
883 | ndp_align = le16_to_cpu(ntb_parameters.wNdpInAlignment); | ||
884 | |||
881 | ncb_len += opts->nth_size; | 885 | ncb_len += opts->nth_size; |
882 | ndp_pad = ALIGN(ncb_len, ndp_align) - ncb_len; | 886 | ndp_pad = ALIGN(ncb_len, ndp_align) - ncb_len; |
883 | ncb_len += ndp_pad; | 887 | ncb_len += ndp_pad; |
@@ -1208,30 +1212,18 @@ ncm_bind(struct usb_configuration *c, struct usb_function *f) | |||
1208 | ncm->notify_req->context = ncm; | 1212 | ncm->notify_req->context = ncm; |
1209 | ncm->notify_req->complete = ncm_notify_complete; | 1213 | ncm->notify_req->complete = ncm_notify_complete; |
1210 | 1214 | ||
1211 | /* copy descriptors, and track endpoint copies */ | ||
1212 | f->descriptors = usb_copy_descriptors(ncm_fs_function); | ||
1213 | if (!f->descriptors) | ||
1214 | goto fail; | ||
1215 | |||
1216 | /* | 1215 | /* |
1217 | * support all relevant hardware speeds... we expect that when | 1216 | * support all relevant hardware speeds... we expect that when |
1218 | * hardware is dual speed, all bulk-capable endpoints work at | 1217 | * hardware is dual speed, all bulk-capable endpoints work at |
1219 | * both speeds | 1218 | * both speeds |
1220 | */ | 1219 | */ |
1221 | if (gadget_is_dualspeed(c->cdev->gadget)) { | 1220 | hs_ncm_in_desc.bEndpointAddress = fs_ncm_in_desc.bEndpointAddress; |
1222 | hs_ncm_in_desc.bEndpointAddress = | 1221 | hs_ncm_out_desc.bEndpointAddress = fs_ncm_out_desc.bEndpointAddress; |
1223 | fs_ncm_in_desc.bEndpointAddress; | 1222 | hs_ncm_notify_desc.bEndpointAddress = |
1224 | hs_ncm_out_desc.bEndpointAddress = | 1223 | fs_ncm_notify_desc.bEndpointAddress; |
1225 | fs_ncm_out_desc.bEndpointAddress; | ||
1226 | hs_ncm_notify_desc.bEndpointAddress = | ||
1227 | fs_ncm_notify_desc.bEndpointAddress; | ||
1228 | |||
1229 | /* copy descriptors, and track endpoint copies */ | ||
1230 | f->hs_descriptors = usb_copy_descriptors(ncm_hs_function); | ||
1231 | if (!f->hs_descriptors) | ||
1232 | goto fail; | ||
1233 | } | ||
1234 | 1224 | ||
1225 | status = usb_assign_descriptors(f, ncm_fs_function, ncm_hs_function, | ||
1226 | NULL); | ||
1235 | /* | 1227 | /* |
1236 | * NOTE: all that is done without knowing or caring about | 1228 | * NOTE: all that is done without knowing or caring about |
1237 | * the network link ... which is unavailable to this code | 1229 | * the network link ... which is unavailable to this code |
@@ -1248,9 +1240,7 @@ ncm_bind(struct usb_configuration *c, struct usb_function *f) | |||
1248 | return 0; | 1240 | return 0; |
1249 | 1241 | ||
1250 | fail: | 1242 | fail: |
1251 | if (f->descriptors) | 1243 | usb_free_all_descriptors(f); |
1252 | usb_free_descriptors(f->descriptors); | ||
1253 | |||
1254 | if (ncm->notify_req) { | 1244 | if (ncm->notify_req) { |
1255 | kfree(ncm->notify_req->buf); | 1245 | kfree(ncm->notify_req->buf); |
1256 | usb_ep_free_request(ncm->notify, ncm->notify_req); | 1246 | usb_ep_free_request(ncm->notify, ncm->notify_req); |
@@ -1259,9 +1249,9 @@ fail: | |||
1259 | /* we might as well release our claims on endpoints */ | 1249 | /* we might as well release our claims on endpoints */ |
1260 | if (ncm->notify) | 1250 | if (ncm->notify) |
1261 | ncm->notify->driver_data = NULL; | 1251 | ncm->notify->driver_data = NULL; |
1262 | if (ncm->port.out_ep->desc) | 1252 | if (ncm->port.out_ep) |
1263 | ncm->port.out_ep->driver_data = NULL; | 1253 | ncm->port.out_ep->driver_data = NULL; |
1264 | if (ncm->port.in_ep->desc) | 1254 | if (ncm->port.in_ep) |
1265 | ncm->port.in_ep->driver_data = NULL; | 1255 | ncm->port.in_ep->driver_data = NULL; |
1266 | 1256 | ||
1267 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); | 1257 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); |
@@ -1276,14 +1266,12 @@ ncm_unbind(struct usb_configuration *c, struct usb_function *f) | |||
1276 | 1266 | ||
1277 | DBG(c->cdev, "ncm unbind\n"); | 1267 | DBG(c->cdev, "ncm unbind\n"); |
1278 | 1268 | ||
1279 | if (gadget_is_dualspeed(c->cdev->gadget)) | 1269 | ncm_string_defs[0].id = 0; |
1280 | usb_free_descriptors(f->hs_descriptors); | 1270 | usb_free_all_descriptors(f); |
1281 | usb_free_descriptors(f->descriptors); | ||
1282 | 1271 | ||
1283 | kfree(ncm->notify_req->buf); | 1272 | kfree(ncm->notify_req->buf); |
1284 | usb_ep_free_request(ncm->notify, ncm->notify_req); | 1273 | usb_ep_free_request(ncm->notify, ncm->notify_req); |
1285 | 1274 | ||
1286 | ncm_string_defs[1].s = NULL; | ||
1287 | kfree(ncm); | 1275 | kfree(ncm); |
1288 | } | 1276 | } |
1289 | 1277 | ||
@@ -1307,37 +1295,19 @@ int __init ncm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]) | |||
1307 | if (!can_support_ecm(c->cdev->gadget) || !ethaddr) | 1295 | if (!can_support_ecm(c->cdev->gadget) || !ethaddr) |
1308 | return -EINVAL; | 1296 | return -EINVAL; |
1309 | 1297 | ||
1310 | /* maybe allocate device-global string IDs */ | ||
1311 | if (ncm_string_defs[0].id == 0) { | 1298 | if (ncm_string_defs[0].id == 0) { |
1312 | 1299 | status = usb_string_ids_tab(c->cdev, ncm_string_defs); | |
1313 | /* control interface label */ | ||
1314 | status = usb_string_id(c->cdev); | ||
1315 | if (status < 0) | 1300 | if (status < 0) |
1316 | return status; | 1301 | return status; |
1317 | ncm_string_defs[STRING_CTRL_IDX].id = status; | 1302 | ncm_control_intf.iInterface = |
1318 | ncm_control_intf.iInterface = status; | 1303 | ncm_string_defs[STRING_CTRL_IDX].id; |
1319 | 1304 | ||
1320 | /* data interface label */ | 1305 | status = ncm_string_defs[STRING_DATA_IDX].id; |
1321 | status = usb_string_id(c->cdev); | ||
1322 | if (status < 0) | ||
1323 | return status; | ||
1324 | ncm_string_defs[STRING_DATA_IDX].id = status; | ||
1325 | ncm_data_nop_intf.iInterface = status; | 1306 | ncm_data_nop_intf.iInterface = status; |
1326 | ncm_data_intf.iInterface = status; | 1307 | ncm_data_intf.iInterface = status; |
1327 | 1308 | ||
1328 | /* MAC address */ | 1309 | ecm_desc.iMACAddress = ncm_string_defs[STRING_MAC_IDX].id; |
1329 | status = usb_string_id(c->cdev); | 1310 | ncm_iad_desc.iFunction = ncm_string_defs[STRING_IAD_IDX].id; |
1330 | if (status < 0) | ||
1331 | return status; | ||
1332 | ncm_string_defs[STRING_MAC_IDX].id = status; | ||
1333 | ecm_desc.iMACAddress = status; | ||
1334 | |||
1335 | /* IAD */ | ||
1336 | status = usb_string_id(c->cdev); | ||
1337 | if (status < 0) | ||
1338 | return status; | ||
1339 | ncm_string_defs[STRING_IAD_IDX].id = status; | ||
1340 | ncm_iad_desc.iFunction = status; | ||
1341 | } | 1311 | } |
1342 | 1312 | ||
1343 | /* allocate and initialize one new instance */ | 1313 | /* allocate and initialize one new instance */ |
@@ -1347,7 +1317,7 @@ int __init ncm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]) | |||
1347 | 1317 | ||
1348 | /* export host's Ethernet address in CDC format */ | 1318 | /* export host's Ethernet address in CDC format */ |
1349 | snprintf(ncm->ethaddr, sizeof ncm->ethaddr, "%pm", ethaddr); | 1319 | snprintf(ncm->ethaddr, sizeof ncm->ethaddr, "%pm", ethaddr); |
1350 | ncm_string_defs[1].s = ncm->ethaddr; | 1320 | ncm_string_defs[STRING_MAC_IDX].s = ncm->ethaddr; |
1351 | 1321 | ||
1352 | spin_lock_init(&ncm->lock); | 1322 | spin_lock_init(&ncm->lock); |
1353 | ncm_reset_values(ncm); | 1323 | ncm_reset_values(ncm); |
@@ -1367,9 +1337,7 @@ int __init ncm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]) | |||
1367 | ncm->port.unwrap = ncm_unwrap_ntb; | 1337 | ncm->port.unwrap = ncm_unwrap_ntb; |
1368 | 1338 | ||
1369 | status = usb_add_function(c, &ncm->port.func); | 1339 | status = usb_add_function(c, &ncm->port.func); |
1370 | if (status) { | 1340 | if (status) |
1371 | ncm_string_defs[1].s = NULL; | ||
1372 | kfree(ncm); | 1341 | kfree(ncm); |
1373 | } | ||
1374 | return status; | 1342 | return status; |
1375 | } | 1343 | } |
diff --git a/drivers/usb/gadget/f_obex.c b/drivers/usb/gadget/f_obex.c index 5f400f66aa9b..d8dd8782768c 100644 --- a/drivers/usb/gadget/f_obex.c +++ b/drivers/usb/gadget/f_obex.c | |||
@@ -331,23 +331,19 @@ obex_bind(struct usb_configuration *c, struct usb_function *f) | |||
331 | obex->port.out = ep; | 331 | obex->port.out = ep; |
332 | ep->driver_data = cdev; /* claim */ | 332 | ep->driver_data = cdev; /* claim */ |
333 | 333 | ||
334 | /* copy descriptors, and track endpoint copies */ | ||
335 | f->descriptors = usb_copy_descriptors(fs_function); | ||
336 | |||
337 | /* support all relevant hardware speeds... we expect that when | 334 | /* support all relevant hardware speeds... we expect that when |
338 | * hardware is dual speed, all bulk-capable endpoints work at | 335 | * hardware is dual speed, all bulk-capable endpoints work at |
339 | * both speeds | 336 | * both speeds |
340 | */ | 337 | */ |
341 | if (gadget_is_dualspeed(c->cdev->gadget)) { | ||
342 | 338 | ||
343 | obex_hs_ep_in_desc.bEndpointAddress = | 339 | obex_hs_ep_in_desc.bEndpointAddress = |
344 | obex_fs_ep_in_desc.bEndpointAddress; | 340 | obex_fs_ep_in_desc.bEndpointAddress; |
345 | obex_hs_ep_out_desc.bEndpointAddress = | 341 | obex_hs_ep_out_desc.bEndpointAddress = |
346 | obex_fs_ep_out_desc.bEndpointAddress; | 342 | obex_fs_ep_out_desc.bEndpointAddress; |
347 | 343 | ||
348 | /* copy descriptors, and track endpoint copies */ | 344 | status = usb_assign_descriptors(f, fs_function, hs_function, NULL); |
349 | f->hs_descriptors = usb_copy_descriptors(hs_function); | 345 | if (status) |
350 | } | 346 | goto fail; |
351 | 347 | ||
352 | /* Avoid letting this gadget enumerate until the userspace | 348 | /* Avoid letting this gadget enumerate until the userspace |
353 | * OBEX server is active. | 349 | * OBEX server is active. |
@@ -368,6 +364,7 @@ obex_bind(struct usb_configuration *c, struct usb_function *f) | |||
368 | return 0; | 364 | return 0; |
369 | 365 | ||
370 | fail: | 366 | fail: |
367 | usb_free_all_descriptors(f); | ||
371 | /* we might as well release our claims on endpoints */ | 368 | /* we might as well release our claims on endpoints */ |
372 | if (obex->port.out) | 369 | if (obex->port.out) |
373 | obex->port.out->driver_data = NULL; | 370 | obex->port.out->driver_data = NULL; |
@@ -382,9 +379,8 @@ fail: | |||
382 | static void | 379 | static void |
383 | obex_unbind(struct usb_configuration *c, struct usb_function *f) | 380 | obex_unbind(struct usb_configuration *c, struct usb_function *f) |
384 | { | 381 | { |
385 | if (gadget_is_dualspeed(c->cdev->gadget)) | 382 | obex_string_defs[OBEX_CTRL_IDX].id = 0; |
386 | usb_free_descriptors(f->hs_descriptors); | 383 | usb_free_all_descriptors(f); |
387 | usb_free_descriptors(f->descriptors); | ||
388 | kfree(func_to_obex(f)); | 384 | kfree(func_to_obex(f)); |
389 | } | 385 | } |
390 | 386 | ||
@@ -423,22 +419,16 @@ int __init obex_bind_config(struct usb_configuration *c, u8 port_num) | |||
423 | if (!can_support_obex(c)) | 419 | if (!can_support_obex(c)) |
424 | return -EINVAL; | 420 | return -EINVAL; |
425 | 421 | ||
426 | /* maybe allocate device-global string IDs, and patch descriptors */ | ||
427 | if (obex_string_defs[OBEX_CTRL_IDX].id == 0) { | 422 | if (obex_string_defs[OBEX_CTRL_IDX].id == 0) { |
428 | status = usb_string_id(c->cdev); | 423 | status = usb_string_ids_tab(c->cdev, obex_string_defs); |
429 | if (status < 0) | ||
430 | return status; | ||
431 | obex_string_defs[OBEX_CTRL_IDX].id = status; | ||
432 | |||
433 | obex_control_intf.iInterface = status; | ||
434 | |||
435 | status = usb_string_id(c->cdev); | ||
436 | if (status < 0) | 424 | if (status < 0) |
437 | return status; | 425 | return status; |
438 | obex_string_defs[OBEX_DATA_IDX].id = status; | 426 | obex_control_intf.iInterface = |
427 | obex_string_defs[OBEX_CTRL_IDX].id; | ||
439 | 428 | ||
440 | obex_data_nop_intf.iInterface = | 429 | status = obex_string_defs[OBEX_DATA_IDX].id; |
441 | obex_data_intf.iInterface = status; | 430 | obex_data_nop_intf.iInterface = status; |
431 | obex_data_intf.iInterface = status; | ||
442 | } | 432 | } |
443 | 433 | ||
444 | /* allocate and initialize one new instance */ | 434 | /* allocate and initialize one new instance */ |
diff --git a/drivers/usb/gadget/f_phonet.c b/drivers/usb/gadget/f_phonet.c index 8ee9268fe253..b21ab558b6c0 100644 --- a/drivers/usb/gadget/f_phonet.c +++ b/drivers/usb/gadget/f_phonet.c | |||
@@ -515,14 +515,14 @@ int pn_bind(struct usb_configuration *c, struct usb_function *f) | |||
515 | fp->in_ep = ep; | 515 | fp->in_ep = ep; |
516 | ep->driver_data = fp; /* Claim */ | 516 | ep->driver_data = fp; /* Claim */ |
517 | 517 | ||
518 | pn_hs_sink_desc.bEndpointAddress = | 518 | pn_hs_sink_desc.bEndpointAddress = pn_fs_sink_desc.bEndpointAddress; |
519 | pn_fs_sink_desc.bEndpointAddress; | 519 | pn_hs_source_desc.bEndpointAddress = pn_fs_source_desc.bEndpointAddress; |
520 | pn_hs_source_desc.bEndpointAddress = | ||
521 | pn_fs_source_desc.bEndpointAddress; | ||
522 | 520 | ||
523 | /* Do not try to bind Phonet twice... */ | 521 | /* Do not try to bind Phonet twice... */ |
524 | fp->function.descriptors = fs_pn_function; | 522 | status = usb_assign_descriptors(f, fs_pn_function, hs_pn_function, |
525 | fp->function.hs_descriptors = hs_pn_function; | 523 | NULL); |
524 | if (status) | ||
525 | goto err; | ||
526 | 526 | ||
527 | /* Incoming USB requests */ | 527 | /* Incoming USB requests */ |
528 | status = -ENOMEM; | 528 | status = -ENOMEM; |
@@ -531,7 +531,7 @@ int pn_bind(struct usb_configuration *c, struct usb_function *f) | |||
531 | 531 | ||
532 | req = usb_ep_alloc_request(fp->out_ep, GFP_KERNEL); | 532 | req = usb_ep_alloc_request(fp->out_ep, GFP_KERNEL); |
533 | if (!req) | 533 | if (!req) |
534 | goto err; | 534 | goto err_req; |
535 | 535 | ||
536 | req->complete = pn_rx_complete; | 536 | req->complete = pn_rx_complete; |
537 | fp->out_reqv[i] = req; | 537 | fp->out_reqv[i] = req; |
@@ -540,14 +540,18 @@ int pn_bind(struct usb_configuration *c, struct usb_function *f) | |||
540 | /* Outgoing USB requests */ | 540 | /* Outgoing USB requests */ |
541 | fp->in_req = usb_ep_alloc_request(fp->in_ep, GFP_KERNEL); | 541 | fp->in_req = usb_ep_alloc_request(fp->in_ep, GFP_KERNEL); |
542 | if (!fp->in_req) | 542 | if (!fp->in_req) |
543 | goto err; | 543 | goto err_req; |
544 | 544 | ||
545 | INFO(cdev, "USB CDC Phonet function\n"); | 545 | INFO(cdev, "USB CDC Phonet function\n"); |
546 | INFO(cdev, "using %s, OUT %s, IN %s\n", cdev->gadget->name, | 546 | INFO(cdev, "using %s, OUT %s, IN %s\n", cdev->gadget->name, |
547 | fp->out_ep->name, fp->in_ep->name); | 547 | fp->out_ep->name, fp->in_ep->name); |
548 | return 0; | 548 | return 0; |
549 | 549 | ||
550 | err_req: | ||
551 | for (i = 0; i < phonet_rxq_size && fp->out_reqv[i]; i++) | ||
552 | usb_ep_free_request(fp->out_ep, fp->out_reqv[i]); | ||
550 | err: | 553 | err: |
554 | usb_free_all_descriptors(f); | ||
551 | if (fp->out_ep) | 555 | if (fp->out_ep) |
552 | fp->out_ep->driver_data = NULL; | 556 | fp->out_ep->driver_data = NULL; |
553 | if (fp->in_ep) | 557 | if (fp->in_ep) |
@@ -569,6 +573,7 @@ pn_unbind(struct usb_configuration *c, struct usb_function *f) | |||
569 | if (fp->out_reqv[i]) | 573 | if (fp->out_reqv[i]) |
570 | usb_ep_free_request(fp->out_ep, fp->out_reqv[i]); | 574 | usb_ep_free_request(fp->out_ep, fp->out_reqv[i]); |
571 | 575 | ||
576 | usb_free_all_descriptors(f); | ||
572 | kfree(fp); | 577 | kfree(fp); |
573 | } | 578 | } |
574 | 579 | ||
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index b1681e45aca7..71beeb833558 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c | |||
@@ -101,7 +101,7 @@ static unsigned int bitrate(struct usb_gadget *g) | |||
101 | /* | 101 | /* |
102 | */ | 102 | */ |
103 | 103 | ||
104 | #define LOG2_STATUS_INTERVAL_MSEC 5 /* 1 << 5 == 32 msec */ | 104 | #define RNDIS_STATUS_INTERVAL_MS 32 |
105 | #define STATUS_BYTECOUNT 8 /* 8 bytes data */ | 105 | #define STATUS_BYTECOUNT 8 /* 8 bytes data */ |
106 | 106 | ||
107 | 107 | ||
@@ -190,7 +190,7 @@ static struct usb_endpoint_descriptor fs_notify_desc = { | |||
190 | .bEndpointAddress = USB_DIR_IN, | 190 | .bEndpointAddress = USB_DIR_IN, |
191 | .bmAttributes = USB_ENDPOINT_XFER_INT, | 191 | .bmAttributes = USB_ENDPOINT_XFER_INT, |
192 | .wMaxPacketSize = cpu_to_le16(STATUS_BYTECOUNT), | 192 | .wMaxPacketSize = cpu_to_le16(STATUS_BYTECOUNT), |
193 | .bInterval = 1 << LOG2_STATUS_INTERVAL_MSEC, | 193 | .bInterval = RNDIS_STATUS_INTERVAL_MS, |
194 | }; | 194 | }; |
195 | 195 | ||
196 | static struct usb_endpoint_descriptor fs_in_desc = { | 196 | static struct usb_endpoint_descriptor fs_in_desc = { |
@@ -236,7 +236,7 @@ static struct usb_endpoint_descriptor hs_notify_desc = { | |||
236 | .bEndpointAddress = USB_DIR_IN, | 236 | .bEndpointAddress = USB_DIR_IN, |
237 | .bmAttributes = USB_ENDPOINT_XFER_INT, | 237 | .bmAttributes = USB_ENDPOINT_XFER_INT, |
238 | .wMaxPacketSize = cpu_to_le16(STATUS_BYTECOUNT), | 238 | .wMaxPacketSize = cpu_to_le16(STATUS_BYTECOUNT), |
239 | .bInterval = LOG2_STATUS_INTERVAL_MSEC + 4, | 239 | .bInterval = USB_MS_TO_HS_INTERVAL(RNDIS_STATUS_INTERVAL_MS) |
240 | }; | 240 | }; |
241 | 241 | ||
242 | static struct usb_endpoint_descriptor hs_in_desc = { | 242 | static struct usb_endpoint_descriptor hs_in_desc = { |
@@ -284,7 +284,7 @@ static struct usb_endpoint_descriptor ss_notify_desc = { | |||
284 | .bEndpointAddress = USB_DIR_IN, | 284 | .bEndpointAddress = USB_DIR_IN, |
285 | .bmAttributes = USB_ENDPOINT_XFER_INT, | 285 | .bmAttributes = USB_ENDPOINT_XFER_INT, |
286 | .wMaxPacketSize = cpu_to_le16(STATUS_BYTECOUNT), | 286 | .wMaxPacketSize = cpu_to_le16(STATUS_BYTECOUNT), |
287 | .bInterval = LOG2_STATUS_INTERVAL_MSEC + 4, | 287 | .bInterval = USB_MS_TO_HS_INTERVAL(RNDIS_STATUS_INTERVAL_MS) |
288 | }; | 288 | }; |
289 | 289 | ||
290 | static struct usb_ss_ep_comp_descriptor ss_intr_comp_desc = { | 290 | static struct usb_ss_ep_comp_descriptor ss_intr_comp_desc = { |
@@ -722,42 +722,22 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f) | |||
722 | rndis->notify_req->context = rndis; | 722 | rndis->notify_req->context = rndis; |
723 | rndis->notify_req->complete = rndis_response_complete; | 723 | rndis->notify_req->complete = rndis_response_complete; |
724 | 724 | ||
725 | /* copy descriptors, and track endpoint copies */ | ||
726 | f->descriptors = usb_copy_descriptors(eth_fs_function); | ||
727 | if (!f->descriptors) | ||
728 | goto fail; | ||
729 | |||
730 | /* support all relevant hardware speeds... we expect that when | 725 | /* support all relevant hardware speeds... we expect that when |
731 | * hardware is dual speed, all bulk-capable endpoints work at | 726 | * hardware is dual speed, all bulk-capable endpoints work at |
732 | * both speeds | 727 | * both speeds |
733 | */ | 728 | */ |
734 | if (gadget_is_dualspeed(c->cdev->gadget)) { | 729 | hs_in_desc.bEndpointAddress = fs_in_desc.bEndpointAddress; |
735 | hs_in_desc.bEndpointAddress = | 730 | hs_out_desc.bEndpointAddress = fs_out_desc.bEndpointAddress; |
736 | fs_in_desc.bEndpointAddress; | 731 | hs_notify_desc.bEndpointAddress = fs_notify_desc.bEndpointAddress; |
737 | hs_out_desc.bEndpointAddress = | ||
738 | fs_out_desc.bEndpointAddress; | ||
739 | hs_notify_desc.bEndpointAddress = | ||
740 | fs_notify_desc.bEndpointAddress; | ||
741 | |||
742 | /* copy descriptors, and track endpoint copies */ | ||
743 | f->hs_descriptors = usb_copy_descriptors(eth_hs_function); | ||
744 | if (!f->hs_descriptors) | ||
745 | goto fail; | ||
746 | } | ||
747 | 732 | ||
748 | if (gadget_is_superspeed(c->cdev->gadget)) { | 733 | ss_in_desc.bEndpointAddress = fs_in_desc.bEndpointAddress; |
749 | ss_in_desc.bEndpointAddress = | 734 | ss_out_desc.bEndpointAddress = fs_out_desc.bEndpointAddress; |
750 | fs_in_desc.bEndpointAddress; | 735 | ss_notify_desc.bEndpointAddress = fs_notify_desc.bEndpointAddress; |
751 | ss_out_desc.bEndpointAddress = | 736 | |
752 | fs_out_desc.bEndpointAddress; | 737 | status = usb_assign_descriptors(f, eth_fs_function, eth_hs_function, |
753 | ss_notify_desc.bEndpointAddress = | 738 | eth_ss_function); |
754 | fs_notify_desc.bEndpointAddress; | 739 | if (status) |
755 | 740 | goto fail; | |
756 | /* copy descriptors, and track endpoint copies */ | ||
757 | f->ss_descriptors = usb_copy_descriptors(eth_ss_function); | ||
758 | if (!f->ss_descriptors) | ||
759 | goto fail; | ||
760 | } | ||
761 | 741 | ||
762 | rndis->port.open = rndis_open; | 742 | rndis->port.open = rndis_open; |
763 | rndis->port.close = rndis_close; | 743 | rndis->port.close = rndis_close; |
@@ -788,12 +768,7 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f) | |||
788 | return 0; | 768 | return 0; |
789 | 769 | ||
790 | fail: | 770 | fail: |
791 | if (gadget_is_superspeed(c->cdev->gadget) && f->ss_descriptors) | 771 | usb_free_all_descriptors(f); |
792 | usb_free_descriptors(f->ss_descriptors); | ||
793 | if (gadget_is_dualspeed(c->cdev->gadget) && f->hs_descriptors) | ||
794 | usb_free_descriptors(f->hs_descriptors); | ||
795 | if (f->descriptors) | ||
796 | usb_free_descriptors(f->descriptors); | ||
797 | 772 | ||
798 | if (rndis->notify_req) { | 773 | if (rndis->notify_req) { |
799 | kfree(rndis->notify_req->buf); | 774 | kfree(rndis->notify_req->buf); |
@@ -803,9 +778,9 @@ fail: | |||
803 | /* we might as well release our claims on endpoints */ | 778 | /* we might as well release our claims on endpoints */ |
804 | if (rndis->notify) | 779 | if (rndis->notify) |
805 | rndis->notify->driver_data = NULL; | 780 | rndis->notify->driver_data = NULL; |
806 | if (rndis->port.out_ep->desc) | 781 | if (rndis->port.out_ep) |
807 | rndis->port.out_ep->driver_data = NULL; | 782 | rndis->port.out_ep->driver_data = NULL; |
808 | if (rndis->port.in_ep->desc) | 783 | if (rndis->port.in_ep) |
809 | rndis->port.in_ep->driver_data = NULL; | 784 | rndis->port.in_ep->driver_data = NULL; |
810 | 785 | ||
811 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); | 786 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); |
@@ -820,13 +795,9 @@ rndis_unbind(struct usb_configuration *c, struct usb_function *f) | |||
820 | 795 | ||
821 | rndis_deregister(rndis->config); | 796 | rndis_deregister(rndis->config); |
822 | rndis_exit(); | 797 | rndis_exit(); |
823 | rndis_string_defs[0].id = 0; | ||
824 | 798 | ||
825 | if (gadget_is_superspeed(c->cdev->gadget)) | 799 | rndis_string_defs[0].id = 0; |
826 | usb_free_descriptors(f->ss_descriptors); | 800 | usb_free_all_descriptors(f); |
827 | if (gadget_is_dualspeed(c->cdev->gadget)) | ||
828 | usb_free_descriptors(f->hs_descriptors); | ||
829 | usb_free_descriptors(f->descriptors); | ||
830 | 801 | ||
831 | kfree(rndis->notify_req->buf); | 802 | kfree(rndis->notify_req->buf); |
832 | usb_ep_free_request(rndis->notify, rndis->notify_req); | 803 | usb_ep_free_request(rndis->notify, rndis->notify_req); |
@@ -851,34 +822,19 @@ rndis_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], | |||
851 | if (!can_support_rndis(c) || !ethaddr) | 822 | if (!can_support_rndis(c) || !ethaddr) |
852 | return -EINVAL; | 823 | return -EINVAL; |
853 | 824 | ||
854 | /* maybe allocate device-global string IDs */ | ||
855 | if (rndis_string_defs[0].id == 0) { | 825 | if (rndis_string_defs[0].id == 0) { |
856 | |||
857 | /* ... and setup RNDIS itself */ | 826 | /* ... and setup RNDIS itself */ |
858 | status = rndis_init(); | 827 | status = rndis_init(); |
859 | if (status < 0) | 828 | if (status < 0) |
860 | return status; | 829 | return status; |
861 | 830 | ||
862 | /* control interface label */ | 831 | status = usb_string_ids_tab(c->cdev, rndis_string_defs); |
863 | status = usb_string_id(c->cdev); | 832 | if (status) |
864 | if (status < 0) | ||
865 | return status; | 833 | return status; |
866 | rndis_string_defs[0].id = status; | ||
867 | rndis_control_intf.iInterface = status; | ||
868 | 834 | ||
869 | /* data interface label */ | 835 | rndis_control_intf.iInterface = rndis_string_defs[0].id; |
870 | status = usb_string_id(c->cdev); | 836 | rndis_data_intf.iInterface = rndis_string_defs[1].id; |
871 | if (status < 0) | 837 | rndis_iad_descriptor.iFunction = rndis_string_defs[2].id; |
872 | return status; | ||
873 | rndis_string_defs[1].id = status; | ||
874 | rndis_data_intf.iInterface = status; | ||
875 | |||
876 | /* IAD iFunction label */ | ||
877 | status = usb_string_id(c->cdev); | ||
878 | if (status < 0) | ||
879 | return status; | ||
880 | rndis_string_defs[2].id = status; | ||
881 | rndis_iad_descriptor.iFunction = status; | ||
882 | } | 838 | } |
883 | 839 | ||
884 | /* allocate and initialize one new instance */ | 840 | /* allocate and initialize one new instance */ |
diff --git a/drivers/usb/gadget/f_serial.c b/drivers/usb/gadget/f_serial.c index 07197d63d9b1..98fa7795df5f 100644 --- a/drivers/usb/gadget/f_serial.c +++ b/drivers/usb/gadget/f_serial.c | |||
@@ -213,34 +213,20 @@ gser_bind(struct usb_configuration *c, struct usb_function *f) | |||
213 | gser->port.out = ep; | 213 | gser->port.out = ep; |
214 | ep->driver_data = cdev; /* claim */ | 214 | ep->driver_data = cdev; /* claim */ |
215 | 215 | ||
216 | /* copy descriptors, and track endpoint copies */ | ||
217 | f->descriptors = usb_copy_descriptors(gser_fs_function); | ||
218 | |||
219 | /* support all relevant hardware speeds... we expect that when | 216 | /* support all relevant hardware speeds... we expect that when |
220 | * hardware is dual speed, all bulk-capable endpoints work at | 217 | * hardware is dual speed, all bulk-capable endpoints work at |
221 | * both speeds | 218 | * both speeds |
222 | */ | 219 | */ |
223 | if (gadget_is_dualspeed(c->cdev->gadget)) { | 220 | gser_hs_in_desc.bEndpointAddress = gser_fs_in_desc.bEndpointAddress; |
224 | gser_hs_in_desc.bEndpointAddress = | 221 | gser_hs_out_desc.bEndpointAddress = gser_fs_out_desc.bEndpointAddress; |
225 | gser_fs_in_desc.bEndpointAddress; | ||
226 | gser_hs_out_desc.bEndpointAddress = | ||
227 | gser_fs_out_desc.bEndpointAddress; | ||
228 | |||
229 | /* copy descriptors, and track endpoint copies */ | ||
230 | f->hs_descriptors = usb_copy_descriptors(gser_hs_function); | ||
231 | } | ||
232 | if (gadget_is_superspeed(c->cdev->gadget)) { | ||
233 | gser_ss_in_desc.bEndpointAddress = | ||
234 | gser_fs_in_desc.bEndpointAddress; | ||
235 | gser_ss_out_desc.bEndpointAddress = | ||
236 | gser_fs_out_desc.bEndpointAddress; | ||
237 | |||
238 | /* copy descriptors, and track endpoint copies */ | ||
239 | f->ss_descriptors = usb_copy_descriptors(gser_ss_function); | ||
240 | if (!f->ss_descriptors) | ||
241 | goto fail; | ||
242 | } | ||
243 | 222 | ||
223 | gser_ss_in_desc.bEndpointAddress = gser_fs_in_desc.bEndpointAddress; | ||
224 | gser_ss_out_desc.bEndpointAddress = gser_fs_out_desc.bEndpointAddress; | ||
225 | |||
226 | status = usb_assign_descriptors(f, gser_fs_function, gser_hs_function, | ||
227 | gser_ss_function); | ||
228 | if (status) | ||
229 | goto fail; | ||
244 | DBG(cdev, "generic ttyGS%d: %s speed IN/%s OUT/%s\n", | 230 | DBG(cdev, "generic ttyGS%d: %s speed IN/%s OUT/%s\n", |
245 | gser->port_num, | 231 | gser->port_num, |
246 | gadget_is_superspeed(c->cdev->gadget) ? "super" : | 232 | gadget_is_superspeed(c->cdev->gadget) ? "super" : |
@@ -263,11 +249,7 @@ fail: | |||
263 | static void | 249 | static void |
264 | gser_unbind(struct usb_configuration *c, struct usb_function *f) | 250 | gser_unbind(struct usb_configuration *c, struct usb_function *f) |
265 | { | 251 | { |
266 | if (gadget_is_dualspeed(c->cdev->gadget)) | 252 | usb_free_all_descriptors(f); |
267 | usb_free_descriptors(f->hs_descriptors); | ||
268 | if (gadget_is_superspeed(c->cdev->gadget)) | ||
269 | usb_free_descriptors(f->ss_descriptors); | ||
270 | usb_free_descriptors(f->descriptors); | ||
271 | kfree(func_to_gser(f)); | 253 | kfree(func_to_gser(f)); |
272 | } | 254 | } |
273 | 255 | ||
diff --git a/drivers/usb/gadget/f_sourcesink.c b/drivers/usb/gadget/f_sourcesink.c index 3c126fde6e7e..102d49beb9df 100644 --- a/drivers/usb/gadget/f_sourcesink.c +++ b/drivers/usb/gadget/f_sourcesink.c | |||
@@ -319,6 +319,7 @@ sourcesink_bind(struct usb_configuration *c, struct usb_function *f) | |||
319 | struct usb_composite_dev *cdev = c->cdev; | 319 | struct usb_composite_dev *cdev = c->cdev; |
320 | struct f_sourcesink *ss = func_to_ss(f); | 320 | struct f_sourcesink *ss = func_to_ss(f); |
321 | int id; | 321 | int id; |
322 | int ret; | ||
322 | 323 | ||
323 | /* allocate interface ID(s) */ | 324 | /* allocate interface ID(s) */ |
324 | id = usb_interface_id(c, f); | 325 | id = usb_interface_id(c, f); |
@@ -387,64 +388,57 @@ no_iso: | |||
387 | isoc_maxpacket = 1024; | 388 | isoc_maxpacket = 1024; |
388 | 389 | ||
389 | /* support high speed hardware */ | 390 | /* support high speed hardware */ |
390 | if (gadget_is_dualspeed(c->cdev->gadget)) { | 391 | hs_source_desc.bEndpointAddress = fs_source_desc.bEndpointAddress; |
391 | hs_source_desc.bEndpointAddress = | 392 | hs_sink_desc.bEndpointAddress = fs_sink_desc.bEndpointAddress; |
392 | fs_source_desc.bEndpointAddress; | ||
393 | hs_sink_desc.bEndpointAddress = | ||
394 | fs_sink_desc.bEndpointAddress; | ||
395 | 393 | ||
396 | /* | 394 | /* |
397 | * Fill in the HS isoc descriptors from the module parameters. | 395 | * Fill in the HS isoc descriptors from the module parameters. |
398 | * We assume that the user knows what they are doing and won't | 396 | * We assume that the user knows what they are doing and won't |
399 | * give parameters that their UDC doesn't support. | 397 | * give parameters that their UDC doesn't support. |
400 | */ | 398 | */ |
401 | hs_iso_source_desc.wMaxPacketSize = isoc_maxpacket; | 399 | hs_iso_source_desc.wMaxPacketSize = isoc_maxpacket; |
402 | hs_iso_source_desc.wMaxPacketSize |= isoc_mult << 11; | 400 | hs_iso_source_desc.wMaxPacketSize |= isoc_mult << 11; |
403 | hs_iso_source_desc.bInterval = isoc_interval; | 401 | hs_iso_source_desc.bInterval = isoc_interval; |
404 | hs_iso_source_desc.bEndpointAddress = | 402 | hs_iso_source_desc.bEndpointAddress = |
405 | fs_iso_source_desc.bEndpointAddress; | 403 | fs_iso_source_desc.bEndpointAddress; |
406 | 404 | ||
407 | hs_iso_sink_desc.wMaxPacketSize = isoc_maxpacket; | 405 | hs_iso_sink_desc.wMaxPacketSize = isoc_maxpacket; |
408 | hs_iso_sink_desc.wMaxPacketSize |= isoc_mult << 11; | 406 | hs_iso_sink_desc.wMaxPacketSize |= isoc_mult << 11; |
409 | hs_iso_sink_desc.bInterval = isoc_interval; | 407 | hs_iso_sink_desc.bInterval = isoc_interval; |
410 | hs_iso_sink_desc.bEndpointAddress = | 408 | hs_iso_sink_desc.bEndpointAddress = fs_iso_sink_desc.bEndpointAddress; |
411 | fs_iso_sink_desc.bEndpointAddress; | ||
412 | |||
413 | f->hs_descriptors = hs_source_sink_descs; | ||
414 | } | ||
415 | 409 | ||
416 | /* support super speed hardware */ | 410 | /* support super speed hardware */ |
417 | if (gadget_is_superspeed(c->cdev->gadget)) { | 411 | ss_source_desc.bEndpointAddress = |
418 | ss_source_desc.bEndpointAddress = | 412 | fs_source_desc.bEndpointAddress; |
419 | fs_source_desc.bEndpointAddress; | 413 | ss_sink_desc.bEndpointAddress = |
420 | ss_sink_desc.bEndpointAddress = | 414 | fs_sink_desc.bEndpointAddress; |
421 | fs_sink_desc.bEndpointAddress; | ||
422 | 415 | ||
423 | /* | 416 | /* |
424 | * Fill in the SS isoc descriptors from the module parameters. | 417 | * Fill in the SS isoc descriptors from the module parameters. |
425 | * We assume that the user knows what they are doing and won't | 418 | * We assume that the user knows what they are doing and won't |
426 | * give parameters that their UDC doesn't support. | 419 | * give parameters that their UDC doesn't support. |
427 | */ | 420 | */ |
428 | ss_iso_source_desc.wMaxPacketSize = isoc_maxpacket; | 421 | ss_iso_source_desc.wMaxPacketSize = isoc_maxpacket; |
429 | ss_iso_source_desc.bInterval = isoc_interval; | 422 | ss_iso_source_desc.bInterval = isoc_interval; |
430 | ss_iso_source_comp_desc.bmAttributes = isoc_mult; | 423 | ss_iso_source_comp_desc.bmAttributes = isoc_mult; |
431 | ss_iso_source_comp_desc.bMaxBurst = isoc_maxburst; | 424 | ss_iso_source_comp_desc.bMaxBurst = isoc_maxburst; |
432 | ss_iso_source_comp_desc.wBytesPerInterval = | 425 | ss_iso_source_comp_desc.wBytesPerInterval = |
433 | isoc_maxpacket * (isoc_mult + 1) * (isoc_maxburst + 1); | 426 | isoc_maxpacket * (isoc_mult + 1) * (isoc_maxburst + 1); |
434 | ss_iso_source_desc.bEndpointAddress = | 427 | ss_iso_source_desc.bEndpointAddress = |
435 | fs_iso_source_desc.bEndpointAddress; | 428 | fs_iso_source_desc.bEndpointAddress; |
436 | 429 | ||
437 | ss_iso_sink_desc.wMaxPacketSize = isoc_maxpacket; | 430 | ss_iso_sink_desc.wMaxPacketSize = isoc_maxpacket; |
438 | ss_iso_sink_desc.bInterval = isoc_interval; | 431 | ss_iso_sink_desc.bInterval = isoc_interval; |
439 | ss_iso_sink_comp_desc.bmAttributes = isoc_mult; | 432 | ss_iso_sink_comp_desc.bmAttributes = isoc_mult; |
440 | ss_iso_sink_comp_desc.bMaxBurst = isoc_maxburst; | 433 | ss_iso_sink_comp_desc.bMaxBurst = isoc_maxburst; |
441 | ss_iso_sink_comp_desc.wBytesPerInterval = | 434 | ss_iso_sink_comp_desc.wBytesPerInterval = |
442 | isoc_maxpacket * (isoc_mult + 1) * (isoc_maxburst + 1); | 435 | isoc_maxpacket * (isoc_mult + 1) * (isoc_maxburst + 1); |
443 | ss_iso_sink_desc.bEndpointAddress = | 436 | ss_iso_sink_desc.bEndpointAddress = fs_iso_sink_desc.bEndpointAddress; |
444 | fs_iso_sink_desc.bEndpointAddress; | 437 | |
445 | 438 | ret = usb_assign_descriptors(f, fs_source_sink_descs, | |
446 | f->ss_descriptors = ss_source_sink_descs; | 439 | hs_source_sink_descs, ss_source_sink_descs); |
447 | } | 440 | if (ret) |
441 | return ret; | ||
448 | 442 | ||
449 | DBG(cdev, "%s speed %s: IN/%s, OUT/%s, ISO-IN/%s, ISO-OUT/%s\n", | 443 | DBG(cdev, "%s speed %s: IN/%s, OUT/%s, ISO-IN/%s, ISO-OUT/%s\n", |
450 | (gadget_is_superspeed(c->cdev->gadget) ? "super" : | 444 | (gadget_is_superspeed(c->cdev->gadget) ? "super" : |
@@ -458,6 +452,7 @@ no_iso: | |||
458 | static void | 452 | static void |
459 | sourcesink_unbind(struct usb_configuration *c, struct usb_function *f) | 453 | sourcesink_unbind(struct usb_configuration *c, struct usb_function *f) |
460 | { | 454 | { |
455 | usb_free_all_descriptors(f); | ||
461 | kfree(func_to_ss(f)); | 456 | kfree(func_to_ss(f)); |
462 | } | 457 | } |
463 | 458 | ||
@@ -773,7 +768,6 @@ static int __init sourcesink_bind_config(struct usb_configuration *c) | |||
773 | return -ENOMEM; | 768 | return -ENOMEM; |
774 | 769 | ||
775 | ss->function.name = "source/sink"; | 770 | ss->function.name = "source/sink"; |
776 | ss->function.descriptors = fs_source_sink_descs; | ||
777 | ss->function.bind = sourcesink_bind; | 771 | ss->function.bind = sourcesink_bind; |
778 | ss->function.unbind = sourcesink_unbind; | 772 | ss->function.unbind = sourcesink_unbind; |
779 | ss->function.set_alt = sourcesink_set_alt; | 773 | ss->function.set_alt = sourcesink_set_alt; |
diff --git a/drivers/usb/gadget/f_subset.c b/drivers/usb/gadget/f_subset.c index 4060c0bd9785..f172bd152fbb 100644 --- a/drivers/usb/gadget/f_subset.c +++ b/drivers/usb/gadget/f_subset.c | |||
@@ -236,7 +236,7 @@ static struct usb_descriptor_header *ss_eth_function[] = { | |||
236 | 236 | ||
237 | static struct usb_string geth_string_defs[] = { | 237 | static struct usb_string geth_string_defs[] = { |
238 | [0].s = "CDC Ethernet Subset/SAFE", | 238 | [0].s = "CDC Ethernet Subset/SAFE", |
239 | [1].s = NULL /* DYNAMIC */, | 239 | [1].s = "", |
240 | { } /* end of list */ | 240 | { } /* end of list */ |
241 | }; | 241 | }; |
242 | 242 | ||
@@ -319,38 +319,22 @@ geth_bind(struct usb_configuration *c, struct usb_function *f) | |||
319 | geth->port.out_ep = ep; | 319 | geth->port.out_ep = ep; |
320 | ep->driver_data = cdev; /* claim */ | 320 | ep->driver_data = cdev; /* claim */ |
321 | 321 | ||
322 | /* copy descriptors, and track endpoint copies */ | ||
323 | f->descriptors = usb_copy_descriptors(fs_eth_function); | ||
324 | if (!f->descriptors) | ||
325 | goto fail; | ||
326 | |||
327 | /* support all relevant hardware speeds... we expect that when | 322 | /* support all relevant hardware speeds... we expect that when |
328 | * hardware is dual speed, all bulk-capable endpoints work at | 323 | * hardware is dual speed, all bulk-capable endpoints work at |
329 | * both speeds | 324 | * both speeds |
330 | */ | 325 | */ |
331 | if (gadget_is_dualspeed(c->cdev->gadget)) { | 326 | hs_subset_in_desc.bEndpointAddress = fs_subset_in_desc.bEndpointAddress; |
332 | hs_subset_in_desc.bEndpointAddress = | 327 | hs_subset_out_desc.bEndpointAddress = |
333 | fs_subset_in_desc.bEndpointAddress; | 328 | fs_subset_out_desc.bEndpointAddress; |
334 | hs_subset_out_desc.bEndpointAddress = | ||
335 | fs_subset_out_desc.bEndpointAddress; | ||
336 | |||
337 | /* copy descriptors, and track endpoint copies */ | ||
338 | f->hs_descriptors = usb_copy_descriptors(hs_eth_function); | ||
339 | if (!f->hs_descriptors) | ||
340 | goto fail; | ||
341 | } | ||
342 | 329 | ||
343 | if (gadget_is_superspeed(c->cdev->gadget)) { | 330 | ss_subset_in_desc.bEndpointAddress = fs_subset_in_desc.bEndpointAddress; |
344 | ss_subset_in_desc.bEndpointAddress = | 331 | ss_subset_out_desc.bEndpointAddress = |
345 | fs_subset_in_desc.bEndpointAddress; | 332 | fs_subset_out_desc.bEndpointAddress; |
346 | ss_subset_out_desc.bEndpointAddress = | ||
347 | fs_subset_out_desc.bEndpointAddress; | ||
348 | 333 | ||
349 | /* copy descriptors, and track endpoint copies */ | 334 | status = usb_assign_descriptors(f, fs_eth_function, hs_eth_function, |
350 | f->ss_descriptors = usb_copy_descriptors(ss_eth_function); | 335 | ss_eth_function); |
351 | if (!f->ss_descriptors) | 336 | if (status) |
352 | goto fail; | 337 | goto fail; |
353 | } | ||
354 | 338 | ||
355 | /* NOTE: all that is done without knowing or caring about | 339 | /* NOTE: all that is done without knowing or caring about |
356 | * the network link ... which is unavailable to this code | 340 | * the network link ... which is unavailable to this code |
@@ -364,15 +348,11 @@ geth_bind(struct usb_configuration *c, struct usb_function *f) | |||
364 | return 0; | 348 | return 0; |
365 | 349 | ||
366 | fail: | 350 | fail: |
367 | if (f->descriptors) | 351 | usb_free_all_descriptors(f); |
368 | usb_free_descriptors(f->descriptors); | ||
369 | if (f->hs_descriptors) | ||
370 | usb_free_descriptors(f->hs_descriptors); | ||
371 | |||
372 | /* we might as well release our claims on endpoints */ | 352 | /* we might as well release our claims on endpoints */ |
373 | if (geth->port.out_ep->desc) | 353 | if (geth->port.out_ep) |
374 | geth->port.out_ep->driver_data = NULL; | 354 | geth->port.out_ep->driver_data = NULL; |
375 | if (geth->port.in_ep->desc) | 355 | if (geth->port.in_ep) |
376 | geth->port.in_ep->driver_data = NULL; | 356 | geth->port.in_ep->driver_data = NULL; |
377 | 357 | ||
378 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); | 358 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); |
@@ -383,12 +363,8 @@ fail: | |||
383 | static void | 363 | static void |
384 | geth_unbind(struct usb_configuration *c, struct usb_function *f) | 364 | geth_unbind(struct usb_configuration *c, struct usb_function *f) |
385 | { | 365 | { |
386 | if (gadget_is_superspeed(c->cdev->gadget)) | 366 | geth_string_defs[0].id = 0; |
387 | usb_free_descriptors(f->ss_descriptors); | 367 | usb_free_all_descriptors(f); |
388 | if (gadget_is_dualspeed(c->cdev->gadget)) | ||
389 | usb_free_descriptors(f->hs_descriptors); | ||
390 | usb_free_descriptors(f->descriptors); | ||
391 | geth_string_defs[1].s = NULL; | ||
392 | kfree(func_to_geth(f)); | 368 | kfree(func_to_geth(f)); |
393 | } | 369 | } |
394 | 370 | ||
@@ -414,20 +390,11 @@ int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]) | |||
414 | 390 | ||
415 | /* maybe allocate device-global string IDs */ | 391 | /* maybe allocate device-global string IDs */ |
416 | if (geth_string_defs[0].id == 0) { | 392 | if (geth_string_defs[0].id == 0) { |
417 | 393 | status = usb_string_ids_tab(c->cdev, geth_string_defs); | |
418 | /* interface label */ | ||
419 | status = usb_string_id(c->cdev); | ||
420 | if (status < 0) | 394 | if (status < 0) |
421 | return status; | 395 | return status; |
422 | geth_string_defs[0].id = status; | 396 | subset_data_intf.iInterface = geth_string_defs[0].id; |
423 | subset_data_intf.iInterface = status; | 397 | ether_desc.iMACAddress = geth_string_defs[1].id; |
424 | |||
425 | /* MAC address */ | ||
426 | status = usb_string_id(c->cdev); | ||
427 | if (status < 0) | ||
428 | return status; | ||
429 | geth_string_defs[1].id = status; | ||
430 | ether_desc.iMACAddress = status; | ||
431 | } | 398 | } |
432 | 399 | ||
433 | /* allocate and initialize one new instance */ | 400 | /* allocate and initialize one new instance */ |
@@ -449,9 +416,7 @@ int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]) | |||
449 | geth->port.func.disable = geth_disable; | 416 | geth->port.func.disable = geth_disable; |
450 | 417 | ||
451 | status = usb_add_function(c, &geth->port.func); | 418 | status = usb_add_function(c, &geth->port.func); |
452 | if (status) { | 419 | if (status) |
453 | geth_string_defs[1].s = NULL; | ||
454 | kfree(geth); | 420 | kfree(geth); |
455 | } | ||
456 | return status; | 421 | return status; |
457 | } | 422 | } |
diff --git a/drivers/usb/gadget/f_uac1.c b/drivers/usb/gadget/f_uac1.c index 1a5dcd5565e3..f570e667a640 100644 --- a/drivers/usb/gadget/f_uac1.c +++ b/drivers/usb/gadget/f_uac1.c | |||
@@ -630,7 +630,7 @@ f_audio_bind(struct usb_configuration *c, struct usb_function *f) | |||
630 | struct usb_composite_dev *cdev = c->cdev; | 630 | struct usb_composite_dev *cdev = c->cdev; |
631 | struct f_audio *audio = func_to_audio(f); | 631 | struct f_audio *audio = func_to_audio(f); |
632 | int status; | 632 | int status; |
633 | struct usb_ep *ep; | 633 | struct usb_ep *ep = NULL; |
634 | 634 | ||
635 | f_audio_build_desc(audio); | 635 | f_audio_build_desc(audio); |
636 | 636 | ||
@@ -659,22 +659,14 @@ f_audio_bind(struct usb_configuration *c, struct usb_function *f) | |||
659 | status = -ENOMEM; | 659 | status = -ENOMEM; |
660 | 660 | ||
661 | /* copy descriptors, and track endpoint copies */ | 661 | /* copy descriptors, and track endpoint copies */ |
662 | f->descriptors = usb_copy_descriptors(f_audio_desc); | 662 | status = usb_assign_descriptors(f, f_audio_desc, f_audio_desc, NULL); |
663 | 663 | if (status) | |
664 | /* | 664 | goto fail; |
665 | * support all relevant hardware speeds... we expect that when | ||
666 | * hardware is dual speed, all bulk-capable endpoints work at | ||
667 | * both speeds | ||
668 | */ | ||
669 | if (gadget_is_dualspeed(c->cdev->gadget)) { | ||
670 | c->highspeed = true; | ||
671 | f->hs_descriptors = usb_copy_descriptors(f_audio_desc); | ||
672 | } | ||
673 | |||
674 | return 0; | 665 | return 0; |
675 | 666 | ||
676 | fail: | 667 | fail: |
677 | 668 | if (ep) | |
669 | ep->driver_data = NULL; | ||
678 | return status; | 670 | return status; |
679 | } | 671 | } |
680 | 672 | ||
@@ -683,8 +675,7 @@ f_audio_unbind(struct usb_configuration *c, struct usb_function *f) | |||
683 | { | 675 | { |
684 | struct f_audio *audio = func_to_audio(f); | 676 | struct f_audio *audio = func_to_audio(f); |
685 | 677 | ||
686 | usb_free_descriptors(f->descriptors); | 678 | usb_free_all_descriptors(f); |
687 | usb_free_descriptors(f->hs_descriptors); | ||
688 | kfree(audio); | 679 | kfree(audio); |
689 | } | 680 | } |
690 | 681 | ||
diff --git a/drivers/usb/gadget/f_uac2.c b/drivers/usb/gadget/f_uac2.c index d3c6cffccb72..d7da258fa3f6 100644 --- a/drivers/usb/gadget/f_uac2.c +++ b/drivers/usb/gadget/f_uac2.c | |||
@@ -50,13 +50,6 @@ static int c_ssize = 2; | |||
50 | module_param(c_ssize, uint, S_IRUGO); | 50 | module_param(c_ssize, uint, S_IRUGO); |
51 | MODULE_PARM_DESC(c_ssize, "Capture Sample Size(bytes)"); | 51 | MODULE_PARM_DESC(c_ssize, "Capture Sample Size(bytes)"); |
52 | 52 | ||
53 | #define DMA_ADDR_INVALID (~(dma_addr_t)0) | ||
54 | |||
55 | #define ALT_SET(x, a) do {(x) &= ~0xff; (x) |= (a); } while (0) | ||
56 | #define ALT_GET(x) ((x) & 0xff) | ||
57 | #define INTF_SET(x, i) do {(x) &= 0xff; (x) |= ((i) << 8); } while (0) | ||
58 | #define INTF_GET(x) ((x >> 8) & 0xff) | ||
59 | |||
60 | /* Keep everyone on toes */ | 53 | /* Keep everyone on toes */ |
61 | #define USB_XFERS 2 | 54 | #define USB_XFERS 2 |
62 | 55 | ||
@@ -144,8 +137,9 @@ static struct snd_pcm_hardware uac2_pcm_hardware = { | |||
144 | }; | 137 | }; |
145 | 138 | ||
146 | struct audio_dev { | 139 | struct audio_dev { |
147 | /* Currently active {Interface[15:8] | AltSettings[7:0]} */ | 140 | u8 ac_intf, ac_alt; |
148 | __u16 ac_alt, as_out_alt, as_in_alt; | 141 | u8 as_out_intf, as_out_alt; |
142 | u8 as_in_intf, as_in_alt; | ||
149 | 143 | ||
150 | struct usb_ep *in_ep, *out_ep; | 144 | struct usb_ep *in_ep, *out_ep; |
151 | struct usb_function func; | 145 | struct usb_function func; |
@@ -408,7 +402,7 @@ static struct snd_pcm_ops uac2_pcm_ops = { | |||
408 | .prepare = uac2_pcm_null, | 402 | .prepare = uac2_pcm_null, |
409 | }; | 403 | }; |
410 | 404 | ||
411 | static int __devinit snd_uac2_probe(struct platform_device *pdev) | 405 | static int snd_uac2_probe(struct platform_device *pdev) |
412 | { | 406 | { |
413 | struct snd_uac2_chip *uac2 = pdev_to_uac2(pdev); | 407 | struct snd_uac2_chip *uac2 = pdev_to_uac2(pdev); |
414 | struct snd_card *card; | 408 | struct snd_card *card; |
@@ -526,32 +520,22 @@ enum { | |||
526 | STR_AS_IN_ALT1, | 520 | STR_AS_IN_ALT1, |
527 | }; | 521 | }; |
528 | 522 | ||
529 | static const char ifassoc[] = "Source/Sink"; | ||
530 | static const char ifctrl[] = "Topology Control"; | ||
531 | static char clksrc_in[8]; | 523 | static char clksrc_in[8]; |
532 | static char clksrc_out[8]; | 524 | static char clksrc_out[8]; |
533 | static const char usb_it[] = "USBH Out"; | ||
534 | static const char io_it[] = "USBD Out"; | ||
535 | static const char usb_ot[] = "USBH In"; | ||
536 | static const char io_ot[] = "USBD In"; | ||
537 | static const char out_alt0[] = "Playback Inactive"; | ||
538 | static const char out_alt1[] = "Playback Active"; | ||
539 | static const char in_alt0[] = "Capture Inactive"; | ||
540 | static const char in_alt1[] = "Capture Active"; | ||
541 | 525 | ||
542 | static struct usb_string strings_fn[] = { | 526 | static struct usb_string strings_fn[] = { |
543 | [STR_ASSOC].s = ifassoc, | 527 | [STR_ASSOC].s = "Source/Sink", |
544 | [STR_IF_CTRL].s = ifctrl, | 528 | [STR_IF_CTRL].s = "Topology Control", |
545 | [STR_CLKSRC_IN].s = clksrc_in, | 529 | [STR_CLKSRC_IN].s = clksrc_in, |
546 | [STR_CLKSRC_OUT].s = clksrc_out, | 530 | [STR_CLKSRC_OUT].s = clksrc_out, |
547 | [STR_USB_IT].s = usb_it, | 531 | [STR_USB_IT].s = "USBH Out", |
548 | [STR_IO_IT].s = io_it, | 532 | [STR_IO_IT].s = "USBD Out", |
549 | [STR_USB_OT].s = usb_ot, | 533 | [STR_USB_OT].s = "USBH In", |
550 | [STR_IO_OT].s = io_ot, | 534 | [STR_IO_OT].s = "USBD In", |
551 | [STR_AS_OUT_ALT0].s = out_alt0, | 535 | [STR_AS_OUT_ALT0].s = "Playback Inactive", |
552 | [STR_AS_OUT_ALT1].s = out_alt1, | 536 | [STR_AS_OUT_ALT1].s = "Playback Active", |
553 | [STR_AS_IN_ALT0].s = in_alt0, | 537 | [STR_AS_IN_ALT0].s = "Capture Inactive", |
554 | [STR_AS_IN_ALT1].s = in_alt1, | 538 | [STR_AS_IN_ALT1].s = "Capture Active", |
555 | { }, | 539 | { }, |
556 | }; | 540 | }; |
557 | 541 | ||
@@ -952,8 +936,8 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) | |||
952 | return ret; | 936 | return ret; |
953 | } | 937 | } |
954 | std_ac_if_desc.bInterfaceNumber = ret; | 938 | std_ac_if_desc.bInterfaceNumber = ret; |
955 | ALT_SET(agdev->ac_alt, 0); | 939 | agdev->ac_intf = ret; |
956 | INTF_SET(agdev->ac_alt, ret); | 940 | agdev->ac_alt = 0; |
957 | 941 | ||
958 | ret = usb_interface_id(cfg, fn); | 942 | ret = usb_interface_id(cfg, fn); |
959 | if (ret < 0) { | 943 | if (ret < 0) { |
@@ -963,8 +947,8 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) | |||
963 | } | 947 | } |
964 | std_as_out_if0_desc.bInterfaceNumber = ret; | 948 | std_as_out_if0_desc.bInterfaceNumber = ret; |
965 | std_as_out_if1_desc.bInterfaceNumber = ret; | 949 | std_as_out_if1_desc.bInterfaceNumber = ret; |
966 | ALT_SET(agdev->as_out_alt, 0); | 950 | agdev->as_out_intf = ret; |
967 | INTF_SET(agdev->as_out_alt, ret); | 951 | agdev->as_out_alt = 0; |
968 | 952 | ||
969 | ret = usb_interface_id(cfg, fn); | 953 | ret = usb_interface_id(cfg, fn); |
970 | if (ret < 0) { | 954 | if (ret < 0) { |
@@ -974,19 +958,23 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) | |||
974 | } | 958 | } |
975 | std_as_in_if0_desc.bInterfaceNumber = ret; | 959 | std_as_in_if0_desc.bInterfaceNumber = ret; |
976 | std_as_in_if1_desc.bInterfaceNumber = ret; | 960 | std_as_in_if1_desc.bInterfaceNumber = ret; |
977 | ALT_SET(agdev->as_in_alt, 0); | 961 | agdev->as_in_intf = ret; |
978 | INTF_SET(agdev->as_in_alt, ret); | 962 | agdev->as_in_alt = 0; |
979 | 963 | ||
980 | agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc); | 964 | agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc); |
981 | if (!agdev->out_ep) | 965 | if (!agdev->out_ep) { |
982 | dev_err(&uac2->pdev.dev, | 966 | dev_err(&uac2->pdev.dev, |
983 | "%s:%d Error!\n", __func__, __LINE__); | 967 | "%s:%d Error!\n", __func__, __LINE__); |
968 | goto err; | ||
969 | } | ||
984 | agdev->out_ep->driver_data = agdev; | 970 | agdev->out_ep->driver_data = agdev; |
985 | 971 | ||
986 | agdev->in_ep = usb_ep_autoconfig(gadget, &fs_epin_desc); | 972 | agdev->in_ep = usb_ep_autoconfig(gadget, &fs_epin_desc); |
987 | if (!agdev->in_ep) | 973 | if (!agdev->in_ep) { |
988 | dev_err(&uac2->pdev.dev, | 974 | dev_err(&uac2->pdev.dev, |
989 | "%s:%d Error!\n", __func__, __LINE__); | 975 | "%s:%d Error!\n", __func__, __LINE__); |
976 | goto err; | ||
977 | } | ||
990 | agdev->in_ep->driver_data = agdev; | 978 | agdev->in_ep->driver_data = agdev; |
991 | 979 | ||
992 | hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress; | 980 | hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress; |
@@ -994,9 +982,9 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) | |||
994 | hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress; | 982 | hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress; |
995 | hs_epin_desc.wMaxPacketSize = fs_epin_desc.wMaxPacketSize; | 983 | hs_epin_desc.wMaxPacketSize = fs_epin_desc.wMaxPacketSize; |
996 | 984 | ||
997 | fn->descriptors = usb_copy_descriptors(fs_audio_desc); | 985 | ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, NULL); |
998 | if (gadget_is_dualspeed(gadget)) | 986 | if (ret) |
999 | fn->hs_descriptors = usb_copy_descriptors(hs_audio_desc); | 987 | goto err; |
1000 | 988 | ||
1001 | prm = &agdev->uac2.c_prm; | 989 | prm = &agdev->uac2.c_prm; |
1002 | prm->max_psize = hs_epout_desc.wMaxPacketSize; | 990 | prm->max_psize = hs_epout_desc.wMaxPacketSize; |
@@ -1005,6 +993,7 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) | |||
1005 | prm->max_psize = 0; | 993 | prm->max_psize = 0; |
1006 | dev_err(&uac2->pdev.dev, | 994 | dev_err(&uac2->pdev.dev, |
1007 | "%s:%d Error!\n", __func__, __LINE__); | 995 | "%s:%d Error!\n", __func__, __LINE__); |
996 | goto err; | ||
1008 | } | 997 | } |
1009 | 998 | ||
1010 | prm = &agdev->uac2.p_prm; | 999 | prm = &agdev->uac2.p_prm; |
@@ -1014,17 +1003,28 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) | |||
1014 | prm->max_psize = 0; | 1003 | prm->max_psize = 0; |
1015 | dev_err(&uac2->pdev.dev, | 1004 | dev_err(&uac2->pdev.dev, |
1016 | "%s:%d Error!\n", __func__, __LINE__); | 1005 | "%s:%d Error!\n", __func__, __LINE__); |
1006 | goto err; | ||
1017 | } | 1007 | } |
1018 | 1008 | ||
1019 | return alsa_uac2_init(agdev); | 1009 | ret = alsa_uac2_init(agdev); |
1010 | if (ret) | ||
1011 | goto err; | ||
1012 | return 0; | ||
1013 | err: | ||
1014 | kfree(agdev->uac2.p_prm.rbuf); | ||
1015 | kfree(agdev->uac2.c_prm.rbuf); | ||
1016 | usb_free_all_descriptors(fn); | ||
1017 | if (agdev->in_ep) | ||
1018 | agdev->in_ep->driver_data = NULL; | ||
1019 | if (agdev->out_ep) | ||
1020 | agdev->out_ep->driver_data = NULL; | ||
1021 | return -EINVAL; | ||
1020 | } | 1022 | } |
1021 | 1023 | ||
1022 | static void | 1024 | static void |
1023 | afunc_unbind(struct usb_configuration *cfg, struct usb_function *fn) | 1025 | afunc_unbind(struct usb_configuration *cfg, struct usb_function *fn) |
1024 | { | 1026 | { |
1025 | struct audio_dev *agdev = func_to_agdev(fn); | 1027 | struct audio_dev *agdev = func_to_agdev(fn); |
1026 | struct usb_composite_dev *cdev = cfg->cdev; | ||
1027 | struct usb_gadget *gadget = cdev->gadget; | ||
1028 | struct uac2_rtd_params *prm; | 1028 | struct uac2_rtd_params *prm; |
1029 | 1029 | ||
1030 | alsa_uac2_exit(agdev); | 1030 | alsa_uac2_exit(agdev); |
@@ -1034,10 +1034,7 @@ afunc_unbind(struct usb_configuration *cfg, struct usb_function *fn) | |||
1034 | 1034 | ||
1035 | prm = &agdev->uac2.c_prm; | 1035 | prm = &agdev->uac2.c_prm; |
1036 | kfree(prm->rbuf); | 1036 | kfree(prm->rbuf); |
1037 | 1037 | usb_free_all_descriptors(fn); | |
1038 | if (gadget_is_dualspeed(gadget)) | ||
1039 | usb_free_descriptors(fn->hs_descriptors); | ||
1040 | usb_free_descriptors(fn->descriptors); | ||
1041 | 1038 | ||
1042 | if (agdev->in_ep) | 1039 | if (agdev->in_ep) |
1043 | agdev->in_ep->driver_data = NULL; | 1040 | agdev->in_ep->driver_data = NULL; |
@@ -1064,7 +1061,7 @@ afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt) | |||
1064 | return -EINVAL; | 1061 | return -EINVAL; |
1065 | } | 1062 | } |
1066 | 1063 | ||
1067 | if (intf == INTF_GET(agdev->ac_alt)) { | 1064 | if (intf == agdev->ac_intf) { |
1068 | /* Control I/f has only 1 AltSetting - 0 */ | 1065 | /* Control I/f has only 1 AltSetting - 0 */ |
1069 | if (alt) { | 1066 | if (alt) { |
1070 | dev_err(&uac2->pdev.dev, | 1067 | dev_err(&uac2->pdev.dev, |
@@ -1074,16 +1071,16 @@ afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt) | |||
1074 | return 0; | 1071 | return 0; |
1075 | } | 1072 | } |
1076 | 1073 | ||
1077 | if (intf == INTF_GET(agdev->as_out_alt)) { | 1074 | if (intf == agdev->as_out_intf) { |
1078 | ep = agdev->out_ep; | 1075 | ep = agdev->out_ep; |
1079 | prm = &uac2->c_prm; | 1076 | prm = &uac2->c_prm; |
1080 | config_ep_by_speed(gadget, fn, ep); | 1077 | config_ep_by_speed(gadget, fn, ep); |
1081 | ALT_SET(agdev->as_out_alt, alt); | 1078 | agdev->as_out_alt = alt; |
1082 | } else if (intf == INTF_GET(agdev->as_in_alt)) { | 1079 | } else if (intf == agdev->as_in_intf) { |
1083 | ep = agdev->in_ep; | 1080 | ep = agdev->in_ep; |
1084 | prm = &uac2->p_prm; | 1081 | prm = &uac2->p_prm; |
1085 | config_ep_by_speed(gadget, fn, ep); | 1082 | config_ep_by_speed(gadget, fn, ep); |
1086 | ALT_SET(agdev->as_in_alt, alt); | 1083 | agdev->as_in_alt = alt; |
1087 | } else { | 1084 | } else { |
1088 | dev_err(&uac2->pdev.dev, | 1085 | dev_err(&uac2->pdev.dev, |
1089 | "%s:%d Error!\n", __func__, __LINE__); | 1086 | "%s:%d Error!\n", __func__, __LINE__); |
@@ -1117,7 +1114,6 @@ afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt) | |||
1117 | prm->ureq[i].pp = prm; | 1114 | prm->ureq[i].pp = prm; |
1118 | 1115 | ||
1119 | req->zero = 0; | 1116 | req->zero = 0; |
1120 | req->dma = DMA_ADDR_INVALID; | ||
1121 | req->context = &prm->ureq[i]; | 1117 | req->context = &prm->ureq[i]; |
1122 | req->length = prm->max_psize; | 1118 | req->length = prm->max_psize; |
1123 | req->complete = agdev_iso_complete; | 1119 | req->complete = agdev_iso_complete; |
@@ -1136,12 +1132,12 @@ afunc_get_alt(struct usb_function *fn, unsigned intf) | |||
1136 | struct audio_dev *agdev = func_to_agdev(fn); | 1132 | struct audio_dev *agdev = func_to_agdev(fn); |
1137 | struct snd_uac2_chip *uac2 = &agdev->uac2; | 1133 | struct snd_uac2_chip *uac2 = &agdev->uac2; |
1138 | 1134 | ||
1139 | if (intf == INTF_GET(agdev->ac_alt)) | 1135 | if (intf == agdev->ac_intf) |
1140 | return ALT_GET(agdev->ac_alt); | 1136 | return agdev->ac_alt; |
1141 | else if (intf == INTF_GET(agdev->as_out_alt)) | 1137 | else if (intf == agdev->as_out_intf) |
1142 | return ALT_GET(agdev->as_out_alt); | 1138 | return agdev->as_out_alt; |
1143 | else if (intf == INTF_GET(agdev->as_in_alt)) | 1139 | else if (intf == agdev->as_in_intf) |
1144 | return ALT_GET(agdev->as_in_alt); | 1140 | return agdev->as_in_alt; |
1145 | else | 1141 | else |
1146 | dev_err(&uac2->pdev.dev, | 1142 | dev_err(&uac2->pdev.dev, |
1147 | "%s:%d Invalid Interface %d!\n", | 1143 | "%s:%d Invalid Interface %d!\n", |
@@ -1157,10 +1153,10 @@ afunc_disable(struct usb_function *fn) | |||
1157 | struct snd_uac2_chip *uac2 = &agdev->uac2; | 1153 | struct snd_uac2_chip *uac2 = &agdev->uac2; |
1158 | 1154 | ||
1159 | free_ep(&uac2->p_prm, agdev->in_ep); | 1155 | free_ep(&uac2->p_prm, agdev->in_ep); |
1160 | ALT_SET(agdev->as_in_alt, 0); | 1156 | agdev->as_in_alt = 0; |
1161 | 1157 | ||
1162 | free_ep(&uac2->c_prm, agdev->out_ep); | 1158 | free_ep(&uac2->c_prm, agdev->out_ep); |
1163 | ALT_SET(agdev->as_out_alt, 0); | 1159 | agdev->as_out_alt = 0; |
1164 | } | 1160 | } |
1165 | 1161 | ||
1166 | static int | 1162 | static int |
@@ -1267,7 +1263,7 @@ setup_rq_inf(struct usb_function *fn, const struct usb_ctrlrequest *cr) | |||
1267 | u16 w_index = le16_to_cpu(cr->wIndex); | 1263 | u16 w_index = le16_to_cpu(cr->wIndex); |
1268 | u8 intf = w_index & 0xff; | 1264 | u8 intf = w_index & 0xff; |
1269 | 1265 | ||
1270 | if (intf != INTF_GET(agdev->ac_alt)) { | 1266 | if (intf != agdev->ac_intf) { |
1271 | dev_err(&uac2->pdev.dev, | 1267 | dev_err(&uac2->pdev.dev, |
1272 | "%s:%d Error!\n", __func__, __LINE__); | 1268 | "%s:%d Error!\n", __func__, __LINE__); |
1273 | return -EOPNOTSUPP; | 1269 | return -EOPNOTSUPP; |
@@ -1316,7 +1312,7 @@ afunc_setup(struct usb_function *fn, const struct usb_ctrlrequest *cr) | |||
1316 | 1312 | ||
1317 | static int audio_bind_config(struct usb_configuration *cfg) | 1313 | static int audio_bind_config(struct usb_configuration *cfg) |
1318 | { | 1314 | { |
1319 | int id, res; | 1315 | int res; |
1320 | 1316 | ||
1321 | agdev_g = kzalloc(sizeof *agdev_g, GFP_KERNEL); | 1317 | agdev_g = kzalloc(sizeof *agdev_g, GFP_KERNEL); |
1322 | if (agdev_g == NULL) { | 1318 | if (agdev_g == NULL) { |
@@ -1324,89 +1320,21 @@ static int audio_bind_config(struct usb_configuration *cfg) | |||
1324 | return -ENOMEM; | 1320 | return -ENOMEM; |
1325 | } | 1321 | } |
1326 | 1322 | ||
1327 | id = usb_string_id(cfg->cdev); | 1323 | res = usb_string_ids_tab(cfg->cdev, strings_fn); |
1328 | if (id < 0) | 1324 | if (res) |
1329 | return id; | 1325 | return res; |
1330 | 1326 | iad_desc.iFunction = strings_fn[STR_ASSOC].id; | |
1331 | strings_fn[STR_ASSOC].id = id; | 1327 | std_ac_if_desc.iInterface = strings_fn[STR_IF_CTRL].id; |
1332 | iad_desc.iFunction = id, | 1328 | in_clk_src_desc.iClockSource = strings_fn[STR_CLKSRC_IN].id; |
1333 | 1329 | out_clk_src_desc.iClockSource = strings_fn[STR_CLKSRC_OUT].id; | |
1334 | id = usb_string_id(cfg->cdev); | 1330 | usb_out_it_desc.iTerminal = strings_fn[STR_USB_IT].id; |
1335 | if (id < 0) | 1331 | io_in_it_desc.iTerminal = strings_fn[STR_IO_IT].id; |
1336 | return id; | 1332 | usb_in_ot_desc.iTerminal = strings_fn[STR_USB_OT].id; |
1337 | 1333 | io_out_ot_desc.iTerminal = strings_fn[STR_IO_OT].id; | |
1338 | strings_fn[STR_IF_CTRL].id = id; | 1334 | std_as_out_if0_desc.iInterface = strings_fn[STR_AS_OUT_ALT0].id; |
1339 | std_ac_if_desc.iInterface = id, | 1335 | std_as_out_if1_desc.iInterface = strings_fn[STR_AS_OUT_ALT1].id; |
1340 | 1336 | std_as_in_if0_desc.iInterface = strings_fn[STR_AS_IN_ALT0].id; | |
1341 | id = usb_string_id(cfg->cdev); | 1337 | std_as_in_if1_desc.iInterface = strings_fn[STR_AS_IN_ALT1].id; |
1342 | if (id < 0) | ||
1343 | return id; | ||
1344 | |||
1345 | strings_fn[STR_CLKSRC_IN].id = id; | ||
1346 | in_clk_src_desc.iClockSource = id, | ||
1347 | |||
1348 | id = usb_string_id(cfg->cdev); | ||
1349 | if (id < 0) | ||
1350 | return id; | ||
1351 | |||
1352 | strings_fn[STR_CLKSRC_OUT].id = id; | ||
1353 | out_clk_src_desc.iClockSource = id, | ||
1354 | |||
1355 | id = usb_string_id(cfg->cdev); | ||
1356 | if (id < 0) | ||
1357 | return id; | ||
1358 | |||
1359 | strings_fn[STR_USB_IT].id = id; | ||
1360 | usb_out_it_desc.iTerminal = id, | ||
1361 | |||
1362 | id = usb_string_id(cfg->cdev); | ||
1363 | if (id < 0) | ||
1364 | return id; | ||
1365 | |||
1366 | strings_fn[STR_IO_IT].id = id; | ||
1367 | io_in_it_desc.iTerminal = id; | ||
1368 | |||
1369 | id = usb_string_id(cfg->cdev); | ||
1370 | if (id < 0) | ||
1371 | return id; | ||
1372 | |||
1373 | strings_fn[STR_USB_OT].id = id; | ||
1374 | usb_in_ot_desc.iTerminal = id; | ||
1375 | |||
1376 | id = usb_string_id(cfg->cdev); | ||
1377 | if (id < 0) | ||
1378 | return id; | ||
1379 | |||
1380 | strings_fn[STR_IO_OT].id = id; | ||
1381 | io_out_ot_desc.iTerminal = id; | ||
1382 | |||
1383 | id = usb_string_id(cfg->cdev); | ||
1384 | if (id < 0) | ||
1385 | return id; | ||
1386 | |||
1387 | strings_fn[STR_AS_OUT_ALT0].id = id; | ||
1388 | std_as_out_if0_desc.iInterface = id; | ||
1389 | |||
1390 | id = usb_string_id(cfg->cdev); | ||
1391 | if (id < 0) | ||
1392 | return id; | ||
1393 | |||
1394 | strings_fn[STR_AS_OUT_ALT1].id = id; | ||
1395 | std_as_out_if1_desc.iInterface = id; | ||
1396 | |||
1397 | id = usb_string_id(cfg->cdev); | ||
1398 | if (id < 0) | ||
1399 | return id; | ||
1400 | |||
1401 | strings_fn[STR_AS_IN_ALT0].id = id; | ||
1402 | std_as_in_if0_desc.iInterface = id; | ||
1403 | |||
1404 | id = usb_string_id(cfg->cdev); | ||
1405 | if (id < 0) | ||
1406 | return id; | ||
1407 | |||
1408 | strings_fn[STR_AS_IN_ALT1].id = id; | ||
1409 | std_as_in_if1_desc.iInterface = id; | ||
1410 | 1338 | ||
1411 | agdev_g->func.name = "uac2_func"; | 1339 | agdev_g->func.name = "uac2_func"; |
1412 | agdev_g->func.strings = fn_strings; | 1340 | agdev_g->func.strings = fn_strings; |
diff --git a/drivers/usb/gadget/f_uvc.c b/drivers/usb/gadget/f_uvc.c index 2a8bf0655c60..5b629876941b 100644 --- a/drivers/usb/gadget/f_uvc.c +++ b/drivers/usb/gadget/f_uvc.c | |||
@@ -417,7 +417,6 @@ uvc_register_video(struct uvc_device *uvc) | |||
417 | return -ENOMEM; | 417 | return -ENOMEM; |
418 | 418 | ||
419 | video->parent = &cdev->gadget->dev; | 419 | video->parent = &cdev->gadget->dev; |
420 | video->minor = -1; | ||
421 | video->fops = &uvc_v4l2_fops; | 420 | video->fops = &uvc_v4l2_fops; |
422 | video->release = video_device_release; | 421 | video->release = video_device_release; |
423 | strncpy(video->name, cdev->gadget->name, sizeof(video->name)); | 422 | strncpy(video->name, cdev->gadget->name, sizeof(video->name)); |
@@ -577,27 +576,15 @@ uvc_function_unbind(struct usb_configuration *c, struct usb_function *f) | |||
577 | 576 | ||
578 | INFO(cdev, "uvc_function_unbind\n"); | 577 | INFO(cdev, "uvc_function_unbind\n"); |
579 | 578 | ||
580 | if (uvc->vdev) { | 579 | video_unregister_device(uvc->vdev); |
581 | if (uvc->vdev->minor == -1) | 580 | uvc->control_ep->driver_data = NULL; |
582 | video_device_release(uvc->vdev); | 581 | uvc->video.ep->driver_data = NULL; |
583 | else | ||
584 | video_unregister_device(uvc->vdev); | ||
585 | uvc->vdev = NULL; | ||
586 | } | ||
587 | 582 | ||
588 | if (uvc->control_ep) | 583 | uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id = 0; |
589 | uvc->control_ep->driver_data = NULL; | 584 | usb_ep_free_request(cdev->gadget->ep0, uvc->control_req); |
590 | if (uvc->video.ep) | 585 | kfree(uvc->control_buf); |
591 | uvc->video.ep->driver_data = NULL; | ||
592 | |||
593 | if (uvc->control_req) { | ||
594 | usb_ep_free_request(cdev->gadget->ep0, uvc->control_req); | ||
595 | kfree(uvc->control_buf); | ||
596 | } | ||
597 | 586 | ||
598 | kfree(f->descriptors); | 587 | usb_free_all_descriptors(f); |
599 | kfree(f->hs_descriptors); | ||
600 | kfree(f->ss_descriptors); | ||
601 | 588 | ||
602 | kfree(uvc); | 589 | kfree(uvc); |
603 | } | 590 | } |
@@ -663,49 +650,40 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f) | |||
663 | /* sanity check the streaming endpoint module parameters */ | 650 | /* sanity check the streaming endpoint module parameters */ |
664 | if (streaming_maxpacket > 1024) | 651 | if (streaming_maxpacket > 1024) |
665 | streaming_maxpacket = 1024; | 652 | streaming_maxpacket = 1024; |
653 | /* | ||
654 | * Fill in the HS descriptors from the module parameters for the Video | ||
655 | * Streaming endpoint. | ||
656 | * NOTE: We assume that the user knows what they are doing and won't | ||
657 | * give parameters that their UDC doesn't support. | ||
658 | */ | ||
659 | uvc_hs_streaming_ep.wMaxPacketSize = streaming_maxpacket; | ||
660 | uvc_hs_streaming_ep.wMaxPacketSize |= streaming_mult << 11; | ||
661 | uvc_hs_streaming_ep.bInterval = streaming_interval; | ||
662 | uvc_hs_streaming_ep.bEndpointAddress = | ||
663 | uvc_fs_streaming_ep.bEndpointAddress; | ||
666 | 664 | ||
667 | /* Copy descriptors for FS. */ | 665 | /* |
668 | f->descriptors = uvc_copy_descriptors(uvc, USB_SPEED_FULL); | 666 | * Fill in the SS descriptors from the module parameters for the Video |
669 | 667 | * Streaming endpoint. | |
670 | /* support high speed hardware */ | 668 | * NOTE: We assume that the user knows what they are doing and won't |
671 | if (gadget_is_dualspeed(cdev->gadget)) { | 669 | * give parameters that their UDC doesn't support. |
672 | /* | 670 | */ |
673 | * Fill in the HS descriptors from the module parameters for the | 671 | uvc_ss_streaming_ep.wMaxPacketSize = streaming_maxpacket; |
674 | * Video Streaming endpoint. | 672 | uvc_ss_streaming_ep.bInterval = streaming_interval; |
675 | * NOTE: We assume that the user knows what they are doing and | 673 | uvc_ss_streaming_comp.bmAttributes = streaming_mult; |
676 | * won't give parameters that their UDC doesn't support. | 674 | uvc_ss_streaming_comp.bMaxBurst = streaming_maxburst; |
677 | */ | 675 | uvc_ss_streaming_comp.wBytesPerInterval = |
678 | uvc_hs_streaming_ep.wMaxPacketSize = streaming_maxpacket; | 676 | streaming_maxpacket * (streaming_mult + 1) * |
679 | uvc_hs_streaming_ep.wMaxPacketSize |= streaming_mult << 11; | 677 | (streaming_maxburst + 1); |
680 | uvc_hs_streaming_ep.bInterval = streaming_interval; | 678 | uvc_ss_streaming_ep.bEndpointAddress = |
681 | uvc_hs_streaming_ep.bEndpointAddress = | 679 | uvc_fs_streaming_ep.bEndpointAddress; |
682 | uvc_fs_streaming_ep.bEndpointAddress; | ||
683 | |||
684 | /* Copy descriptors. */ | ||
685 | f->hs_descriptors = uvc_copy_descriptors(uvc, USB_SPEED_HIGH); | ||
686 | } | ||
687 | 680 | ||
688 | /* support super speed hardware */ | 681 | /* Copy descriptors */ |
689 | if (gadget_is_superspeed(c->cdev->gadget)) { | 682 | f->fs_descriptors = uvc_copy_descriptors(uvc, USB_SPEED_FULL); |
690 | /* | 683 | if (gadget_is_dualspeed(cdev->gadget)) |
691 | * Fill in the SS descriptors from the module parameters for the | 684 | f->hs_descriptors = uvc_copy_descriptors(uvc, USB_SPEED_HIGH); |
692 | * Video Streaming endpoint. | 685 | if (gadget_is_superspeed(c->cdev->gadget)) |
693 | * NOTE: We assume that the user knows what they are doing and | ||
694 | * won't give parameters that their UDC doesn't support. | ||
695 | */ | ||
696 | uvc_ss_streaming_ep.wMaxPacketSize = streaming_maxpacket; | ||
697 | uvc_ss_streaming_ep.bInterval = streaming_interval; | ||
698 | uvc_ss_streaming_comp.bmAttributes = streaming_mult; | ||
699 | uvc_ss_streaming_comp.bMaxBurst = streaming_maxburst; | ||
700 | uvc_ss_streaming_comp.wBytesPerInterval = | ||
701 | streaming_maxpacket * (streaming_mult + 1) * | ||
702 | (streaming_maxburst + 1); | ||
703 | uvc_ss_streaming_ep.bEndpointAddress = | ||
704 | uvc_fs_streaming_ep.bEndpointAddress; | ||
705 | |||
706 | /* Copy descriptors. */ | ||
707 | f->ss_descriptors = uvc_copy_descriptors(uvc, USB_SPEED_SUPER); | 686 | f->ss_descriptors = uvc_copy_descriptors(uvc, USB_SPEED_SUPER); |
708 | } | ||
709 | 687 | ||
710 | /* Preallocate control endpoint request. */ | 688 | /* Preallocate control endpoint request. */ |
711 | uvc->control_req = usb_ep_alloc_request(cdev->gadget->ep0, GFP_KERNEL); | 689 | uvc->control_req = usb_ep_alloc_request(cdev->gadget->ep0, GFP_KERNEL); |
@@ -740,7 +718,20 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f) | |||
740 | return 0; | 718 | return 0; |
741 | 719 | ||
742 | error: | 720 | error: |
743 | uvc_function_unbind(c, f); | 721 | if (uvc->vdev) |
722 | video_device_release(uvc->vdev); | ||
723 | |||
724 | if (uvc->control_ep) | ||
725 | uvc->control_ep->driver_data = NULL; | ||
726 | if (uvc->video.ep) | ||
727 | uvc->video.ep->driver_data = NULL; | ||
728 | |||
729 | if (uvc->control_req) { | ||
730 | usb_ep_free_request(cdev->gadget->ep0, uvc->control_req); | ||
731 | kfree(uvc->control_buf); | ||
732 | } | ||
733 | |||
734 | usb_free_all_descriptors(f); | ||
744 | return ret; | 735 | return ret; |
745 | } | 736 | } |
746 | 737 | ||
@@ -808,25 +799,16 @@ uvc_bind_config(struct usb_configuration *c, | |||
808 | uvc->desc.hs_streaming = hs_streaming; | 799 | uvc->desc.hs_streaming = hs_streaming; |
809 | uvc->desc.ss_streaming = ss_streaming; | 800 | uvc->desc.ss_streaming = ss_streaming; |
810 | 801 | ||
811 | /* maybe allocate device-global string IDs, and patch descriptors */ | 802 | /* Allocate string descriptor numbers. */ |
812 | if (uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id == 0) { | 803 | if (uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id == 0) { |
813 | /* Allocate string descriptor numbers. */ | 804 | ret = usb_string_ids_tab(c->cdev, uvc_en_us_strings); |
814 | ret = usb_string_id(c->cdev); | 805 | if (ret) |
815 | if (ret < 0) | ||
816 | goto error; | ||
817 | uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id = ret; | ||
818 | uvc_iad.iFunction = ret; | ||
819 | |||
820 | ret = usb_string_id(c->cdev); | ||
821 | if (ret < 0) | ||
822 | goto error; | ||
823 | uvc_en_us_strings[UVC_STRING_CONTROL_IDX].id = ret; | ||
824 | uvc_control_intf.iInterface = ret; | ||
825 | |||
826 | ret = usb_string_id(c->cdev); | ||
827 | if (ret < 0) | ||
828 | goto error; | 806 | goto error; |
829 | uvc_en_us_strings[UVC_STRING_STREAMING_IDX].id = ret; | 807 | uvc_iad.iFunction = |
808 | uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id; | ||
809 | uvc_control_intf.iInterface = | ||
810 | uvc_en_us_strings[UVC_STRING_CONTROL_IDX].id; | ||
811 | ret = uvc_en_us_strings[UVC_STRING_STREAMING_IDX].id; | ||
830 | uvc_streaming_intf_alt0.iInterface = ret; | 812 | uvc_streaming_intf_alt0.iInterface = ret; |
831 | uvc_streaming_intf_alt1.iInterface = ret; | 813 | uvc_streaming_intf_alt1.iInterface = ret; |
832 | } | 814 | } |
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c deleted file mode 100644 index 3f7d640b6758..000000000000 --- a/drivers/usb/gadget/file_storage.c +++ /dev/null | |||
@@ -1,3656 +0,0 @@ | |||
1 | /* | ||
2 | * file_storage.c -- File-backed USB Storage Gadget, for USB development | ||
3 | * | ||
4 | * Copyright (C) 2003-2008 Alan Stern | ||
5 | * All rights reserved. | ||
6 | * | ||
7 | * Redistribution and use in source and binary forms, with or without | ||
8 | * modification, are permitted provided that the following conditions | ||
9 | * are met: | ||
10 | * 1. Redistributions of source code must retain the above copyright | ||
11 | * notice, this list of conditions, and the following disclaimer, | ||
12 | * without modification. | ||
13 | * 2. Redistributions in binary form must reproduce the above copyright | ||
14 | * notice, this list of conditions and the following disclaimer in the | ||
15 | * documentation and/or other materials provided with the distribution. | ||
16 | * 3. The names of the above-listed copyright holders may not be used | ||
17 | * to endorse or promote products derived from this software without | ||
18 | * specific prior written permission. | ||
19 | * | ||
20 | * ALTERNATIVELY, this software may be distributed under the terms of the | ||
21 | * GNU General Public License ("GPL") as published by the Free Software | ||
22 | * Foundation, either version 2 of that License or (at your option) any | ||
23 | * later version. | ||
24 | * | ||
25 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS | ||
26 | * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, | ||
27 | * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
28 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR | ||
29 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | ||
30 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | ||
31 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | ||
32 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | ||
33 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | ||
34 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
35 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
36 | */ | ||
37 | |||
38 | |||
39 | /* | ||
40 | * The File-backed Storage Gadget acts as a USB Mass Storage device, | ||
41 | * appearing to the host as a disk drive or as a CD-ROM drive. In addition | ||
42 | * to providing an example of a genuinely useful gadget driver for a USB | ||
43 | * device, it also illustrates a technique of double-buffering for increased | ||
44 | * throughput. Last but not least, it gives an easy way to probe the | ||
45 | * behavior of the Mass Storage drivers in a USB host. | ||
46 | * | ||
47 | * Backing storage is provided by a regular file or a block device, specified | ||
48 | * by the "file" module parameter. Access can be limited to read-only by | ||
49 | * setting the optional "ro" module parameter. (For CD-ROM emulation, | ||
50 | * access is always read-only.) The gadget will indicate that it has | ||
51 | * removable media if the optional "removable" module parameter is set. | ||
52 | * | ||
53 | * The gadget supports the Control-Bulk (CB), Control-Bulk-Interrupt (CBI), | ||
54 | * and Bulk-Only (also known as Bulk-Bulk-Bulk or BBB) transports, selected | ||
55 | * by the optional "transport" module parameter. It also supports the | ||
56 | * following protocols: RBC (0x01), ATAPI or SFF-8020i (0x02), QIC-157 (0c03), | ||
57 | * UFI (0x04), SFF-8070i (0x05), and transparent SCSI (0x06), selected by | ||
58 | * the optional "protocol" module parameter. In addition, the default | ||
59 | * Vendor ID, Product ID, release number and serial number can be overridden. | ||
60 | * | ||
61 | * There is support for multiple logical units (LUNs), each of which has | ||
62 | * its own backing file. The number of LUNs can be set using the optional | ||
63 | * "luns" module parameter (anywhere from 1 to 8), and the corresponding | ||
64 | * files are specified using comma-separated lists for "file" and "ro". | ||
65 | * The default number of LUNs is taken from the number of "file" elements; | ||
66 | * it is 1 if "file" is not given. If "removable" is not set then a backing | ||
67 | * file must be specified for each LUN. If it is set, then an unspecified | ||
68 | * or empty backing filename means the LUN's medium is not loaded. Ideally | ||
69 | * each LUN would be settable independently as a disk drive or a CD-ROM | ||
70 | * drive, but currently all LUNs have to be the same type. The CD-ROM | ||
71 | * emulation includes a single data track and no audio tracks; hence there | ||
72 | * need be only one backing file per LUN. | ||
73 | * | ||
74 | * Requirements are modest; only a bulk-in and a bulk-out endpoint are | ||
75 | * needed (an interrupt-out endpoint is also needed for CBI). The memory | ||
76 | * requirement amounts to two 16K buffers, size configurable by a parameter. | ||
77 | * Support is included for both full-speed and high-speed operation. | ||
78 | * | ||
79 | * Note that the driver is slightly non-portable in that it assumes a | ||
80 | * single memory/DMA buffer will be useable for bulk-in, bulk-out, and | ||
81 | * interrupt-in endpoints. With most device controllers this isn't an | ||
82 | * issue, but there may be some with hardware restrictions that prevent | ||
83 | * a buffer from being used by more than one endpoint. | ||
84 | * | ||
85 | * Module options: | ||
86 | * | ||
87 | * file=filename[,filename...] | ||
88 | * Required if "removable" is not set, names of | ||
89 | * the files or block devices used for | ||
90 | * backing storage | ||
91 | * serial=HHHH... Required serial number (string of hex chars) | ||
92 | * ro=b[,b...] Default false, booleans for read-only access | ||
93 | * removable Default false, boolean for removable media | ||
94 | * luns=N Default N = number of filenames, number of | ||
95 | * LUNs to support | ||
96 | * nofua=b[,b...] Default false, booleans for ignore FUA flag | ||
97 | * in SCSI WRITE(10,12) commands | ||
98 | * stall Default determined according to the type of | ||
99 | * USB device controller (usually true), | ||
100 | * boolean to permit the driver to halt | ||
101 | * bulk endpoints | ||
102 | * cdrom Default false, boolean for whether to emulate | ||
103 | * a CD-ROM drive | ||
104 | * transport=XXX Default BBB, transport name (CB, CBI, or BBB) | ||
105 | * protocol=YYY Default SCSI, protocol name (RBC, 8020 or | ||
106 | * ATAPI, QIC, UFI, 8070, or SCSI; | ||
107 | * also 1 - 6) | ||
108 | * vendor=0xVVVV Default 0x0525 (NetChip), USB Vendor ID | ||
109 | * product=0xPPPP Default 0xa4a5 (FSG), USB Product ID | ||
110 | * release=0xRRRR Override the USB release number (bcdDevice) | ||
111 | * buflen=N Default N=16384, buffer size used (will be | ||
112 | * rounded down to a multiple of | ||
113 | * PAGE_CACHE_SIZE) | ||
114 | * | ||
115 | * If CONFIG_USB_FILE_STORAGE_TEST is not set, only the "file", "serial", "ro", | ||
116 | * "removable", "luns", "nofua", "stall", and "cdrom" options are available; | ||
117 | * default values are used for everything else. | ||
118 | * | ||
119 | * The pathnames of the backing files and the ro settings are available in | ||
120 | * the attribute files "file", "nofua", and "ro" in the lun<n> subdirectory of | ||
121 | * the gadget's sysfs directory. If the "removable" option is set, writing to | ||
122 | * these files will simulate ejecting/loading the medium (writing an empty | ||
123 | * line means eject) and adjusting a write-enable tab. Changes to the ro | ||
124 | * setting are not allowed when the medium is loaded or if CD-ROM emulation | ||
125 | * is being used. | ||
126 | * | ||
127 | * This gadget driver is heavily based on "Gadget Zero" by David Brownell. | ||
128 | * The driver's SCSI command interface was based on the "Information | ||
129 | * technology - Small Computer System Interface - 2" document from | ||
130 | * X3T9.2 Project 375D, Revision 10L, 7-SEP-93, available at | ||
131 | * <http://www.t10.org/ftp/t10/drafts/s2/s2-r10l.pdf>. The single exception | ||
132 | * is opcode 0x23 (READ FORMAT CAPACITIES), which was based on the | ||
133 | * "Universal Serial Bus Mass Storage Class UFI Command Specification" | ||
134 | * document, Revision 1.0, December 14, 1998, available at | ||
135 | * <http://www.usb.org/developers/devclass_docs/usbmass-ufi10.pdf>. | ||
136 | */ | ||
137 | |||
138 | |||
139 | /* | ||
140 | * Driver Design | ||
141 | * | ||
142 | * The FSG driver is fairly straightforward. There is a main kernel | ||
143 | * thread that handles most of the work. Interrupt routines field | ||
144 | * callbacks from the controller driver: bulk- and interrupt-request | ||
145 | * completion notifications, endpoint-0 events, and disconnect events. | ||
146 | * Completion events are passed to the main thread by wakeup calls. Many | ||
147 | * ep0 requests are handled at interrupt time, but SetInterface, | ||
148 | * SetConfiguration, and device reset requests are forwarded to the | ||
149 | * thread in the form of "exceptions" using SIGUSR1 signals (since they | ||
150 | * should interrupt any ongoing file I/O operations). | ||
151 | * | ||
152 | * The thread's main routine implements the standard command/data/status | ||
153 | * parts of a SCSI interaction. It and its subroutines are full of tests | ||
154 | * for pending signals/exceptions -- all this polling is necessary since | ||
155 | * the kernel has no setjmp/longjmp equivalents. (Maybe this is an | ||
156 | * indication that the driver really wants to be running in userspace.) | ||
157 | * An important point is that so long as the thread is alive it keeps an | ||
158 | * open reference to the backing file. This will prevent unmounting | ||
159 | * the backing file's underlying filesystem and could cause problems | ||
160 | * during system shutdown, for example. To prevent such problems, the | ||
161 | * thread catches INT, TERM, and KILL signals and converts them into | ||
162 | * an EXIT exception. | ||
163 | * | ||
164 | * In normal operation the main thread is started during the gadget's | ||
165 | * fsg_bind() callback and stopped during fsg_unbind(). But it can also | ||
166 | * exit when it receives a signal, and there's no point leaving the | ||
167 | * gadget running when the thread is dead. So just before the thread | ||
168 | * exits, it deregisters the gadget driver. This makes things a little | ||
169 | * tricky: The driver is deregistered at two places, and the exiting | ||
170 | * thread can indirectly call fsg_unbind() which in turn can tell the | ||
171 | * thread to exit. The first problem is resolved through the use of the | ||
172 | * REGISTERED atomic bitflag; the driver will only be deregistered once. | ||
173 | * The second problem is resolved by having fsg_unbind() check | ||
174 | * fsg->state; it won't try to stop the thread if the state is already | ||
175 | * FSG_STATE_TERMINATED. | ||
176 | * | ||
177 | * To provide maximum throughput, the driver uses a circular pipeline of | ||
178 | * buffer heads (struct fsg_buffhd). In principle the pipeline can be | ||
179 | * arbitrarily long; in practice the benefits don't justify having more | ||
180 | * than 2 stages (i.e., double buffering). But it helps to think of the | ||
181 | * pipeline as being a long one. Each buffer head contains a bulk-in and | ||
182 | * a bulk-out request pointer (since the buffer can be used for both | ||
183 | * output and input -- directions always are given from the host's | ||
184 | * point of view) as well as a pointer to the buffer and various state | ||
185 | * variables. | ||
186 | * | ||
187 | * Use of the pipeline follows a simple protocol. There is a variable | ||
188 | * (fsg->next_buffhd_to_fill) that points to the next buffer head to use. | ||
189 | * At any time that buffer head may still be in use from an earlier | ||
190 | * request, so each buffer head has a state variable indicating whether | ||
191 | * it is EMPTY, FULL, or BUSY. Typical use involves waiting for the | ||
192 | * buffer head to be EMPTY, filling the buffer either by file I/O or by | ||
193 | * USB I/O (during which the buffer head is BUSY), and marking the buffer | ||
194 | * head FULL when the I/O is complete. Then the buffer will be emptied | ||
195 | * (again possibly by USB I/O, during which it is marked BUSY) and | ||
196 | * finally marked EMPTY again (possibly by a completion routine). | ||
197 | * | ||
198 | * A module parameter tells the driver to avoid stalling the bulk | ||
199 | * endpoints wherever the transport specification allows. This is | ||
200 | * necessary for some UDCs like the SuperH, which cannot reliably clear a | ||
201 | * halt on a bulk endpoint. However, under certain circumstances the | ||
202 | * Bulk-only specification requires a stall. In such cases the driver | ||
203 | * will halt the endpoint and set a flag indicating that it should clear | ||
204 | * the halt in software during the next device reset. Hopefully this | ||
205 | * will permit everything to work correctly. Furthermore, although the | ||
206 | * specification allows the bulk-out endpoint to halt when the host sends | ||
207 | * too much data, implementing this would cause an unavoidable race. | ||
208 | * The driver will always use the "no-stall" approach for OUT transfers. | ||
209 | * | ||
210 | * One subtle point concerns sending status-stage responses for ep0 | ||
211 | * requests. Some of these requests, such as device reset, can involve | ||
212 | * interrupting an ongoing file I/O operation, which might take an | ||
213 | * arbitrarily long time. During that delay the host might give up on | ||
214 | * the original ep0 request and issue a new one. When that happens the | ||
215 | * driver should not notify the host about completion of the original | ||
216 | * request, as the host will no longer be waiting for it. So the driver | ||
217 | * assigns to each ep0 request a unique tag, and it keeps track of the | ||
218 | * tag value of the request associated with a long-running exception | ||
219 | * (device-reset, interface-change, or configuration-change). When the | ||
220 | * exception handler is finished, the status-stage response is submitted | ||
221 | * only if the current ep0 request tag is equal to the exception request | ||
222 | * tag. Thus only the most recently received ep0 request will get a | ||
223 | * status-stage response. | ||
224 | * | ||
225 | * Warning: This driver source file is too long. It ought to be split up | ||
226 | * into a header file plus about 3 separate .c files, to handle the details | ||
227 | * of the Gadget, USB Mass Storage, and SCSI protocols. | ||
228 | */ | ||
229 | |||
230 | |||
231 | /* #define VERBOSE_DEBUG */ | ||
232 | /* #define DUMP_MSGS */ | ||
233 | |||
234 | |||
235 | #include <linux/blkdev.h> | ||
236 | #include <linux/completion.h> | ||
237 | #include <linux/dcache.h> | ||
238 | #include <linux/delay.h> | ||
239 | #include <linux/device.h> | ||
240 | #include <linux/fcntl.h> | ||
241 | #include <linux/file.h> | ||
242 | #include <linux/fs.h> | ||
243 | #include <linux/kref.h> | ||
244 | #include <linux/kthread.h> | ||
245 | #include <linux/limits.h> | ||
246 | #include <linux/module.h> | ||
247 | #include <linux/rwsem.h> | ||
248 | #include <linux/slab.h> | ||
249 | #include <linux/spinlock.h> | ||
250 | #include <linux/string.h> | ||
251 | #include <linux/freezer.h> | ||
252 | #include <linux/utsname.h> | ||
253 | |||
254 | #include <linux/usb/composite.h> | ||
255 | #include <linux/usb/ch9.h> | ||
256 | #include <linux/usb/gadget.h> | ||
257 | |||
258 | #include "gadget_chips.h" | ||
259 | |||
260 | #define DRIVER_DESC "File-backed Storage Gadget" | ||
261 | #define DRIVER_NAME "g_file_storage" | ||
262 | #define DRIVER_VERSION "1 September 2010" | ||
263 | |||
264 | static char fsg_string_manufacturer[64]; | ||
265 | static const char fsg_string_product[] = DRIVER_DESC; | ||
266 | static const char fsg_string_config[] = "Self-powered"; | ||
267 | static const char fsg_string_interface[] = "Mass Storage"; | ||
268 | |||
269 | |||
270 | #include "storage_common.c" | ||
271 | |||
272 | |||
273 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
274 | MODULE_AUTHOR("Alan Stern"); | ||
275 | MODULE_LICENSE("Dual BSD/GPL"); | ||
276 | |||
277 | /* | ||
278 | * This driver assumes self-powered hardware and has no way for users to | ||
279 | * trigger remote wakeup. It uses autoconfiguration to select endpoints | ||
280 | * and endpoint addresses. | ||
281 | */ | ||
282 | |||
283 | |||
284 | /*-------------------------------------------------------------------------*/ | ||
285 | |||
286 | |||
287 | /* Encapsulate the module parameter settings */ | ||
288 | |||
289 | static struct { | ||
290 | char *file[FSG_MAX_LUNS]; | ||
291 | char *serial; | ||
292 | bool ro[FSG_MAX_LUNS]; | ||
293 | bool nofua[FSG_MAX_LUNS]; | ||
294 | unsigned int num_filenames; | ||
295 | unsigned int num_ros; | ||
296 | unsigned int num_nofuas; | ||
297 | unsigned int nluns; | ||
298 | |||
299 | bool removable; | ||
300 | bool can_stall; | ||
301 | bool cdrom; | ||
302 | |||
303 | char *transport_parm; | ||
304 | char *protocol_parm; | ||
305 | unsigned short vendor; | ||
306 | unsigned short product; | ||
307 | unsigned short release; | ||
308 | unsigned int buflen; | ||
309 | |||
310 | int transport_type; | ||
311 | char *transport_name; | ||
312 | int protocol_type; | ||
313 | char *protocol_name; | ||
314 | |||
315 | } mod_data = { // Default values | ||
316 | .transport_parm = "BBB", | ||
317 | .protocol_parm = "SCSI", | ||
318 | .removable = 0, | ||
319 | .can_stall = 1, | ||
320 | .cdrom = 0, | ||
321 | .vendor = FSG_VENDOR_ID, | ||
322 | .product = FSG_PRODUCT_ID, | ||
323 | .release = 0xffff, // Use controller chip type | ||
324 | .buflen = 16384, | ||
325 | }; | ||
326 | |||
327 | |||
328 | module_param_array_named(file, mod_data.file, charp, &mod_data.num_filenames, | ||
329 | S_IRUGO); | ||
330 | MODULE_PARM_DESC(file, "names of backing files or devices"); | ||
331 | |||
332 | module_param_named(serial, mod_data.serial, charp, S_IRUGO); | ||
333 | MODULE_PARM_DESC(serial, "USB serial number"); | ||
334 | |||
335 | module_param_array_named(ro, mod_data.ro, bool, &mod_data.num_ros, S_IRUGO); | ||
336 | MODULE_PARM_DESC(ro, "true to force read-only"); | ||
337 | |||
338 | module_param_array_named(nofua, mod_data.nofua, bool, &mod_data.num_nofuas, | ||
339 | S_IRUGO); | ||
340 | MODULE_PARM_DESC(nofua, "true to ignore SCSI WRITE(10,12) FUA bit"); | ||
341 | |||
342 | module_param_named(luns, mod_data.nluns, uint, S_IRUGO); | ||
343 | MODULE_PARM_DESC(luns, "number of LUNs"); | ||
344 | |||
345 | module_param_named(removable, mod_data.removable, bool, S_IRUGO); | ||
346 | MODULE_PARM_DESC(removable, "true to simulate removable media"); | ||
347 | |||
348 | module_param_named(stall, mod_data.can_stall, bool, S_IRUGO); | ||
349 | MODULE_PARM_DESC(stall, "false to prevent bulk stalls"); | ||
350 | |||
351 | module_param_named(cdrom, mod_data.cdrom, bool, S_IRUGO); | ||
352 | MODULE_PARM_DESC(cdrom, "true to emulate cdrom instead of disk"); | ||
353 | |||
354 | /* In the non-TEST version, only the module parameters listed above | ||
355 | * are available. */ | ||
356 | #ifdef CONFIG_USB_FILE_STORAGE_TEST | ||
357 | |||
358 | module_param_named(transport, mod_data.transport_parm, charp, S_IRUGO); | ||
359 | MODULE_PARM_DESC(transport, "type of transport (BBB, CBI, or CB)"); | ||
360 | |||
361 | module_param_named(protocol, mod_data.protocol_parm, charp, S_IRUGO); | ||
362 | MODULE_PARM_DESC(protocol, "type of protocol (RBC, 8020, QIC, UFI, " | ||
363 | "8070, or SCSI)"); | ||
364 | |||
365 | module_param_named(vendor, mod_data.vendor, ushort, S_IRUGO); | ||
366 | MODULE_PARM_DESC(vendor, "USB Vendor ID"); | ||
367 | |||
368 | module_param_named(product, mod_data.product, ushort, S_IRUGO); | ||
369 | MODULE_PARM_DESC(product, "USB Product ID"); | ||
370 | |||
371 | module_param_named(release, mod_data.release, ushort, S_IRUGO); | ||
372 | MODULE_PARM_DESC(release, "USB release number"); | ||
373 | |||
374 | module_param_named(buflen, mod_data.buflen, uint, S_IRUGO); | ||
375 | MODULE_PARM_DESC(buflen, "I/O buffer size"); | ||
376 | |||
377 | #endif /* CONFIG_USB_FILE_STORAGE_TEST */ | ||
378 | |||
379 | |||
380 | /* | ||
381 | * These definitions will permit the compiler to avoid generating code for | ||
382 | * parts of the driver that aren't used in the non-TEST version. Even gcc | ||
383 | * can recognize when a test of a constant expression yields a dead code | ||
384 | * path. | ||
385 | */ | ||
386 | |||
387 | #ifdef CONFIG_USB_FILE_STORAGE_TEST | ||
388 | |||
389 | #define transport_is_bbb() (mod_data.transport_type == USB_PR_BULK) | ||
390 | #define transport_is_cbi() (mod_data.transport_type == USB_PR_CBI) | ||
391 | #define protocol_is_scsi() (mod_data.protocol_type == USB_SC_SCSI) | ||
392 | |||
393 | #else | ||
394 | |||
395 | #define transport_is_bbb() 1 | ||
396 | #define transport_is_cbi() 0 | ||
397 | #define protocol_is_scsi() 1 | ||
398 | |||
399 | #endif /* CONFIG_USB_FILE_STORAGE_TEST */ | ||
400 | |||
401 | |||
402 | /*-------------------------------------------------------------------------*/ | ||
403 | |||
404 | |||
405 | struct fsg_dev { | ||
406 | /* lock protects: state, all the req_busy's, and cbbuf_cmnd */ | ||
407 | spinlock_t lock; | ||
408 | struct usb_gadget *gadget; | ||
409 | |||
410 | /* filesem protects: backing files in use */ | ||
411 | struct rw_semaphore filesem; | ||
412 | |||
413 | /* reference counting: wait until all LUNs are released */ | ||
414 | struct kref ref; | ||
415 | |||
416 | struct usb_ep *ep0; // Handy copy of gadget->ep0 | ||
417 | struct usb_request *ep0req; // For control responses | ||
418 | unsigned int ep0_req_tag; | ||
419 | const char *ep0req_name; | ||
420 | |||
421 | struct usb_request *intreq; // For interrupt responses | ||
422 | int intreq_busy; | ||
423 | struct fsg_buffhd *intr_buffhd; | ||
424 | |||
425 | unsigned int bulk_out_maxpacket; | ||
426 | enum fsg_state state; // For exception handling | ||
427 | unsigned int exception_req_tag; | ||
428 | |||
429 | u8 config, new_config; | ||
430 | |||
431 | unsigned int running : 1; | ||
432 | unsigned int bulk_in_enabled : 1; | ||
433 | unsigned int bulk_out_enabled : 1; | ||
434 | unsigned int intr_in_enabled : 1; | ||
435 | unsigned int phase_error : 1; | ||
436 | unsigned int short_packet_received : 1; | ||
437 | unsigned int bad_lun_okay : 1; | ||
438 | |||
439 | unsigned long atomic_bitflags; | ||
440 | #define REGISTERED 0 | ||
441 | #define IGNORE_BULK_OUT 1 | ||
442 | #define SUSPENDED 2 | ||
443 | |||
444 | struct usb_ep *bulk_in; | ||
445 | struct usb_ep *bulk_out; | ||
446 | struct usb_ep *intr_in; | ||
447 | |||
448 | struct fsg_buffhd *next_buffhd_to_fill; | ||
449 | struct fsg_buffhd *next_buffhd_to_drain; | ||
450 | |||
451 | int thread_wakeup_needed; | ||
452 | struct completion thread_notifier; | ||
453 | struct task_struct *thread_task; | ||
454 | |||
455 | int cmnd_size; | ||
456 | u8 cmnd[MAX_COMMAND_SIZE]; | ||
457 | enum data_direction data_dir; | ||
458 | u32 data_size; | ||
459 | u32 data_size_from_cmnd; | ||
460 | u32 tag; | ||
461 | unsigned int lun; | ||
462 | u32 residue; | ||
463 | u32 usb_amount_left; | ||
464 | |||
465 | /* The CB protocol offers no way for a host to know when a command | ||
466 | * has completed. As a result the next command may arrive early, | ||
467 | * and we will still have to handle it. For that reason we need | ||
468 | * a buffer to store new commands when using CB (or CBI, which | ||
469 | * does not oblige a host to wait for command completion either). */ | ||
470 | int cbbuf_cmnd_size; | ||
471 | u8 cbbuf_cmnd[MAX_COMMAND_SIZE]; | ||
472 | |||
473 | unsigned int nluns; | ||
474 | struct fsg_lun *luns; | ||
475 | struct fsg_lun *curlun; | ||
476 | /* Must be the last entry */ | ||
477 | struct fsg_buffhd buffhds[]; | ||
478 | }; | ||
479 | |||
480 | typedef void (*fsg_routine_t)(struct fsg_dev *); | ||
481 | |||
482 | static int exception_in_progress(struct fsg_dev *fsg) | ||
483 | { | ||
484 | return (fsg->state > FSG_STATE_IDLE); | ||
485 | } | ||
486 | |||
487 | /* Make bulk-out requests be divisible by the maxpacket size */ | ||
488 | static void set_bulk_out_req_length(struct fsg_dev *fsg, | ||
489 | struct fsg_buffhd *bh, unsigned int length) | ||
490 | { | ||
491 | unsigned int rem; | ||
492 | |||
493 | bh->bulk_out_intended_length = length; | ||
494 | rem = length % fsg->bulk_out_maxpacket; | ||
495 | if (rem > 0) | ||
496 | length += fsg->bulk_out_maxpacket - rem; | ||
497 | bh->outreq->length = length; | ||
498 | } | ||
499 | |||
500 | static struct fsg_dev *the_fsg; | ||
501 | static struct usb_gadget_driver fsg_driver; | ||
502 | |||
503 | |||
504 | /*-------------------------------------------------------------------------*/ | ||
505 | |||
506 | static int fsg_set_halt(struct fsg_dev *fsg, struct usb_ep *ep) | ||
507 | { | ||
508 | const char *name; | ||
509 | |||
510 | if (ep == fsg->bulk_in) | ||
511 | name = "bulk-in"; | ||
512 | else if (ep == fsg->bulk_out) | ||
513 | name = "bulk-out"; | ||
514 | else | ||
515 | name = ep->name; | ||
516 | DBG(fsg, "%s set halt\n", name); | ||
517 | return usb_ep_set_halt(ep); | ||
518 | } | ||
519 | |||
520 | |||
521 | /*-------------------------------------------------------------------------*/ | ||
522 | |||
523 | /* | ||
524 | * DESCRIPTORS ... most are static, but strings and (full) configuration | ||
525 | * descriptors are built on demand. Also the (static) config and interface | ||
526 | * descriptors are adjusted during fsg_bind(). | ||
527 | */ | ||
528 | |||
529 | /* There is only one configuration. */ | ||
530 | #define CONFIG_VALUE 1 | ||
531 | |||
532 | static struct usb_device_descriptor | ||
533 | device_desc = { | ||
534 | .bLength = sizeof device_desc, | ||
535 | .bDescriptorType = USB_DT_DEVICE, | ||
536 | |||
537 | .bcdUSB = cpu_to_le16(0x0200), | ||
538 | .bDeviceClass = USB_CLASS_PER_INTERFACE, | ||
539 | |||
540 | /* The next three values can be overridden by module parameters */ | ||
541 | .idVendor = cpu_to_le16(FSG_VENDOR_ID), | ||
542 | .idProduct = cpu_to_le16(FSG_PRODUCT_ID), | ||
543 | .bcdDevice = cpu_to_le16(0xffff), | ||
544 | |||
545 | .iManufacturer = FSG_STRING_MANUFACTURER, | ||
546 | .iProduct = FSG_STRING_PRODUCT, | ||
547 | .iSerialNumber = FSG_STRING_SERIAL, | ||
548 | .bNumConfigurations = 1, | ||
549 | }; | ||
550 | |||
551 | static struct usb_config_descriptor | ||
552 | config_desc = { | ||
553 | .bLength = sizeof config_desc, | ||
554 | .bDescriptorType = USB_DT_CONFIG, | ||
555 | |||
556 | /* wTotalLength computed by usb_gadget_config_buf() */ | ||
557 | .bNumInterfaces = 1, | ||
558 | .bConfigurationValue = CONFIG_VALUE, | ||
559 | .iConfiguration = FSG_STRING_CONFIG, | ||
560 | .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER, | ||
561 | .bMaxPower = CONFIG_USB_GADGET_VBUS_DRAW / 2, | ||
562 | }; | ||
563 | |||
564 | |||
565 | static struct usb_qualifier_descriptor | ||
566 | dev_qualifier = { | ||
567 | .bLength = sizeof dev_qualifier, | ||
568 | .bDescriptorType = USB_DT_DEVICE_QUALIFIER, | ||
569 | |||
570 | .bcdUSB = cpu_to_le16(0x0200), | ||
571 | .bDeviceClass = USB_CLASS_PER_INTERFACE, | ||
572 | |||
573 | .bNumConfigurations = 1, | ||
574 | }; | ||
575 | |||
576 | static int populate_bos(struct fsg_dev *fsg, u8 *buf) | ||
577 | { | ||
578 | memcpy(buf, &fsg_bos_desc, USB_DT_BOS_SIZE); | ||
579 | buf += USB_DT_BOS_SIZE; | ||
580 | |||
581 | memcpy(buf, &fsg_ext_cap_desc, USB_DT_USB_EXT_CAP_SIZE); | ||
582 | buf += USB_DT_USB_EXT_CAP_SIZE; | ||
583 | |||
584 | memcpy(buf, &fsg_ss_cap_desc, USB_DT_USB_SS_CAP_SIZE); | ||
585 | |||
586 | return USB_DT_BOS_SIZE + USB_DT_USB_SS_CAP_SIZE | ||
587 | + USB_DT_USB_EXT_CAP_SIZE; | ||
588 | } | ||
589 | |||
590 | /* | ||
591 | * Config descriptors must agree with the code that sets configurations | ||
592 | * and with code managing interfaces and their altsettings. They must | ||
593 | * also handle different speeds and other-speed requests. | ||
594 | */ | ||
595 | static int populate_config_buf(struct usb_gadget *gadget, | ||
596 | u8 *buf, u8 type, unsigned index) | ||
597 | { | ||
598 | enum usb_device_speed speed = gadget->speed; | ||
599 | int len; | ||
600 | const struct usb_descriptor_header **function; | ||
601 | |||
602 | if (index > 0) | ||
603 | return -EINVAL; | ||
604 | |||
605 | if (gadget_is_dualspeed(gadget) && type == USB_DT_OTHER_SPEED_CONFIG) | ||
606 | speed = (USB_SPEED_FULL + USB_SPEED_HIGH) - speed; | ||
607 | function = gadget_is_dualspeed(gadget) && speed == USB_SPEED_HIGH | ||
608 | ? (const struct usb_descriptor_header **)fsg_hs_function | ||
609 | : (const struct usb_descriptor_header **)fsg_fs_function; | ||
610 | |||
611 | /* for now, don't advertise srp-only devices */ | ||
612 | if (!gadget_is_otg(gadget)) | ||
613 | function++; | ||
614 | |||
615 | len = usb_gadget_config_buf(&config_desc, buf, EP0_BUFSIZE, function); | ||
616 | ((struct usb_config_descriptor *) buf)->bDescriptorType = type; | ||
617 | return len; | ||
618 | } | ||
619 | |||
620 | |||
621 | /*-------------------------------------------------------------------------*/ | ||
622 | |||
623 | /* These routines may be called in process context or in_irq */ | ||
624 | |||
625 | /* Caller must hold fsg->lock */ | ||
626 | static void wakeup_thread(struct fsg_dev *fsg) | ||
627 | { | ||
628 | /* Tell the main thread that something has happened */ | ||
629 | fsg->thread_wakeup_needed = 1; | ||
630 | if (fsg->thread_task) | ||
631 | wake_up_process(fsg->thread_task); | ||
632 | } | ||
633 | |||
634 | |||
635 | static void raise_exception(struct fsg_dev *fsg, enum fsg_state new_state) | ||
636 | { | ||
637 | unsigned long flags; | ||
638 | |||
639 | /* Do nothing if a higher-priority exception is already in progress. | ||
640 | * If a lower-or-equal priority exception is in progress, preempt it | ||
641 | * and notify the main thread by sending it a signal. */ | ||
642 | spin_lock_irqsave(&fsg->lock, flags); | ||
643 | if (fsg->state <= new_state) { | ||
644 | fsg->exception_req_tag = fsg->ep0_req_tag; | ||
645 | fsg->state = new_state; | ||
646 | if (fsg->thread_task) | ||
647 | send_sig_info(SIGUSR1, SEND_SIG_FORCED, | ||
648 | fsg->thread_task); | ||
649 | } | ||
650 | spin_unlock_irqrestore(&fsg->lock, flags); | ||
651 | } | ||
652 | |||
653 | |||
654 | /*-------------------------------------------------------------------------*/ | ||
655 | |||
656 | /* The disconnect callback and ep0 routines. These always run in_irq, | ||
657 | * except that ep0_queue() is called in the main thread to acknowledge | ||
658 | * completion of various requests: set config, set interface, and | ||
659 | * Bulk-only device reset. */ | ||
660 | |||
661 | static void fsg_disconnect(struct usb_gadget *gadget) | ||
662 | { | ||
663 | struct fsg_dev *fsg = get_gadget_data(gadget); | ||
664 | |||
665 | DBG(fsg, "disconnect or port reset\n"); | ||
666 | raise_exception(fsg, FSG_STATE_DISCONNECT); | ||
667 | } | ||
668 | |||
669 | |||
670 | static int ep0_queue(struct fsg_dev *fsg) | ||
671 | { | ||
672 | int rc; | ||
673 | |||
674 | rc = usb_ep_queue(fsg->ep0, fsg->ep0req, GFP_ATOMIC); | ||
675 | if (rc != 0 && rc != -ESHUTDOWN) { | ||
676 | |||
677 | /* We can't do much more than wait for a reset */ | ||
678 | WARNING(fsg, "error in submission: %s --> %d\n", | ||
679 | fsg->ep0->name, rc); | ||
680 | } | ||
681 | return rc; | ||
682 | } | ||
683 | |||
684 | static void ep0_complete(struct usb_ep *ep, struct usb_request *req) | ||
685 | { | ||
686 | struct fsg_dev *fsg = ep->driver_data; | ||
687 | |||
688 | if (req->actual > 0) | ||
689 | dump_msg(fsg, fsg->ep0req_name, req->buf, req->actual); | ||
690 | if (req->status || req->actual != req->length) | ||
691 | DBG(fsg, "%s --> %d, %u/%u\n", __func__, | ||
692 | req->status, req->actual, req->length); | ||
693 | if (req->status == -ECONNRESET) // Request was cancelled | ||
694 | usb_ep_fifo_flush(ep); | ||
695 | |||
696 | if (req->status == 0 && req->context) | ||
697 | ((fsg_routine_t) (req->context))(fsg); | ||
698 | } | ||
699 | |||
700 | |||
701 | /*-------------------------------------------------------------------------*/ | ||
702 | |||
703 | /* Bulk and interrupt endpoint completion handlers. | ||
704 | * These always run in_irq. */ | ||
705 | |||
706 | static void bulk_in_complete(struct usb_ep *ep, struct usb_request *req) | ||
707 | { | ||
708 | struct fsg_dev *fsg = ep->driver_data; | ||
709 | struct fsg_buffhd *bh = req->context; | ||
710 | |||
711 | if (req->status || req->actual != req->length) | ||
712 | DBG(fsg, "%s --> %d, %u/%u\n", __func__, | ||
713 | req->status, req->actual, req->length); | ||
714 | if (req->status == -ECONNRESET) // Request was cancelled | ||
715 | usb_ep_fifo_flush(ep); | ||
716 | |||
717 | /* Hold the lock while we update the request and buffer states */ | ||
718 | smp_wmb(); | ||
719 | spin_lock(&fsg->lock); | ||
720 | bh->inreq_busy = 0; | ||
721 | bh->state = BUF_STATE_EMPTY; | ||
722 | wakeup_thread(fsg); | ||
723 | spin_unlock(&fsg->lock); | ||
724 | } | ||
725 | |||
726 | static void bulk_out_complete(struct usb_ep *ep, struct usb_request *req) | ||
727 | { | ||
728 | struct fsg_dev *fsg = ep->driver_data; | ||
729 | struct fsg_buffhd *bh = req->context; | ||
730 | |||
731 | dump_msg(fsg, "bulk-out", req->buf, req->actual); | ||
732 | if (req->status || req->actual != bh->bulk_out_intended_length) | ||
733 | DBG(fsg, "%s --> %d, %u/%u\n", __func__, | ||
734 | req->status, req->actual, | ||
735 | bh->bulk_out_intended_length); | ||
736 | if (req->status == -ECONNRESET) // Request was cancelled | ||
737 | usb_ep_fifo_flush(ep); | ||
738 | |||
739 | /* Hold the lock while we update the request and buffer states */ | ||
740 | smp_wmb(); | ||
741 | spin_lock(&fsg->lock); | ||
742 | bh->outreq_busy = 0; | ||
743 | bh->state = BUF_STATE_FULL; | ||
744 | wakeup_thread(fsg); | ||
745 | spin_unlock(&fsg->lock); | ||
746 | } | ||
747 | |||
748 | |||
749 | #ifdef CONFIG_USB_FILE_STORAGE_TEST | ||
750 | static void intr_in_complete(struct usb_ep *ep, struct usb_request *req) | ||
751 | { | ||
752 | struct fsg_dev *fsg = ep->driver_data; | ||
753 | struct fsg_buffhd *bh = req->context; | ||
754 | |||
755 | if (req->status || req->actual != req->length) | ||
756 | DBG(fsg, "%s --> %d, %u/%u\n", __func__, | ||
757 | req->status, req->actual, req->length); | ||
758 | if (req->status == -ECONNRESET) // Request was cancelled | ||
759 | usb_ep_fifo_flush(ep); | ||
760 | |||
761 | /* Hold the lock while we update the request and buffer states */ | ||
762 | smp_wmb(); | ||
763 | spin_lock(&fsg->lock); | ||
764 | fsg->intreq_busy = 0; | ||
765 | bh->state = BUF_STATE_EMPTY; | ||
766 | wakeup_thread(fsg); | ||
767 | spin_unlock(&fsg->lock); | ||
768 | } | ||
769 | |||
770 | #else | ||
771 | static void intr_in_complete(struct usb_ep *ep, struct usb_request *req) | ||
772 | {} | ||
773 | #endif /* CONFIG_USB_FILE_STORAGE_TEST */ | ||
774 | |||
775 | |||
776 | /*-------------------------------------------------------------------------*/ | ||
777 | |||
778 | /* Ep0 class-specific handlers. These always run in_irq. */ | ||
779 | |||
780 | #ifdef CONFIG_USB_FILE_STORAGE_TEST | ||
781 | static void received_cbi_adsc(struct fsg_dev *fsg, struct fsg_buffhd *bh) | ||
782 | { | ||
783 | struct usb_request *req = fsg->ep0req; | ||
784 | static u8 cbi_reset_cmnd[6] = { | ||
785 | SEND_DIAGNOSTIC, 4, 0xff, 0xff, 0xff, 0xff}; | ||
786 | |||
787 | /* Error in command transfer? */ | ||
788 | if (req->status || req->length != req->actual || | ||
789 | req->actual < 6 || req->actual > MAX_COMMAND_SIZE) { | ||
790 | |||
791 | /* Not all controllers allow a protocol stall after | ||
792 | * receiving control-out data, but we'll try anyway. */ | ||
793 | fsg_set_halt(fsg, fsg->ep0); | ||
794 | return; // Wait for reset | ||
795 | } | ||
796 | |||
797 | /* Is it the special reset command? */ | ||
798 | if (req->actual >= sizeof cbi_reset_cmnd && | ||
799 | memcmp(req->buf, cbi_reset_cmnd, | ||
800 | sizeof cbi_reset_cmnd) == 0) { | ||
801 | |||
802 | /* Raise an exception to stop the current operation | ||
803 | * and reinitialize our state. */ | ||
804 | DBG(fsg, "cbi reset request\n"); | ||
805 | raise_exception(fsg, FSG_STATE_RESET); | ||
806 | return; | ||
807 | } | ||
808 | |||
809 | VDBG(fsg, "CB[I] accept device-specific command\n"); | ||
810 | spin_lock(&fsg->lock); | ||
811 | |||
812 | /* Save the command for later */ | ||
813 | if (fsg->cbbuf_cmnd_size) | ||
814 | WARNING(fsg, "CB[I] overwriting previous command\n"); | ||
815 | fsg->cbbuf_cmnd_size = req->actual; | ||
816 | memcpy(fsg->cbbuf_cmnd, req->buf, fsg->cbbuf_cmnd_size); | ||
817 | |||
818 | wakeup_thread(fsg); | ||
819 | spin_unlock(&fsg->lock); | ||
820 | } | ||
821 | |||
822 | #else | ||
823 | static void received_cbi_adsc(struct fsg_dev *fsg, struct fsg_buffhd *bh) | ||
824 | {} | ||
825 | #endif /* CONFIG_USB_FILE_STORAGE_TEST */ | ||
826 | |||
827 | |||
828 | static int class_setup_req(struct fsg_dev *fsg, | ||
829 | const struct usb_ctrlrequest *ctrl) | ||
830 | { | ||
831 | struct usb_request *req = fsg->ep0req; | ||
832 | int value = -EOPNOTSUPP; | ||
833 | u16 w_index = le16_to_cpu(ctrl->wIndex); | ||
834 | u16 w_value = le16_to_cpu(ctrl->wValue); | ||
835 | u16 w_length = le16_to_cpu(ctrl->wLength); | ||
836 | |||
837 | if (!fsg->config) | ||
838 | return value; | ||
839 | |||
840 | /* Handle Bulk-only class-specific requests */ | ||
841 | if (transport_is_bbb()) { | ||
842 | switch (ctrl->bRequest) { | ||
843 | |||
844 | case US_BULK_RESET_REQUEST: | ||
845 | if (ctrl->bRequestType != (USB_DIR_OUT | | ||
846 | USB_TYPE_CLASS | USB_RECIP_INTERFACE)) | ||
847 | break; | ||
848 | if (w_index != 0 || w_value != 0 || w_length != 0) { | ||
849 | value = -EDOM; | ||
850 | break; | ||
851 | } | ||
852 | |||
853 | /* Raise an exception to stop the current operation | ||
854 | * and reinitialize our state. */ | ||
855 | DBG(fsg, "bulk reset request\n"); | ||
856 | raise_exception(fsg, FSG_STATE_RESET); | ||
857 | value = DELAYED_STATUS; | ||
858 | break; | ||
859 | |||
860 | case US_BULK_GET_MAX_LUN: | ||
861 | if (ctrl->bRequestType != (USB_DIR_IN | | ||
862 | USB_TYPE_CLASS | USB_RECIP_INTERFACE)) | ||
863 | break; | ||
864 | if (w_index != 0 || w_value != 0 || w_length != 1) { | ||
865 | value = -EDOM; | ||
866 | break; | ||
867 | } | ||
868 | VDBG(fsg, "get max LUN\n"); | ||
869 | *(u8 *) req->buf = fsg->nluns - 1; | ||
870 | value = 1; | ||
871 | break; | ||
872 | } | ||
873 | } | ||
874 | |||
875 | /* Handle CBI class-specific requests */ | ||
876 | else { | ||
877 | switch (ctrl->bRequest) { | ||
878 | |||
879 | case USB_CBI_ADSC_REQUEST: | ||
880 | if (ctrl->bRequestType != (USB_DIR_OUT | | ||
881 | USB_TYPE_CLASS | USB_RECIP_INTERFACE)) | ||
882 | break; | ||
883 | if (w_index != 0 || w_value != 0) { | ||
884 | value = -EDOM; | ||
885 | break; | ||
886 | } | ||
887 | if (w_length > MAX_COMMAND_SIZE) { | ||
888 | value = -EOVERFLOW; | ||
889 | break; | ||
890 | } | ||
891 | value = w_length; | ||
892 | fsg->ep0req->context = received_cbi_adsc; | ||
893 | break; | ||
894 | } | ||
895 | } | ||
896 | |||
897 | if (value == -EOPNOTSUPP) | ||
898 | VDBG(fsg, | ||
899 | "unknown class-specific control req " | ||
900 | "%02x.%02x v%04x i%04x l%u\n", | ||
901 | ctrl->bRequestType, ctrl->bRequest, | ||
902 | le16_to_cpu(ctrl->wValue), w_index, w_length); | ||
903 | return value; | ||
904 | } | ||
905 | |||
906 | |||
907 | /*-------------------------------------------------------------------------*/ | ||
908 | |||
909 | /* Ep0 standard request handlers. These always run in_irq. */ | ||
910 | |||
911 | static int standard_setup_req(struct fsg_dev *fsg, | ||
912 | const struct usb_ctrlrequest *ctrl) | ||
913 | { | ||
914 | struct usb_request *req = fsg->ep0req; | ||
915 | int value = -EOPNOTSUPP; | ||
916 | u16 w_index = le16_to_cpu(ctrl->wIndex); | ||
917 | u16 w_value = le16_to_cpu(ctrl->wValue); | ||
918 | |||
919 | /* Usually this just stores reply data in the pre-allocated ep0 buffer, | ||
920 | * but config change events will also reconfigure hardware. */ | ||
921 | switch (ctrl->bRequest) { | ||
922 | |||
923 | case USB_REQ_GET_DESCRIPTOR: | ||
924 | if (ctrl->bRequestType != (USB_DIR_IN | USB_TYPE_STANDARD | | ||
925 | USB_RECIP_DEVICE)) | ||
926 | break; | ||
927 | switch (w_value >> 8) { | ||
928 | |||
929 | case USB_DT_DEVICE: | ||
930 | VDBG(fsg, "get device descriptor\n"); | ||
931 | device_desc.bMaxPacketSize0 = fsg->ep0->maxpacket; | ||
932 | value = sizeof device_desc; | ||
933 | memcpy(req->buf, &device_desc, value); | ||
934 | break; | ||
935 | case USB_DT_DEVICE_QUALIFIER: | ||
936 | VDBG(fsg, "get device qualifier\n"); | ||
937 | if (!gadget_is_dualspeed(fsg->gadget) || | ||
938 | fsg->gadget->speed == USB_SPEED_SUPER) | ||
939 | break; | ||
940 | /* | ||
941 | * Assume ep0 uses the same maxpacket value for both | ||
942 | * speeds | ||
943 | */ | ||
944 | dev_qualifier.bMaxPacketSize0 = fsg->ep0->maxpacket; | ||
945 | value = sizeof dev_qualifier; | ||
946 | memcpy(req->buf, &dev_qualifier, value); | ||
947 | break; | ||
948 | |||
949 | case USB_DT_OTHER_SPEED_CONFIG: | ||
950 | VDBG(fsg, "get other-speed config descriptor\n"); | ||
951 | if (!gadget_is_dualspeed(fsg->gadget) || | ||
952 | fsg->gadget->speed == USB_SPEED_SUPER) | ||
953 | break; | ||
954 | goto get_config; | ||
955 | case USB_DT_CONFIG: | ||
956 | VDBG(fsg, "get configuration descriptor\n"); | ||
957 | get_config: | ||
958 | value = populate_config_buf(fsg->gadget, | ||
959 | req->buf, | ||
960 | w_value >> 8, | ||
961 | w_value & 0xff); | ||
962 | break; | ||
963 | |||
964 | case USB_DT_STRING: | ||
965 | VDBG(fsg, "get string descriptor\n"); | ||
966 | |||
967 | /* wIndex == language code */ | ||
968 | value = usb_gadget_get_string(&fsg_stringtab, | ||
969 | w_value & 0xff, req->buf); | ||
970 | break; | ||
971 | |||
972 | case USB_DT_BOS: | ||
973 | VDBG(fsg, "get bos descriptor\n"); | ||
974 | |||
975 | if (gadget_is_superspeed(fsg->gadget)) | ||
976 | value = populate_bos(fsg, req->buf); | ||
977 | break; | ||
978 | } | ||
979 | |||
980 | break; | ||
981 | |||
982 | /* One config, two speeds */ | ||
983 | case USB_REQ_SET_CONFIGURATION: | ||
984 | if (ctrl->bRequestType != (USB_DIR_OUT | USB_TYPE_STANDARD | | ||
985 | USB_RECIP_DEVICE)) | ||
986 | break; | ||
987 | VDBG(fsg, "set configuration\n"); | ||
988 | if (w_value == CONFIG_VALUE || w_value == 0) { | ||
989 | fsg->new_config = w_value; | ||
990 | |||
991 | /* Raise an exception to wipe out previous transaction | ||
992 | * state (queued bufs, etc) and set the new config. */ | ||
993 | raise_exception(fsg, FSG_STATE_CONFIG_CHANGE); | ||
994 | value = DELAYED_STATUS; | ||
995 | } | ||
996 | break; | ||
997 | case USB_REQ_GET_CONFIGURATION: | ||
998 | if (ctrl->bRequestType != (USB_DIR_IN | USB_TYPE_STANDARD | | ||
999 | USB_RECIP_DEVICE)) | ||
1000 | break; | ||
1001 | VDBG(fsg, "get configuration\n"); | ||
1002 | *(u8 *) req->buf = fsg->config; | ||
1003 | value = 1; | ||
1004 | break; | ||
1005 | |||
1006 | case USB_REQ_SET_INTERFACE: | ||
1007 | if (ctrl->bRequestType != (USB_DIR_OUT| USB_TYPE_STANDARD | | ||
1008 | USB_RECIP_INTERFACE)) | ||
1009 | break; | ||
1010 | if (fsg->config && w_index == 0) { | ||
1011 | |||
1012 | /* Raise an exception to wipe out previous transaction | ||
1013 | * state (queued bufs, etc) and install the new | ||
1014 | * interface altsetting. */ | ||
1015 | raise_exception(fsg, FSG_STATE_INTERFACE_CHANGE); | ||
1016 | value = DELAYED_STATUS; | ||
1017 | } | ||
1018 | break; | ||
1019 | case USB_REQ_GET_INTERFACE: | ||
1020 | if (ctrl->bRequestType != (USB_DIR_IN | USB_TYPE_STANDARD | | ||
1021 | USB_RECIP_INTERFACE)) | ||
1022 | break; | ||
1023 | if (!fsg->config) | ||
1024 | break; | ||
1025 | if (w_index != 0) { | ||
1026 | value = -EDOM; | ||
1027 | break; | ||
1028 | } | ||
1029 | VDBG(fsg, "get interface\n"); | ||
1030 | *(u8 *) req->buf = 0; | ||
1031 | value = 1; | ||
1032 | break; | ||
1033 | |||
1034 | default: | ||
1035 | VDBG(fsg, | ||
1036 | "unknown control req %02x.%02x v%04x i%04x l%u\n", | ||
1037 | ctrl->bRequestType, ctrl->bRequest, | ||
1038 | w_value, w_index, le16_to_cpu(ctrl->wLength)); | ||
1039 | } | ||
1040 | |||
1041 | return value; | ||
1042 | } | ||
1043 | |||
1044 | |||
1045 | static int fsg_setup(struct usb_gadget *gadget, | ||
1046 | const struct usb_ctrlrequest *ctrl) | ||
1047 | { | ||
1048 | struct fsg_dev *fsg = get_gadget_data(gadget); | ||
1049 | int rc; | ||
1050 | int w_length = le16_to_cpu(ctrl->wLength); | ||
1051 | |||
1052 | ++fsg->ep0_req_tag; // Record arrival of a new request | ||
1053 | fsg->ep0req->context = NULL; | ||
1054 | fsg->ep0req->length = 0; | ||
1055 | dump_msg(fsg, "ep0-setup", (u8 *) ctrl, sizeof(*ctrl)); | ||
1056 | |||
1057 | if ((ctrl->bRequestType & USB_TYPE_MASK) == USB_TYPE_CLASS) | ||
1058 | rc = class_setup_req(fsg, ctrl); | ||
1059 | else | ||
1060 | rc = standard_setup_req(fsg, ctrl); | ||
1061 | |||
1062 | /* Respond with data/status or defer until later? */ | ||
1063 | if (rc >= 0 && rc != DELAYED_STATUS) { | ||
1064 | rc = min(rc, w_length); | ||
1065 | fsg->ep0req->length = rc; | ||
1066 | fsg->ep0req->zero = rc < w_length; | ||
1067 | fsg->ep0req_name = (ctrl->bRequestType & USB_DIR_IN ? | ||
1068 | "ep0-in" : "ep0-out"); | ||
1069 | rc = ep0_queue(fsg); | ||
1070 | } | ||
1071 | |||
1072 | /* Device either stalls (rc < 0) or reports success */ | ||
1073 | return rc; | ||
1074 | } | ||
1075 | |||
1076 | |||
1077 | /*-------------------------------------------------------------------------*/ | ||
1078 | |||
1079 | /* All the following routines run in process context */ | ||
1080 | |||
1081 | |||
1082 | /* Use this for bulk or interrupt transfers, not ep0 */ | ||
1083 | static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep, | ||
1084 | struct usb_request *req, int *pbusy, | ||
1085 | enum fsg_buffer_state *state) | ||
1086 | { | ||
1087 | int rc; | ||
1088 | |||
1089 | if (ep == fsg->bulk_in) | ||
1090 | dump_msg(fsg, "bulk-in", req->buf, req->length); | ||
1091 | else if (ep == fsg->intr_in) | ||
1092 | dump_msg(fsg, "intr-in", req->buf, req->length); | ||
1093 | |||
1094 | spin_lock_irq(&fsg->lock); | ||
1095 | *pbusy = 1; | ||
1096 | *state = BUF_STATE_BUSY; | ||
1097 | spin_unlock_irq(&fsg->lock); | ||
1098 | rc = usb_ep_queue(ep, req, GFP_KERNEL); | ||
1099 | if (rc != 0) { | ||
1100 | *pbusy = 0; | ||
1101 | *state = BUF_STATE_EMPTY; | ||
1102 | |||
1103 | /* We can't do much more than wait for a reset */ | ||
1104 | |||
1105 | /* Note: currently the net2280 driver fails zero-length | ||
1106 | * submissions if DMA is enabled. */ | ||
1107 | if (rc != -ESHUTDOWN && !(rc == -EOPNOTSUPP && | ||
1108 | req->length == 0)) | ||
1109 | WARNING(fsg, "error in submission: %s --> %d\n", | ||
1110 | ep->name, rc); | ||
1111 | } | ||
1112 | } | ||
1113 | |||
1114 | |||
1115 | static int sleep_thread(struct fsg_dev *fsg) | ||
1116 | { | ||
1117 | int rc = 0; | ||
1118 | |||
1119 | /* Wait until a signal arrives or we are woken up */ | ||
1120 | for (;;) { | ||
1121 | try_to_freeze(); | ||
1122 | set_current_state(TASK_INTERRUPTIBLE); | ||
1123 | if (signal_pending(current)) { | ||
1124 | rc = -EINTR; | ||
1125 | break; | ||
1126 | } | ||
1127 | if (fsg->thread_wakeup_needed) | ||
1128 | break; | ||
1129 | schedule(); | ||
1130 | } | ||
1131 | __set_current_state(TASK_RUNNING); | ||
1132 | fsg->thread_wakeup_needed = 0; | ||
1133 | return rc; | ||
1134 | } | ||
1135 | |||
1136 | |||
1137 | /*-------------------------------------------------------------------------*/ | ||
1138 | |||
1139 | static int do_read(struct fsg_dev *fsg) | ||
1140 | { | ||
1141 | struct fsg_lun *curlun = fsg->curlun; | ||
1142 | u32 lba; | ||
1143 | struct fsg_buffhd *bh; | ||
1144 | int rc; | ||
1145 | u32 amount_left; | ||
1146 | loff_t file_offset, file_offset_tmp; | ||
1147 | unsigned int amount; | ||
1148 | ssize_t nread; | ||
1149 | |||
1150 | /* Get the starting Logical Block Address and check that it's | ||
1151 | * not too big */ | ||
1152 | if (fsg->cmnd[0] == READ_6) | ||
1153 | lba = get_unaligned_be24(&fsg->cmnd[1]); | ||
1154 | else { | ||
1155 | lba = get_unaligned_be32(&fsg->cmnd[2]); | ||
1156 | |||
1157 | /* We allow DPO (Disable Page Out = don't save data in the | ||
1158 | * cache) and FUA (Force Unit Access = don't read from the | ||
1159 | * cache), but we don't implement them. */ | ||
1160 | if ((fsg->cmnd[1] & ~0x18) != 0) { | ||
1161 | curlun->sense_data = SS_INVALID_FIELD_IN_CDB; | ||
1162 | return -EINVAL; | ||
1163 | } | ||
1164 | } | ||
1165 | if (lba >= curlun->num_sectors) { | ||
1166 | curlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; | ||
1167 | return -EINVAL; | ||
1168 | } | ||
1169 | file_offset = ((loff_t) lba) << curlun->blkbits; | ||
1170 | |||
1171 | /* Carry out the file reads */ | ||
1172 | amount_left = fsg->data_size_from_cmnd; | ||
1173 | if (unlikely(amount_left == 0)) | ||
1174 | return -EIO; // No default reply | ||
1175 | |||
1176 | for (;;) { | ||
1177 | |||
1178 | /* Figure out how much we need to read: | ||
1179 | * Try to read the remaining amount. | ||
1180 | * But don't read more than the buffer size. | ||
1181 | * And don't try to read past the end of the file. | ||
1182 | */ | ||
1183 | amount = min((unsigned int) amount_left, mod_data.buflen); | ||
1184 | amount = min((loff_t) amount, | ||
1185 | curlun->file_length - file_offset); | ||
1186 | |||
1187 | /* Wait for the next buffer to become available */ | ||
1188 | bh = fsg->next_buffhd_to_fill; | ||
1189 | while (bh->state != BUF_STATE_EMPTY) { | ||
1190 | rc = sleep_thread(fsg); | ||
1191 | if (rc) | ||
1192 | return rc; | ||
1193 | } | ||
1194 | |||
1195 | /* If we were asked to read past the end of file, | ||
1196 | * end with an empty buffer. */ | ||
1197 | if (amount == 0) { | ||
1198 | curlun->sense_data = | ||
1199 | SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; | ||
1200 | curlun->sense_data_info = file_offset >> curlun->blkbits; | ||
1201 | curlun->info_valid = 1; | ||
1202 | bh->inreq->length = 0; | ||
1203 | bh->state = BUF_STATE_FULL; | ||
1204 | break; | ||
1205 | } | ||
1206 | |||
1207 | /* Perform the read */ | ||
1208 | file_offset_tmp = file_offset; | ||
1209 | nread = vfs_read(curlun->filp, | ||
1210 | (char __user *) bh->buf, | ||
1211 | amount, &file_offset_tmp); | ||
1212 | VLDBG(curlun, "file read %u @ %llu -> %d\n", amount, | ||
1213 | (unsigned long long) file_offset, | ||
1214 | (int) nread); | ||
1215 | if (signal_pending(current)) | ||
1216 | return -EINTR; | ||
1217 | |||
1218 | if (nread < 0) { | ||
1219 | LDBG(curlun, "error in file read: %d\n", | ||
1220 | (int) nread); | ||
1221 | nread = 0; | ||
1222 | } else if (nread < amount) { | ||
1223 | LDBG(curlun, "partial file read: %d/%u\n", | ||
1224 | (int) nread, amount); | ||
1225 | nread = round_down(nread, curlun->blksize); | ||
1226 | } | ||
1227 | file_offset += nread; | ||
1228 | amount_left -= nread; | ||
1229 | fsg->residue -= nread; | ||
1230 | |||
1231 | /* Except at the end of the transfer, nread will be | ||
1232 | * equal to the buffer size, which is divisible by the | ||
1233 | * bulk-in maxpacket size. | ||
1234 | */ | ||
1235 | bh->inreq->length = nread; | ||
1236 | bh->state = BUF_STATE_FULL; | ||
1237 | |||
1238 | /* If an error occurred, report it and its position */ | ||
1239 | if (nread < amount) { | ||
1240 | curlun->sense_data = SS_UNRECOVERED_READ_ERROR; | ||
1241 | curlun->sense_data_info = file_offset >> curlun->blkbits; | ||
1242 | curlun->info_valid = 1; | ||
1243 | break; | ||
1244 | } | ||
1245 | |||
1246 | if (amount_left == 0) | ||
1247 | break; // No more left to read | ||
1248 | |||
1249 | /* Send this buffer and go read some more */ | ||
1250 | bh->inreq->zero = 0; | ||
1251 | start_transfer(fsg, fsg->bulk_in, bh->inreq, | ||
1252 | &bh->inreq_busy, &bh->state); | ||
1253 | fsg->next_buffhd_to_fill = bh->next; | ||
1254 | } | ||
1255 | |||
1256 | return -EIO; // No default reply | ||
1257 | } | ||
1258 | |||
1259 | |||
1260 | /*-------------------------------------------------------------------------*/ | ||
1261 | |||
1262 | static int do_write(struct fsg_dev *fsg) | ||
1263 | { | ||
1264 | struct fsg_lun *curlun = fsg->curlun; | ||
1265 | u32 lba; | ||
1266 | struct fsg_buffhd *bh; | ||
1267 | int get_some_more; | ||
1268 | u32 amount_left_to_req, amount_left_to_write; | ||
1269 | loff_t usb_offset, file_offset, file_offset_tmp; | ||
1270 | unsigned int amount; | ||
1271 | ssize_t nwritten; | ||
1272 | int rc; | ||
1273 | |||
1274 | if (curlun->ro) { | ||
1275 | curlun->sense_data = SS_WRITE_PROTECTED; | ||
1276 | return -EINVAL; | ||
1277 | } | ||
1278 | spin_lock(&curlun->filp->f_lock); | ||
1279 | curlun->filp->f_flags &= ~O_SYNC; // Default is not to wait | ||
1280 | spin_unlock(&curlun->filp->f_lock); | ||
1281 | |||
1282 | /* Get the starting Logical Block Address and check that it's | ||
1283 | * not too big */ | ||
1284 | if (fsg->cmnd[0] == WRITE_6) | ||
1285 | lba = get_unaligned_be24(&fsg->cmnd[1]); | ||
1286 | else { | ||
1287 | lba = get_unaligned_be32(&fsg->cmnd[2]); | ||
1288 | |||
1289 | /* We allow DPO (Disable Page Out = don't save data in the | ||
1290 | * cache) and FUA (Force Unit Access = write directly to the | ||
1291 | * medium). We don't implement DPO; we implement FUA by | ||
1292 | * performing synchronous output. */ | ||
1293 | if ((fsg->cmnd[1] & ~0x18) != 0) { | ||
1294 | curlun->sense_data = SS_INVALID_FIELD_IN_CDB; | ||
1295 | return -EINVAL; | ||
1296 | } | ||
1297 | /* FUA */ | ||
1298 | if (!curlun->nofua && (fsg->cmnd[1] & 0x08)) { | ||
1299 | spin_lock(&curlun->filp->f_lock); | ||
1300 | curlun->filp->f_flags |= O_DSYNC; | ||
1301 | spin_unlock(&curlun->filp->f_lock); | ||
1302 | } | ||
1303 | } | ||
1304 | if (lba >= curlun->num_sectors) { | ||
1305 | curlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; | ||
1306 | return -EINVAL; | ||
1307 | } | ||
1308 | |||
1309 | /* Carry out the file writes */ | ||
1310 | get_some_more = 1; | ||
1311 | file_offset = usb_offset = ((loff_t) lba) << curlun->blkbits; | ||
1312 | amount_left_to_req = amount_left_to_write = fsg->data_size_from_cmnd; | ||
1313 | |||
1314 | while (amount_left_to_write > 0) { | ||
1315 | |||
1316 | /* Queue a request for more data from the host */ | ||
1317 | bh = fsg->next_buffhd_to_fill; | ||
1318 | if (bh->state == BUF_STATE_EMPTY && get_some_more) { | ||
1319 | |||
1320 | /* Figure out how much we want to get: | ||
1321 | * Try to get the remaining amount, | ||
1322 | * but not more than the buffer size. | ||
1323 | */ | ||
1324 | amount = min(amount_left_to_req, mod_data.buflen); | ||
1325 | |||
1326 | /* Beyond the end of the backing file? */ | ||
1327 | if (usb_offset >= curlun->file_length) { | ||
1328 | get_some_more = 0; | ||
1329 | curlun->sense_data = | ||
1330 | SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; | ||
1331 | curlun->sense_data_info = usb_offset >> curlun->blkbits; | ||
1332 | curlun->info_valid = 1; | ||
1333 | continue; | ||
1334 | } | ||
1335 | |||
1336 | /* Get the next buffer */ | ||
1337 | usb_offset += amount; | ||
1338 | fsg->usb_amount_left -= amount; | ||
1339 | amount_left_to_req -= amount; | ||
1340 | if (amount_left_to_req == 0) | ||
1341 | get_some_more = 0; | ||
1342 | |||
1343 | /* Except at the end of the transfer, amount will be | ||
1344 | * equal to the buffer size, which is divisible by | ||
1345 | * the bulk-out maxpacket size. | ||
1346 | */ | ||
1347 | set_bulk_out_req_length(fsg, bh, amount); | ||
1348 | start_transfer(fsg, fsg->bulk_out, bh->outreq, | ||
1349 | &bh->outreq_busy, &bh->state); | ||
1350 | fsg->next_buffhd_to_fill = bh->next; | ||
1351 | continue; | ||
1352 | } | ||
1353 | |||
1354 | /* Write the received data to the backing file */ | ||
1355 | bh = fsg->next_buffhd_to_drain; | ||
1356 | if (bh->state == BUF_STATE_EMPTY && !get_some_more) | ||
1357 | break; // We stopped early | ||
1358 | if (bh->state == BUF_STATE_FULL) { | ||
1359 | smp_rmb(); | ||
1360 | fsg->next_buffhd_to_drain = bh->next; | ||
1361 | bh->state = BUF_STATE_EMPTY; | ||
1362 | |||
1363 | /* Did something go wrong with the transfer? */ | ||
1364 | if (bh->outreq->status != 0) { | ||
1365 | curlun->sense_data = SS_COMMUNICATION_FAILURE; | ||
1366 | curlun->sense_data_info = file_offset >> curlun->blkbits; | ||
1367 | curlun->info_valid = 1; | ||
1368 | break; | ||
1369 | } | ||
1370 | |||
1371 | amount = bh->outreq->actual; | ||
1372 | if (curlun->file_length - file_offset < amount) { | ||
1373 | LERROR(curlun, | ||
1374 | "write %u @ %llu beyond end %llu\n", | ||
1375 | amount, (unsigned long long) file_offset, | ||
1376 | (unsigned long long) curlun->file_length); | ||
1377 | amount = curlun->file_length - file_offset; | ||
1378 | } | ||
1379 | |||
1380 | /* Don't accept excess data. The spec doesn't say | ||
1381 | * what to do in this case. We'll ignore the error. | ||
1382 | */ | ||
1383 | amount = min(amount, bh->bulk_out_intended_length); | ||
1384 | |||
1385 | /* Don't write a partial block */ | ||
1386 | amount = round_down(amount, curlun->blksize); | ||
1387 | if (amount == 0) | ||
1388 | goto empty_write; | ||
1389 | |||
1390 | /* Perform the write */ | ||
1391 | file_offset_tmp = file_offset; | ||
1392 | nwritten = vfs_write(curlun->filp, | ||
1393 | (char __user *) bh->buf, | ||
1394 | amount, &file_offset_tmp); | ||
1395 | VLDBG(curlun, "file write %u @ %llu -> %d\n", amount, | ||
1396 | (unsigned long long) file_offset, | ||
1397 | (int) nwritten); | ||
1398 | if (signal_pending(current)) | ||
1399 | return -EINTR; // Interrupted! | ||
1400 | |||
1401 | if (nwritten < 0) { | ||
1402 | LDBG(curlun, "error in file write: %d\n", | ||
1403 | (int) nwritten); | ||
1404 | nwritten = 0; | ||
1405 | } else if (nwritten < amount) { | ||
1406 | LDBG(curlun, "partial file write: %d/%u\n", | ||
1407 | (int) nwritten, amount); | ||
1408 | nwritten = round_down(nwritten, curlun->blksize); | ||
1409 | } | ||
1410 | file_offset += nwritten; | ||
1411 | amount_left_to_write -= nwritten; | ||
1412 | fsg->residue -= nwritten; | ||
1413 | |||
1414 | /* If an error occurred, report it and its position */ | ||
1415 | if (nwritten < amount) { | ||
1416 | curlun->sense_data = SS_WRITE_ERROR; | ||
1417 | curlun->sense_data_info = file_offset >> curlun->blkbits; | ||
1418 | curlun->info_valid = 1; | ||
1419 | break; | ||
1420 | } | ||
1421 | |||
1422 | empty_write: | ||
1423 | /* Did the host decide to stop early? */ | ||
1424 | if (bh->outreq->actual < bh->bulk_out_intended_length) { | ||
1425 | fsg->short_packet_received = 1; | ||
1426 | break; | ||
1427 | } | ||
1428 | continue; | ||
1429 | } | ||
1430 | |||
1431 | /* Wait for something to happen */ | ||
1432 | rc = sleep_thread(fsg); | ||
1433 | if (rc) | ||
1434 | return rc; | ||
1435 | } | ||
1436 | |||
1437 | return -EIO; // No default reply | ||
1438 | } | ||
1439 | |||
1440 | |||
1441 | /*-------------------------------------------------------------------------*/ | ||
1442 | |||
1443 | static int do_synchronize_cache(struct fsg_dev *fsg) | ||
1444 | { | ||
1445 | struct fsg_lun *curlun = fsg->curlun; | ||
1446 | int rc; | ||
1447 | |||
1448 | /* We ignore the requested LBA and write out all file's | ||
1449 | * dirty data buffers. */ | ||
1450 | rc = fsg_lun_fsync_sub(curlun); | ||
1451 | if (rc) | ||
1452 | curlun->sense_data = SS_WRITE_ERROR; | ||
1453 | return 0; | ||
1454 | } | ||
1455 | |||
1456 | |||
1457 | /*-------------------------------------------------------------------------*/ | ||
1458 | |||
1459 | static void invalidate_sub(struct fsg_lun *curlun) | ||
1460 | { | ||
1461 | struct file *filp = curlun->filp; | ||
1462 | struct inode *inode = filp->f_path.dentry->d_inode; | ||
1463 | unsigned long rc; | ||
1464 | |||
1465 | rc = invalidate_mapping_pages(inode->i_mapping, 0, -1); | ||
1466 | VLDBG(curlun, "invalidate_mapping_pages -> %ld\n", rc); | ||
1467 | } | ||
1468 | |||
1469 | static int do_verify(struct fsg_dev *fsg) | ||
1470 | { | ||
1471 | struct fsg_lun *curlun = fsg->curlun; | ||
1472 | u32 lba; | ||
1473 | u32 verification_length; | ||
1474 | struct fsg_buffhd *bh = fsg->next_buffhd_to_fill; | ||
1475 | loff_t file_offset, file_offset_tmp; | ||
1476 | u32 amount_left; | ||
1477 | unsigned int amount; | ||
1478 | ssize_t nread; | ||
1479 | |||
1480 | /* Get the starting Logical Block Address and check that it's | ||
1481 | * not too big */ | ||
1482 | lba = get_unaligned_be32(&fsg->cmnd[2]); | ||
1483 | if (lba >= curlun->num_sectors) { | ||
1484 | curlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; | ||
1485 | return -EINVAL; | ||
1486 | } | ||
1487 | |||
1488 | /* We allow DPO (Disable Page Out = don't save data in the | ||
1489 | * cache) but we don't implement it. */ | ||
1490 | if ((fsg->cmnd[1] & ~0x10) != 0) { | ||
1491 | curlun->sense_data = SS_INVALID_FIELD_IN_CDB; | ||
1492 | return -EINVAL; | ||
1493 | } | ||
1494 | |||
1495 | verification_length = get_unaligned_be16(&fsg->cmnd[7]); | ||
1496 | if (unlikely(verification_length == 0)) | ||
1497 | return -EIO; // No default reply | ||
1498 | |||
1499 | /* Prepare to carry out the file verify */ | ||
1500 | amount_left = verification_length << curlun->blkbits; | ||
1501 | file_offset = ((loff_t) lba) << curlun->blkbits; | ||
1502 | |||
1503 | /* Write out all the dirty buffers before invalidating them */ | ||
1504 | fsg_lun_fsync_sub(curlun); | ||
1505 | if (signal_pending(current)) | ||
1506 | return -EINTR; | ||
1507 | |||
1508 | invalidate_sub(curlun); | ||
1509 | if (signal_pending(current)) | ||
1510 | return -EINTR; | ||
1511 | |||
1512 | /* Just try to read the requested blocks */ | ||
1513 | while (amount_left > 0) { | ||
1514 | |||
1515 | /* Figure out how much we need to read: | ||
1516 | * Try to read the remaining amount, but not more than | ||
1517 | * the buffer size. | ||
1518 | * And don't try to read past the end of the file. | ||
1519 | */ | ||
1520 | amount = min((unsigned int) amount_left, mod_data.buflen); | ||
1521 | amount = min((loff_t) amount, | ||
1522 | curlun->file_length - file_offset); | ||
1523 | if (amount == 0) { | ||
1524 | curlun->sense_data = | ||
1525 | SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; | ||
1526 | curlun->sense_data_info = file_offset >> curlun->blkbits; | ||
1527 | curlun->info_valid = 1; | ||
1528 | break; | ||
1529 | } | ||
1530 | |||
1531 | /* Perform the read */ | ||
1532 | file_offset_tmp = file_offset; | ||
1533 | nread = vfs_read(curlun->filp, | ||
1534 | (char __user *) bh->buf, | ||
1535 | amount, &file_offset_tmp); | ||
1536 | VLDBG(curlun, "file read %u @ %llu -> %d\n", amount, | ||
1537 | (unsigned long long) file_offset, | ||
1538 | (int) nread); | ||
1539 | if (signal_pending(current)) | ||
1540 | return -EINTR; | ||
1541 | |||
1542 | if (nread < 0) { | ||
1543 | LDBG(curlun, "error in file verify: %d\n", | ||
1544 | (int) nread); | ||
1545 | nread = 0; | ||
1546 | } else if (nread < amount) { | ||
1547 | LDBG(curlun, "partial file verify: %d/%u\n", | ||
1548 | (int) nread, amount); | ||
1549 | nread = round_down(nread, curlun->blksize); | ||
1550 | } | ||
1551 | if (nread == 0) { | ||
1552 | curlun->sense_data = SS_UNRECOVERED_READ_ERROR; | ||
1553 | curlun->sense_data_info = file_offset >> curlun->blkbits; | ||
1554 | curlun->info_valid = 1; | ||
1555 | break; | ||
1556 | } | ||
1557 | file_offset += nread; | ||
1558 | amount_left -= nread; | ||
1559 | } | ||
1560 | return 0; | ||
1561 | } | ||
1562 | |||
1563 | |||
1564 | /*-------------------------------------------------------------------------*/ | ||
1565 | |||
1566 | static int do_inquiry(struct fsg_dev *fsg, struct fsg_buffhd *bh) | ||
1567 | { | ||
1568 | u8 *buf = (u8 *) bh->buf; | ||
1569 | |||
1570 | static char vendor_id[] = "Linux "; | ||
1571 | static char product_disk_id[] = "File-Stor Gadget"; | ||
1572 | static char product_cdrom_id[] = "File-CD Gadget "; | ||
1573 | |||
1574 | if (!fsg->curlun) { // Unsupported LUNs are okay | ||
1575 | fsg->bad_lun_okay = 1; | ||
1576 | memset(buf, 0, 36); | ||
1577 | buf[0] = 0x7f; // Unsupported, no device-type | ||
1578 | buf[4] = 31; // Additional length | ||
1579 | return 36; | ||
1580 | } | ||
1581 | |||
1582 | memset(buf, 0, 8); | ||
1583 | buf[0] = (mod_data.cdrom ? TYPE_ROM : TYPE_DISK); | ||
1584 | if (mod_data.removable) | ||
1585 | buf[1] = 0x80; | ||
1586 | buf[2] = 2; // ANSI SCSI level 2 | ||
1587 | buf[3] = 2; // SCSI-2 INQUIRY data format | ||
1588 | buf[4] = 31; // Additional length | ||
1589 | // No special options | ||
1590 | sprintf(buf + 8, "%-8s%-16s%04x", vendor_id, | ||
1591 | (mod_data.cdrom ? product_cdrom_id : | ||
1592 | product_disk_id), | ||
1593 | mod_data.release); | ||
1594 | return 36; | ||
1595 | } | ||
1596 | |||
1597 | |||
1598 | static int do_request_sense(struct fsg_dev *fsg, struct fsg_buffhd *bh) | ||
1599 | { | ||
1600 | struct fsg_lun *curlun = fsg->curlun; | ||
1601 | u8 *buf = (u8 *) bh->buf; | ||
1602 | u32 sd, sdinfo; | ||
1603 | int valid; | ||
1604 | |||
1605 | /* | ||
1606 | * From the SCSI-2 spec., section 7.9 (Unit attention condition): | ||
1607 | * | ||
1608 | * If a REQUEST SENSE command is received from an initiator | ||
1609 | * with a pending unit attention condition (before the target | ||
1610 | * generates the contingent allegiance condition), then the | ||
1611 | * target shall either: | ||
1612 | * a) report any pending sense data and preserve the unit | ||
1613 | * attention condition on the logical unit, or, | ||
1614 | * b) report the unit attention condition, may discard any | ||
1615 | * pending sense data, and clear the unit attention | ||
1616 | * condition on the logical unit for that initiator. | ||
1617 | * | ||
1618 | * FSG normally uses option a); enable this code to use option b). | ||
1619 | */ | ||
1620 | #if 0 | ||
1621 | if (curlun && curlun->unit_attention_data != SS_NO_SENSE) { | ||
1622 | curlun->sense_data = curlun->unit_attention_data; | ||
1623 | curlun->unit_attention_data = SS_NO_SENSE; | ||
1624 | } | ||
1625 | #endif | ||
1626 | |||
1627 | if (!curlun) { // Unsupported LUNs are okay | ||
1628 | fsg->bad_lun_okay = 1; | ||
1629 | sd = SS_LOGICAL_UNIT_NOT_SUPPORTED; | ||
1630 | sdinfo = 0; | ||
1631 | valid = 0; | ||
1632 | } else { | ||
1633 | sd = curlun->sense_data; | ||
1634 | sdinfo = curlun->sense_data_info; | ||
1635 | valid = curlun->info_valid << 7; | ||
1636 | curlun->sense_data = SS_NO_SENSE; | ||
1637 | curlun->sense_data_info = 0; | ||
1638 | curlun->info_valid = 0; | ||
1639 | } | ||
1640 | |||
1641 | memset(buf, 0, 18); | ||
1642 | buf[0] = valid | 0x70; // Valid, current error | ||
1643 | buf[2] = SK(sd); | ||
1644 | put_unaligned_be32(sdinfo, &buf[3]); /* Sense information */ | ||
1645 | buf[7] = 18 - 8; // Additional sense length | ||
1646 | buf[12] = ASC(sd); | ||
1647 | buf[13] = ASCQ(sd); | ||
1648 | return 18; | ||
1649 | } | ||
1650 | |||
1651 | |||
1652 | static int do_read_capacity(struct fsg_dev *fsg, struct fsg_buffhd *bh) | ||
1653 | { | ||
1654 | struct fsg_lun *curlun = fsg->curlun; | ||
1655 | u32 lba = get_unaligned_be32(&fsg->cmnd[2]); | ||
1656 | int pmi = fsg->cmnd[8]; | ||
1657 | u8 *buf = (u8 *) bh->buf; | ||
1658 | |||
1659 | /* Check the PMI and LBA fields */ | ||
1660 | if (pmi > 1 || (pmi == 0 && lba != 0)) { | ||
1661 | curlun->sense_data = SS_INVALID_FIELD_IN_CDB; | ||
1662 | return -EINVAL; | ||
1663 | } | ||
1664 | |||
1665 | put_unaligned_be32(curlun->num_sectors - 1, &buf[0]); | ||
1666 | /* Max logical block */ | ||
1667 | put_unaligned_be32(curlun->blksize, &buf[4]); /* Block length */ | ||
1668 | return 8; | ||
1669 | } | ||
1670 | |||
1671 | |||
1672 | static int do_read_header(struct fsg_dev *fsg, struct fsg_buffhd *bh) | ||
1673 | { | ||
1674 | struct fsg_lun *curlun = fsg->curlun; | ||
1675 | int msf = fsg->cmnd[1] & 0x02; | ||
1676 | u32 lba = get_unaligned_be32(&fsg->cmnd[2]); | ||
1677 | u8 *buf = (u8 *) bh->buf; | ||
1678 | |||
1679 | if ((fsg->cmnd[1] & ~0x02) != 0) { /* Mask away MSF */ | ||
1680 | curlun->sense_data = SS_INVALID_FIELD_IN_CDB; | ||
1681 | return -EINVAL; | ||
1682 | } | ||
1683 | if (lba >= curlun->num_sectors) { | ||
1684 | curlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; | ||
1685 | return -EINVAL; | ||
1686 | } | ||
1687 | |||
1688 | memset(buf, 0, 8); | ||
1689 | buf[0] = 0x01; /* 2048 bytes of user data, rest is EC */ | ||
1690 | store_cdrom_address(&buf[4], msf, lba); | ||
1691 | return 8; | ||
1692 | } | ||
1693 | |||
1694 | |||
1695 | static int do_read_toc(struct fsg_dev *fsg, struct fsg_buffhd *bh) | ||
1696 | { | ||
1697 | struct fsg_lun *curlun = fsg->curlun; | ||
1698 | int msf = fsg->cmnd[1] & 0x02; | ||
1699 | int start_track = fsg->cmnd[6]; | ||
1700 | u8 *buf = (u8 *) bh->buf; | ||
1701 | |||
1702 | if ((fsg->cmnd[1] & ~0x02) != 0 || /* Mask away MSF */ | ||
1703 | start_track > 1) { | ||
1704 | curlun->sense_data = SS_INVALID_FIELD_IN_CDB; | ||
1705 | return -EINVAL; | ||
1706 | } | ||
1707 | |||
1708 | memset(buf, 0, 20); | ||
1709 | buf[1] = (20-2); /* TOC data length */ | ||
1710 | buf[2] = 1; /* First track number */ | ||
1711 | buf[3] = 1; /* Last track number */ | ||
1712 | buf[5] = 0x16; /* Data track, copying allowed */ | ||
1713 | buf[6] = 0x01; /* Only track is number 1 */ | ||
1714 | store_cdrom_address(&buf[8], msf, 0); | ||
1715 | |||
1716 | buf[13] = 0x16; /* Lead-out track is data */ | ||
1717 | buf[14] = 0xAA; /* Lead-out track number */ | ||
1718 | store_cdrom_address(&buf[16], msf, curlun->num_sectors); | ||
1719 | return 20; | ||
1720 | } | ||
1721 | |||
1722 | |||
1723 | static int do_mode_sense(struct fsg_dev *fsg, struct fsg_buffhd *bh) | ||
1724 | { | ||
1725 | struct fsg_lun *curlun = fsg->curlun; | ||
1726 | int mscmnd = fsg->cmnd[0]; | ||
1727 | u8 *buf = (u8 *) bh->buf; | ||
1728 | u8 *buf0 = buf; | ||
1729 | int pc, page_code; | ||
1730 | int changeable_values, all_pages; | ||
1731 | int valid_page = 0; | ||
1732 | int len, limit; | ||
1733 | |||
1734 | if ((fsg->cmnd[1] & ~0x08) != 0) { // Mask away DBD | ||
1735 | curlun->sense_data = SS_INVALID_FIELD_IN_CDB; | ||
1736 | return -EINVAL; | ||
1737 | } | ||
1738 | pc = fsg->cmnd[2] >> 6; | ||
1739 | page_code = fsg->cmnd[2] & 0x3f; | ||
1740 | if (pc == 3) { | ||
1741 | curlun->sense_data = SS_SAVING_PARAMETERS_NOT_SUPPORTED; | ||
1742 | return -EINVAL; | ||
1743 | } | ||
1744 | changeable_values = (pc == 1); | ||
1745 | all_pages = (page_code == 0x3f); | ||
1746 | |||
1747 | /* Write the mode parameter header. Fixed values are: default | ||
1748 | * medium type, no cache control (DPOFUA), and no block descriptors. | ||
1749 | * The only variable value is the WriteProtect bit. We will fill in | ||
1750 | * the mode data length later. */ | ||
1751 | memset(buf, 0, 8); | ||
1752 | if (mscmnd == MODE_SENSE) { | ||
1753 | buf[2] = (curlun->ro ? 0x80 : 0x00); // WP, DPOFUA | ||
1754 | buf += 4; | ||
1755 | limit = 255; | ||
1756 | } else { // MODE_SENSE_10 | ||
1757 | buf[3] = (curlun->ro ? 0x80 : 0x00); // WP, DPOFUA | ||
1758 | buf += 8; | ||
1759 | limit = 65535; // Should really be mod_data.buflen | ||
1760 | } | ||
1761 | |||
1762 | /* No block descriptors */ | ||
1763 | |||
1764 | /* The mode pages, in numerical order. The only page we support | ||
1765 | * is the Caching page. */ | ||
1766 | if (page_code == 0x08 || all_pages) { | ||
1767 | valid_page = 1; | ||
1768 | buf[0] = 0x08; // Page code | ||
1769 | buf[1] = 10; // Page length | ||
1770 | memset(buf+2, 0, 10); // None of the fields are changeable | ||
1771 | |||
1772 | if (!changeable_values) { | ||
1773 | buf[2] = 0x04; // Write cache enable, | ||
1774 | // Read cache not disabled | ||
1775 | // No cache retention priorities | ||
1776 | put_unaligned_be16(0xffff, &buf[4]); | ||
1777 | /* Don't disable prefetch */ | ||
1778 | /* Minimum prefetch = 0 */ | ||
1779 | put_unaligned_be16(0xffff, &buf[8]); | ||
1780 | /* Maximum prefetch */ | ||
1781 | put_unaligned_be16(0xffff, &buf[10]); | ||
1782 | /* Maximum prefetch ceiling */ | ||
1783 | } | ||
1784 | buf += 12; | ||
1785 | } | ||
1786 | |||
1787 | /* Check that a valid page was requested and the mode data length | ||
1788 | * isn't too long. */ | ||
1789 | len = buf - buf0; | ||
1790 | if (!valid_page || len > limit) { | ||
1791 | curlun->sense_data = SS_INVALID_FIELD_IN_CDB; | ||
1792 | return -EINVAL; | ||
1793 | } | ||
1794 | |||
1795 | /* Store the mode data length */ | ||
1796 | if (mscmnd == MODE_SENSE) | ||
1797 | buf0[0] = len - 1; | ||
1798 | else | ||
1799 | put_unaligned_be16(len - 2, buf0); | ||
1800 | return len; | ||
1801 | } | ||
1802 | |||
1803 | |||
1804 | static int do_start_stop(struct fsg_dev *fsg) | ||
1805 | { | ||
1806 | struct fsg_lun *curlun = fsg->curlun; | ||
1807 | int loej, start; | ||
1808 | |||
1809 | if (!mod_data.removable) { | ||
1810 | curlun->sense_data = SS_INVALID_COMMAND; | ||
1811 | return -EINVAL; | ||
1812 | } | ||
1813 | |||
1814 | // int immed = fsg->cmnd[1] & 0x01; | ||
1815 | loej = fsg->cmnd[4] & 0x02; | ||
1816 | start = fsg->cmnd[4] & 0x01; | ||
1817 | |||
1818 | #ifdef CONFIG_USB_FILE_STORAGE_TEST | ||
1819 | if ((fsg->cmnd[1] & ~0x01) != 0 || // Mask away Immed | ||
1820 | (fsg->cmnd[4] & ~0x03) != 0) { // Mask LoEj, Start | ||
1821 | curlun->sense_data = SS_INVALID_FIELD_IN_CDB; | ||
1822 | return -EINVAL; | ||
1823 | } | ||
1824 | |||
1825 | if (!start) { | ||
1826 | |||
1827 | /* Are we allowed to unload the media? */ | ||
1828 | if (curlun->prevent_medium_removal) { | ||
1829 | LDBG(curlun, "unload attempt prevented\n"); | ||
1830 | curlun->sense_data = SS_MEDIUM_REMOVAL_PREVENTED; | ||
1831 | return -EINVAL; | ||
1832 | } | ||
1833 | if (loej) { // Simulate an unload/eject | ||
1834 | up_read(&fsg->filesem); | ||
1835 | down_write(&fsg->filesem); | ||
1836 | fsg_lun_close(curlun); | ||
1837 | up_write(&fsg->filesem); | ||
1838 | down_read(&fsg->filesem); | ||
1839 | } | ||
1840 | } else { | ||
1841 | |||
1842 | /* Our emulation doesn't support mounting; the medium is | ||
1843 | * available for use as soon as it is loaded. */ | ||
1844 | if (!fsg_lun_is_open(curlun)) { | ||
1845 | curlun->sense_data = SS_MEDIUM_NOT_PRESENT; | ||
1846 | return -EINVAL; | ||
1847 | } | ||
1848 | } | ||
1849 | #endif | ||
1850 | return 0; | ||
1851 | } | ||
1852 | |||
1853 | |||
1854 | static int do_prevent_allow(struct fsg_dev *fsg) | ||
1855 | { | ||
1856 | struct fsg_lun *curlun = fsg->curlun; | ||
1857 | int prevent; | ||
1858 | |||
1859 | if (!mod_data.removable) { | ||
1860 | curlun->sense_data = SS_INVALID_COMMAND; | ||
1861 | return -EINVAL; | ||
1862 | } | ||
1863 | |||
1864 | prevent = fsg->cmnd[4] & 0x01; | ||
1865 | if ((fsg->cmnd[4] & ~0x01) != 0) { // Mask away Prevent | ||
1866 | curlun->sense_data = SS_INVALID_FIELD_IN_CDB; | ||
1867 | return -EINVAL; | ||
1868 | } | ||
1869 | |||
1870 | if (curlun->prevent_medium_removal && !prevent) | ||
1871 | fsg_lun_fsync_sub(curlun); | ||
1872 | curlun->prevent_medium_removal = prevent; | ||
1873 | return 0; | ||
1874 | } | ||
1875 | |||
1876 | |||
1877 | static int do_read_format_capacities(struct fsg_dev *fsg, | ||
1878 | struct fsg_buffhd *bh) | ||
1879 | { | ||
1880 | struct fsg_lun *curlun = fsg->curlun; | ||
1881 | u8 *buf = (u8 *) bh->buf; | ||
1882 | |||
1883 | buf[0] = buf[1] = buf[2] = 0; | ||
1884 | buf[3] = 8; // Only the Current/Maximum Capacity Descriptor | ||
1885 | buf += 4; | ||
1886 | |||
1887 | put_unaligned_be32(curlun->num_sectors, &buf[0]); | ||
1888 | /* Number of blocks */ | ||
1889 | put_unaligned_be32(curlun->blksize, &buf[4]); /* Block length */ | ||
1890 | buf[4] = 0x02; /* Current capacity */ | ||
1891 | return 12; | ||
1892 | } | ||
1893 | |||
1894 | |||
1895 | static int do_mode_select(struct fsg_dev *fsg, struct fsg_buffhd *bh) | ||
1896 | { | ||
1897 | struct fsg_lun *curlun = fsg->curlun; | ||
1898 | |||
1899 | /* We don't support MODE SELECT */ | ||
1900 | curlun->sense_data = SS_INVALID_COMMAND; | ||
1901 | return -EINVAL; | ||
1902 | } | ||
1903 | |||
1904 | |||
1905 | /*-------------------------------------------------------------------------*/ | ||
1906 | |||
1907 | static int halt_bulk_in_endpoint(struct fsg_dev *fsg) | ||
1908 | { | ||
1909 | int rc; | ||
1910 | |||
1911 | rc = fsg_set_halt(fsg, fsg->bulk_in); | ||
1912 | if (rc == -EAGAIN) | ||
1913 | VDBG(fsg, "delayed bulk-in endpoint halt\n"); | ||
1914 | while (rc != 0) { | ||
1915 | if (rc != -EAGAIN) { | ||
1916 | WARNING(fsg, "usb_ep_set_halt -> %d\n", rc); | ||
1917 | rc = 0; | ||
1918 | break; | ||
1919 | } | ||
1920 | |||
1921 | /* Wait for a short time and then try again */ | ||
1922 | if (msleep_interruptible(100) != 0) | ||
1923 | return -EINTR; | ||
1924 | rc = usb_ep_set_halt(fsg->bulk_in); | ||
1925 | } | ||
1926 | return rc; | ||
1927 | } | ||
1928 | |||
1929 | static int wedge_bulk_in_endpoint(struct fsg_dev *fsg) | ||
1930 | { | ||
1931 | int rc; | ||
1932 | |||
1933 | DBG(fsg, "bulk-in set wedge\n"); | ||
1934 | rc = usb_ep_set_wedge(fsg->bulk_in); | ||
1935 | if (rc == -EAGAIN) | ||
1936 | VDBG(fsg, "delayed bulk-in endpoint wedge\n"); | ||
1937 | while (rc != 0) { | ||
1938 | if (rc != -EAGAIN) { | ||
1939 | WARNING(fsg, "usb_ep_set_wedge -> %d\n", rc); | ||
1940 | rc = 0; | ||
1941 | break; | ||
1942 | } | ||
1943 | |||
1944 | /* Wait for a short time and then try again */ | ||
1945 | if (msleep_interruptible(100) != 0) | ||
1946 | return -EINTR; | ||
1947 | rc = usb_ep_set_wedge(fsg->bulk_in); | ||
1948 | } | ||
1949 | return rc; | ||
1950 | } | ||
1951 | |||
1952 | static int throw_away_data(struct fsg_dev *fsg) | ||
1953 | { | ||
1954 | struct fsg_buffhd *bh; | ||
1955 | u32 amount; | ||
1956 | int rc; | ||
1957 | |||
1958 | while ((bh = fsg->next_buffhd_to_drain)->state != BUF_STATE_EMPTY || | ||
1959 | fsg->usb_amount_left > 0) { | ||
1960 | |||
1961 | /* Throw away the data in a filled buffer */ | ||
1962 | if (bh->state == BUF_STATE_FULL) { | ||
1963 | smp_rmb(); | ||
1964 | bh->state = BUF_STATE_EMPTY; | ||
1965 | fsg->next_buffhd_to_drain = bh->next; | ||
1966 | |||
1967 | /* A short packet or an error ends everything */ | ||
1968 | if (bh->outreq->actual < bh->bulk_out_intended_length || | ||
1969 | bh->outreq->status != 0) { | ||
1970 | raise_exception(fsg, FSG_STATE_ABORT_BULK_OUT); | ||
1971 | return -EINTR; | ||
1972 | } | ||
1973 | continue; | ||
1974 | } | ||
1975 | |||
1976 | /* Try to submit another request if we need one */ | ||
1977 | bh = fsg->next_buffhd_to_fill; | ||
1978 | if (bh->state == BUF_STATE_EMPTY && fsg->usb_amount_left > 0) { | ||
1979 | amount = min(fsg->usb_amount_left, | ||
1980 | (u32) mod_data.buflen); | ||
1981 | |||
1982 | /* Except at the end of the transfer, amount will be | ||
1983 | * equal to the buffer size, which is divisible by | ||
1984 | * the bulk-out maxpacket size. | ||
1985 | */ | ||
1986 | set_bulk_out_req_length(fsg, bh, amount); | ||
1987 | start_transfer(fsg, fsg->bulk_out, bh->outreq, | ||
1988 | &bh->outreq_busy, &bh->state); | ||
1989 | fsg->next_buffhd_to_fill = bh->next; | ||
1990 | fsg->usb_amount_left -= amount; | ||
1991 | continue; | ||
1992 | } | ||
1993 | |||
1994 | /* Otherwise wait for something to happen */ | ||
1995 | rc = sleep_thread(fsg); | ||
1996 | if (rc) | ||
1997 | return rc; | ||
1998 | } | ||
1999 | return 0; | ||
2000 | } | ||
2001 | |||
2002 | |||
2003 | static int finish_reply(struct fsg_dev *fsg) | ||
2004 | { | ||
2005 | struct fsg_buffhd *bh = fsg->next_buffhd_to_fill; | ||
2006 | int rc = 0; | ||
2007 | |||
2008 | switch (fsg->data_dir) { | ||
2009 | case DATA_DIR_NONE: | ||
2010 | break; // Nothing to send | ||
2011 | |||
2012 | /* If we don't know whether the host wants to read or write, | ||
2013 | * this must be CB or CBI with an unknown command. We mustn't | ||
2014 | * try to send or receive any data. So stall both bulk pipes | ||
2015 | * if we can and wait for a reset. */ | ||
2016 | case DATA_DIR_UNKNOWN: | ||
2017 | if (mod_data.can_stall) { | ||
2018 | fsg_set_halt(fsg, fsg->bulk_out); | ||
2019 | rc = halt_bulk_in_endpoint(fsg); | ||
2020 | } | ||
2021 | break; | ||
2022 | |||
2023 | /* All but the last buffer of data must have already been sent */ | ||
2024 | case DATA_DIR_TO_HOST: | ||
2025 | if (fsg->data_size == 0) | ||
2026 | ; // Nothing to send | ||
2027 | |||
2028 | /* If there's no residue, simply send the last buffer */ | ||
2029 | else if (fsg->residue == 0) { | ||
2030 | bh->inreq->zero = 0; | ||
2031 | start_transfer(fsg, fsg->bulk_in, bh->inreq, | ||
2032 | &bh->inreq_busy, &bh->state); | ||
2033 | fsg->next_buffhd_to_fill = bh->next; | ||
2034 | } | ||
2035 | |||
2036 | /* There is a residue. For CB and CBI, simply mark the end | ||
2037 | * of the data with a short packet. However, if we are | ||
2038 | * allowed to stall, there was no data at all (residue == | ||
2039 | * data_size), and the command failed (invalid LUN or | ||
2040 | * sense data is set), then halt the bulk-in endpoint | ||
2041 | * instead. */ | ||
2042 | else if (!transport_is_bbb()) { | ||
2043 | if (mod_data.can_stall && | ||
2044 | fsg->residue == fsg->data_size && | ||
2045 | (!fsg->curlun || fsg->curlun->sense_data != SS_NO_SENSE)) { | ||
2046 | bh->state = BUF_STATE_EMPTY; | ||
2047 | rc = halt_bulk_in_endpoint(fsg); | ||
2048 | } else { | ||
2049 | bh->inreq->zero = 1; | ||
2050 | start_transfer(fsg, fsg->bulk_in, bh->inreq, | ||
2051 | &bh->inreq_busy, &bh->state); | ||
2052 | fsg->next_buffhd_to_fill = bh->next; | ||
2053 | } | ||
2054 | } | ||
2055 | |||
2056 | /* | ||
2057 | * For Bulk-only, mark the end of the data with a short | ||
2058 | * packet. If we are allowed to stall, halt the bulk-in | ||
2059 | * endpoint. (Note: This violates the Bulk-Only Transport | ||
2060 | * specification, which requires us to pad the data if we | ||
2061 | * don't halt the endpoint. Presumably nobody will mind.) | ||
2062 | */ | ||
2063 | else { | ||
2064 | bh->inreq->zero = 1; | ||
2065 | start_transfer(fsg, fsg->bulk_in, bh->inreq, | ||
2066 | &bh->inreq_busy, &bh->state); | ||
2067 | fsg->next_buffhd_to_fill = bh->next; | ||
2068 | if (mod_data.can_stall) | ||
2069 | rc = halt_bulk_in_endpoint(fsg); | ||
2070 | } | ||
2071 | break; | ||
2072 | |||
2073 | /* We have processed all we want from the data the host has sent. | ||
2074 | * There may still be outstanding bulk-out requests. */ | ||
2075 | case DATA_DIR_FROM_HOST: | ||
2076 | if (fsg->residue == 0) | ||
2077 | ; // Nothing to receive | ||
2078 | |||
2079 | /* Did the host stop sending unexpectedly early? */ | ||
2080 | else if (fsg->short_packet_received) { | ||
2081 | raise_exception(fsg, FSG_STATE_ABORT_BULK_OUT); | ||
2082 | rc = -EINTR; | ||
2083 | } | ||
2084 | |||
2085 | /* We haven't processed all the incoming data. Even though | ||
2086 | * we may be allowed to stall, doing so would cause a race. | ||
2087 | * The controller may already have ACK'ed all the remaining | ||
2088 | * bulk-out packets, in which case the host wouldn't see a | ||
2089 | * STALL. Not realizing the endpoint was halted, it wouldn't | ||
2090 | * clear the halt -- leading to problems later on. */ | ||
2091 | #if 0 | ||
2092 | else if (mod_data.can_stall) { | ||
2093 | fsg_set_halt(fsg, fsg->bulk_out); | ||
2094 | raise_exception(fsg, FSG_STATE_ABORT_BULK_OUT); | ||
2095 | rc = -EINTR; | ||
2096 | } | ||
2097 | #endif | ||
2098 | |||
2099 | /* We can't stall. Read in the excess data and throw it | ||
2100 | * all away. */ | ||
2101 | else | ||
2102 | rc = throw_away_data(fsg); | ||
2103 | break; | ||
2104 | } | ||
2105 | return rc; | ||
2106 | } | ||
2107 | |||
2108 | |||
2109 | static int send_status(struct fsg_dev *fsg) | ||
2110 | { | ||
2111 | struct fsg_lun *curlun = fsg->curlun; | ||
2112 | struct fsg_buffhd *bh; | ||
2113 | int rc; | ||
2114 | u8 status = US_BULK_STAT_OK; | ||
2115 | u32 sd, sdinfo = 0; | ||
2116 | |||
2117 | /* Wait for the next buffer to become available */ | ||
2118 | bh = fsg->next_buffhd_to_fill; | ||
2119 | while (bh->state != BUF_STATE_EMPTY) { | ||
2120 | rc = sleep_thread(fsg); | ||
2121 | if (rc) | ||
2122 | return rc; | ||
2123 | } | ||
2124 | |||
2125 | if (curlun) { | ||
2126 | sd = curlun->sense_data; | ||
2127 | sdinfo = curlun->sense_data_info; | ||
2128 | } else if (fsg->bad_lun_okay) | ||
2129 | sd = SS_NO_SENSE; | ||
2130 | else | ||
2131 | sd = SS_LOGICAL_UNIT_NOT_SUPPORTED; | ||
2132 | |||
2133 | if (fsg->phase_error) { | ||
2134 | DBG(fsg, "sending phase-error status\n"); | ||
2135 | status = US_BULK_STAT_PHASE; | ||
2136 | sd = SS_INVALID_COMMAND; | ||
2137 | } else if (sd != SS_NO_SENSE) { | ||
2138 | DBG(fsg, "sending command-failure status\n"); | ||
2139 | status = US_BULK_STAT_FAIL; | ||
2140 | VDBG(fsg, " sense data: SK x%02x, ASC x%02x, ASCQ x%02x;" | ||
2141 | " info x%x\n", | ||
2142 | SK(sd), ASC(sd), ASCQ(sd), sdinfo); | ||
2143 | } | ||
2144 | |||
2145 | if (transport_is_bbb()) { | ||
2146 | struct bulk_cs_wrap *csw = bh->buf; | ||
2147 | |||
2148 | /* Store and send the Bulk-only CSW */ | ||
2149 | csw->Signature = cpu_to_le32(US_BULK_CS_SIGN); | ||
2150 | csw->Tag = fsg->tag; | ||
2151 | csw->Residue = cpu_to_le32(fsg->residue); | ||
2152 | csw->Status = status; | ||
2153 | |||
2154 | bh->inreq->length = US_BULK_CS_WRAP_LEN; | ||
2155 | bh->inreq->zero = 0; | ||
2156 | start_transfer(fsg, fsg->bulk_in, bh->inreq, | ||
2157 | &bh->inreq_busy, &bh->state); | ||
2158 | |||
2159 | } else if (mod_data.transport_type == USB_PR_CB) { | ||
2160 | |||
2161 | /* Control-Bulk transport has no status phase! */ | ||
2162 | return 0; | ||
2163 | |||
2164 | } else { // USB_PR_CBI | ||
2165 | struct interrupt_data *buf = bh->buf; | ||
2166 | |||
2167 | /* Store and send the Interrupt data. UFI sends the ASC | ||
2168 | * and ASCQ bytes. Everything else sends a Type (which | ||
2169 | * is always 0) and the status Value. */ | ||
2170 | if (mod_data.protocol_type == USB_SC_UFI) { | ||
2171 | buf->bType = ASC(sd); | ||
2172 | buf->bValue = ASCQ(sd); | ||
2173 | } else { | ||
2174 | buf->bType = 0; | ||
2175 | buf->bValue = status; | ||
2176 | } | ||
2177 | fsg->intreq->length = CBI_INTERRUPT_DATA_LEN; | ||
2178 | |||
2179 | fsg->intr_buffhd = bh; // Point to the right buffhd | ||
2180 | fsg->intreq->buf = bh->inreq->buf; | ||
2181 | fsg->intreq->context = bh; | ||
2182 | start_transfer(fsg, fsg->intr_in, fsg->intreq, | ||
2183 | &fsg->intreq_busy, &bh->state); | ||
2184 | } | ||
2185 | |||
2186 | fsg->next_buffhd_to_fill = bh->next; | ||
2187 | return 0; | ||
2188 | } | ||
2189 | |||
2190 | |||
2191 | /*-------------------------------------------------------------------------*/ | ||
2192 | |||
2193 | /* Check whether the command is properly formed and whether its data size | ||
2194 | * and direction agree with the values we already have. */ | ||
2195 | static int check_command(struct fsg_dev *fsg, int cmnd_size, | ||
2196 | enum data_direction data_dir, unsigned int mask, | ||
2197 | int needs_medium, const char *name) | ||
2198 | { | ||
2199 | int i; | ||
2200 | int lun = fsg->cmnd[1] >> 5; | ||
2201 | static const char dirletter[4] = {'u', 'o', 'i', 'n'}; | ||
2202 | char hdlen[20]; | ||
2203 | struct fsg_lun *curlun; | ||
2204 | |||
2205 | /* Adjust the expected cmnd_size for protocol encapsulation padding. | ||
2206 | * Transparent SCSI doesn't pad. */ | ||
2207 | if (protocol_is_scsi()) | ||
2208 | ; | ||
2209 | |||
2210 | /* There's some disagreement as to whether RBC pads commands or not. | ||
2211 | * We'll play it safe and accept either form. */ | ||
2212 | else if (mod_data.protocol_type == USB_SC_RBC) { | ||
2213 | if (fsg->cmnd_size == 12) | ||
2214 | cmnd_size = 12; | ||
2215 | |||
2216 | /* All the other protocols pad to 12 bytes */ | ||
2217 | } else | ||
2218 | cmnd_size = 12; | ||
2219 | |||
2220 | hdlen[0] = 0; | ||
2221 | if (fsg->data_dir != DATA_DIR_UNKNOWN) | ||
2222 | sprintf(hdlen, ", H%c=%u", dirletter[(int) fsg->data_dir], | ||
2223 | fsg->data_size); | ||
2224 | VDBG(fsg, "SCSI command: %s; Dc=%d, D%c=%u; Hc=%d%s\n", | ||
2225 | name, cmnd_size, dirletter[(int) data_dir], | ||
2226 | fsg->data_size_from_cmnd, fsg->cmnd_size, hdlen); | ||
2227 | |||
2228 | /* We can't reply at all until we know the correct data direction | ||
2229 | * and size. */ | ||
2230 | if (fsg->data_size_from_cmnd == 0) | ||
2231 | data_dir = DATA_DIR_NONE; | ||
2232 | if (fsg->data_dir == DATA_DIR_UNKNOWN) { // CB or CBI | ||
2233 | fsg->data_dir = data_dir; | ||
2234 | fsg->data_size = fsg->data_size_from_cmnd; | ||
2235 | |||
2236 | } else { // Bulk-only | ||
2237 | if (fsg->data_size < fsg->data_size_from_cmnd) { | ||
2238 | |||
2239 | /* Host data size < Device data size is a phase error. | ||
2240 | * Carry out the command, but only transfer as much | ||
2241 | * as we are allowed. */ | ||
2242 | fsg->data_size_from_cmnd = fsg->data_size; | ||
2243 | fsg->phase_error = 1; | ||
2244 | } | ||
2245 | } | ||
2246 | fsg->residue = fsg->usb_amount_left = fsg->data_size; | ||
2247 | |||
2248 | /* Conflicting data directions is a phase error */ | ||
2249 | if (fsg->data_dir != data_dir && fsg->data_size_from_cmnd > 0) { | ||
2250 | fsg->phase_error = 1; | ||
2251 | return -EINVAL; | ||
2252 | } | ||
2253 | |||
2254 | /* Verify the length of the command itself */ | ||
2255 | if (cmnd_size != fsg->cmnd_size) { | ||
2256 | |||
2257 | /* Special case workaround: There are plenty of buggy SCSI | ||
2258 | * implementations. Many have issues with cbw->Length | ||
2259 | * field passing a wrong command size. For those cases we | ||
2260 | * always try to work around the problem by using the length | ||
2261 | * sent by the host side provided it is at least as large | ||
2262 | * as the correct command length. | ||
2263 | * Examples of such cases would be MS-Windows, which issues | ||
2264 | * REQUEST SENSE with cbw->Length == 12 where it should | ||
2265 | * be 6, and xbox360 issuing INQUIRY, TEST UNIT READY and | ||
2266 | * REQUEST SENSE with cbw->Length == 10 where it should | ||
2267 | * be 6 as well. | ||
2268 | */ | ||
2269 | if (cmnd_size <= fsg->cmnd_size) { | ||
2270 | DBG(fsg, "%s is buggy! Expected length %d " | ||
2271 | "but we got %d\n", name, | ||
2272 | cmnd_size, fsg->cmnd_size); | ||
2273 | cmnd_size = fsg->cmnd_size; | ||
2274 | } else { | ||
2275 | fsg->phase_error = 1; | ||
2276 | return -EINVAL; | ||
2277 | } | ||
2278 | } | ||
2279 | |||
2280 | /* Check that the LUN values are consistent */ | ||
2281 | if (transport_is_bbb()) { | ||
2282 | if (fsg->lun != lun) | ||
2283 | DBG(fsg, "using LUN %d from CBW, " | ||
2284 | "not LUN %d from CDB\n", | ||
2285 | fsg->lun, lun); | ||
2286 | } | ||
2287 | |||
2288 | /* Check the LUN */ | ||
2289 | curlun = fsg->curlun; | ||
2290 | if (curlun) { | ||
2291 | if (fsg->cmnd[0] != REQUEST_SENSE) { | ||
2292 | curlun->sense_data = SS_NO_SENSE; | ||
2293 | curlun->sense_data_info = 0; | ||
2294 | curlun->info_valid = 0; | ||
2295 | } | ||
2296 | } else { | ||
2297 | fsg->bad_lun_okay = 0; | ||
2298 | |||
2299 | /* INQUIRY and REQUEST SENSE commands are explicitly allowed | ||
2300 | * to use unsupported LUNs; all others may not. */ | ||
2301 | if (fsg->cmnd[0] != INQUIRY && | ||
2302 | fsg->cmnd[0] != REQUEST_SENSE) { | ||
2303 | DBG(fsg, "unsupported LUN %d\n", fsg->lun); | ||
2304 | return -EINVAL; | ||
2305 | } | ||
2306 | } | ||
2307 | |||
2308 | /* If a unit attention condition exists, only INQUIRY and | ||
2309 | * REQUEST SENSE commands are allowed; anything else must fail. */ | ||
2310 | if (curlun && curlun->unit_attention_data != SS_NO_SENSE && | ||
2311 | fsg->cmnd[0] != INQUIRY && | ||
2312 | fsg->cmnd[0] != REQUEST_SENSE) { | ||
2313 | curlun->sense_data = curlun->unit_attention_data; | ||
2314 | curlun->unit_attention_data = SS_NO_SENSE; | ||
2315 | return -EINVAL; | ||
2316 | } | ||
2317 | |||
2318 | /* Check that only command bytes listed in the mask are non-zero */ | ||
2319 | fsg->cmnd[1] &= 0x1f; // Mask away the LUN | ||
2320 | for (i = 1; i < cmnd_size; ++i) { | ||
2321 | if (fsg->cmnd[i] && !(mask & (1 << i))) { | ||
2322 | if (curlun) | ||
2323 | curlun->sense_data = SS_INVALID_FIELD_IN_CDB; | ||
2324 | return -EINVAL; | ||
2325 | } | ||
2326 | } | ||
2327 | |||
2328 | /* If the medium isn't mounted and the command needs to access | ||
2329 | * it, return an error. */ | ||
2330 | if (curlun && !fsg_lun_is_open(curlun) && needs_medium) { | ||
2331 | curlun->sense_data = SS_MEDIUM_NOT_PRESENT; | ||
2332 | return -EINVAL; | ||
2333 | } | ||
2334 | |||
2335 | return 0; | ||
2336 | } | ||
2337 | |||
2338 | /* wrapper of check_command for data size in blocks handling */ | ||
2339 | static int check_command_size_in_blocks(struct fsg_dev *fsg, int cmnd_size, | ||
2340 | enum data_direction data_dir, unsigned int mask, | ||
2341 | int needs_medium, const char *name) | ||
2342 | { | ||
2343 | if (fsg->curlun) | ||
2344 | fsg->data_size_from_cmnd <<= fsg->curlun->blkbits; | ||
2345 | return check_command(fsg, cmnd_size, data_dir, | ||
2346 | mask, needs_medium, name); | ||
2347 | } | ||
2348 | |||
2349 | static int do_scsi_command(struct fsg_dev *fsg) | ||
2350 | { | ||
2351 | struct fsg_buffhd *bh; | ||
2352 | int rc; | ||
2353 | int reply = -EINVAL; | ||
2354 | int i; | ||
2355 | static char unknown[16]; | ||
2356 | |||
2357 | dump_cdb(fsg); | ||
2358 | |||
2359 | /* Wait for the next buffer to become available for data or status */ | ||
2360 | bh = fsg->next_buffhd_to_drain = fsg->next_buffhd_to_fill; | ||
2361 | while (bh->state != BUF_STATE_EMPTY) { | ||
2362 | rc = sleep_thread(fsg); | ||
2363 | if (rc) | ||
2364 | return rc; | ||
2365 | } | ||
2366 | fsg->phase_error = 0; | ||
2367 | fsg->short_packet_received = 0; | ||
2368 | |||
2369 | down_read(&fsg->filesem); // We're using the backing file | ||
2370 | switch (fsg->cmnd[0]) { | ||
2371 | |||
2372 | case INQUIRY: | ||
2373 | fsg->data_size_from_cmnd = fsg->cmnd[4]; | ||
2374 | if ((reply = check_command(fsg, 6, DATA_DIR_TO_HOST, | ||
2375 | (1<<4), 0, | ||
2376 | "INQUIRY")) == 0) | ||
2377 | reply = do_inquiry(fsg, bh); | ||
2378 | break; | ||
2379 | |||
2380 | case MODE_SELECT: | ||
2381 | fsg->data_size_from_cmnd = fsg->cmnd[4]; | ||
2382 | if ((reply = check_command(fsg, 6, DATA_DIR_FROM_HOST, | ||
2383 | (1<<1) | (1<<4), 0, | ||
2384 | "MODE SELECT(6)")) == 0) | ||
2385 | reply = do_mode_select(fsg, bh); | ||
2386 | break; | ||
2387 | |||
2388 | case MODE_SELECT_10: | ||
2389 | fsg->data_size_from_cmnd = get_unaligned_be16(&fsg->cmnd[7]); | ||
2390 | if ((reply = check_command(fsg, 10, DATA_DIR_FROM_HOST, | ||
2391 | (1<<1) | (3<<7), 0, | ||
2392 | "MODE SELECT(10)")) == 0) | ||
2393 | reply = do_mode_select(fsg, bh); | ||
2394 | break; | ||
2395 | |||
2396 | case MODE_SENSE: | ||
2397 | fsg->data_size_from_cmnd = fsg->cmnd[4]; | ||
2398 | if ((reply = check_command(fsg, 6, DATA_DIR_TO_HOST, | ||
2399 | (1<<1) | (1<<2) | (1<<4), 0, | ||
2400 | "MODE SENSE(6)")) == 0) | ||
2401 | reply = do_mode_sense(fsg, bh); | ||
2402 | break; | ||
2403 | |||
2404 | case MODE_SENSE_10: | ||
2405 | fsg->data_size_from_cmnd = get_unaligned_be16(&fsg->cmnd[7]); | ||
2406 | if ((reply = check_command(fsg, 10, DATA_DIR_TO_HOST, | ||
2407 | (1<<1) | (1<<2) | (3<<7), 0, | ||
2408 | "MODE SENSE(10)")) == 0) | ||
2409 | reply = do_mode_sense(fsg, bh); | ||
2410 | break; | ||
2411 | |||
2412 | case ALLOW_MEDIUM_REMOVAL: | ||
2413 | fsg->data_size_from_cmnd = 0; | ||
2414 | if ((reply = check_command(fsg, 6, DATA_DIR_NONE, | ||
2415 | (1<<4), 0, | ||
2416 | "PREVENT-ALLOW MEDIUM REMOVAL")) == 0) | ||
2417 | reply = do_prevent_allow(fsg); | ||
2418 | break; | ||
2419 | |||
2420 | case READ_6: | ||
2421 | i = fsg->cmnd[4]; | ||
2422 | fsg->data_size_from_cmnd = (i == 0) ? 256 : i; | ||
2423 | if ((reply = check_command_size_in_blocks(fsg, 6, | ||
2424 | DATA_DIR_TO_HOST, | ||
2425 | (7<<1) | (1<<4), 1, | ||
2426 | "READ(6)")) == 0) | ||
2427 | reply = do_read(fsg); | ||
2428 | break; | ||
2429 | |||
2430 | case READ_10: | ||
2431 | fsg->data_size_from_cmnd = get_unaligned_be16(&fsg->cmnd[7]); | ||
2432 | if ((reply = check_command_size_in_blocks(fsg, 10, | ||
2433 | DATA_DIR_TO_HOST, | ||
2434 | (1<<1) | (0xf<<2) | (3<<7), 1, | ||
2435 | "READ(10)")) == 0) | ||
2436 | reply = do_read(fsg); | ||
2437 | break; | ||
2438 | |||
2439 | case READ_12: | ||
2440 | fsg->data_size_from_cmnd = get_unaligned_be32(&fsg->cmnd[6]); | ||
2441 | if ((reply = check_command_size_in_blocks(fsg, 12, | ||
2442 | DATA_DIR_TO_HOST, | ||
2443 | (1<<1) | (0xf<<2) | (0xf<<6), 1, | ||
2444 | "READ(12)")) == 0) | ||
2445 | reply = do_read(fsg); | ||
2446 | break; | ||
2447 | |||
2448 | case READ_CAPACITY: | ||
2449 | fsg->data_size_from_cmnd = 8; | ||
2450 | if ((reply = check_command(fsg, 10, DATA_DIR_TO_HOST, | ||
2451 | (0xf<<2) | (1<<8), 1, | ||
2452 | "READ CAPACITY")) == 0) | ||
2453 | reply = do_read_capacity(fsg, bh); | ||
2454 | break; | ||
2455 | |||
2456 | case READ_HEADER: | ||
2457 | if (!mod_data.cdrom) | ||
2458 | goto unknown_cmnd; | ||
2459 | fsg->data_size_from_cmnd = get_unaligned_be16(&fsg->cmnd[7]); | ||
2460 | if ((reply = check_command(fsg, 10, DATA_DIR_TO_HOST, | ||
2461 | (3<<7) | (0x1f<<1), 1, | ||
2462 | "READ HEADER")) == 0) | ||
2463 | reply = do_read_header(fsg, bh); | ||
2464 | break; | ||
2465 | |||
2466 | case READ_TOC: | ||
2467 | if (!mod_data.cdrom) | ||
2468 | goto unknown_cmnd; | ||
2469 | fsg->data_size_from_cmnd = get_unaligned_be16(&fsg->cmnd[7]); | ||
2470 | if ((reply = check_command(fsg, 10, DATA_DIR_TO_HOST, | ||
2471 | (7<<6) | (1<<1), 1, | ||
2472 | "READ TOC")) == 0) | ||
2473 | reply = do_read_toc(fsg, bh); | ||
2474 | break; | ||
2475 | |||
2476 | case READ_FORMAT_CAPACITIES: | ||
2477 | fsg->data_size_from_cmnd = get_unaligned_be16(&fsg->cmnd[7]); | ||
2478 | if ((reply = check_command(fsg, 10, DATA_DIR_TO_HOST, | ||
2479 | (3<<7), 1, | ||
2480 | "READ FORMAT CAPACITIES")) == 0) | ||
2481 | reply = do_read_format_capacities(fsg, bh); | ||
2482 | break; | ||
2483 | |||
2484 | case REQUEST_SENSE: | ||
2485 | fsg->data_size_from_cmnd = fsg->cmnd[4]; | ||
2486 | if ((reply = check_command(fsg, 6, DATA_DIR_TO_HOST, | ||
2487 | (1<<4), 0, | ||
2488 | "REQUEST SENSE")) == 0) | ||
2489 | reply = do_request_sense(fsg, bh); | ||
2490 | break; | ||
2491 | |||
2492 | case START_STOP: | ||
2493 | fsg->data_size_from_cmnd = 0; | ||
2494 | if ((reply = check_command(fsg, 6, DATA_DIR_NONE, | ||
2495 | (1<<1) | (1<<4), 0, | ||
2496 | "START-STOP UNIT")) == 0) | ||
2497 | reply = do_start_stop(fsg); | ||
2498 | break; | ||
2499 | |||
2500 | case SYNCHRONIZE_CACHE: | ||
2501 | fsg->data_size_from_cmnd = 0; | ||
2502 | if ((reply = check_command(fsg, 10, DATA_DIR_NONE, | ||
2503 | (0xf<<2) | (3<<7), 1, | ||
2504 | "SYNCHRONIZE CACHE")) == 0) | ||
2505 | reply = do_synchronize_cache(fsg); | ||
2506 | break; | ||
2507 | |||
2508 | case TEST_UNIT_READY: | ||
2509 | fsg->data_size_from_cmnd = 0; | ||
2510 | reply = check_command(fsg, 6, DATA_DIR_NONE, | ||
2511 | 0, 1, | ||
2512 | "TEST UNIT READY"); | ||
2513 | break; | ||
2514 | |||
2515 | /* Although optional, this command is used by MS-Windows. We | ||
2516 | * support a minimal version: BytChk must be 0. */ | ||
2517 | case VERIFY: | ||
2518 | fsg->data_size_from_cmnd = 0; | ||
2519 | if ((reply = check_command(fsg, 10, DATA_DIR_NONE, | ||
2520 | (1<<1) | (0xf<<2) | (3<<7), 1, | ||
2521 | "VERIFY")) == 0) | ||
2522 | reply = do_verify(fsg); | ||
2523 | break; | ||
2524 | |||
2525 | case WRITE_6: | ||
2526 | i = fsg->cmnd[4]; | ||
2527 | fsg->data_size_from_cmnd = (i == 0) ? 256 : i; | ||
2528 | if ((reply = check_command_size_in_blocks(fsg, 6, | ||
2529 | DATA_DIR_FROM_HOST, | ||
2530 | (7<<1) | (1<<4), 1, | ||
2531 | "WRITE(6)")) == 0) | ||
2532 | reply = do_write(fsg); | ||
2533 | break; | ||
2534 | |||
2535 | case WRITE_10: | ||
2536 | fsg->data_size_from_cmnd = get_unaligned_be16(&fsg->cmnd[7]); | ||
2537 | if ((reply = check_command_size_in_blocks(fsg, 10, | ||
2538 | DATA_DIR_FROM_HOST, | ||
2539 | (1<<1) | (0xf<<2) | (3<<7), 1, | ||
2540 | "WRITE(10)")) == 0) | ||
2541 | reply = do_write(fsg); | ||
2542 | break; | ||
2543 | |||
2544 | case WRITE_12: | ||
2545 | fsg->data_size_from_cmnd = get_unaligned_be32(&fsg->cmnd[6]); | ||
2546 | if ((reply = check_command_size_in_blocks(fsg, 12, | ||
2547 | DATA_DIR_FROM_HOST, | ||
2548 | (1<<1) | (0xf<<2) | (0xf<<6), 1, | ||
2549 | "WRITE(12)")) == 0) | ||
2550 | reply = do_write(fsg); | ||
2551 | break; | ||
2552 | |||
2553 | /* Some mandatory commands that we recognize but don't implement. | ||
2554 | * They don't mean much in this setting. It's left as an exercise | ||
2555 | * for anyone interested to implement RESERVE and RELEASE in terms | ||
2556 | * of Posix locks. */ | ||
2557 | case FORMAT_UNIT: | ||
2558 | case RELEASE: | ||
2559 | case RESERVE: | ||
2560 | case SEND_DIAGNOSTIC: | ||
2561 | // Fall through | ||
2562 | |||
2563 | default: | ||
2564 | unknown_cmnd: | ||
2565 | fsg->data_size_from_cmnd = 0; | ||
2566 | sprintf(unknown, "Unknown x%02x", fsg->cmnd[0]); | ||
2567 | if ((reply = check_command(fsg, fsg->cmnd_size, | ||
2568 | DATA_DIR_UNKNOWN, ~0, 0, unknown)) == 0) { | ||
2569 | fsg->curlun->sense_data = SS_INVALID_COMMAND; | ||
2570 | reply = -EINVAL; | ||
2571 | } | ||
2572 | break; | ||
2573 | } | ||
2574 | up_read(&fsg->filesem); | ||
2575 | |||
2576 | if (reply == -EINTR || signal_pending(current)) | ||
2577 | return -EINTR; | ||
2578 | |||
2579 | /* Set up the single reply buffer for finish_reply() */ | ||
2580 | if (reply == -EINVAL) | ||
2581 | reply = 0; // Error reply length | ||
2582 | if (reply >= 0 && fsg->data_dir == DATA_DIR_TO_HOST) { | ||
2583 | reply = min((u32) reply, fsg->data_size_from_cmnd); | ||
2584 | bh->inreq->length = reply; | ||
2585 | bh->state = BUF_STATE_FULL; | ||
2586 | fsg->residue -= reply; | ||
2587 | } // Otherwise it's already set | ||
2588 | |||
2589 | return 0; | ||
2590 | } | ||
2591 | |||
2592 | |||
2593 | /*-------------------------------------------------------------------------*/ | ||
2594 | |||
2595 | static int received_cbw(struct fsg_dev *fsg, struct fsg_buffhd *bh) | ||
2596 | { | ||
2597 | struct usb_request *req = bh->outreq; | ||
2598 | struct bulk_cb_wrap *cbw = req->buf; | ||
2599 | |||
2600 | /* Was this a real packet? Should it be ignored? */ | ||
2601 | if (req->status || test_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags)) | ||
2602 | return -EINVAL; | ||
2603 | |||
2604 | /* Is the CBW valid? */ | ||
2605 | if (req->actual != US_BULK_CB_WRAP_LEN || | ||
2606 | cbw->Signature != cpu_to_le32( | ||
2607 | US_BULK_CB_SIGN)) { | ||
2608 | DBG(fsg, "invalid CBW: len %u sig 0x%x\n", | ||
2609 | req->actual, | ||
2610 | le32_to_cpu(cbw->Signature)); | ||
2611 | |||
2612 | /* The Bulk-only spec says we MUST stall the IN endpoint | ||
2613 | * (6.6.1), so it's unavoidable. It also says we must | ||
2614 | * retain this state until the next reset, but there's | ||
2615 | * no way to tell the controller driver it should ignore | ||
2616 | * Clear-Feature(HALT) requests. | ||
2617 | * | ||
2618 | * We aren't required to halt the OUT endpoint; instead | ||
2619 | * we can simply accept and discard any data received | ||
2620 | * until the next reset. */ | ||
2621 | wedge_bulk_in_endpoint(fsg); | ||
2622 | set_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags); | ||
2623 | return -EINVAL; | ||
2624 | } | ||
2625 | |||
2626 | /* Is the CBW meaningful? */ | ||
2627 | if (cbw->Lun >= FSG_MAX_LUNS || cbw->Flags & ~US_BULK_FLAG_IN || | ||
2628 | cbw->Length <= 0 || cbw->Length > MAX_COMMAND_SIZE) { | ||
2629 | DBG(fsg, "non-meaningful CBW: lun = %u, flags = 0x%x, " | ||
2630 | "cmdlen %u\n", | ||
2631 | cbw->Lun, cbw->Flags, cbw->Length); | ||
2632 | |||
2633 | /* We can do anything we want here, so let's stall the | ||
2634 | * bulk pipes if we are allowed to. */ | ||
2635 | if (mod_data.can_stall) { | ||
2636 | fsg_set_halt(fsg, fsg->bulk_out); | ||
2637 | halt_bulk_in_endpoint(fsg); | ||
2638 | } | ||
2639 | return -EINVAL; | ||
2640 | } | ||
2641 | |||
2642 | /* Save the command for later */ | ||
2643 | fsg->cmnd_size = cbw->Length; | ||
2644 | memcpy(fsg->cmnd, cbw->CDB, fsg->cmnd_size); | ||
2645 | if (cbw->Flags & US_BULK_FLAG_IN) | ||
2646 | fsg->data_dir = DATA_DIR_TO_HOST; | ||
2647 | else | ||
2648 | fsg->data_dir = DATA_DIR_FROM_HOST; | ||
2649 | fsg->data_size = le32_to_cpu(cbw->DataTransferLength); | ||
2650 | if (fsg->data_size == 0) | ||
2651 | fsg->data_dir = DATA_DIR_NONE; | ||
2652 | fsg->lun = cbw->Lun; | ||
2653 | fsg->tag = cbw->Tag; | ||
2654 | return 0; | ||
2655 | } | ||
2656 | |||
2657 | |||
2658 | static int get_next_command(struct fsg_dev *fsg) | ||
2659 | { | ||
2660 | struct fsg_buffhd *bh; | ||
2661 | int rc = 0; | ||
2662 | |||
2663 | if (transport_is_bbb()) { | ||
2664 | |||
2665 | /* Wait for the next buffer to become available */ | ||
2666 | bh = fsg->next_buffhd_to_fill; | ||
2667 | while (bh->state != BUF_STATE_EMPTY) { | ||
2668 | rc = sleep_thread(fsg); | ||
2669 | if (rc) | ||
2670 | return rc; | ||
2671 | } | ||
2672 | |||
2673 | /* Queue a request to read a Bulk-only CBW */ | ||
2674 | set_bulk_out_req_length(fsg, bh, US_BULK_CB_WRAP_LEN); | ||
2675 | start_transfer(fsg, fsg->bulk_out, bh->outreq, | ||
2676 | &bh->outreq_busy, &bh->state); | ||
2677 | |||
2678 | /* We will drain the buffer in software, which means we | ||
2679 | * can reuse it for the next filling. No need to advance | ||
2680 | * next_buffhd_to_fill. */ | ||
2681 | |||
2682 | /* Wait for the CBW to arrive */ | ||
2683 | while (bh->state != BUF_STATE_FULL) { | ||
2684 | rc = sleep_thread(fsg); | ||
2685 | if (rc) | ||
2686 | return rc; | ||
2687 | } | ||
2688 | smp_rmb(); | ||
2689 | rc = received_cbw(fsg, bh); | ||
2690 | bh->state = BUF_STATE_EMPTY; | ||
2691 | |||
2692 | } else { // USB_PR_CB or USB_PR_CBI | ||
2693 | |||
2694 | /* Wait for the next command to arrive */ | ||
2695 | while (fsg->cbbuf_cmnd_size == 0) { | ||
2696 | rc = sleep_thread(fsg); | ||
2697 | if (rc) | ||
2698 | return rc; | ||
2699 | } | ||
2700 | |||
2701 | /* Is the previous status interrupt request still busy? | ||
2702 | * The host is allowed to skip reading the status, | ||
2703 | * so we must cancel it. */ | ||
2704 | if (fsg->intreq_busy) | ||
2705 | usb_ep_dequeue(fsg->intr_in, fsg->intreq); | ||
2706 | |||
2707 | /* Copy the command and mark the buffer empty */ | ||
2708 | fsg->data_dir = DATA_DIR_UNKNOWN; | ||
2709 | spin_lock_irq(&fsg->lock); | ||
2710 | fsg->cmnd_size = fsg->cbbuf_cmnd_size; | ||
2711 | memcpy(fsg->cmnd, fsg->cbbuf_cmnd, fsg->cmnd_size); | ||
2712 | fsg->cbbuf_cmnd_size = 0; | ||
2713 | spin_unlock_irq(&fsg->lock); | ||
2714 | |||
2715 | /* Use LUN from the command */ | ||
2716 | fsg->lun = fsg->cmnd[1] >> 5; | ||
2717 | } | ||
2718 | |||
2719 | /* Update current lun */ | ||
2720 | if (fsg->lun >= 0 && fsg->lun < fsg->nluns) | ||
2721 | fsg->curlun = &fsg->luns[fsg->lun]; | ||
2722 | else | ||
2723 | fsg->curlun = NULL; | ||
2724 | |||
2725 | return rc; | ||
2726 | } | ||
2727 | |||
2728 | |||
2729 | /*-------------------------------------------------------------------------*/ | ||
2730 | |||
2731 | static int enable_endpoint(struct fsg_dev *fsg, struct usb_ep *ep, | ||
2732 | const struct usb_endpoint_descriptor *d) | ||
2733 | { | ||
2734 | int rc; | ||
2735 | |||
2736 | ep->driver_data = fsg; | ||
2737 | ep->desc = d; | ||
2738 | rc = usb_ep_enable(ep); | ||
2739 | if (rc) | ||
2740 | ERROR(fsg, "can't enable %s, result %d\n", ep->name, rc); | ||
2741 | return rc; | ||
2742 | } | ||
2743 | |||
2744 | static int alloc_request(struct fsg_dev *fsg, struct usb_ep *ep, | ||
2745 | struct usb_request **preq) | ||
2746 | { | ||
2747 | *preq = usb_ep_alloc_request(ep, GFP_ATOMIC); | ||
2748 | if (*preq) | ||
2749 | return 0; | ||
2750 | ERROR(fsg, "can't allocate request for %s\n", ep->name); | ||
2751 | return -ENOMEM; | ||
2752 | } | ||
2753 | |||
2754 | /* | ||
2755 | * Reset interface setting and re-init endpoint state (toggle etc). | ||
2756 | * Call with altsetting < 0 to disable the interface. The only other | ||
2757 | * available altsetting is 0, which enables the interface. | ||
2758 | */ | ||
2759 | static int do_set_interface(struct fsg_dev *fsg, int altsetting) | ||
2760 | { | ||
2761 | int rc = 0; | ||
2762 | int i; | ||
2763 | const struct usb_endpoint_descriptor *d; | ||
2764 | |||
2765 | if (fsg->running) | ||
2766 | DBG(fsg, "reset interface\n"); | ||
2767 | |||
2768 | reset: | ||
2769 | /* Deallocate the requests */ | ||
2770 | for (i = 0; i < fsg_num_buffers; ++i) { | ||
2771 | struct fsg_buffhd *bh = &fsg->buffhds[i]; | ||
2772 | |||
2773 | if (bh->inreq) { | ||
2774 | usb_ep_free_request(fsg->bulk_in, bh->inreq); | ||
2775 | bh->inreq = NULL; | ||
2776 | } | ||
2777 | if (bh->outreq) { | ||
2778 | usb_ep_free_request(fsg->bulk_out, bh->outreq); | ||
2779 | bh->outreq = NULL; | ||
2780 | } | ||
2781 | } | ||
2782 | if (fsg->intreq) { | ||
2783 | usb_ep_free_request(fsg->intr_in, fsg->intreq); | ||
2784 | fsg->intreq = NULL; | ||
2785 | } | ||
2786 | |||
2787 | /* Disable the endpoints */ | ||
2788 | if (fsg->bulk_in_enabled) { | ||
2789 | usb_ep_disable(fsg->bulk_in); | ||
2790 | fsg->bulk_in_enabled = 0; | ||
2791 | } | ||
2792 | if (fsg->bulk_out_enabled) { | ||
2793 | usb_ep_disable(fsg->bulk_out); | ||
2794 | fsg->bulk_out_enabled = 0; | ||
2795 | } | ||
2796 | if (fsg->intr_in_enabled) { | ||
2797 | usb_ep_disable(fsg->intr_in); | ||
2798 | fsg->intr_in_enabled = 0; | ||
2799 | } | ||
2800 | |||
2801 | fsg->running = 0; | ||
2802 | if (altsetting < 0 || rc != 0) | ||
2803 | return rc; | ||
2804 | |||
2805 | DBG(fsg, "set interface %d\n", altsetting); | ||
2806 | |||
2807 | /* Enable the endpoints */ | ||
2808 | d = fsg_ep_desc(fsg->gadget, | ||
2809 | &fsg_fs_bulk_in_desc, &fsg_hs_bulk_in_desc, | ||
2810 | &fsg_ss_bulk_in_desc); | ||
2811 | if ((rc = enable_endpoint(fsg, fsg->bulk_in, d)) != 0) | ||
2812 | goto reset; | ||
2813 | fsg->bulk_in_enabled = 1; | ||
2814 | |||
2815 | d = fsg_ep_desc(fsg->gadget, | ||
2816 | &fsg_fs_bulk_out_desc, &fsg_hs_bulk_out_desc, | ||
2817 | &fsg_ss_bulk_out_desc); | ||
2818 | if ((rc = enable_endpoint(fsg, fsg->bulk_out, d)) != 0) | ||
2819 | goto reset; | ||
2820 | fsg->bulk_out_enabled = 1; | ||
2821 | fsg->bulk_out_maxpacket = usb_endpoint_maxp(d); | ||
2822 | clear_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags); | ||
2823 | |||
2824 | if (transport_is_cbi()) { | ||
2825 | d = fsg_ep_desc(fsg->gadget, | ||
2826 | &fsg_fs_intr_in_desc, &fsg_hs_intr_in_desc, | ||
2827 | &fsg_ss_intr_in_desc); | ||
2828 | if ((rc = enable_endpoint(fsg, fsg->intr_in, d)) != 0) | ||
2829 | goto reset; | ||
2830 | fsg->intr_in_enabled = 1; | ||
2831 | } | ||
2832 | |||
2833 | /* Allocate the requests */ | ||
2834 | for (i = 0; i < fsg_num_buffers; ++i) { | ||
2835 | struct fsg_buffhd *bh = &fsg->buffhds[i]; | ||
2836 | |||
2837 | if ((rc = alloc_request(fsg, fsg->bulk_in, &bh->inreq)) != 0) | ||
2838 | goto reset; | ||
2839 | if ((rc = alloc_request(fsg, fsg->bulk_out, &bh->outreq)) != 0) | ||
2840 | goto reset; | ||
2841 | bh->inreq->buf = bh->outreq->buf = bh->buf; | ||
2842 | bh->inreq->context = bh->outreq->context = bh; | ||
2843 | bh->inreq->complete = bulk_in_complete; | ||
2844 | bh->outreq->complete = bulk_out_complete; | ||
2845 | } | ||
2846 | if (transport_is_cbi()) { | ||
2847 | if ((rc = alloc_request(fsg, fsg->intr_in, &fsg->intreq)) != 0) | ||
2848 | goto reset; | ||
2849 | fsg->intreq->complete = intr_in_complete; | ||
2850 | } | ||
2851 | |||
2852 | fsg->running = 1; | ||
2853 | for (i = 0; i < fsg->nluns; ++i) | ||
2854 | fsg->luns[i].unit_attention_data = SS_RESET_OCCURRED; | ||
2855 | return rc; | ||
2856 | } | ||
2857 | |||
2858 | |||
2859 | /* | ||
2860 | * Change our operational configuration. This code must agree with the code | ||
2861 | * that returns config descriptors, and with interface altsetting code. | ||
2862 | * | ||
2863 | * It's also responsible for power management interactions. Some | ||
2864 | * configurations might not work with our current power sources. | ||
2865 | * For now we just assume the gadget is always self-powered. | ||
2866 | */ | ||
2867 | static int do_set_config(struct fsg_dev *fsg, u8 new_config) | ||
2868 | { | ||
2869 | int rc = 0; | ||
2870 | |||
2871 | /* Disable the single interface */ | ||
2872 | if (fsg->config != 0) { | ||
2873 | DBG(fsg, "reset config\n"); | ||
2874 | fsg->config = 0; | ||
2875 | rc = do_set_interface(fsg, -1); | ||
2876 | } | ||
2877 | |||
2878 | /* Enable the interface */ | ||
2879 | if (new_config != 0) { | ||
2880 | fsg->config = new_config; | ||
2881 | if ((rc = do_set_interface(fsg, 0)) != 0) | ||
2882 | fsg->config = 0; // Reset on errors | ||
2883 | else | ||
2884 | INFO(fsg, "%s config #%d\n", | ||
2885 | usb_speed_string(fsg->gadget->speed), | ||
2886 | fsg->config); | ||
2887 | } | ||
2888 | return rc; | ||
2889 | } | ||
2890 | |||
2891 | |||
2892 | /*-------------------------------------------------------------------------*/ | ||
2893 | |||
2894 | static void handle_exception(struct fsg_dev *fsg) | ||
2895 | { | ||
2896 | siginfo_t info; | ||
2897 | int sig; | ||
2898 | int i; | ||
2899 | int num_active; | ||
2900 | struct fsg_buffhd *bh; | ||
2901 | enum fsg_state old_state; | ||
2902 | u8 new_config; | ||
2903 | struct fsg_lun *curlun; | ||
2904 | unsigned int exception_req_tag; | ||
2905 | int rc; | ||
2906 | |||
2907 | /* Clear the existing signals. Anything but SIGUSR1 is converted | ||
2908 | * into a high-priority EXIT exception. */ | ||
2909 | for (;;) { | ||
2910 | sig = dequeue_signal_lock(current, ¤t->blocked, &info); | ||
2911 | if (!sig) | ||
2912 | break; | ||
2913 | if (sig != SIGUSR1) { | ||
2914 | if (fsg->state < FSG_STATE_EXIT) | ||
2915 | DBG(fsg, "Main thread exiting on signal\n"); | ||
2916 | raise_exception(fsg, FSG_STATE_EXIT); | ||
2917 | } | ||
2918 | } | ||
2919 | |||
2920 | /* Cancel all the pending transfers */ | ||
2921 | if (fsg->intreq_busy) | ||
2922 | usb_ep_dequeue(fsg->intr_in, fsg->intreq); | ||
2923 | for (i = 0; i < fsg_num_buffers; ++i) { | ||
2924 | bh = &fsg->buffhds[i]; | ||
2925 | if (bh->inreq_busy) | ||
2926 | usb_ep_dequeue(fsg->bulk_in, bh->inreq); | ||
2927 | if (bh->outreq_busy) | ||
2928 | usb_ep_dequeue(fsg->bulk_out, bh->outreq); | ||
2929 | } | ||
2930 | |||
2931 | /* Wait until everything is idle */ | ||
2932 | for (;;) { | ||
2933 | num_active = fsg->intreq_busy; | ||
2934 | for (i = 0; i < fsg_num_buffers; ++i) { | ||
2935 | bh = &fsg->buffhds[i]; | ||
2936 | num_active += bh->inreq_busy + bh->outreq_busy; | ||
2937 | } | ||
2938 | if (num_active == 0) | ||
2939 | break; | ||
2940 | if (sleep_thread(fsg)) | ||
2941 | return; | ||
2942 | } | ||
2943 | |||
2944 | /* Clear out the controller's fifos */ | ||
2945 | if (fsg->bulk_in_enabled) | ||
2946 | usb_ep_fifo_flush(fsg->bulk_in); | ||
2947 | if (fsg->bulk_out_enabled) | ||
2948 | usb_ep_fifo_flush(fsg->bulk_out); | ||
2949 | if (fsg->intr_in_enabled) | ||
2950 | usb_ep_fifo_flush(fsg->intr_in); | ||
2951 | |||
2952 | /* Reset the I/O buffer states and pointers, the SCSI | ||
2953 | * state, and the exception. Then invoke the handler. */ | ||
2954 | spin_lock_irq(&fsg->lock); | ||
2955 | |||
2956 | for (i = 0; i < fsg_num_buffers; ++i) { | ||
2957 | bh = &fsg->buffhds[i]; | ||
2958 | bh->state = BUF_STATE_EMPTY; | ||
2959 | } | ||
2960 | fsg->next_buffhd_to_fill = fsg->next_buffhd_to_drain = | ||
2961 | &fsg->buffhds[0]; | ||
2962 | |||
2963 | exception_req_tag = fsg->exception_req_tag; | ||
2964 | new_config = fsg->new_config; | ||
2965 | old_state = fsg->state; | ||
2966 | |||
2967 | if (old_state == FSG_STATE_ABORT_BULK_OUT) | ||
2968 | fsg->state = FSG_STATE_STATUS_PHASE; | ||
2969 | else { | ||
2970 | for (i = 0; i < fsg->nluns; ++i) { | ||
2971 | curlun = &fsg->luns[i]; | ||
2972 | curlun->prevent_medium_removal = 0; | ||
2973 | curlun->sense_data = curlun->unit_attention_data = | ||
2974 | SS_NO_SENSE; | ||
2975 | curlun->sense_data_info = 0; | ||
2976 | curlun->info_valid = 0; | ||
2977 | } | ||
2978 | fsg->state = FSG_STATE_IDLE; | ||
2979 | } | ||
2980 | spin_unlock_irq(&fsg->lock); | ||
2981 | |||
2982 | /* Carry out any extra actions required for the exception */ | ||
2983 | switch (old_state) { | ||
2984 | default: | ||
2985 | break; | ||
2986 | |||
2987 | case FSG_STATE_ABORT_BULK_OUT: | ||
2988 | send_status(fsg); | ||
2989 | spin_lock_irq(&fsg->lock); | ||
2990 | if (fsg->state == FSG_STATE_STATUS_PHASE) | ||
2991 | fsg->state = FSG_STATE_IDLE; | ||
2992 | spin_unlock_irq(&fsg->lock); | ||
2993 | break; | ||
2994 | |||
2995 | case FSG_STATE_RESET: | ||
2996 | /* In case we were forced against our will to halt a | ||
2997 | * bulk endpoint, clear the halt now. (The SuperH UDC | ||
2998 | * requires this.) */ | ||
2999 | if (test_and_clear_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags)) | ||
3000 | usb_ep_clear_halt(fsg->bulk_in); | ||
3001 | |||
3002 | if (transport_is_bbb()) { | ||
3003 | if (fsg->ep0_req_tag == exception_req_tag) | ||
3004 | ep0_queue(fsg); // Complete the status stage | ||
3005 | |||
3006 | } else if (transport_is_cbi()) | ||
3007 | send_status(fsg); // Status by interrupt pipe | ||
3008 | |||
3009 | /* Technically this should go here, but it would only be | ||
3010 | * a waste of time. Ditto for the INTERFACE_CHANGE and | ||
3011 | * CONFIG_CHANGE cases. */ | ||
3012 | // for (i = 0; i < fsg->nluns; ++i) | ||
3013 | // fsg->luns[i].unit_attention_data = SS_RESET_OCCURRED; | ||
3014 | break; | ||
3015 | |||
3016 | case FSG_STATE_INTERFACE_CHANGE: | ||
3017 | rc = do_set_interface(fsg, 0); | ||
3018 | if (fsg->ep0_req_tag != exception_req_tag) | ||
3019 | break; | ||
3020 | if (rc != 0) // STALL on errors | ||
3021 | fsg_set_halt(fsg, fsg->ep0); | ||
3022 | else // Complete the status stage | ||
3023 | ep0_queue(fsg); | ||
3024 | break; | ||
3025 | |||
3026 | case FSG_STATE_CONFIG_CHANGE: | ||
3027 | rc = do_set_config(fsg, new_config); | ||
3028 | if (fsg->ep0_req_tag != exception_req_tag) | ||
3029 | break; | ||
3030 | if (rc != 0) // STALL on errors | ||
3031 | fsg_set_halt(fsg, fsg->ep0); | ||
3032 | else // Complete the status stage | ||
3033 | ep0_queue(fsg); | ||
3034 | break; | ||
3035 | |||
3036 | case FSG_STATE_DISCONNECT: | ||
3037 | for (i = 0; i < fsg->nluns; ++i) | ||
3038 | fsg_lun_fsync_sub(fsg->luns + i); | ||
3039 | do_set_config(fsg, 0); // Unconfigured state | ||
3040 | break; | ||
3041 | |||
3042 | case FSG_STATE_EXIT: | ||
3043 | case FSG_STATE_TERMINATED: | ||
3044 | do_set_config(fsg, 0); // Free resources | ||
3045 | spin_lock_irq(&fsg->lock); | ||
3046 | fsg->state = FSG_STATE_TERMINATED; // Stop the thread | ||
3047 | spin_unlock_irq(&fsg->lock); | ||
3048 | break; | ||
3049 | } | ||
3050 | } | ||
3051 | |||
3052 | |||
3053 | /*-------------------------------------------------------------------------*/ | ||
3054 | |||
3055 | static int fsg_main_thread(void *fsg_) | ||
3056 | { | ||
3057 | struct fsg_dev *fsg = fsg_; | ||
3058 | |||
3059 | /* Allow the thread to be killed by a signal, but set the signal mask | ||
3060 | * to block everything but INT, TERM, KILL, and USR1. */ | ||
3061 | allow_signal(SIGINT); | ||
3062 | allow_signal(SIGTERM); | ||
3063 | allow_signal(SIGKILL); | ||
3064 | allow_signal(SIGUSR1); | ||
3065 | |||
3066 | /* Allow the thread to be frozen */ | ||
3067 | set_freezable(); | ||
3068 | |||
3069 | /* Arrange for userspace references to be interpreted as kernel | ||
3070 | * pointers. That way we can pass a kernel pointer to a routine | ||
3071 | * that expects a __user pointer and it will work okay. */ | ||
3072 | set_fs(get_ds()); | ||
3073 | |||
3074 | /* The main loop */ | ||
3075 | while (fsg->state != FSG_STATE_TERMINATED) { | ||
3076 | if (exception_in_progress(fsg) || signal_pending(current)) { | ||
3077 | handle_exception(fsg); | ||
3078 | continue; | ||
3079 | } | ||
3080 | |||
3081 | if (!fsg->running) { | ||
3082 | sleep_thread(fsg); | ||
3083 | continue; | ||
3084 | } | ||
3085 | |||
3086 | if (get_next_command(fsg)) | ||
3087 | continue; | ||
3088 | |||
3089 | spin_lock_irq(&fsg->lock); | ||
3090 | if (!exception_in_progress(fsg)) | ||
3091 | fsg->state = FSG_STATE_DATA_PHASE; | ||
3092 | spin_unlock_irq(&fsg->lock); | ||
3093 | |||
3094 | if (do_scsi_command(fsg) || finish_reply(fsg)) | ||
3095 | continue; | ||
3096 | |||
3097 | spin_lock_irq(&fsg->lock); | ||
3098 | if (!exception_in_progress(fsg)) | ||
3099 | fsg->state = FSG_STATE_STATUS_PHASE; | ||
3100 | spin_unlock_irq(&fsg->lock); | ||
3101 | |||
3102 | if (send_status(fsg)) | ||
3103 | continue; | ||
3104 | |||
3105 | spin_lock_irq(&fsg->lock); | ||
3106 | if (!exception_in_progress(fsg)) | ||
3107 | fsg->state = FSG_STATE_IDLE; | ||
3108 | spin_unlock_irq(&fsg->lock); | ||
3109 | } | ||
3110 | |||
3111 | spin_lock_irq(&fsg->lock); | ||
3112 | fsg->thread_task = NULL; | ||
3113 | spin_unlock_irq(&fsg->lock); | ||
3114 | |||
3115 | /* If we are exiting because of a signal, unregister the | ||
3116 | * gadget driver. */ | ||
3117 | if (test_and_clear_bit(REGISTERED, &fsg->atomic_bitflags)) | ||
3118 | usb_gadget_unregister_driver(&fsg_driver); | ||
3119 | |||
3120 | /* Let the unbind and cleanup routines know the thread has exited */ | ||
3121 | complete_and_exit(&fsg->thread_notifier, 0); | ||
3122 | } | ||
3123 | |||
3124 | |||
3125 | /*-------------------------------------------------------------------------*/ | ||
3126 | |||
3127 | |||
3128 | /* The write permissions and store_xxx pointers are set in fsg_bind() */ | ||
3129 | static DEVICE_ATTR(ro, 0444, fsg_show_ro, NULL); | ||
3130 | static DEVICE_ATTR(nofua, 0644, fsg_show_nofua, NULL); | ||
3131 | static DEVICE_ATTR(file, 0444, fsg_show_file, NULL); | ||
3132 | |||
3133 | |||
3134 | /*-------------------------------------------------------------------------*/ | ||
3135 | |||
3136 | static void fsg_release(struct kref *ref) | ||
3137 | { | ||
3138 | struct fsg_dev *fsg = container_of(ref, struct fsg_dev, ref); | ||
3139 | |||
3140 | kfree(fsg->luns); | ||
3141 | kfree(fsg); | ||
3142 | } | ||
3143 | |||
3144 | static void lun_release(struct device *dev) | ||
3145 | { | ||
3146 | struct rw_semaphore *filesem = dev_get_drvdata(dev); | ||
3147 | struct fsg_dev *fsg = | ||
3148 | container_of(filesem, struct fsg_dev, filesem); | ||
3149 | |||
3150 | kref_put(&fsg->ref, fsg_release); | ||
3151 | } | ||
3152 | |||
3153 | static void /* __init_or_exit */ fsg_unbind(struct usb_gadget *gadget) | ||
3154 | { | ||
3155 | struct fsg_dev *fsg = get_gadget_data(gadget); | ||
3156 | int i; | ||
3157 | struct fsg_lun *curlun; | ||
3158 | struct usb_request *req = fsg->ep0req; | ||
3159 | |||
3160 | DBG(fsg, "unbind\n"); | ||
3161 | clear_bit(REGISTERED, &fsg->atomic_bitflags); | ||
3162 | |||
3163 | /* If the thread isn't already dead, tell it to exit now */ | ||
3164 | if (fsg->state != FSG_STATE_TERMINATED) { | ||
3165 | raise_exception(fsg, FSG_STATE_EXIT); | ||
3166 | wait_for_completion(&fsg->thread_notifier); | ||
3167 | |||
3168 | /* The cleanup routine waits for this completion also */ | ||
3169 | complete(&fsg->thread_notifier); | ||
3170 | } | ||
3171 | |||
3172 | /* Unregister the sysfs attribute files and the LUNs */ | ||
3173 | for (i = 0; i < fsg->nluns; ++i) { | ||
3174 | curlun = &fsg->luns[i]; | ||
3175 | if (curlun->registered) { | ||
3176 | device_remove_file(&curlun->dev, &dev_attr_nofua); | ||
3177 | device_remove_file(&curlun->dev, &dev_attr_ro); | ||
3178 | device_remove_file(&curlun->dev, &dev_attr_file); | ||
3179 | fsg_lun_close(curlun); | ||
3180 | device_unregister(&curlun->dev); | ||
3181 | curlun->registered = 0; | ||
3182 | } | ||
3183 | } | ||
3184 | |||
3185 | /* Free the data buffers */ | ||
3186 | for (i = 0; i < fsg_num_buffers; ++i) | ||
3187 | kfree(fsg->buffhds[i].buf); | ||
3188 | |||
3189 | /* Free the request and buffer for endpoint 0 */ | ||
3190 | if (req) { | ||
3191 | kfree(req->buf); | ||
3192 | usb_ep_free_request(fsg->ep0, req); | ||
3193 | } | ||
3194 | |||
3195 | set_gadget_data(gadget, NULL); | ||
3196 | } | ||
3197 | |||
3198 | |||
3199 | static int __init check_parameters(struct fsg_dev *fsg) | ||
3200 | { | ||
3201 | int prot; | ||
3202 | |||
3203 | /* Store the default values */ | ||
3204 | mod_data.transport_type = USB_PR_BULK; | ||
3205 | mod_data.transport_name = "Bulk-only"; | ||
3206 | mod_data.protocol_type = USB_SC_SCSI; | ||
3207 | mod_data.protocol_name = "Transparent SCSI"; | ||
3208 | |||
3209 | /* Some peripheral controllers are known not to be able to | ||
3210 | * halt bulk endpoints correctly. If one of them is present, | ||
3211 | * disable stalls. | ||
3212 | */ | ||
3213 | if (gadget_is_at91(fsg->gadget)) | ||
3214 | mod_data.can_stall = 0; | ||
3215 | |||
3216 | if (mod_data.release == 0xffff) | ||
3217 | mod_data.release = get_default_bcdDevice(); | ||
3218 | |||
3219 | prot = simple_strtol(mod_data.protocol_parm, NULL, 0); | ||
3220 | |||
3221 | #ifdef CONFIG_USB_FILE_STORAGE_TEST | ||
3222 | if (strnicmp(mod_data.transport_parm, "BBB", 10) == 0) { | ||
3223 | ; // Use default setting | ||
3224 | } else if (strnicmp(mod_data.transport_parm, "CB", 10) == 0) { | ||
3225 | mod_data.transport_type = USB_PR_CB; | ||
3226 | mod_data.transport_name = "Control-Bulk"; | ||
3227 | } else if (strnicmp(mod_data.transport_parm, "CBI", 10) == 0) { | ||
3228 | mod_data.transport_type = USB_PR_CBI; | ||
3229 | mod_data.transport_name = "Control-Bulk-Interrupt"; | ||
3230 | } else { | ||
3231 | ERROR(fsg, "invalid transport: %s\n", mod_data.transport_parm); | ||
3232 | return -EINVAL; | ||
3233 | } | ||
3234 | |||
3235 | if (strnicmp(mod_data.protocol_parm, "SCSI", 10) == 0 || | ||
3236 | prot == USB_SC_SCSI) { | ||
3237 | ; // Use default setting | ||
3238 | } else if (strnicmp(mod_data.protocol_parm, "RBC", 10) == 0 || | ||
3239 | prot == USB_SC_RBC) { | ||
3240 | mod_data.protocol_type = USB_SC_RBC; | ||
3241 | mod_data.protocol_name = "RBC"; | ||
3242 | } else if (strnicmp(mod_data.protocol_parm, "8020", 4) == 0 || | ||
3243 | strnicmp(mod_data.protocol_parm, "ATAPI", 10) == 0 || | ||
3244 | prot == USB_SC_8020) { | ||
3245 | mod_data.protocol_type = USB_SC_8020; | ||
3246 | mod_data.protocol_name = "8020i (ATAPI)"; | ||
3247 | } else if (strnicmp(mod_data.protocol_parm, "QIC", 3) == 0 || | ||
3248 | prot == USB_SC_QIC) { | ||
3249 | mod_data.protocol_type = USB_SC_QIC; | ||
3250 | mod_data.protocol_name = "QIC-157"; | ||
3251 | } else if (strnicmp(mod_data.protocol_parm, "UFI", 10) == 0 || | ||
3252 | prot == USB_SC_UFI) { | ||
3253 | mod_data.protocol_type = USB_SC_UFI; | ||
3254 | mod_data.protocol_name = "UFI"; | ||
3255 | } else if (strnicmp(mod_data.protocol_parm, "8070", 4) == 0 || | ||
3256 | prot == USB_SC_8070) { | ||
3257 | mod_data.protocol_type = USB_SC_8070; | ||
3258 | mod_data.protocol_name = "8070i"; | ||
3259 | } else { | ||
3260 | ERROR(fsg, "invalid protocol: %s\n", mod_data.protocol_parm); | ||
3261 | return -EINVAL; | ||
3262 | } | ||
3263 | |||
3264 | mod_data.buflen &= PAGE_CACHE_MASK; | ||
3265 | if (mod_data.buflen <= 0) { | ||
3266 | ERROR(fsg, "invalid buflen\n"); | ||
3267 | return -ETOOSMALL; | ||
3268 | } | ||
3269 | |||
3270 | #endif /* CONFIG_USB_FILE_STORAGE_TEST */ | ||
3271 | |||
3272 | /* Serial string handling. | ||
3273 | * On a real device, the serial string would be loaded | ||
3274 | * from permanent storage. */ | ||
3275 | if (mod_data.serial) { | ||
3276 | const char *ch; | ||
3277 | unsigned len = 0; | ||
3278 | |||
3279 | /* Sanity check : | ||
3280 | * The CB[I] specification limits the serial string to | ||
3281 | * 12 uppercase hexadecimal characters. | ||
3282 | * BBB need at least 12 uppercase hexadecimal characters, | ||
3283 | * with a maximum of 126. */ | ||
3284 | for (ch = mod_data.serial; *ch; ++ch) { | ||
3285 | ++len; | ||
3286 | if ((*ch < '0' || *ch > '9') && | ||
3287 | (*ch < 'A' || *ch > 'F')) { /* not uppercase hex */ | ||
3288 | WARNING(fsg, | ||
3289 | "Invalid serial string character: %c\n", | ||
3290 | *ch); | ||
3291 | goto no_serial; | ||
3292 | } | ||
3293 | } | ||
3294 | if (len > 126 || | ||
3295 | (mod_data.transport_type == USB_PR_BULK && len < 12) || | ||
3296 | (mod_data.transport_type != USB_PR_BULK && len > 12)) { | ||
3297 | WARNING(fsg, "Invalid serial string length!\n"); | ||
3298 | goto no_serial; | ||
3299 | } | ||
3300 | fsg_strings[FSG_STRING_SERIAL - 1].s = mod_data.serial; | ||
3301 | } else { | ||
3302 | WARNING(fsg, "No serial-number string provided!\n"); | ||
3303 | no_serial: | ||
3304 | device_desc.iSerialNumber = 0; | ||
3305 | } | ||
3306 | |||
3307 | return 0; | ||
3308 | } | ||
3309 | |||
3310 | |||
3311 | static int __init fsg_bind(struct usb_gadget *gadget, | ||
3312 | struct usb_gadget_driver *driver) | ||
3313 | { | ||
3314 | struct fsg_dev *fsg = the_fsg; | ||
3315 | int rc; | ||
3316 | int i; | ||
3317 | struct fsg_lun *curlun; | ||
3318 | struct usb_ep *ep; | ||
3319 | struct usb_request *req; | ||
3320 | char *pathbuf, *p; | ||
3321 | |||
3322 | fsg->gadget = gadget; | ||
3323 | set_gadget_data(gadget, fsg); | ||
3324 | fsg->ep0 = gadget->ep0; | ||
3325 | fsg->ep0->driver_data = fsg; | ||
3326 | |||
3327 | if ((rc = check_parameters(fsg)) != 0) | ||
3328 | goto out; | ||
3329 | |||
3330 | if (mod_data.removable) { // Enable the store_xxx attributes | ||
3331 | dev_attr_file.attr.mode = 0644; | ||
3332 | dev_attr_file.store = fsg_store_file; | ||
3333 | if (!mod_data.cdrom) { | ||
3334 | dev_attr_ro.attr.mode = 0644; | ||
3335 | dev_attr_ro.store = fsg_store_ro; | ||
3336 | } | ||
3337 | } | ||
3338 | |||
3339 | /* Only for removable media? */ | ||
3340 | dev_attr_nofua.attr.mode = 0644; | ||
3341 | dev_attr_nofua.store = fsg_store_nofua; | ||
3342 | |||
3343 | /* Find out how many LUNs there should be */ | ||
3344 | i = mod_data.nluns; | ||
3345 | if (i == 0) | ||
3346 | i = max(mod_data.num_filenames, 1u); | ||
3347 | if (i > FSG_MAX_LUNS) { | ||
3348 | ERROR(fsg, "invalid number of LUNs: %d\n", i); | ||
3349 | rc = -EINVAL; | ||
3350 | goto out; | ||
3351 | } | ||
3352 | |||
3353 | /* Create the LUNs, open their backing files, and register the | ||
3354 | * LUN devices in sysfs. */ | ||
3355 | fsg->luns = kzalloc(i * sizeof(struct fsg_lun), GFP_KERNEL); | ||
3356 | if (!fsg->luns) { | ||
3357 | rc = -ENOMEM; | ||
3358 | goto out; | ||
3359 | } | ||
3360 | fsg->nluns = i; | ||
3361 | |||
3362 | for (i = 0; i < fsg->nluns; ++i) { | ||
3363 | curlun = &fsg->luns[i]; | ||
3364 | curlun->cdrom = !!mod_data.cdrom; | ||
3365 | curlun->ro = mod_data.cdrom || mod_data.ro[i]; | ||
3366 | curlun->initially_ro = curlun->ro; | ||
3367 | curlun->removable = mod_data.removable; | ||
3368 | curlun->nofua = mod_data.nofua[i]; | ||
3369 | curlun->dev.release = lun_release; | ||
3370 | curlun->dev.parent = &gadget->dev; | ||
3371 | curlun->dev.driver = &fsg_driver.driver; | ||
3372 | dev_set_drvdata(&curlun->dev, &fsg->filesem); | ||
3373 | dev_set_name(&curlun->dev,"%s-lun%d", | ||
3374 | dev_name(&gadget->dev), i); | ||
3375 | |||
3376 | kref_get(&fsg->ref); | ||
3377 | rc = device_register(&curlun->dev); | ||
3378 | if (rc) { | ||
3379 | INFO(fsg, "failed to register LUN%d: %d\n", i, rc); | ||
3380 | put_device(&curlun->dev); | ||
3381 | goto out; | ||
3382 | } | ||
3383 | curlun->registered = 1; | ||
3384 | |||
3385 | rc = device_create_file(&curlun->dev, &dev_attr_ro); | ||
3386 | if (rc) | ||
3387 | goto out; | ||
3388 | rc = device_create_file(&curlun->dev, &dev_attr_nofua); | ||
3389 | if (rc) | ||
3390 | goto out; | ||
3391 | rc = device_create_file(&curlun->dev, &dev_attr_file); | ||
3392 | if (rc) | ||
3393 | goto out; | ||
3394 | |||
3395 | if (mod_data.file[i] && *mod_data.file[i]) { | ||
3396 | rc = fsg_lun_open(curlun, mod_data.file[i]); | ||
3397 | if (rc) | ||
3398 | goto out; | ||
3399 | } else if (!mod_data.removable) { | ||
3400 | ERROR(fsg, "no file given for LUN%d\n", i); | ||
3401 | rc = -EINVAL; | ||
3402 | goto out; | ||
3403 | } | ||
3404 | } | ||
3405 | |||
3406 | /* Find all the endpoints we will use */ | ||
3407 | usb_ep_autoconfig_reset(gadget); | ||
3408 | ep = usb_ep_autoconfig(gadget, &fsg_fs_bulk_in_desc); | ||
3409 | if (!ep) | ||
3410 | goto autoconf_fail; | ||
3411 | ep->driver_data = fsg; // claim the endpoint | ||
3412 | fsg->bulk_in = ep; | ||
3413 | |||
3414 | ep = usb_ep_autoconfig(gadget, &fsg_fs_bulk_out_desc); | ||
3415 | if (!ep) | ||
3416 | goto autoconf_fail; | ||
3417 | ep->driver_data = fsg; // claim the endpoint | ||
3418 | fsg->bulk_out = ep; | ||
3419 | |||
3420 | if (transport_is_cbi()) { | ||
3421 | ep = usb_ep_autoconfig(gadget, &fsg_fs_intr_in_desc); | ||
3422 | if (!ep) | ||
3423 | goto autoconf_fail; | ||
3424 | ep->driver_data = fsg; // claim the endpoint | ||
3425 | fsg->intr_in = ep; | ||
3426 | } | ||
3427 | |||
3428 | /* Fix up the descriptors */ | ||
3429 | device_desc.idVendor = cpu_to_le16(mod_data.vendor); | ||
3430 | device_desc.idProduct = cpu_to_le16(mod_data.product); | ||
3431 | device_desc.bcdDevice = cpu_to_le16(mod_data.release); | ||
3432 | |||
3433 | i = (transport_is_cbi() ? 3 : 2); // Number of endpoints | ||
3434 | fsg_intf_desc.bNumEndpoints = i; | ||
3435 | fsg_intf_desc.bInterfaceSubClass = mod_data.protocol_type; | ||
3436 | fsg_intf_desc.bInterfaceProtocol = mod_data.transport_type; | ||
3437 | fsg_fs_function[i + FSG_FS_FUNCTION_PRE_EP_ENTRIES] = NULL; | ||
3438 | |||
3439 | if (gadget_is_dualspeed(gadget)) { | ||
3440 | fsg_hs_function[i + FSG_HS_FUNCTION_PRE_EP_ENTRIES] = NULL; | ||
3441 | |||
3442 | /* Assume endpoint addresses are the same for both speeds */ | ||
3443 | fsg_hs_bulk_in_desc.bEndpointAddress = | ||
3444 | fsg_fs_bulk_in_desc.bEndpointAddress; | ||
3445 | fsg_hs_bulk_out_desc.bEndpointAddress = | ||
3446 | fsg_fs_bulk_out_desc.bEndpointAddress; | ||
3447 | fsg_hs_intr_in_desc.bEndpointAddress = | ||
3448 | fsg_fs_intr_in_desc.bEndpointAddress; | ||
3449 | } | ||
3450 | |||
3451 | if (gadget_is_superspeed(gadget)) { | ||
3452 | unsigned max_burst; | ||
3453 | |||
3454 | fsg_ss_function[i + FSG_SS_FUNCTION_PRE_EP_ENTRIES] = NULL; | ||
3455 | |||
3456 | /* Calculate bMaxBurst, we know packet size is 1024 */ | ||
3457 | max_burst = min_t(unsigned, mod_data.buflen / 1024, 15); | ||
3458 | |||
3459 | /* Assume endpoint addresses are the same for both speeds */ | ||
3460 | fsg_ss_bulk_in_desc.bEndpointAddress = | ||
3461 | fsg_fs_bulk_in_desc.bEndpointAddress; | ||
3462 | fsg_ss_bulk_in_comp_desc.bMaxBurst = max_burst; | ||
3463 | |||
3464 | fsg_ss_bulk_out_desc.bEndpointAddress = | ||
3465 | fsg_fs_bulk_out_desc.bEndpointAddress; | ||
3466 | fsg_ss_bulk_out_comp_desc.bMaxBurst = max_burst; | ||
3467 | } | ||
3468 | |||
3469 | if (gadget_is_otg(gadget)) | ||
3470 | fsg_otg_desc.bmAttributes |= USB_OTG_HNP; | ||
3471 | |||
3472 | rc = -ENOMEM; | ||
3473 | |||
3474 | /* Allocate the request and buffer for endpoint 0 */ | ||
3475 | fsg->ep0req = req = usb_ep_alloc_request(fsg->ep0, GFP_KERNEL); | ||
3476 | if (!req) | ||
3477 | goto out; | ||
3478 | req->buf = kmalloc(EP0_BUFSIZE, GFP_KERNEL); | ||
3479 | if (!req->buf) | ||
3480 | goto out; | ||
3481 | req->complete = ep0_complete; | ||
3482 | |||
3483 | /* Allocate the data buffers */ | ||
3484 | for (i = 0; i < fsg_num_buffers; ++i) { | ||
3485 | struct fsg_buffhd *bh = &fsg->buffhds[i]; | ||
3486 | |||
3487 | /* Allocate for the bulk-in endpoint. We assume that | ||
3488 | * the buffer will also work with the bulk-out (and | ||
3489 | * interrupt-in) endpoint. */ | ||
3490 | bh->buf = kmalloc(mod_data.buflen, GFP_KERNEL); | ||
3491 | if (!bh->buf) | ||
3492 | goto out; | ||
3493 | bh->next = bh + 1; | ||
3494 | } | ||
3495 | fsg->buffhds[fsg_num_buffers - 1].next = &fsg->buffhds[0]; | ||
3496 | |||
3497 | /* This should reflect the actual gadget power source */ | ||
3498 | usb_gadget_set_selfpowered(gadget); | ||
3499 | |||
3500 | snprintf(fsg_string_manufacturer, sizeof fsg_string_manufacturer, | ||
3501 | "%s %s with %s", | ||
3502 | init_utsname()->sysname, init_utsname()->release, | ||
3503 | gadget->name); | ||
3504 | |||
3505 | fsg->thread_task = kthread_create(fsg_main_thread, fsg, | ||
3506 | "file-storage-gadget"); | ||
3507 | if (IS_ERR(fsg->thread_task)) { | ||
3508 | rc = PTR_ERR(fsg->thread_task); | ||
3509 | goto out; | ||
3510 | } | ||
3511 | |||
3512 | INFO(fsg, DRIVER_DESC ", version: " DRIVER_VERSION "\n"); | ||
3513 | INFO(fsg, "NOTE: This driver is deprecated. " | ||
3514 | "Consider using g_mass_storage instead.\n"); | ||
3515 | INFO(fsg, "Number of LUNs=%d\n", fsg->nluns); | ||
3516 | |||
3517 | pathbuf = kmalloc(PATH_MAX, GFP_KERNEL); | ||
3518 | for (i = 0; i < fsg->nluns; ++i) { | ||
3519 | curlun = &fsg->luns[i]; | ||
3520 | if (fsg_lun_is_open(curlun)) { | ||
3521 | p = NULL; | ||
3522 | if (pathbuf) { | ||
3523 | p = d_path(&curlun->filp->f_path, | ||
3524 | pathbuf, PATH_MAX); | ||
3525 | if (IS_ERR(p)) | ||
3526 | p = NULL; | ||
3527 | } | ||
3528 | LINFO(curlun, "ro=%d, nofua=%d, file: %s\n", | ||
3529 | curlun->ro, curlun->nofua, (p ? p : "(error)")); | ||
3530 | } | ||
3531 | } | ||
3532 | kfree(pathbuf); | ||
3533 | |||
3534 | DBG(fsg, "transport=%s (x%02x)\n", | ||
3535 | mod_data.transport_name, mod_data.transport_type); | ||
3536 | DBG(fsg, "protocol=%s (x%02x)\n", | ||
3537 | mod_data.protocol_name, mod_data.protocol_type); | ||
3538 | DBG(fsg, "VendorID=x%04x, ProductID=x%04x, Release=x%04x\n", | ||
3539 | mod_data.vendor, mod_data.product, mod_data.release); | ||
3540 | DBG(fsg, "removable=%d, stall=%d, cdrom=%d, buflen=%u\n", | ||
3541 | mod_data.removable, mod_data.can_stall, | ||
3542 | mod_data.cdrom, mod_data.buflen); | ||
3543 | DBG(fsg, "I/O thread pid: %d\n", task_pid_nr(fsg->thread_task)); | ||
3544 | |||
3545 | set_bit(REGISTERED, &fsg->atomic_bitflags); | ||
3546 | |||
3547 | /* Tell the thread to start working */ | ||
3548 | wake_up_process(fsg->thread_task); | ||
3549 | return 0; | ||
3550 | |||
3551 | autoconf_fail: | ||
3552 | ERROR(fsg, "unable to autoconfigure all endpoints\n"); | ||
3553 | rc = -ENOTSUPP; | ||
3554 | |||
3555 | out: | ||
3556 | fsg->state = FSG_STATE_TERMINATED; // The thread is dead | ||
3557 | fsg_unbind(gadget); | ||
3558 | complete(&fsg->thread_notifier); | ||
3559 | return rc; | ||
3560 | } | ||
3561 | |||
3562 | |||
3563 | /*-------------------------------------------------------------------------*/ | ||
3564 | |||
3565 | static void fsg_suspend(struct usb_gadget *gadget) | ||
3566 | { | ||
3567 | struct fsg_dev *fsg = get_gadget_data(gadget); | ||
3568 | |||
3569 | DBG(fsg, "suspend\n"); | ||
3570 | set_bit(SUSPENDED, &fsg->atomic_bitflags); | ||
3571 | } | ||
3572 | |||
3573 | static void fsg_resume(struct usb_gadget *gadget) | ||
3574 | { | ||
3575 | struct fsg_dev *fsg = get_gadget_data(gadget); | ||
3576 | |||
3577 | DBG(fsg, "resume\n"); | ||
3578 | clear_bit(SUSPENDED, &fsg->atomic_bitflags); | ||
3579 | } | ||
3580 | |||
3581 | |||
3582 | /*-------------------------------------------------------------------------*/ | ||
3583 | |||
3584 | static __refdata struct usb_gadget_driver fsg_driver = { | ||
3585 | .max_speed = USB_SPEED_SUPER, | ||
3586 | .function = (char *) fsg_string_product, | ||
3587 | .bind = fsg_bind, | ||
3588 | .unbind = fsg_unbind, | ||
3589 | .disconnect = fsg_disconnect, | ||
3590 | .setup = fsg_setup, | ||
3591 | .suspend = fsg_suspend, | ||
3592 | .resume = fsg_resume, | ||
3593 | |||
3594 | .driver = { | ||
3595 | .name = DRIVER_NAME, | ||
3596 | .owner = THIS_MODULE, | ||
3597 | // .release = ... | ||
3598 | // .suspend = ... | ||
3599 | // .resume = ... | ||
3600 | }, | ||
3601 | }; | ||
3602 | |||
3603 | |||
3604 | static int __init fsg_alloc(void) | ||
3605 | { | ||
3606 | struct fsg_dev *fsg; | ||
3607 | |||
3608 | fsg = kzalloc(sizeof *fsg + | ||
3609 | fsg_num_buffers * sizeof *(fsg->buffhds), GFP_KERNEL); | ||
3610 | |||
3611 | if (!fsg) | ||
3612 | return -ENOMEM; | ||
3613 | spin_lock_init(&fsg->lock); | ||
3614 | init_rwsem(&fsg->filesem); | ||
3615 | kref_init(&fsg->ref); | ||
3616 | init_completion(&fsg->thread_notifier); | ||
3617 | |||
3618 | the_fsg = fsg; | ||
3619 | return 0; | ||
3620 | } | ||
3621 | |||
3622 | |||
3623 | static int __init fsg_init(void) | ||
3624 | { | ||
3625 | int rc; | ||
3626 | struct fsg_dev *fsg; | ||
3627 | |||
3628 | rc = fsg_num_buffers_validate(); | ||
3629 | if (rc != 0) | ||
3630 | return rc; | ||
3631 | |||
3632 | if ((rc = fsg_alloc()) != 0) | ||
3633 | return rc; | ||
3634 | fsg = the_fsg; | ||
3635 | rc = usb_gadget_probe_driver(&fsg_driver); | ||
3636 | if (rc != 0) | ||
3637 | kref_put(&fsg->ref, fsg_release); | ||
3638 | return rc; | ||
3639 | } | ||
3640 | module_init(fsg_init); | ||
3641 | |||
3642 | |||
3643 | static void __exit fsg_cleanup(void) | ||
3644 | { | ||
3645 | struct fsg_dev *fsg = the_fsg; | ||
3646 | |||
3647 | /* Unregister the driver iff the thread hasn't already done so */ | ||
3648 | if (test_and_clear_bit(REGISTERED, &fsg->atomic_bitflags)) | ||
3649 | usb_gadget_unregister_driver(&fsg_driver); | ||
3650 | |||
3651 | /* Wait for the thread to finish up */ | ||
3652 | wait_for_completion(&fsg->thread_notifier); | ||
3653 | |||
3654 | kref_put(&fsg->ref, fsg_release); | ||
3655 | } | ||
3656 | module_exit(fsg_cleanup); | ||
diff --git a/drivers/usb/gadget/fsl_qe_udc.c b/drivers/usb/gadget/fsl_qe_udc.c index b09452d6f33a..ec50f18c8890 100644 --- a/drivers/usb/gadget/fsl_qe_udc.c +++ b/drivers/usb/gadget/fsl_qe_udc.c | |||
@@ -2347,7 +2347,7 @@ static int fsl_qe_stop(struct usb_gadget *gadget, | |||
2347 | } | 2347 | } |
2348 | 2348 | ||
2349 | /* udc structure's alloc and setup, include ep-param alloc */ | 2349 | /* udc structure's alloc and setup, include ep-param alloc */ |
2350 | static struct qe_udc __devinit *qe_udc_config(struct platform_device *ofdev) | 2350 | static struct qe_udc *qe_udc_config(struct platform_device *ofdev) |
2351 | { | 2351 | { |
2352 | struct qe_udc *udc; | 2352 | struct qe_udc *udc; |
2353 | struct device_node *np = ofdev->dev.of_node; | 2353 | struct device_node *np = ofdev->dev.of_node; |
@@ -2402,7 +2402,7 @@ cleanup: | |||
2402 | } | 2402 | } |
2403 | 2403 | ||
2404 | /* USB Controller register init */ | 2404 | /* USB Controller register init */ |
2405 | static int __devinit qe_udc_reg_init(struct qe_udc *udc) | 2405 | static int qe_udc_reg_init(struct qe_udc *udc) |
2406 | { | 2406 | { |
2407 | struct usb_ctlr __iomem *qe_usbregs; | 2407 | struct usb_ctlr __iomem *qe_usbregs; |
2408 | qe_usbregs = udc->usb_regs; | 2408 | qe_usbregs = udc->usb_regs; |
@@ -2420,7 +2420,7 @@ static int __devinit qe_udc_reg_init(struct qe_udc *udc) | |||
2420 | return 0; | 2420 | return 0; |
2421 | } | 2421 | } |
2422 | 2422 | ||
2423 | static int __devinit qe_ep_config(struct qe_udc *udc, unsigned char pipe_num) | 2423 | static int qe_ep_config(struct qe_udc *udc, unsigned char pipe_num) |
2424 | { | 2424 | { |
2425 | struct qe_ep *ep = &udc->eps[pipe_num]; | 2425 | struct qe_ep *ep = &udc->eps[pipe_num]; |
2426 | 2426 | ||
@@ -2473,7 +2473,7 @@ static void qe_udc_release(struct device *dev) | |||
2473 | 2473 | ||
2474 | /* Driver probe functions */ | 2474 | /* Driver probe functions */ |
2475 | static const struct of_device_id qe_udc_match[]; | 2475 | static const struct of_device_id qe_udc_match[]; |
2476 | static int __devinit qe_udc_probe(struct platform_device *ofdev) | 2476 | static int qe_udc_probe(struct platform_device *ofdev) |
2477 | { | 2477 | { |
2478 | struct qe_udc *udc; | 2478 | struct qe_udc *udc; |
2479 | const struct of_device_id *match; | 2479 | const struct of_device_id *match; |
@@ -2651,7 +2651,7 @@ static int qe_udc_resume(struct platform_device *dev) | |||
2651 | } | 2651 | } |
2652 | #endif | 2652 | #endif |
2653 | 2653 | ||
2654 | static int __devexit qe_udc_remove(struct platform_device *ofdev) | 2654 | static int qe_udc_remove(struct platform_device *ofdev) |
2655 | { | 2655 | { |
2656 | struct qe_udc *udc = dev_get_drvdata(&ofdev->dev); | 2656 | struct qe_udc *udc = dev_get_drvdata(&ofdev->dev); |
2657 | struct qe_ep *ep; | 2657 | struct qe_ep *ep; |
@@ -2710,7 +2710,7 @@ static int __devexit qe_udc_remove(struct platform_device *ofdev) | |||
2710 | } | 2710 | } |
2711 | 2711 | ||
2712 | /*-------------------------------------------------------------------------*/ | 2712 | /*-------------------------------------------------------------------------*/ |
2713 | static const struct of_device_id qe_udc_match[] __devinitconst = { | 2713 | static const struct of_device_id qe_udc_match[] = { |
2714 | { | 2714 | { |
2715 | .compatible = "fsl,mpc8323-qe-usb", | 2715 | .compatible = "fsl,mpc8323-qe-usb", |
2716 | .data = (void *)PORT_QE, | 2716 | .data = (void *)PORT_QE, |
@@ -2735,7 +2735,7 @@ static struct platform_driver udc_driver = { | |||
2735 | .of_match_table = qe_udc_match, | 2735 | .of_match_table = qe_udc_match, |
2736 | }, | 2736 | }, |
2737 | .probe = qe_udc_probe, | 2737 | .probe = qe_udc_probe, |
2738 | .remove = __devexit_p(qe_udc_remove), | 2738 | .remove = qe_udc_remove, |
2739 | #ifdef CONFIG_PM | 2739 | #ifdef CONFIG_PM |
2740 | .suspend = qe_udc_suspend, | 2740 | .suspend = qe_udc_suspend, |
2741 | .resume = qe_udc_resume, | 2741 | .resume = qe_udc_resume, |
diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c index 6ae70cba0c4a..c19f7f13790b 100644 --- a/drivers/usb/gadget/fsl_udc_core.c +++ b/drivers/usb/gadget/fsl_udc_core.c | |||
@@ -2126,7 +2126,7 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count, | |||
2126 | 2126 | ||
2127 | tmp_reg = fsl_readl(&dr_regs->usbintr); | 2127 | tmp_reg = fsl_readl(&dr_regs->usbintr); |
2128 | t = scnprintf(next, size, | 2128 | t = scnprintf(next, size, |
2129 | "USB Intrrupt Enable Reg:\n" | 2129 | "USB Interrupt Enable Reg:\n" |
2130 | "Sleep Enable: %d SOF Received Enable: %d " | 2130 | "Sleep Enable: %d SOF Received Enable: %d " |
2131 | "Reset Enable: %d\n" | 2131 | "Reset Enable: %d\n" |
2132 | "System Error Enable: %d " | 2132 | "System Error Enable: %d " |
diff --git a/drivers/usb/gadget/hid.c b/drivers/usb/gadget/hid.c index 74130f6c12c0..c36260ea8bf2 100644 --- a/drivers/usb/gadget/hid.c +++ b/drivers/usb/gadget/hid.c | |||
@@ -203,7 +203,7 @@ static int __init hidg_plat_driver_probe(struct platform_device *pdev) | |||
203 | return 0; | 203 | return 0; |
204 | } | 204 | } |
205 | 205 | ||
206 | static int __devexit hidg_plat_driver_remove(struct platform_device *pdev) | 206 | static int hidg_plat_driver_remove(struct platform_device *pdev) |
207 | { | 207 | { |
208 | struct hidg_func_node *e, *n; | 208 | struct hidg_func_node *e, *n; |
209 | 209 | ||
@@ -229,7 +229,7 @@ static __refdata struct usb_composite_driver hidg_driver = { | |||
229 | }; | 229 | }; |
230 | 230 | ||
231 | static struct platform_driver hidg_plat_driver = { | 231 | static struct platform_driver hidg_plat_driver = { |
232 | .remove = __devexit_p(hidg_plat_driver_remove), | 232 | .remove = hidg_plat_driver_remove, |
233 | .driver = { | 233 | .driver = { |
234 | .owner = THIS_MODULE, | 234 | .owner = THIS_MODULE, |
235 | .name = "hidg", | 235 | .name = "hidg", |
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c index 76494cabf4e4..8ac840f25ba9 100644 --- a/drivers/usb/gadget/inode.c +++ b/drivers/usb/gadget/inode.c | |||
@@ -76,7 +76,6 @@ MODULE_LICENSE ("GPL"); | |||
76 | /*----------------------------------------------------------------------*/ | 76 | /*----------------------------------------------------------------------*/ |
77 | 77 | ||
78 | #define GADGETFS_MAGIC 0xaee71ee7 | 78 | #define GADGETFS_MAGIC 0xaee71ee7 |
79 | #define DMA_ADDR_INVALID (~(dma_addr_t)0) | ||
80 | 79 | ||
81 | /* /dev/gadget/$CHIP represents ep0 and the whole device */ | 80 | /* /dev/gadget/$CHIP represents ep0 and the whole device */ |
82 | enum ep0_state { | 81 | enum ep0_state { |
@@ -918,7 +917,6 @@ static void clean_req (struct usb_ep *ep, struct usb_request *req) | |||
918 | if (req->buf != dev->rbuf) { | 917 | if (req->buf != dev->rbuf) { |
919 | kfree(req->buf); | 918 | kfree(req->buf); |
920 | req->buf = dev->rbuf; | 919 | req->buf = dev->rbuf; |
921 | req->dma = DMA_ADDR_INVALID; | ||
922 | } | 920 | } |
923 | req->complete = epio_complete; | 921 | req->complete = epio_complete; |
924 | dev->setup_out_ready = 0; | 922 | dev->setup_out_ready = 0; |
@@ -1408,7 +1406,6 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | |||
1408 | dev->setup_abort = 1; | 1406 | dev->setup_abort = 1; |
1409 | 1407 | ||
1410 | req->buf = dev->rbuf; | 1408 | req->buf = dev->rbuf; |
1411 | req->dma = DMA_ADDR_INVALID; | ||
1412 | req->context = NULL; | 1409 | req->context = NULL; |
1413 | value = -EOPNOTSUPP; | 1410 | value = -EOPNOTSUPP; |
1414 | switch (ctrl->bRequest) { | 1411 | switch (ctrl->bRequest) { |
diff --git a/drivers/usb/gadget/lpc32xx_udc.c b/drivers/usb/gadget/lpc32xx_udc.c index 21a9861dabf0..dd1c9b1fe528 100644 --- a/drivers/usb/gadget/lpc32xx_udc.c +++ b/drivers/usb/gadget/lpc32xx_udc.c | |||
@@ -2399,7 +2399,7 @@ static void udc_handle_ep0_setup(struct lpc32xx_udc *udc) | |||
2399 | 2399 | ||
2400 | if (i < 0) { | 2400 | if (i < 0) { |
2401 | /* setup processing failed, force stall */ | 2401 | /* setup processing failed, force stall */ |
2402 | dev_err(udc->dev, | 2402 | dev_dbg(udc->dev, |
2403 | "req %02x.%02x protocol STALL; stat %d\n", | 2403 | "req %02x.%02x protocol STALL; stat %d\n", |
2404 | reqtype, req, i); | 2404 | reqtype, req, i); |
2405 | udc->ep0state = WAIT_FOR_SETUP; | 2405 | udc->ep0state = WAIT_FOR_SETUP; |
@@ -3352,7 +3352,7 @@ phy_fail: | |||
3352 | return retval; | 3352 | return retval; |
3353 | } | 3353 | } |
3354 | 3354 | ||
3355 | static int __devexit lpc32xx_udc_remove(struct platform_device *pdev) | 3355 | static int lpc32xx_udc_remove(struct platform_device *pdev) |
3356 | { | 3356 | { |
3357 | struct lpc32xx_udc *udc = platform_get_drvdata(pdev); | 3357 | struct lpc32xx_udc *udc = platform_get_drvdata(pdev); |
3358 | 3358 | ||
@@ -3447,7 +3447,7 @@ MODULE_DEVICE_TABLE(of, lpc32xx_udc_of_match); | |||
3447 | #endif | 3447 | #endif |
3448 | 3448 | ||
3449 | static struct platform_driver lpc32xx_udc_driver = { | 3449 | static struct platform_driver lpc32xx_udc_driver = { |
3450 | .remove = __devexit_p(lpc32xx_udc_remove), | 3450 | .remove = lpc32xx_udc_remove, |
3451 | .shutdown = lpc32xx_udc_shutdown, | 3451 | .shutdown = lpc32xx_udc_shutdown, |
3452 | .suspend = lpc32xx_udc_suspend, | 3452 | .suspend = lpc32xx_udc_suspend, |
3453 | .resume = lpc32xx_udc_resume, | 3453 | .resume = lpc32xx_udc_resume, |
diff --git a/drivers/usb/gadget/mv_u3d_core.c b/drivers/usb/gadget/mv_u3d_core.c index 8cfd5b028dbd..b5cea273c957 100644 --- a/drivers/usb/gadget/mv_u3d_core.c +++ b/drivers/usb/gadget/mv_u3d_core.c | |||
@@ -1763,7 +1763,7 @@ static void mv_u3d_gadget_release(struct device *dev) | |||
1763 | dev_dbg(dev, "%s\n", __func__); | 1763 | dev_dbg(dev, "%s\n", __func__); |
1764 | } | 1764 | } |
1765 | 1765 | ||
1766 | static __devexit int mv_u3d_remove(struct platform_device *dev) | 1766 | static int mv_u3d_remove(struct platform_device *dev) |
1767 | { | 1767 | { |
1768 | struct mv_u3d *u3d = platform_get_drvdata(dev); | 1768 | struct mv_u3d *u3d = platform_get_drvdata(dev); |
1769 | 1769 | ||
diff --git a/drivers/usb/gadget/mv_udc_core.c b/drivers/usb/gadget/mv_udc_core.c index ea45224f78c8..379aac7b82fc 100644 --- a/drivers/usb/gadget/mv_udc_core.c +++ b/drivers/usb/gadget/mv_udc_core.c | |||
@@ -2128,7 +2128,7 @@ static void gadget_release(struct device *_dev) | |||
2128 | complete(udc->done); | 2128 | complete(udc->done); |
2129 | } | 2129 | } |
2130 | 2130 | ||
2131 | static int __devexit mv_udc_remove(struct platform_device *dev) | 2131 | static int mv_udc_remove(struct platform_device *dev) |
2132 | { | 2132 | { |
2133 | struct mv_udc *udc = the_controller; | 2133 | struct mv_udc *udc = the_controller; |
2134 | int clk_i; | 2134 | int clk_i; |
@@ -2188,7 +2188,7 @@ static int __devexit mv_udc_remove(struct platform_device *dev) | |||
2188 | return 0; | 2188 | return 0; |
2189 | } | 2189 | } |
2190 | 2190 | ||
2191 | static int __devinit mv_udc_probe(struct platform_device *dev) | 2191 | static int mv_udc_probe(struct platform_device *dev) |
2192 | { | 2192 | { |
2193 | struct mv_usb_platform_data *pdata = dev->dev.platform_data; | 2193 | struct mv_usb_platform_data *pdata = dev->dev.platform_data; |
2194 | struct mv_udc *udc; | 2194 | struct mv_udc *udc; |
diff --git a/drivers/usb/gadget/net2272.c b/drivers/usb/gadget/net2272.c index c009263a47e3..d226058e3b88 100644 --- a/drivers/usb/gadget/net2272.c +++ b/drivers/usb/gadget/net2272.c | |||
@@ -2193,7 +2193,7 @@ net2272_gadget_release(struct device *_dev) | |||
2193 | 2193 | ||
2194 | /*---------------------------------------------------------------------------*/ | 2194 | /*---------------------------------------------------------------------------*/ |
2195 | 2195 | ||
2196 | static void __devexit | 2196 | static void |
2197 | net2272_remove(struct net2272 *dev) | 2197 | net2272_remove(struct net2272 *dev) |
2198 | { | 2198 | { |
2199 | usb_del_gadget_udc(&dev->gadget); | 2199 | usb_del_gadget_udc(&dev->gadget); |
@@ -2215,8 +2215,7 @@ net2272_remove(struct net2272 *dev) | |||
2215 | dev_info(dev->dev, "unbind\n"); | 2215 | dev_info(dev->dev, "unbind\n"); |
2216 | } | 2216 | } |
2217 | 2217 | ||
2218 | static struct net2272 * __devinit | 2218 | static struct net2272 *net2272_probe_init(struct device *dev, unsigned int irq) |
2219 | net2272_probe_init(struct device *dev, unsigned int irq) | ||
2220 | { | 2219 | { |
2221 | struct net2272 *ret; | 2220 | struct net2272 *ret; |
2222 | 2221 | ||
@@ -2246,7 +2245,7 @@ net2272_probe_init(struct device *dev, unsigned int irq) | |||
2246 | return ret; | 2245 | return ret; |
2247 | } | 2246 | } |
2248 | 2247 | ||
2249 | static int __devinit | 2248 | static int |
2250 | net2272_probe_fin(struct net2272 *dev, unsigned int irqflags) | 2249 | net2272_probe_fin(struct net2272 *dev, unsigned int irqflags) |
2251 | { | 2250 | { |
2252 | int ret; | 2251 | int ret; |
@@ -2306,7 +2305,7 @@ err_add_udc: | |||
2306 | * don't respond over USB until a gadget driver binds to us | 2305 | * don't respond over USB until a gadget driver binds to us |
2307 | */ | 2306 | */ |
2308 | 2307 | ||
2309 | static int __devinit | 2308 | static int |
2310 | net2272_rdk1_probe(struct pci_dev *pdev, struct net2272 *dev) | 2309 | net2272_rdk1_probe(struct pci_dev *pdev, struct net2272 *dev) |
2311 | { | 2310 | { |
2312 | unsigned long resource, len, tmp; | 2311 | unsigned long resource, len, tmp; |
@@ -2389,7 +2388,7 @@ net2272_rdk1_probe(struct pci_dev *pdev, struct net2272 *dev) | |||
2389 | return ret; | 2388 | return ret; |
2390 | } | 2389 | } |
2391 | 2390 | ||
2392 | static int __devinit | 2391 | static int |
2393 | net2272_rdk2_probe(struct pci_dev *pdev, struct net2272 *dev) | 2392 | net2272_rdk2_probe(struct pci_dev *pdev, struct net2272 *dev) |
2394 | { | 2393 | { |
2395 | unsigned long resource, len; | 2394 | unsigned long resource, len; |
@@ -2447,7 +2446,7 @@ net2272_rdk2_probe(struct pci_dev *pdev, struct net2272 *dev) | |||
2447 | return ret; | 2446 | return ret; |
2448 | } | 2447 | } |
2449 | 2448 | ||
2450 | static int __devinit | 2449 | static int |
2451 | net2272_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | 2450 | net2272_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) |
2452 | { | 2451 | { |
2453 | struct net2272 *dev; | 2452 | struct net2272 *dev; |
@@ -2489,7 +2488,7 @@ net2272_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2489 | return ret; | 2488 | return ret; |
2490 | } | 2489 | } |
2491 | 2490 | ||
2492 | static void __devexit | 2491 | static void |
2493 | net2272_rdk1_remove(struct pci_dev *pdev, struct net2272 *dev) | 2492 | net2272_rdk1_remove(struct pci_dev *pdev, struct net2272 *dev) |
2494 | { | 2493 | { |
2495 | int i; | 2494 | int i; |
@@ -2511,7 +2510,7 @@ net2272_rdk1_remove(struct pci_dev *pdev, struct net2272 *dev) | |||
2511 | } | 2510 | } |
2512 | } | 2511 | } |
2513 | 2512 | ||
2514 | static void __devexit | 2513 | static void |
2515 | net2272_rdk2_remove(struct pci_dev *pdev, struct net2272 *dev) | 2514 | net2272_rdk2_remove(struct pci_dev *pdev, struct net2272 *dev) |
2516 | { | 2515 | { |
2517 | int i; | 2516 | int i; |
@@ -2530,7 +2529,7 @@ net2272_rdk2_remove(struct pci_dev *pdev, struct net2272 *dev) | |||
2530 | pci_resource_len(pdev, i)); | 2529 | pci_resource_len(pdev, i)); |
2531 | } | 2530 | } |
2532 | 2531 | ||
2533 | static void __devexit | 2532 | static void |
2534 | net2272_pci_remove(struct pci_dev *pdev) | 2533 | net2272_pci_remove(struct pci_dev *pdev) |
2535 | { | 2534 | { |
2536 | struct net2272 *dev = pci_get_drvdata(pdev); | 2535 | struct net2272 *dev = pci_get_drvdata(pdev); |
@@ -2549,7 +2548,7 @@ net2272_pci_remove(struct pci_dev *pdev) | |||
2549 | } | 2548 | } |
2550 | 2549 | ||
2551 | /* Table of matching PCI IDs */ | 2550 | /* Table of matching PCI IDs */ |
2552 | static struct pci_device_id __devinitdata pci_ids[] = { | 2551 | static struct pci_device_id pci_ids[] = { |
2553 | { /* RDK 1 card */ | 2552 | { /* RDK 1 card */ |
2554 | .class = ((PCI_CLASS_BRIDGE_OTHER << 8) | 0xfe), | 2553 | .class = ((PCI_CLASS_BRIDGE_OTHER << 8) | 0xfe), |
2555 | .class_mask = 0, | 2554 | .class_mask = 0, |
@@ -2575,7 +2574,7 @@ static struct pci_driver net2272_pci_driver = { | |||
2575 | .id_table = pci_ids, | 2574 | .id_table = pci_ids, |
2576 | 2575 | ||
2577 | .probe = net2272_pci_probe, | 2576 | .probe = net2272_pci_probe, |
2578 | .remove = __devexit_p(net2272_pci_remove), | 2577 | .remove = net2272_pci_remove, |
2579 | }; | 2578 | }; |
2580 | 2579 | ||
2581 | static int net2272_pci_register(void) | 2580 | static int net2272_pci_register(void) |
@@ -2595,7 +2594,7 @@ static inline void net2272_pci_unregister(void) { } | |||
2595 | 2594 | ||
2596 | /*---------------------------------------------------------------------------*/ | 2595 | /*---------------------------------------------------------------------------*/ |
2597 | 2596 | ||
2598 | static int __devinit | 2597 | static int |
2599 | net2272_plat_probe(struct platform_device *pdev) | 2598 | net2272_plat_probe(struct platform_device *pdev) |
2600 | { | 2599 | { |
2601 | struct net2272 *dev; | 2600 | struct net2272 *dev; |
@@ -2661,7 +2660,7 @@ net2272_plat_probe(struct platform_device *pdev) | |||
2661 | return ret; | 2660 | return ret; |
2662 | } | 2661 | } |
2663 | 2662 | ||
2664 | static int __devexit | 2663 | static int |
2665 | net2272_plat_remove(struct platform_device *pdev) | 2664 | net2272_plat_remove(struct platform_device *pdev) |
2666 | { | 2665 | { |
2667 | struct net2272 *dev = platform_get_drvdata(pdev); | 2666 | struct net2272 *dev = platform_get_drvdata(pdev); |
@@ -2678,7 +2677,7 @@ net2272_plat_remove(struct platform_device *pdev) | |||
2678 | 2677 | ||
2679 | static struct platform_driver net2272_plat_driver = { | 2678 | static struct platform_driver net2272_plat_driver = { |
2680 | .probe = net2272_plat_probe, | 2679 | .probe = net2272_plat_probe, |
2681 | .remove = __devexit_p(net2272_plat_remove), | 2680 | .remove = net2272_plat_remove, |
2682 | .driver = { | 2681 | .driver = { |
2683 | .name = driver_name, | 2682 | .name = driver_name, |
2684 | .owner = THIS_MODULE, | 2683 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c index ac335af154ba..708c0b55dcc8 100644 --- a/drivers/usb/gadget/net2280.c +++ b/drivers/usb/gadget/net2280.c | |||
@@ -9,7 +9,7 @@ | |||
9 | * CODE STATUS HIGHLIGHTS | 9 | * CODE STATUS HIGHLIGHTS |
10 | * | 10 | * |
11 | * This driver should work well with most "gadget" drivers, including | 11 | * This driver should work well with most "gadget" drivers, including |
12 | * the File Storage, Serial, and Ethernet/RNDIS gadget drivers | 12 | * the Mass Storage, Serial, and Ethernet/RNDIS gadget drivers |
13 | * as well as Gadget Zero and Gadgetfs. | 13 | * as well as Gadget Zero and Gadgetfs. |
14 | * | 14 | * |
15 | * DMA is enabled by default. Drivers using transfer queues might use | 15 | * DMA is enabled by default. Drivers using transfer queues might use |
diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c index 2a4749c3eb3f..9412bf53b864 100644 --- a/drivers/usb/gadget/omap_udc.c +++ b/drivers/usb/gadget/omap_udc.c | |||
@@ -2506,7 +2506,7 @@ static inline void remove_proc_file(void) {} | |||
2506 | * UDC_SYSCON_1.CFG_LOCK is set can now work. We won't use that | 2506 | * UDC_SYSCON_1.CFG_LOCK is set can now work. We won't use that |
2507 | * capability yet though. | 2507 | * capability yet though. |
2508 | */ | 2508 | */ |
2509 | static unsigned __devinit | 2509 | static unsigned |
2510 | omap_ep_setup(char *name, u8 addr, u8 type, | 2510 | omap_ep_setup(char *name, u8 addr, u8 type, |
2511 | unsigned buf, unsigned maxp, int dbuf) | 2511 | unsigned buf, unsigned maxp, int dbuf) |
2512 | { | 2512 | { |
@@ -2624,7 +2624,7 @@ static void omap_udc_release(struct device *dev) | |||
2624 | udc = NULL; | 2624 | udc = NULL; |
2625 | } | 2625 | } |
2626 | 2626 | ||
2627 | static int __devinit | 2627 | static int |
2628 | omap_udc_setup(struct platform_device *odev, struct usb_phy *xceiv) | 2628 | omap_udc_setup(struct platform_device *odev, struct usb_phy *xceiv) |
2629 | { | 2629 | { |
2630 | unsigned tmp, buf; | 2630 | unsigned tmp, buf; |
@@ -2761,7 +2761,7 @@ omap_udc_setup(struct platform_device *odev, struct usb_phy *xceiv) | |||
2761 | return 0; | 2761 | return 0; |
2762 | } | 2762 | } |
2763 | 2763 | ||
2764 | static int __devinit omap_udc_probe(struct platform_device *pdev) | 2764 | static int omap_udc_probe(struct platform_device *pdev) |
2765 | { | 2765 | { |
2766 | int status = -ENODEV; | 2766 | int status = -ENODEV; |
2767 | int hmc; | 2767 | int hmc; |
@@ -2974,7 +2974,7 @@ cleanup0: | |||
2974 | return status; | 2974 | return status; |
2975 | } | 2975 | } |
2976 | 2976 | ||
2977 | static int __devexit omap_udc_remove(struct platform_device *pdev) | 2977 | static int omap_udc_remove(struct platform_device *pdev) |
2978 | { | 2978 | { |
2979 | DECLARE_COMPLETION_ONSTACK(done); | 2979 | DECLARE_COMPLETION_ONSTACK(done); |
2980 | 2980 | ||
@@ -3060,7 +3060,7 @@ static int omap_udc_resume(struct platform_device *dev) | |||
3060 | 3060 | ||
3061 | static struct platform_driver udc_driver = { | 3061 | static struct platform_driver udc_driver = { |
3062 | .probe = omap_udc_probe, | 3062 | .probe = omap_udc_probe, |
3063 | .remove = __devexit_p(omap_udc_remove), | 3063 | .remove = omap_udc_remove, |
3064 | .suspend = omap_udc_suspend, | 3064 | .suspend = omap_udc_suspend, |
3065 | .resume = omap_udc_resume, | 3065 | .resume = omap_udc_resume, |
3066 | .driver = { | 3066 | .driver = { |
diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c index e156e3f26727..35bcc83d1e04 100644 --- a/drivers/usb/gadget/printer.c +++ b/drivers/usb/gadget/printer.c | |||
@@ -983,8 +983,10 @@ static int __init printer_func_bind(struct usb_configuration *c, | |||
983 | { | 983 | { |
984 | struct printer_dev *dev = container_of(f, struct printer_dev, function); | 984 | struct printer_dev *dev = container_of(f, struct printer_dev, function); |
985 | struct usb_composite_dev *cdev = c->cdev; | 985 | struct usb_composite_dev *cdev = c->cdev; |
986 | struct usb_ep *in_ep, *out_ep; | 986 | struct usb_ep *in_ep; |
987 | struct usb_ep *out_ep = NULL; | ||
987 | int id; | 988 | int id; |
989 | int ret; | ||
988 | 990 | ||
989 | id = usb_interface_id(c, f); | 991 | id = usb_interface_id(c, f); |
990 | if (id < 0) | 992 | if (id < 0) |
@@ -1010,6 +1012,11 @@ autoconf_fail: | |||
1010 | hs_ep_in_desc.bEndpointAddress = fs_ep_in_desc.bEndpointAddress; | 1012 | hs_ep_in_desc.bEndpointAddress = fs_ep_in_desc.bEndpointAddress; |
1011 | hs_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress; | 1013 | hs_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress; |
1012 | 1014 | ||
1015 | ret = usb_assign_descriptors(f, fs_printer_function, | ||
1016 | hs_printer_function, NULL); | ||
1017 | if (ret) | ||
1018 | return ret; | ||
1019 | |||
1013 | dev->in_ep = in_ep; | 1020 | dev->in_ep = in_ep; |
1014 | dev->out_ep = out_ep; | 1021 | dev->out_ep = out_ep; |
1015 | return 0; | 1022 | return 0; |
@@ -1018,6 +1025,7 @@ autoconf_fail: | |||
1018 | static void printer_func_unbind(struct usb_configuration *c, | 1025 | static void printer_func_unbind(struct usb_configuration *c, |
1019 | struct usb_function *f) | 1026 | struct usb_function *f) |
1020 | { | 1027 | { |
1028 | usb_free_all_descriptors(f); | ||
1021 | } | 1029 | } |
1022 | 1030 | ||
1023 | static int printer_func_set_alt(struct usb_function *f, | 1031 | static int printer_func_set_alt(struct usb_function *f, |
@@ -1110,8 +1118,6 @@ static int __init printer_bind_config(struct usb_configuration *c) | |||
1110 | dev = &usb_printer_gadget; | 1118 | dev = &usb_printer_gadget; |
1111 | 1119 | ||
1112 | dev->function.name = shortname; | 1120 | dev->function.name = shortname; |
1113 | dev->function.descriptors = fs_printer_function; | ||
1114 | dev->function.hs_descriptors = hs_printer_function; | ||
1115 | dev->function.bind = printer_func_bind; | 1121 | dev->function.bind = printer_func_bind; |
1116 | dev->function.setup = printer_func_setup; | 1122 | dev->function.setup = printer_func_setup; |
1117 | dev->function.unbind = printer_func_unbind; | 1123 | dev->function.unbind = printer_func_unbind; |
diff --git a/drivers/usb/gadget/pxa27x_udc.h b/drivers/usb/gadget/pxa27x_udc.h index a1d268c6f2cc..79d81a4b2344 100644 --- a/drivers/usb/gadget/pxa27x_udc.h +++ b/drivers/usb/gadget/pxa27x_udc.h | |||
@@ -418,7 +418,7 @@ struct udc_stats { | |||
418 | * @irq: udc irq | 418 | * @irq: udc irq |
419 | * @clk: udc clock | 419 | * @clk: udc clock |
420 | * @usb_gadget: udc gadget structure | 420 | * @usb_gadget: udc gadget structure |
421 | * @driver: bound gadget (zero, g_ether, g_file_storage, ...) | 421 | * @driver: bound gadget (zero, g_ether, g_mass_storage, ...) |
422 | * @dev: device | 422 | * @dev: device |
423 | * @mach: machine info, used to activate specific GPIO | 423 | * @mach: machine info, used to activate specific GPIO |
424 | * @transceiver: external transceiver to handle vbus sense and D+ pullup | 424 | * @transceiver: external transceiver to handle vbus sense and D+ pullup |
diff --git a/drivers/usb/gadget/s3c-hsotg.c b/drivers/usb/gadget/s3c-hsotg.c index 6f696ee8b817..141971d9051e 100644 --- a/drivers/usb/gadget/s3c-hsotg.c +++ b/drivers/usb/gadget/s3c-hsotg.c | |||
@@ -3072,7 +3072,7 @@ static struct usb_gadget_ops s3c_hsotg_gadget_ops = { | |||
3072 | * creation) to give to the gadget driver. Setup the endpoint name, any | 3072 | * creation) to give to the gadget driver. Setup the endpoint name, any |
3073 | * direction information and other state that may be required. | 3073 | * direction information and other state that may be required. |
3074 | */ | 3074 | */ |
3075 | static void __devinit s3c_hsotg_initep(struct s3c_hsotg *hsotg, | 3075 | static void s3c_hsotg_initep(struct s3c_hsotg *hsotg, |
3076 | struct s3c_hsotg_ep *hs_ep, | 3076 | struct s3c_hsotg_ep *hs_ep, |
3077 | int epnum) | 3077 | int epnum) |
3078 | { | 3078 | { |
@@ -3414,7 +3414,7 @@ static const struct file_operations ep_fops = { | |||
3414 | * with the same name as the device itself, in case we end up | 3414 | * with the same name as the device itself, in case we end up |
3415 | * with multiple blocks in future systems. | 3415 | * with multiple blocks in future systems. |
3416 | */ | 3416 | */ |
3417 | static void __devinit s3c_hsotg_create_debug(struct s3c_hsotg *hsotg) | 3417 | static void s3c_hsotg_create_debug(struct s3c_hsotg *hsotg) |
3418 | { | 3418 | { |
3419 | struct dentry *root; | 3419 | struct dentry *root; |
3420 | unsigned epidx; | 3420 | unsigned epidx; |
@@ -3460,7 +3460,7 @@ static void __devinit s3c_hsotg_create_debug(struct s3c_hsotg *hsotg) | |||
3460 | * | 3460 | * |
3461 | * Cleanup (remove) the debugfs files for use on module exit. | 3461 | * Cleanup (remove) the debugfs files for use on module exit. |
3462 | */ | 3462 | */ |
3463 | static void __devexit s3c_hsotg_delete_debug(struct s3c_hsotg *hsotg) | 3463 | static void s3c_hsotg_delete_debug(struct s3c_hsotg *hsotg) |
3464 | { | 3464 | { |
3465 | unsigned epidx; | 3465 | unsigned epidx; |
3466 | 3466 | ||
@@ -3490,7 +3490,7 @@ static void s3c_hsotg_release(struct device *dev) | |||
3490 | * @pdev: The platform information for the driver | 3490 | * @pdev: The platform information for the driver |
3491 | */ | 3491 | */ |
3492 | 3492 | ||
3493 | static int __devinit s3c_hsotg_probe(struct platform_device *pdev) | 3493 | static int s3c_hsotg_probe(struct platform_device *pdev) |
3494 | { | 3494 | { |
3495 | struct s3c_hsotg_plat *plat = pdev->dev.platform_data; | 3495 | struct s3c_hsotg_plat *plat = pdev->dev.platform_data; |
3496 | struct device *dev = &pdev->dev; | 3496 | struct device *dev = &pdev->dev; |
@@ -3675,7 +3675,7 @@ err_clk: | |||
3675 | * s3c_hsotg_remove - remove function for hsotg driver | 3675 | * s3c_hsotg_remove - remove function for hsotg driver |
3676 | * @pdev: The platform information for the driver | 3676 | * @pdev: The platform information for the driver |
3677 | */ | 3677 | */ |
3678 | static int __devexit s3c_hsotg_remove(struct platform_device *pdev) | 3678 | static int s3c_hsotg_remove(struct platform_device *pdev) |
3679 | { | 3679 | { |
3680 | struct s3c_hsotg *hsotg = platform_get_drvdata(pdev); | 3680 | struct s3c_hsotg *hsotg = platform_get_drvdata(pdev); |
3681 | 3681 | ||
@@ -3708,7 +3708,7 @@ static struct platform_driver s3c_hsotg_driver = { | |||
3708 | .owner = THIS_MODULE, | 3708 | .owner = THIS_MODULE, |
3709 | }, | 3709 | }, |
3710 | .probe = s3c_hsotg_probe, | 3710 | .probe = s3c_hsotg_probe, |
3711 | .remove = __devexit_p(s3c_hsotg_remove), | 3711 | .remove = s3c_hsotg_remove, |
3712 | .suspend = s3c_hsotg_suspend, | 3712 | .suspend = s3c_hsotg_suspend, |
3713 | .resume = s3c_hsotg_resume, | 3713 | .resume = s3c_hsotg_resume, |
3714 | }; | 3714 | }; |
diff --git a/drivers/usb/gadget/s3c-hsudc.c b/drivers/usb/gadget/s3c-hsudc.c index d8e785d4ad59..52379b11f080 100644 --- a/drivers/usb/gadget/s3c-hsudc.c +++ b/drivers/usb/gadget/s3c-hsudc.c | |||
@@ -1261,7 +1261,7 @@ static struct usb_gadget_ops s3c_hsudc_gadget_ops = { | |||
1261 | .vbus_draw = s3c_hsudc_vbus_draw, | 1261 | .vbus_draw = s3c_hsudc_vbus_draw, |
1262 | }; | 1262 | }; |
1263 | 1263 | ||
1264 | static int __devinit s3c_hsudc_probe(struct platform_device *pdev) | 1264 | static int s3c_hsudc_probe(struct platform_device *pdev) |
1265 | { | 1265 | { |
1266 | struct device *dev = &pdev->dev; | 1266 | struct device *dev = &pdev->dev; |
1267 | struct resource *res; | 1267 | struct resource *res; |
diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c index 8d9bcd8207c8..0e3ae43454a2 100644 --- a/drivers/usb/gadget/storage_common.c +++ b/drivers/usb/gadget/storage_common.c | |||
@@ -11,30 +11,10 @@ | |||
11 | * (at your option) any later version. | 11 | * (at your option) any later version. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | |||
15 | /* | 14 | /* |
16 | * This file requires the following identifiers used in USB strings to | 15 | * This file requires the following identifiers used in USB strings to |
17 | * be defined (each of type pointer to char): | 16 | * be defined (each of type pointer to char): |
18 | * - fsg_string_manufacturer -- name of the manufacturer | ||
19 | * - fsg_string_product -- name of the product | ||
20 | * - fsg_string_config -- name of the configuration | ||
21 | * - fsg_string_interface -- name of the interface | 17 | * - fsg_string_interface -- name of the interface |
22 | * The first four are only needed when FSG_DESCRIPTORS_DEVICE_STRINGS | ||
23 | * macro is defined prior to including this file. | ||
24 | */ | ||
25 | |||
26 | /* | ||
27 | * When FSG_NO_INTR_EP is defined fsg_fs_intr_in_desc and | ||
28 | * fsg_hs_intr_in_desc objects as well as | ||
29 | * FSG_FS_FUNCTION_PRE_EP_ENTRIES and FSG_HS_FUNCTION_PRE_EP_ENTRIES | ||
30 | * macros are not defined. | ||
31 | * | ||
32 | * When FSG_NO_DEVICE_STRINGS is defined FSG_STRING_MANUFACTURER, | ||
33 | * FSG_STRING_PRODUCT, FSG_STRING_SERIAL and FSG_STRING_CONFIG are not | ||
34 | * defined (as well as corresponding entries in string tables are | ||
35 | * missing) and FSG_STRING_INTERFACE has value of zero. | ||
36 | * | ||
37 | * When FSG_NO_OTG is defined fsg_otg_desc won't be defined. | ||
38 | */ | 18 | */ |
39 | 19 | ||
40 | /* | 20 | /* |
@@ -78,34 +58,6 @@ | |||
78 | #define LWARN(lun, fmt, args...) dev_warn(&(lun)->dev, fmt, ## args) | 58 | #define LWARN(lun, fmt, args...) dev_warn(&(lun)->dev, fmt, ## args) |
79 | #define LINFO(lun, fmt, args...) dev_info(&(lun)->dev, fmt, ## args) | 59 | #define LINFO(lun, fmt, args...) dev_info(&(lun)->dev, fmt, ## args) |
80 | 60 | ||
81 | /* | ||
82 | * Keep those macros in sync with those in | ||
83 | * include/linux/usb/composite.h or else GCC will complain. If they | ||
84 | * are identical (the same names of arguments, white spaces in the | ||
85 | * same places) GCC will allow redefinition otherwise (even if some | ||
86 | * white space is removed or added) warning will be issued. | ||
87 | * | ||
88 | * Those macros are needed here because File Storage Gadget does not | ||
89 | * include the composite.h header. For composite gadgets those macros | ||
90 | * are redundant since composite.h is included any way. | ||
91 | * | ||
92 | * One could check whether those macros are already defined (which | ||
93 | * would indicate composite.h had been included) or not (which would | ||
94 | * indicate we were in FSG) but this is not done because a warning is | ||
95 | * desired if definitions here differ from the ones in composite.h. | ||
96 | * | ||
97 | * We want the definitions to match and be the same in File Storage | ||
98 | * Gadget as well as Mass Storage Function (and so composite gadgets | ||
99 | * using MSF). If someone changes them in composite.h it will produce | ||
100 | * a warning in this file when building MSF. | ||
101 | */ | ||
102 | #define DBG(d, fmt, args...) dev_dbg(&(d)->gadget->dev , fmt , ## args) | ||
103 | #define VDBG(d, fmt, args...) dev_vdbg(&(d)->gadget->dev , fmt , ## args) | ||
104 | #define ERROR(d, fmt, args...) dev_err(&(d)->gadget->dev , fmt , ## args) | ||
105 | #define WARNING(d, fmt, args...) dev_warn(&(d)->gadget->dev , fmt , ## args) | ||
106 | #define INFO(d, fmt, args...) dev_info(&(d)->gadget->dev , fmt , ## args) | ||
107 | |||
108 | |||
109 | 61 | ||
110 | #ifdef DUMP_MSGS | 62 | #ifdef DUMP_MSGS |
111 | 63 | ||
@@ -203,9 +155,12 @@ struct fsg_lun { | |||
203 | struct device dev; | 155 | struct device dev; |
204 | }; | 156 | }; |
205 | 157 | ||
206 | #define fsg_lun_is_open(curlun) ((curlun)->filp != NULL) | 158 | static inline bool fsg_lun_is_open(struct fsg_lun *curlun) |
159 | { | ||
160 | return curlun->filp != NULL; | ||
161 | } | ||
207 | 162 | ||
208 | static struct fsg_lun *fsg_lun_from_dev(struct device *dev) | 163 | static inline struct fsg_lun *fsg_lun_from_dev(struct device *dev) |
209 | { | 164 | { |
210 | return container_of(dev, struct fsg_lun, dev); | 165 | return container_of(dev, struct fsg_lun, dev); |
211 | } | 166 | } |
@@ -308,26 +263,10 @@ static inline u32 get_unaligned_be24(u8 *buf) | |||
308 | 263 | ||
309 | 264 | ||
310 | enum { | 265 | enum { |
311 | #ifndef FSG_NO_DEVICE_STRINGS | ||
312 | FSG_STRING_MANUFACTURER = 1, | ||
313 | FSG_STRING_PRODUCT, | ||
314 | FSG_STRING_SERIAL, | ||
315 | FSG_STRING_CONFIG, | ||
316 | #endif | ||
317 | FSG_STRING_INTERFACE | 266 | FSG_STRING_INTERFACE |
318 | }; | 267 | }; |
319 | 268 | ||
320 | 269 | ||
321 | #ifndef FSG_NO_OTG | ||
322 | static struct usb_otg_descriptor | ||
323 | fsg_otg_desc = { | ||
324 | .bLength = sizeof fsg_otg_desc, | ||
325 | .bDescriptorType = USB_DT_OTG, | ||
326 | |||
327 | .bmAttributes = USB_OTG_SRP, | ||
328 | }; | ||
329 | #endif | ||
330 | |||
331 | /* There is only one interface. */ | 270 | /* There is only one interface. */ |
332 | 271 | ||
333 | static struct usb_interface_descriptor | 272 | static struct usb_interface_descriptor |
@@ -367,37 +306,10 @@ fsg_fs_bulk_out_desc = { | |||
367 | /* wMaxPacketSize set by autoconfiguration */ | 306 | /* wMaxPacketSize set by autoconfiguration */ |
368 | }; | 307 | }; |
369 | 308 | ||
370 | #ifndef FSG_NO_INTR_EP | ||
371 | |||
372 | static struct usb_endpoint_descriptor | ||
373 | fsg_fs_intr_in_desc = { | ||
374 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
375 | .bDescriptorType = USB_DT_ENDPOINT, | ||
376 | |||
377 | .bEndpointAddress = USB_DIR_IN, | ||
378 | .bmAttributes = USB_ENDPOINT_XFER_INT, | ||
379 | .wMaxPacketSize = cpu_to_le16(2), | ||
380 | .bInterval = 32, /* frames -> 32 ms */ | ||
381 | }; | ||
382 | |||
383 | #ifndef FSG_NO_OTG | ||
384 | # define FSG_FS_FUNCTION_PRE_EP_ENTRIES 2 | ||
385 | #else | ||
386 | # define FSG_FS_FUNCTION_PRE_EP_ENTRIES 1 | ||
387 | #endif | ||
388 | |||
389 | #endif | ||
390 | |||
391 | static struct usb_descriptor_header *fsg_fs_function[] = { | 309 | static struct usb_descriptor_header *fsg_fs_function[] = { |
392 | #ifndef FSG_NO_OTG | ||
393 | (struct usb_descriptor_header *) &fsg_otg_desc, | ||
394 | #endif | ||
395 | (struct usb_descriptor_header *) &fsg_intf_desc, | 310 | (struct usb_descriptor_header *) &fsg_intf_desc, |
396 | (struct usb_descriptor_header *) &fsg_fs_bulk_in_desc, | 311 | (struct usb_descriptor_header *) &fsg_fs_bulk_in_desc, |
397 | (struct usb_descriptor_header *) &fsg_fs_bulk_out_desc, | 312 | (struct usb_descriptor_header *) &fsg_fs_bulk_out_desc, |
398 | #ifndef FSG_NO_INTR_EP | ||
399 | (struct usb_descriptor_header *) &fsg_fs_intr_in_desc, | ||
400 | #endif | ||
401 | NULL, | 313 | NULL, |
402 | }; | 314 | }; |
403 | 315 | ||
@@ -431,37 +343,11 @@ fsg_hs_bulk_out_desc = { | |||
431 | .bInterval = 1, /* NAK every 1 uframe */ | 343 | .bInterval = 1, /* NAK every 1 uframe */ |
432 | }; | 344 | }; |
433 | 345 | ||
434 | #ifndef FSG_NO_INTR_EP | ||
435 | |||
436 | static struct usb_endpoint_descriptor | ||
437 | fsg_hs_intr_in_desc = { | ||
438 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
439 | .bDescriptorType = USB_DT_ENDPOINT, | ||
440 | |||
441 | /* bEndpointAddress copied from fs_intr_in_desc during fsg_bind() */ | ||
442 | .bmAttributes = USB_ENDPOINT_XFER_INT, | ||
443 | .wMaxPacketSize = cpu_to_le16(2), | ||
444 | .bInterval = 9, /* 2**(9-1) = 256 uframes -> 32 ms */ | ||
445 | }; | ||
446 | |||
447 | #ifndef FSG_NO_OTG | ||
448 | # define FSG_HS_FUNCTION_PRE_EP_ENTRIES 2 | ||
449 | #else | ||
450 | # define FSG_HS_FUNCTION_PRE_EP_ENTRIES 1 | ||
451 | #endif | ||
452 | |||
453 | #endif | ||
454 | 346 | ||
455 | static struct usb_descriptor_header *fsg_hs_function[] = { | 347 | static struct usb_descriptor_header *fsg_hs_function[] = { |
456 | #ifndef FSG_NO_OTG | ||
457 | (struct usb_descriptor_header *) &fsg_otg_desc, | ||
458 | #endif | ||
459 | (struct usb_descriptor_header *) &fsg_intf_desc, | 348 | (struct usb_descriptor_header *) &fsg_intf_desc, |
460 | (struct usb_descriptor_header *) &fsg_hs_bulk_in_desc, | 349 | (struct usb_descriptor_header *) &fsg_hs_bulk_in_desc, |
461 | (struct usb_descriptor_header *) &fsg_hs_bulk_out_desc, | 350 | (struct usb_descriptor_header *) &fsg_hs_bulk_out_desc, |
462 | #ifndef FSG_NO_INTR_EP | ||
463 | (struct usb_descriptor_header *) &fsg_hs_intr_in_desc, | ||
464 | #endif | ||
465 | NULL, | 351 | NULL, |
466 | }; | 352 | }; |
467 | 353 | ||
@@ -499,34 +385,6 @@ static struct usb_ss_ep_comp_descriptor fsg_ss_bulk_out_comp_desc = { | |||
499 | /*.bMaxBurst = DYNAMIC, */ | 385 | /*.bMaxBurst = DYNAMIC, */ |
500 | }; | 386 | }; |
501 | 387 | ||
502 | #ifndef FSG_NO_INTR_EP | ||
503 | |||
504 | static struct usb_endpoint_descriptor | ||
505 | fsg_ss_intr_in_desc = { | ||
506 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
507 | .bDescriptorType = USB_DT_ENDPOINT, | ||
508 | |||
509 | /* bEndpointAddress copied from fs_intr_in_desc during fsg_bind() */ | ||
510 | .bmAttributes = USB_ENDPOINT_XFER_INT, | ||
511 | .wMaxPacketSize = cpu_to_le16(2), | ||
512 | .bInterval = 9, /* 2**(9-1) = 256 uframes -> 32 ms */ | ||
513 | }; | ||
514 | |||
515 | static struct usb_ss_ep_comp_descriptor fsg_ss_intr_in_comp_desc = { | ||
516 | .bLength = sizeof(fsg_ss_bulk_in_comp_desc), | ||
517 | .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, | ||
518 | |||
519 | .wBytesPerInterval = cpu_to_le16(2), | ||
520 | }; | ||
521 | |||
522 | #ifndef FSG_NO_OTG | ||
523 | # define FSG_SS_FUNCTION_PRE_EP_ENTRIES 2 | ||
524 | #else | ||
525 | # define FSG_SS_FUNCTION_PRE_EP_ENTRIES 1 | ||
526 | #endif | ||
527 | |||
528 | #endif | ||
529 | |||
530 | static __maybe_unused struct usb_ext_cap_descriptor fsg_ext_cap_desc = { | 388 | static __maybe_unused struct usb_ext_cap_descriptor fsg_ext_cap_desc = { |
531 | .bLength = USB_DT_USB_EXT_CAP_SIZE, | 389 | .bLength = USB_DT_USB_EXT_CAP_SIZE, |
532 | .bDescriptorType = USB_DT_DEVICE_CAPABILITY, | 390 | .bDescriptorType = USB_DT_DEVICE_CAPABILITY, |
@@ -563,18 +421,11 @@ static __maybe_unused struct usb_bos_descriptor fsg_bos_desc = { | |||
563 | }; | 421 | }; |
564 | 422 | ||
565 | static struct usb_descriptor_header *fsg_ss_function[] = { | 423 | static struct usb_descriptor_header *fsg_ss_function[] = { |
566 | #ifndef FSG_NO_OTG | ||
567 | (struct usb_descriptor_header *) &fsg_otg_desc, | ||
568 | #endif | ||
569 | (struct usb_descriptor_header *) &fsg_intf_desc, | 424 | (struct usb_descriptor_header *) &fsg_intf_desc, |
570 | (struct usb_descriptor_header *) &fsg_ss_bulk_in_desc, | 425 | (struct usb_descriptor_header *) &fsg_ss_bulk_in_desc, |
571 | (struct usb_descriptor_header *) &fsg_ss_bulk_in_comp_desc, | 426 | (struct usb_descriptor_header *) &fsg_ss_bulk_in_comp_desc, |
572 | (struct usb_descriptor_header *) &fsg_ss_bulk_out_desc, | 427 | (struct usb_descriptor_header *) &fsg_ss_bulk_out_desc, |
573 | (struct usb_descriptor_header *) &fsg_ss_bulk_out_comp_desc, | 428 | (struct usb_descriptor_header *) &fsg_ss_bulk_out_comp_desc, |
574 | #ifndef FSG_NO_INTR_EP | ||
575 | (struct usb_descriptor_header *) &fsg_ss_intr_in_desc, | ||
576 | (struct usb_descriptor_header *) &fsg_ss_intr_in_comp_desc, | ||
577 | #endif | ||
578 | NULL, | 429 | NULL, |
579 | }; | 430 | }; |
580 | 431 | ||
@@ -594,12 +445,6 @@ fsg_ep_desc(struct usb_gadget *g, struct usb_endpoint_descriptor *fs, | |||
594 | 445 | ||
595 | /* Static strings, in UTF-8 (for simplicity we use only ASCII characters) */ | 446 | /* Static strings, in UTF-8 (for simplicity we use only ASCII characters) */ |
596 | static struct usb_string fsg_strings[] = { | 447 | static struct usb_string fsg_strings[] = { |
597 | #ifndef FSG_NO_DEVICE_STRINGS | ||
598 | {FSG_STRING_MANUFACTURER, fsg_string_manufacturer}, | ||
599 | {FSG_STRING_PRODUCT, fsg_string_product}, | ||
600 | {FSG_STRING_SERIAL, ""}, | ||
601 | {FSG_STRING_CONFIG, fsg_string_config}, | ||
602 | #endif | ||
603 | {FSG_STRING_INTERFACE, fsg_string_interface}, | 448 | {FSG_STRING_INTERFACE, fsg_string_interface}, |
604 | {} | 449 | {} |
605 | }; | 450 | }; |
diff --git a/drivers/usb/gadget/tcm_usb_gadget.c b/drivers/usb/gadget/tcm_usb_gadget.c index 97e68b38cfdf..4f7f76f00c74 100644 --- a/drivers/usb/gadget/tcm_usb_gadget.c +++ b/drivers/usb/gadget/tcm_usb_gadget.c | |||
@@ -1384,7 +1384,7 @@ static struct se_node_acl *usbg_alloc_fabric_acl(struct se_portal_group *se_tpg) | |||
1384 | 1384 | ||
1385 | nacl = kzalloc(sizeof(struct usbg_nacl), GFP_KERNEL); | 1385 | nacl = kzalloc(sizeof(struct usbg_nacl), GFP_KERNEL); |
1386 | if (!nacl) { | 1386 | if (!nacl) { |
1387 | printk(KERN_ERR "Unable to alocate struct usbg_nacl\n"); | 1387 | printk(KERN_ERR "Unable to allocate struct usbg_nacl\n"); |
1388 | return NULL; | 1388 | return NULL; |
1389 | } | 1389 | } |
1390 | 1390 | ||
@@ -2139,6 +2139,7 @@ static struct usb_descriptor_header *uasp_fs_function_desc[] = { | |||
2139 | (struct usb_descriptor_header *) &uasp_status_pipe_desc, | 2139 | (struct usb_descriptor_header *) &uasp_status_pipe_desc, |
2140 | (struct usb_descriptor_header *) &uasp_fs_cmd_desc, | 2140 | (struct usb_descriptor_header *) &uasp_fs_cmd_desc, |
2141 | (struct usb_descriptor_header *) &uasp_cmd_pipe_desc, | 2141 | (struct usb_descriptor_header *) &uasp_cmd_pipe_desc, |
2142 | NULL, | ||
2142 | }; | 2143 | }; |
2143 | 2144 | ||
2144 | static struct usb_descriptor_header *uasp_hs_function_desc[] = { | 2145 | static struct usb_descriptor_header *uasp_hs_function_desc[] = { |
@@ -2239,6 +2240,7 @@ static int usbg_bind(struct usb_configuration *c, struct usb_function *f) | |||
2239 | struct usb_gadget *gadget = c->cdev->gadget; | 2240 | struct usb_gadget *gadget = c->cdev->gadget; |
2240 | struct usb_ep *ep; | 2241 | struct usb_ep *ep; |
2241 | int iface; | 2242 | int iface; |
2243 | int ret; | ||
2242 | 2244 | ||
2243 | iface = usb_interface_id(c, f); | 2245 | iface = usb_interface_id(c, f); |
2244 | if (iface < 0) | 2246 | if (iface < 0) |
@@ -2289,6 +2291,11 @@ static int usbg_bind(struct usb_configuration *c, struct usb_function *f) | |||
2289 | uasp_ss_status_desc.bEndpointAddress; | 2291 | uasp_ss_status_desc.bEndpointAddress; |
2290 | uasp_fs_cmd_desc.bEndpointAddress = uasp_ss_cmd_desc.bEndpointAddress; | 2292 | uasp_fs_cmd_desc.bEndpointAddress = uasp_ss_cmd_desc.bEndpointAddress; |
2291 | 2293 | ||
2294 | ret = usb_assign_descriptors(f, uasp_fs_function_desc, | ||
2295 | uasp_hs_function_desc, uasp_ss_function_desc); | ||
2296 | if (ret) | ||
2297 | goto ep_fail; | ||
2298 | |||
2292 | return 0; | 2299 | return 0; |
2293 | ep_fail: | 2300 | ep_fail: |
2294 | pr_err("Can't claim all required eps\n"); | 2301 | pr_err("Can't claim all required eps\n"); |
@@ -2304,6 +2311,7 @@ static void usbg_unbind(struct usb_configuration *c, struct usb_function *f) | |||
2304 | { | 2311 | { |
2305 | struct f_uas *fu = to_f_uas(f); | 2312 | struct f_uas *fu = to_f_uas(f); |
2306 | 2313 | ||
2314 | usb_free_all_descriptors(f); | ||
2307 | kfree(fu); | 2315 | kfree(fu); |
2308 | } | 2316 | } |
2309 | 2317 | ||
@@ -2384,9 +2392,6 @@ static int usbg_cfg_bind(struct usb_configuration *c) | |||
2384 | if (!fu) | 2392 | if (!fu) |
2385 | return -ENOMEM; | 2393 | return -ENOMEM; |
2386 | fu->function.name = "Target Function"; | 2394 | fu->function.name = "Target Function"; |
2387 | fu->function.descriptors = uasp_fs_function_desc; | ||
2388 | fu->function.hs_descriptors = uasp_hs_function_desc; | ||
2389 | fu->function.ss_descriptors = uasp_ss_function_desc; | ||
2390 | fu->function.bind = usbg_bind; | 2395 | fu->function.bind = usbg_bind; |
2391 | fu->function.unbind = usbg_unbind; | 2396 | fu->function.unbind = usbg_unbind; |
2392 | fu->function.set_alt = usbg_set_alt; | 2397 | fu->function.set_alt = usbg_set_alt; |
diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c index f3cd9690b101..4d90a800063c 100644 --- a/drivers/usb/gadget/udc-core.c +++ b/drivers/usb/gadget/udc-core.c | |||
@@ -439,16 +439,6 @@ static DEVICE_ATTR(name, S_IRUSR, usb_udc_##param##_show, NULL) | |||
439 | static USB_UDC_SPEED_ATTR(current_speed, speed); | 439 | static USB_UDC_SPEED_ATTR(current_speed, speed); |
440 | static USB_UDC_SPEED_ATTR(maximum_speed, max_speed); | 440 | static USB_UDC_SPEED_ATTR(maximum_speed, max_speed); |
441 | 441 | ||
442 | /* TODO: Scheduled for removal in 3.8. */ | ||
443 | static ssize_t usb_udc_is_dualspeed_show(struct device *dev, | ||
444 | struct device_attribute *attr, char *buf) | ||
445 | { | ||
446 | struct usb_udc *udc = container_of(dev, struct usb_udc, dev); | ||
447 | return snprintf(buf, PAGE_SIZE, "%d\n", | ||
448 | gadget_is_dualspeed(udc->gadget)); | ||
449 | } | ||
450 | static DEVICE_ATTR(is_dualspeed, S_IRUSR, usb_udc_is_dualspeed_show, NULL); | ||
451 | |||
452 | #define USB_UDC_ATTR(name) \ | 442 | #define USB_UDC_ATTR(name) \ |
453 | ssize_t usb_udc_##name##_show(struct device *dev, \ | 443 | ssize_t usb_udc_##name##_show(struct device *dev, \ |
454 | struct device_attribute *attr, char *buf) \ | 444 | struct device_attribute *attr, char *buf) \ |
@@ -472,7 +462,6 @@ static struct attribute *usb_udc_attrs[] = { | |||
472 | &dev_attr_current_speed.attr, | 462 | &dev_attr_current_speed.attr, |
473 | &dev_attr_maximum_speed.attr, | 463 | &dev_attr_maximum_speed.attr, |
474 | 464 | ||
475 | &dev_attr_is_dualspeed.attr, | ||
476 | &dev_attr_is_otg.attr, | 465 | &dev_attr_is_otg.attr, |
477 | &dev_attr_is_a_peripheral.attr, | 466 | &dev_attr_is_a_peripheral.attr, |
478 | &dev_attr_b_hnp_enable.attr, | 467 | &dev_attr_b_hnp_enable.attr, |
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 3f1431d37e1c..d6bb128ce21e 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig | |||
@@ -95,6 +95,11 @@ config USB_EHCI_TT_NEWSCHED | |||
95 | 95 | ||
96 | If unsure, say Y. | 96 | If unsure, say Y. |
97 | 97 | ||
98 | config USB_EHCI_PCI | ||
99 | tristate | ||
100 | depends on USB_EHCI_HCD && PCI | ||
101 | default y | ||
102 | |||
98 | config USB_EHCI_HCD_PMC_MSP | 103 | config USB_EHCI_HCD_PMC_MSP |
99 | tristate "EHCI support for on-chip PMC MSP71xx USB controller" | 104 | tristate "EHCI support for on-chip PMC MSP71xx USB controller" |
100 | depends on USB_EHCI_HCD && MSP_HAS_USB | 105 | depends on USB_EHCI_HCD && MSP_HAS_USB |
@@ -215,9 +220,13 @@ config USB_W90X900_EHCI | |||
215 | Enables support for the W90X900 USB controller | 220 | Enables support for the W90X900 USB controller |
216 | 221 | ||
217 | config USB_CNS3XXX_EHCI | 222 | config USB_CNS3XXX_EHCI |
218 | bool "Cavium CNS3XXX EHCI Module" | 223 | bool "Cavium CNS3XXX EHCI Module (DEPRECATED)" |
219 | depends on USB_EHCI_HCD && ARCH_CNS3XXX | 224 | depends on USB_EHCI_HCD && ARCH_CNS3XXX |
225 | select USB_EHCI_HCD_PLATFORM | ||
220 | ---help--- | 226 | ---help--- |
227 | This option is deprecated now and the driver was removed, use | ||
228 | USB_EHCI_HCD_PLATFORM instead. | ||
229 | |||
221 | Enable support for the CNS3XXX SOC's on-chip EHCI controller. | 230 | Enable support for the CNS3XXX SOC's on-chip EHCI controller. |
222 | It is needed for high-speed (480Mbit/sec) USB 2.0 device | 231 | It is needed for high-speed (480Mbit/sec) USB 2.0 device |
223 | support. | 232 | support. |
@@ -333,16 +342,6 @@ config USB_OHCI_ATH79 | |||
333 | Enables support for the built-in OHCI controller present on the | 342 | Enables support for the built-in OHCI controller present on the |
334 | Atheros AR71XX/AR7240 SoCs. | 343 | Atheros AR71XX/AR7240 SoCs. |
335 | 344 | ||
336 | config USB_OHCI_HCD_PPC_SOC | ||
337 | bool "OHCI support for on-chip PPC USB controller" | ||
338 | depends on USB_OHCI_HCD && (STB03xxx || PPC_MPC52xx) | ||
339 | default y | ||
340 | select USB_OHCI_BIG_ENDIAN_DESC | ||
341 | select USB_OHCI_BIG_ENDIAN_MMIO | ||
342 | ---help--- | ||
343 | Enables support for the USB controller on the MPC52xx or | ||
344 | STB03xxx processor chip. If unsure, say Y. | ||
345 | |||
346 | config USB_OHCI_HCD_PPC_OF_BE | 345 | config USB_OHCI_HCD_PPC_OF_BE |
347 | bool "OHCI support for OF platform bus (big endian)" | 346 | bool "OHCI support for OF platform bus (big endian)" |
348 | depends on USB_OHCI_HCD && PPC_OF | 347 | depends on USB_OHCI_HCD && PPC_OF |
@@ -393,9 +392,13 @@ config USB_OHCI_HCD_SSB | |||
393 | If unsure, say N. | 392 | If unsure, say N. |
394 | 393 | ||
395 | config USB_OHCI_SH | 394 | config USB_OHCI_SH |
396 | bool "OHCI support for SuperH USB controller" | 395 | bool "OHCI support for SuperH USB controller (DEPRECATED)" |
397 | depends on USB_OHCI_HCD && SUPERH | 396 | depends on USB_OHCI_HCD && SUPERH |
397 | select USB_OHCI_HCD_PLATFORM | ||
398 | ---help--- | 398 | ---help--- |
399 | This option is deprecated now and the driver was removed, use | ||
400 | USB_OHCI_HCD_PLATFORM instead. | ||
401 | |||
399 | Enables support for the on-chip OHCI controller on the SuperH. | 402 | Enables support for the on-chip OHCI controller on the SuperH. |
400 | If you use the PCI OHCI controller, this option is not necessary. | 403 | If you use the PCI OHCI controller, this option is not necessary. |
401 | 404 | ||
@@ -406,9 +409,13 @@ config USB_OHCI_EXYNOS | |||
406 | Enable support for the Samsung Exynos SOC's on-chip OHCI controller. | 409 | Enable support for the Samsung Exynos SOC's on-chip OHCI controller. |
407 | 410 | ||
408 | config USB_CNS3XXX_OHCI | 411 | config USB_CNS3XXX_OHCI |
409 | bool "Cavium CNS3XXX OHCI Module" | 412 | bool "Cavium CNS3XXX OHCI Module (DEPRECATED)" |
410 | depends on USB_OHCI_HCD && ARCH_CNS3XXX | 413 | depends on USB_OHCI_HCD && ARCH_CNS3XXX |
414 | select USB_OHCI_HCD_PLATFORM | ||
411 | ---help--- | 415 | ---help--- |
416 | This option is deprecated now and the driver was removed, use | ||
417 | USB_OHCI_HCD_PLATFORM instead. | ||
418 | |||
412 | Enable support for the CNS3XXX SOC's on-chip OHCI controller. | 419 | Enable support for the CNS3XXX SOC's on-chip OHCI controller. |
413 | It is needed for low-speed USB 1.0 device support. | 420 | It is needed for low-speed USB 1.0 device support. |
414 | 421 | ||
@@ -423,7 +430,7 @@ config USB_OHCI_HCD_PLATFORM | |||
423 | If unsure, say N. | 430 | If unsure, say N. |
424 | 431 | ||
425 | config USB_EHCI_HCD_PLATFORM | 432 | config USB_EHCI_HCD_PLATFORM |
426 | bool "Generic EHCI driver for a platform device" | 433 | tristate "Generic EHCI driver for a platform device" |
427 | depends on USB_EHCI_HCD | 434 | depends on USB_EHCI_HCD |
428 | default n | 435 | default n |
429 | ---help--- | 436 | ---help--- |
diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index 9e0a89ced15c..1eb4c3006e9e 100644 --- a/drivers/usb/host/Makefile +++ b/drivers/usb/host/Makefile | |||
@@ -24,6 +24,9 @@ obj-$(CONFIG_USB_WHCI_HCD) += whci/ | |||
24 | obj-$(CONFIG_PCI) += pci-quirks.o | 24 | obj-$(CONFIG_PCI) += pci-quirks.o |
25 | 25 | ||
26 | obj-$(CONFIG_USB_EHCI_HCD) += ehci-hcd.o | 26 | obj-$(CONFIG_USB_EHCI_HCD) += ehci-hcd.o |
27 | obj-$(CONFIG_USB_EHCI_PCI) += ehci-pci.o | ||
28 | obj-$(CONFIG_USB_EHCI_HCD_PLATFORM) += ehci-platform.o | ||
29 | |||
27 | obj-$(CONFIG_USB_OXU210HP_HCD) += oxu210hp-hcd.o | 30 | obj-$(CONFIG_USB_OXU210HP_HCD) += oxu210hp-hcd.o |
28 | obj-$(CONFIG_USB_ISP116X_HCD) += isp116x-hcd.o | 31 | obj-$(CONFIG_USB_ISP116X_HCD) += isp116x-hcd.o |
29 | obj-$(CONFIG_USB_ISP1362_HCD) += isp1362-hcd.o | 32 | obj-$(CONFIG_USB_ISP1362_HCD) += isp1362-hcd.o |
@@ -40,6 +43,5 @@ obj-$(CONFIG_USB_HWA_HCD) += hwa-hc.o | |||
40 | obj-$(CONFIG_USB_IMX21_HCD) += imx21-hcd.o | 43 | obj-$(CONFIG_USB_IMX21_HCD) += imx21-hcd.o |
41 | obj-$(CONFIG_USB_FSL_MPH_DR_OF) += fsl-mph-dr-of.o | 44 | obj-$(CONFIG_USB_FSL_MPH_DR_OF) += fsl-mph-dr-of.o |
42 | obj-$(CONFIG_USB_OCTEON2_COMMON) += octeon2-common.o | 45 | obj-$(CONFIG_USB_OCTEON2_COMMON) += octeon2-common.o |
43 | obj-$(CONFIG_MIPS_ALCHEMY) += alchemy-common.o | ||
44 | obj-$(CONFIG_USB_HCD_BCMA) += bcma-hcd.o | 46 | obj-$(CONFIG_USB_HCD_BCMA) += bcma-hcd.o |
45 | obj-$(CONFIG_USB_HCD_SSB) += ssb-hcd.o | 47 | obj-$(CONFIG_USB_HCD_SSB) += ssb-hcd.o |
diff --git a/drivers/usb/host/bcma-hcd.c b/drivers/usb/host/bcma-hcd.c index 443da21d73ca..df13d425e9c5 100644 --- a/drivers/usb/host/bcma-hcd.c +++ b/drivers/usb/host/bcma-hcd.c | |||
@@ -54,7 +54,7 @@ static int bcma_wait_bits(struct bcma_device *dev, u16 reg, u32 bitmask, | |||
54 | return -ETIMEDOUT; | 54 | return -ETIMEDOUT; |
55 | } | 55 | } |
56 | 56 | ||
57 | static void __devinit bcma_hcd_4716wa(struct bcma_device *dev) | 57 | static void bcma_hcd_4716wa(struct bcma_device *dev) |
58 | { | 58 | { |
59 | #ifdef CONFIG_BCMA_DRIVER_MIPS | 59 | #ifdef CONFIG_BCMA_DRIVER_MIPS |
60 | /* Work around for 4716 failures. */ | 60 | /* Work around for 4716 failures. */ |
@@ -88,7 +88,7 @@ static void __devinit bcma_hcd_4716wa(struct bcma_device *dev) | |||
88 | } | 88 | } |
89 | 89 | ||
90 | /* based on arch/mips/brcm-boards/bcm947xx/pcibios.c */ | 90 | /* based on arch/mips/brcm-boards/bcm947xx/pcibios.c */ |
91 | static void __devinit bcma_hcd_init_chip(struct bcma_device *dev) | 91 | static void bcma_hcd_init_chip(struct bcma_device *dev) |
92 | { | 92 | { |
93 | u32 tmp; | 93 | u32 tmp; |
94 | 94 | ||
@@ -165,8 +165,7 @@ static const struct usb_ehci_pdata ehci_pdata = { | |||
165 | static const struct usb_ohci_pdata ohci_pdata = { | 165 | static const struct usb_ohci_pdata ohci_pdata = { |
166 | }; | 166 | }; |
167 | 167 | ||
168 | static struct platform_device * __devinit | 168 | static struct platform_device *bcma_hcd_create_pdev(struct bcma_device *dev, bool ohci, u32 addr) |
169 | bcma_hcd_create_pdev(struct bcma_device *dev, bool ohci, u32 addr) | ||
170 | { | 169 | { |
171 | struct platform_device *hci_dev; | 170 | struct platform_device *hci_dev; |
172 | struct resource hci_res[2]; | 171 | struct resource hci_res[2]; |
@@ -212,7 +211,7 @@ err_alloc: | |||
212 | return ERR_PTR(ret); | 211 | return ERR_PTR(ret); |
213 | } | 212 | } |
214 | 213 | ||
215 | static int __devinit bcma_hcd_probe(struct bcma_device *dev) | 214 | static int bcma_hcd_probe(struct bcma_device *dev) |
216 | { | 215 | { |
217 | int err; | 216 | int err; |
218 | u16 chipid_top; | 217 | u16 chipid_top; |
@@ -266,7 +265,7 @@ err_free_usb_dev: | |||
266 | return err; | 265 | return err; |
267 | } | 266 | } |
268 | 267 | ||
269 | static void __devexit bcma_hcd_remove(struct bcma_device *dev) | 268 | static void bcma_hcd_remove(struct bcma_device *dev) |
270 | { | 269 | { |
271 | struct bcma_hcd_device *usb_dev = bcma_get_drvdata(dev); | 270 | struct bcma_hcd_device *usb_dev = bcma_get_drvdata(dev); |
272 | struct platform_device *ohci_dev = usb_dev->ohci_dev; | 271 | struct platform_device *ohci_dev = usb_dev->ohci_dev; |
@@ -306,7 +305,7 @@ static int bcma_hcd_resume(struct bcma_device *dev) | |||
306 | #define bcma_hcd_resume NULL | 305 | #define bcma_hcd_resume NULL |
307 | #endif /* CONFIG_PM */ | 306 | #endif /* CONFIG_PM */ |
308 | 307 | ||
309 | static const struct bcma_device_id bcma_hcd_table[] __devinitconst = { | 308 | static const struct bcma_device_id bcma_hcd_table[] = { |
310 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_USB20_HOST, BCMA_ANY_REV, BCMA_ANY_CLASS), | 309 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_USB20_HOST, BCMA_ANY_REV, BCMA_ANY_CLASS), |
311 | BCMA_CORETABLE_END | 310 | BCMA_CORETABLE_END |
312 | }; | 311 | }; |
@@ -316,7 +315,7 @@ static struct bcma_driver bcma_hcd_driver = { | |||
316 | .name = KBUILD_MODNAME, | 315 | .name = KBUILD_MODNAME, |
317 | .id_table = bcma_hcd_table, | 316 | .id_table = bcma_hcd_table, |
318 | .probe = bcma_hcd_probe, | 317 | .probe = bcma_hcd_probe, |
319 | .remove = __devexit_p(bcma_hcd_remove), | 318 | .remove = bcma_hcd_remove, |
320 | .shutdown = bcma_hcd_shutdown, | 319 | .shutdown = bcma_hcd_shutdown, |
321 | .suspend = bcma_hcd_suspend, | 320 | .suspend = bcma_hcd_suspend, |
322 | .resume = bcma_hcd_resume, | 321 | .resume = bcma_hcd_resume, |
diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c index 411bb74152eb..27639487f7ac 100644 --- a/drivers/usb/host/ehci-atmel.c +++ b/drivers/usb/host/ehci-atmel.c | |||
@@ -53,18 +53,11 @@ static void atmel_stop_ehci(struct platform_device *pdev) | |||
53 | static int ehci_atmel_setup(struct usb_hcd *hcd) | 53 | static int ehci_atmel_setup(struct usb_hcd *hcd) |
54 | { | 54 | { |
55 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 55 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
56 | int retval; | ||
57 | 56 | ||
58 | /* registers start at offset 0x0 */ | 57 | /* registers start at offset 0x0 */ |
59 | ehci->caps = hcd->regs; | 58 | ehci->caps = hcd->regs; |
60 | 59 | ||
61 | retval = ehci_setup(hcd); | 60 | return ehci_setup(hcd); |
62 | if (retval) | ||
63 | return retval; | ||
64 | |||
65 | ehci_port_power(ehci, 0); | ||
66 | |||
67 | return retval; | ||
68 | } | 61 | } |
69 | 62 | ||
70 | static const struct hc_driver ehci_atmel_hc_driver = { | 63 | static const struct hc_driver ehci_atmel_hc_driver = { |
@@ -104,7 +97,7 @@ static const struct hc_driver ehci_atmel_hc_driver = { | |||
104 | 97 | ||
105 | static u64 at91_ehci_dma_mask = DMA_BIT_MASK(32); | 98 | static u64 at91_ehci_dma_mask = DMA_BIT_MASK(32); |
106 | 99 | ||
107 | static int __devinit ehci_atmel_drv_probe(struct platform_device *pdev) | 100 | static int ehci_atmel_drv_probe(struct platform_device *pdev) |
108 | { | 101 | { |
109 | struct usb_hcd *hcd; | 102 | struct usb_hcd *hcd; |
110 | const struct hc_driver *driver = &ehci_atmel_hc_driver; | 103 | const struct hc_driver *driver = &ehci_atmel_hc_driver; |
@@ -189,7 +182,7 @@ fail_create_hcd: | |||
189 | return retval; | 182 | return retval; |
190 | } | 183 | } |
191 | 184 | ||
192 | static int __devexit ehci_atmel_drv_remove(struct platform_device *pdev) | 185 | static int ehci_atmel_drv_remove(struct platform_device *pdev) |
193 | { | 186 | { |
194 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | 187 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
195 | 188 | ||
@@ -214,7 +207,7 @@ MODULE_DEVICE_TABLE(of, atmel_ehci_dt_ids); | |||
214 | 207 | ||
215 | static struct platform_driver ehci_atmel_driver = { | 208 | static struct platform_driver ehci_atmel_driver = { |
216 | .probe = ehci_atmel_drv_probe, | 209 | .probe = ehci_atmel_drv_probe, |
217 | .remove = __devexit_p(ehci_atmel_drv_remove), | 210 | .remove = ehci_atmel_drv_remove, |
218 | .shutdown = usb_hcd_platform_shutdown, | 211 | .shutdown = usb_hcd_platform_shutdown, |
219 | .driver = { | 212 | .driver = { |
220 | .name = "atmel-ehci", | 213 | .name = "atmel-ehci", |
diff --git a/drivers/usb/host/ehci-au1xxx.c b/drivers/usb/host/ehci-au1xxx.c deleted file mode 100644 index 65c945eb4144..000000000000 --- a/drivers/usb/host/ehci-au1xxx.c +++ /dev/null | |||
@@ -1,184 +0,0 @@ | |||
1 | /* | ||
2 | * EHCI HCD (Host Controller Driver) for USB. | ||
3 | * | ||
4 | * Bus Glue for AMD Alchemy Au1xxx | ||
5 | * | ||
6 | * Based on "ohci-au1xxx.c" by Matt Porter <mporter@kernel.crashing.org> | ||
7 | * | ||
8 | * Modified for AMD Alchemy Au1200 EHC | ||
9 | * by K.Boge <karsten.boge@amd.com> | ||
10 | * | ||
11 | * This file is licenced under the GPL. | ||
12 | */ | ||
13 | |||
14 | #include <linux/platform_device.h> | ||
15 | #include <asm/mach-au1x00/au1000.h> | ||
16 | |||
17 | |||
18 | extern int usb_disabled(void); | ||
19 | |||
20 | static int au1xxx_ehci_setup(struct usb_hcd *hcd) | ||
21 | { | ||
22 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
23 | int ret; | ||
24 | |||
25 | ehci->caps = hcd->regs; | ||
26 | ret = ehci_setup(hcd); | ||
27 | |||
28 | ehci->need_io_watchdog = 0; | ||
29 | return ret; | ||
30 | } | ||
31 | |||
32 | static const struct hc_driver ehci_au1xxx_hc_driver = { | ||
33 | .description = hcd_name, | ||
34 | .product_desc = "Au1xxx EHCI", | ||
35 | .hcd_priv_size = sizeof(struct ehci_hcd), | ||
36 | |||
37 | /* | ||
38 | * generic hardware linkage | ||
39 | */ | ||
40 | .irq = ehci_irq, | ||
41 | .flags = HCD_MEMORY | HCD_USB2, | ||
42 | |||
43 | /* | ||
44 | * basic lifecycle operations | ||
45 | * | ||
46 | * FIXME -- ehci_init() doesn't do enough here. | ||
47 | * See ehci-ppc-soc for a complete implementation. | ||
48 | */ | ||
49 | .reset = au1xxx_ehci_setup, | ||
50 | .start = ehci_run, | ||
51 | .stop = ehci_stop, | ||
52 | .shutdown = ehci_shutdown, | ||
53 | |||
54 | /* | ||
55 | * managing i/o requests and associated device resources | ||
56 | */ | ||
57 | .urb_enqueue = ehci_urb_enqueue, | ||
58 | .urb_dequeue = ehci_urb_dequeue, | ||
59 | .endpoint_disable = ehci_endpoint_disable, | ||
60 | .endpoint_reset = ehci_endpoint_reset, | ||
61 | |||
62 | /* | ||
63 | * scheduling support | ||
64 | */ | ||
65 | .get_frame_number = ehci_get_frame, | ||
66 | |||
67 | /* | ||
68 | * root hub support | ||
69 | */ | ||
70 | .hub_status_data = ehci_hub_status_data, | ||
71 | .hub_control = ehci_hub_control, | ||
72 | .bus_suspend = ehci_bus_suspend, | ||
73 | .bus_resume = ehci_bus_resume, | ||
74 | .relinquish_port = ehci_relinquish_port, | ||
75 | .port_handed_over = ehci_port_handed_over, | ||
76 | |||
77 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
78 | }; | ||
79 | |||
80 | static int ehci_hcd_au1xxx_drv_probe(struct platform_device *pdev) | ||
81 | { | ||
82 | struct usb_hcd *hcd; | ||
83 | struct resource *res; | ||
84 | int ret; | ||
85 | |||
86 | if (usb_disabled()) | ||
87 | return -ENODEV; | ||
88 | |||
89 | if (pdev->resource[1].flags != IORESOURCE_IRQ) { | ||
90 | pr_debug("resource[1] is not IORESOURCE_IRQ"); | ||
91 | return -ENOMEM; | ||
92 | } | ||
93 | hcd = usb_create_hcd(&ehci_au1xxx_hc_driver, &pdev->dev, "Au1xxx"); | ||
94 | if (!hcd) | ||
95 | return -ENOMEM; | ||
96 | |||
97 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
98 | hcd->rsrc_start = res->start; | ||
99 | hcd->rsrc_len = resource_size(res); | ||
100 | |||
101 | hcd->regs = devm_request_and_ioremap(&pdev->dev, res); | ||
102 | if (!hcd->regs) { | ||
103 | pr_debug("devm_request_and_ioremap failed"); | ||
104 | ret = -ENOMEM; | ||
105 | goto err1; | ||
106 | } | ||
107 | |||
108 | if (alchemy_usb_control(ALCHEMY_USB_EHCI0, 1)) { | ||
109 | printk(KERN_INFO "%s: controller init failed!\n", pdev->name); | ||
110 | ret = -ENODEV; | ||
111 | goto err1; | ||
112 | } | ||
113 | |||
114 | ret = usb_add_hcd(hcd, pdev->resource[1].start, | ||
115 | IRQF_SHARED); | ||
116 | if (ret == 0) { | ||
117 | platform_set_drvdata(pdev, hcd); | ||
118 | return ret; | ||
119 | } | ||
120 | |||
121 | alchemy_usb_control(ALCHEMY_USB_EHCI0, 0); | ||
122 | err1: | ||
123 | usb_put_hcd(hcd); | ||
124 | return ret; | ||
125 | } | ||
126 | |||
127 | static int ehci_hcd_au1xxx_drv_remove(struct platform_device *pdev) | ||
128 | { | ||
129 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
130 | |||
131 | usb_remove_hcd(hcd); | ||
132 | alchemy_usb_control(ALCHEMY_USB_EHCI0, 0); | ||
133 | usb_put_hcd(hcd); | ||
134 | platform_set_drvdata(pdev, NULL); | ||
135 | |||
136 | return 0; | ||
137 | } | ||
138 | |||
139 | #ifdef CONFIG_PM | ||
140 | static int ehci_hcd_au1xxx_drv_suspend(struct device *dev) | ||
141 | { | ||
142 | struct usb_hcd *hcd = dev_get_drvdata(dev); | ||
143 | bool do_wakeup = device_may_wakeup(dev); | ||
144 | int rc; | ||
145 | |||
146 | rc = ehci_suspend(hcd, do_wakeup); | ||
147 | alchemy_usb_control(ALCHEMY_USB_EHCI0, 0); | ||
148 | |||
149 | return rc; | ||
150 | } | ||
151 | |||
152 | static int ehci_hcd_au1xxx_drv_resume(struct device *dev) | ||
153 | { | ||
154 | struct usb_hcd *hcd = dev_get_drvdata(dev); | ||
155 | |||
156 | alchemy_usb_control(ALCHEMY_USB_EHCI0, 1); | ||
157 | ehci_resume(hcd, false); | ||
158 | |||
159 | return 0; | ||
160 | } | ||
161 | |||
162 | static const struct dev_pm_ops au1xxx_ehci_pmops = { | ||
163 | .suspend = ehci_hcd_au1xxx_drv_suspend, | ||
164 | .resume = ehci_hcd_au1xxx_drv_resume, | ||
165 | }; | ||
166 | |||
167 | #define AU1XXX_EHCI_PMOPS &au1xxx_ehci_pmops | ||
168 | |||
169 | #else | ||
170 | #define AU1XXX_EHCI_PMOPS NULL | ||
171 | #endif | ||
172 | |||
173 | static struct platform_driver ehci_hcd_au1xxx_driver = { | ||
174 | .probe = ehci_hcd_au1xxx_drv_probe, | ||
175 | .remove = ehci_hcd_au1xxx_drv_remove, | ||
176 | .shutdown = usb_hcd_platform_shutdown, | ||
177 | .driver = { | ||
178 | .name = "au1xxx-ehci", | ||
179 | .owner = THIS_MODULE, | ||
180 | .pm = AU1XXX_EHCI_PMOPS, | ||
181 | } | ||
182 | }; | ||
183 | |||
184 | MODULE_ALIAS("platform:au1xxx-ehci"); | ||
diff --git a/drivers/usb/host/ehci-cns3xxx.c b/drivers/usb/host/ehci-cns3xxx.c deleted file mode 100644 index d91708d2e729..000000000000 --- a/drivers/usb/host/ehci-cns3xxx.c +++ /dev/null | |||
@@ -1,155 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2008 Cavium Networks | ||
3 | * | ||
4 | * This file is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License, Version 2, as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | #include <linux/platform_device.h> | ||
10 | #include <linux/atomic.h> | ||
11 | #include <mach/cns3xxx.h> | ||
12 | #include <mach/pm.h> | ||
13 | |||
14 | static int cns3xxx_ehci_init(struct usb_hcd *hcd) | ||
15 | { | ||
16 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
17 | int retval; | ||
18 | |||
19 | /* | ||
20 | * EHCI and OHCI share the same clock and power, | ||
21 | * resetting twice would cause the 1st controller been reset. | ||
22 | * Therefore only do power up at the first up device, and | ||
23 | * power down at the last down device. | ||
24 | * | ||
25 | * Set USB AHB INCR length to 16 | ||
26 | */ | ||
27 | if (atomic_inc_return(&usb_pwr_ref) == 1) { | ||
28 | cns3xxx_pwr_power_up(1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_USB); | ||
29 | cns3xxx_pwr_clk_en(1 << PM_CLK_GATE_REG_OFFSET_USB_HOST); | ||
30 | cns3xxx_pwr_soft_rst(1 << PM_SOFT_RST_REG_OFFST_USB_HOST); | ||
31 | __raw_writel((__raw_readl(MISC_CHIP_CONFIG_REG) | (0X2 << 24)), | ||
32 | MISC_CHIP_CONFIG_REG); | ||
33 | } | ||
34 | |||
35 | ehci->caps = hcd->regs; | ||
36 | |||
37 | hcd->has_tt = 0; | ||
38 | |||
39 | retval = ehci_setup(hcd); | ||
40 | if (retval) | ||
41 | return retval; | ||
42 | |||
43 | ehci_port_power(ehci, 0); | ||
44 | |||
45 | return retval; | ||
46 | } | ||
47 | |||
48 | static const struct hc_driver cns3xxx_ehci_hc_driver = { | ||
49 | .description = hcd_name, | ||
50 | .product_desc = "CNS3XXX EHCI Host Controller", | ||
51 | .hcd_priv_size = sizeof(struct ehci_hcd), | ||
52 | .irq = ehci_irq, | ||
53 | .flags = HCD_MEMORY | HCD_USB2, | ||
54 | .reset = cns3xxx_ehci_init, | ||
55 | .start = ehci_run, | ||
56 | .stop = ehci_stop, | ||
57 | .shutdown = ehci_shutdown, | ||
58 | .urb_enqueue = ehci_urb_enqueue, | ||
59 | .urb_dequeue = ehci_urb_dequeue, | ||
60 | .endpoint_disable = ehci_endpoint_disable, | ||
61 | .endpoint_reset = ehci_endpoint_reset, | ||
62 | .get_frame_number = ehci_get_frame, | ||
63 | .hub_status_data = ehci_hub_status_data, | ||
64 | .hub_control = ehci_hub_control, | ||
65 | #ifdef CONFIG_PM | ||
66 | .bus_suspend = ehci_bus_suspend, | ||
67 | .bus_resume = ehci_bus_resume, | ||
68 | #endif | ||
69 | .relinquish_port = ehci_relinquish_port, | ||
70 | .port_handed_over = ehci_port_handed_over, | ||
71 | |||
72 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
73 | }; | ||
74 | |||
75 | static int cns3xxx_ehci_probe(struct platform_device *pdev) | ||
76 | { | ||
77 | struct device *dev = &pdev->dev; | ||
78 | struct usb_hcd *hcd; | ||
79 | const struct hc_driver *driver = &cns3xxx_ehci_hc_driver; | ||
80 | struct resource *res; | ||
81 | int irq; | ||
82 | int retval; | ||
83 | |||
84 | if (usb_disabled()) | ||
85 | return -ENODEV; | ||
86 | |||
87 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
88 | if (!res) { | ||
89 | dev_err(dev, "Found HC with no IRQ.\n"); | ||
90 | return -ENODEV; | ||
91 | } | ||
92 | irq = res->start; | ||
93 | |||
94 | hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); | ||
95 | if (!hcd) | ||
96 | return -ENOMEM; | ||
97 | |||
98 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
99 | if (!res) { | ||
100 | dev_err(dev, "Found HC with no register addr.\n"); | ||
101 | retval = -ENODEV; | ||
102 | goto err1; | ||
103 | } | ||
104 | |||
105 | hcd->rsrc_start = res->start; | ||
106 | hcd->rsrc_len = resource_size(res); | ||
107 | |||
108 | hcd->regs = devm_request_and_ioremap(&pdev->dev, res); | ||
109 | if (hcd->regs == NULL) { | ||
110 | dev_dbg(dev, "error mapping memory\n"); | ||
111 | retval = -EFAULT; | ||
112 | goto err1; | ||
113 | } | ||
114 | |||
115 | retval = usb_add_hcd(hcd, irq, IRQF_SHARED); | ||
116 | if (retval == 0) | ||
117 | return retval; | ||
118 | |||
119 | err1: | ||
120 | usb_put_hcd(hcd); | ||
121 | |||
122 | return retval; | ||
123 | } | ||
124 | |||
125 | static int cns3xxx_ehci_remove(struct platform_device *pdev) | ||
126 | { | ||
127 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
128 | |||
129 | usb_remove_hcd(hcd); | ||
130 | |||
131 | /* | ||
132 | * EHCI and OHCI share the same clock and power, | ||
133 | * resetting twice would cause the 1st controller been reset. | ||
134 | * Therefore only do power up at the first up device, and | ||
135 | * power down at the last down device. | ||
136 | */ | ||
137 | if (atomic_dec_return(&usb_pwr_ref) == 0) | ||
138 | cns3xxx_pwr_clk_dis(1 << PM_CLK_GATE_REG_OFFSET_USB_HOST); | ||
139 | |||
140 | usb_put_hcd(hcd); | ||
141 | |||
142 | platform_set_drvdata(pdev, NULL); | ||
143 | |||
144 | return 0; | ||
145 | } | ||
146 | |||
147 | MODULE_ALIAS("platform:cns3xxx-ehci"); | ||
148 | |||
149 | static struct platform_driver cns3xxx_ehci_driver = { | ||
150 | .probe = cns3xxx_ehci_probe, | ||
151 | .remove = cns3xxx_ehci_remove, | ||
152 | .driver = { | ||
153 | .name = "cns3xxx-ehci", | ||
154 | }, | ||
155 | }; | ||
diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c index 1599806e3d47..70b496dc18a0 100644 --- a/drivers/usb/host/ehci-dbg.c +++ b/drivers/usb/host/ehci-dbg.c | |||
@@ -18,21 +18,6 @@ | |||
18 | 18 | ||
19 | /* this file is part of ehci-hcd.c */ | 19 | /* this file is part of ehci-hcd.c */ |
20 | 20 | ||
21 | #define ehci_dbg(ehci, fmt, args...) \ | ||
22 | dev_dbg (ehci_to_hcd(ehci)->self.controller , fmt , ## args ) | ||
23 | #define ehci_err(ehci, fmt, args...) \ | ||
24 | dev_err (ehci_to_hcd(ehci)->self.controller , fmt , ## args ) | ||
25 | #define ehci_info(ehci, fmt, args...) \ | ||
26 | dev_info (ehci_to_hcd(ehci)->self.controller , fmt , ## args ) | ||
27 | #define ehci_warn(ehci, fmt, args...) \ | ||
28 | dev_warn (ehci_to_hcd(ehci)->self.controller , fmt , ## args ) | ||
29 | |||
30 | #ifdef VERBOSE_DEBUG | ||
31 | # define ehci_vdbg ehci_dbg | ||
32 | #else | ||
33 | static inline void ehci_vdbg(struct ehci_hcd *ehci, ...) {} | ||
34 | #endif | ||
35 | |||
36 | #ifdef DEBUG | 21 | #ifdef DEBUG |
37 | 22 | ||
38 | /* check the values in the HCSPARAMS register | 23 | /* check the values in the HCSPARAMS register |
@@ -352,11 +337,6 @@ static int debug_async_open(struct inode *, struct file *); | |||
352 | static int debug_periodic_open(struct inode *, struct file *); | 337 | static int debug_periodic_open(struct inode *, struct file *); |
353 | static int debug_registers_open(struct inode *, struct file *); | 338 | static int debug_registers_open(struct inode *, struct file *); |
354 | static int debug_async_open(struct inode *, struct file *); | 339 | static int debug_async_open(struct inode *, struct file *); |
355 | static ssize_t debug_lpm_read(struct file *file, char __user *user_buf, | ||
356 | size_t count, loff_t *ppos); | ||
357 | static ssize_t debug_lpm_write(struct file *file, const char __user *buffer, | ||
358 | size_t count, loff_t *ppos); | ||
359 | static int debug_lpm_close(struct inode *inode, struct file *file); | ||
360 | 340 | ||
361 | static ssize_t debug_output(struct file*, char __user*, size_t, loff_t*); | 341 | static ssize_t debug_output(struct file*, char __user*, size_t, loff_t*); |
362 | static int debug_close(struct inode *, struct file *); | 342 | static int debug_close(struct inode *, struct file *); |
@@ -382,14 +362,6 @@ static const struct file_operations debug_registers_fops = { | |||
382 | .release = debug_close, | 362 | .release = debug_close, |
383 | .llseek = default_llseek, | 363 | .llseek = default_llseek, |
384 | }; | 364 | }; |
385 | static const struct file_operations debug_lpm_fops = { | ||
386 | .owner = THIS_MODULE, | ||
387 | .open = simple_open, | ||
388 | .read = debug_lpm_read, | ||
389 | .write = debug_lpm_write, | ||
390 | .release = debug_lpm_close, | ||
391 | .llseek = noop_llseek, | ||
392 | }; | ||
393 | 365 | ||
394 | static struct dentry *ehci_debug_root; | 366 | static struct dentry *ehci_debug_root; |
395 | 367 | ||
@@ -971,86 +943,6 @@ static int debug_registers_open(struct inode *inode, struct file *file) | |||
971 | return file->private_data ? 0 : -ENOMEM; | 943 | return file->private_data ? 0 : -ENOMEM; |
972 | } | 944 | } |
973 | 945 | ||
974 | static int debug_lpm_close(struct inode *inode, struct file *file) | ||
975 | { | ||
976 | return 0; | ||
977 | } | ||
978 | |||
979 | static ssize_t debug_lpm_read(struct file *file, char __user *user_buf, | ||
980 | size_t count, loff_t *ppos) | ||
981 | { | ||
982 | /* TODO: show lpm stats */ | ||
983 | return 0; | ||
984 | } | ||
985 | |||
986 | static ssize_t debug_lpm_write(struct file *file, const char __user *user_buf, | ||
987 | size_t count, loff_t *ppos) | ||
988 | { | ||
989 | struct usb_hcd *hcd; | ||
990 | struct ehci_hcd *ehci; | ||
991 | char buf[50]; | ||
992 | size_t len; | ||
993 | u32 temp; | ||
994 | unsigned long port; | ||
995 | u32 __iomem *portsc ; | ||
996 | u32 params; | ||
997 | |||
998 | hcd = bus_to_hcd(file->private_data); | ||
999 | ehci = hcd_to_ehci(hcd); | ||
1000 | |||
1001 | len = min(count, sizeof(buf) - 1); | ||
1002 | if (copy_from_user(buf, user_buf, len)) | ||
1003 | return -EFAULT; | ||
1004 | buf[len] = '\0'; | ||
1005 | if (len > 0 && buf[len - 1] == '\n') | ||
1006 | buf[len - 1] = '\0'; | ||
1007 | |||
1008 | if (strncmp(buf, "enable", 5) == 0) { | ||
1009 | if (strict_strtoul(buf + 7, 10, &port)) | ||
1010 | return -EINVAL; | ||
1011 | params = ehci_readl(ehci, &ehci->caps->hcs_params); | ||
1012 | if (port > HCS_N_PORTS(params)) { | ||
1013 | ehci_dbg(ehci, "ERR: LPM on bad port %lu\n", port); | ||
1014 | return -ENODEV; | ||
1015 | } | ||
1016 | portsc = &ehci->regs->port_status[port-1]; | ||
1017 | temp = ehci_readl(ehci, portsc); | ||
1018 | if (!(temp & PORT_DEV_ADDR)) { | ||
1019 | ehci_dbg(ehci, "LPM: no device attached\n"); | ||
1020 | return -ENODEV; | ||
1021 | } | ||
1022 | temp |= PORT_LPM; | ||
1023 | ehci_writel(ehci, temp, portsc); | ||
1024 | printk(KERN_INFO "force enable LPM for port %lu\n", port); | ||
1025 | } else if (strncmp(buf, "hird=", 5) == 0) { | ||
1026 | unsigned long hird; | ||
1027 | if (strict_strtoul(buf + 5, 16, &hird)) | ||
1028 | return -EINVAL; | ||
1029 | printk(KERN_INFO "setting hird %s %lu\n", buf + 6, hird); | ||
1030 | ehci->command = (ehci->command & ~CMD_HIRD) | (hird << 24); | ||
1031 | ehci_writel(ehci, ehci->command, &ehci->regs->command); | ||
1032 | } else if (strncmp(buf, "disable", 7) == 0) { | ||
1033 | if (strict_strtoul(buf + 8, 10, &port)) | ||
1034 | return -EINVAL; | ||
1035 | params = ehci_readl(ehci, &ehci->caps->hcs_params); | ||
1036 | if (port > HCS_N_PORTS(params)) { | ||
1037 | ehci_dbg(ehci, "ERR: LPM off bad port %lu\n", port); | ||
1038 | return -ENODEV; | ||
1039 | } | ||
1040 | portsc = &ehci->regs->port_status[port-1]; | ||
1041 | temp = ehci_readl(ehci, portsc); | ||
1042 | if (!(temp & PORT_DEV_ADDR)) { | ||
1043 | ehci_dbg(ehci, "ERR: no device attached\n"); | ||
1044 | return -ENODEV; | ||
1045 | } | ||
1046 | temp &= ~PORT_LPM; | ||
1047 | ehci_writel(ehci, temp, portsc); | ||
1048 | printk(KERN_INFO "disabled LPM for port %lu\n", port); | ||
1049 | } else | ||
1050 | return -EOPNOTSUPP; | ||
1051 | return count; | ||
1052 | } | ||
1053 | |||
1054 | static inline void create_debug_files (struct ehci_hcd *ehci) | 946 | static inline void create_debug_files (struct ehci_hcd *ehci) |
1055 | { | 947 | { |
1056 | struct usb_bus *bus = &ehci_to_hcd(ehci)->self; | 948 | struct usb_bus *bus = &ehci_to_hcd(ehci)->self; |
@@ -1071,10 +963,6 @@ static inline void create_debug_files (struct ehci_hcd *ehci) | |||
1071 | &debug_registers_fops)) | 963 | &debug_registers_fops)) |
1072 | goto file_error; | 964 | goto file_error; |
1073 | 965 | ||
1074 | if (!debugfs_create_file("lpm", S_IRUGO|S_IWUSR, ehci->debug_dir, bus, | ||
1075 | &debug_lpm_fops)) | ||
1076 | goto file_error; | ||
1077 | |||
1078 | return; | 966 | return; |
1079 | 967 | ||
1080 | file_error: | 968 | file_error: |
diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index 0d2f35ca93f1..fd9b5424b860 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c | |||
@@ -349,7 +349,6 @@ static int ehci_fsl_reinit(struct ehci_hcd *ehci) | |||
349 | { | 349 | { |
350 | if (ehci_fsl_usb_setup(ehci)) | 350 | if (ehci_fsl_usb_setup(ehci)) |
351 | return -EINVAL; | 351 | return -EINVAL; |
352 | ehci_port_power(ehci, 0); | ||
353 | 352 | ||
354 | return 0; | 353 | return 0; |
355 | } | 354 | } |
diff --git a/drivers/usb/host/ehci-grlib.c b/drivers/usb/host/ehci-grlib.c index 3180cb3624d9..1fc89292f5d6 100644 --- a/drivers/usb/host/ehci-grlib.c +++ b/drivers/usb/host/ehci-grlib.c | |||
@@ -34,22 +34,6 @@ | |||
34 | 34 | ||
35 | #define GRUSBHC_HCIVERSION 0x0100 /* Known value of cap. reg. HCIVERSION */ | 35 | #define GRUSBHC_HCIVERSION 0x0100 /* Known value of cap. reg. HCIVERSION */ |
36 | 36 | ||
37 | /* called during probe() after chip reset completes */ | ||
38 | static int ehci_grlib_setup(struct usb_hcd *hcd) | ||
39 | { | ||
40 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
41 | int retval; | ||
42 | |||
43 | retval = ehci_setup(hcd); | ||
44 | if (retval) | ||
45 | return retval; | ||
46 | |||
47 | ehci_port_power(ehci, 1); | ||
48 | |||
49 | return retval; | ||
50 | } | ||
51 | |||
52 | |||
53 | static const struct hc_driver ehci_grlib_hc_driver = { | 37 | static const struct hc_driver ehci_grlib_hc_driver = { |
54 | .description = hcd_name, | 38 | .description = hcd_name, |
55 | .product_desc = "GRLIB GRUSBHC EHCI", | 39 | .product_desc = "GRLIB GRUSBHC EHCI", |
@@ -64,7 +48,7 @@ static const struct hc_driver ehci_grlib_hc_driver = { | |||
64 | /* | 48 | /* |
65 | * basic lifecycle operations | 49 | * basic lifecycle operations |
66 | */ | 50 | */ |
67 | .reset = ehci_grlib_setup, | 51 | .reset = ehci_setup, |
68 | .start = ehci_run, | 52 | .start = ehci_run, |
69 | .stop = ehci_stop, | 53 | .stop = ehci_stop, |
70 | .shutdown = ehci_shutdown, | 54 | .shutdown = ehci_shutdown, |
@@ -98,7 +82,7 @@ static const struct hc_driver ehci_grlib_hc_driver = { | |||
98 | }; | 82 | }; |
99 | 83 | ||
100 | 84 | ||
101 | static int __devinit ehci_hcd_grlib_probe(struct platform_device *op) | 85 | static int ehci_hcd_grlib_probe(struct platform_device *op) |
102 | { | 86 | { |
103 | struct device_node *dn = op->dev.of_node; | 87 | struct device_node *dn = op->dev.of_node; |
104 | struct usb_hcd *hcd; | 88 | struct usb_hcd *hcd; |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 6bf6c42481e8..c97503bb0b0e 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -39,7 +39,6 @@ | |||
39 | #include <linux/dma-mapping.h> | 39 | #include <linux/dma-mapping.h> |
40 | #include <linux/debugfs.h> | 40 | #include <linux/debugfs.h> |
41 | #include <linux/slab.h> | 41 | #include <linux/slab.h> |
42 | #include <linux/uaccess.h> | ||
43 | 42 | ||
44 | #include <asm/byteorder.h> | 43 | #include <asm/byteorder.h> |
45 | #include <asm/io.h> | 44 | #include <asm/io.h> |
@@ -108,19 +107,39 @@ static bool ignore_oc = 0; | |||
108 | module_param (ignore_oc, bool, S_IRUGO); | 107 | module_param (ignore_oc, bool, S_IRUGO); |
109 | MODULE_PARM_DESC (ignore_oc, "ignore bogus hardware overcurrent indications"); | 108 | MODULE_PARM_DESC (ignore_oc, "ignore bogus hardware overcurrent indications"); |
110 | 109 | ||
111 | /* for link power management(LPM) feature */ | ||
112 | static unsigned int hird; | ||
113 | module_param(hird, int, S_IRUGO); | ||
114 | MODULE_PARM_DESC(hird, "host initiated resume duration, +1 for each 75us"); | ||
115 | |||
116 | #define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT) | 110 | #define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT) |
117 | 111 | ||
118 | /*-------------------------------------------------------------------------*/ | 112 | /*-------------------------------------------------------------------------*/ |
119 | 113 | ||
120 | #include "ehci.h" | 114 | #include "ehci.h" |
121 | #include "ehci-dbg.c" | ||
122 | #include "pci-quirks.h" | 115 | #include "pci-quirks.h" |
123 | 116 | ||
117 | /* | ||
118 | * The MosChip MCS9990 controller updates its microframe counter | ||
119 | * a little before the frame counter, and occasionally we will read | ||
120 | * the invalid intermediate value. Avoid problems by checking the | ||
121 | * microframe number (the low-order 3 bits); if they are 0 then | ||
122 | * re-read the register to get the correct value. | ||
123 | */ | ||
124 | static unsigned ehci_moschip_read_frame_index(struct ehci_hcd *ehci) | ||
125 | { | ||
126 | unsigned uf; | ||
127 | |||
128 | uf = ehci_readl(ehci, &ehci->regs->frame_index); | ||
129 | if (unlikely((uf & 7) == 0)) | ||
130 | uf = ehci_readl(ehci, &ehci->regs->frame_index); | ||
131 | return uf; | ||
132 | } | ||
133 | |||
134 | static inline unsigned ehci_read_frame_index(struct ehci_hcd *ehci) | ||
135 | { | ||
136 | if (ehci->frame_index_bug) | ||
137 | return ehci_moschip_read_frame_index(ehci); | ||
138 | return ehci_readl(ehci, &ehci->regs->frame_index); | ||
139 | } | ||
140 | |||
141 | #include "ehci-dbg.c" | ||
142 | |||
124 | /*-------------------------------------------------------------------------*/ | 143 | /*-------------------------------------------------------------------------*/ |
125 | 144 | ||
126 | /* | 145 | /* |
@@ -293,7 +312,6 @@ static void end_unlink_intr(struct ehci_hcd *ehci, struct ehci_qh *qh); | |||
293 | 312 | ||
294 | #include "ehci-timer.c" | 313 | #include "ehci-timer.c" |
295 | #include "ehci-hub.c" | 314 | #include "ehci-hub.c" |
296 | #include "ehci-lpm.c" | ||
297 | #include "ehci-mem.c" | 315 | #include "ehci-mem.c" |
298 | #include "ehci-q.c" | 316 | #include "ehci-q.c" |
299 | #include "ehci-sched.c" | 317 | #include "ehci-sched.c" |
@@ -353,24 +371,6 @@ static void ehci_shutdown(struct usb_hcd *hcd) | |||
353 | hrtimer_cancel(&ehci->hrtimer); | 371 | hrtimer_cancel(&ehci->hrtimer); |
354 | } | 372 | } |
355 | 373 | ||
356 | static void ehci_port_power (struct ehci_hcd *ehci, int is_on) | ||
357 | { | ||
358 | unsigned port; | ||
359 | |||
360 | if (!HCS_PPC (ehci->hcs_params)) | ||
361 | return; | ||
362 | |||
363 | ehci_dbg (ehci, "...power%s ports...\n", is_on ? "up" : "down"); | ||
364 | for (port = HCS_N_PORTS (ehci->hcs_params); port > 0; ) | ||
365 | (void) ehci_hub_control(ehci_to_hcd(ehci), | ||
366 | is_on ? SetPortFeature : ClearPortFeature, | ||
367 | USB_PORT_FEAT_POWER, | ||
368 | port--, NULL, 0); | ||
369 | /* Flush those writes */ | ||
370 | ehci_readl(ehci, &ehci->regs->command); | ||
371 | msleep(20); | ||
372 | } | ||
373 | |||
374 | /*-------------------------------------------------------------------------*/ | 374 | /*-------------------------------------------------------------------------*/ |
375 | 375 | ||
376 | /* | 376 | /* |
@@ -503,7 +503,7 @@ static int ehci_init(struct usb_hcd *hcd) | |||
503 | 503 | ||
504 | /* controllers may cache some of the periodic schedule ... */ | 504 | /* controllers may cache some of the periodic schedule ... */ |
505 | if (HCC_ISOC_CACHE(hcc_params)) // full frame cache | 505 | if (HCC_ISOC_CACHE(hcc_params)) // full frame cache |
506 | ehci->i_thresh = 2 + 8; | 506 | ehci->i_thresh = 0; |
507 | else // N microframes cached | 507 | else // N microframes cached |
508 | ehci->i_thresh = 2 + HCC_ISOC_THRES(hcc_params); | 508 | ehci->i_thresh = 2 + HCC_ISOC_THRES(hcc_params); |
509 | 509 | ||
@@ -555,17 +555,6 @@ static int ehci_init(struct usb_hcd *hcd) | |||
555 | temp &= ~(3 << 2); | 555 | temp &= ~(3 << 2); |
556 | temp |= (EHCI_TUNE_FLS << 2); | 556 | temp |= (EHCI_TUNE_FLS << 2); |
557 | } | 557 | } |
558 | if (HCC_LPM(hcc_params)) { | ||
559 | /* support link power management EHCI 1.1 addendum */ | ||
560 | ehci_dbg(ehci, "support lpm\n"); | ||
561 | ehci->has_lpm = 1; | ||
562 | if (hird > 0xf) { | ||
563 | ehci_dbg(ehci, "hird %d invalid, use default 0", | ||
564 | hird); | ||
565 | hird = 0; | ||
566 | } | ||
567 | temp |= hird << 24; | ||
568 | } | ||
569 | ehci->command = temp; | 558 | ehci->command = temp; |
570 | 559 | ||
571 | /* Accept arbitrarily long scatter-gather lists */ | 560 | /* Accept arbitrarily long scatter-gather lists */ |
@@ -660,7 +649,7 @@ static int ehci_run (struct usb_hcd *hcd) | |||
660 | return 0; | 649 | return 0; |
661 | } | 650 | } |
662 | 651 | ||
663 | static int ehci_setup(struct usb_hcd *hcd) | 652 | int ehci_setup(struct usb_hcd *hcd) |
664 | { | 653 | { |
665 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 654 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
666 | int retval; | 655 | int retval; |
@@ -691,6 +680,7 @@ static int ehci_setup(struct usb_hcd *hcd) | |||
691 | 680 | ||
692 | return 0; | 681 | return 0; |
693 | } | 682 | } |
683 | EXPORT_SYMBOL_GPL(ehci_setup); | ||
694 | 684 | ||
695 | /*-------------------------------------------------------------------------*/ | 685 | /*-------------------------------------------------------------------------*/ |
696 | 686 | ||
@@ -1096,7 +1086,7 @@ static int ehci_get_frame (struct usb_hcd *hcd) | |||
1096 | 1086 | ||
1097 | /* These routines handle the generic parts of controller suspend/resume */ | 1087 | /* These routines handle the generic parts of controller suspend/resume */ |
1098 | 1088 | ||
1099 | static int __maybe_unused ehci_suspend(struct usb_hcd *hcd, bool do_wakeup) | 1089 | int ehci_suspend(struct usb_hcd *hcd, bool do_wakeup) |
1100 | { | 1090 | { |
1101 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 1091 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
1102 | 1092 | ||
@@ -1119,9 +1109,10 @@ static int __maybe_unused ehci_suspend(struct usb_hcd *hcd, bool do_wakeup) | |||
1119 | 1109 | ||
1120 | return 0; | 1110 | return 0; |
1121 | } | 1111 | } |
1112 | EXPORT_SYMBOL_GPL(ehci_suspend); | ||
1122 | 1113 | ||
1123 | /* Returns 0 if power was preserved, 1 if power was lost */ | 1114 | /* Returns 0 if power was preserved, 1 if power was lost */ |
1124 | static int __maybe_unused ehci_resume(struct usb_hcd *hcd, bool hibernated) | 1115 | int ehci_resume(struct usb_hcd *hcd, bool hibernated) |
1125 | { | 1116 | { |
1126 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 1117 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
1127 | 1118 | ||
@@ -1177,33 +1168,83 @@ static int __maybe_unused ehci_resume(struct usb_hcd *hcd, bool hibernated) | |||
1177 | ehci->rh_state = EHCI_RH_SUSPENDED; | 1168 | ehci->rh_state = EHCI_RH_SUSPENDED; |
1178 | spin_unlock_irq(&ehci->lock); | 1169 | spin_unlock_irq(&ehci->lock); |
1179 | 1170 | ||
1180 | /* here we "know" root ports should always stay powered */ | ||
1181 | ehci_port_power(ehci, 1); | ||
1182 | |||
1183 | return 1; | 1171 | return 1; |
1184 | } | 1172 | } |
1173 | EXPORT_SYMBOL_GPL(ehci_resume); | ||
1185 | 1174 | ||
1186 | #endif | 1175 | #endif |
1187 | 1176 | ||
1188 | /*-------------------------------------------------------------------------*/ | 1177 | /*-------------------------------------------------------------------------*/ |
1189 | 1178 | ||
1190 | /* | 1179 | /* |
1191 | * The EHCI in ChipIdea HDRC cannot be a separate module or device, | 1180 | * Generic structure: This gets copied for platform drivers so that |
1192 | * because its registers (and irq) are shared between host/gadget/otg | 1181 | * individual entries can be overridden as needed. |
1193 | * functions and in order to facilitate role switching we cannot | ||
1194 | * give the ehci driver exclusive access to those. | ||
1195 | */ | 1182 | */ |
1196 | #ifndef CHIPIDEA_EHCI | 1183 | |
1184 | static const struct hc_driver ehci_hc_driver = { | ||
1185 | .description = hcd_name, | ||
1186 | .product_desc = "EHCI Host Controller", | ||
1187 | .hcd_priv_size = sizeof(struct ehci_hcd), | ||
1188 | |||
1189 | /* | ||
1190 | * generic hardware linkage | ||
1191 | */ | ||
1192 | .irq = ehci_irq, | ||
1193 | .flags = HCD_MEMORY | HCD_USB2, | ||
1194 | |||
1195 | /* | ||
1196 | * basic lifecycle operations | ||
1197 | */ | ||
1198 | .reset = ehci_setup, | ||
1199 | .start = ehci_run, | ||
1200 | .stop = ehci_stop, | ||
1201 | .shutdown = ehci_shutdown, | ||
1202 | |||
1203 | /* | ||
1204 | * managing i/o requests and associated device resources | ||
1205 | */ | ||
1206 | .urb_enqueue = ehci_urb_enqueue, | ||
1207 | .urb_dequeue = ehci_urb_dequeue, | ||
1208 | .endpoint_disable = ehci_endpoint_disable, | ||
1209 | .endpoint_reset = ehci_endpoint_reset, | ||
1210 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
1211 | |||
1212 | /* | ||
1213 | * scheduling support | ||
1214 | */ | ||
1215 | .get_frame_number = ehci_get_frame, | ||
1216 | |||
1217 | /* | ||
1218 | * root hub support | ||
1219 | */ | ||
1220 | .hub_status_data = ehci_hub_status_data, | ||
1221 | .hub_control = ehci_hub_control, | ||
1222 | .bus_suspend = ehci_bus_suspend, | ||
1223 | .bus_resume = ehci_bus_resume, | ||
1224 | .relinquish_port = ehci_relinquish_port, | ||
1225 | .port_handed_over = ehci_port_handed_over, | ||
1226 | }; | ||
1227 | |||
1228 | void ehci_init_driver(struct hc_driver *drv, | ||
1229 | const struct ehci_driver_overrides *over) | ||
1230 | { | ||
1231 | /* Copy the generic table to drv and then apply the overrides */ | ||
1232 | *drv = ehci_hc_driver; | ||
1233 | |||
1234 | if (over) { | ||
1235 | drv->hcd_priv_size += over->extra_priv_size; | ||
1236 | if (over->reset) | ||
1237 | drv->reset = over->reset; | ||
1238 | } | ||
1239 | } | ||
1240 | EXPORT_SYMBOL_GPL(ehci_init_driver); | ||
1241 | |||
1242 | /*-------------------------------------------------------------------------*/ | ||
1197 | 1243 | ||
1198 | MODULE_DESCRIPTION(DRIVER_DESC); | 1244 | MODULE_DESCRIPTION(DRIVER_DESC); |
1199 | MODULE_AUTHOR (DRIVER_AUTHOR); | 1245 | MODULE_AUTHOR (DRIVER_AUTHOR); |
1200 | MODULE_LICENSE ("GPL"); | 1246 | MODULE_LICENSE ("GPL"); |
1201 | 1247 | ||
1202 | #ifdef CONFIG_PCI | ||
1203 | #include "ehci-pci.c" | ||
1204 | #define PCI_DRIVER ehci_pci_driver | ||
1205 | #endif | ||
1206 | |||
1207 | #ifdef CONFIG_USB_EHCI_FSL | 1248 | #ifdef CONFIG_USB_EHCI_FSL |
1208 | #include "ehci-fsl.c" | 1249 | #include "ehci-fsl.c" |
1209 | #define PLATFORM_DRIVER ehci_fsl_driver | 1250 | #define PLATFORM_DRIVER ehci_fsl_driver |
@@ -1219,11 +1260,6 @@ MODULE_LICENSE ("GPL"); | |||
1219 | #define PLATFORM_DRIVER ehci_hcd_sh_driver | 1260 | #define PLATFORM_DRIVER ehci_hcd_sh_driver |
1220 | #endif | 1261 | #endif |
1221 | 1262 | ||
1222 | #ifdef CONFIG_MIPS_ALCHEMY | ||
1223 | #include "ehci-au1xxx.c" | ||
1224 | #define PLATFORM_DRIVER ehci_hcd_au1xxx_driver | ||
1225 | #endif | ||
1226 | |||
1227 | #ifdef CONFIG_USB_EHCI_HCD_OMAP | 1263 | #ifdef CONFIG_USB_EHCI_HCD_OMAP |
1228 | #include "ehci-omap.c" | 1264 | #include "ehci-omap.c" |
1229 | #define PLATFORM_DRIVER ehci_hcd_omap_driver | 1265 | #define PLATFORM_DRIVER ehci_hcd_omap_driver |
@@ -1249,11 +1285,6 @@ MODULE_LICENSE ("GPL"); | |||
1249 | #define PLATFORM_DRIVER ehci_orion_driver | 1285 | #define PLATFORM_DRIVER ehci_orion_driver |
1250 | #endif | 1286 | #endif |
1251 | 1287 | ||
1252 | #ifdef CONFIG_ARCH_IXP4XX | ||
1253 | #include "ehci-ixp4xx.c" | ||
1254 | #define PLATFORM_DRIVER ixp4xx_ehci_driver | ||
1255 | #endif | ||
1256 | |||
1257 | #ifdef CONFIG_USB_W90X900_EHCI | 1288 | #ifdef CONFIG_USB_W90X900_EHCI |
1258 | #include "ehci-w90x900.c" | 1289 | #include "ehci-w90x900.c" |
1259 | #define PLATFORM_DRIVER ehci_hcd_w90x900_driver | 1290 | #define PLATFORM_DRIVER ehci_hcd_w90x900_driver |
@@ -1269,11 +1300,6 @@ MODULE_LICENSE ("GPL"); | |||
1269 | #define PLATFORM_DRIVER ehci_octeon_driver | 1300 | #define PLATFORM_DRIVER ehci_octeon_driver |
1270 | #endif | 1301 | #endif |
1271 | 1302 | ||
1272 | #ifdef CONFIG_USB_CNS3XXX_EHCI | ||
1273 | #include "ehci-cns3xxx.c" | ||
1274 | #define PLATFORM_DRIVER cns3xxx_ehci_driver | ||
1275 | #endif | ||
1276 | |||
1277 | #ifdef CONFIG_ARCH_VT8500 | 1303 | #ifdef CONFIG_ARCH_VT8500 |
1278 | #include "ehci-vt8500.c" | 1304 | #include "ehci-vt8500.c" |
1279 | #define PLATFORM_DRIVER vt8500_ehci_driver | 1305 | #define PLATFORM_DRIVER vt8500_ehci_driver |
@@ -1314,34 +1340,23 @@ MODULE_LICENSE ("GPL"); | |||
1314 | #define PLATFORM_DRIVER ehci_grlib_driver | 1340 | #define PLATFORM_DRIVER ehci_grlib_driver |
1315 | #endif | 1341 | #endif |
1316 | 1342 | ||
1317 | #ifdef CONFIG_CPU_XLR | ||
1318 | #include "ehci-xls.c" | ||
1319 | #define PLATFORM_DRIVER ehci_xls_driver | ||
1320 | #endif | ||
1321 | |||
1322 | #ifdef CONFIG_USB_EHCI_MV | 1343 | #ifdef CONFIG_USB_EHCI_MV |
1323 | #include "ehci-mv.c" | 1344 | #include "ehci-mv.c" |
1324 | #define PLATFORM_DRIVER ehci_mv_driver | 1345 | #define PLATFORM_DRIVER ehci_mv_driver |
1325 | #endif | 1346 | #endif |
1326 | 1347 | ||
1327 | #ifdef CONFIG_MACH_LOONGSON1 | ||
1328 | #include "ehci-ls1x.c" | ||
1329 | #define PLATFORM_DRIVER ehci_ls1x_driver | ||
1330 | #endif | ||
1331 | |||
1332 | #ifdef CONFIG_MIPS_SEAD3 | 1348 | #ifdef CONFIG_MIPS_SEAD3 |
1333 | #include "ehci-sead3.c" | 1349 | #include "ehci-sead3.c" |
1334 | #define PLATFORM_DRIVER ehci_hcd_sead3_driver | 1350 | #define PLATFORM_DRIVER ehci_hcd_sead3_driver |
1335 | #endif | 1351 | #endif |
1336 | 1352 | ||
1337 | #ifdef CONFIG_USB_EHCI_HCD_PLATFORM | 1353 | #if !IS_ENABLED(CONFIG_USB_EHCI_PCI) && \ |
1338 | #include "ehci-platform.c" | 1354 | !IS_ENABLED(CONFIG_USB_EHCI_HCD_PLATFORM) && \ |
1339 | #define PLATFORM_DRIVER ehci_platform_driver | 1355 | !defined(CONFIG_USB_CHIPIDEA_HOST) && \ |
1340 | #endif | 1356 | !defined(PLATFORM_DRIVER) && \ |
1341 | 1357 | !defined(PS3_SYSTEM_BUS_DRIVER) && \ | |
1342 | #if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \ | 1358 | !defined(OF_PLATFORM_DRIVER) && \ |
1343 | !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER) && \ | 1359 | !defined(XILINX_OF_PLATFORM_DRIVER) |
1344 | !defined(XILINX_OF_PLATFORM_DRIVER) | ||
1345 | #error "missing bus glue for ehci-hcd" | 1360 | #error "missing bus glue for ehci-hcd" |
1346 | #endif | 1361 | #endif |
1347 | 1362 | ||
@@ -1378,12 +1393,6 @@ static int __init ehci_hcd_init(void) | |||
1378 | goto clean0; | 1393 | goto clean0; |
1379 | #endif | 1394 | #endif |
1380 | 1395 | ||
1381 | #ifdef PCI_DRIVER | ||
1382 | retval = pci_register_driver(&PCI_DRIVER); | ||
1383 | if (retval < 0) | ||
1384 | goto clean1; | ||
1385 | #endif | ||
1386 | |||
1387 | #ifdef PS3_SYSTEM_BUS_DRIVER | 1396 | #ifdef PS3_SYSTEM_BUS_DRIVER |
1388 | retval = ps3_ehci_driver_register(&PS3_SYSTEM_BUS_DRIVER); | 1397 | retval = ps3_ehci_driver_register(&PS3_SYSTEM_BUS_DRIVER); |
1389 | if (retval < 0) | 1398 | if (retval < 0) |
@@ -1415,10 +1424,6 @@ clean3: | |||
1415 | ps3_ehci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); | 1424 | ps3_ehci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); |
1416 | clean2: | 1425 | clean2: |
1417 | #endif | 1426 | #endif |
1418 | #ifdef PCI_DRIVER | ||
1419 | pci_unregister_driver(&PCI_DRIVER); | ||
1420 | clean1: | ||
1421 | #endif | ||
1422 | #ifdef PLATFORM_DRIVER | 1427 | #ifdef PLATFORM_DRIVER |
1423 | platform_driver_unregister(&PLATFORM_DRIVER); | 1428 | platform_driver_unregister(&PLATFORM_DRIVER); |
1424 | clean0: | 1429 | clean0: |
@@ -1444,9 +1449,6 @@ static void __exit ehci_hcd_cleanup(void) | |||
1444 | #ifdef PLATFORM_DRIVER | 1449 | #ifdef PLATFORM_DRIVER |
1445 | platform_driver_unregister(&PLATFORM_DRIVER); | 1450 | platform_driver_unregister(&PLATFORM_DRIVER); |
1446 | #endif | 1451 | #endif |
1447 | #ifdef PCI_DRIVER | ||
1448 | pci_unregister_driver(&PCI_DRIVER); | ||
1449 | #endif | ||
1450 | #ifdef PS3_SYSTEM_BUS_DRIVER | 1452 | #ifdef PS3_SYSTEM_BUS_DRIVER |
1451 | ps3_ehci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); | 1453 | ps3_ehci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); |
1452 | #endif | 1454 | #endif |
@@ -1456,5 +1458,3 @@ static void __exit ehci_hcd_cleanup(void) | |||
1456 | clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded); | 1458 | clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded); |
1457 | } | 1459 | } |
1458 | module_exit(ehci_hcd_cleanup); | 1460 | module_exit(ehci_hcd_cleanup); |
1459 | |||
1460 | #endif /* CHIPIDEA_EHCI */ | ||
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 914ce9370e70..4ccb97c0678f 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
@@ -56,6 +56,19 @@ static void ehci_handover_companion_ports(struct ehci_hcd *ehci) | |||
56 | if (!ehci->owned_ports) | 56 | if (!ehci->owned_ports) |
57 | return; | 57 | return; |
58 | 58 | ||
59 | /* Make sure the ports are powered */ | ||
60 | port = HCS_N_PORTS(ehci->hcs_params); | ||
61 | while (port--) { | ||
62 | if (test_bit(port, &ehci->owned_ports)) { | ||
63 | reg = &ehci->regs->port_status[port]; | ||
64 | status = ehci_readl(ehci, reg) & ~PORT_RWC_BITS; | ||
65 | if (!(status & PORT_POWER)) { | ||
66 | status |= PORT_POWER; | ||
67 | ehci_writel(ehci, status, reg); | ||
68 | } | ||
69 | } | ||
70 | } | ||
71 | |||
59 | /* Give the connections some time to appear */ | 72 | /* Give the connections some time to appear */ |
60 | msleep(20); | 73 | msleep(20); |
61 | 74 | ||
@@ -384,11 +397,24 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
384 | ehci_writel(ehci, ehci->command, &ehci->regs->command); | 397 | ehci_writel(ehci, ehci->command, &ehci->regs->command); |
385 | ehci->rh_state = EHCI_RH_RUNNING; | 398 | ehci->rh_state = EHCI_RH_RUNNING; |
386 | 399 | ||
387 | /* Some controller/firmware combinations need a delay during which | 400 | /* |
388 | * they set up the port statuses. See Bugzilla #8190. */ | 401 | * According to Bugzilla #8190, the port status for some controllers |
389 | spin_unlock_irq(&ehci->lock); | 402 | * will be wrong without a delay. At their wrong status, the port |
390 | msleep(8); | 403 | * is enabled, but not suspended neither resumed. |
391 | spin_lock_irq(&ehci->lock); | 404 | */ |
405 | i = HCS_N_PORTS(ehci->hcs_params); | ||
406 | while (i--) { | ||
407 | temp = ehci_readl(ehci, &ehci->regs->port_status[i]); | ||
408 | if ((temp & PORT_PE) && | ||
409 | !(temp & (PORT_SUSPEND | PORT_RESUME))) { | ||
410 | ehci_dbg(ehci, "Port status(0x%x) is wrong\n", temp); | ||
411 | spin_unlock_irq(&ehci->lock); | ||
412 | msleep(8); | ||
413 | spin_lock_irq(&ehci->lock); | ||
414 | break; | ||
415 | } | ||
416 | } | ||
417 | |||
392 | if (ehci->shutdown) | 418 | if (ehci->shutdown) |
393 | goto shutdown; | 419 | goto shutdown; |
394 | 420 | ||
@@ -764,11 +790,6 @@ static int ehci_hub_control ( | |||
764 | status_reg); | 790 | status_reg); |
765 | break; | 791 | break; |
766 | case USB_PORT_FEAT_C_CONNECTION: | 792 | case USB_PORT_FEAT_C_CONNECTION: |
767 | if (ehci->has_lpm) { | ||
768 | /* clear PORTSC bits on disconnect */ | ||
769 | temp &= ~PORT_LPM; | ||
770 | temp &= ~PORT_DEV_ADDR; | ||
771 | } | ||
772 | ehci_writel(ehci, temp | PORT_CSC, status_reg); | 793 | ehci_writel(ehci, temp | PORT_CSC, status_reg); |
773 | break; | 794 | break; |
774 | case USB_PORT_FEAT_C_OVER_CURRENT: | 795 | case USB_PORT_FEAT_C_OVER_CURRENT: |
@@ -1088,8 +1109,7 @@ error_exit: | |||
1088 | return retval; | 1109 | return retval; |
1089 | } | 1110 | } |
1090 | 1111 | ||
1091 | static void __maybe_unused ehci_relinquish_port(struct usb_hcd *hcd, | 1112 | static void ehci_relinquish_port(struct usb_hcd *hcd, int portnum) |
1092 | int portnum) | ||
1093 | { | 1113 | { |
1094 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 1114 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
1095 | 1115 | ||
@@ -1098,8 +1118,7 @@ static void __maybe_unused ehci_relinquish_port(struct usb_hcd *hcd, | |||
1098 | set_owner(ehci, --portnum, PORT_OWNER); | 1118 | set_owner(ehci, --portnum, PORT_OWNER); |
1099 | } | 1119 | } |
1100 | 1120 | ||
1101 | static int __maybe_unused ehci_port_handed_over(struct usb_hcd *hcd, | 1121 | static int ehci_port_handed_over(struct usb_hcd *hcd, int portnum) |
1102 | int portnum) | ||
1103 | { | 1122 | { |
1104 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 1123 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
1105 | u32 __iomem *reg; | 1124 | u32 __iomem *reg; |
diff --git a/drivers/usb/host/ehci-ixp4xx.c b/drivers/usb/host/ehci-ixp4xx.c deleted file mode 100644 index f224c0a48bed..000000000000 --- a/drivers/usb/host/ehci-ixp4xx.c +++ /dev/null | |||
@@ -1,139 +0,0 @@ | |||
1 | /* | ||
2 | * IXP4XX EHCI Host Controller Driver | ||
3 | * | ||
4 | * Author: Vladimir Barinov <vbarinov@embeddedalley.com> | ||
5 | * | ||
6 | * Based on "ehci-fsl.c" by Randy Vinson <rvinson@mvista.com> | ||
7 | * | ||
8 | * 2007 (c) MontaVista Software, Inc. This file is licensed under | ||
9 | * the terms of the GNU General Public License version 2. This program | ||
10 | * is licensed "as is" without any warranty of any kind, whether express | ||
11 | * or implied. | ||
12 | */ | ||
13 | |||
14 | #include <linux/platform_device.h> | ||
15 | |||
16 | static int ixp4xx_ehci_init(struct usb_hcd *hcd) | ||
17 | { | ||
18 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
19 | int retval = 0; | ||
20 | |||
21 | ehci->big_endian_desc = 1; | ||
22 | ehci->big_endian_mmio = 1; | ||
23 | |||
24 | ehci->caps = hcd->regs + 0x100; | ||
25 | |||
26 | hcd->has_tt = 1; | ||
27 | |||
28 | retval = ehci_setup(hcd); | ||
29 | if (retval) | ||
30 | return retval; | ||
31 | |||
32 | ehci_port_power(ehci, 0); | ||
33 | |||
34 | return retval; | ||
35 | } | ||
36 | |||
37 | static const struct hc_driver ixp4xx_ehci_hc_driver = { | ||
38 | .description = hcd_name, | ||
39 | .product_desc = "IXP4XX EHCI Host Controller", | ||
40 | .hcd_priv_size = sizeof(struct ehci_hcd), | ||
41 | .irq = ehci_irq, | ||
42 | .flags = HCD_MEMORY | HCD_USB2, | ||
43 | .reset = ixp4xx_ehci_init, | ||
44 | .start = ehci_run, | ||
45 | .stop = ehci_stop, | ||
46 | .shutdown = ehci_shutdown, | ||
47 | .urb_enqueue = ehci_urb_enqueue, | ||
48 | .urb_dequeue = ehci_urb_dequeue, | ||
49 | .endpoint_disable = ehci_endpoint_disable, | ||
50 | .endpoint_reset = ehci_endpoint_reset, | ||
51 | .get_frame_number = ehci_get_frame, | ||
52 | .hub_status_data = ehci_hub_status_data, | ||
53 | .hub_control = ehci_hub_control, | ||
54 | #if defined(CONFIG_PM) | ||
55 | .bus_suspend = ehci_bus_suspend, | ||
56 | .bus_resume = ehci_bus_resume, | ||
57 | #endif | ||
58 | .relinquish_port = ehci_relinquish_port, | ||
59 | .port_handed_over = ehci_port_handed_over, | ||
60 | |||
61 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
62 | }; | ||
63 | |||
64 | static int ixp4xx_ehci_probe(struct platform_device *pdev) | ||
65 | { | ||
66 | struct usb_hcd *hcd; | ||
67 | const struct hc_driver *driver = &ixp4xx_ehci_hc_driver; | ||
68 | struct resource *res; | ||
69 | int irq; | ||
70 | int retval; | ||
71 | |||
72 | if (usb_disabled()) | ||
73 | return -ENODEV; | ||
74 | |||
75 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
76 | if (!res) { | ||
77 | dev_err(&pdev->dev, | ||
78 | "Found HC with no IRQ. Check %s setup!\n", | ||
79 | dev_name(&pdev->dev)); | ||
80 | return -ENODEV; | ||
81 | } | ||
82 | irq = res->start; | ||
83 | |||
84 | hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); | ||
85 | if (!hcd) { | ||
86 | retval = -ENOMEM; | ||
87 | goto fail_create_hcd; | ||
88 | } | ||
89 | |||
90 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
91 | if (!res) { | ||
92 | dev_err(&pdev->dev, | ||
93 | "Found HC with no register addr. Check %s setup!\n", | ||
94 | dev_name(&pdev->dev)); | ||
95 | retval = -ENODEV; | ||
96 | goto fail_request_resource; | ||
97 | } | ||
98 | hcd->rsrc_start = res->start; | ||
99 | hcd->rsrc_len = resource_size(res); | ||
100 | |||
101 | hcd->regs = devm_request_and_ioremap(&pdev->dev, res); | ||
102 | if (hcd->regs == NULL) { | ||
103 | dev_dbg(&pdev->dev, "error mapping memory\n"); | ||
104 | retval = -EFAULT; | ||
105 | goto fail_request_resource; | ||
106 | } | ||
107 | |||
108 | retval = usb_add_hcd(hcd, irq, IRQF_SHARED); | ||
109 | if (retval) | ||
110 | goto fail_request_resource; | ||
111 | |||
112 | return retval; | ||
113 | |||
114 | fail_request_resource: | ||
115 | usb_put_hcd(hcd); | ||
116 | fail_create_hcd: | ||
117 | dev_err(&pdev->dev, "init %s fail, %d\n", dev_name(&pdev->dev), retval); | ||
118 | return retval; | ||
119 | } | ||
120 | |||
121 | static int ixp4xx_ehci_remove(struct platform_device *pdev) | ||
122 | { | ||
123 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
124 | |||
125 | usb_remove_hcd(hcd); | ||
126 | usb_put_hcd(hcd); | ||
127 | |||
128 | return 0; | ||
129 | } | ||
130 | |||
131 | MODULE_ALIAS("platform:ixp4xx-ehci"); | ||
132 | |||
133 | static struct platform_driver ixp4xx_ehci_driver = { | ||
134 | .probe = ixp4xx_ehci_probe, | ||
135 | .remove = ixp4xx_ehci_remove, | ||
136 | .driver = { | ||
137 | .name = "ixp4xx-ehci", | ||
138 | }, | ||
139 | }; | ||
diff --git a/drivers/usb/host/ehci-lpm.c b/drivers/usb/host/ehci-lpm.c deleted file mode 100644 index 2111627a19de..000000000000 --- a/drivers/usb/host/ehci-lpm.c +++ /dev/null | |||
@@ -1,84 +0,0 @@ | |||
1 | /* ehci-lpm.c EHCI HCD LPM support code | ||
2 | * Copyright (c) 2008 - 2010, Intel Corporation. | ||
3 | * Author: Jacob Pan <jacob.jun.pan@intel.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
17 | */ | ||
18 | |||
19 | /* this file is part of ehci-hcd.c */ | ||
20 | static int __maybe_unused ehci_lpm_set_da(struct ehci_hcd *ehci, | ||
21 | int dev_addr, int port_num) | ||
22 | { | ||
23 | u32 __iomem portsc; | ||
24 | |||
25 | ehci_dbg(ehci, "set dev address %d for port %d\n", dev_addr, port_num); | ||
26 | if (port_num > HCS_N_PORTS(ehci->hcs_params)) { | ||
27 | ehci_dbg(ehci, "invalid port number %d\n", port_num); | ||
28 | return -ENODEV; | ||
29 | } | ||
30 | portsc = ehci_readl(ehci, &ehci->regs->port_status[port_num-1]); | ||
31 | portsc &= ~PORT_DEV_ADDR; | ||
32 | portsc |= dev_addr<<25; | ||
33 | ehci_writel(ehci, portsc, &ehci->regs->port_status[port_num-1]); | ||
34 | return 0; | ||
35 | } | ||
36 | |||
37 | /* | ||
38 | * this function is used to check if the device support LPM | ||
39 | * if yes, mark the PORTSC register with PORT_LPM bit | ||
40 | */ | ||
41 | static int __maybe_unused ehci_lpm_check(struct ehci_hcd *ehci, int port) | ||
42 | { | ||
43 | u32 __iomem *portsc ; | ||
44 | u32 val32; | ||
45 | int retval; | ||
46 | |||
47 | portsc = &ehci->regs->port_status[port-1]; | ||
48 | val32 = ehci_readl(ehci, portsc); | ||
49 | if (!(val32 & PORT_DEV_ADDR)) { | ||
50 | ehci_dbg(ehci, "LPM: no device attached\n"); | ||
51 | return -ENODEV; | ||
52 | } | ||
53 | val32 |= PORT_LPM; | ||
54 | ehci_writel(ehci, val32, portsc); | ||
55 | msleep(5); | ||
56 | val32 |= PORT_SUSPEND; | ||
57 | ehci_dbg(ehci, "Sending LPM 0x%08x to port %d\n", val32, port); | ||
58 | ehci_writel(ehci, val32, portsc); | ||
59 | /* wait for ACK */ | ||
60 | msleep(10); | ||
61 | retval = handshake(ehci, &ehci->regs->port_status[port-1], PORT_SSTS, | ||
62 | PORTSC_SUSPEND_STS_ACK, 125); | ||
63 | dbg_port(ehci, "LPM", port, val32); | ||
64 | if (retval != -ETIMEDOUT) { | ||
65 | ehci_dbg(ehci, "LPM: device ACK for LPM\n"); | ||
66 | val32 |= PORT_LPM; | ||
67 | /* | ||
68 | * now device should be in L1 sleep, let's wake up the device | ||
69 | * so that we can complete enumeration. | ||
70 | */ | ||
71 | ehci_writel(ehci, val32, portsc); | ||
72 | msleep(10); | ||
73 | val32 |= PORT_RESUME; | ||
74 | ehci_writel(ehci, val32, portsc); | ||
75 | } else { | ||
76 | ehci_dbg(ehci, "LPM: device does not ACK, disable LPM %d\n", | ||
77 | retval); | ||
78 | val32 &= ~PORT_LPM; | ||
79 | retval = -ETIMEDOUT; | ||
80 | ehci_writel(ehci, val32, portsc); | ||
81 | } | ||
82 | |||
83 | return retval; | ||
84 | } | ||
diff --git a/drivers/usb/host/ehci-ls1x.c b/drivers/usb/host/ehci-ls1x.c deleted file mode 100644 index aa0f328922df..000000000000 --- a/drivers/usb/host/ehci-ls1x.c +++ /dev/null | |||
@@ -1,147 +0,0 @@ | |||
1 | /* | ||
2 | * Bus Glue for Loongson LS1X built-in EHCI controller. | ||
3 | * | ||
4 | * Copyright (c) 2012 Zhang, Keguang <keguang.zhang@gmail.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License version 2 as published | ||
8 | * by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | |||
12 | #include <linux/platform_device.h> | ||
13 | |||
14 | static int ehci_ls1x_reset(struct usb_hcd *hcd) | ||
15 | { | ||
16 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
17 | int ret; | ||
18 | |||
19 | ehci->caps = hcd->regs; | ||
20 | |||
21 | ret = ehci_setup(hcd); | ||
22 | if (ret) | ||
23 | return ret; | ||
24 | |||
25 | ehci_port_power(ehci, 0); | ||
26 | |||
27 | return 0; | ||
28 | } | ||
29 | |||
30 | static const struct hc_driver ehci_ls1x_hc_driver = { | ||
31 | .description = hcd_name, | ||
32 | .product_desc = "LOONGSON1 EHCI", | ||
33 | .hcd_priv_size = sizeof(struct ehci_hcd), | ||
34 | |||
35 | /* | ||
36 | * generic hardware linkage | ||
37 | */ | ||
38 | .irq = ehci_irq, | ||
39 | .flags = HCD_MEMORY | HCD_USB2, | ||
40 | |||
41 | /* | ||
42 | * basic lifecycle operations | ||
43 | */ | ||
44 | .reset = ehci_ls1x_reset, | ||
45 | .start = ehci_run, | ||
46 | .stop = ehci_stop, | ||
47 | .shutdown = ehci_shutdown, | ||
48 | |||
49 | /* | ||
50 | * managing i/o requests and associated device resources | ||
51 | */ | ||
52 | .urb_enqueue = ehci_urb_enqueue, | ||
53 | .urb_dequeue = ehci_urb_dequeue, | ||
54 | .endpoint_disable = ehci_endpoint_disable, | ||
55 | .endpoint_reset = ehci_endpoint_reset, | ||
56 | |||
57 | /* | ||
58 | * scheduling support | ||
59 | */ | ||
60 | .get_frame_number = ehci_get_frame, | ||
61 | |||
62 | /* | ||
63 | * root hub support | ||
64 | */ | ||
65 | .hub_status_data = ehci_hub_status_data, | ||
66 | .hub_control = ehci_hub_control, | ||
67 | .relinquish_port = ehci_relinquish_port, | ||
68 | .port_handed_over = ehci_port_handed_over, | ||
69 | |||
70 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
71 | }; | ||
72 | |||
73 | static int ehci_hcd_ls1x_probe(struct platform_device *pdev) | ||
74 | { | ||
75 | struct usb_hcd *hcd; | ||
76 | struct resource *res; | ||
77 | int irq; | ||
78 | int ret; | ||
79 | |||
80 | pr_debug("initializing loongson1 ehci USB Controller\n"); | ||
81 | |||
82 | if (usb_disabled()) | ||
83 | return -ENODEV; | ||
84 | |||
85 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
86 | if (!res) { | ||
87 | dev_err(&pdev->dev, | ||
88 | "Found HC with no IRQ. Check %s setup!\n", | ||
89 | dev_name(&pdev->dev)); | ||
90 | return -ENODEV; | ||
91 | } | ||
92 | irq = res->start; | ||
93 | |||
94 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
95 | if (!res) { | ||
96 | dev_err(&pdev->dev, | ||
97 | "Found HC with no register addr. Check %s setup!\n", | ||
98 | dev_name(&pdev->dev)); | ||
99 | return -ENODEV; | ||
100 | } | ||
101 | |||
102 | hcd = usb_create_hcd(&ehci_ls1x_hc_driver, &pdev->dev, | ||
103 | dev_name(&pdev->dev)); | ||
104 | if (!hcd) | ||
105 | return -ENOMEM; | ||
106 | hcd->rsrc_start = res->start; | ||
107 | hcd->rsrc_len = resource_size(res); | ||
108 | |||
109 | hcd->regs = devm_request_and_ioremap(&pdev->dev, res); | ||
110 | if (hcd->regs == NULL) { | ||
111 | dev_dbg(&pdev->dev, "error mapping memory\n"); | ||
112 | ret = -EFAULT; | ||
113 | goto err_put_hcd; | ||
114 | } | ||
115 | |||
116 | ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); | ||
117 | if (ret) | ||
118 | goto err_put_hcd; | ||
119 | |||
120 | return ret; | ||
121 | |||
122 | err_put_hcd: | ||
123 | usb_put_hcd(hcd); | ||
124 | return ret; | ||
125 | } | ||
126 | |||
127 | static int ehci_hcd_ls1x_remove(struct platform_device *pdev) | ||
128 | { | ||
129 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
130 | |||
131 | usb_remove_hcd(hcd); | ||
132 | usb_put_hcd(hcd); | ||
133 | |||
134 | return 0; | ||
135 | } | ||
136 | |||
137 | static struct platform_driver ehci_ls1x_driver = { | ||
138 | .probe = ehci_hcd_ls1x_probe, | ||
139 | .remove = ehci_hcd_ls1x_remove, | ||
140 | .shutdown = usb_hcd_platform_shutdown, | ||
141 | .driver = { | ||
142 | .name = "ls1x-ehci", | ||
143 | .owner = THIS_MODULE, | ||
144 | }, | ||
145 | }; | ||
146 | |||
147 | MODULE_ALIAS(PLATFORM_MODULE_PREFIX "ls1x-ehci"); | ||
diff --git a/drivers/usb/host/ehci-msm.c b/drivers/usb/host/ehci-msm.c index 4af4dc5b618c..88a49c87e748 100644 --- a/drivers/usb/host/ehci-msm.c +++ b/drivers/usb/host/ehci-msm.c | |||
@@ -53,7 +53,6 @@ static int ehci_msm_reset(struct usb_hcd *hcd) | |||
53 | /* Disable streaming mode and select host mode */ | 53 | /* Disable streaming mode and select host mode */ |
54 | writel(0x13, USB_USBMODE); | 54 | writel(0x13, USB_USBMODE); |
55 | 55 | ||
56 | ehci_port_power(ehci, 1); | ||
57 | return 0; | 56 | return 0; |
58 | } | 57 | } |
59 | 58 | ||
@@ -174,7 +173,7 @@ put_hcd: | |||
174 | return ret; | 173 | return ret; |
175 | } | 174 | } |
176 | 175 | ||
177 | static int __devexit ehci_msm_remove(struct platform_device *pdev) | 176 | static int ehci_msm_remove(struct platform_device *pdev) |
178 | { | 177 | { |
179 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | 178 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
180 | 179 | ||
@@ -221,7 +220,7 @@ static const struct dev_pm_ops ehci_msm_dev_pm_ops = { | |||
221 | 220 | ||
222 | static struct platform_driver ehci_msm_driver = { | 221 | static struct platform_driver ehci_msm_driver = { |
223 | .probe = ehci_msm_probe, | 222 | .probe = ehci_msm_probe, |
224 | .remove = __devexit_p(ehci_msm_remove), | 223 | .remove = ehci_msm_remove, |
225 | .driver = { | 224 | .driver = { |
226 | .name = "msm_hsusb_host", | 225 | .name = "msm_hsusb_host", |
227 | .pm = &ehci_msm_dev_pm_ops, | 226 | .pm = &ehci_msm_dev_pm_ops, |
diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c index 4a08fc0b27c9..8804f74689d7 100644 --- a/drivers/usb/host/ehci-mxc.c +++ b/drivers/usb/host/ehci-mxc.c | |||
@@ -39,17 +39,9 @@ struct ehci_mxc_priv { | |||
39 | /* called during probe() after chip reset completes */ | 39 | /* called during probe() after chip reset completes */ |
40 | static int ehci_mxc_setup(struct usb_hcd *hcd) | 40 | static int ehci_mxc_setup(struct usb_hcd *hcd) |
41 | { | 41 | { |
42 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
43 | int retval; | ||
44 | |||
45 | hcd->has_tt = 1; | 42 | hcd->has_tt = 1; |
46 | 43 | ||
47 | retval = ehci_setup(hcd); | 44 | return ehci_setup(hcd); |
48 | if (retval) | ||
49 | return retval; | ||
50 | |||
51 | ehci_port_power(ehci, 0); | ||
52 | return 0; | ||
53 | } | 45 | } |
54 | 46 | ||
55 | static const struct hc_driver ehci_mxc_hc_driver = { | 47 | static const struct hc_driver ehci_mxc_hc_driver = { |
diff --git a/drivers/usb/host/ehci-octeon.c b/drivers/usb/host/ehci-octeon.c index ba26957abf46..a89750fff4ff 100644 --- a/drivers/usb/host/ehci-octeon.c +++ b/drivers/usb/host/ehci-octeon.c | |||
@@ -159,9 +159,6 @@ static int ehci_octeon_drv_probe(struct platform_device *pdev) | |||
159 | 159 | ||
160 | platform_set_drvdata(pdev, hcd); | 160 | platform_set_drvdata(pdev, hcd); |
161 | 161 | ||
162 | /* root ports should always stay powered */ | ||
163 | ehci_port_power(ehci, 1); | ||
164 | |||
165 | return 0; | 162 | return 0; |
166 | err3: | 163 | err3: |
167 | ehci_octeon_stop(); | 164 | ehci_octeon_stop(); |
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c index d7fe287d0678..44e7d0f638e8 100644 --- a/drivers/usb/host/ehci-omap.c +++ b/drivers/usb/host/ehci-omap.c | |||
@@ -146,9 +146,6 @@ static int omap_ehci_init(struct usb_hcd *hcd) | |||
146 | gpio_set_value_cansleep(pdata->reset_gpio_port[1], 1); | 146 | gpio_set_value_cansleep(pdata->reset_gpio_port[1], 1); |
147 | } | 147 | } |
148 | 148 | ||
149 | /* root ports should always stay powered */ | ||
150 | ehci_port_power(ehci, 1); | ||
151 | |||
152 | return rc; | 149 | return rc; |
153 | } | 150 | } |
154 | 151 | ||
diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c index 9c2717d66730..f74794c93152 100644 --- a/drivers/usb/host/ehci-orion.c +++ b/drivers/usb/host/ehci-orion.c | |||
@@ -101,20 +101,6 @@ static void orion_usb_phy_v1_setup(struct usb_hcd *hcd) | |||
101 | wrl(USB_MODE, 0x13); | 101 | wrl(USB_MODE, 0x13); |
102 | } | 102 | } |
103 | 103 | ||
104 | static int ehci_orion_setup(struct usb_hcd *hcd) | ||
105 | { | ||
106 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
107 | int retval; | ||
108 | |||
109 | retval = ehci_setup(hcd); | ||
110 | if (retval) | ||
111 | return retval; | ||
112 | |||
113 | ehci_port_power(ehci, 0); | ||
114 | |||
115 | return retval; | ||
116 | } | ||
117 | |||
118 | static const struct hc_driver ehci_orion_hc_driver = { | 104 | static const struct hc_driver ehci_orion_hc_driver = { |
119 | .description = hcd_name, | 105 | .description = hcd_name, |
120 | .product_desc = "Marvell Orion EHCI", | 106 | .product_desc = "Marvell Orion EHCI", |
@@ -129,7 +115,7 @@ static const struct hc_driver ehci_orion_hc_driver = { | |||
129 | /* | 115 | /* |
130 | * basic lifecycle operations | 116 | * basic lifecycle operations |
131 | */ | 117 | */ |
132 | .reset = ehci_orion_setup, | 118 | .reset = ehci_setup, |
133 | .start = ehci_run, | 119 | .start = ehci_run, |
134 | .stop = ehci_stop, | 120 | .stop = ehci_stop, |
135 | .shutdown = ehci_shutdown, | 121 | .shutdown = ehci_shutdown, |
@@ -160,7 +146,7 @@ static const struct hc_driver ehci_orion_hc_driver = { | |||
160 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | 146 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, |
161 | }; | 147 | }; |
162 | 148 | ||
163 | static void __devinit | 149 | static void |
164 | ehci_orion_conf_mbus_windows(struct usb_hcd *hcd, | 150 | ehci_orion_conf_mbus_windows(struct usb_hcd *hcd, |
165 | const struct mbus_dram_target_info *dram) | 151 | const struct mbus_dram_target_info *dram) |
166 | { | 152 | { |
@@ -181,7 +167,7 @@ ehci_orion_conf_mbus_windows(struct usb_hcd *hcd, | |||
181 | } | 167 | } |
182 | } | 168 | } |
183 | 169 | ||
184 | static int __devinit ehci_orion_drv_probe(struct platform_device *pdev) | 170 | static int ehci_orion_drv_probe(struct platform_device *pdev) |
185 | { | 171 | { |
186 | struct orion_ehci_data *pd = pdev->dev.platform_data; | 172 | struct orion_ehci_data *pd = pdev->dev.platform_data; |
187 | const struct mbus_dram_target_info *dram; | 173 | const struct mbus_dram_target_info *dram; |
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index 2cb7d370c4ef..dabb20494826 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
@@ -18,9 +18,18 @@ | |||
18 | * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 18 | * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
19 | */ | 19 | */ |
20 | 20 | ||
21 | #ifndef CONFIG_PCI | 21 | #include <linux/kernel.h> |
22 | #error "This file is PCI bus glue. CONFIG_PCI must be defined." | 22 | #include <linux/module.h> |
23 | #endif | 23 | #include <linux/pci.h> |
24 | #include <linux/usb.h> | ||
25 | #include <linux/usb/hcd.h> | ||
26 | |||
27 | #include "ehci.h" | ||
28 | #include "pci-quirks.h" | ||
29 | |||
30 | #define DRIVER_DESC "EHCI PCI platform driver" | ||
31 | |||
32 | static const char hcd_name[] = "ehci-pci"; | ||
24 | 33 | ||
25 | /* defined here to avoid adding to pci_ids.h for single instance use */ | 34 | /* defined here to avoid adding to pci_ids.h for single instance use */ |
26 | #define PCI_DEVICE_ID_INTEL_CE4100_USB 0x2e70 | 35 | #define PCI_DEVICE_ID_INTEL_CE4100_USB 0x2e70 |
@@ -103,7 +112,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
103 | } | 112 | } |
104 | break; | 113 | break; |
105 | case PCI_VENDOR_ID_INTEL: | 114 | case PCI_VENDOR_ID_INTEL: |
106 | ehci->fs_i_thresh = 1; | ||
107 | if (pdev->device == PCI_DEVICE_ID_INTEL_CE4100_USB) | 115 | if (pdev->device == PCI_DEVICE_ID_INTEL_CE4100_USB) |
108 | hcd->has_tt = 1; | 116 | hcd->has_tt = 1; |
109 | break; | 117 | break; |
@@ -203,11 +211,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
203 | break; | 211 | break; |
204 | case PCI_VENDOR_ID_INTEL: | 212 | case PCI_VENDOR_ID_INTEL: |
205 | ehci->need_io_watchdog = 0; | 213 | ehci->need_io_watchdog = 0; |
206 | if (pdev->device == 0x0806 || pdev->device == 0x0811 | ||
207 | || pdev->device == 0x0829) { | ||
208 | ehci_info(ehci, "disable lpm for langwell/penwell\n"); | ||
209 | ehci->has_lpm = 0; | ||
210 | } | ||
211 | break; | 214 | break; |
212 | case PCI_VENDOR_ID_NVIDIA: | 215 | case PCI_VENDOR_ID_NVIDIA: |
213 | switch (pdev->device) { | 216 | switch (pdev->device) { |
@@ -217,8 +220,7 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
217 | * devices with PPCD enabled. | 220 | * devices with PPCD enabled. |
218 | */ | 221 | */ |
219 | case 0x0d9d: | 222 | case 0x0d9d: |
220 | ehci_info(ehci, "disable lpm/ppcd for nvidia mcp89"); | 223 | ehci_info(ehci, "disable ppcd for nvidia mcp89\n"); |
221 | ehci->has_lpm = 0; | ||
222 | ehci->has_ppcd = 0; | 224 | ehci->has_ppcd = 0; |
223 | ehci->command &= ~CMD_PPCEE; | 225 | ehci->command &= ~CMD_PPCEE; |
224 | break; | 226 | break; |
@@ -304,7 +306,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
304 | ehci_warn(ehci, "selective suspend/wakeup unavailable\n"); | 306 | ehci_warn(ehci, "selective suspend/wakeup unavailable\n"); |
305 | #endif | 307 | #endif |
306 | 308 | ||
307 | ehci_port_power(ehci, 1); | ||
308 | retval = ehci_pci_reinit(ehci, pdev); | 309 | retval = ehci_pci_reinit(ehci, pdev); |
309 | done: | 310 | done: |
310 | return retval; | 311 | return retval; |
@@ -323,18 +324,14 @@ done: | |||
323 | * Also they depend on separate root hub suspend/resume. | 324 | * Also they depend on separate root hub suspend/resume. |
324 | */ | 325 | */ |
325 | 326 | ||
326 | static int ehci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup) | ||
327 | { | ||
328 | return ehci_suspend(hcd, do_wakeup); | ||
329 | } | ||
330 | |||
331 | static bool usb_is_intel_switchable_ehci(struct pci_dev *pdev) | 327 | static bool usb_is_intel_switchable_ehci(struct pci_dev *pdev) |
332 | { | 328 | { |
333 | return pdev->class == PCI_CLASS_SERIAL_USB_EHCI && | 329 | return pdev->class == PCI_CLASS_SERIAL_USB_EHCI && |
334 | pdev->vendor == PCI_VENDOR_ID_INTEL && | 330 | pdev->vendor == PCI_VENDOR_ID_INTEL && |
335 | (pdev->device == 0x1E26 || | 331 | (pdev->device == 0x1E26 || |
336 | pdev->device == 0x8C2D || | 332 | pdev->device == 0x8C2D || |
337 | pdev->device == 0x8C26); | 333 | pdev->device == 0x8C26 || |
334 | pdev->device == 0x9C26); | ||
338 | } | 335 | } |
339 | 336 | ||
340 | static void ehci_enable_xhci_companion(void) | 337 | static void ehci_enable_xhci_companion(void) |
@@ -378,76 +375,17 @@ static int ehci_pci_resume(struct usb_hcd *hcd, bool hibernated) | |||
378 | (void) ehci_pci_reinit(ehci, pdev); | 375 | (void) ehci_pci_reinit(ehci, pdev); |
379 | return 0; | 376 | return 0; |
380 | } | 377 | } |
381 | #endif | ||
382 | 378 | ||
383 | static int ehci_update_device(struct usb_hcd *hcd, struct usb_device *udev) | 379 | #else |
384 | { | ||
385 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
386 | int rc = 0; | ||
387 | |||
388 | if (!udev->parent) /* udev is root hub itself, impossible */ | ||
389 | rc = -1; | ||
390 | /* we only support lpm device connected to root hub yet */ | ||
391 | if (ehci->has_lpm && !udev->parent->parent) { | ||
392 | rc = ehci_lpm_set_da(ehci, udev->devnum, udev->portnum); | ||
393 | if (!rc) | ||
394 | rc = ehci_lpm_check(ehci, udev->portnum); | ||
395 | } | ||
396 | return rc; | ||
397 | } | ||
398 | 380 | ||
399 | static const struct hc_driver ehci_pci_hc_driver = { | 381 | #define ehci_suspend NULL |
400 | .description = hcd_name, | 382 | #define ehci_pci_resume NULL |
401 | .product_desc = "EHCI Host Controller", | 383 | #endif /* CONFIG_PM */ |
402 | .hcd_priv_size = sizeof(struct ehci_hcd), | ||
403 | 384 | ||
404 | /* | 385 | static struct hc_driver __read_mostly ehci_pci_hc_driver; |
405 | * generic hardware linkage | ||
406 | */ | ||
407 | .irq = ehci_irq, | ||
408 | .flags = HCD_MEMORY | HCD_USB2, | ||
409 | 386 | ||
410 | /* | 387 | static const struct ehci_driver_overrides pci_overrides __initdata = { |
411 | * basic lifecycle operations | ||
412 | */ | ||
413 | .reset = ehci_pci_setup, | 388 | .reset = ehci_pci_setup, |
414 | .start = ehci_run, | ||
415 | #ifdef CONFIG_PM | ||
416 | .pci_suspend = ehci_pci_suspend, | ||
417 | .pci_resume = ehci_pci_resume, | ||
418 | #endif | ||
419 | .stop = ehci_stop, | ||
420 | .shutdown = ehci_shutdown, | ||
421 | |||
422 | /* | ||
423 | * managing i/o requests and associated device resources | ||
424 | */ | ||
425 | .urb_enqueue = ehci_urb_enqueue, | ||
426 | .urb_dequeue = ehci_urb_dequeue, | ||
427 | .endpoint_disable = ehci_endpoint_disable, | ||
428 | .endpoint_reset = ehci_endpoint_reset, | ||
429 | |||
430 | /* | ||
431 | * scheduling support | ||
432 | */ | ||
433 | .get_frame_number = ehci_get_frame, | ||
434 | |||
435 | /* | ||
436 | * root hub support | ||
437 | */ | ||
438 | .hub_status_data = ehci_hub_status_data, | ||
439 | .hub_control = ehci_hub_control, | ||
440 | .bus_suspend = ehci_bus_suspend, | ||
441 | .bus_resume = ehci_bus_resume, | ||
442 | .relinquish_port = ehci_relinquish_port, | ||
443 | .port_handed_over = ehci_port_handed_over, | ||
444 | |||
445 | /* | ||
446 | * call back when device connected and addressed | ||
447 | */ | ||
448 | .update_device = ehci_update_device, | ||
449 | |||
450 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
451 | }; | 389 | }; |
452 | 390 | ||
453 | /*-------------------------------------------------------------------------*/ | 391 | /*-------------------------------------------------------------------------*/ |
@@ -480,3 +418,31 @@ static struct pci_driver ehci_pci_driver = { | |||
480 | }, | 418 | }, |
481 | #endif | 419 | #endif |
482 | }; | 420 | }; |
421 | |||
422 | static int __init ehci_pci_init(void) | ||
423 | { | ||
424 | if (usb_disabled()) | ||
425 | return -ENODEV; | ||
426 | |||
427 | pr_info("%s: " DRIVER_DESC "\n", hcd_name); | ||
428 | |||
429 | ehci_init_driver(&ehci_pci_hc_driver, &pci_overrides); | ||
430 | |||
431 | /* Entries for the PCI suspend/resume callbacks are special */ | ||
432 | ehci_pci_hc_driver.pci_suspend = ehci_suspend; | ||
433 | ehci_pci_hc_driver.pci_resume = ehci_pci_resume; | ||
434 | |||
435 | return pci_register_driver(&ehci_pci_driver); | ||
436 | } | ||
437 | module_init(ehci_pci_init); | ||
438 | |||
439 | static void __exit ehci_pci_cleanup(void) | ||
440 | { | ||
441 | pci_unregister_driver(&ehci_pci_driver); | ||
442 | } | ||
443 | module_exit(ehci_pci_cleanup); | ||
444 | |||
445 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
446 | MODULE_AUTHOR("David Brownell"); | ||
447 | MODULE_AUTHOR("Alan Stern"); | ||
448 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/host/ehci-platform.c b/drivers/usb/host/ehci-platform.c index 764e0100b6f4..58fa0c90c7c7 100644 --- a/drivers/usb/host/ehci-platform.c +++ b/drivers/usb/host/ehci-platform.c | |||
@@ -18,9 +18,21 @@ | |||
18 | * | 18 | * |
19 | * Licensed under the GNU/GPL. See COPYING for details. | 19 | * Licensed under the GNU/GPL. See COPYING for details. |
20 | */ | 20 | */ |
21 | #include <linux/kernel.h> | ||
22 | #include <linux/hrtimer.h> | ||
23 | #include <linux/io.h> | ||
24 | #include <linux/module.h> | ||
21 | #include <linux/platform_device.h> | 25 | #include <linux/platform_device.h> |
26 | #include <linux/usb.h> | ||
27 | #include <linux/usb/hcd.h> | ||
22 | #include <linux/usb/ehci_pdriver.h> | 28 | #include <linux/usb/ehci_pdriver.h> |
23 | 29 | ||
30 | #include "ehci.h" | ||
31 | |||
32 | #define DRIVER_DESC "EHCI generic platform driver" | ||
33 | |||
34 | static const char hcd_name[] = "ehci-platform"; | ||
35 | |||
24 | static int ehci_platform_reset(struct usb_hcd *hcd) | 36 | static int ehci_platform_reset(struct usb_hcd *hcd) |
25 | { | 37 | { |
26 | struct platform_device *pdev = to_platform_device(hcd->self.controller); | 38 | struct platform_device *pdev = to_platform_device(hcd->self.controller); |
@@ -38,47 +50,18 @@ static int ehci_platform_reset(struct usb_hcd *hcd) | |||
38 | if (retval) | 50 | if (retval) |
39 | return retval; | 51 | return retval; |
40 | 52 | ||
41 | if (pdata->port_power_on) | 53 | if (pdata->no_io_watchdog) |
42 | ehci_port_power(ehci, 1); | 54 | ehci->need_io_watchdog = 0; |
43 | if (pdata->port_power_off) | ||
44 | ehci_port_power(ehci, 0); | ||
45 | |||
46 | return 0; | 55 | return 0; |
47 | } | 56 | } |
48 | 57 | ||
49 | static const struct hc_driver ehci_platform_hc_driver = { | 58 | static struct hc_driver __read_mostly ehci_platform_hc_driver; |
50 | .description = hcd_name, | ||
51 | .product_desc = "Generic Platform EHCI Controller", | ||
52 | .hcd_priv_size = sizeof(struct ehci_hcd), | ||
53 | |||
54 | .irq = ehci_irq, | ||
55 | .flags = HCD_MEMORY | HCD_USB2, | ||
56 | |||
57 | .reset = ehci_platform_reset, | ||
58 | .start = ehci_run, | ||
59 | .stop = ehci_stop, | ||
60 | .shutdown = ehci_shutdown, | ||
61 | |||
62 | .urb_enqueue = ehci_urb_enqueue, | ||
63 | .urb_dequeue = ehci_urb_dequeue, | ||
64 | .endpoint_disable = ehci_endpoint_disable, | ||
65 | .endpoint_reset = ehci_endpoint_reset, | ||
66 | 59 | ||
67 | .get_frame_number = ehci_get_frame, | 60 | static const struct ehci_driver_overrides platform_overrides __initdata = { |
68 | 61 | .reset = ehci_platform_reset, | |
69 | .hub_status_data = ehci_hub_status_data, | ||
70 | .hub_control = ehci_hub_control, | ||
71 | #if defined(CONFIG_PM) | ||
72 | .bus_suspend = ehci_bus_suspend, | ||
73 | .bus_resume = ehci_bus_resume, | ||
74 | #endif | ||
75 | .relinquish_port = ehci_relinquish_port, | ||
76 | .port_handed_over = ehci_port_handed_over, | ||
77 | |||
78 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
79 | }; | 62 | }; |
80 | 63 | ||
81 | static int __devinit ehci_platform_probe(struct platform_device *dev) | 64 | static int ehci_platform_probe(struct platform_device *dev) |
82 | { | 65 | { |
83 | struct usb_hcd *hcd; | 66 | struct usb_hcd *hcd; |
84 | struct resource *res_mem; | 67 | struct resource *res_mem; |
@@ -96,12 +79,12 @@ static int __devinit ehci_platform_probe(struct platform_device *dev) | |||
96 | 79 | ||
97 | irq = platform_get_irq(dev, 0); | 80 | irq = platform_get_irq(dev, 0); |
98 | if (irq < 0) { | 81 | if (irq < 0) { |
99 | pr_err("no irq provided"); | 82 | dev_err(&dev->dev, "no irq provided"); |
100 | return irq; | 83 | return irq; |
101 | } | 84 | } |
102 | res_mem = platform_get_resource(dev, IORESOURCE_MEM, 0); | 85 | res_mem = platform_get_resource(dev, IORESOURCE_MEM, 0); |
103 | if (!res_mem) { | 86 | if (!res_mem) { |
104 | pr_err("no memory recourse provided"); | 87 | dev_err(&dev->dev, "no memory resource provided"); |
105 | return -ENXIO; | 88 | return -ENXIO; |
106 | } | 89 | } |
107 | 90 | ||
@@ -121,29 +104,19 @@ static int __devinit ehci_platform_probe(struct platform_device *dev) | |||
121 | hcd->rsrc_start = res_mem->start; | 104 | hcd->rsrc_start = res_mem->start; |
122 | hcd->rsrc_len = resource_size(res_mem); | 105 | hcd->rsrc_len = resource_size(res_mem); |
123 | 106 | ||
124 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | 107 | hcd->regs = devm_request_and_ioremap(&dev->dev, res_mem); |
125 | pr_err("controller already in use"); | ||
126 | err = -EBUSY; | ||
127 | goto err_put_hcd; | ||
128 | } | ||
129 | |||
130 | hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len); | ||
131 | if (!hcd->regs) { | 108 | if (!hcd->regs) { |
132 | err = -ENOMEM; | 109 | err = -ENOMEM; |
133 | goto err_release_region; | 110 | goto err_put_hcd; |
134 | } | 111 | } |
135 | err = usb_add_hcd(hcd, irq, IRQF_SHARED); | 112 | err = usb_add_hcd(hcd, irq, IRQF_SHARED); |
136 | if (err) | 113 | if (err) |
137 | goto err_iounmap; | 114 | goto err_put_hcd; |
138 | 115 | ||
139 | platform_set_drvdata(dev, hcd); | 116 | platform_set_drvdata(dev, hcd); |
140 | 117 | ||
141 | return err; | 118 | return err; |
142 | 119 | ||
143 | err_iounmap: | ||
144 | iounmap(hcd->regs); | ||
145 | err_release_region: | ||
146 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
147 | err_put_hcd: | 120 | err_put_hcd: |
148 | usb_put_hcd(hcd); | 121 | usb_put_hcd(hcd); |
149 | err_power: | 122 | err_power: |
@@ -153,14 +126,12 @@ err_power: | |||
153 | return err; | 126 | return err; |
154 | } | 127 | } |
155 | 128 | ||
156 | static int __devexit ehci_platform_remove(struct platform_device *dev) | 129 | static int ehci_platform_remove(struct platform_device *dev) |
157 | { | 130 | { |
158 | struct usb_hcd *hcd = platform_get_drvdata(dev); | 131 | struct usb_hcd *hcd = platform_get_drvdata(dev); |
159 | struct usb_ehci_pdata *pdata = dev->dev.platform_data; | 132 | struct usb_ehci_pdata *pdata = dev->dev.platform_data; |
160 | 133 | ||
161 | usb_remove_hcd(hcd); | 134 | usb_remove_hcd(hcd); |
162 | iounmap(hcd->regs); | ||
163 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
164 | usb_put_hcd(hcd); | 135 | usb_put_hcd(hcd); |
165 | platform_set_drvdata(dev, NULL); | 136 | platform_set_drvdata(dev, NULL); |
166 | 137 | ||
@@ -225,7 +196,7 @@ static const struct dev_pm_ops ehci_platform_pm_ops = { | |||
225 | static struct platform_driver ehci_platform_driver = { | 196 | static struct platform_driver ehci_platform_driver = { |
226 | .id_table = ehci_platform_table, | 197 | .id_table = ehci_platform_table, |
227 | .probe = ehci_platform_probe, | 198 | .probe = ehci_platform_probe, |
228 | .remove = __devexit_p(ehci_platform_remove), | 199 | .remove = ehci_platform_remove, |
229 | .shutdown = usb_hcd_platform_shutdown, | 200 | .shutdown = usb_hcd_platform_shutdown, |
230 | .driver = { | 201 | .driver = { |
231 | .owner = THIS_MODULE, | 202 | .owner = THIS_MODULE, |
@@ -233,3 +204,26 @@ static struct platform_driver ehci_platform_driver = { | |||
233 | .pm = &ehci_platform_pm_ops, | 204 | .pm = &ehci_platform_pm_ops, |
234 | } | 205 | } |
235 | }; | 206 | }; |
207 | |||
208 | static int __init ehci_platform_init(void) | ||
209 | { | ||
210 | if (usb_disabled()) | ||
211 | return -ENODEV; | ||
212 | |||
213 | pr_info("%s: " DRIVER_DESC "\n", hcd_name); | ||
214 | |||
215 | ehci_init_driver(&ehci_platform_hc_driver, &platform_overrides); | ||
216 | return platform_driver_register(&ehci_platform_driver); | ||
217 | } | ||
218 | module_init(ehci_platform_init); | ||
219 | |||
220 | static void __exit ehci_platform_cleanup(void) | ||
221 | { | ||
222 | platform_driver_unregister(&ehci_platform_driver); | ||
223 | } | ||
224 | module_exit(ehci_platform_cleanup); | ||
225 | |||
226 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
227 | MODULE_AUTHOR("Hauke Mehrtens"); | ||
228 | MODULE_AUTHOR("Alan Stern"); | ||
229 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/host/ehci-pmcmsp.c b/drivers/usb/host/ehci-pmcmsp.c index 087aee2a904f..363890ee41d2 100644 --- a/drivers/usb/host/ehci-pmcmsp.c +++ b/drivers/usb/host/ehci-pmcmsp.c | |||
@@ -90,7 +90,6 @@ static int ehci_msp_setup(struct usb_hcd *hcd) | |||
90 | return retval; | 90 | return retval; |
91 | 91 | ||
92 | usb_hcd_tdi_set_mode(ehci); | 92 | usb_hcd_tdi_set_mode(ehci); |
93 | ehci_port_power(ehci, 0); | ||
94 | 93 | ||
95 | return retval; | 94 | return retval; |
96 | } | 95 | } |
diff --git a/drivers/usb/host/ehci-ppc-of.c b/drivers/usb/host/ehci-ppc-of.c index fa937d05a02b..45aceefd0c2b 100644 --- a/drivers/usb/host/ehci-ppc-of.c +++ b/drivers/usb/host/ehci-ppc-of.c | |||
@@ -71,7 +71,7 @@ static const struct hc_driver ehci_ppc_of_hc_driver = { | |||
71 | * Fix: Enable Break Memory Transfer (BMT) in INSNREG3 | 71 | * Fix: Enable Break Memory Transfer (BMT) in INSNREG3 |
72 | */ | 72 | */ |
73 | #define PPC440EPX_EHCI0_INSREG_BMT (0x1 << 0) | 73 | #define PPC440EPX_EHCI0_INSREG_BMT (0x1 << 0) |
74 | static int __devinit | 74 | static int |
75 | ppc44x_enable_bmt(struct device_node *dn) | 75 | ppc44x_enable_bmt(struct device_node *dn) |
76 | { | 76 | { |
77 | __iomem u32 *insreg_virt; | 77 | __iomem u32 *insreg_virt; |
@@ -87,7 +87,7 @@ ppc44x_enable_bmt(struct device_node *dn) | |||
87 | } | 87 | } |
88 | 88 | ||
89 | 89 | ||
90 | static int __devinit ehci_hcd_ppc_of_probe(struct platform_device *op) | 90 | static int ehci_hcd_ppc_of_probe(struct platform_device *op) |
91 | { | 91 | { |
92 | struct device_node *dn = op->dev.of_node; | 92 | struct device_node *dn = op->dev.of_node; |
93 | struct usb_hcd *hcd; | 93 | struct usb_hcd *hcd; |
diff --git a/drivers/usb/host/ehci-ps3.c b/drivers/usb/host/ehci-ps3.c index 45a356e9f138..df5925a4f0db 100644 --- a/drivers/usb/host/ehci-ps3.c +++ b/drivers/usb/host/ehci-ps3.c | |||
@@ -93,7 +93,7 @@ static const struct hc_driver ps3_ehci_hc_driver = { | |||
93 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | 93 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, |
94 | }; | 94 | }; |
95 | 95 | ||
96 | static int __devinit ps3_ehci_probe(struct ps3_system_bus_device *dev) | 96 | static int ps3_ehci_probe(struct ps3_system_bus_device *dev) |
97 | { | 97 | { |
98 | int result; | 98 | int result; |
99 | struct usb_hcd *hcd; | 99 | struct usb_hcd *hcd; |
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 4b66374bdc8e..3d989028c836 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c | |||
@@ -264,15 +264,9 @@ ehci_urb_done(struct ehci_hcd *ehci, struct urb *urb, int status) | |||
264 | __releases(ehci->lock) | 264 | __releases(ehci->lock) |
265 | __acquires(ehci->lock) | 265 | __acquires(ehci->lock) |
266 | { | 266 | { |
267 | if (likely (urb->hcpriv != NULL)) { | 267 | if (usb_pipetype(urb->pipe) == PIPE_INTERRUPT) { |
268 | struct ehci_qh *qh = (struct ehci_qh *) urb->hcpriv; | 268 | /* ... update hc-wide periodic stats */ |
269 | 269 | ehci_to_hcd(ehci)->self.bandwidth_int_reqs--; | |
270 | /* S-mask in a QH means it's an interrupt urb */ | ||
271 | if ((qh->hw->hw_info2 & cpu_to_hc32(ehci, QH_SMASK)) != 0) { | ||
272 | |||
273 | /* ... update hc-wide periodic stats (for usbfs) */ | ||
274 | ehci_to_hcd(ehci)->self.bandwidth_int_reqs--; | ||
275 | } | ||
276 | } | 270 | } |
277 | 271 | ||
278 | if (unlikely(urb->unlinked)) { | 272 | if (unlikely(urb->unlinked)) { |
diff --git a/drivers/usb/host/ehci-s5p.c b/drivers/usb/host/ehci-s5p.c index 85b74be202eb..319dcfaa8735 100644 --- a/drivers/usb/host/ehci-s5p.c +++ b/drivers/usb/host/ehci-s5p.c | |||
@@ -85,7 +85,7 @@ static void s5p_setup_vbus_gpio(struct platform_device *pdev) | |||
85 | 85 | ||
86 | static u64 ehci_s5p_dma_mask = DMA_BIT_MASK(32); | 86 | static u64 ehci_s5p_dma_mask = DMA_BIT_MASK(32); |
87 | 87 | ||
88 | static int __devinit s5p_ehci_probe(struct platform_device *pdev) | 88 | static int s5p_ehci_probe(struct platform_device *pdev) |
89 | { | 89 | { |
90 | struct s5p_ehci_platdata *pdata; | 90 | struct s5p_ehci_platdata *pdata; |
91 | struct s5p_ehci_hcd *s5p_ehci; | 91 | struct s5p_ehci_hcd *s5p_ehci; |
@@ -136,7 +136,7 @@ static int __devinit s5p_ehci_probe(struct platform_device *pdev) | |||
136 | goto fail_clk; | 136 | goto fail_clk; |
137 | } | 137 | } |
138 | 138 | ||
139 | err = clk_enable(s5p_ehci->clk); | 139 | err = clk_prepare_enable(s5p_ehci->clk); |
140 | if (err) | 140 | if (err) |
141 | goto fail_clk; | 141 | goto fail_clk; |
142 | 142 | ||
@@ -183,13 +183,13 @@ static int __devinit s5p_ehci_probe(struct platform_device *pdev) | |||
183 | return 0; | 183 | return 0; |
184 | 184 | ||
185 | fail_io: | 185 | fail_io: |
186 | clk_disable(s5p_ehci->clk); | 186 | clk_disable_unprepare(s5p_ehci->clk); |
187 | fail_clk: | 187 | fail_clk: |
188 | usb_put_hcd(hcd); | 188 | usb_put_hcd(hcd); |
189 | return err; | 189 | return err; |
190 | } | 190 | } |
191 | 191 | ||
192 | static int __devexit s5p_ehci_remove(struct platform_device *pdev) | 192 | static int s5p_ehci_remove(struct platform_device *pdev) |
193 | { | 193 | { |
194 | struct s5p_ehci_platdata *pdata = pdev->dev.platform_data; | 194 | struct s5p_ehci_platdata *pdata = pdev->dev.platform_data; |
195 | struct s5p_ehci_hcd *s5p_ehci = platform_get_drvdata(pdev); | 195 | struct s5p_ehci_hcd *s5p_ehci = platform_get_drvdata(pdev); |
@@ -200,7 +200,7 @@ static int __devexit s5p_ehci_remove(struct platform_device *pdev) | |||
200 | if (pdata && pdata->phy_exit) | 200 | if (pdata && pdata->phy_exit) |
201 | pdata->phy_exit(pdev, S5P_USB_PHY_HOST); | 201 | pdata->phy_exit(pdev, S5P_USB_PHY_HOST); |
202 | 202 | ||
203 | clk_disable(s5p_ehci->clk); | 203 | clk_disable_unprepare(s5p_ehci->clk); |
204 | 204 | ||
205 | usb_put_hcd(hcd); | 205 | usb_put_hcd(hcd); |
206 | 206 | ||
@@ -231,7 +231,7 @@ static int s5p_ehci_suspend(struct device *dev) | |||
231 | if (pdata && pdata->phy_exit) | 231 | if (pdata && pdata->phy_exit) |
232 | pdata->phy_exit(pdev, S5P_USB_PHY_HOST); | 232 | pdata->phy_exit(pdev, S5P_USB_PHY_HOST); |
233 | 233 | ||
234 | clk_disable(s5p_ehci->clk); | 234 | clk_disable_unprepare(s5p_ehci->clk); |
235 | 235 | ||
236 | return rc; | 236 | return rc; |
237 | } | 237 | } |
@@ -243,7 +243,7 @@ static int s5p_ehci_resume(struct device *dev) | |||
243 | struct platform_device *pdev = to_platform_device(dev); | 243 | struct platform_device *pdev = to_platform_device(dev); |
244 | struct s5p_ehci_platdata *pdata = pdev->dev.platform_data; | 244 | struct s5p_ehci_platdata *pdata = pdev->dev.platform_data; |
245 | 245 | ||
246 | clk_enable(s5p_ehci->clk); | 246 | clk_prepare_enable(s5p_ehci->clk); |
247 | 247 | ||
248 | if (pdata && pdata->phy_init) | 248 | if (pdata && pdata->phy_init) |
249 | pdata->phy_init(pdev, S5P_USB_PHY_HOST); | 249 | pdata->phy_init(pdev, S5P_USB_PHY_HOST); |
@@ -274,7 +274,7 @@ MODULE_DEVICE_TABLE(of, exynos_ehci_match); | |||
274 | 274 | ||
275 | static struct platform_driver s5p_ehci_driver = { | 275 | static struct platform_driver s5p_ehci_driver = { |
276 | .probe = s5p_ehci_probe, | 276 | .probe = s5p_ehci_probe, |
277 | .remove = __devexit_p(s5p_ehci_remove), | 277 | .remove = s5p_ehci_remove, |
278 | .shutdown = s5p_ehci_shutdown, | 278 | .shutdown = s5p_ehci_shutdown, |
279 | .driver = { | 279 | .driver = { |
280 | .name = "s5p-ehci", | 280 | .name = "s5p-ehci", |
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index 7cf3da7babf0..69ebee73c0c1 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
@@ -36,29 +36,6 @@ | |||
36 | 36 | ||
37 | static int ehci_get_frame (struct usb_hcd *hcd); | 37 | static int ehci_get_frame (struct usb_hcd *hcd); |
38 | 38 | ||
39 | #ifdef CONFIG_PCI | ||
40 | |||
41 | static unsigned ehci_read_frame_index(struct ehci_hcd *ehci) | ||
42 | { | ||
43 | unsigned uf; | ||
44 | |||
45 | /* | ||
46 | * The MosChip MCS9990 controller updates its microframe counter | ||
47 | * a little before the frame counter, and occasionally we will read | ||
48 | * the invalid intermediate value. Avoid problems by checking the | ||
49 | * microframe number (the low-order 3 bits); if they are 0 then | ||
50 | * re-read the register to get the correct value. | ||
51 | */ | ||
52 | uf = ehci_readl(ehci, &ehci->regs->frame_index); | ||
53 | if (unlikely(ehci->frame_index_bug && ((uf & 7) == 0))) | ||
54 | uf = ehci_readl(ehci, &ehci->regs->frame_index); | ||
55 | return uf; | ||
56 | } | ||
57 | |||
58 | #endif | ||
59 | |||
60 | /*-------------------------------------------------------------------------*/ | ||
61 | |||
62 | /* | 39 | /* |
63 | * periodic_next_shadow - return "next" pointer on shadow list | 40 | * periodic_next_shadow - return "next" pointer on shadow list |
64 | * @periodic: host pointer to qh/itd/sitd | 41 | * @periodic: host pointer to qh/itd/sitd |
@@ -1361,7 +1338,7 @@ sitd_slot_ok ( | |||
1361 | * given EHCI_TUNE_FLS and the slop). Or, write a smarter scheduler! | 1338 | * given EHCI_TUNE_FLS and the slop). Or, write a smarter scheduler! |
1362 | */ | 1339 | */ |
1363 | 1340 | ||
1364 | #define SCHEDULE_SLOP 80 /* microframes */ | 1341 | #define SCHEDULING_DELAY 40 /* microframes */ |
1365 | 1342 | ||
1366 | static int | 1343 | static int |
1367 | iso_stream_schedule ( | 1344 | iso_stream_schedule ( |
@@ -1370,7 +1347,7 @@ iso_stream_schedule ( | |||
1370 | struct ehci_iso_stream *stream | 1347 | struct ehci_iso_stream *stream |
1371 | ) | 1348 | ) |
1372 | { | 1349 | { |
1373 | u32 now, next, start, period, span; | 1350 | u32 now, base, next, start, period, span; |
1374 | int status; | 1351 | int status; |
1375 | unsigned mod = ehci->periodic_size << 3; | 1352 | unsigned mod = ehci->periodic_size << 3; |
1376 | struct ehci_iso_sched *sched = urb->hcpriv; | 1353 | struct ehci_iso_sched *sched = urb->hcpriv; |
@@ -1382,62 +1359,72 @@ iso_stream_schedule ( | |||
1382 | span <<= 3; | 1359 | span <<= 3; |
1383 | } | 1360 | } |
1384 | 1361 | ||
1385 | if (span > mod - SCHEDULE_SLOP) { | ||
1386 | ehci_dbg (ehci, "iso request %p too long\n", urb); | ||
1387 | status = -EFBIG; | ||
1388 | goto fail; | ||
1389 | } | ||
1390 | |||
1391 | now = ehci_read_frame_index(ehci) & (mod - 1); | 1362 | now = ehci_read_frame_index(ehci) & (mod - 1); |
1392 | 1363 | ||
1393 | /* Typical case: reuse current schedule, stream is still active. | 1364 | /* Typical case: reuse current schedule, stream is still active. |
1394 | * Hopefully there are no gaps from the host falling behind | 1365 | * Hopefully there are no gaps from the host falling behind |
1395 | * (irq delays etc), but if there are we'll take the next | 1366 | * (irq delays etc). If there are, the behavior depends on |
1396 | * slot in the schedule, implicitly assuming URB_ISO_ASAP. | 1367 | * whether URB_ISO_ASAP is set. |
1397 | */ | 1368 | */ |
1398 | if (likely (!list_empty (&stream->td_list))) { | 1369 | if (likely (!list_empty (&stream->td_list))) { |
1399 | u32 excess; | ||
1400 | 1370 | ||
1401 | /* For high speed devices, allow scheduling within the | 1371 | /* Take the isochronous scheduling threshold into account */ |
1402 | * isochronous scheduling threshold. For full speed devices | 1372 | if (ehci->i_thresh) |
1403 | * and Intel PCI-based controllers, don't (work around for | 1373 | next = now + ehci->i_thresh; /* uframe cache */ |
1404 | * Intel ICH9 bug). | ||
1405 | */ | ||
1406 | if (!stream->highspeed && ehci->fs_i_thresh) | ||
1407 | next = now + ehci->i_thresh; | ||
1408 | else | 1374 | else |
1409 | next = now; | 1375 | next = (now + 2 + 7) & ~0x07; /* full frame cache */ |
1410 | 1376 | ||
1411 | /* Fell behind (by up to twice the slop amount)? | 1377 | /* |
1412 | * We decide based on the time of the last currently-scheduled | 1378 | * Use ehci->last_iso_frame as the base. There can't be any |
1413 | * slot, not the time of the next available slot. | 1379 | * TDs scheduled for earlier than that. |
1414 | */ | 1380 | */ |
1415 | excess = (stream->next_uframe - period - next) & (mod - 1); | 1381 | base = ehci->last_iso_frame << 3; |
1416 | if (excess >= mod - 2 * SCHEDULE_SLOP) | 1382 | next = (next - base) & (mod - 1); |
1417 | start = next + excess - mod + period * | 1383 | start = (stream->next_uframe - base) & (mod - 1); |
1418 | DIV_ROUND_UP(mod - excess, period); | 1384 | |
1419 | else | 1385 | /* Is the schedule already full? */ |
1420 | start = next + excess + period; | 1386 | if (unlikely(start < period)) { |
1421 | if (start - now >= mod) { | 1387 | ehci_dbg(ehci, "iso sched full %p (%u-%u < %u mod %u)\n", |
1422 | ehci_dbg(ehci, "request %p would overflow (%d+%d >= %d)\n", | 1388 | urb, stream->next_uframe, base, |
1423 | urb, start - now - period, period, | 1389 | period, mod); |
1424 | mod); | 1390 | status = -ENOSPC; |
1425 | status = -EFBIG; | ||
1426 | goto fail; | 1391 | goto fail; |
1427 | } | 1392 | } |
1393 | |||
1394 | /* Behind the scheduling threshold? */ | ||
1395 | if (unlikely(start < next)) { | ||
1396 | |||
1397 | /* USB_ISO_ASAP: Round up to the first available slot */ | ||
1398 | if (urb->transfer_flags & URB_ISO_ASAP) | ||
1399 | start += (next - start + period - 1) & -period; | ||
1400 | |||
1401 | /* | ||
1402 | * Not ASAP: Use the next slot in the stream. If | ||
1403 | * the entire URB falls before the threshold, fail. | ||
1404 | */ | ||
1405 | else if (start + span - period < next) { | ||
1406 | ehci_dbg(ehci, "iso urb late %p (%u+%u < %u)\n", | ||
1407 | urb, start + base, | ||
1408 | span - period, next + base); | ||
1409 | status = -EXDEV; | ||
1410 | goto fail; | ||
1411 | } | ||
1412 | } | ||
1413 | |||
1414 | start += base; | ||
1428 | } | 1415 | } |
1429 | 1416 | ||
1430 | /* need to schedule; when's the next (u)frame we could start? | 1417 | /* need to schedule; when's the next (u)frame we could start? |
1431 | * this is bigger than ehci->i_thresh allows; scheduling itself | 1418 | * this is bigger than ehci->i_thresh allows; scheduling itself |
1432 | * isn't free, the slop should handle reasonably slow cpus. it | 1419 | * isn't free, the delay should handle reasonably slow cpus. it |
1433 | * can also help high bandwidth if the dma and irq loads don't | 1420 | * can also help high bandwidth if the dma and irq loads don't |
1434 | * jump until after the queue is primed. | 1421 | * jump until after the queue is primed. |
1435 | */ | 1422 | */ |
1436 | else { | 1423 | else { |
1437 | int done = 0; | 1424 | int done = 0; |
1438 | start = SCHEDULE_SLOP + (now & ~0x07); | ||
1439 | 1425 | ||
1440 | /* NOTE: assumes URB_ISO_ASAP, to limit complexity/bugs */ | 1426 | base = now & ~0x07; |
1427 | start = base + SCHEDULING_DELAY; | ||
1441 | 1428 | ||
1442 | /* find a uframe slot with enough bandwidth. | 1429 | /* find a uframe slot with enough bandwidth. |
1443 | * Early uframes are more precious because full-speed | 1430 | * Early uframes are more precious because full-speed |
@@ -1464,19 +1451,16 @@ iso_stream_schedule ( | |||
1464 | 1451 | ||
1465 | /* no room in the schedule */ | 1452 | /* no room in the schedule */ |
1466 | if (!done) { | 1453 | if (!done) { |
1467 | ehci_dbg(ehci, "iso resched full %p (now %d max %d)\n", | 1454 | ehci_dbg(ehci, "iso sched full %p", urb); |
1468 | urb, now, now + mod); | ||
1469 | status = -ENOSPC; | 1455 | status = -ENOSPC; |
1470 | goto fail; | 1456 | goto fail; |
1471 | } | 1457 | } |
1472 | } | 1458 | } |
1473 | 1459 | ||
1474 | /* Tried to schedule too far into the future? */ | 1460 | /* Tried to schedule too far into the future? */ |
1475 | if (unlikely(start - now + span - period | 1461 | if (unlikely(start - base + span - period >= mod)) { |
1476 | >= mod - 2 * SCHEDULE_SLOP)) { | 1462 | ehci_dbg(ehci, "request %p would overflow (%u+%u >= %u)\n", |
1477 | ehci_dbg(ehci, "request %p would overflow (%d+%d >= %d)\n", | 1463 | urb, start - base, span - period, mod); |
1478 | urb, start - now, span - period, | ||
1479 | mod - 2 * SCHEDULE_SLOP); | ||
1480 | status = -EFBIG; | 1464 | status = -EFBIG; |
1481 | goto fail; | 1465 | goto fail; |
1482 | } | 1466 | } |
@@ -1490,7 +1474,7 @@ iso_stream_schedule ( | |||
1490 | 1474 | ||
1491 | /* Make sure scan_isoc() sees these */ | 1475 | /* Make sure scan_isoc() sees these */ |
1492 | if (ehci->isoc_count == 0) | 1476 | if (ehci->isoc_count == 0) |
1493 | ehci->next_frame = now >> 3; | 1477 | ehci->last_iso_frame = now >> 3; |
1494 | return 0; | 1478 | return 0; |
1495 | 1479 | ||
1496 | fail: | 1480 | fail: |
@@ -1646,7 +1630,7 @@ static void itd_link_urb( | |||
1646 | 1630 | ||
1647 | /* don't need that schedule data any more */ | 1631 | /* don't need that schedule data any more */ |
1648 | iso_sched_free (stream, iso_sched); | 1632 | iso_sched_free (stream, iso_sched); |
1649 | urb->hcpriv = NULL; | 1633 | urb->hcpriv = stream; |
1650 | 1634 | ||
1651 | ++ehci->isoc_count; | 1635 | ++ehci->isoc_count; |
1652 | enable_periodic(ehci); | 1636 | enable_periodic(ehci); |
@@ -1708,7 +1692,7 @@ static bool itd_complete(struct ehci_hcd *ehci, struct ehci_itd *itd) | |||
1708 | urb->actual_length += desc->actual_length; | 1692 | urb->actual_length += desc->actual_length; |
1709 | } else { | 1693 | } else { |
1710 | /* URB was too late */ | 1694 | /* URB was too late */ |
1711 | desc->status = -EXDEV; | 1695 | urb->error_count++; |
1712 | } | 1696 | } |
1713 | } | 1697 | } |
1714 | 1698 | ||
@@ -2045,7 +2029,7 @@ static void sitd_link_urb( | |||
2045 | 2029 | ||
2046 | /* don't need that schedule data any more */ | 2030 | /* don't need that schedule data any more */ |
2047 | iso_sched_free (stream, sched); | 2031 | iso_sched_free (stream, sched); |
2048 | urb->hcpriv = NULL; | 2032 | urb->hcpriv = stream; |
2049 | 2033 | ||
2050 | ++ehci->isoc_count; | 2034 | ++ehci->isoc_count; |
2051 | enable_periodic(ehci); | 2035 | enable_periodic(ehci); |
@@ -2081,7 +2065,7 @@ static bool sitd_complete(struct ehci_hcd *ehci, struct ehci_sitd *sitd) | |||
2081 | t = hc32_to_cpup(ehci, &sitd->hw_results); | 2065 | t = hc32_to_cpup(ehci, &sitd->hw_results); |
2082 | 2066 | ||
2083 | /* report transfer status */ | 2067 | /* report transfer status */ |
2084 | if (t & SITD_ERRS) { | 2068 | if (unlikely(t & SITD_ERRS)) { |
2085 | urb->error_count++; | 2069 | urb->error_count++; |
2086 | if (t & SITD_STS_DBE) | 2070 | if (t & SITD_STS_DBE) |
2087 | desc->status = usb_pipein (urb->pipe) | 2071 | desc->status = usb_pipein (urb->pipe) |
@@ -2091,6 +2075,9 @@ static bool sitd_complete(struct ehci_hcd *ehci, struct ehci_sitd *sitd) | |||
2091 | desc->status = -EOVERFLOW; | 2075 | desc->status = -EOVERFLOW; |
2092 | else /* XACT, MMF, etc */ | 2076 | else /* XACT, MMF, etc */ |
2093 | desc->status = -EPROTO; | 2077 | desc->status = -EPROTO; |
2078 | } else if (unlikely(t & SITD_STS_ACTIVE)) { | ||
2079 | /* URB was too late */ | ||
2080 | urb->error_count++; | ||
2094 | } else { | 2081 | } else { |
2095 | desc->status = 0; | 2082 | desc->status = 0; |
2096 | desc->actual_length = desc->length - SITD_LENGTH(t); | 2083 | desc->actual_length = desc->length - SITD_LENGTH(t); |
@@ -2220,16 +2207,16 @@ static void scan_isoc(struct ehci_hcd *ehci) | |||
2220 | now_frame = (uf >> 3) & fmask; | 2207 | now_frame = (uf >> 3) & fmask; |
2221 | live = true; | 2208 | live = true; |
2222 | } else { | 2209 | } else { |
2223 | now_frame = (ehci->next_frame - 1) & fmask; | 2210 | now_frame = (ehci->last_iso_frame - 1) & fmask; |
2224 | live = false; | 2211 | live = false; |
2225 | } | 2212 | } |
2226 | ehci->now_frame = now_frame; | 2213 | ehci->now_frame = now_frame; |
2227 | 2214 | ||
2228 | frame = ehci->next_frame; | ||
2229 | for (;;) { | 2215 | for (;;) { |
2230 | union ehci_shadow q, *q_p; | 2216 | union ehci_shadow q, *q_p; |
2231 | __hc32 type, *hw_p; | 2217 | __hc32 type, *hw_p; |
2232 | 2218 | ||
2219 | frame = ehci->last_iso_frame; | ||
2233 | restart: | 2220 | restart: |
2234 | /* scan each element in frame's queue for completions */ | 2221 | /* scan each element in frame's queue for completions */ |
2235 | q_p = &ehci->pshadow [frame]; | 2222 | q_p = &ehci->pshadow [frame]; |
@@ -2334,7 +2321,6 @@ restart: | |||
2334 | /* Stop when we have reached the current frame */ | 2321 | /* Stop when we have reached the current frame */ |
2335 | if (frame == now_frame) | 2322 | if (frame == now_frame) |
2336 | break; | 2323 | break; |
2337 | frame = (frame + 1) & fmask; | 2324 | ehci->last_iso_frame = (frame + 1) & fmask; |
2338 | } | 2325 | } |
2339 | ehci->next_frame = now_frame; | ||
2340 | } | 2326 | } |
diff --git a/drivers/usb/host/ehci-sh.c b/drivers/usb/host/ehci-sh.c index 6081e1ed3ac9..0c90a24fa989 100644 --- a/drivers/usb/host/ehci-sh.c +++ b/drivers/usb/host/ehci-sh.c | |||
@@ -21,17 +21,10 @@ struct ehci_sh_priv { | |||
21 | static int ehci_sh_reset(struct usb_hcd *hcd) | 21 | static int ehci_sh_reset(struct usb_hcd *hcd) |
22 | { | 22 | { |
23 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 23 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
24 | int ret; | ||
25 | 24 | ||
26 | ehci->caps = hcd->regs; | 25 | ehci->caps = hcd->regs; |
27 | 26 | ||
28 | ret = ehci_setup(hcd); | 27 | return ehci_setup(hcd); |
29 | if (unlikely(ret)) | ||
30 | return ret; | ||
31 | |||
32 | ehci_port_power(ehci, 0); | ||
33 | |||
34 | return ret; | ||
35 | } | 28 | } |
36 | 29 | ||
37 | static const struct hc_driver ehci_sh_hc_driver = { | 30 | static const struct hc_driver ehci_sh_hc_driver = { |
diff --git a/drivers/usb/host/ehci-spear.c b/drivers/usb/host/ehci-spear.c index c718a065e154..466c1bb5b967 100644 --- a/drivers/usb/host/ehci-spear.c +++ b/drivers/usb/host/ehci-spear.c | |||
@@ -37,18 +37,11 @@ static void spear_stop_ehci(struct spear_ehci *ehci) | |||
37 | static int ehci_spear_setup(struct usb_hcd *hcd) | 37 | static int ehci_spear_setup(struct usb_hcd *hcd) |
38 | { | 38 | { |
39 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 39 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
40 | int retval = 0; | ||
41 | 40 | ||
42 | /* registers start at offset 0x0 */ | 41 | /* registers start at offset 0x0 */ |
43 | ehci->caps = hcd->regs; | 42 | ehci->caps = hcd->regs; |
44 | 43 | ||
45 | retval = ehci_setup(hcd); | 44 | return ehci_setup(hcd); |
46 | if (retval) | ||
47 | return retval; | ||
48 | |||
49 | ehci_port_power(ehci, 0); | ||
50 | |||
51 | return retval; | ||
52 | } | 45 | } |
53 | 46 | ||
54 | static const struct hc_driver ehci_spear_hc_driver = { | 47 | static const struct hc_driver ehci_spear_hc_driver = { |
@@ -116,8 +109,6 @@ static int spear_ehci_hcd_drv_probe(struct platform_device *pdev) | |||
116 | struct clk *usbh_clk; | 109 | struct clk *usbh_clk; |
117 | const struct hc_driver *driver = &ehci_spear_hc_driver; | 110 | const struct hc_driver *driver = &ehci_spear_hc_driver; |
118 | int irq, retval; | 111 | int irq, retval; |
119 | char clk_name[20] = "usbh_clk"; | ||
120 | static int instance = -1; | ||
121 | 112 | ||
122 | if (usb_disabled()) | 113 | if (usb_disabled()) |
123 | return -ENODEV; | 114 | return -ENODEV; |
@@ -125,7 +116,7 @@ static int spear_ehci_hcd_drv_probe(struct platform_device *pdev) | |||
125 | irq = platform_get_irq(pdev, 0); | 116 | irq = platform_get_irq(pdev, 0); |
126 | if (irq < 0) { | 117 | if (irq < 0) { |
127 | retval = irq; | 118 | retval = irq; |
128 | goto fail_irq_get; | 119 | goto fail; |
129 | } | 120 | } |
130 | 121 | ||
131 | /* | 122 | /* |
@@ -136,47 +127,38 @@ static int spear_ehci_hcd_drv_probe(struct platform_device *pdev) | |||
136 | if (!pdev->dev.dma_mask) | 127 | if (!pdev->dev.dma_mask) |
137 | pdev->dev.dma_mask = &spear_ehci_dma_mask; | 128 | pdev->dev.dma_mask = &spear_ehci_dma_mask; |
138 | 129 | ||
139 | /* | 130 | usbh_clk = devm_clk_get(&pdev->dev, NULL); |
140 | * Increment the device instance, when probing via device-tree | ||
141 | */ | ||
142 | if (pdev->id < 0) | ||
143 | instance++; | ||
144 | else | ||
145 | instance = pdev->id; | ||
146 | sprintf(clk_name, "usbh.%01d_clk", instance); | ||
147 | |||
148 | usbh_clk = clk_get(NULL, clk_name); | ||
149 | if (IS_ERR(usbh_clk)) { | 131 | if (IS_ERR(usbh_clk)) { |
150 | dev_err(&pdev->dev, "Error getting interface clock\n"); | 132 | dev_err(&pdev->dev, "Error getting interface clock\n"); |
151 | retval = PTR_ERR(usbh_clk); | 133 | retval = PTR_ERR(usbh_clk); |
152 | goto fail_get_usbh_clk; | 134 | goto fail; |
153 | } | 135 | } |
154 | 136 | ||
155 | hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); | 137 | hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); |
156 | if (!hcd) { | 138 | if (!hcd) { |
157 | retval = -ENOMEM; | 139 | retval = -ENOMEM; |
158 | goto fail_create_hcd; | 140 | goto fail; |
159 | } | 141 | } |
160 | 142 | ||
161 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 143 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
162 | if (!res) { | 144 | if (!res) { |
163 | retval = -ENODEV; | 145 | retval = -ENODEV; |
164 | goto fail_request_resource; | 146 | goto err_put_hcd; |
165 | } | 147 | } |
166 | 148 | ||
167 | hcd->rsrc_start = res->start; | 149 | hcd->rsrc_start = res->start; |
168 | hcd->rsrc_len = resource_size(res); | 150 | hcd->rsrc_len = resource_size(res); |
169 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, | 151 | if (!devm_request_mem_region(&pdev->dev, hcd->rsrc_start, hcd->rsrc_len, |
170 | driver->description)) { | 152 | driver->description)) { |
171 | retval = -EBUSY; | 153 | retval = -EBUSY; |
172 | goto fail_request_resource; | 154 | goto err_put_hcd; |
173 | } | 155 | } |
174 | 156 | ||
175 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | 157 | hcd->regs = devm_ioremap(&pdev->dev, hcd->rsrc_start, hcd->rsrc_len); |
176 | if (hcd->regs == NULL) { | 158 | if (hcd->regs == NULL) { |
177 | dev_dbg(&pdev->dev, "error mapping memory\n"); | 159 | dev_dbg(&pdev->dev, "error mapping memory\n"); |
178 | retval = -ENOMEM; | 160 | retval = -ENOMEM; |
179 | goto fail_ioremap; | 161 | goto err_put_hcd; |
180 | } | 162 | } |
181 | 163 | ||
182 | ehci = (struct spear_ehci *)hcd_to_ehci(hcd); | 164 | ehci = (struct spear_ehci *)hcd_to_ehci(hcd); |
@@ -185,21 +167,15 @@ static int spear_ehci_hcd_drv_probe(struct platform_device *pdev) | |||
185 | spear_start_ehci(ehci); | 167 | spear_start_ehci(ehci); |
186 | retval = usb_add_hcd(hcd, irq, IRQF_SHARED); | 168 | retval = usb_add_hcd(hcd, irq, IRQF_SHARED); |
187 | if (retval) | 169 | if (retval) |
188 | goto fail_add_hcd; | 170 | goto err_stop_ehci; |
189 | 171 | ||
190 | return retval; | 172 | return retval; |
191 | 173 | ||
192 | fail_add_hcd: | 174 | err_stop_ehci: |
193 | spear_stop_ehci(ehci); | 175 | spear_stop_ehci(ehci); |
194 | iounmap(hcd->regs); | 176 | err_put_hcd: |
195 | fail_ioremap: | ||
196 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
197 | fail_request_resource: | ||
198 | usb_put_hcd(hcd); | 177 | usb_put_hcd(hcd); |
199 | fail_create_hcd: | 178 | fail: |
200 | clk_put(usbh_clk); | ||
201 | fail_get_usbh_clk: | ||
202 | fail_irq_get: | ||
203 | dev_err(&pdev->dev, "init fail, %d\n", retval); | 179 | dev_err(&pdev->dev, "init fail, %d\n", retval); |
204 | 180 | ||
205 | return retval ; | 181 | return retval ; |
@@ -218,17 +194,12 @@ static int spear_ehci_hcd_drv_remove(struct platform_device *pdev) | |||
218 | 194 | ||
219 | if (ehci_p->clk) | 195 | if (ehci_p->clk) |
220 | spear_stop_ehci(ehci_p); | 196 | spear_stop_ehci(ehci_p); |
221 | iounmap(hcd->regs); | ||
222 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
223 | usb_put_hcd(hcd); | 197 | usb_put_hcd(hcd); |
224 | 198 | ||
225 | if (ehci_p->clk) | ||
226 | clk_put(ehci_p->clk); | ||
227 | |||
228 | return 0; | 199 | return 0; |
229 | } | 200 | } |
230 | 201 | ||
231 | static struct of_device_id spear_ehci_id_table[] __devinitdata = { | 202 | static struct of_device_id spear_ehci_id_table[] = { |
232 | { .compatible = "st,spear600-ehci", }, | 203 | { .compatible = "st,spear600-ehci", }, |
233 | { }, | 204 | { }, |
234 | }; | 205 | }; |
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index 6223d1757848..acf17556bd87 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c | |||
@@ -28,7 +28,10 @@ | |||
28 | #include <linux/pm_runtime.h> | 28 | #include <linux/pm_runtime.h> |
29 | 29 | ||
30 | #include <linux/usb/tegra_usb_phy.h> | 30 | #include <linux/usb/tegra_usb_phy.h> |
31 | #include <mach/iomap.h> | 31 | |
32 | #define TEGRA_USB_BASE 0xC5000000 | ||
33 | #define TEGRA_USB2_BASE 0xC5004000 | ||
34 | #define TEGRA_USB3_BASE 0xC5008000 | ||
32 | 35 | ||
33 | #define TEGRA_USB_DMA_ALIGN 32 | 36 | #define TEGRA_USB_DMA_ALIGN 32 |
34 | 37 | ||
@@ -277,7 +280,6 @@ static void tegra_ehci_shutdown(struct usb_hcd *hcd) | |||
277 | static int tegra_ehci_setup(struct usb_hcd *hcd) | 280 | static int tegra_ehci_setup(struct usb_hcd *hcd) |
278 | { | 281 | { |
279 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 282 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
280 | int retval; | ||
281 | 283 | ||
282 | /* EHCI registers start at offset 0x100 */ | 284 | /* EHCI registers start at offset 0x100 */ |
283 | ehci->caps = hcd->regs + 0x100; | 285 | ehci->caps = hcd->regs + 0x100; |
@@ -285,12 +287,7 @@ static int tegra_ehci_setup(struct usb_hcd *hcd) | |||
285 | /* switch to host mode */ | 287 | /* switch to host mode */ |
286 | hcd->has_tt = 1; | 288 | hcd->has_tt = 1; |
287 | 289 | ||
288 | retval = ehci_setup(hcd); | 290 | return ehci_setup(hcd); |
289 | if (retval) | ||
290 | return retval; | ||
291 | |||
292 | ehci_port_power(ehci, 1); | ||
293 | return retval; | ||
294 | } | 291 | } |
295 | 292 | ||
296 | struct dma_aligned_buffer { | 293 | struct dma_aligned_buffer { |
@@ -778,9 +775,6 @@ static int tegra_ehci_remove(struct platform_device *pdev) | |||
778 | struct tegra_ehci_hcd *tegra = platform_get_drvdata(pdev); | 775 | struct tegra_ehci_hcd *tegra = platform_get_drvdata(pdev); |
779 | struct usb_hcd *hcd = ehci_to_hcd(tegra->ehci); | 776 | struct usb_hcd *hcd = ehci_to_hcd(tegra->ehci); |
780 | 777 | ||
781 | if (tegra == NULL || hcd == NULL) | ||
782 | return -EINVAL; | ||
783 | |||
784 | pm_runtime_get_sync(&pdev->dev); | 778 | pm_runtime_get_sync(&pdev->dev); |
785 | pm_runtime_disable(&pdev->dev); | 779 | pm_runtime_disable(&pdev->dev); |
786 | pm_runtime_put_noidle(&pdev->dev); | 780 | pm_runtime_put_noidle(&pdev->dev); |
@@ -811,7 +805,7 @@ static void tegra_ehci_hcd_shutdown(struct platform_device *pdev) | |||
811 | hcd->driver->shutdown(hcd); | 805 | hcd->driver->shutdown(hcd); |
812 | } | 806 | } |
813 | 807 | ||
814 | static struct of_device_id tegra_ehci_of_match[] __devinitdata = { | 808 | static struct of_device_id tegra_ehci_of_match[] = { |
815 | { .compatible = "nvidia,tegra20-ehci", }, | 809 | { .compatible = "nvidia,tegra20-ehci", }, |
816 | { }, | 810 | { }, |
817 | }; | 811 | }; |
diff --git a/drivers/usb/host/ehci-vt8500.c b/drivers/usb/host/ehci-vt8500.c index d3c9a3e397b9..11695d5b9d86 100644 --- a/drivers/usb/host/ehci-vt8500.c +++ b/drivers/usb/host/ehci-vt8500.c | |||
@@ -19,22 +19,6 @@ | |||
19 | #include <linux/of.h> | 19 | #include <linux/of.h> |
20 | #include <linux/platform_device.h> | 20 | #include <linux/platform_device.h> |
21 | 21 | ||
22 | static int ehci_update_device(struct usb_hcd *hcd, struct usb_device *udev) | ||
23 | { | ||
24 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
25 | int rc = 0; | ||
26 | |||
27 | if (!udev->parent) /* udev is root hub itself, impossible */ | ||
28 | rc = -1; | ||
29 | /* we only support lpm device connected to root hub yet */ | ||
30 | if (ehci->has_lpm && !udev->parent->parent) { | ||
31 | rc = ehci_lpm_set_da(ehci, udev->devnum, udev->portnum); | ||
32 | if (!rc) | ||
33 | rc = ehci_lpm_check(ehci, udev->portnum); | ||
34 | } | ||
35 | return rc; | ||
36 | } | ||
37 | |||
38 | static const struct hc_driver vt8500_ehci_hc_driver = { | 22 | static const struct hc_driver vt8500_ehci_hc_driver = { |
39 | .description = hcd_name, | 23 | .description = hcd_name, |
40 | .product_desc = "VT8500 EHCI", | 24 | .product_desc = "VT8500 EHCI", |
@@ -77,11 +61,6 @@ static const struct hc_driver vt8500_ehci_hc_driver = { | |||
77 | .relinquish_port = ehci_relinquish_port, | 61 | .relinquish_port = ehci_relinquish_port, |
78 | .port_handed_over = ehci_port_handed_over, | 62 | .port_handed_over = ehci_port_handed_over, |
79 | 63 | ||
80 | /* | ||
81 | * call back when device connected and addressed | ||
82 | */ | ||
83 | .update_device = ehci_update_device, | ||
84 | |||
85 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | 64 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, |
86 | }; | 65 | }; |
87 | 66 | ||
diff --git a/drivers/usb/host/ehci-w90x900.c b/drivers/usb/host/ehci-w90x900.c index ec598082c14b..59e0e24c753f 100644 --- a/drivers/usb/host/ehci-w90x900.c +++ b/drivers/usb/host/ehci-w90x900.c | |||
@@ -13,12 +13,12 @@ | |||
13 | 13 | ||
14 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
15 | 15 | ||
16 | /*ebable phy0 and phy1 for w90p910*/ | 16 | /* enable phy0 and phy1 for w90p910 */ |
17 | #define ENPHY (0x01<<8) | 17 | #define ENPHY (0x01<<8) |
18 | #define PHY0_CTR (0xA4) | 18 | #define PHY0_CTR (0xA4) |
19 | #define PHY1_CTR (0xA8) | 19 | #define PHY1_CTR (0xA8) |
20 | 20 | ||
21 | static int __devinit usb_w90x900_probe(const struct hc_driver *driver, | 21 | static int usb_w90x900_probe(const struct hc_driver *driver, |
22 | struct platform_device *pdev) | 22 | struct platform_device *pdev) |
23 | { | 23 | { |
24 | struct usb_hcd *hcd; | 24 | struct usb_hcd *hcd; |
@@ -147,7 +147,7 @@ static const struct hc_driver ehci_w90x900_hc_driver = { | |||
147 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | 147 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, |
148 | }; | 148 | }; |
149 | 149 | ||
150 | static int __devinit ehci_w90x900_probe(struct platform_device *pdev) | 150 | static int ehci_w90x900_probe(struct platform_device *pdev) |
151 | { | 151 | { |
152 | if (usb_disabled()) | 152 | if (usb_disabled()) |
153 | return -ENODEV; | 153 | return -ENODEV; |
@@ -155,7 +155,7 @@ static int __devinit ehci_w90x900_probe(struct platform_device *pdev) | |||
155 | return usb_w90x900_probe(&ehci_w90x900_hc_driver, pdev); | 155 | return usb_w90x900_probe(&ehci_w90x900_hc_driver, pdev); |
156 | } | 156 | } |
157 | 157 | ||
158 | static int __devexit ehci_w90x900_remove(struct platform_device *pdev) | 158 | static int ehci_w90x900_remove(struct platform_device *pdev) |
159 | { | 159 | { |
160 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | 160 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
161 | 161 | ||
@@ -166,7 +166,7 @@ static int __devexit ehci_w90x900_remove(struct platform_device *pdev) | |||
166 | 166 | ||
167 | static struct platform_driver ehci_hcd_w90x900_driver = { | 167 | static struct platform_driver ehci_hcd_w90x900_driver = { |
168 | .probe = ehci_w90x900_probe, | 168 | .probe = ehci_w90x900_probe, |
169 | .remove = __devexit_p(ehci_w90x900_remove), | 169 | .remove = ehci_w90x900_remove, |
170 | .driver = { | 170 | .driver = { |
171 | .name = "w90x900-ehci", | 171 | .name = "w90x900-ehci", |
172 | .owner = THIS_MODULE, | 172 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/host/ehci-xilinx-of.c b/drivers/usb/host/ehci-xilinx-of.c index 6a3f921a5d76..4f285e8e404a 100644 --- a/drivers/usb/host/ehci-xilinx-of.c +++ b/drivers/usb/host/ehci-xilinx-of.c | |||
@@ -125,7 +125,7 @@ static const struct hc_driver ehci_xilinx_of_hc_driver = { | |||
125 | * as HS only or HS/FS only, it checks the configuration in the device tree | 125 | * as HS only or HS/FS only, it checks the configuration in the device tree |
126 | * entry, and sets an appropriate value for hcd->has_tt. | 126 | * entry, and sets an appropriate value for hcd->has_tt. |
127 | */ | 127 | */ |
128 | static int __devinit ehci_hcd_xilinx_of_probe(struct platform_device *op) | 128 | static int ehci_hcd_xilinx_of_probe(struct platform_device *op) |
129 | { | 129 | { |
130 | struct device_node *dn = op->dev.of_node; | 130 | struct device_node *dn = op->dev.of_node; |
131 | struct usb_hcd *hcd; | 131 | struct usb_hcd *hcd; |
diff --git a/drivers/usb/host/ehci-xls.c b/drivers/usb/host/ehci-xls.c deleted file mode 100644 index 8dc6a22d90b8..000000000000 --- a/drivers/usb/host/ehci-xls.c +++ /dev/null | |||
@@ -1,142 +0,0 @@ | |||
1 | /* | ||
2 | * EHCI HCD for Netlogic XLS processors. | ||
3 | * | ||
4 | * (C) Copyright 2011 Netlogic Microsystems Inc. | ||
5 | * | ||
6 | * Based on various ehci-*.c drivers | ||
7 | * | ||
8 | * This file is subject to the terms and conditions of the GNU General Public | ||
9 | * License. See the file COPYING in the main directory of this archive for | ||
10 | * more details. | ||
11 | */ | ||
12 | |||
13 | #include <linux/platform_device.h> | ||
14 | |||
15 | static int ehci_xls_setup(struct usb_hcd *hcd) | ||
16 | { | ||
17 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
18 | |||
19 | ehci->caps = hcd->regs; | ||
20 | |||
21 | return ehci_setup(hcd); | ||
22 | } | ||
23 | |||
24 | int ehci_xls_probe_internal(const struct hc_driver *driver, | ||
25 | struct platform_device *pdev) | ||
26 | { | ||
27 | struct usb_hcd *hcd; | ||
28 | struct resource *res; | ||
29 | int retval, irq; | ||
30 | |||
31 | /* Get our IRQ from an earlier registered Platform Resource */ | ||
32 | irq = platform_get_irq(pdev, 0); | ||
33 | if (irq < 0) { | ||
34 | dev_err(&pdev->dev, "Found HC with no IRQ. Check %s setup!\n", | ||
35 | dev_name(&pdev->dev)); | ||
36 | return -ENODEV; | ||
37 | } | ||
38 | |||
39 | /* Get our Memory Handle */ | ||
40 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
41 | if (!res) { | ||
42 | dev_err(&pdev->dev, "Error: MMIO Handle %s setup!\n", | ||
43 | dev_name(&pdev->dev)); | ||
44 | return -ENODEV; | ||
45 | } | ||
46 | hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); | ||
47 | if (!hcd) { | ||
48 | retval = -ENOMEM; | ||
49 | goto err1; | ||
50 | } | ||
51 | |||
52 | hcd->rsrc_start = res->start; | ||
53 | hcd->rsrc_len = resource_size(res); | ||
54 | |||
55 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, | ||
56 | driver->description)) { | ||
57 | dev_dbg(&pdev->dev, "controller already in use\n"); | ||
58 | retval = -EBUSY; | ||
59 | goto err2; | ||
60 | } | ||
61 | hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len); | ||
62 | |||
63 | if (hcd->regs == NULL) { | ||
64 | dev_dbg(&pdev->dev, "error mapping memory\n"); | ||
65 | retval = -EFAULT; | ||
66 | goto err3; | ||
67 | } | ||
68 | |||
69 | retval = usb_add_hcd(hcd, irq, IRQF_SHARED); | ||
70 | if (retval != 0) | ||
71 | goto err4; | ||
72 | return retval; | ||
73 | |||
74 | err4: | ||
75 | iounmap(hcd->regs); | ||
76 | err3: | ||
77 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
78 | err2: | ||
79 | usb_put_hcd(hcd); | ||
80 | err1: | ||
81 | dev_err(&pdev->dev, "init %s fail, %d\n", dev_name(&pdev->dev), | ||
82 | retval); | ||
83 | return retval; | ||
84 | } | ||
85 | |||
86 | static struct hc_driver ehci_xls_hc_driver = { | ||
87 | .description = hcd_name, | ||
88 | .product_desc = "XLS EHCI Host Controller", | ||
89 | .hcd_priv_size = sizeof(struct ehci_hcd), | ||
90 | .irq = ehci_irq, | ||
91 | .flags = HCD_USB2 | HCD_MEMORY, | ||
92 | .reset = ehci_xls_setup, | ||
93 | .start = ehci_run, | ||
94 | .stop = ehci_stop, | ||
95 | .shutdown = ehci_shutdown, | ||
96 | |||
97 | .urb_enqueue = ehci_urb_enqueue, | ||
98 | .urb_dequeue = ehci_urb_dequeue, | ||
99 | .endpoint_disable = ehci_endpoint_disable, | ||
100 | .endpoint_reset = ehci_endpoint_reset, | ||
101 | |||
102 | .get_frame_number = ehci_get_frame, | ||
103 | |||
104 | .hub_status_data = ehci_hub_status_data, | ||
105 | .hub_control = ehci_hub_control, | ||
106 | .bus_suspend = ehci_bus_suspend, | ||
107 | .bus_resume = ehci_bus_resume, | ||
108 | .relinquish_port = ehci_relinquish_port, | ||
109 | .port_handed_over = ehci_port_handed_over, | ||
110 | |||
111 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
112 | }; | ||
113 | |||
114 | static int ehci_xls_probe(struct platform_device *pdev) | ||
115 | { | ||
116 | if (usb_disabled()) | ||
117 | return -ENODEV; | ||
118 | |||
119 | return ehci_xls_probe_internal(&ehci_xls_hc_driver, pdev); | ||
120 | } | ||
121 | |||
122 | static int ehci_xls_remove(struct platform_device *pdev) | ||
123 | { | ||
124 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
125 | |||
126 | usb_remove_hcd(hcd); | ||
127 | iounmap(hcd->regs); | ||
128 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
129 | usb_put_hcd(hcd); | ||
130 | return 0; | ||
131 | } | ||
132 | |||
133 | MODULE_ALIAS("ehci-xls"); | ||
134 | |||
135 | static struct platform_driver ehci_xls_driver = { | ||
136 | .probe = ehci_xls_probe, | ||
137 | .remove = ehci_xls_remove, | ||
138 | .shutdown = usb_hcd_platform_shutdown, | ||
139 | .driver = { | ||
140 | .name = "ehci-xls", | ||
141 | }, | ||
142 | }; | ||
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index da07d98f7d1d..9dadc7118d68 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
@@ -143,7 +143,7 @@ struct ehci_hcd { /* one per controller */ | |||
143 | struct ehci_qh *intr_unlink_last; | 143 | struct ehci_qh *intr_unlink_last; |
144 | unsigned intr_unlink_cycle; | 144 | unsigned intr_unlink_cycle; |
145 | unsigned now_frame; /* frame from HC hardware */ | 145 | unsigned now_frame; /* frame from HC hardware */ |
146 | unsigned next_frame; /* scan periodic, start here */ | 146 | unsigned last_iso_frame; /* last frame scanned for iso */ |
147 | unsigned intr_count; /* intr activity count */ | 147 | unsigned intr_count; /* intr activity count */ |
148 | unsigned isoc_count; /* isoc activity count */ | 148 | unsigned isoc_count; /* isoc activity count */ |
149 | unsigned periodic_count; /* periodic activity count */ | 149 | unsigned periodic_count; /* periodic activity count */ |
@@ -193,7 +193,6 @@ struct ehci_hcd { /* one per controller */ | |||
193 | unsigned has_amcc_usb23:1; | 193 | unsigned has_amcc_usb23:1; |
194 | unsigned need_io_watchdog:1; | 194 | unsigned need_io_watchdog:1; |
195 | unsigned amd_pll_fix:1; | 195 | unsigned amd_pll_fix:1; |
196 | unsigned fs_i_thresh:1; /* Intel iso scheduling */ | ||
197 | unsigned use_dummy_qh:1; /* AMD Frame List table quirk*/ | 196 | unsigned use_dummy_qh:1; /* AMD Frame List table quirk*/ |
198 | unsigned has_synopsys_hc_bug:1; /* Synopsys HC */ | 197 | unsigned has_synopsys_hc_bug:1; /* Synopsys HC */ |
199 | unsigned frame_index_bug:1; /* MosChip (AKA NetMos) */ | 198 | unsigned frame_index_bug:1; /* MosChip (AKA NetMos) */ |
@@ -207,7 +206,6 @@ struct ehci_hcd { /* one per controller */ | |||
207 | #define OHCI_HCCTRL_LEN 0x4 | 206 | #define OHCI_HCCTRL_LEN 0x4 |
208 | __hc32 *ohci_hcctrl_reg; | 207 | __hc32 *ohci_hcctrl_reg; |
209 | unsigned has_hostpc:1; | 208 | unsigned has_hostpc:1; |
210 | unsigned has_lpm:1; /* support link power management */ | ||
211 | unsigned has_ppcd:1; /* support per-port change bits */ | 209 | unsigned has_ppcd:1; /* support per-port change bits */ |
212 | u8 sbrn; /* packed release number */ | 210 | u8 sbrn; /* packed release number */ |
213 | 211 | ||
@@ -762,26 +760,41 @@ static inline u32 hc32_to_cpup (const struct ehci_hcd *ehci, const __hc32 *x) | |||
762 | 760 | ||
763 | /*-------------------------------------------------------------------------*/ | 761 | /*-------------------------------------------------------------------------*/ |
764 | 762 | ||
765 | #ifdef CONFIG_PCI | 763 | #define ehci_dbg(ehci, fmt, args...) \ |
766 | 764 | dev_dbg(ehci_to_hcd(ehci)->self.controller , fmt , ## args) | |
767 | /* For working around the MosChip frame-index-register bug */ | 765 | #define ehci_err(ehci, fmt, args...) \ |
768 | static unsigned ehci_read_frame_index(struct ehci_hcd *ehci); | 766 | dev_err(ehci_to_hcd(ehci)->self.controller , fmt , ## args) |
769 | 767 | #define ehci_info(ehci, fmt, args...) \ | |
768 | dev_info(ehci_to_hcd(ehci)->self.controller , fmt , ## args) | ||
769 | #define ehci_warn(ehci, fmt, args...) \ | ||
770 | dev_warn(ehci_to_hcd(ehci)->self.controller , fmt , ## args) | ||
771 | |||
772 | #ifdef VERBOSE_DEBUG | ||
773 | # define ehci_vdbg ehci_dbg | ||
770 | #else | 774 | #else |
771 | 775 | static inline void ehci_vdbg(struct ehci_hcd *ehci, ...) {} | |
772 | static inline unsigned ehci_read_frame_index(struct ehci_hcd *ehci) | ||
773 | { | ||
774 | return ehci_readl(ehci, &ehci->regs->frame_index); | ||
775 | } | ||
776 | |||
777 | #endif | 776 | #endif |
778 | 777 | ||
779 | /*-------------------------------------------------------------------------*/ | ||
780 | |||
781 | #ifndef DEBUG | 778 | #ifndef DEBUG |
782 | #define STUB_DEBUG_FILES | 779 | #define STUB_DEBUG_FILES |
783 | #endif /* DEBUG */ | 780 | #endif /* DEBUG */ |
784 | 781 | ||
785 | /*-------------------------------------------------------------------------*/ | 782 | /*-------------------------------------------------------------------------*/ |
786 | 783 | ||
784 | /* Declarations of things exported for use by ehci platform drivers */ | ||
785 | |||
786 | struct ehci_driver_overrides { | ||
787 | size_t extra_priv_size; | ||
788 | int (*reset)(struct usb_hcd *hcd); | ||
789 | }; | ||
790 | |||
791 | extern void ehci_init_driver(struct hc_driver *drv, | ||
792 | const struct ehci_driver_overrides *over); | ||
793 | extern int ehci_setup(struct usb_hcd *hcd); | ||
794 | |||
795 | #ifdef CONFIG_PM | ||
796 | extern int ehci_suspend(struct usb_hcd *hcd, bool do_wakeup); | ||
797 | extern int ehci_resume(struct usb_hcd *hcd, bool hibernated); | ||
798 | #endif /* CONFIG_PM */ | ||
799 | |||
787 | #endif /* __LINUX_EHCI_HCD_H */ | 800 | #endif /* __LINUX_EHCI_HCD_H */ |
diff --git a/drivers/usb/host/fhci-hcd.c b/drivers/usb/host/fhci-hcd.c index 7da1a26bed2e..0b46542591ff 100644 --- a/drivers/usb/host/fhci-hcd.c +++ b/drivers/usb/host/fhci-hcd.c | |||
@@ -561,7 +561,7 @@ static const struct hc_driver fhci_driver = { | |||
561 | .hub_control = fhci_hub_control, | 561 | .hub_control = fhci_hub_control, |
562 | }; | 562 | }; |
563 | 563 | ||
564 | static int __devinit of_fhci_probe(struct platform_device *ofdev) | 564 | static int of_fhci_probe(struct platform_device *ofdev) |
565 | { | 565 | { |
566 | struct device *dev = &ofdev->dev; | 566 | struct device *dev = &ofdev->dev; |
567 | struct device_node *node = dev->of_node; | 567 | struct device_node *node = dev->of_node; |
@@ -780,7 +780,7 @@ err_regs: | |||
780 | return ret; | 780 | return ret; |
781 | } | 781 | } |
782 | 782 | ||
783 | static int __devexit fhci_remove(struct device *dev) | 783 | static int fhci_remove(struct device *dev) |
784 | { | 784 | { |
785 | struct usb_hcd *hcd = dev_get_drvdata(dev); | 785 | struct usb_hcd *hcd = dev_get_drvdata(dev); |
786 | struct fhci_hcd *fhci = hcd_to_fhci(hcd); | 786 | struct fhci_hcd *fhci = hcd_to_fhci(hcd); |
@@ -803,7 +803,7 @@ static int __devexit fhci_remove(struct device *dev) | |||
803 | return 0; | 803 | return 0; |
804 | } | 804 | } |
805 | 805 | ||
806 | static int __devexit of_fhci_remove(struct platform_device *ofdev) | 806 | static int of_fhci_remove(struct platform_device *ofdev) |
807 | { | 807 | { |
808 | return fhci_remove(&ofdev->dev); | 808 | return fhci_remove(&ofdev->dev); |
809 | } | 809 | } |
@@ -821,7 +821,7 @@ static struct platform_driver of_fhci_driver = { | |||
821 | .of_match_table = of_fhci_match, | 821 | .of_match_table = of_fhci_match, |
822 | }, | 822 | }, |
823 | .probe = of_fhci_probe, | 823 | .probe = of_fhci_probe, |
824 | .remove = __devexit_p(of_fhci_remove), | 824 | .remove = of_fhci_remove, |
825 | }; | 825 | }; |
826 | 826 | ||
827 | module_platform_driver(of_fhci_driver); | 827 | module_platform_driver(of_fhci_driver); |
diff --git a/drivers/usb/host/fsl-mph-dr-of.c b/drivers/usb/host/fsl-mph-dr-of.c index 1e771292383f..5105127c1d4b 100644 --- a/drivers/usb/host/fsl-mph-dr-of.c +++ b/drivers/usb/host/fsl-mph-dr-of.c | |||
@@ -24,7 +24,7 @@ struct fsl_usb2_dev_data { | |||
24 | enum fsl_usb2_operating_modes op_mode; /* operating mode */ | 24 | enum fsl_usb2_operating_modes op_mode; /* operating mode */ |
25 | }; | 25 | }; |
26 | 26 | ||
27 | struct fsl_usb2_dev_data dr_mode_data[] __devinitdata = { | 27 | struct fsl_usb2_dev_data dr_mode_data[] = { |
28 | { | 28 | { |
29 | .dr_mode = "host", | 29 | .dr_mode = "host", |
30 | .drivers = { "fsl-ehci", NULL, NULL, }, | 30 | .drivers = { "fsl-ehci", NULL, NULL, }, |
@@ -42,7 +42,7 @@ struct fsl_usb2_dev_data dr_mode_data[] __devinitdata = { | |||
42 | }, | 42 | }, |
43 | }; | 43 | }; |
44 | 44 | ||
45 | struct fsl_usb2_dev_data * __devinit get_dr_mode_data(struct device_node *np) | 45 | struct fsl_usb2_dev_data *get_dr_mode_data(struct device_node *np) |
46 | { | 46 | { |
47 | const unsigned char *prop; | 47 | const unsigned char *prop; |
48 | int i; | 48 | int i; |
@@ -59,7 +59,7 @@ struct fsl_usb2_dev_data * __devinit get_dr_mode_data(struct device_node *np) | |||
59 | return &dr_mode_data[0]; /* mode not specified, use host */ | 59 | return &dr_mode_data[0]; /* mode not specified, use host */ |
60 | } | 60 | } |
61 | 61 | ||
62 | static enum fsl_usb2_phy_modes __devinit determine_usb_phy(const char *phy_type) | 62 | static enum fsl_usb2_phy_modes determine_usb_phy(const char *phy_type) |
63 | { | 63 | { |
64 | if (!phy_type) | 64 | if (!phy_type) |
65 | return FSL_USB2_PHY_NONE; | 65 | return FSL_USB2_PHY_NONE; |
@@ -75,7 +75,7 @@ static enum fsl_usb2_phy_modes __devinit determine_usb_phy(const char *phy_type) | |||
75 | return FSL_USB2_PHY_NONE; | 75 | return FSL_USB2_PHY_NONE; |
76 | } | 76 | } |
77 | 77 | ||
78 | struct platform_device * __devinit fsl_usb2_device_register( | 78 | struct platform_device *fsl_usb2_device_register( |
79 | struct platform_device *ofdev, | 79 | struct platform_device *ofdev, |
80 | struct fsl_usb2_platform_data *pdata, | 80 | struct fsl_usb2_platform_data *pdata, |
81 | const char *name, int id) | 81 | const char *name, int id) |
@@ -154,7 +154,7 @@ static int usb_get_ver_info(struct device_node *np) | |||
154 | return ver; | 154 | return ver; |
155 | } | 155 | } |
156 | 156 | ||
157 | static int __devinit fsl_usb2_mph_dr_of_probe(struct platform_device *ofdev) | 157 | static int fsl_usb2_mph_dr_of_probe(struct platform_device *ofdev) |
158 | { | 158 | { |
159 | struct device_node *np = ofdev->dev.of_node; | 159 | struct device_node *np = ofdev->dev.of_node; |
160 | struct platform_device *usb_dev; | 160 | struct platform_device *usb_dev; |
@@ -224,13 +224,13 @@ static int __devinit fsl_usb2_mph_dr_of_probe(struct platform_device *ofdev) | |||
224 | return 0; | 224 | return 0; |
225 | } | 225 | } |
226 | 226 | ||
227 | static int __devexit __unregister_subdev(struct device *dev, void *d) | 227 | static int __unregister_subdev(struct device *dev, void *d) |
228 | { | 228 | { |
229 | platform_device_unregister(to_platform_device(dev)); | 229 | platform_device_unregister(to_platform_device(dev)); |
230 | return 0; | 230 | return 0; |
231 | } | 231 | } |
232 | 232 | ||
233 | static int __devexit fsl_usb2_mph_dr_of_remove(struct platform_device *ofdev) | 233 | static int fsl_usb2_mph_dr_of_remove(struct platform_device *ofdev) |
234 | { | 234 | { |
235 | device_for_each_child(&ofdev->dev, NULL, __unregister_subdev); | 235 | device_for_each_child(&ofdev->dev, NULL, __unregister_subdev); |
236 | return 0; | 236 | return 0; |
@@ -336,7 +336,7 @@ static struct platform_driver fsl_usb2_mph_dr_driver = { | |||
336 | .of_match_table = fsl_usb2_mph_dr_of_match, | 336 | .of_match_table = fsl_usb2_mph_dr_of_match, |
337 | }, | 337 | }, |
338 | .probe = fsl_usb2_mph_dr_of_probe, | 338 | .probe = fsl_usb2_mph_dr_of_probe, |
339 | .remove = __devexit_p(fsl_usb2_mph_dr_of_remove), | 339 | .remove = fsl_usb2_mph_dr_of_remove, |
340 | }; | 340 | }; |
341 | 341 | ||
342 | module_platform_driver(fsl_usb2_mph_dr_driver); | 342 | module_platform_driver(fsl_usb2_mph_dr_driver); |
diff --git a/drivers/usb/host/imx21-hcd.c b/drivers/usb/host/imx21-hcd.c index f19e2690c232..bd6a7447ccc9 100644 --- a/drivers/usb/host/imx21-hcd.c +++ b/drivers/usb/host/imx21-hcd.c | |||
@@ -1680,7 +1680,7 @@ static int imx21_hc_reset(struct usb_hcd *hcd) | |||
1680 | return 0; | 1680 | return 0; |
1681 | } | 1681 | } |
1682 | 1682 | ||
1683 | static int __devinit imx21_hc_start(struct usb_hcd *hcd) | 1683 | static int imx21_hc_start(struct usb_hcd *hcd) |
1684 | { | 1684 | { |
1685 | struct imx21 *imx21 = hcd_to_imx21(hcd); | 1685 | struct imx21 *imx21 = hcd_to_imx21(hcd); |
1686 | unsigned long flags; | 1686 | unsigned long flags; |
diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c index 9e65e3091c8a..b64e661618bb 100644 --- a/drivers/usb/host/isp116x-hcd.c +++ b/drivers/usb/host/isp116x-hcd.c | |||
@@ -1557,7 +1557,7 @@ static int isp116x_remove(struct platform_device *pdev) | |||
1557 | return 0; | 1557 | return 0; |
1558 | } | 1558 | } |
1559 | 1559 | ||
1560 | static int __devinit isp116x_probe(struct platform_device *pdev) | 1560 | static int isp116x_probe(struct platform_device *pdev) |
1561 | { | 1561 | { |
1562 | struct usb_hcd *hcd; | 1562 | struct usb_hcd *hcd; |
1563 | struct isp116x *isp116x; | 1563 | struct isp116x *isp116x; |
diff --git a/drivers/usb/host/isp1362-hcd.c b/drivers/usb/host/isp1362-hcd.c index 256326322cfd..974480c516fa 100644 --- a/drivers/usb/host/isp1362-hcd.c +++ b/drivers/usb/host/isp1362-hcd.c | |||
@@ -2645,7 +2645,7 @@ static struct hc_driver isp1362_hc_driver = { | |||
2645 | 2645 | ||
2646 | /*-------------------------------------------------------------------------*/ | 2646 | /*-------------------------------------------------------------------------*/ |
2647 | 2647 | ||
2648 | static int __devexit isp1362_remove(struct platform_device *pdev) | 2648 | static int isp1362_remove(struct platform_device *pdev) |
2649 | { | 2649 | { |
2650 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | 2650 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
2651 | struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); | 2651 | struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd); |
@@ -2680,7 +2680,7 @@ static int __devexit isp1362_remove(struct platform_device *pdev) | |||
2680 | return 0; | 2680 | return 0; |
2681 | } | 2681 | } |
2682 | 2682 | ||
2683 | static int __devinit isp1362_probe(struct platform_device *pdev) | 2683 | static int isp1362_probe(struct platform_device *pdev) |
2684 | { | 2684 | { |
2685 | struct usb_hcd *hcd; | 2685 | struct usb_hcd *hcd; |
2686 | struct isp1362_hcd *isp1362_hcd; | 2686 | struct isp1362_hcd *isp1362_hcd; |
@@ -2856,7 +2856,7 @@ static int isp1362_resume(struct platform_device *pdev) | |||
2856 | 2856 | ||
2857 | static struct platform_driver isp1362_driver = { | 2857 | static struct platform_driver isp1362_driver = { |
2858 | .probe = isp1362_probe, | 2858 | .probe = isp1362_probe, |
2859 | .remove = __devexit_p(isp1362_remove), | 2859 | .remove = isp1362_remove, |
2860 | 2860 | ||
2861 | .suspend = isp1362_suspend, | 2861 | .suspend = isp1362_suspend, |
2862 | .resume = isp1362_resume, | 2862 | .resume = isp1362_resume, |
diff --git a/drivers/usb/host/isp1760-if.c b/drivers/usb/host/isp1760-if.c index fff114fd5461..bbb791bd7617 100644 --- a/drivers/usb/host/isp1760-if.c +++ b/drivers/usb/host/isp1760-if.c | |||
@@ -43,7 +43,6 @@ static int of_isp1760_probe(struct platform_device *dev) | |||
43 | struct device_node *dp = dev->dev.of_node; | 43 | struct device_node *dp = dev->dev.of_node; |
44 | struct resource *res; | 44 | struct resource *res; |
45 | struct resource memory; | 45 | struct resource memory; |
46 | struct of_irq oirq; | ||
47 | int virq; | 46 | int virq; |
48 | resource_size_t res_len; | 47 | resource_size_t res_len; |
49 | int ret; | 48 | int ret; |
@@ -69,14 +68,12 @@ static int of_isp1760_probe(struct platform_device *dev) | |||
69 | goto free_data; | 68 | goto free_data; |
70 | } | 69 | } |
71 | 70 | ||
72 | if (of_irq_map_one(dp, 0, &oirq)) { | 71 | virq = irq_of_parse_and_map(dp, 0); |
72 | if (!virq) { | ||
73 | ret = -ENODEV; | 73 | ret = -ENODEV; |
74 | goto release_reg; | 74 | goto release_reg; |
75 | } | 75 | } |
76 | 76 | ||
77 | virq = irq_create_of_mapping(oirq.controller, oirq.specifier, | ||
78 | oirq.size); | ||
79 | |||
80 | if (of_device_is_compatible(dp, "nxp,usb-isp1761")) | 77 | if (of_device_is_compatible(dp, "nxp,usb-isp1761")) |
81 | devflags |= ISP1760_FLAG_ISP1761; | 78 | devflags |= ISP1760_FLAG_ISP1761; |
82 | 79 | ||
@@ -175,7 +172,7 @@ static struct platform_driver isp1760_of_driver = { | |||
175 | #endif | 172 | #endif |
176 | 173 | ||
177 | #ifdef CONFIG_PCI | 174 | #ifdef CONFIG_PCI |
178 | static int __devinit isp1761_pci_probe(struct pci_dev *dev, | 175 | static int isp1761_pci_probe(struct pci_dev *dev, |
179 | const struct pci_device_id *id) | 176 | const struct pci_device_id *id) |
180 | { | 177 | { |
181 | u8 latency, limit; | 178 | u8 latency, limit; |
@@ -349,7 +346,7 @@ static struct pci_driver isp1761_pci_driver = { | |||
349 | }; | 346 | }; |
350 | #endif | 347 | #endif |
351 | 348 | ||
352 | static int __devinit isp1760_plat_probe(struct platform_device *pdev) | 349 | static int isp1760_plat_probe(struct platform_device *pdev) |
353 | { | 350 | { |
354 | int ret = 0; | 351 | int ret = 0; |
355 | struct usb_hcd *hcd; | 352 | struct usb_hcd *hcd; |
@@ -416,7 +413,7 @@ out: | |||
416 | return ret; | 413 | return ret; |
417 | } | 414 | } |
418 | 415 | ||
419 | static int __devexit isp1760_plat_remove(struct platform_device *pdev) | 416 | static int isp1760_plat_remove(struct platform_device *pdev) |
420 | { | 417 | { |
421 | struct resource *mem_res; | 418 | struct resource *mem_res; |
422 | resource_size_t mem_size; | 419 | resource_size_t mem_size; |
@@ -435,7 +432,7 @@ static int __devexit isp1760_plat_remove(struct platform_device *pdev) | |||
435 | 432 | ||
436 | static struct platform_driver isp1760_plat_driver = { | 433 | static struct platform_driver isp1760_plat_driver = { |
437 | .probe = isp1760_plat_probe, | 434 | .probe = isp1760_plat_probe, |
438 | .remove = __devexit_p(isp1760_plat_remove), | 435 | .remove = isp1760_plat_remove, |
439 | .driver = { | 436 | .driver = { |
440 | .name = "isp1760", | 437 | .name = "isp1760", |
441 | }, | 438 | }, |
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index 0bf72f943b00..221850a8c25f 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c | |||
@@ -94,7 +94,7 @@ static void at91_stop_hc(struct platform_device *pdev) | |||
94 | 94 | ||
95 | /*-------------------------------------------------------------------------*/ | 95 | /*-------------------------------------------------------------------------*/ |
96 | 96 | ||
97 | static void __devexit usb_hcd_at91_remove (struct usb_hcd *, struct platform_device *); | 97 | static void usb_hcd_at91_remove (struct usb_hcd *, struct platform_device *); |
98 | 98 | ||
99 | /* configure so an HC device and id are always provided */ | 99 | /* configure so an HC device and id are always provided */ |
100 | /* always called with process context; sleeping is OK */ | 100 | /* always called with process context; sleeping is OK */ |
@@ -108,7 +108,7 @@ static void __devexit usb_hcd_at91_remove (struct usb_hcd *, struct platform_dev | |||
108 | * then invokes the start() method for the HCD associated with it | 108 | * then invokes the start() method for the HCD associated with it |
109 | * through the hotplug entry's driver_data. | 109 | * through the hotplug entry's driver_data. |
110 | */ | 110 | */ |
111 | static int __devinit usb_hcd_at91_probe(const struct hc_driver *driver, | 111 | static int usb_hcd_at91_probe(const struct hc_driver *driver, |
112 | struct platform_device *pdev) | 112 | struct platform_device *pdev) |
113 | { | 113 | { |
114 | int retval; | 114 | int retval; |
@@ -203,7 +203,7 @@ static int __devinit usb_hcd_at91_probe(const struct hc_driver *driver, | |||
203 | * context, "rmmod" or something similar. | 203 | * context, "rmmod" or something similar. |
204 | * | 204 | * |
205 | */ | 205 | */ |
206 | static void __devexit usb_hcd_at91_remove(struct usb_hcd *hcd, | 206 | static void usb_hcd_at91_remove(struct usb_hcd *hcd, |
207 | struct platform_device *pdev) | 207 | struct platform_device *pdev) |
208 | { | 208 | { |
209 | usb_remove_hcd(hcd); | 209 | usb_remove_hcd(hcd); |
@@ -222,7 +222,7 @@ static void __devexit usb_hcd_at91_remove(struct usb_hcd *hcd, | |||
222 | 222 | ||
223 | /*-------------------------------------------------------------------------*/ | 223 | /*-------------------------------------------------------------------------*/ |
224 | 224 | ||
225 | static int __devinit | 225 | static int |
226 | ohci_at91_reset (struct usb_hcd *hcd) | 226 | ohci_at91_reset (struct usb_hcd *hcd) |
227 | { | 227 | { |
228 | struct at91_usbh_data *board = hcd->self.controller->platform_data; | 228 | struct at91_usbh_data *board = hcd->self.controller->platform_data; |
@@ -236,7 +236,7 @@ ohci_at91_reset (struct usb_hcd *hcd) | |||
236 | return 0; | 236 | return 0; |
237 | } | 237 | } |
238 | 238 | ||
239 | static int __devinit | 239 | static int |
240 | ohci_at91_start (struct usb_hcd *hcd) | 240 | ohci_at91_start (struct usb_hcd *hcd) |
241 | { | 241 | { |
242 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 242 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
@@ -506,7 +506,7 @@ MODULE_DEVICE_TABLE(of, at91_ohci_dt_ids); | |||
506 | 506 | ||
507 | static u64 at91_ohci_dma_mask = DMA_BIT_MASK(32); | 507 | static u64 at91_ohci_dma_mask = DMA_BIT_MASK(32); |
508 | 508 | ||
509 | static int __devinit ohci_at91_of_init(struct platform_device *pdev) | 509 | static int ohci_at91_of_init(struct platform_device *pdev) |
510 | { | 510 | { |
511 | struct device_node *np = pdev->dev.of_node; | 511 | struct device_node *np = pdev->dev.of_node; |
512 | int i, gpio; | 512 | int i, gpio; |
@@ -548,7 +548,7 @@ static int __devinit ohci_at91_of_init(struct platform_device *pdev) | |||
548 | return 0; | 548 | return 0; |
549 | } | 549 | } |
550 | #else | 550 | #else |
551 | static int __devinit ohci_at91_of_init(struct platform_device *pdev) | 551 | static int ohci_at91_of_init(struct platform_device *pdev) |
552 | { | 552 | { |
553 | return 0; | 553 | return 0; |
554 | } | 554 | } |
@@ -556,7 +556,7 @@ static int __devinit ohci_at91_of_init(struct platform_device *pdev) | |||
556 | 556 | ||
557 | /*-------------------------------------------------------------------------*/ | 557 | /*-------------------------------------------------------------------------*/ |
558 | 558 | ||
559 | static int __devinit ohci_hcd_at91_drv_probe(struct platform_device *pdev) | 559 | static int ohci_hcd_at91_drv_probe(struct platform_device *pdev) |
560 | { | 560 | { |
561 | struct at91_usbh_data *pdata; | 561 | struct at91_usbh_data *pdata; |
562 | int i; | 562 | int i; |
@@ -641,7 +641,7 @@ static int __devinit ohci_hcd_at91_drv_probe(struct platform_device *pdev) | |||
641 | return usb_hcd_at91_probe(&ohci_at91_hc_driver, pdev); | 641 | return usb_hcd_at91_probe(&ohci_at91_hc_driver, pdev); |
642 | } | 642 | } |
643 | 643 | ||
644 | static int __devexit ohci_hcd_at91_drv_remove(struct platform_device *pdev) | 644 | static int ohci_hcd_at91_drv_remove(struct platform_device *pdev) |
645 | { | 645 | { |
646 | struct at91_usbh_data *pdata = pdev->dev.platform_data; | 646 | struct at91_usbh_data *pdata = pdev->dev.platform_data; |
647 | int i; | 647 | int i; |
@@ -705,7 +705,7 @@ static int ohci_hcd_at91_drv_resume(struct platform_device *pdev) | |||
705 | if (!clocked) | 705 | if (!clocked) |
706 | at91_start_clock(); | 706 | at91_start_clock(); |
707 | 707 | ||
708 | ohci_finish_controller_resume(hcd); | 708 | ohci_resume(hcd, false); |
709 | return 0; | 709 | return 0; |
710 | } | 710 | } |
711 | #else | 711 | #else |
@@ -717,7 +717,7 @@ MODULE_ALIAS("platform:at91_ohci"); | |||
717 | 717 | ||
718 | static struct platform_driver ohci_hcd_at91_driver = { | 718 | static struct platform_driver ohci_hcd_at91_driver = { |
719 | .probe = ohci_hcd_at91_drv_probe, | 719 | .probe = ohci_hcd_at91_drv_probe, |
720 | .remove = __devexit_p(ohci_hcd_at91_drv_remove), | 720 | .remove = ohci_hcd_at91_drv_remove, |
721 | .shutdown = usb_hcd_platform_shutdown, | 721 | .shutdown = usb_hcd_platform_shutdown, |
722 | .suspend = ohci_hcd_at91_drv_suspend, | 722 | .suspend = ohci_hcd_at91_drv_suspend, |
723 | .resume = ohci_hcd_at91_drv_resume, | 723 | .resume = ohci_hcd_at91_drv_resume, |
diff --git a/drivers/usb/host/ohci-au1xxx.c b/drivers/usb/host/ohci-au1xxx.c deleted file mode 100644 index c611699b4aa6..000000000000 --- a/drivers/usb/host/ohci-au1xxx.c +++ /dev/null | |||
@@ -1,234 +0,0 @@ | |||
1 | /* | ||
2 | * OHCI HCD (Host Controller Driver) for USB. | ||
3 | * | ||
4 | * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at> | ||
5 | * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net> | ||
6 | * (C) Copyright 2002 Hewlett-Packard Company | ||
7 | * | ||
8 | * Bus Glue for AMD Alchemy Au1xxx | ||
9 | * | ||
10 | * Written by Christopher Hoover <ch@hpl.hp.com> | ||
11 | * Based on fragments of previous driver by Russell King et al. | ||
12 | * | ||
13 | * Modified for LH7A404 from ohci-sa1111.c | ||
14 | * by Durgesh Pattamatta <pattamattad@sharpsec.com> | ||
15 | * Modified for AMD Alchemy Au1xxx | ||
16 | * by Matt Porter <mporter@kernel.crashing.org> | ||
17 | * | ||
18 | * This file is licenced under the GPL. | ||
19 | */ | ||
20 | |||
21 | #include <linux/platform_device.h> | ||
22 | #include <linux/signal.h> | ||
23 | |||
24 | #include <asm/mach-au1x00/au1000.h> | ||
25 | |||
26 | |||
27 | extern int usb_disabled(void); | ||
28 | |||
29 | static int __devinit ohci_au1xxx_start(struct usb_hcd *hcd) | ||
30 | { | ||
31 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
32 | int ret; | ||
33 | |||
34 | ohci_dbg(ohci, "ohci_au1xxx_start, ohci:%p", ohci); | ||
35 | |||
36 | if ((ret = ohci_init(ohci)) < 0) | ||
37 | return ret; | ||
38 | |||
39 | if ((ret = ohci_run(ohci)) < 0) { | ||
40 | dev_err(hcd->self.controller, "can't start %s", | ||
41 | hcd->self.bus_name); | ||
42 | ohci_stop(hcd); | ||
43 | return ret; | ||
44 | } | ||
45 | |||
46 | return 0; | ||
47 | } | ||
48 | |||
49 | static const struct hc_driver ohci_au1xxx_hc_driver = { | ||
50 | .description = hcd_name, | ||
51 | .product_desc = "Au1xxx OHCI", | ||
52 | .hcd_priv_size = sizeof(struct ohci_hcd), | ||
53 | |||
54 | /* | ||
55 | * generic hardware linkage | ||
56 | */ | ||
57 | .irq = ohci_irq, | ||
58 | .flags = HCD_USB11 | HCD_MEMORY, | ||
59 | |||
60 | /* | ||
61 | * basic lifecycle operations | ||
62 | */ | ||
63 | .start = ohci_au1xxx_start, | ||
64 | .stop = ohci_stop, | ||
65 | .shutdown = ohci_shutdown, | ||
66 | |||
67 | /* | ||
68 | * managing i/o requests and associated device resources | ||
69 | */ | ||
70 | .urb_enqueue = ohci_urb_enqueue, | ||
71 | .urb_dequeue = ohci_urb_dequeue, | ||
72 | .endpoint_disable = ohci_endpoint_disable, | ||
73 | |||
74 | /* | ||
75 | * scheduling support | ||
76 | */ | ||
77 | .get_frame_number = ohci_get_frame, | ||
78 | |||
79 | /* | ||
80 | * root hub support | ||
81 | */ | ||
82 | .hub_status_data = ohci_hub_status_data, | ||
83 | .hub_control = ohci_hub_control, | ||
84 | #ifdef CONFIG_PM | ||
85 | .bus_suspend = ohci_bus_suspend, | ||
86 | .bus_resume = ohci_bus_resume, | ||
87 | #endif | ||
88 | .start_port_reset = ohci_start_port_reset, | ||
89 | }; | ||
90 | |||
91 | static int ohci_hcd_au1xxx_drv_probe(struct platform_device *pdev) | ||
92 | { | ||
93 | int ret, unit; | ||
94 | struct usb_hcd *hcd; | ||
95 | |||
96 | if (usb_disabled()) | ||
97 | return -ENODEV; | ||
98 | |||
99 | if (pdev->resource[1].flags != IORESOURCE_IRQ) { | ||
100 | pr_debug("resource[1] is not IORESOURCE_IRQ\n"); | ||
101 | return -ENOMEM; | ||
102 | } | ||
103 | |||
104 | hcd = usb_create_hcd(&ohci_au1xxx_hc_driver, &pdev->dev, "au1xxx"); | ||
105 | if (!hcd) | ||
106 | return -ENOMEM; | ||
107 | |||
108 | hcd->rsrc_start = pdev->resource[0].start; | ||
109 | hcd->rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1; | ||
110 | |||
111 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | ||
112 | pr_debug("request_mem_region failed\n"); | ||
113 | ret = -EBUSY; | ||
114 | goto err1; | ||
115 | } | ||
116 | |||
117 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | ||
118 | if (!hcd->regs) { | ||
119 | pr_debug("ioremap failed\n"); | ||
120 | ret = -ENOMEM; | ||
121 | goto err2; | ||
122 | } | ||
123 | |||
124 | unit = (hcd->rsrc_start == AU1300_USB_OHCI1_PHYS_ADDR) ? | ||
125 | ALCHEMY_USB_OHCI1 : ALCHEMY_USB_OHCI0; | ||
126 | if (alchemy_usb_control(unit, 1)) { | ||
127 | printk(KERN_INFO "%s: controller init failed!\n", pdev->name); | ||
128 | ret = -ENODEV; | ||
129 | goto err3; | ||
130 | } | ||
131 | |||
132 | ohci_hcd_init(hcd_to_ohci(hcd)); | ||
133 | |||
134 | ret = usb_add_hcd(hcd, pdev->resource[1].start, | ||
135 | IRQF_SHARED); | ||
136 | if (ret == 0) { | ||
137 | platform_set_drvdata(pdev, hcd); | ||
138 | return ret; | ||
139 | } | ||
140 | |||
141 | alchemy_usb_control(unit, 0); | ||
142 | err3: | ||
143 | iounmap(hcd->regs); | ||
144 | err2: | ||
145 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
146 | err1: | ||
147 | usb_put_hcd(hcd); | ||
148 | return ret; | ||
149 | } | ||
150 | |||
151 | static int ohci_hcd_au1xxx_drv_remove(struct platform_device *pdev) | ||
152 | { | ||
153 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
154 | int unit; | ||
155 | |||
156 | unit = (hcd->rsrc_start == AU1300_USB_OHCI1_PHYS_ADDR) ? | ||
157 | ALCHEMY_USB_OHCI1 : ALCHEMY_USB_OHCI0; | ||
158 | usb_remove_hcd(hcd); | ||
159 | alchemy_usb_control(unit, 0); | ||
160 | iounmap(hcd->regs); | ||
161 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
162 | usb_put_hcd(hcd); | ||
163 | platform_set_drvdata(pdev, NULL); | ||
164 | |||
165 | return 0; | ||
166 | } | ||
167 | |||
168 | #ifdef CONFIG_PM | ||
169 | static int ohci_hcd_au1xxx_drv_suspend(struct device *dev) | ||
170 | { | ||
171 | struct usb_hcd *hcd = dev_get_drvdata(dev); | ||
172 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
173 | unsigned long flags; | ||
174 | int rc; | ||
175 | |||
176 | rc = 0; | ||
177 | |||
178 | /* Root hub was already suspended. Disable irq emission and | ||
179 | * mark HW unaccessible, bail out if RH has been resumed. Use | ||
180 | * the spinlock to properly synchronize with possible pending | ||
181 | * RH suspend or resume activity. | ||
182 | */ | ||
183 | spin_lock_irqsave(&ohci->lock, flags); | ||
184 | if (ohci->rh_state != OHCI_RH_SUSPENDED) { | ||
185 | rc = -EINVAL; | ||
186 | goto bail; | ||
187 | } | ||
188 | ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable); | ||
189 | (void)ohci_readl(ohci, &ohci->regs->intrdisable); | ||
190 | |||
191 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | ||
192 | |||
193 | alchemy_usb_control(ALCHEMY_USB_OHCI0, 0); | ||
194 | bail: | ||
195 | spin_unlock_irqrestore(&ohci->lock, flags); | ||
196 | |||
197 | return rc; | ||
198 | } | ||
199 | |||
200 | static int ohci_hcd_au1xxx_drv_resume(struct device *dev) | ||
201 | { | ||
202 | struct usb_hcd *hcd = dev_get_drvdata(dev); | ||
203 | |||
204 | alchemy_usb_control(ALCHEMY_USB_OHCI0, 1); | ||
205 | |||
206 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | ||
207 | ohci_finish_controller_resume(hcd); | ||
208 | |||
209 | return 0; | ||
210 | } | ||
211 | |||
212 | static const struct dev_pm_ops au1xxx_ohci_pmops = { | ||
213 | .suspend = ohci_hcd_au1xxx_drv_suspend, | ||
214 | .resume = ohci_hcd_au1xxx_drv_resume, | ||
215 | }; | ||
216 | |||
217 | #define AU1XXX_OHCI_PMOPS &au1xxx_ohci_pmops | ||
218 | |||
219 | #else | ||
220 | #define AU1XXX_OHCI_PMOPS NULL | ||
221 | #endif | ||
222 | |||
223 | static struct platform_driver ohci_hcd_au1xxx_driver = { | ||
224 | .probe = ohci_hcd_au1xxx_drv_probe, | ||
225 | .remove = ohci_hcd_au1xxx_drv_remove, | ||
226 | .shutdown = usb_hcd_platform_shutdown, | ||
227 | .driver = { | ||
228 | .name = "au1xxx-ohci", | ||
229 | .owner = THIS_MODULE, | ||
230 | .pm = AU1XXX_OHCI_PMOPS, | ||
231 | }, | ||
232 | }; | ||
233 | |||
234 | MODULE_ALIAS("platform:au1xxx-ohci"); | ||
diff --git a/drivers/usb/host/ohci-cns3xxx.c b/drivers/usb/host/ohci-cns3xxx.c deleted file mode 100644 index 2c9f233047be..000000000000 --- a/drivers/usb/host/ohci-cns3xxx.c +++ /dev/null | |||
@@ -1,166 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2008 Cavium Networks | ||
3 | * | ||
4 | * This file is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License, Version 2, as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | #include <linux/platform_device.h> | ||
10 | #include <linux/atomic.h> | ||
11 | #include <mach/cns3xxx.h> | ||
12 | #include <mach/pm.h> | ||
13 | |||
14 | static int __devinit | ||
15 | cns3xxx_ohci_start(struct usb_hcd *hcd) | ||
16 | { | ||
17 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
18 | int ret; | ||
19 | |||
20 | /* | ||
21 | * EHCI and OHCI share the same clock and power, | ||
22 | * resetting twice would cause the 1st controller been reset. | ||
23 | * Therefore only do power up at the first up device, and | ||
24 | * power down at the last down device. | ||
25 | * | ||
26 | * Set USB AHB INCR length to 16 | ||
27 | */ | ||
28 | if (atomic_inc_return(&usb_pwr_ref) == 1) { | ||
29 | cns3xxx_pwr_power_up(1 << PM_PLL_HM_PD_CTRL_REG_OFFSET_PLL_USB); | ||
30 | cns3xxx_pwr_clk_en(1 << PM_CLK_GATE_REG_OFFSET_USB_HOST); | ||
31 | cns3xxx_pwr_soft_rst(1 << PM_SOFT_RST_REG_OFFST_USB_HOST); | ||
32 | __raw_writel((__raw_readl(MISC_CHIP_CONFIG_REG) | (0X2 << 24)), | ||
33 | MISC_CHIP_CONFIG_REG); | ||
34 | } | ||
35 | |||
36 | ret = ohci_init(ohci); | ||
37 | if (ret < 0) | ||
38 | return ret; | ||
39 | |||
40 | ohci->num_ports = 1; | ||
41 | |||
42 | ret = ohci_run(ohci); | ||
43 | if (ret < 0) { | ||
44 | dev_err(hcd->self.controller, "can't start %s\n", | ||
45 | hcd->self.bus_name); | ||
46 | ohci_stop(hcd); | ||
47 | return ret; | ||
48 | } | ||
49 | return 0; | ||
50 | } | ||
51 | |||
52 | static const struct hc_driver cns3xxx_ohci_hc_driver = { | ||
53 | .description = hcd_name, | ||
54 | .product_desc = "CNS3XXX OHCI Host controller", | ||
55 | .hcd_priv_size = sizeof(struct ohci_hcd), | ||
56 | .irq = ohci_irq, | ||
57 | .flags = HCD_USB11 | HCD_MEMORY, | ||
58 | .start = cns3xxx_ohci_start, | ||
59 | .stop = ohci_stop, | ||
60 | .shutdown = ohci_shutdown, | ||
61 | .urb_enqueue = ohci_urb_enqueue, | ||
62 | .urb_dequeue = ohci_urb_dequeue, | ||
63 | .endpoint_disable = ohci_endpoint_disable, | ||
64 | .get_frame_number = ohci_get_frame, | ||
65 | .hub_status_data = ohci_hub_status_data, | ||
66 | .hub_control = ohci_hub_control, | ||
67 | #ifdef CONFIG_PM | ||
68 | .bus_suspend = ohci_bus_suspend, | ||
69 | .bus_resume = ohci_bus_resume, | ||
70 | #endif | ||
71 | .start_port_reset = ohci_start_port_reset, | ||
72 | }; | ||
73 | |||
74 | static int cns3xxx_ohci_probe(struct platform_device *pdev) | ||
75 | { | ||
76 | struct device *dev = &pdev->dev; | ||
77 | struct usb_hcd *hcd; | ||
78 | const struct hc_driver *driver = &cns3xxx_ohci_hc_driver; | ||
79 | struct resource *res; | ||
80 | int irq; | ||
81 | int retval; | ||
82 | |||
83 | if (usb_disabled()) | ||
84 | return -ENODEV; | ||
85 | |||
86 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
87 | if (!res) { | ||
88 | dev_err(dev, "Found HC with no IRQ.\n"); | ||
89 | return -ENODEV; | ||
90 | } | ||
91 | irq = res->start; | ||
92 | |||
93 | hcd = usb_create_hcd(driver, dev, dev_name(dev)); | ||
94 | if (!hcd) | ||
95 | return -ENOMEM; | ||
96 | |||
97 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
98 | if (!res) { | ||
99 | dev_err(dev, "Found HC with no register addr.\n"); | ||
100 | retval = -ENODEV; | ||
101 | goto err1; | ||
102 | } | ||
103 | hcd->rsrc_start = res->start; | ||
104 | hcd->rsrc_len = resource_size(res); | ||
105 | |||
106 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, | ||
107 | driver->description)) { | ||
108 | dev_dbg(dev, "controller already in use\n"); | ||
109 | retval = -EBUSY; | ||
110 | goto err1; | ||
111 | } | ||
112 | |||
113 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | ||
114 | if (!hcd->regs) { | ||
115 | dev_dbg(dev, "error mapping memory\n"); | ||
116 | retval = -EFAULT; | ||
117 | goto err2; | ||
118 | } | ||
119 | |||
120 | ohci_hcd_init(hcd_to_ohci(hcd)); | ||
121 | |||
122 | retval = usb_add_hcd(hcd, irq, IRQF_SHARED); | ||
123 | if (retval == 0) | ||
124 | return retval; | ||
125 | |||
126 | iounmap(hcd->regs); | ||
127 | err2: | ||
128 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
129 | err1: | ||
130 | usb_put_hcd(hcd); | ||
131 | return retval; | ||
132 | } | ||
133 | |||
134 | static int cns3xxx_ohci_remove(struct platform_device *pdev) | ||
135 | { | ||
136 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
137 | |||
138 | usb_remove_hcd(hcd); | ||
139 | iounmap(hcd->regs); | ||
140 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
141 | |||
142 | /* | ||
143 | * EHCI and OHCI share the same clock and power, | ||
144 | * resetting twice would cause the 1st controller been reset. | ||
145 | * Therefore only do power up at the first up device, and | ||
146 | * power down at the last down device. | ||
147 | */ | ||
148 | if (atomic_dec_return(&usb_pwr_ref) == 0) | ||
149 | cns3xxx_pwr_clk_dis(1 << PM_CLK_GATE_REG_OFFSET_USB_HOST); | ||
150 | |||
151 | usb_put_hcd(hcd); | ||
152 | |||
153 | platform_set_drvdata(pdev, NULL); | ||
154 | |||
155 | return 0; | ||
156 | } | ||
157 | |||
158 | MODULE_ALIAS("platform:cns3xxx-ohci"); | ||
159 | |||
160 | static struct platform_driver ohci_hcd_cns3xxx_driver = { | ||
161 | .probe = cns3xxx_ohci_probe, | ||
162 | .remove = cns3xxx_ohci_remove, | ||
163 | .driver = { | ||
164 | .name = "cns3xxx-ohci", | ||
165 | }, | ||
166 | }; | ||
diff --git a/drivers/usb/host/ohci-ep93xx.c b/drivers/usb/host/ohci-ep93xx.c index dbfbd1dfd2e2..8704e9fa5a80 100644 --- a/drivers/usb/host/ohci-ep93xx.c +++ b/drivers/usb/host/ohci-ep93xx.c | |||
@@ -107,7 +107,7 @@ static void usb_hcd_ep93xx_remove(struct usb_hcd *hcd, | |||
107 | usb_put_hcd(hcd); | 107 | usb_put_hcd(hcd); |
108 | } | 108 | } |
109 | 109 | ||
110 | static int __devinit ohci_ep93xx_start(struct usb_hcd *hcd) | 110 | static int ohci_ep93xx_start(struct usb_hcd *hcd) |
111 | { | 111 | { |
112 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | 112 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
113 | int ret; | 113 | int ret; |
@@ -194,7 +194,7 @@ static int ohci_hcd_ep93xx_drv_resume(struct platform_device *pdev) | |||
194 | 194 | ||
195 | ep93xx_start_hc(&pdev->dev); | 195 | ep93xx_start_hc(&pdev->dev); |
196 | 196 | ||
197 | ohci_finish_controller_resume(hcd); | 197 | ohci_resume(hcd, false); |
198 | return 0; | 198 | return 0; |
199 | } | 199 | } |
200 | #endif | 200 | #endif |
diff --git a/drivers/usb/host/ohci-exynos.c b/drivers/usb/host/ohci-exynos.c index 20a50081f922..aa3b8844bb9f 100644 --- a/drivers/usb/host/ohci-exynos.c +++ b/drivers/usb/host/ohci-exynos.c | |||
@@ -23,6 +23,11 @@ struct exynos_ohci_hcd { | |||
23 | struct clk *clk; | 23 | struct clk *clk; |
24 | }; | 24 | }; |
25 | 25 | ||
26 | static int ohci_exynos_reset(struct usb_hcd *hcd) | ||
27 | { | ||
28 | return ohci_init(hcd_to_ohci(hcd)); | ||
29 | } | ||
30 | |||
26 | static int ohci_exynos_start(struct usb_hcd *hcd) | 31 | static int ohci_exynos_start(struct usb_hcd *hcd) |
27 | { | 32 | { |
28 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | 33 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
@@ -30,10 +35,6 @@ static int ohci_exynos_start(struct usb_hcd *hcd) | |||
30 | 35 | ||
31 | ohci_dbg(ohci, "ohci_exynos_start, ohci:%p", ohci); | 36 | ohci_dbg(ohci, "ohci_exynos_start, ohci:%p", ohci); |
32 | 37 | ||
33 | ret = ohci_init(ohci); | ||
34 | if (ret < 0) | ||
35 | return ret; | ||
36 | |||
37 | ret = ohci_run(ohci); | 38 | ret = ohci_run(ohci); |
38 | if (ret < 0) { | 39 | if (ret < 0) { |
39 | dev_err(hcd->self.controller, "can't start %s\n", | 40 | dev_err(hcd->self.controller, "can't start %s\n", |
@@ -53,6 +54,7 @@ static const struct hc_driver exynos_ohci_hc_driver = { | |||
53 | .irq = ohci_irq, | 54 | .irq = ohci_irq, |
54 | .flags = HCD_MEMORY|HCD_USB11, | 55 | .flags = HCD_MEMORY|HCD_USB11, |
55 | 56 | ||
57 | .reset = ohci_exynos_reset, | ||
56 | .start = ohci_exynos_start, | 58 | .start = ohci_exynos_start, |
57 | .stop = ohci_stop, | 59 | .stop = ohci_stop, |
58 | .shutdown = ohci_shutdown, | 60 | .shutdown = ohci_shutdown, |
@@ -74,7 +76,7 @@ static const struct hc_driver exynos_ohci_hc_driver = { | |||
74 | 76 | ||
75 | static u64 ohci_exynos_dma_mask = DMA_BIT_MASK(32); | 77 | static u64 ohci_exynos_dma_mask = DMA_BIT_MASK(32); |
76 | 78 | ||
77 | static int __devinit exynos_ohci_probe(struct platform_device *pdev) | 79 | static int exynos_ohci_probe(struct platform_device *pdev) |
78 | { | 80 | { |
79 | struct exynos4_ohci_platdata *pdata; | 81 | struct exynos4_ohci_platdata *pdata; |
80 | struct exynos_ohci_hcd *exynos_ohci; | 82 | struct exynos_ohci_hcd *exynos_ohci; |
@@ -115,7 +117,7 @@ static int __devinit exynos_ohci_probe(struct platform_device *pdev) | |||
115 | } | 117 | } |
116 | 118 | ||
117 | exynos_ohci->hcd = hcd; | 119 | exynos_ohci->hcd = hcd; |
118 | exynos_ohci->clk = clk_get(&pdev->dev, "usbhost"); | 120 | exynos_ohci->clk = devm_clk_get(&pdev->dev, "usbhost"); |
119 | 121 | ||
120 | if (IS_ERR(exynos_ohci->clk)) { | 122 | if (IS_ERR(exynos_ohci->clk)) { |
121 | dev_err(&pdev->dev, "Failed to get usbhost clock\n"); | 123 | dev_err(&pdev->dev, "Failed to get usbhost clock\n"); |
@@ -123,9 +125,9 @@ static int __devinit exynos_ohci_probe(struct platform_device *pdev) | |||
123 | goto fail_clk; | 125 | goto fail_clk; |
124 | } | 126 | } |
125 | 127 | ||
126 | err = clk_enable(exynos_ohci->clk); | 128 | err = clk_prepare_enable(exynos_ohci->clk); |
127 | if (err) | 129 | if (err) |
128 | goto fail_clken; | 130 | goto fail_clk; |
129 | 131 | ||
130 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 132 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
131 | if (!res) { | 133 | if (!res) { |
@@ -167,15 +169,13 @@ static int __devinit exynos_ohci_probe(struct platform_device *pdev) | |||
167 | return 0; | 169 | return 0; |
168 | 170 | ||
169 | fail_io: | 171 | fail_io: |
170 | clk_disable(exynos_ohci->clk); | 172 | clk_disable_unprepare(exynos_ohci->clk); |
171 | fail_clken: | ||
172 | clk_put(exynos_ohci->clk); | ||
173 | fail_clk: | 173 | fail_clk: |
174 | usb_put_hcd(hcd); | 174 | usb_put_hcd(hcd); |
175 | return err; | 175 | return err; |
176 | } | 176 | } |
177 | 177 | ||
178 | static int __devexit exynos_ohci_remove(struct platform_device *pdev) | 178 | static int exynos_ohci_remove(struct platform_device *pdev) |
179 | { | 179 | { |
180 | struct exynos4_ohci_platdata *pdata = pdev->dev.platform_data; | 180 | struct exynos4_ohci_platdata *pdata = pdev->dev.platform_data; |
181 | struct exynos_ohci_hcd *exynos_ohci = platform_get_drvdata(pdev); | 181 | struct exynos_ohci_hcd *exynos_ohci = platform_get_drvdata(pdev); |
@@ -186,8 +186,7 @@ static int __devexit exynos_ohci_remove(struct platform_device *pdev) | |||
186 | if (pdata && pdata->phy_exit) | 186 | if (pdata && pdata->phy_exit) |
187 | pdata->phy_exit(pdev, S5P_USB_PHY_HOST); | 187 | pdata->phy_exit(pdev, S5P_USB_PHY_HOST); |
188 | 188 | ||
189 | clk_disable(exynos_ohci->clk); | 189 | clk_disable_unprepare(exynos_ohci->clk); |
190 | clk_put(exynos_ohci->clk); | ||
191 | 190 | ||
192 | usb_put_hcd(hcd); | 191 | usb_put_hcd(hcd); |
193 | 192 | ||
@@ -232,7 +231,7 @@ static int exynos_ohci_suspend(struct device *dev) | |||
232 | if (pdata && pdata->phy_exit) | 231 | if (pdata && pdata->phy_exit) |
233 | pdata->phy_exit(pdev, S5P_USB_PHY_HOST); | 232 | pdata->phy_exit(pdev, S5P_USB_PHY_HOST); |
234 | 233 | ||
235 | clk_disable(exynos_ohci->clk); | 234 | clk_disable_unprepare(exynos_ohci->clk); |
236 | 235 | ||
237 | fail: | 236 | fail: |
238 | spin_unlock_irqrestore(&ohci->lock, flags); | 237 | spin_unlock_irqrestore(&ohci->lock, flags); |
@@ -247,15 +246,12 @@ static int exynos_ohci_resume(struct device *dev) | |||
247 | struct platform_device *pdev = to_platform_device(dev); | 246 | struct platform_device *pdev = to_platform_device(dev); |
248 | struct exynos4_ohci_platdata *pdata = pdev->dev.platform_data; | 247 | struct exynos4_ohci_platdata *pdata = pdev->dev.platform_data; |
249 | 248 | ||
250 | clk_enable(exynos_ohci->clk); | 249 | clk_prepare_enable(exynos_ohci->clk); |
251 | 250 | ||
252 | if (pdata && pdata->phy_init) | 251 | if (pdata && pdata->phy_init) |
253 | pdata->phy_init(pdev, S5P_USB_PHY_HOST); | 252 | pdata->phy_init(pdev, S5P_USB_PHY_HOST); |
254 | 253 | ||
255 | /* Mark hardware accessible again as we are out of D3 state by now */ | 254 | ohci_resume(hcd, false); |
256 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | ||
257 | |||
258 | ohci_finish_controller_resume(hcd); | ||
259 | 255 | ||
260 | return 0; | 256 | return 0; |
261 | } | 257 | } |
@@ -279,7 +275,7 @@ MODULE_DEVICE_TABLE(of, exynos_ohci_match); | |||
279 | 275 | ||
280 | static struct platform_driver exynos_ohci_driver = { | 276 | static struct platform_driver exynos_ohci_driver = { |
281 | .probe = exynos_ohci_probe, | 277 | .probe = exynos_ohci_probe, |
282 | .remove = __devexit_p(exynos_ohci_remove), | 278 | .remove = exynos_ohci_remove, |
283 | .shutdown = exynos_ohci_shutdown, | 279 | .shutdown = exynos_ohci_shutdown, |
284 | .driver = { | 280 | .driver = { |
285 | .name = "exynos-ohci", | 281 | .name = "exynos-ohci", |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 4a1d64d92338..180a2b01db56 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
@@ -231,13 +231,41 @@ static int ohci_urb_enqueue ( | |||
231 | frame &= ~(ed->interval - 1); | 231 | frame &= ~(ed->interval - 1); |
232 | frame |= ed->branch; | 232 | frame |= ed->branch; |
233 | urb->start_frame = frame; | 233 | urb->start_frame = frame; |
234 | } | ||
235 | } else if (ed->type == PIPE_ISOCHRONOUS) { | ||
236 | u16 next = ohci_frame_no(ohci) + 2; | ||
237 | u16 frame = ed->last_iso + ed->interval; | ||
238 | |||
239 | /* Behind the scheduling threshold? */ | ||
240 | if (unlikely(tick_before(frame, next))) { | ||
234 | 241 | ||
235 | /* yes, only URB_ISO_ASAP is supported, and | 242 | /* USB_ISO_ASAP: Round up to the first available slot */ |
236 | * urb->start_frame is never used as input. | 243 | if (urb->transfer_flags & URB_ISO_ASAP) |
244 | frame += (next - frame + ed->interval - 1) & | ||
245 | -ed->interval; | ||
246 | |||
247 | /* | ||
248 | * Not ASAP: Use the next slot in the stream. If | ||
249 | * the entire URB falls before the threshold, fail. | ||
237 | */ | 250 | */ |
251 | else if (tick_before(frame + ed->interval * | ||
252 | (urb->number_of_packets - 1), next)) { | ||
253 | retval = -EXDEV; | ||
254 | usb_hcd_unlink_urb_from_ep(hcd, urb); | ||
255 | goto fail; | ||
256 | } | ||
257 | |||
258 | /* | ||
259 | * Some OHCI hardware doesn't handle late TDs | ||
260 | * correctly. After retiring them it proceeds to | ||
261 | * the next ED instead of the next TD. Therefore | ||
262 | * we have to omit the late TDs entirely. | ||
263 | */ | ||
264 | urb_priv->td_cnt = DIV_ROUND_UP(next - frame, | ||
265 | ed->interval); | ||
238 | } | 266 | } |
239 | } else if (ed->type == PIPE_ISOCHRONOUS) | 267 | urb->start_frame = frame; |
240 | urb->start_frame = ed->last_iso + ed->interval; | 268 | } |
241 | 269 | ||
242 | /* fill the TDs and link them to the ed; and | 270 | /* fill the TDs and link them to the ed; and |
243 | * enable that part of the schedule, if needed | 271 | * enable that part of the schedule, if needed |
@@ -983,6 +1011,79 @@ static int ohci_restart (struct ohci_hcd *ohci) | |||
983 | 1011 | ||
984 | #endif | 1012 | #endif |
985 | 1013 | ||
1014 | #ifdef CONFIG_PM | ||
1015 | |||
1016 | static int __maybe_unused ohci_suspend(struct usb_hcd *hcd, bool do_wakeup) | ||
1017 | { | ||
1018 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | ||
1019 | unsigned long flags; | ||
1020 | |||
1021 | /* Disable irq emission and mark HW unaccessible. Use | ||
1022 | * the spinlock to properly synchronize with possible pending | ||
1023 | * RH suspend or resume activity. | ||
1024 | */ | ||
1025 | spin_lock_irqsave (&ohci->lock, flags); | ||
1026 | ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable); | ||
1027 | (void)ohci_readl(ohci, &ohci->regs->intrdisable); | ||
1028 | |||
1029 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | ||
1030 | spin_unlock_irqrestore (&ohci->lock, flags); | ||
1031 | |||
1032 | return 0; | ||
1033 | } | ||
1034 | |||
1035 | |||
1036 | static int __maybe_unused ohci_resume(struct usb_hcd *hcd, bool hibernated) | ||
1037 | { | ||
1038 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
1039 | int port; | ||
1040 | bool need_reinit = false; | ||
1041 | |||
1042 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | ||
1043 | |||
1044 | /* Make sure resume from hibernation re-enumerates everything */ | ||
1045 | if (hibernated) | ||
1046 | ohci_usb_reset(ohci); | ||
1047 | |||
1048 | /* See if the controller is already running or has been reset */ | ||
1049 | ohci->hc_control = ohci_readl(ohci, &ohci->regs->control); | ||
1050 | if (ohci->hc_control & (OHCI_CTRL_IR | OHCI_SCHED_ENABLES)) { | ||
1051 | need_reinit = true; | ||
1052 | } else { | ||
1053 | switch (ohci->hc_control & OHCI_CTRL_HCFS) { | ||
1054 | case OHCI_USB_OPER: | ||
1055 | case OHCI_USB_RESET: | ||
1056 | need_reinit = true; | ||
1057 | } | ||
1058 | } | ||
1059 | |||
1060 | /* If needed, reinitialize and suspend the root hub */ | ||
1061 | if (need_reinit) { | ||
1062 | spin_lock_irq(&ohci->lock); | ||
1063 | ohci_rh_resume(ohci); | ||
1064 | ohci_rh_suspend(ohci, 0); | ||
1065 | spin_unlock_irq(&ohci->lock); | ||
1066 | } | ||
1067 | |||
1068 | /* Normally just turn on port power and enable interrupts */ | ||
1069 | else { | ||
1070 | ohci_dbg(ohci, "powerup ports\n"); | ||
1071 | for (port = 0; port < ohci->num_ports; port++) | ||
1072 | ohci_writel(ohci, RH_PS_PPS, | ||
1073 | &ohci->regs->roothub.portstatus[port]); | ||
1074 | |||
1075 | ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrenable); | ||
1076 | ohci_readl(ohci, &ohci->regs->intrenable); | ||
1077 | msleep(20); | ||
1078 | } | ||
1079 | |||
1080 | usb_hcd_resume_root_hub(hcd); | ||
1081 | |||
1082 | return 0; | ||
1083 | } | ||
1084 | |||
1085 | #endif | ||
1086 | |||
986 | /*-------------------------------------------------------------------------*/ | 1087 | /*-------------------------------------------------------------------------*/ |
987 | 1088 | ||
988 | MODULE_AUTHOR (DRIVER_AUTHOR); | 1089 | MODULE_AUTHOR (DRIVER_AUTHOR); |
@@ -1029,21 +1130,6 @@ MODULE_LICENSE ("GPL"); | |||
1029 | #define PLATFORM_DRIVER ohci_hcd_ep93xx_driver | 1130 | #define PLATFORM_DRIVER ohci_hcd_ep93xx_driver |
1030 | #endif | 1131 | #endif |
1031 | 1132 | ||
1032 | #ifdef CONFIG_MIPS_ALCHEMY | ||
1033 | #include "ohci-au1xxx.c" | ||
1034 | #define PLATFORM_DRIVER ohci_hcd_au1xxx_driver | ||
1035 | #endif | ||
1036 | |||
1037 | #ifdef CONFIG_PNX8550 | ||
1038 | #include "ohci-pnx8550.c" | ||
1039 | #define PLATFORM_DRIVER ohci_hcd_pnx8550_driver | ||
1040 | #endif | ||
1041 | |||
1042 | #ifdef CONFIG_USB_OHCI_HCD_PPC_SOC | ||
1043 | #include "ohci-ppc-soc.c" | ||
1044 | #define PLATFORM_DRIVER ohci_hcd_ppc_soc_driver | ||
1045 | #endif | ||
1046 | |||
1047 | #ifdef CONFIG_ARCH_AT91 | 1133 | #ifdef CONFIG_ARCH_AT91 |
1048 | #include "ohci-at91.c" | 1134 | #include "ohci-at91.c" |
1049 | #define PLATFORM_DRIVER ohci_hcd_at91_driver | 1135 | #define PLATFORM_DRIVER ohci_hcd_at91_driver |
@@ -1059,11 +1145,6 @@ MODULE_LICENSE ("GPL"); | |||
1059 | #define PLATFORM_DRIVER ohci_hcd_da8xx_driver | 1145 | #define PLATFORM_DRIVER ohci_hcd_da8xx_driver |
1060 | #endif | 1146 | #endif |
1061 | 1147 | ||
1062 | #ifdef CONFIG_USB_OHCI_SH | ||
1063 | #include "ohci-sh.c" | ||
1064 | #define PLATFORM_DRIVER ohci_hcd_sh_driver | ||
1065 | #endif | ||
1066 | |||
1067 | 1148 | ||
1068 | #ifdef CONFIG_USB_OHCI_HCD_PPC_OF | 1149 | #ifdef CONFIG_USB_OHCI_HCD_PPC_OF |
1069 | #include "ohci-ppc-of.c" | 1150 | #include "ohci-ppc-of.c" |
@@ -1105,16 +1186,6 @@ MODULE_LICENSE ("GPL"); | |||
1105 | #define PLATFORM_DRIVER ohci_hcd_tilegx_driver | 1186 | #define PLATFORM_DRIVER ohci_hcd_tilegx_driver |
1106 | #endif | 1187 | #endif |
1107 | 1188 | ||
1108 | #ifdef CONFIG_USB_CNS3XXX_OHCI | ||
1109 | #include "ohci-cns3xxx.c" | ||
1110 | #define PLATFORM_DRIVER ohci_hcd_cns3xxx_driver | ||
1111 | #endif | ||
1112 | |||
1113 | #ifdef CONFIG_CPU_XLR | ||
1114 | #include "ohci-xls.c" | ||
1115 | #define PLATFORM_DRIVER ohci_xls_driver | ||
1116 | #endif | ||
1117 | |||
1118 | #ifdef CONFIG_USB_OHCI_HCD_PLATFORM | 1189 | #ifdef CONFIG_USB_OHCI_HCD_PLATFORM |
1119 | #include "ohci-platform.c" | 1190 | #include "ohci-platform.c" |
1120 | #define PLATFORM_DRIVER ohci_platform_driver | 1191 | #define PLATFORM_DRIVER ohci_platform_driver |
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index 2f3619eefefa..db09dae7b557 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
@@ -316,48 +316,6 @@ static int ohci_bus_resume (struct usb_hcd *hcd) | |||
316 | return rc; | 316 | return rc; |
317 | } | 317 | } |
318 | 318 | ||
319 | /* Carry out the final steps of resuming the controller device */ | ||
320 | static void __maybe_unused ohci_finish_controller_resume(struct usb_hcd *hcd) | ||
321 | { | ||
322 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
323 | int port; | ||
324 | bool need_reinit = false; | ||
325 | |||
326 | /* See if the controller is already running or has been reset */ | ||
327 | ohci->hc_control = ohci_readl(ohci, &ohci->regs->control); | ||
328 | if (ohci->hc_control & (OHCI_CTRL_IR | OHCI_SCHED_ENABLES)) { | ||
329 | need_reinit = true; | ||
330 | } else { | ||
331 | switch (ohci->hc_control & OHCI_CTRL_HCFS) { | ||
332 | case OHCI_USB_OPER: | ||
333 | case OHCI_USB_RESET: | ||
334 | need_reinit = true; | ||
335 | } | ||
336 | } | ||
337 | |||
338 | /* If needed, reinitialize and suspend the root hub */ | ||
339 | if (need_reinit) { | ||
340 | spin_lock_irq(&ohci->lock); | ||
341 | ohci_rh_resume(ohci); | ||
342 | ohci_rh_suspend(ohci, 0); | ||
343 | spin_unlock_irq(&ohci->lock); | ||
344 | } | ||
345 | |||
346 | /* Normally just turn on port power and enable interrupts */ | ||
347 | else { | ||
348 | ohci_dbg(ohci, "powerup ports\n"); | ||
349 | for (port = 0; port < ohci->num_ports; port++) | ||
350 | ohci_writel(ohci, RH_PS_PPS, | ||
351 | &ohci->regs->roothub.portstatus[port]); | ||
352 | |||
353 | ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrenable); | ||
354 | ohci_readl(ohci, &ohci->regs->intrenable); | ||
355 | msleep(20); | ||
356 | } | ||
357 | |||
358 | usb_hcd_resume_root_hub(hcd); | ||
359 | } | ||
360 | |||
361 | /* Carry out polling-, autostop-, and autoresume-related state changes */ | 319 | /* Carry out polling-, autostop-, and autoresume-related state changes */ |
362 | static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, | 320 | static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, |
363 | int any_connected, int rhsc_status) | 321 | int any_connected, int rhsc_status) |
diff --git a/drivers/usb/host/ohci-jz4740.c b/drivers/usb/host/ohci-jz4740.c index 931d588c3fb5..8062bb9dea16 100644 --- a/drivers/usb/host/ohci-jz4740.c +++ b/drivers/usb/host/ohci-jz4740.c | |||
@@ -145,7 +145,7 @@ static const struct hc_driver ohci_jz4740_hc_driver = { | |||
145 | }; | 145 | }; |
146 | 146 | ||
147 | 147 | ||
148 | static __devinit int jz4740_ohci_probe(struct platform_device *pdev) | 148 | static int jz4740_ohci_probe(struct platform_device *pdev) |
149 | { | 149 | { |
150 | int ret; | 150 | int ret; |
151 | struct usb_hcd *hcd; | 151 | struct usb_hcd *hcd; |
@@ -239,7 +239,7 @@ err_free: | |||
239 | return ret; | 239 | return ret; |
240 | } | 240 | } |
241 | 241 | ||
242 | static __devexit int jz4740_ohci_remove(struct platform_device *pdev) | 242 | static int jz4740_ohci_remove(struct platform_device *pdev) |
243 | { | 243 | { |
244 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | 244 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
245 | struct jz4740_ohci_hcd *jz4740_ohci = hcd_to_jz4740_hcd(hcd); | 245 | struct jz4740_ohci_hcd *jz4740_ohci = hcd_to_jz4740_hcd(hcd); |
@@ -266,7 +266,7 @@ static __devexit int jz4740_ohci_remove(struct platform_device *pdev) | |||
266 | 266 | ||
267 | static struct platform_driver ohci_hcd_jz4740_driver = { | 267 | static struct platform_driver ohci_hcd_jz4740_driver = { |
268 | .probe = jz4740_ohci_probe, | 268 | .probe = jz4740_ohci_probe, |
269 | .remove = __devexit_p(jz4740_ohci_remove), | 269 | .remove = jz4740_ohci_remove, |
270 | .driver = { | 270 | .driver = { |
271 | .name = "jz4740-ohci", | 271 | .name = "jz4740-ohci", |
272 | .owner = THIS_MODULE, | 272 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/host/ohci-nxp.c b/drivers/usb/host/ohci-nxp.c index e068f034cb9b..2344040c16d2 100644 --- a/drivers/usb/host/ohci-nxp.c +++ b/drivers/usb/host/ohci-nxp.c | |||
@@ -147,7 +147,7 @@ static void nxp_stop_hc(void) | |||
147 | __raw_writel(tmp, USB_OTG_STAT_CONTROL); | 147 | __raw_writel(tmp, USB_OTG_STAT_CONTROL); |
148 | } | 148 | } |
149 | 149 | ||
150 | static int __devinit ohci_nxp_start(struct usb_hcd *hcd) | 150 | static int ohci_nxp_start(struct usb_hcd *hcd) |
151 | { | 151 | { |
152 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | 152 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
153 | int ret; | 153 | int ret; |
@@ -205,7 +205,7 @@ static const struct hc_driver ohci_nxp_hc_driver = { | |||
205 | .start_port_reset = ohci_start_port_reset, | 205 | .start_port_reset = ohci_start_port_reset, |
206 | }; | 206 | }; |
207 | 207 | ||
208 | static int __devinit usb_hcd_nxp_probe(struct platform_device *pdev) | 208 | static int usb_hcd_nxp_probe(struct platform_device *pdev) |
209 | { | 209 | { |
210 | struct usb_hcd *hcd = 0; | 210 | struct usb_hcd *hcd = 0; |
211 | struct ohci_hcd *ohci; | 211 | struct ohci_hcd *ohci; |
diff --git a/drivers/usb/host/ohci-octeon.c b/drivers/usb/host/ohci-octeon.c index d469bf9b9e54..d44430d009f8 100644 --- a/drivers/usb/host/ohci-octeon.c +++ b/drivers/usb/host/ohci-octeon.c | |||
@@ -42,7 +42,7 @@ static void ohci_octeon_hw_stop(void) | |||
42 | octeon2_usb_clocks_stop(); | 42 | octeon2_usb_clocks_stop(); |
43 | } | 43 | } |
44 | 44 | ||
45 | static int __devinit ohci_octeon_start(struct usb_hcd *hcd) | 45 | static int ohci_octeon_start(struct usb_hcd *hcd) |
46 | { | 46 | { |
47 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | 47 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
48 | int ret; | 48 | int ret; |
diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c index 4531d03503c3..733c77c36355 100644 --- a/drivers/usb/host/ohci-omap.c +++ b/drivers/usb/host/ohci-omap.c | |||
@@ -530,7 +530,7 @@ static int ohci_omap_resume(struct platform_device *dev) | |||
530 | ohci->next_statechange = jiffies; | 530 | ohci->next_statechange = jiffies; |
531 | 531 | ||
532 | omap_ohci_clock_power(1); | 532 | omap_ohci_clock_power(1); |
533 | ohci_finish_controller_resume(hcd); | 533 | ohci_resume(hcd, false); |
534 | return 0; | 534 | return 0; |
535 | } | 535 | } |
536 | 536 | ||
diff --git a/drivers/usb/host/ohci-omap3.c b/drivers/usb/host/ohci-omap3.c index 1b8133b6e451..4382af3a45f9 100644 --- a/drivers/usb/host/ohci-omap3.c +++ b/drivers/usb/host/ohci-omap3.c | |||
@@ -125,7 +125,7 @@ static const struct hc_driver ohci_omap3_hc_driver = { | |||
125 | * then invokes the start() method for the HCD associated with it | 125 | * then invokes the start() method for the HCD associated with it |
126 | * through the hotplug entry's driver_data. | 126 | * through the hotplug entry's driver_data. |
127 | */ | 127 | */ |
128 | static int __devinit ohci_hcd_omap3_probe(struct platform_device *pdev) | 128 | static int ohci_hcd_omap3_probe(struct platform_device *pdev) |
129 | { | 129 | { |
130 | struct device *dev = &pdev->dev; | 130 | struct device *dev = &pdev->dev; |
131 | struct usb_hcd *hcd = NULL; | 131 | struct usb_hcd *hcd = NULL; |
@@ -209,7 +209,7 @@ err_io: | |||
209 | * the HCD's stop() method. It is always called from a thread | 209 | * the HCD's stop() method. It is always called from a thread |
210 | * context, normally "rmmod", "apmd", or something similar. | 210 | * context, normally "rmmod", "apmd", or something similar. |
211 | */ | 211 | */ |
212 | static int __devexit ohci_hcd_omap3_remove(struct platform_device *pdev) | 212 | static int ohci_hcd_omap3_remove(struct platform_device *pdev) |
213 | { | 213 | { |
214 | struct device *dev = &pdev->dev; | 214 | struct device *dev = &pdev->dev; |
215 | struct usb_hcd *hcd = dev_get_drvdata(dev); | 215 | struct usb_hcd *hcd = dev_get_drvdata(dev); |
@@ -232,7 +232,7 @@ static void ohci_hcd_omap3_shutdown(struct platform_device *pdev) | |||
232 | 232 | ||
233 | static struct platform_driver ohci_hcd_omap3_driver = { | 233 | static struct platform_driver ohci_hcd_omap3_driver = { |
234 | .probe = ohci_hcd_omap3_probe, | 234 | .probe = ohci_hcd_omap3_probe, |
235 | .remove = __devexit_p(ohci_hcd_omap3_remove), | 235 | .remove = ohci_hcd_omap3_remove, |
236 | .shutdown = ohci_hcd_omap3_shutdown, | 236 | .shutdown = ohci_hcd_omap3_shutdown, |
237 | .driver = { | 237 | .driver = { |
238 | .name = "ohci-omap3", | 238 | .name = "ohci-omap3", |
diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c index 1843bb68ac7c..951514ef446d 100644 --- a/drivers/usb/host/ohci-pci.c +++ b/drivers/usb/host/ohci-pci.c | |||
@@ -270,7 +270,7 @@ static int ohci_pci_reset (struct usb_hcd *hcd) | |||
270 | } | 270 | } |
271 | 271 | ||
272 | 272 | ||
273 | static int __devinit ohci_pci_start (struct usb_hcd *hcd) | 273 | static int ohci_pci_start (struct usb_hcd *hcd) |
274 | { | 274 | { |
275 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 275 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
276 | int ret; | 276 | int ret; |
@@ -296,49 +296,6 @@ static int __devinit ohci_pci_start (struct usb_hcd *hcd) | |||
296 | return ret; | 296 | return ret; |
297 | } | 297 | } |
298 | 298 | ||
299 | #ifdef CONFIG_PM | ||
300 | |||
301 | static int ohci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup) | ||
302 | { | ||
303 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | ||
304 | unsigned long flags; | ||
305 | int rc = 0; | ||
306 | |||
307 | /* Root hub was already suspended. Disable irq emission and | ||
308 | * mark HW unaccessible, bail out if RH has been resumed. Use | ||
309 | * the spinlock to properly synchronize with possible pending | ||
310 | * RH suspend or resume activity. | ||
311 | */ | ||
312 | spin_lock_irqsave (&ohci->lock, flags); | ||
313 | if (ohci->rh_state != OHCI_RH_SUSPENDED) { | ||
314 | rc = -EINVAL; | ||
315 | goto bail; | ||
316 | } | ||
317 | ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable); | ||
318 | (void)ohci_readl(ohci, &ohci->regs->intrdisable); | ||
319 | |||
320 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | ||
321 | bail: | ||
322 | spin_unlock_irqrestore (&ohci->lock, flags); | ||
323 | |||
324 | return rc; | ||
325 | } | ||
326 | |||
327 | |||
328 | static int ohci_pci_resume(struct usb_hcd *hcd, bool hibernated) | ||
329 | { | ||
330 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | ||
331 | |||
332 | /* Make sure resume from hibernation re-enumerates everything */ | ||
333 | if (hibernated) | ||
334 | ohci_usb_reset(hcd_to_ohci(hcd)); | ||
335 | |||
336 | ohci_finish_controller_resume(hcd); | ||
337 | return 0; | ||
338 | } | ||
339 | |||
340 | #endif /* CONFIG_PM */ | ||
341 | |||
342 | 299 | ||
343 | /*-------------------------------------------------------------------------*/ | 300 | /*-------------------------------------------------------------------------*/ |
344 | 301 | ||
@@ -362,8 +319,8 @@ static const struct hc_driver ohci_pci_hc_driver = { | |||
362 | .shutdown = ohci_shutdown, | 319 | .shutdown = ohci_shutdown, |
363 | 320 | ||
364 | #ifdef CONFIG_PM | 321 | #ifdef CONFIG_PM |
365 | .pci_suspend = ohci_pci_suspend, | 322 | .pci_suspend = ohci_suspend, |
366 | .pci_resume = ohci_pci_resume, | 323 | .pci_resume = ohci_resume, |
367 | #endif | 324 | #endif |
368 | 325 | ||
369 | /* | 326 | /* |
diff --git a/drivers/usb/host/ohci-platform.c b/drivers/usb/host/ohci-platform.c index e24ec9f79164..084503b03fcf 100644 --- a/drivers/usb/host/ohci-platform.c +++ b/drivers/usb/host/ohci-platform.c | |||
@@ -31,6 +31,10 @@ static int ohci_platform_reset(struct usb_hcd *hcd) | |||
31 | ohci->flags |= OHCI_QUIRK_FRAME_NO; | 31 | ohci->flags |= OHCI_QUIRK_FRAME_NO; |
32 | 32 | ||
33 | ohci_hcd_init(ohci); | 33 | ohci_hcd_init(ohci); |
34 | |||
35 | if (pdata->num_ports) | ||
36 | ohci->num_ports = pdata->num_ports; | ||
37 | |||
34 | err = ohci_init(ohci); | 38 | err = ohci_init(ohci); |
35 | 39 | ||
36 | return err; | 40 | return err; |
@@ -79,7 +83,7 @@ static const struct hc_driver ohci_platform_hc_driver = { | |||
79 | .start_port_reset = ohci_start_port_reset, | 83 | .start_port_reset = ohci_start_port_reset, |
80 | }; | 84 | }; |
81 | 85 | ||
82 | static int __devinit ohci_platform_probe(struct platform_device *dev) | 86 | static int ohci_platform_probe(struct platform_device *dev) |
83 | { | 87 | { |
84 | struct usb_hcd *hcd; | 88 | struct usb_hcd *hcd; |
85 | struct resource *res_mem; | 89 | struct resource *res_mem; |
@@ -97,13 +101,13 @@ static int __devinit ohci_platform_probe(struct platform_device *dev) | |||
97 | 101 | ||
98 | irq = platform_get_irq(dev, 0); | 102 | irq = platform_get_irq(dev, 0); |
99 | if (irq < 0) { | 103 | if (irq < 0) { |
100 | pr_err("no irq provided"); | 104 | dev_err(&dev->dev, "no irq provided"); |
101 | return irq; | 105 | return irq; |
102 | } | 106 | } |
103 | 107 | ||
104 | res_mem = platform_get_resource(dev, IORESOURCE_MEM, 0); | 108 | res_mem = platform_get_resource(dev, IORESOURCE_MEM, 0); |
105 | if (!res_mem) { | 109 | if (!res_mem) { |
106 | pr_err("no memory recourse provided"); | 110 | dev_err(&dev->dev, "no memory resource provided"); |
107 | return -ENXIO; | 111 | return -ENXIO; |
108 | } | 112 | } |
109 | 113 | ||
@@ -123,29 +127,19 @@ static int __devinit ohci_platform_probe(struct platform_device *dev) | |||
123 | hcd->rsrc_start = res_mem->start; | 127 | hcd->rsrc_start = res_mem->start; |
124 | hcd->rsrc_len = resource_size(res_mem); | 128 | hcd->rsrc_len = resource_size(res_mem); |
125 | 129 | ||
126 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | 130 | hcd->regs = devm_request_and_ioremap(&dev->dev, res_mem); |
127 | pr_err("controller already in use"); | ||
128 | err = -EBUSY; | ||
129 | goto err_put_hcd; | ||
130 | } | ||
131 | |||
132 | hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len); | ||
133 | if (!hcd->regs) { | 131 | if (!hcd->regs) { |
134 | err = -ENOMEM; | 132 | err = -ENOMEM; |
135 | goto err_release_region; | 133 | goto err_put_hcd; |
136 | } | 134 | } |
137 | err = usb_add_hcd(hcd, irq, IRQF_SHARED); | 135 | err = usb_add_hcd(hcd, irq, IRQF_SHARED); |
138 | if (err) | 136 | if (err) |
139 | goto err_iounmap; | 137 | goto err_put_hcd; |
140 | 138 | ||
141 | platform_set_drvdata(dev, hcd); | 139 | platform_set_drvdata(dev, hcd); |
142 | 140 | ||
143 | return err; | 141 | return err; |
144 | 142 | ||
145 | err_iounmap: | ||
146 | iounmap(hcd->regs); | ||
147 | err_release_region: | ||
148 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
149 | err_put_hcd: | 143 | err_put_hcd: |
150 | usb_put_hcd(hcd); | 144 | usb_put_hcd(hcd); |
151 | err_power: | 145 | err_power: |
@@ -155,14 +149,12 @@ err_power: | |||
155 | return err; | 149 | return err; |
156 | } | 150 | } |
157 | 151 | ||
158 | static int __devexit ohci_platform_remove(struct platform_device *dev) | 152 | static int ohci_platform_remove(struct platform_device *dev) |
159 | { | 153 | { |
160 | struct usb_hcd *hcd = platform_get_drvdata(dev); | 154 | struct usb_hcd *hcd = platform_get_drvdata(dev); |
161 | struct usb_ohci_pdata *pdata = dev->dev.platform_data; | 155 | struct usb_ohci_pdata *pdata = dev->dev.platform_data; |
162 | 156 | ||
163 | usb_remove_hcd(hcd); | 157 | usb_remove_hcd(hcd); |
164 | iounmap(hcd->regs); | ||
165 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
166 | usb_put_hcd(hcd); | 158 | usb_put_hcd(hcd); |
167 | platform_set_drvdata(dev, NULL); | 159 | platform_set_drvdata(dev, NULL); |
168 | 160 | ||
@@ -199,7 +191,7 @@ static int ohci_platform_resume(struct device *dev) | |||
199 | return err; | 191 | return err; |
200 | } | 192 | } |
201 | 193 | ||
202 | ohci_finish_controller_resume(hcd); | 194 | ohci_resume(hcd, false); |
203 | return 0; | 195 | return 0; |
204 | } | 196 | } |
205 | 197 | ||
@@ -222,7 +214,7 @@ static const struct dev_pm_ops ohci_platform_pm_ops = { | |||
222 | static struct platform_driver ohci_platform_driver = { | 214 | static struct platform_driver ohci_platform_driver = { |
223 | .id_table = ohci_platform_table, | 215 | .id_table = ohci_platform_table, |
224 | .probe = ohci_platform_probe, | 216 | .probe = ohci_platform_probe, |
225 | .remove = __devexit_p(ohci_platform_remove), | 217 | .remove = ohci_platform_remove, |
226 | .shutdown = usb_hcd_platform_shutdown, | 218 | .shutdown = usb_hcd_platform_shutdown, |
227 | .driver = { | 219 | .driver = { |
228 | .owner = THIS_MODULE, | 220 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/host/ohci-pnx8550.c b/drivers/usb/host/ohci-pnx8550.c deleted file mode 100644 index 148d27d6a67c..000000000000 --- a/drivers/usb/host/ohci-pnx8550.c +++ /dev/null | |||
@@ -1,243 +0,0 @@ | |||
1 | /* | ||
2 | * OHCI HCD (Host Controller Driver) for USB. | ||
3 | * | ||
4 | * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at> | ||
5 | * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net> | ||
6 | * (C) Copyright 2002 Hewlett-Packard Company | ||
7 | * (C) Copyright 2005 Embedded Alley Solutions, Inc. | ||
8 | * | ||
9 | * Bus Glue for PNX8550 | ||
10 | * | ||
11 | * Written by Christopher Hoover <ch@hpl.hp.com> | ||
12 | * Based on fragments of previous driver by Russell King et al. | ||
13 | * | ||
14 | * Modified for LH7A404 from ohci-sa1111.c | ||
15 | * by Durgesh Pattamatta <pattamattad@sharpsec.com> | ||
16 | * | ||
17 | * Modified for PNX8550 from ohci-sa1111.c and sa-omap.c | ||
18 | * by Vitaly Wool <vitalywool@gmail.com> | ||
19 | * | ||
20 | * This file is licenced under the GPL. | ||
21 | */ | ||
22 | |||
23 | #include <linux/device.h> | ||
24 | #include <linux/platform_device.h> | ||
25 | #include <asm/mach-pnx8550/usb.h> | ||
26 | #include <asm/mach-pnx8550/int.h> | ||
27 | #include <asm/mach-pnx8550/pci.h> | ||
28 | |||
29 | #ifndef CONFIG_PNX8550 | ||
30 | #error "This file is PNX8550 bus glue. CONFIG_PNX8550 must be defined." | ||
31 | #endif | ||
32 | |||
33 | extern int usb_disabled(void); | ||
34 | |||
35 | /*-------------------------------------------------------------------------*/ | ||
36 | |||
37 | static void pnx8550_start_hc(struct platform_device *dev) | ||
38 | { | ||
39 | /* | ||
40 | * Set register CLK48CTL to enable and 48MHz | ||
41 | */ | ||
42 | outl(0x00000003, PCI_BASE | 0x0004770c); | ||
43 | |||
44 | /* | ||
45 | * Set register CLK12CTL to enable and 48MHz | ||
46 | */ | ||
47 | outl(0x00000003, PCI_BASE | 0x00047710); | ||
48 | |||
49 | udelay(100); | ||
50 | } | ||
51 | |||
52 | static void pnx8550_stop_hc(struct platform_device *dev) | ||
53 | { | ||
54 | udelay(10); | ||
55 | } | ||
56 | |||
57 | |||
58 | /*-------------------------------------------------------------------------*/ | ||
59 | |||
60 | /* configure so an HC device and id are always provided */ | ||
61 | /* always called with process context; sleeping is OK */ | ||
62 | |||
63 | |||
64 | /** | ||
65 | * usb_hcd_pnx8550_probe - initialize pnx8550-based HCDs | ||
66 | * Context: !in_interrupt() | ||
67 | * | ||
68 | * Allocates basic resources for this USB host controller, and | ||
69 | * then invokes the start() method for the HCD associated with it | ||
70 | * through the hotplug entry's driver_data. | ||
71 | * | ||
72 | */ | ||
73 | int usb_hcd_pnx8550_probe (const struct hc_driver *driver, | ||
74 | struct platform_device *dev) | ||
75 | { | ||
76 | int retval; | ||
77 | struct usb_hcd *hcd; | ||
78 | |||
79 | if (dev->resource[0].flags != IORESOURCE_MEM || | ||
80 | dev->resource[1].flags != IORESOURCE_IRQ) { | ||
81 | dev_err (&dev->dev,"invalid resource type\n"); | ||
82 | return -ENOMEM; | ||
83 | } | ||
84 | |||
85 | hcd = usb_create_hcd (driver, &dev->dev, "pnx8550"); | ||
86 | if (!hcd) | ||
87 | return -ENOMEM; | ||
88 | hcd->rsrc_start = dev->resource[0].start; | ||
89 | hcd->rsrc_len = dev->resource[0].end - dev->resource[0].start + 1; | ||
90 | |||
91 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | ||
92 | dev_err(&dev->dev, "request_mem_region [0x%08llx, 0x%08llx] " | ||
93 | "failed\n", hcd->rsrc_start, hcd->rsrc_len); | ||
94 | retval = -EBUSY; | ||
95 | goto err1; | ||
96 | } | ||
97 | |||
98 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | ||
99 | if (!hcd->regs) { | ||
100 | dev_err(&dev->dev, "ioremap [[0x%08llx, 0x%08llx] failed\n", | ||
101 | hcd->rsrc_start, hcd->rsrc_len); | ||
102 | retval = -ENOMEM; | ||
103 | goto err2; | ||
104 | } | ||
105 | |||
106 | pnx8550_start_hc(dev); | ||
107 | |||
108 | ohci_hcd_init(hcd_to_ohci(hcd)); | ||
109 | |||
110 | retval = usb_add_hcd(hcd, dev->resource[1].start, 0); | ||
111 | if (retval == 0) | ||
112 | return retval; | ||
113 | |||
114 | pnx8550_stop_hc(dev); | ||
115 | iounmap(hcd->regs); | ||
116 | err2: | ||
117 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
118 | err1: | ||
119 | usb_put_hcd(hcd); | ||
120 | return retval; | ||
121 | } | ||
122 | |||
123 | |||
124 | /* may be called without controller electrically present */ | ||
125 | /* may be called with controller, bus, and devices active */ | ||
126 | |||
127 | /** | ||
128 | * usb_hcd_pnx8550_remove - shutdown processing for pnx8550-based HCDs | ||
129 | * @dev: USB Host Controller being removed | ||
130 | * Context: !in_interrupt() | ||
131 | * | ||
132 | * Reverses the effect of usb_hcd_pnx8550_probe(), first invoking | ||
133 | * the HCD's stop() method. It is always called from a thread | ||
134 | * context, normally "rmmod", "apmd", or something similar. | ||
135 | * | ||
136 | */ | ||
137 | void usb_hcd_pnx8550_remove (struct usb_hcd *hcd, struct platform_device *dev) | ||
138 | { | ||
139 | usb_remove_hcd(hcd); | ||
140 | pnx8550_stop_hc(dev); | ||
141 | iounmap(hcd->regs); | ||
142 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
143 | usb_put_hcd(hcd); | ||
144 | } | ||
145 | |||
146 | /*-------------------------------------------------------------------------*/ | ||
147 | |||
148 | static int __devinit | ||
149 | ohci_pnx8550_start (struct usb_hcd *hcd) | ||
150 | { | ||
151 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | ||
152 | int ret; | ||
153 | |||
154 | ohci_dbg (ohci, "ohci_pnx8550_start, ohci:%p", ohci); | ||
155 | |||
156 | if ((ret = ohci_init(ohci)) < 0) | ||
157 | return ret; | ||
158 | |||
159 | if ((ret = ohci_run (ohci)) < 0) { | ||
160 | dev_err(hcd->self.controller, "can't start %s", | ||
161 | hcd->self.bus_name); | ||
162 | ohci_stop (hcd); | ||
163 | return ret; | ||
164 | } | ||
165 | |||
166 | return 0; | ||
167 | } | ||
168 | |||
169 | /*-------------------------------------------------------------------------*/ | ||
170 | |||
171 | static const struct hc_driver ohci_pnx8550_hc_driver = { | ||
172 | .description = hcd_name, | ||
173 | .product_desc = "PNX8550 OHCI", | ||
174 | .hcd_priv_size = sizeof(struct ohci_hcd), | ||
175 | |||
176 | /* | ||
177 | * generic hardware linkage | ||
178 | */ | ||
179 | .irq = ohci_irq, | ||
180 | .flags = HCD_USB11 | HCD_MEMORY, | ||
181 | |||
182 | /* | ||
183 | * basic lifecycle operations | ||
184 | */ | ||
185 | .start = ohci_pnx8550_start, | ||
186 | .stop = ohci_stop, | ||
187 | |||
188 | /* | ||
189 | * managing i/o requests and associated device resources | ||
190 | */ | ||
191 | .urb_enqueue = ohci_urb_enqueue, | ||
192 | .urb_dequeue = ohci_urb_dequeue, | ||
193 | .endpoint_disable = ohci_endpoint_disable, | ||
194 | |||
195 | /* | ||
196 | * scheduling support | ||
197 | */ | ||
198 | .get_frame_number = ohci_get_frame, | ||
199 | |||
200 | /* | ||
201 | * root hub support | ||
202 | */ | ||
203 | .hub_status_data = ohci_hub_status_data, | ||
204 | .hub_control = ohci_hub_control, | ||
205 | #ifdef CONFIG_PM | ||
206 | .bus_suspend = ohci_bus_suspend, | ||
207 | .bus_resume = ohci_bus_resume, | ||
208 | #endif | ||
209 | .start_port_reset = ohci_start_port_reset, | ||
210 | }; | ||
211 | |||
212 | /*-------------------------------------------------------------------------*/ | ||
213 | |||
214 | static int ohci_hcd_pnx8550_drv_probe(struct platform_device *pdev) | ||
215 | { | ||
216 | int ret; | ||
217 | |||
218 | if (usb_disabled()) | ||
219 | return -ENODEV; | ||
220 | |||
221 | ret = usb_hcd_pnx8550_probe(&ohci_pnx8550_hc_driver, pdev); | ||
222 | return ret; | ||
223 | } | ||
224 | |||
225 | static int ohci_hcd_pnx8550_drv_remove(struct platform_device *pdev) | ||
226 | { | ||
227 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
228 | |||
229 | usb_hcd_pnx8550_remove(hcd, pdev); | ||
230 | return 0; | ||
231 | } | ||
232 | |||
233 | MODULE_ALIAS("platform:pnx8550-ohci"); | ||
234 | |||
235 | static struct platform_driver ohci_hcd_pnx8550_driver = { | ||
236 | .driver = { | ||
237 | .name = "pnx8550-ohci", | ||
238 | .owner = THIS_MODULE, | ||
239 | }, | ||
240 | .probe = ohci_hcd_pnx8550_drv_probe, | ||
241 | .remove = ohci_hcd_pnx8550_drv_remove, | ||
242 | }; | ||
243 | |||
diff --git a/drivers/usb/host/ohci-ppc-of.c b/drivers/usb/host/ohci-ppc-of.c index e27d5ae2b9eb..64c2ed9ff95e 100644 --- a/drivers/usb/host/ohci-ppc-of.c +++ b/drivers/usb/host/ohci-ppc-of.c | |||
@@ -19,7 +19,7 @@ | |||
19 | #include <asm/prom.h> | 19 | #include <asm/prom.h> |
20 | 20 | ||
21 | 21 | ||
22 | static int __devinit | 22 | static int |
23 | ohci_ppc_of_start(struct usb_hcd *hcd) | 23 | ohci_ppc_of_start(struct usb_hcd *hcd) |
24 | { | 24 | { |
25 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | 25 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
@@ -81,7 +81,7 @@ static const struct hc_driver ohci_ppc_of_hc_driver = { | |||
81 | }; | 81 | }; |
82 | 82 | ||
83 | 83 | ||
84 | static int __devinit ohci_hcd_ppc_of_probe(struct platform_device *op) | 84 | static int ohci_hcd_ppc_of_probe(struct platform_device *op) |
85 | { | 85 | { |
86 | struct device_node *dn = op->dev.of_node; | 86 | struct device_node *dn = op->dev.of_node; |
87 | struct usb_hcd *hcd; | 87 | struct usb_hcd *hcd; |
diff --git a/drivers/usb/host/ohci-ppc-soc.c b/drivers/usb/host/ohci-ppc-soc.c deleted file mode 100644 index 185c39ed81b7..000000000000 --- a/drivers/usb/host/ohci-ppc-soc.c +++ /dev/null | |||
@@ -1,216 +0,0 @@ | |||
1 | /* | ||
2 | * OHCI HCD (Host Controller Driver) for USB. | ||
3 | * | ||
4 | * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at> | ||
5 | * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net> | ||
6 | * (C) Copyright 2002 Hewlett-Packard Company | ||
7 | * (C) Copyright 2003-2005 MontaVista Software Inc. | ||
8 | * | ||
9 | * Bus Glue for PPC On-Chip OHCI driver | ||
10 | * Tested on Freescale MPC5200 and IBM STB04xxx | ||
11 | * | ||
12 | * Modified by Dale Farnsworth <dale@farnsworth.org> from ohci-sa1111.c | ||
13 | * | ||
14 | * This file is licenced under the GPL. | ||
15 | */ | ||
16 | |||
17 | #include <linux/platform_device.h> | ||
18 | #include <linux/signal.h> | ||
19 | |||
20 | /* configure so an HC device and id are always provided */ | ||
21 | /* always called with process context; sleeping is OK */ | ||
22 | |||
23 | /** | ||
24 | * usb_hcd_ppc_soc_probe - initialize On-Chip HCDs | ||
25 | * Context: !in_interrupt() | ||
26 | * | ||
27 | * Allocates basic resources for this USB host controller. | ||
28 | * | ||
29 | * Store this function in the HCD's struct pci_driver as probe(). | ||
30 | */ | ||
31 | static int usb_hcd_ppc_soc_probe(const struct hc_driver *driver, | ||
32 | struct platform_device *pdev) | ||
33 | { | ||
34 | int retval; | ||
35 | struct usb_hcd *hcd; | ||
36 | struct ohci_hcd *ohci; | ||
37 | struct resource *res; | ||
38 | int irq; | ||
39 | |||
40 | pr_debug("initializing PPC-SOC USB Controller\n"); | ||
41 | |||
42 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
43 | if (!res) { | ||
44 | pr_debug("%s: no irq\n", __FILE__); | ||
45 | return -ENODEV; | ||
46 | } | ||
47 | irq = res->start; | ||
48 | |||
49 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
50 | if (!res) { | ||
51 | pr_debug("%s: no reg addr\n", __FILE__); | ||
52 | return -ENODEV; | ||
53 | } | ||
54 | |||
55 | hcd = usb_create_hcd(driver, &pdev->dev, "PPC-SOC USB"); | ||
56 | if (!hcd) | ||
57 | return -ENOMEM; | ||
58 | hcd->rsrc_start = res->start; | ||
59 | hcd->rsrc_len = resource_size(res); | ||
60 | |||
61 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | ||
62 | pr_debug("%s: request_mem_region failed\n", __FILE__); | ||
63 | retval = -EBUSY; | ||
64 | goto err1; | ||
65 | } | ||
66 | |||
67 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | ||
68 | if (!hcd->regs) { | ||
69 | pr_debug("%s: ioremap failed\n", __FILE__); | ||
70 | retval = -ENOMEM; | ||
71 | goto err2; | ||
72 | } | ||
73 | |||
74 | ohci = hcd_to_ohci(hcd); | ||
75 | ohci->flags |= OHCI_QUIRK_BE_MMIO | OHCI_QUIRK_BE_DESC; | ||
76 | |||
77 | #ifdef CONFIG_PPC_MPC52xx | ||
78 | /* MPC52xx doesn't need frame_no shift */ | ||
79 | ohci->flags |= OHCI_QUIRK_FRAME_NO; | ||
80 | #endif | ||
81 | ohci_hcd_init(ohci); | ||
82 | |||
83 | retval = usb_add_hcd(hcd, irq, 0); | ||
84 | if (retval == 0) | ||
85 | return retval; | ||
86 | |||
87 | pr_debug("Removing PPC-SOC USB Controller\n"); | ||
88 | |||
89 | iounmap(hcd->regs); | ||
90 | err2: | ||
91 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
92 | err1: | ||
93 | usb_put_hcd(hcd); | ||
94 | return retval; | ||
95 | } | ||
96 | |||
97 | |||
98 | /* may be called without controller electrically present */ | ||
99 | /* may be called with controller, bus, and devices active */ | ||
100 | |||
101 | /** | ||
102 | * usb_hcd_ppc_soc_remove - shutdown processing for On-Chip HCDs | ||
103 | * @pdev: USB Host Controller being removed | ||
104 | * Context: !in_interrupt() | ||
105 | * | ||
106 | * Reverses the effect of usb_hcd_ppc_soc_probe(). | ||
107 | * It is always called from a thread | ||
108 | * context, normally "rmmod", "apmd", or something similar. | ||
109 | * | ||
110 | */ | ||
111 | static void usb_hcd_ppc_soc_remove(struct usb_hcd *hcd, | ||
112 | struct platform_device *pdev) | ||
113 | { | ||
114 | usb_remove_hcd(hcd); | ||
115 | |||
116 | pr_debug("stopping PPC-SOC USB Controller\n"); | ||
117 | |||
118 | iounmap(hcd->regs); | ||
119 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
120 | usb_put_hcd(hcd); | ||
121 | } | ||
122 | |||
123 | static int __devinit | ||
124 | ohci_ppc_soc_start(struct usb_hcd *hcd) | ||
125 | { | ||
126 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
127 | int ret; | ||
128 | |||
129 | if ((ret = ohci_init(ohci)) < 0) | ||
130 | return ret; | ||
131 | |||
132 | if ((ret = ohci_run(ohci)) < 0) { | ||
133 | dev_err(hcd->self.controller, "can't start %s\n", | ||
134 | hcd->self.bus_name); | ||
135 | ohci_stop(hcd); | ||
136 | return ret; | ||
137 | } | ||
138 | |||
139 | return 0; | ||
140 | } | ||
141 | |||
142 | static const struct hc_driver ohci_ppc_soc_hc_driver = { | ||
143 | .description = hcd_name, | ||
144 | .hcd_priv_size = sizeof(struct ohci_hcd), | ||
145 | |||
146 | /* | ||
147 | * generic hardware linkage | ||
148 | */ | ||
149 | .irq = ohci_irq, | ||
150 | .flags = HCD_USB11 | HCD_MEMORY, | ||
151 | |||
152 | /* | ||
153 | * basic lifecycle operations | ||
154 | */ | ||
155 | .start = ohci_ppc_soc_start, | ||
156 | .stop = ohci_stop, | ||
157 | .shutdown = ohci_shutdown, | ||
158 | |||
159 | /* | ||
160 | * managing i/o requests and associated device resources | ||
161 | */ | ||
162 | .urb_enqueue = ohci_urb_enqueue, | ||
163 | .urb_dequeue = ohci_urb_dequeue, | ||
164 | .endpoint_disable = ohci_endpoint_disable, | ||
165 | |||
166 | /* | ||
167 | * scheduling support | ||
168 | */ | ||
169 | .get_frame_number = ohci_get_frame, | ||
170 | |||
171 | /* | ||
172 | * root hub support | ||
173 | */ | ||
174 | .hub_status_data = ohci_hub_status_data, | ||
175 | .hub_control = ohci_hub_control, | ||
176 | #ifdef CONFIG_PM | ||
177 | .bus_suspend = ohci_bus_suspend, | ||
178 | .bus_resume = ohci_bus_resume, | ||
179 | #endif | ||
180 | .start_port_reset = ohci_start_port_reset, | ||
181 | }; | ||
182 | |||
183 | static int ohci_hcd_ppc_soc_drv_probe(struct platform_device *pdev) | ||
184 | { | ||
185 | int ret; | ||
186 | |||
187 | if (usb_disabled()) | ||
188 | return -ENODEV; | ||
189 | |||
190 | ret = usb_hcd_ppc_soc_probe(&ohci_ppc_soc_hc_driver, pdev); | ||
191 | return ret; | ||
192 | } | ||
193 | |||
194 | static int ohci_hcd_ppc_soc_drv_remove(struct platform_device *pdev) | ||
195 | { | ||
196 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
197 | |||
198 | usb_hcd_ppc_soc_remove(hcd, pdev); | ||
199 | return 0; | ||
200 | } | ||
201 | |||
202 | static struct platform_driver ohci_hcd_ppc_soc_driver = { | ||
203 | .probe = ohci_hcd_ppc_soc_drv_probe, | ||
204 | .remove = ohci_hcd_ppc_soc_drv_remove, | ||
205 | .shutdown = usb_hcd_platform_shutdown, | ||
206 | #ifdef CONFIG_PM | ||
207 | /*.suspend = ohci_hcd_ppc_soc_drv_suspend,*/ | ||
208 | /*.resume = ohci_hcd_ppc_soc_drv_resume,*/ | ||
209 | #endif | ||
210 | .driver = { | ||
211 | .name = "ppc-soc-ohci", | ||
212 | .owner = THIS_MODULE, | ||
213 | }, | ||
214 | }; | ||
215 | |||
216 | MODULE_ALIAS("platform:ppc-soc-ohci"); | ||
diff --git a/drivers/usb/host/ohci-ps3.c b/drivers/usb/host/ohci-ps3.c index 2ee1d8d713d2..7d35cd9e2862 100644 --- a/drivers/usb/host/ohci-ps3.c +++ b/drivers/usb/host/ohci-ps3.c | |||
@@ -30,7 +30,7 @@ static int ps3_ohci_hc_reset(struct usb_hcd *hcd) | |||
30 | return ohci_init(ohci); | 30 | return ohci_init(ohci); |
31 | } | 31 | } |
32 | 32 | ||
33 | static int __devinit ps3_ohci_hc_start(struct usb_hcd *hcd) | 33 | static int ps3_ohci_hc_start(struct usb_hcd *hcd) |
34 | { | 34 | { |
35 | int result; | 35 | int result; |
36 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | 36 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
@@ -76,7 +76,7 @@ static const struct hc_driver ps3_ohci_hc_driver = { | |||
76 | #endif | 76 | #endif |
77 | }; | 77 | }; |
78 | 78 | ||
79 | static int __devinit ps3_ohci_probe(struct ps3_system_bus_device *dev) | 79 | static int ps3_ohci_probe(struct ps3_system_bus_device *dev) |
80 | { | 80 | { |
81 | int result; | 81 | int result; |
82 | struct usb_hcd *hcd; | 82 | struct usb_hcd *hcd; |
diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c index 2bf11440b010..efe71f3ca477 100644 --- a/drivers/usb/host/ohci-pxa27x.c +++ b/drivers/usb/host/ohci-pxa27x.c | |||
@@ -284,7 +284,7 @@ MODULE_DEVICE_TABLE(of, pxa_ohci_dt_ids); | |||
284 | 284 | ||
285 | static u64 pxa_ohci_dma_mask = DMA_BIT_MASK(32); | 285 | static u64 pxa_ohci_dma_mask = DMA_BIT_MASK(32); |
286 | 286 | ||
287 | static int __devinit ohci_pxa_of_init(struct platform_device *pdev) | 287 | static int ohci_pxa_of_init(struct platform_device *pdev) |
288 | { | 288 | { |
289 | struct device_node *np = pdev->dev.of_node; | 289 | struct device_node *np = pdev->dev.of_node; |
290 | struct pxaohci_platform_data *pdata; | 290 | struct pxaohci_platform_data *pdata; |
@@ -330,7 +330,7 @@ static int __devinit ohci_pxa_of_init(struct platform_device *pdev) | |||
330 | return 0; | 330 | return 0; |
331 | } | 331 | } |
332 | #else | 332 | #else |
333 | static int __devinit ohci_pxa_of_init(struct platform_device *pdev) | 333 | static int ohci_pxa_of_init(struct platform_device *pdev) |
334 | { | 334 | { |
335 | return 0; | 335 | return 0; |
336 | } | 336 | } |
@@ -471,7 +471,7 @@ void usb_hcd_pxa27x_remove (struct usb_hcd *hcd, struct platform_device *pdev) | |||
471 | 471 | ||
472 | /*-------------------------------------------------------------------------*/ | 472 | /*-------------------------------------------------------------------------*/ |
473 | 473 | ||
474 | static int __devinit | 474 | static int |
475 | ohci_pxa27x_start (struct usb_hcd *hcd) | 475 | ohci_pxa27x_start (struct usb_hcd *hcd) |
476 | { | 476 | { |
477 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 477 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
@@ -591,7 +591,7 @@ static int ohci_hcd_pxa27x_drv_resume(struct device *dev) | |||
591 | /* Select Power Management Mode */ | 591 | /* Select Power Management Mode */ |
592 | pxa27x_ohci_select_pmm(ohci, inf->port_mode); | 592 | pxa27x_ohci_select_pmm(ohci, inf->port_mode); |
593 | 593 | ||
594 | ohci_finish_controller_resume(hcd); | 594 | ohci_resume(hcd, false); |
595 | return 0; | 595 | return 0; |
596 | } | 596 | } |
597 | 597 | ||
diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c index c5a1ea9145fa..7482cfbe8c5e 100644 --- a/drivers/usb/host/ohci-q.c +++ b/drivers/usb/host/ohci-q.c | |||
@@ -596,7 +596,6 @@ static void td_submit_urb ( | |||
596 | urb_priv->ed->hwHeadP &= ~cpu_to_hc32 (ohci, ED_C); | 596 | urb_priv->ed->hwHeadP &= ~cpu_to_hc32 (ohci, ED_C); |
597 | } | 597 | } |
598 | 598 | ||
599 | urb_priv->td_cnt = 0; | ||
600 | list_add (&urb_priv->pending, &ohci->pending); | 599 | list_add (&urb_priv->pending, &ohci->pending); |
601 | 600 | ||
602 | if (data_len) | 601 | if (data_len) |
@@ -672,7 +671,8 @@ static void td_submit_urb ( | |||
672 | * we could often reduce the number of TDs here. | 671 | * we could often reduce the number of TDs here. |
673 | */ | 672 | */ |
674 | case PIPE_ISOCHRONOUS: | 673 | case PIPE_ISOCHRONOUS: |
675 | for (cnt = 0; cnt < urb->number_of_packets; cnt++) { | 674 | for (cnt = urb_priv->td_cnt; cnt < urb->number_of_packets; |
675 | cnt++) { | ||
676 | int frame = urb->start_frame; | 676 | int frame = urb->start_frame; |
677 | 677 | ||
678 | // FIXME scheduling should handle frame counter | 678 | // FIXME scheduling should handle frame counter |
@@ -1128,6 +1128,25 @@ dl_done_list (struct ohci_hcd *ohci) | |||
1128 | 1128 | ||
1129 | while (td) { | 1129 | while (td) { |
1130 | struct td *td_next = td->next_dl_td; | 1130 | struct td *td_next = td->next_dl_td; |
1131 | struct ed *ed = td->ed; | ||
1132 | |||
1133 | /* | ||
1134 | * Some OHCI controllers (NVIDIA for sure, maybe others) | ||
1135 | * occasionally forget to add TDs to the done queue. Since | ||
1136 | * TDs for a given endpoint are always processed in order, | ||
1137 | * if we find a TD on the donelist then all of its | ||
1138 | * predecessors must be finished as well. | ||
1139 | */ | ||
1140 | for (;;) { | ||
1141 | struct td *td2; | ||
1142 | |||
1143 | td2 = list_first_entry(&ed->td_list, struct td, | ||
1144 | td_list); | ||
1145 | if (td2 == td) | ||
1146 | break; | ||
1147 | takeback_td(ohci, td2); | ||
1148 | } | ||
1149 | |||
1131 | takeback_td(ohci, td); | 1150 | takeback_td(ohci, td); |
1132 | td = td_next; | 1151 | td = td_next; |
1133 | } | 1152 | } |
diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c index 0d2309ca471e..ad0f55269603 100644 --- a/drivers/usb/host/ohci-s3c2410.c +++ b/drivers/usb/host/ohci-s3c2410.c | |||
@@ -323,8 +323,6 @@ usb_hcd_s3c2410_remove(struct usb_hcd *hcd, struct platform_device *dev) | |||
323 | { | 323 | { |
324 | usb_remove_hcd(hcd); | 324 | usb_remove_hcd(hcd); |
325 | s3c2410_stop_hc(dev); | 325 | s3c2410_stop_hc(dev); |
326 | iounmap(hcd->regs); | ||
327 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
328 | usb_put_hcd(hcd); | 326 | usb_put_hcd(hcd); |
329 | } | 327 | } |
330 | 328 | ||
@@ -353,35 +351,29 @@ static int usb_hcd_s3c2410_probe(const struct hc_driver *driver, | |||
353 | hcd->rsrc_start = dev->resource[0].start; | 351 | hcd->rsrc_start = dev->resource[0].start; |
354 | hcd->rsrc_len = resource_size(&dev->resource[0]); | 352 | hcd->rsrc_len = resource_size(&dev->resource[0]); |
355 | 353 | ||
356 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | 354 | hcd->regs = devm_request_and_ioremap(&dev->dev, &dev->resource[0]); |
357 | dev_err(&dev->dev, "request_mem_region failed\n"); | 355 | if (!hcd->regs) { |
358 | retval = -EBUSY; | 356 | dev_err(&dev->dev, "devm_request_and_ioremap failed\n"); |
357 | retval = -ENOMEM; | ||
359 | goto err_put; | 358 | goto err_put; |
360 | } | 359 | } |
361 | 360 | ||
362 | clk = clk_get(&dev->dev, "usb-host"); | 361 | clk = devm_clk_get(&dev->dev, "usb-host"); |
363 | if (IS_ERR(clk)) { | 362 | if (IS_ERR(clk)) { |
364 | dev_err(&dev->dev, "cannot get usb-host clock\n"); | 363 | dev_err(&dev->dev, "cannot get usb-host clock\n"); |
365 | retval = PTR_ERR(clk); | 364 | retval = PTR_ERR(clk); |
366 | goto err_mem; | 365 | goto err_put; |
367 | } | 366 | } |
368 | 367 | ||
369 | usb_clk = clk_get(&dev->dev, "usb-bus-host"); | 368 | usb_clk = devm_clk_get(&dev->dev, "usb-bus-host"); |
370 | if (IS_ERR(usb_clk)) { | 369 | if (IS_ERR(usb_clk)) { |
371 | dev_err(&dev->dev, "cannot get usb-bus-host clock\n"); | 370 | dev_err(&dev->dev, "cannot get usb-bus-host clock\n"); |
372 | retval = PTR_ERR(usb_clk); | 371 | retval = PTR_ERR(usb_clk); |
373 | goto err_clk; | 372 | goto err_put; |
374 | } | 373 | } |
375 | 374 | ||
376 | s3c2410_start_hc(dev, hcd); | 375 | s3c2410_start_hc(dev, hcd); |
377 | 376 | ||
378 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | ||
379 | if (!hcd->regs) { | ||
380 | dev_err(&dev->dev, "ioremap failed\n"); | ||
381 | retval = -ENOMEM; | ||
382 | goto err_ioremap; | ||
383 | } | ||
384 | |||
385 | ohci_hcd_init(hcd_to_ohci(hcd)); | 377 | ohci_hcd_init(hcd_to_ohci(hcd)); |
386 | 378 | ||
387 | retval = usb_add_hcd(hcd, dev->resource[1].start, 0); | 379 | retval = usb_add_hcd(hcd, dev->resource[1].start, 0); |
@@ -392,14 +384,6 @@ static int usb_hcd_s3c2410_probe(const struct hc_driver *driver, | |||
392 | 384 | ||
393 | err_ioremap: | 385 | err_ioremap: |
394 | s3c2410_stop_hc(dev); | 386 | s3c2410_stop_hc(dev); |
395 | iounmap(hcd->regs); | ||
396 | clk_put(usb_clk); | ||
397 | |||
398 | err_clk: | ||
399 | clk_put(clk); | ||
400 | |||
401 | err_mem: | ||
402 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
403 | 387 | ||
404 | err_put: | 388 | err_put: |
405 | usb_put_hcd(hcd); | 389 | usb_put_hcd(hcd); |
@@ -474,12 +458,12 @@ static const struct hc_driver ohci_s3c2410_hc_driver = { | |||
474 | 458 | ||
475 | /* device driver */ | 459 | /* device driver */ |
476 | 460 | ||
477 | static int __devinit ohci_hcd_s3c2410_drv_probe(struct platform_device *pdev) | 461 | static int ohci_hcd_s3c2410_drv_probe(struct platform_device *pdev) |
478 | { | 462 | { |
479 | return usb_hcd_s3c2410_probe(&ohci_s3c2410_hc_driver, pdev); | 463 | return usb_hcd_s3c2410_probe(&ohci_s3c2410_hc_driver, pdev); |
480 | } | 464 | } |
481 | 465 | ||
482 | static int __devexit ohci_hcd_s3c2410_drv_remove(struct platform_device *pdev) | 466 | static int ohci_hcd_s3c2410_drv_remove(struct platform_device *pdev) |
483 | { | 467 | { |
484 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | 468 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
485 | 469 | ||
@@ -524,8 +508,7 @@ static int ohci_hcd_s3c2410_drv_resume(struct device *dev) | |||
524 | 508 | ||
525 | s3c2410_start_hc(pdev, hcd); | 509 | s3c2410_start_hc(pdev, hcd); |
526 | 510 | ||
527 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | 511 | ohci_resume(hcd, false); |
528 | ohci_finish_controller_resume(hcd); | ||
529 | 512 | ||
530 | return 0; | 513 | return 0; |
531 | } | 514 | } |
@@ -541,7 +524,7 @@ static const struct dev_pm_ops ohci_hcd_s3c2410_pm_ops = { | |||
541 | 524 | ||
542 | static struct platform_driver ohci_hcd_s3c2410_driver = { | 525 | static struct platform_driver ohci_hcd_s3c2410_driver = { |
543 | .probe = ohci_hcd_s3c2410_drv_probe, | 526 | .probe = ohci_hcd_s3c2410_drv_probe, |
544 | .remove = __devexit_p(ohci_hcd_s3c2410_drv_remove), | 527 | .remove = ohci_hcd_s3c2410_drv_remove, |
545 | .shutdown = usb_hcd_platform_shutdown, | 528 | .shutdown = usb_hcd_platform_shutdown, |
546 | .driver = { | 529 | .driver = { |
547 | .owner = THIS_MODULE, | 530 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/host/ohci-sa1111.c b/drivers/usb/host/ohci-sa1111.c index b6cc92520924..17b2a7dad77b 100644 --- a/drivers/usb/host/ohci-sa1111.c +++ b/drivers/usb/host/ohci-sa1111.c | |||
@@ -63,7 +63,7 @@ static int ohci_sa1111_reset(struct usb_hcd *hcd) | |||
63 | return ohci_init(ohci); | 63 | return ohci_init(ohci); |
64 | } | 64 | } |
65 | 65 | ||
66 | static int __devinit ohci_sa1111_start(struct usb_hcd *hcd) | 66 | static int ohci_sa1111_start(struct usb_hcd *hcd) |
67 | { | 67 | { |
68 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | 68 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
69 | int ret; | 69 | int ret; |
diff --git a/drivers/usb/host/ohci-sh.c b/drivers/usb/host/ohci-sh.c deleted file mode 100644 index 76a20c278362..000000000000 --- a/drivers/usb/host/ohci-sh.c +++ /dev/null | |||
@@ -1,141 +0,0 @@ | |||
1 | /* | ||
2 | * OHCI HCD (Host Controller Driver) for USB. | ||
3 | * | ||
4 | * Copyright (C) 2008 Renesas Solutions Corp. | ||
5 | * | ||
6 | * Author : Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; version 2 of the License. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #include <linux/platform_device.h> | ||
24 | |||
25 | static int ohci_sh_start(struct usb_hcd *hcd) | ||
26 | { | ||
27 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
28 | |||
29 | ohci_hcd_init(ohci); | ||
30 | ohci_init(ohci); | ||
31 | ohci_run(ohci); | ||
32 | return 0; | ||
33 | } | ||
34 | |||
35 | static const struct hc_driver ohci_sh_hc_driver = { | ||
36 | .description = hcd_name, | ||
37 | .product_desc = "SuperH OHCI", | ||
38 | .hcd_priv_size = sizeof(struct ohci_hcd), | ||
39 | |||
40 | /* | ||
41 | * generic hardware linkage | ||
42 | */ | ||
43 | .irq = ohci_irq, | ||
44 | .flags = HCD_USB11 | HCD_MEMORY, | ||
45 | |||
46 | /* | ||
47 | * basic lifecycle operations | ||
48 | */ | ||
49 | .start = ohci_sh_start, | ||
50 | .stop = ohci_stop, | ||
51 | .shutdown = ohci_shutdown, | ||
52 | |||
53 | /* | ||
54 | * managing i/o requests and associated device resources | ||
55 | */ | ||
56 | .urb_enqueue = ohci_urb_enqueue, | ||
57 | .urb_dequeue = ohci_urb_dequeue, | ||
58 | .endpoint_disable = ohci_endpoint_disable, | ||
59 | |||
60 | /* | ||
61 | * scheduling support | ||
62 | */ | ||
63 | .get_frame_number = ohci_get_frame, | ||
64 | |||
65 | /* | ||
66 | * root hub support | ||
67 | */ | ||
68 | .hub_status_data = ohci_hub_status_data, | ||
69 | .hub_control = ohci_hub_control, | ||
70 | #ifdef CONFIG_PM | ||
71 | .bus_suspend = ohci_bus_suspend, | ||
72 | .bus_resume = ohci_bus_resume, | ||
73 | #endif | ||
74 | .start_port_reset = ohci_start_port_reset, | ||
75 | }; | ||
76 | |||
77 | /*-------------------------------------------------------------------------*/ | ||
78 | |||
79 | static int ohci_hcd_sh_probe(struct platform_device *pdev) | ||
80 | { | ||
81 | struct resource *res = NULL; | ||
82 | struct usb_hcd *hcd = NULL; | ||
83 | int irq = -1; | ||
84 | int ret; | ||
85 | |||
86 | if (usb_disabled()) | ||
87 | return -ENODEV; | ||
88 | |||
89 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
90 | if (!res) { | ||
91 | dev_err(&pdev->dev, "platform_get_resource error.\n"); | ||
92 | return -ENODEV; | ||
93 | } | ||
94 | |||
95 | irq = platform_get_irq(pdev, 0); | ||
96 | if (irq < 0) { | ||
97 | dev_err(&pdev->dev, "platform_get_irq error.\n"); | ||
98 | return -ENODEV; | ||
99 | } | ||
100 | |||
101 | /* initialize hcd */ | ||
102 | hcd = usb_create_hcd(&ohci_sh_hc_driver, &pdev->dev, (char *)hcd_name); | ||
103 | if (!hcd) { | ||
104 | dev_err(&pdev->dev, "Failed to create hcd\n"); | ||
105 | return -ENOMEM; | ||
106 | } | ||
107 | |||
108 | hcd->regs = (void __iomem *)res->start; | ||
109 | hcd->rsrc_start = res->start; | ||
110 | hcd->rsrc_len = resource_size(res); | ||
111 | ret = usb_add_hcd(hcd, irq, IRQF_SHARED); | ||
112 | if (ret != 0) { | ||
113 | dev_err(&pdev->dev, "Failed to add hcd\n"); | ||
114 | usb_put_hcd(hcd); | ||
115 | return ret; | ||
116 | } | ||
117 | |||
118 | return ret; | ||
119 | } | ||
120 | |||
121 | static int ohci_hcd_sh_remove(struct platform_device *pdev) | ||
122 | { | ||
123 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
124 | |||
125 | usb_remove_hcd(hcd); | ||
126 | usb_put_hcd(hcd); | ||
127 | |||
128 | return 0; | ||
129 | } | ||
130 | |||
131 | static struct platform_driver ohci_hcd_sh_driver = { | ||
132 | .probe = ohci_hcd_sh_probe, | ||
133 | .remove = ohci_hcd_sh_remove, | ||
134 | .shutdown = usb_hcd_platform_shutdown, | ||
135 | .driver = { | ||
136 | .name = "sh_ohci", | ||
137 | .owner = THIS_MODULE, | ||
138 | }, | ||
139 | }; | ||
140 | |||
141 | MODULE_ALIAS("platform:sh_ohci"); | ||
diff --git a/drivers/usb/host/ohci-sm501.c b/drivers/usb/host/ohci-sm501.c index 5596ac2ba1ca..3b5b908fd47b 100644 --- a/drivers/usb/host/ohci-sm501.c +++ b/drivers/usb/host/ohci-sm501.c | |||
@@ -238,7 +238,7 @@ static int ohci_sm501_resume(struct platform_device *pdev) | |||
238 | ohci->next_statechange = jiffies; | 238 | ohci->next_statechange = jiffies; |
239 | 239 | ||
240 | sm501_unit_power(dev->parent, SM501_GATE_USB_HOST, 1); | 240 | sm501_unit_power(dev->parent, SM501_GATE_USB_HOST, 1); |
241 | ohci_finish_controller_resume(hcd); | 241 | ohci_resume(hcd, false); |
242 | return 0; | 242 | return 0; |
243 | } | 243 | } |
244 | #else | 244 | #else |
diff --git a/drivers/usb/host/ohci-spear.c b/drivers/usb/host/ohci-spear.c index fc7305ee3c9c..9020bf0e2eca 100644 --- a/drivers/usb/host/ohci-spear.c +++ b/drivers/usb/host/ohci-spear.c | |||
@@ -33,7 +33,7 @@ static void spear_stop_ohci(struct spear_ohci *ohci) | |||
33 | clk_disable_unprepare(ohci->clk); | 33 | clk_disable_unprepare(ohci->clk); |
34 | } | 34 | } |
35 | 35 | ||
36 | static int __devinit ohci_spear_start(struct usb_hcd *hcd) | 36 | static int ohci_spear_start(struct usb_hcd *hcd) |
37 | { | 37 | { |
38 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | 38 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
39 | int ret; | 39 | int ret; |
@@ -101,13 +101,11 @@ static int spear_ohci_hcd_drv_probe(struct platform_device *pdev) | |||
101 | struct spear_ohci *ohci_p; | 101 | struct spear_ohci *ohci_p; |
102 | struct resource *res; | 102 | struct resource *res; |
103 | int retval, irq; | 103 | int retval, irq; |
104 | char clk_name[20] = "usbh_clk"; | ||
105 | static int instance = -1; | ||
106 | 104 | ||
107 | irq = platform_get_irq(pdev, 0); | 105 | irq = platform_get_irq(pdev, 0); |
108 | if (irq < 0) { | 106 | if (irq < 0) { |
109 | retval = irq; | 107 | retval = irq; |
110 | goto fail_irq_get; | 108 | goto fail; |
111 | } | 109 | } |
112 | 110 | ||
113 | /* | 111 | /* |
@@ -118,47 +116,39 @@ static int spear_ohci_hcd_drv_probe(struct platform_device *pdev) | |||
118 | if (!pdev->dev.dma_mask) | 116 | if (!pdev->dev.dma_mask) |
119 | pdev->dev.dma_mask = &spear_ohci_dma_mask; | 117 | pdev->dev.dma_mask = &spear_ohci_dma_mask; |
120 | 118 | ||
121 | /* | 119 | usbh_clk = devm_clk_get(&pdev->dev, NULL); |
122 | * Increment the device instance, when probing via device-tree | ||
123 | */ | ||
124 | if (pdev->id < 0) | ||
125 | instance++; | ||
126 | else | ||
127 | instance = pdev->id; | ||
128 | sprintf(clk_name, "usbh.%01d_clk", instance); | ||
129 | |||
130 | usbh_clk = clk_get(NULL, clk_name); | ||
131 | if (IS_ERR(usbh_clk)) { | 120 | if (IS_ERR(usbh_clk)) { |
132 | dev_err(&pdev->dev, "Error getting interface clock\n"); | 121 | dev_err(&pdev->dev, "Error getting interface clock\n"); |
133 | retval = PTR_ERR(usbh_clk); | 122 | retval = PTR_ERR(usbh_clk); |
134 | goto fail_get_usbh_clk; | 123 | goto fail; |
135 | } | 124 | } |
136 | 125 | ||
137 | hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); | 126 | hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); |
138 | if (!hcd) { | 127 | if (!hcd) { |
139 | retval = -ENOMEM; | 128 | retval = -ENOMEM; |
140 | goto fail_create_hcd; | 129 | goto fail; |
141 | } | 130 | } |
142 | 131 | ||
143 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 132 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
144 | if (!res) { | 133 | if (!res) { |
145 | retval = -ENODEV; | 134 | retval = -ENODEV; |
146 | goto fail_request_resource; | 135 | goto err_put_hcd; |
147 | } | 136 | } |
148 | 137 | ||
149 | hcd->rsrc_start = pdev->resource[0].start; | 138 | hcd->rsrc_start = pdev->resource[0].start; |
150 | hcd->rsrc_len = resource_size(res); | 139 | hcd->rsrc_len = resource_size(res); |
151 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | 140 | if (!devm_request_mem_region(&pdev->dev, hcd->rsrc_start, hcd->rsrc_len, |
141 | hcd_name)) { | ||
152 | dev_dbg(&pdev->dev, "request_mem_region failed\n"); | 142 | dev_dbg(&pdev->dev, "request_mem_region failed\n"); |
153 | retval = -EBUSY; | 143 | retval = -EBUSY; |
154 | goto fail_request_resource; | 144 | goto err_put_hcd; |
155 | } | 145 | } |
156 | 146 | ||
157 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | 147 | hcd->regs = devm_ioremap(&pdev->dev, hcd->rsrc_start, hcd->rsrc_len); |
158 | if (!hcd->regs) { | 148 | if (!hcd->regs) { |
159 | dev_dbg(&pdev->dev, "ioremap failed\n"); | 149 | dev_dbg(&pdev->dev, "ioremap failed\n"); |
160 | retval = -ENOMEM; | 150 | retval = -ENOMEM; |
161 | goto fail_ioremap; | 151 | goto err_put_hcd; |
162 | } | 152 | } |
163 | 153 | ||
164 | ohci_p = (struct spear_ohci *)hcd_to_ohci(hcd); | 154 | ohci_p = (struct spear_ohci *)hcd_to_ohci(hcd); |
@@ -171,15 +161,9 @@ static int spear_ohci_hcd_drv_probe(struct platform_device *pdev) | |||
171 | return retval; | 161 | return retval; |
172 | 162 | ||
173 | spear_stop_ohci(ohci_p); | 163 | spear_stop_ohci(ohci_p); |
174 | iounmap(hcd->regs); | 164 | err_put_hcd: |
175 | fail_ioremap: | ||
176 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
177 | fail_request_resource: | ||
178 | usb_put_hcd(hcd); | 165 | usb_put_hcd(hcd); |
179 | fail_create_hcd: | 166 | fail: |
180 | clk_put(usbh_clk); | ||
181 | fail_get_usbh_clk: | ||
182 | fail_irq_get: | ||
183 | dev_err(&pdev->dev, "init fail, %d\n", retval); | 167 | dev_err(&pdev->dev, "init fail, %d\n", retval); |
184 | 168 | ||
185 | return retval; | 169 | return retval; |
@@ -194,12 +178,8 @@ static int spear_ohci_hcd_drv_remove(struct platform_device *pdev) | |||
194 | if (ohci_p->clk) | 178 | if (ohci_p->clk) |
195 | spear_stop_ohci(ohci_p); | 179 | spear_stop_ohci(ohci_p); |
196 | 180 | ||
197 | iounmap(hcd->regs); | ||
198 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
199 | usb_put_hcd(hcd); | 181 | usb_put_hcd(hcd); |
200 | 182 | ||
201 | if (ohci_p->clk) | ||
202 | clk_put(ohci_p->clk); | ||
203 | platform_set_drvdata(pdev, NULL); | 183 | platform_set_drvdata(pdev, NULL); |
204 | return 0; | 184 | return 0; |
205 | } | 185 | } |
@@ -231,12 +211,12 @@ static int spear_ohci_hcd_drv_resume(struct platform_device *dev) | |||
231 | ohci->next_statechange = jiffies; | 211 | ohci->next_statechange = jiffies; |
232 | 212 | ||
233 | spear_start_ohci(ohci_p); | 213 | spear_start_ohci(ohci_p); |
234 | ohci_finish_controller_resume(hcd); | 214 | ohci_resume(hcd, false); |
235 | return 0; | 215 | return 0; |
236 | } | 216 | } |
237 | #endif | 217 | #endif |
238 | 218 | ||
239 | static struct of_device_id spear_ohci_id_table[] __devinitdata = { | 219 | static struct of_device_id spear_ohci_id_table[] = { |
240 | { .compatible = "st,spear600-ohci", }, | 220 | { .compatible = "st,spear600-ohci", }, |
241 | { }, | 221 | { }, |
242 | }; | 222 | }; |
diff --git a/drivers/usb/host/ohci-tmio.c b/drivers/usb/host/ohci-tmio.c index 60c2b0722f2e..d370245a4ee2 100644 --- a/drivers/usb/host/ohci-tmio.c +++ b/drivers/usb/host/ohci-tmio.c | |||
@@ -184,7 +184,7 @@ static const struct hc_driver ohci_tmio_hc_driver = { | |||
184 | /*-------------------------------------------------------------------------*/ | 184 | /*-------------------------------------------------------------------------*/ |
185 | static struct platform_driver ohci_hcd_tmio_driver; | 185 | static struct platform_driver ohci_hcd_tmio_driver; |
186 | 186 | ||
187 | static int __devinit ohci_hcd_tmio_drv_probe(struct platform_device *dev) | 187 | static int ohci_hcd_tmio_drv_probe(struct platform_device *dev) |
188 | { | 188 | { |
189 | const struct mfd_cell *cell = mfd_get_cell(dev); | 189 | const struct mfd_cell *cell = mfd_get_cell(dev); |
190 | struct resource *regs = platform_get_resource(dev, IORESOURCE_MEM, 0); | 190 | struct resource *regs = platform_get_resource(dev, IORESOURCE_MEM, 0); |
@@ -271,7 +271,7 @@ err_usb_create_hcd: | |||
271 | return ret; | 271 | return ret; |
272 | } | 272 | } |
273 | 273 | ||
274 | static int __devexit ohci_hcd_tmio_drv_remove(struct platform_device *dev) | 274 | static int ohci_hcd_tmio_drv_remove(struct platform_device *dev) |
275 | { | 275 | { |
276 | struct usb_hcd *hcd = platform_get_drvdata(dev); | 276 | struct usb_hcd *hcd = platform_get_drvdata(dev); |
277 | struct tmio_hcd *tmio = hcd_to_tmio(hcd); | 277 | struct tmio_hcd *tmio = hcd_to_tmio(hcd); |
@@ -352,7 +352,7 @@ static int ohci_hcd_tmio_drv_resume(struct platform_device *dev) | |||
352 | 352 | ||
353 | spin_unlock_irqrestore(&tmio->lock, flags); | 353 | spin_unlock_irqrestore(&tmio->lock, flags); |
354 | 354 | ||
355 | ohci_finish_controller_resume(hcd); | 355 | ohci_resume(hcd, false); |
356 | 356 | ||
357 | return 0; | 357 | return 0; |
358 | } | 358 | } |
@@ -363,7 +363,7 @@ static int ohci_hcd_tmio_drv_resume(struct platform_device *dev) | |||
363 | 363 | ||
364 | static struct platform_driver ohci_hcd_tmio_driver = { | 364 | static struct platform_driver ohci_hcd_tmio_driver = { |
365 | .probe = ohci_hcd_tmio_drv_probe, | 365 | .probe = ohci_hcd_tmio_drv_probe, |
366 | .remove = __devexit_p(ohci_hcd_tmio_drv_remove), | 366 | .remove = ohci_hcd_tmio_drv_remove, |
367 | .shutdown = usb_hcd_platform_shutdown, | 367 | .shutdown = usb_hcd_platform_shutdown, |
368 | .suspend = ohci_hcd_tmio_drv_suspend, | 368 | .suspend = ohci_hcd_tmio_drv_suspend, |
369 | .resume = ohci_hcd_tmio_drv_resume, | 369 | .resume = ohci_hcd_tmio_drv_resume, |
diff --git a/drivers/usb/host/ohci-xls.c b/drivers/usb/host/ohci-xls.c deleted file mode 100644 index 41e378f17c66..000000000000 --- a/drivers/usb/host/ohci-xls.c +++ /dev/null | |||
@@ -1,152 +0,0 @@ | |||
1 | /* | ||
2 | * OHCI HCD for Netlogic XLS processors. | ||
3 | * | ||
4 | * (C) Copyright 2011 Netlogic Microsystems Inc. | ||
5 | * | ||
6 | * Based on ohci-au1xxx.c, and other Linux OHCI drivers. | ||
7 | * | ||
8 | * This file is subject to the terms and conditions of the GNU General Public | ||
9 | * License. See the file COPYING in the main directory of this archive for | ||
10 | * more details. | ||
11 | */ | ||
12 | |||
13 | #include <linux/platform_device.h> | ||
14 | #include <linux/signal.h> | ||
15 | |||
16 | static int ohci_xls_probe_internal(const struct hc_driver *driver, | ||
17 | struct platform_device *dev) | ||
18 | { | ||
19 | struct resource *res; | ||
20 | struct usb_hcd *hcd; | ||
21 | int retval, irq; | ||
22 | |||
23 | /* Get our IRQ from an earlier registered Platform Resource */ | ||
24 | irq = platform_get_irq(dev, 0); | ||
25 | if (irq < 0) { | ||
26 | dev_err(&dev->dev, "Found HC with no IRQ\n"); | ||
27 | return -ENODEV; | ||
28 | } | ||
29 | |||
30 | /* Get our Memory Handle */ | ||
31 | res = platform_get_resource(dev, IORESOURCE_MEM, 0); | ||
32 | if (!res) { | ||
33 | dev_err(&dev->dev, "MMIO Handle incorrect!\n"); | ||
34 | return -ENODEV; | ||
35 | } | ||
36 | |||
37 | hcd = usb_create_hcd(driver, &dev->dev, "XLS"); | ||
38 | if (!hcd) { | ||
39 | retval = -ENOMEM; | ||
40 | goto err1; | ||
41 | } | ||
42 | hcd->rsrc_start = res->start; | ||
43 | hcd->rsrc_len = resource_size(res); | ||
44 | |||
45 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, | ||
46 | driver->description)) { | ||
47 | dev_dbg(&dev->dev, "Controller already in use\n"); | ||
48 | retval = -EBUSY; | ||
49 | goto err2; | ||
50 | } | ||
51 | |||
52 | hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len); | ||
53 | if (hcd->regs == NULL) { | ||
54 | dev_dbg(&dev->dev, "error mapping memory\n"); | ||
55 | retval = -EFAULT; | ||
56 | goto err3; | ||
57 | } | ||
58 | |||
59 | retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); | ||
60 | if (retval != 0) | ||
61 | goto err4; | ||
62 | return retval; | ||
63 | |||
64 | err4: | ||
65 | iounmap(hcd->regs); | ||
66 | err3: | ||
67 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
68 | err2: | ||
69 | usb_put_hcd(hcd); | ||
70 | err1: | ||
71 | dev_err(&dev->dev, "init fail, %d\n", retval); | ||
72 | return retval; | ||
73 | } | ||
74 | |||
75 | static int ohci_xls_reset(struct usb_hcd *hcd) | ||
76 | { | ||
77 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
78 | |||
79 | ohci_hcd_init(ohci); | ||
80 | return ohci_init(ohci); | ||
81 | } | ||
82 | |||
83 | static int __devinit ohci_xls_start(struct usb_hcd *hcd) | ||
84 | { | ||
85 | struct ohci_hcd *ohci; | ||
86 | int ret; | ||
87 | |||
88 | ohci = hcd_to_ohci(hcd); | ||
89 | ret = ohci_run(ohci); | ||
90 | if (ret < 0) { | ||
91 | dev_err(hcd->self.controller, "can't start %s\n", | ||
92 | hcd->self.bus_name); | ||
93 | ohci_stop(hcd); | ||
94 | return ret; | ||
95 | } | ||
96 | return 0; | ||
97 | } | ||
98 | |||
99 | static struct hc_driver ohci_xls_hc_driver = { | ||
100 | .description = hcd_name, | ||
101 | .product_desc = "XLS OHCI Host Controller", | ||
102 | .hcd_priv_size = sizeof(struct ohci_hcd), | ||
103 | .irq = ohci_irq, | ||
104 | .flags = HCD_MEMORY | HCD_USB11, | ||
105 | .reset = ohci_xls_reset, | ||
106 | .start = ohci_xls_start, | ||
107 | .stop = ohci_stop, | ||
108 | .shutdown = ohci_shutdown, | ||
109 | .urb_enqueue = ohci_urb_enqueue, | ||
110 | .urb_dequeue = ohci_urb_dequeue, | ||
111 | .endpoint_disable = ohci_endpoint_disable, | ||
112 | .get_frame_number = ohci_get_frame, | ||
113 | .hub_status_data = ohci_hub_status_data, | ||
114 | .hub_control = ohci_hub_control, | ||
115 | #ifdef CONFIG_PM | ||
116 | .bus_suspend = ohci_bus_suspend, | ||
117 | .bus_resume = ohci_bus_resume, | ||
118 | #endif | ||
119 | .start_port_reset = ohci_start_port_reset, | ||
120 | }; | ||
121 | |||
122 | static int ohci_xls_probe(struct platform_device *dev) | ||
123 | { | ||
124 | int ret; | ||
125 | |||
126 | pr_debug("In ohci_xls_probe"); | ||
127 | if (usb_disabled()) | ||
128 | return -ENODEV; | ||
129 | ret = ohci_xls_probe_internal(&ohci_xls_hc_driver, dev); | ||
130 | return ret; | ||
131 | } | ||
132 | |||
133 | static int ohci_xls_remove(struct platform_device *dev) | ||
134 | { | ||
135 | struct usb_hcd *hcd = platform_get_drvdata(dev); | ||
136 | |||
137 | usb_remove_hcd(hcd); | ||
138 | iounmap(hcd->regs); | ||
139 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
140 | usb_put_hcd(hcd); | ||
141 | return 0; | ||
142 | } | ||
143 | |||
144 | static struct platform_driver ohci_xls_driver = { | ||
145 | .probe = ohci_xls_probe, | ||
146 | .remove = ohci_xls_remove, | ||
147 | .shutdown = usb_hcd_platform_shutdown, | ||
148 | .driver = { | ||
149 | .name = "ohci-xls-0", | ||
150 | .owner = THIS_MODULE, | ||
151 | }, | ||
152 | }; | ||
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index 39f9e4a9a2d3..a3b6d7104ae2 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c | |||
@@ -443,7 +443,7 @@ static inline int io_type_enabled(struct pci_dev *pdev, unsigned int mask) | |||
443 | #define pio_enabled(dev) io_type_enabled(dev, PCI_COMMAND_IO) | 443 | #define pio_enabled(dev) io_type_enabled(dev, PCI_COMMAND_IO) |
444 | #define mmio_enabled(dev) io_type_enabled(dev, PCI_COMMAND_MEMORY) | 444 | #define mmio_enabled(dev) io_type_enabled(dev, PCI_COMMAND_MEMORY) |
445 | 445 | ||
446 | static void __devinit quirk_usb_handoff_uhci(struct pci_dev *pdev) | 446 | static void quirk_usb_handoff_uhci(struct pci_dev *pdev) |
447 | { | 447 | { |
448 | unsigned long base = 0; | 448 | unsigned long base = 0; |
449 | int i; | 449 | int i; |
@@ -461,12 +461,12 @@ static void __devinit quirk_usb_handoff_uhci(struct pci_dev *pdev) | |||
461 | uhci_check_and_reset_hc(pdev, base); | 461 | uhci_check_and_reset_hc(pdev, base); |
462 | } | 462 | } |
463 | 463 | ||
464 | static int __devinit mmio_resource_enabled(struct pci_dev *pdev, int idx) | 464 | static int mmio_resource_enabled(struct pci_dev *pdev, int idx) |
465 | { | 465 | { |
466 | return pci_resource_start(pdev, idx) && mmio_enabled(pdev); | 466 | return pci_resource_start(pdev, idx) && mmio_enabled(pdev); |
467 | } | 467 | } |
468 | 468 | ||
469 | static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) | 469 | static void quirk_usb_handoff_ohci(struct pci_dev *pdev) |
470 | { | 470 | { |
471 | void __iomem *base; | 471 | void __iomem *base; |
472 | u32 control; | 472 | u32 control; |
@@ -533,7 +533,7 @@ static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) | |||
533 | iounmap(base); | 533 | iounmap(base); |
534 | } | 534 | } |
535 | 535 | ||
536 | static const struct dmi_system_id __devinitconst ehci_dmi_nohandoff_table[] = { | 536 | static const struct dmi_system_id ehci_dmi_nohandoff_table[] = { |
537 | { | 537 | { |
538 | /* Pegatron Lucid (ExoPC) */ | 538 | /* Pegatron Lucid (ExoPC) */ |
539 | .matches = { | 539 | .matches = { |
@@ -558,7 +558,7 @@ static const struct dmi_system_id __devinitconst ehci_dmi_nohandoff_table[] = { | |||
558 | { } | 558 | { } |
559 | }; | 559 | }; |
560 | 560 | ||
561 | static void __devinit ehci_bios_handoff(struct pci_dev *pdev, | 561 | static void ehci_bios_handoff(struct pci_dev *pdev, |
562 | void __iomem *op_reg_base, | 562 | void __iomem *op_reg_base, |
563 | u32 cap, u8 offset) | 563 | u32 cap, u8 offset) |
564 | { | 564 | { |
@@ -626,7 +626,7 @@ static void __devinit ehci_bios_handoff(struct pci_dev *pdev, | |||
626 | writel(0, op_reg_base + EHCI_CONFIGFLAG); | 626 | writel(0, op_reg_base + EHCI_CONFIGFLAG); |
627 | } | 627 | } |
628 | 628 | ||
629 | static void __devinit quirk_usb_disable_ehci(struct pci_dev *pdev) | 629 | static void quirk_usb_disable_ehci(struct pci_dev *pdev) |
630 | { | 630 | { |
631 | void __iomem *base, *op_reg_base; | 631 | void __iomem *base, *op_reg_base; |
632 | u32 hcc_params, cap, val; | 632 | u32 hcc_params, cap, val; |
@@ -723,6 +723,7 @@ static int handshake(void __iomem *ptr, u32 mask, u32 done, | |||
723 | } | 723 | } |
724 | 724 | ||
725 | #define PCI_DEVICE_ID_INTEL_LYNX_POINT_XHCI 0x8C31 | 725 | #define PCI_DEVICE_ID_INTEL_LYNX_POINT_XHCI 0x8C31 |
726 | #define PCI_DEVICE_ID_INTEL_LYNX_POINT_LP_XHCI 0x9C31 | ||
726 | 727 | ||
727 | bool usb_is_intel_ppt_switchable_xhci(struct pci_dev *pdev) | 728 | bool usb_is_intel_ppt_switchable_xhci(struct pci_dev *pdev) |
728 | { | 729 | { |
@@ -736,7 +737,8 @@ bool usb_is_intel_lpt_switchable_xhci(struct pci_dev *pdev) | |||
736 | { | 737 | { |
737 | return pdev->class == PCI_CLASS_SERIAL_USB_XHCI && | 738 | return pdev->class == PCI_CLASS_SERIAL_USB_XHCI && |
738 | pdev->vendor == PCI_VENDOR_ID_INTEL && | 739 | pdev->vendor == PCI_VENDOR_ID_INTEL && |
739 | pdev->device == PCI_DEVICE_ID_INTEL_LYNX_POINT_XHCI; | 740 | (pdev->device == PCI_DEVICE_ID_INTEL_LYNX_POINT_XHCI || |
741 | pdev->device == PCI_DEVICE_ID_INTEL_LYNX_POINT_LP_XHCI); | ||
740 | } | 742 | } |
741 | 743 | ||
742 | bool usb_is_intel_switchable_xhci(struct pci_dev *pdev) | 744 | bool usb_is_intel_switchable_xhci(struct pci_dev *pdev) |
@@ -841,7 +843,7 @@ EXPORT_SYMBOL_GPL(usb_disable_xhci_ports); | |||
841 | * and then waits 5 seconds for the BIOS to hand over control. | 843 | * and then waits 5 seconds for the BIOS to hand over control. |
842 | * If we timeout, assume the BIOS is broken and take control anyway. | 844 | * If we timeout, assume the BIOS is broken and take control anyway. |
843 | */ | 845 | */ |
844 | static void __devinit quirk_usb_handoff_xhci(struct pci_dev *pdev) | 846 | static void quirk_usb_handoff_xhci(struct pci_dev *pdev) |
845 | { | 847 | { |
846 | void __iomem *base; | 848 | void __iomem *base; |
847 | int ext_cap_offset; | 849 | int ext_cap_offset; |
@@ -941,7 +943,7 @@ hc_init: | |||
941 | iounmap(base); | 943 | iounmap(base); |
942 | } | 944 | } |
943 | 945 | ||
944 | static void __devinit quirk_usb_early_handoff(struct pci_dev *pdev) | 946 | static void quirk_usb_early_handoff(struct pci_dev *pdev) |
945 | { | 947 | { |
946 | /* Skip Netlogic mips SoC's internal PCI USB controller. | 948 | /* Skip Netlogic mips SoC's internal PCI USB controller. |
947 | * This device does not need/support EHCI/OHCI handoff | 949 | * This device does not need/support EHCI/OHCI handoff |
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index fcc09e5ec0ad..a6fd8f5371df 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c | |||
@@ -2036,10 +2036,8 @@ static void collect_usb_address_map(struct usb_device *udev, unsigned long *map) | |||
2036 | udev->parent->descriptor.bDeviceClass == USB_CLASS_HUB) | 2036 | udev->parent->descriptor.bDeviceClass == USB_CLASS_HUB) |
2037 | map[udev->devnum/32] |= (1 << (udev->devnum % 32)); | 2037 | map[udev->devnum/32] |= (1 << (udev->devnum % 32)); |
2038 | 2038 | ||
2039 | usb_hub_for_each_child(udev, chix, childdev) { | 2039 | usb_hub_for_each_child(udev, chix, childdev) |
2040 | if (childdev) | 2040 | collect_usb_address_map(childdev, map); |
2041 | collect_usb_address_map(childdev, map); | ||
2042 | } | ||
2043 | } | 2041 | } |
2044 | 2042 | ||
2045 | /* this function must be called with interrupt disabled */ | 2043 | /* this function must be called with interrupt disabled */ |
@@ -2393,7 +2391,7 @@ static const struct dev_pm_ops r8a66597_dev_pm_ops = { | |||
2393 | #define R8A66597_DEV_PM_OPS NULL | 2391 | #define R8A66597_DEV_PM_OPS NULL |
2394 | #endif | 2392 | #endif |
2395 | 2393 | ||
2396 | static int __devexit r8a66597_remove(struct platform_device *pdev) | 2394 | static int r8a66597_remove(struct platform_device *pdev) |
2397 | { | 2395 | { |
2398 | struct r8a66597 *r8a66597 = dev_get_drvdata(&pdev->dev); | 2396 | struct r8a66597 *r8a66597 = dev_get_drvdata(&pdev->dev); |
2399 | struct usb_hcd *hcd = r8a66597_to_hcd(r8a66597); | 2397 | struct usb_hcd *hcd = r8a66597_to_hcd(r8a66597); |
@@ -2407,7 +2405,7 @@ static int __devexit r8a66597_remove(struct platform_device *pdev) | |||
2407 | return 0; | 2405 | return 0; |
2408 | } | 2406 | } |
2409 | 2407 | ||
2410 | static int __devinit r8a66597_probe(struct platform_device *pdev) | 2408 | static int r8a66597_probe(struct platform_device *pdev) |
2411 | { | 2409 | { |
2412 | char clk_name[8]; | 2410 | char clk_name[8]; |
2413 | struct resource *res = NULL, *ires; | 2411 | struct resource *res = NULL, *ires; |
@@ -2534,7 +2532,7 @@ clean_up: | |||
2534 | 2532 | ||
2535 | static struct platform_driver r8a66597_driver = { | 2533 | static struct platform_driver r8a66597_driver = { |
2536 | .probe = r8a66597_probe, | 2534 | .probe = r8a66597_probe, |
2537 | .remove = __devexit_p(r8a66597_remove), | 2535 | .remove = r8a66597_remove, |
2538 | .driver = { | 2536 | .driver = { |
2539 | .name = (char *) hcd_name, | 2537 | .name = (char *) hcd_name, |
2540 | .owner = THIS_MODULE, | 2538 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c index 619b05f42d4f..d62f0404baaa 100644 --- a/drivers/usb/host/sl811-hcd.c +++ b/drivers/usb/host/sl811-hcd.c | |||
@@ -1595,7 +1595,7 @@ static struct hc_driver sl811h_hc_driver = { | |||
1595 | 1595 | ||
1596 | /*-------------------------------------------------------------------------*/ | 1596 | /*-------------------------------------------------------------------------*/ |
1597 | 1597 | ||
1598 | static int __devexit | 1598 | static int |
1599 | sl811h_remove(struct platform_device *dev) | 1599 | sl811h_remove(struct platform_device *dev) |
1600 | { | 1600 | { |
1601 | struct usb_hcd *hcd = platform_get_drvdata(dev); | 1601 | struct usb_hcd *hcd = platform_get_drvdata(dev); |
@@ -1618,7 +1618,7 @@ sl811h_remove(struct platform_device *dev) | |||
1618 | return 0; | 1618 | return 0; |
1619 | } | 1619 | } |
1620 | 1620 | ||
1621 | static int __devinit | 1621 | static int |
1622 | sl811h_probe(struct platform_device *dev) | 1622 | sl811h_probe(struct platform_device *dev) |
1623 | { | 1623 | { |
1624 | struct usb_hcd *hcd; | 1624 | struct usb_hcd *hcd; |
@@ -1808,7 +1808,7 @@ sl811h_resume(struct platform_device *dev) | |||
1808 | /* this driver is exported so sl811_cs can depend on it */ | 1808 | /* this driver is exported so sl811_cs can depend on it */ |
1809 | struct platform_driver sl811h_driver = { | 1809 | struct platform_driver sl811h_driver = { |
1810 | .probe = sl811h_probe, | 1810 | .probe = sl811h_probe, |
1811 | .remove = __devexit_p(sl811h_remove), | 1811 | .remove = sl811h_remove, |
1812 | 1812 | ||
1813 | .suspend = sl811h_suspend, | 1813 | .suspend = sl811h_suspend, |
1814 | .resume = sl811h_resume, | 1814 | .resume = sl811h_resume, |
diff --git a/drivers/usb/host/ssb-hcd.c b/drivers/usb/host/ssb-hcd.c index c2a29faba076..74af2c6287d2 100644 --- a/drivers/usb/host/ssb-hcd.c +++ b/drivers/usb/host/ssb-hcd.c | |||
@@ -39,7 +39,7 @@ struct ssb_hcd_device { | |||
39 | u32 enable_flags; | 39 | u32 enable_flags; |
40 | }; | 40 | }; |
41 | 41 | ||
42 | static void __devinit ssb_hcd_5354wa(struct ssb_device *dev) | 42 | static void ssb_hcd_5354wa(struct ssb_device *dev) |
43 | { | 43 | { |
44 | #ifdef CONFIG_SSB_DRIVER_MIPS | 44 | #ifdef CONFIG_SSB_DRIVER_MIPS |
45 | /* Work around for 5354 failures */ | 45 | /* Work around for 5354 failures */ |
@@ -53,7 +53,7 @@ static void __devinit ssb_hcd_5354wa(struct ssb_device *dev) | |||
53 | #endif | 53 | #endif |
54 | } | 54 | } |
55 | 55 | ||
56 | static void __devinit ssb_hcd_usb20wa(struct ssb_device *dev) | 56 | static void ssb_hcd_usb20wa(struct ssb_device *dev) |
57 | { | 57 | { |
58 | if (dev->id.coreid == SSB_DEV_USB20_HOST) { | 58 | if (dev->id.coreid == SSB_DEV_USB20_HOST) { |
59 | /* | 59 | /* |
@@ -80,7 +80,7 @@ static void __devinit ssb_hcd_usb20wa(struct ssb_device *dev) | |||
80 | } | 80 | } |
81 | 81 | ||
82 | /* based on arch/mips/brcm-boards/bcm947xx/pcibios.c */ | 82 | /* based on arch/mips/brcm-boards/bcm947xx/pcibios.c */ |
83 | static u32 __devinit ssb_hcd_init_chip(struct ssb_device *dev) | 83 | static u32 ssb_hcd_init_chip(struct ssb_device *dev) |
84 | { | 84 | { |
85 | u32 flags = 0; | 85 | u32 flags = 0; |
86 | 86 | ||
@@ -101,8 +101,7 @@ static const struct usb_ehci_pdata ehci_pdata = { | |||
101 | static const struct usb_ohci_pdata ohci_pdata = { | 101 | static const struct usb_ohci_pdata ohci_pdata = { |
102 | }; | 102 | }; |
103 | 103 | ||
104 | static struct platform_device * __devinit | 104 | static struct platform_device *ssb_hcd_create_pdev(struct ssb_device *dev, bool ohci, u32 addr, u32 len) |
105 | ssb_hcd_create_pdev(struct ssb_device *dev, bool ohci, u32 addr, u32 len) | ||
106 | { | 105 | { |
107 | struct platform_device *hci_dev; | 106 | struct platform_device *hci_dev; |
108 | struct resource hci_res[2]; | 107 | struct resource hci_res[2]; |
@@ -148,7 +147,7 @@ err_alloc: | |||
148 | return ERR_PTR(ret); | 147 | return ERR_PTR(ret); |
149 | } | 148 | } |
150 | 149 | ||
151 | static int __devinit ssb_hcd_probe(struct ssb_device *dev, | 150 | static int ssb_hcd_probe(struct ssb_device *dev, |
152 | const struct ssb_device_id *id) | 151 | const struct ssb_device_id *id) |
153 | { | 152 | { |
154 | int err, tmp; | 153 | int err, tmp; |
@@ -207,7 +206,7 @@ err_free_usb_dev: | |||
207 | return err; | 206 | return err; |
208 | } | 207 | } |
209 | 208 | ||
210 | static void __devexit ssb_hcd_remove(struct ssb_device *dev) | 209 | static void ssb_hcd_remove(struct ssb_device *dev) |
211 | { | 210 | { |
212 | struct ssb_hcd_device *usb_dev = ssb_get_drvdata(dev); | 211 | struct ssb_hcd_device *usb_dev = ssb_get_drvdata(dev); |
213 | struct platform_device *ohci_dev = usb_dev->ohci_dev; | 212 | struct platform_device *ohci_dev = usb_dev->ohci_dev; |
@@ -221,7 +220,7 @@ static void __devexit ssb_hcd_remove(struct ssb_device *dev) | |||
221 | ssb_device_disable(dev, 0); | 220 | ssb_device_disable(dev, 0); |
222 | } | 221 | } |
223 | 222 | ||
224 | static void __devexit ssb_hcd_shutdown(struct ssb_device *dev) | 223 | static void ssb_hcd_shutdown(struct ssb_device *dev) |
225 | { | 224 | { |
226 | ssb_device_disable(dev, 0); | 225 | ssb_device_disable(dev, 0); |
227 | } | 226 | } |
@@ -249,7 +248,7 @@ static int ssb_hcd_resume(struct ssb_device *dev) | |||
249 | #define ssb_hcd_resume NULL | 248 | #define ssb_hcd_resume NULL |
250 | #endif /* CONFIG_PM */ | 249 | #endif /* CONFIG_PM */ |
251 | 250 | ||
252 | static const struct ssb_device_id ssb_hcd_table[] __devinitconst = { | 251 | static const struct ssb_device_id ssb_hcd_table[] = { |
253 | SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB11_HOSTDEV, SSB_ANY_REV), | 252 | SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB11_HOSTDEV, SSB_ANY_REV), |
254 | SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB11_HOST, SSB_ANY_REV), | 253 | SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB11_HOST, SSB_ANY_REV), |
255 | SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB20_HOST, SSB_ANY_REV), | 254 | SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB20_HOST, SSB_ANY_REV), |
@@ -261,7 +260,7 @@ static struct ssb_driver ssb_hcd_driver = { | |||
261 | .name = KBUILD_MODNAME, | 260 | .name = KBUILD_MODNAME, |
262 | .id_table = ssb_hcd_table, | 261 | .id_table = ssb_hcd_table, |
263 | .probe = ssb_hcd_probe, | 262 | .probe = ssb_hcd_probe, |
264 | .remove = __devexit_p(ssb_hcd_remove), | 263 | .remove = ssb_hcd_remove, |
265 | .shutdown = ssb_hcd_shutdown, | 264 | .shutdown = ssb_hcd_shutdown, |
266 | .suspend = ssb_hcd_suspend, | 265 | .suspend = ssb_hcd_suspend, |
267 | .resume = ssb_hcd_resume, | 266 | .resume = ssb_hcd_resume, |
diff --git a/drivers/usb/host/u132-hcd.c b/drivers/usb/host/u132-hcd.c index dbbd1ba25224..5efdffe32365 100644 --- a/drivers/usb/host/u132-hcd.c +++ b/drivers/usb/host/u132-hcd.c | |||
@@ -2990,7 +2990,7 @@ static struct hc_driver u132_hc_driver = { | |||
2990 | * synchronously - but instead should immediately stop activity to the | 2990 | * synchronously - but instead should immediately stop activity to the |
2991 | * device and asynchronously call usb_remove_hcd() | 2991 | * device and asynchronously call usb_remove_hcd() |
2992 | */ | 2992 | */ |
2993 | static int __devexit u132_remove(struct platform_device *pdev) | 2993 | static int u132_remove(struct platform_device *pdev) |
2994 | { | 2994 | { |
2995 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | 2995 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
2996 | if (hcd) { | 2996 | if (hcd) { |
@@ -3084,7 +3084,7 @@ static void u132_initialise(struct u132 *u132, struct platform_device *pdev) | |||
3084 | mutex_unlock(&u132->sw_lock); | 3084 | mutex_unlock(&u132->sw_lock); |
3085 | } | 3085 | } |
3086 | 3086 | ||
3087 | static int __devinit u132_probe(struct platform_device *pdev) | 3087 | static int u132_probe(struct platform_device *pdev) |
3088 | { | 3088 | { |
3089 | struct usb_hcd *hcd; | 3089 | struct usb_hcd *hcd; |
3090 | int retval; | 3090 | int retval; |
@@ -3212,7 +3212,7 @@ static int u132_resume(struct platform_device *pdev) | |||
3212 | */ | 3212 | */ |
3213 | static struct platform_driver u132_platform_driver = { | 3213 | static struct platform_driver u132_platform_driver = { |
3214 | .probe = u132_probe, | 3214 | .probe = u132_probe, |
3215 | .remove = __devexit_p(u132_remove), | 3215 | .remove = u132_remove, |
3216 | .suspend = u132_suspend, | 3216 | .suspend = u132_suspend, |
3217 | .resume = u132_resume, | 3217 | .resume = u132_resume, |
3218 | .driver = { | 3218 | .driver = { |
diff --git a/drivers/usb/host/uhci-grlib.c b/drivers/usb/host/uhci-grlib.c index f7a62138e3e0..511bfc46dd78 100644 --- a/drivers/usb/host/uhci-grlib.c +++ b/drivers/usb/host/uhci-grlib.c | |||
@@ -85,7 +85,7 @@ static const struct hc_driver uhci_grlib_hc_driver = { | |||
85 | }; | 85 | }; |
86 | 86 | ||
87 | 87 | ||
88 | static int __devinit uhci_hcd_grlib_probe(struct platform_device *op) | 88 | static int uhci_hcd_grlib_probe(struct platform_device *op) |
89 | { | 89 | { |
90 | struct device_node *dn = op->dev.of_node; | 90 | struct device_node *dn = op->dev.of_node; |
91 | struct usb_hcd *hcd; | 91 | struct usb_hcd *hcd; |
diff --git a/drivers/usb/host/uhci-platform.c b/drivers/usb/host/uhci-platform.c index 68ebf20e1519..8c4dace4b14a 100644 --- a/drivers/usb/host/uhci-platform.c +++ b/drivers/usb/host/uhci-platform.c | |||
@@ -62,7 +62,7 @@ static const struct hc_driver uhci_platform_hc_driver = { | |||
62 | 62 | ||
63 | static u64 platform_uhci_dma_mask = DMA_BIT_MASK(32); | 63 | static u64 platform_uhci_dma_mask = DMA_BIT_MASK(32); |
64 | 64 | ||
65 | static int __devinit uhci_hcd_platform_probe(struct platform_device *pdev) | 65 | static int uhci_hcd_platform_probe(struct platform_device *pdev) |
66 | { | 66 | { |
67 | struct usb_hcd *hcd; | 67 | struct usb_hcd *hcd; |
68 | struct uhci_hcd *uhci; | 68 | struct uhci_hcd *uhci; |
diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c index d2c6f5ac4626..15921fd55048 100644 --- a/drivers/usb/host/uhci-q.c +++ b/drivers/usb/host/uhci-q.c | |||
@@ -1256,7 +1256,8 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, | |||
1256 | struct uhci_qh *qh) | 1256 | struct uhci_qh *qh) |
1257 | { | 1257 | { |
1258 | struct uhci_td *td = NULL; /* Since urb->number_of_packets > 0 */ | 1258 | struct uhci_td *td = NULL; /* Since urb->number_of_packets > 0 */ |
1259 | int i, frame; | 1259 | int i; |
1260 | unsigned frame, next; | ||
1260 | unsigned long destination, status; | 1261 | unsigned long destination, status; |
1261 | struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; | 1262 | struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; |
1262 | 1263 | ||
@@ -1265,37 +1266,29 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, | |||
1265 | urb->number_of_packets >= UHCI_NUMFRAMES) | 1266 | urb->number_of_packets >= UHCI_NUMFRAMES) |
1266 | return -EFBIG; | 1267 | return -EFBIG; |
1267 | 1268 | ||
1269 | uhci_get_current_frame_number(uhci); | ||
1270 | |||
1268 | /* Check the period and figure out the starting frame number */ | 1271 | /* Check the period and figure out the starting frame number */ |
1269 | if (!qh->bandwidth_reserved) { | 1272 | if (!qh->bandwidth_reserved) { |
1270 | qh->period = urb->interval; | 1273 | qh->period = urb->interval; |
1271 | if (urb->transfer_flags & URB_ISO_ASAP) { | 1274 | qh->phase = -1; /* Find the best phase */ |
1272 | qh->phase = -1; /* Find the best phase */ | 1275 | i = uhci_check_bandwidth(uhci, qh); |
1273 | i = uhci_check_bandwidth(uhci, qh); | 1276 | if (i) |
1274 | if (i) | 1277 | return i; |
1275 | return i; | 1278 | |
1276 | 1279 | /* Allow a little time to allocate the TDs */ | |
1277 | /* Allow a little time to allocate the TDs */ | 1280 | next = uhci->frame_number + 10; |
1278 | uhci_get_current_frame_number(uhci); | 1281 | frame = qh->phase; |
1279 | frame = uhci->frame_number + 10; | 1282 | |
1280 | 1283 | /* Round up to the first available slot */ | |
1281 | /* Move forward to the first frame having the | 1284 | frame += (next - frame + qh->period - 1) & -qh->period; |
1282 | * correct phase */ | ||
1283 | urb->start_frame = frame + ((qh->phase - frame) & | ||
1284 | (qh->period - 1)); | ||
1285 | } else { | ||
1286 | i = urb->start_frame - uhci->last_iso_frame; | ||
1287 | if (i <= 0 || i >= UHCI_NUMFRAMES) | ||
1288 | return -EINVAL; | ||
1289 | qh->phase = urb->start_frame & (qh->period - 1); | ||
1290 | i = uhci_check_bandwidth(uhci, qh); | ||
1291 | if (i) | ||
1292 | return i; | ||
1293 | } | ||
1294 | 1285 | ||
1295 | } else if (qh->period != urb->interval) { | 1286 | } else if (qh->period != urb->interval) { |
1296 | return -EINVAL; /* Can't change the period */ | 1287 | return -EINVAL; /* Can't change the period */ |
1297 | 1288 | ||
1298 | } else { | 1289 | } else { |
1290 | next = uhci->frame_number + 2; | ||
1291 | |||
1299 | /* Find the next unused frame */ | 1292 | /* Find the next unused frame */ |
1300 | if (list_empty(&qh->queue)) { | 1293 | if (list_empty(&qh->queue)) { |
1301 | frame = qh->iso_frame; | 1294 | frame = qh->iso_frame; |
@@ -1308,25 +1301,31 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, | |||
1308 | lurb->number_of_packets * | 1301 | lurb->number_of_packets * |
1309 | lurb->interval; | 1302 | lurb->interval; |
1310 | } | 1303 | } |
1311 | if (urb->transfer_flags & URB_ISO_ASAP) { | 1304 | |
1312 | /* Skip some frames if necessary to insure | 1305 | /* Fell behind? */ |
1313 | * the start frame is in the future. | 1306 | if (uhci_frame_before_eq(frame, next)) { |
1307 | |||
1308 | /* USB_ISO_ASAP: Round up to the first available slot */ | ||
1309 | if (urb->transfer_flags & URB_ISO_ASAP) | ||
1310 | frame += (next - frame + qh->period - 1) & | ||
1311 | -qh->period; | ||
1312 | |||
1313 | /* | ||
1314 | * Not ASAP: Use the next slot in the stream. If | ||
1315 | * the entire URB falls before the threshold, fail. | ||
1314 | */ | 1316 | */ |
1315 | uhci_get_current_frame_number(uhci); | 1317 | else if (!uhci_frame_before_eq(next, |
1316 | if (uhci_frame_before_eq(frame, uhci->frame_number)) { | 1318 | frame + (urb->number_of_packets - 1) * |
1317 | frame = uhci->frame_number + 1; | 1319 | qh->period)) |
1318 | frame += ((qh->phase - frame) & | 1320 | return -EXDEV; |
1319 | (qh->period - 1)); | 1321 | } |
1320 | } | ||
1321 | } /* Otherwise pick up where the last URB leaves off */ | ||
1322 | urb->start_frame = frame; | ||
1323 | } | 1322 | } |
1324 | 1323 | ||
1325 | /* Make sure we won't have to go too far into the future */ | 1324 | /* Make sure we won't have to go too far into the future */ |
1326 | if (uhci_frame_before_eq(uhci->last_iso_frame + UHCI_NUMFRAMES, | 1325 | if (uhci_frame_before_eq(uhci->last_iso_frame + UHCI_NUMFRAMES, |
1327 | urb->start_frame + urb->number_of_packets * | 1326 | frame + urb->number_of_packets * urb->interval)) |
1328 | urb->interval)) | ||
1329 | return -EFBIG; | 1327 | return -EFBIG; |
1328 | urb->start_frame = frame; | ||
1330 | 1329 | ||
1331 | status = TD_CTRL_ACTIVE | TD_CTRL_IOS; | 1330 | status = TD_CTRL_ACTIVE | TD_CTRL_IOS; |
1332 | destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe); | 1331 | destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe); |
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 487bc083dead..fb51c7085ad0 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
@@ -205,7 +205,12 @@ static int xhci_alloc_segments_for_ring(struct xhci_hcd *xhci, | |||
205 | 205 | ||
206 | next = xhci_segment_alloc(xhci, cycle_state, flags); | 206 | next = xhci_segment_alloc(xhci, cycle_state, flags); |
207 | if (!next) { | 207 | if (!next) { |
208 | xhci_free_segments_for_ring(xhci, *first); | 208 | prev = *first; |
209 | while (prev) { | ||
210 | next = prev->next; | ||
211 | xhci_segment_free(xhci, prev); | ||
212 | prev = next; | ||
213 | } | ||
209 | return -ENOMEM; | 214 | return -ENOMEM; |
210 | } | 215 | } |
211 | xhci_link_segments(xhci, prev, next, type); | 216 | xhci_link_segments(xhci, prev, next, type); |
@@ -258,7 +263,7 @@ static struct xhci_ring *xhci_ring_alloc(struct xhci_hcd *xhci, | |||
258 | return ring; | 263 | return ring; |
259 | 264 | ||
260 | fail: | 265 | fail: |
261 | xhci_ring_free(xhci, ring); | 266 | kfree(ring); |
262 | return NULL; | 267 | return NULL; |
263 | } | 268 | } |
264 | 269 | ||
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 8345d7c23061..af259e0ec172 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
@@ -29,6 +29,7 @@ | |||
29 | /* Device for a quirk */ | 29 | /* Device for a quirk */ |
30 | #define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73 | 30 | #define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73 |
31 | #define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000 | 31 | #define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000 |
32 | #define PCI_DEVICE_ID_FRESCO_LOGIC_FL1400 0x1400 | ||
32 | 33 | ||
33 | #define PCI_VENDOR_ID_ETRON 0x1b6f | 34 | #define PCI_VENDOR_ID_ETRON 0x1b6f |
34 | #define PCI_DEVICE_ID_ASROCK_P67 0x7023 | 35 | #define PCI_DEVICE_ID_ASROCK_P67 0x7023 |
@@ -58,8 +59,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
58 | 59 | ||
59 | /* Look for vendor-specific quirks */ | 60 | /* Look for vendor-specific quirks */ |
60 | if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC && | 61 | if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC && |
61 | pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK) { | 62 | (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK || |
62 | if (pdev->revision == 0x0) { | 63 | pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1400)) { |
64 | if (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK && | ||
65 | pdev->revision == 0x0) { | ||
63 | xhci->quirks |= XHCI_RESET_EP_QUIRK; | 66 | xhci->quirks |= XHCI_RESET_EP_QUIRK; |
64 | xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure" | 67 | xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure" |
65 | " endpoint cmd after reset endpoint\n"); | 68 | " endpoint cmd after reset endpoint\n"); |
@@ -218,15 +221,8 @@ static void xhci_pci_remove(struct pci_dev *dev) | |||
218 | static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup) | 221 | static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup) |
219 | { | 222 | { |
220 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 223 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
221 | int retval = 0; | ||
222 | 224 | ||
223 | if (hcd->state != HC_STATE_SUSPENDED || | 225 | return xhci_suspend(xhci); |
224 | xhci->shared_hcd->state != HC_STATE_SUSPENDED) | ||
225 | return -EINVAL; | ||
226 | |||
227 | retval = xhci_suspend(xhci); | ||
228 | |||
229 | return retval; | ||
230 | } | 226 | } |
231 | 227 | ||
232 | static int xhci_pci_resume(struct usb_hcd *hcd, bool hibernated) | 228 | static int xhci_pci_resume(struct usb_hcd *hcd, bool hibernated) |
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 4e1a8946b8d1..cbb44b7b9d65 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
@@ -318,7 +318,7 @@ static int xhci_abort_cmd_ring(struct xhci_hcd *xhci) | |||
318 | * seconds), then it should assume that the there are | 318 | * seconds), then it should assume that the there are |
319 | * larger problems with the xHC and assert HCRST. | 319 | * larger problems with the xHC and assert HCRST. |
320 | */ | 320 | */ |
321 | ret = handshake(xhci, &xhci->op_regs->cmd_ring, | 321 | ret = xhci_handshake(xhci, &xhci->op_regs->cmd_ring, |
322 | CMD_RING_RUNNING, 0, 5 * 1000 * 1000); | 322 | CMD_RING_RUNNING, 0, 5 * 1000 * 1000); |
323 | if (ret < 0) { | 323 | if (ret < 0) { |
324 | xhci_err(xhci, "Stopped the command ring failed, " | 324 | xhci_err(xhci, "Stopped the command ring failed, " |
@@ -3071,11 +3071,11 @@ static u32 xhci_td_remainder(unsigned int remainder) | |||
3071 | } | 3071 | } |
3072 | 3072 | ||
3073 | /* | 3073 | /* |
3074 | * For xHCI 1.0 host controllers, TD size is the number of packets remaining in | 3074 | * For xHCI 1.0 host controllers, TD size is the number of max packet sized |
3075 | * the TD (*not* including this TRB). | 3075 | * packets remaining in the TD (*not* including this TRB). |
3076 | * | 3076 | * |
3077 | * Total TD packet count = total_packet_count = | 3077 | * Total TD packet count = total_packet_count = |
3078 | * roundup(TD size in bytes / wMaxPacketSize) | 3078 | * DIV_ROUND_UP(TD size in bytes / wMaxPacketSize) |
3079 | * | 3079 | * |
3080 | * Packets transferred up to and including this TRB = packets_transferred = | 3080 | * Packets transferred up to and including this TRB = packets_transferred = |
3081 | * rounddown(total bytes transferred including this TRB / wMaxPacketSize) | 3081 | * rounddown(total bytes transferred including this TRB / wMaxPacketSize) |
@@ -3083,15 +3083,16 @@ static u32 xhci_td_remainder(unsigned int remainder) | |||
3083 | * TD size = total_packet_count - packets_transferred | 3083 | * TD size = total_packet_count - packets_transferred |
3084 | * | 3084 | * |
3085 | * It must fit in bits 21:17, so it can't be bigger than 31. | 3085 | * It must fit in bits 21:17, so it can't be bigger than 31. |
3086 | * The last TRB in a TD must have the TD size set to zero. | ||
3086 | */ | 3087 | */ |
3087 | |||
3088 | static u32 xhci_v1_0_td_remainder(int running_total, int trb_buff_len, | 3088 | static u32 xhci_v1_0_td_remainder(int running_total, int trb_buff_len, |
3089 | unsigned int total_packet_count, struct urb *urb) | 3089 | unsigned int total_packet_count, struct urb *urb, |
3090 | unsigned int num_trbs_left) | ||
3090 | { | 3091 | { |
3091 | int packets_transferred; | 3092 | int packets_transferred; |
3092 | 3093 | ||
3093 | /* One TRB with a zero-length data packet. */ | 3094 | /* One TRB with a zero-length data packet. */ |
3094 | if (running_total == 0 && trb_buff_len == 0) | 3095 | if (num_trbs_left == 0 || (running_total == 0 && trb_buff_len == 0)) |
3095 | return 0; | 3096 | return 0; |
3096 | 3097 | ||
3097 | /* All the TRB queueing functions don't count the current TRB in | 3098 | /* All the TRB queueing functions don't count the current TRB in |
@@ -3100,7 +3101,9 @@ static u32 xhci_v1_0_td_remainder(int running_total, int trb_buff_len, | |||
3100 | packets_transferred = (running_total + trb_buff_len) / | 3101 | packets_transferred = (running_total + trb_buff_len) / |
3101 | usb_endpoint_maxp(&urb->ep->desc); | 3102 | usb_endpoint_maxp(&urb->ep->desc); |
3102 | 3103 | ||
3103 | return xhci_td_remainder(total_packet_count - packets_transferred); | 3104 | if ((total_packet_count - packets_transferred) > 31) |
3105 | return 31 << 17; | ||
3106 | return (total_packet_count - packets_transferred) << 17; | ||
3104 | } | 3107 | } |
3105 | 3108 | ||
3106 | static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | 3109 | static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
@@ -3127,7 +3130,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3127 | 3130 | ||
3128 | num_trbs = count_sg_trbs_needed(xhci, urb); | 3131 | num_trbs = count_sg_trbs_needed(xhci, urb); |
3129 | num_sgs = urb->num_mapped_sgs; | 3132 | num_sgs = urb->num_mapped_sgs; |
3130 | total_packet_count = roundup(urb->transfer_buffer_length, | 3133 | total_packet_count = DIV_ROUND_UP(urb->transfer_buffer_length, |
3131 | usb_endpoint_maxp(&urb->ep->desc)); | 3134 | usb_endpoint_maxp(&urb->ep->desc)); |
3132 | 3135 | ||
3133 | trb_buff_len = prepare_transfer(xhci, xhci->devs[slot_id], | 3136 | trb_buff_len = prepare_transfer(xhci, xhci->devs[slot_id], |
@@ -3210,7 +3213,8 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3210 | running_total); | 3213 | running_total); |
3211 | } else { | 3214 | } else { |
3212 | remainder = xhci_v1_0_td_remainder(running_total, | 3215 | remainder = xhci_v1_0_td_remainder(running_total, |
3213 | trb_buff_len, total_packet_count, urb); | 3216 | trb_buff_len, total_packet_count, urb, |
3217 | num_trbs - 1); | ||
3214 | } | 3218 | } |
3215 | length_field = TRB_LEN(trb_buff_len) | | 3219 | length_field = TRB_LEN(trb_buff_len) | |
3216 | remainder | | 3220 | remainder | |
@@ -3318,7 +3322,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3318 | start_cycle = ep_ring->cycle_state; | 3322 | start_cycle = ep_ring->cycle_state; |
3319 | 3323 | ||
3320 | running_total = 0; | 3324 | running_total = 0; |
3321 | total_packet_count = roundup(urb->transfer_buffer_length, | 3325 | total_packet_count = DIV_ROUND_UP(urb->transfer_buffer_length, |
3322 | usb_endpoint_maxp(&urb->ep->desc)); | 3326 | usb_endpoint_maxp(&urb->ep->desc)); |
3323 | /* How much data is in the first TRB? */ | 3327 | /* How much data is in the first TRB? */ |
3324 | addr = (u64) urb->transfer_dma; | 3328 | addr = (u64) urb->transfer_dma; |
@@ -3364,7 +3368,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3364 | running_total); | 3368 | running_total); |
3365 | } else { | 3369 | } else { |
3366 | remainder = xhci_v1_0_td_remainder(running_total, | 3370 | remainder = xhci_v1_0_td_remainder(running_total, |
3367 | trb_buff_len, total_packet_count, urb); | 3371 | trb_buff_len, total_packet_count, urb, |
3372 | num_trbs - 1); | ||
3368 | } | 3373 | } |
3369 | length_field = TRB_LEN(trb_buff_len) | | 3374 | length_field = TRB_LEN(trb_buff_len) | |
3370 | remainder | | 3375 | remainder | |
@@ -3627,7 +3632,7 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3627 | addr = start_addr + urb->iso_frame_desc[i].offset; | 3632 | addr = start_addr + urb->iso_frame_desc[i].offset; |
3628 | td_len = urb->iso_frame_desc[i].length; | 3633 | td_len = urb->iso_frame_desc[i].length; |
3629 | td_remain_len = td_len; | 3634 | td_remain_len = td_len; |
3630 | total_packet_count = roundup(td_len, | 3635 | total_packet_count = DIV_ROUND_UP(td_len, |
3631 | usb_endpoint_maxp(&urb->ep->desc)); | 3636 | usb_endpoint_maxp(&urb->ep->desc)); |
3632 | /* A zero-length transfer still involves at least one packet. */ | 3637 | /* A zero-length transfer still involves at least one packet. */ |
3633 | if (total_packet_count == 0) | 3638 | if (total_packet_count == 0) |
@@ -3706,7 +3711,8 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3706 | } else { | 3711 | } else { |
3707 | remainder = xhci_v1_0_td_remainder( | 3712 | remainder = xhci_v1_0_td_remainder( |
3708 | running_total, trb_buff_len, | 3713 | running_total, trb_buff_len, |
3709 | total_packet_count, urb); | 3714 | total_packet_count, urb, |
3715 | (trbs_per_td - j - 1)); | ||
3710 | } | 3716 | } |
3711 | length_field = TRB_LEN(trb_buff_len) | | 3717 | length_field = TRB_LEN(trb_buff_len) | |
3712 | remainder | | 3718 | remainder | |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index c9e419f29b74..5c72c431bab1 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
@@ -40,7 +40,7 @@ MODULE_PARM_DESC(link_quirk, "Don't clear the chain bit on a link TRB"); | |||
40 | 40 | ||
41 | /* TODO: copied from ehci-hcd.c - can this be refactored? */ | 41 | /* TODO: copied from ehci-hcd.c - can this be refactored? */ |
42 | /* | 42 | /* |
43 | * handshake - spin reading hc until handshake completes or fails | 43 | * xhci_handshake - spin reading hc until handshake completes or fails |
44 | * @ptr: address of hc register to be read | 44 | * @ptr: address of hc register to be read |
45 | * @mask: bits to look at in result of read | 45 | * @mask: bits to look at in result of read |
46 | * @done: value of those bits when handshake succeeds | 46 | * @done: value of those bits when handshake succeeds |
@@ -52,7 +52,7 @@ MODULE_PARM_DESC(link_quirk, "Don't clear the chain bit on a link TRB"); | |||
52 | * handshake done). There are two failure modes: "usec" have passed (major | 52 | * handshake done). There are two failure modes: "usec" have passed (major |
53 | * hardware flakeout), or the register reads as all-ones (hardware removed). | 53 | * hardware flakeout), or the register reads as all-ones (hardware removed). |
54 | */ | 54 | */ |
55 | int handshake(struct xhci_hcd *xhci, void __iomem *ptr, | 55 | int xhci_handshake(struct xhci_hcd *xhci, void __iomem *ptr, |
56 | u32 mask, u32 done, int usec) | 56 | u32 mask, u32 done, int usec) |
57 | { | 57 | { |
58 | u32 result; | 58 | u32 result; |
@@ -103,7 +103,7 @@ int xhci_halt(struct xhci_hcd *xhci) | |||
103 | xhci_dbg(xhci, "// Halt the HC\n"); | 103 | xhci_dbg(xhci, "// Halt the HC\n"); |
104 | xhci_quiesce(xhci); | 104 | xhci_quiesce(xhci); |
105 | 105 | ||
106 | ret = handshake(xhci, &xhci->op_regs->status, | 106 | ret = xhci_handshake(xhci, &xhci->op_regs->status, |
107 | STS_HALT, STS_HALT, XHCI_MAX_HALT_USEC); | 107 | STS_HALT, STS_HALT, XHCI_MAX_HALT_USEC); |
108 | if (!ret) { | 108 | if (!ret) { |
109 | xhci->xhc_state |= XHCI_STATE_HALTED; | 109 | xhci->xhc_state |= XHCI_STATE_HALTED; |
@@ -132,7 +132,7 @@ static int xhci_start(struct xhci_hcd *xhci) | |||
132 | * Wait for the HCHalted Status bit to be 0 to indicate the host is | 132 | * Wait for the HCHalted Status bit to be 0 to indicate the host is |
133 | * running. | 133 | * running. |
134 | */ | 134 | */ |
135 | ret = handshake(xhci, &xhci->op_regs->status, | 135 | ret = xhci_handshake(xhci, &xhci->op_regs->status, |
136 | STS_HALT, 0, XHCI_MAX_HALT_USEC); | 136 | STS_HALT, 0, XHCI_MAX_HALT_USEC); |
137 | if (ret == -ETIMEDOUT) | 137 | if (ret == -ETIMEDOUT) |
138 | xhci_err(xhci, "Host took too long to start, " | 138 | xhci_err(xhci, "Host took too long to start, " |
@@ -167,7 +167,7 @@ int xhci_reset(struct xhci_hcd *xhci) | |||
167 | command |= CMD_RESET; | 167 | command |= CMD_RESET; |
168 | xhci_writel(xhci, command, &xhci->op_regs->command); | 168 | xhci_writel(xhci, command, &xhci->op_regs->command); |
169 | 169 | ||
170 | ret = handshake(xhci, &xhci->op_regs->command, | 170 | ret = xhci_handshake(xhci, &xhci->op_regs->command, |
171 | CMD_RESET, 0, 10 * 1000 * 1000); | 171 | CMD_RESET, 0, 10 * 1000 * 1000); |
172 | if (ret) | 172 | if (ret) |
173 | return ret; | 173 | return ret; |
@@ -177,7 +177,7 @@ int xhci_reset(struct xhci_hcd *xhci) | |||
177 | * xHCI cannot write to any doorbells or operational registers other | 177 | * xHCI cannot write to any doorbells or operational registers other |
178 | * than status until the "Controller Not Ready" flag is cleared. | 178 | * than status until the "Controller Not Ready" flag is cleared. |
179 | */ | 179 | */ |
180 | ret = handshake(xhci, &xhci->op_regs->status, | 180 | ret = xhci_handshake(xhci, &xhci->op_regs->status, |
181 | STS_CNR, 0, 10 * 1000 * 1000); | 181 | STS_CNR, 0, 10 * 1000 * 1000); |
182 | 182 | ||
183 | for (i = 0; i < 2; ++i) { | 183 | for (i = 0; i < 2; ++i) { |
@@ -480,7 +480,7 @@ static bool compliance_mode_recovery_timer_quirk_check(void) | |||
480 | if (strstr(dmi_product_name, "Z420") || | 480 | if (strstr(dmi_product_name, "Z420") || |
481 | strstr(dmi_product_name, "Z620") || | 481 | strstr(dmi_product_name, "Z620") || |
482 | strstr(dmi_product_name, "Z820") || | 482 | strstr(dmi_product_name, "Z820") || |
483 | strstr(dmi_product_name, "Z1")) | 483 | strstr(dmi_product_name, "Z1 Workstation")) |
484 | return true; | 484 | return true; |
485 | 485 | ||
486 | return false; | 486 | return false; |
@@ -880,6 +880,10 @@ int xhci_suspend(struct xhci_hcd *xhci) | |||
880 | struct usb_hcd *hcd = xhci_to_hcd(xhci); | 880 | struct usb_hcd *hcd = xhci_to_hcd(xhci); |
881 | u32 command; | 881 | u32 command; |
882 | 882 | ||
883 | if (hcd->state != HC_STATE_SUSPENDED || | ||
884 | xhci->shared_hcd->state != HC_STATE_SUSPENDED) | ||
885 | return -EINVAL; | ||
886 | |||
883 | spin_lock_irq(&xhci->lock); | 887 | spin_lock_irq(&xhci->lock); |
884 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | 888 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); |
885 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags); | 889 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags); |
@@ -890,7 +894,7 @@ int xhci_suspend(struct xhci_hcd *xhci) | |||
890 | command = xhci_readl(xhci, &xhci->op_regs->command); | 894 | command = xhci_readl(xhci, &xhci->op_regs->command); |
891 | command &= ~CMD_RUN; | 895 | command &= ~CMD_RUN; |
892 | xhci_writel(xhci, command, &xhci->op_regs->command); | 896 | xhci_writel(xhci, command, &xhci->op_regs->command); |
893 | if (handshake(xhci, &xhci->op_regs->status, | 897 | if (xhci_handshake(xhci, &xhci->op_regs->status, |
894 | STS_HALT, STS_HALT, XHCI_MAX_HALT_USEC)) { | 898 | STS_HALT, STS_HALT, XHCI_MAX_HALT_USEC)) { |
895 | xhci_warn(xhci, "WARN: xHC CMD_RUN timeout\n"); | 899 | xhci_warn(xhci, "WARN: xHC CMD_RUN timeout\n"); |
896 | spin_unlock_irq(&xhci->lock); | 900 | spin_unlock_irq(&xhci->lock); |
@@ -905,7 +909,8 @@ int xhci_suspend(struct xhci_hcd *xhci) | |||
905 | command = xhci_readl(xhci, &xhci->op_regs->command); | 909 | command = xhci_readl(xhci, &xhci->op_regs->command); |
906 | command |= CMD_CSS; | 910 | command |= CMD_CSS; |
907 | xhci_writel(xhci, command, &xhci->op_regs->command); | 911 | xhci_writel(xhci, command, &xhci->op_regs->command); |
908 | if (handshake(xhci, &xhci->op_regs->status, STS_SAVE, 0, 10 * 1000)) { | 912 | if (xhci_handshake(xhci, &xhci->op_regs->status, |
913 | STS_SAVE, 0, 10 * 1000)) { | ||
909 | xhci_warn(xhci, "WARN: xHC save state timeout\n"); | 914 | xhci_warn(xhci, "WARN: xHC save state timeout\n"); |
910 | spin_unlock_irq(&xhci->lock); | 915 | spin_unlock_irq(&xhci->lock); |
911 | return -ETIMEDOUT; | 916 | return -ETIMEDOUT; |
@@ -967,7 +972,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | |||
967 | command = xhci_readl(xhci, &xhci->op_regs->command); | 972 | command = xhci_readl(xhci, &xhci->op_regs->command); |
968 | command |= CMD_CRS; | 973 | command |= CMD_CRS; |
969 | xhci_writel(xhci, command, &xhci->op_regs->command); | 974 | xhci_writel(xhci, command, &xhci->op_regs->command); |
970 | if (handshake(xhci, &xhci->op_regs->status, | 975 | if (xhci_handshake(xhci, &xhci->op_regs->status, |
971 | STS_RESTORE, 0, 10 * 1000)) { | 976 | STS_RESTORE, 0, 10 * 1000)) { |
972 | xhci_warn(xhci, "WARN: xHC restore state timeout\n"); | 977 | xhci_warn(xhci, "WARN: xHC restore state timeout\n"); |
973 | spin_unlock_irq(&xhci->lock); | 978 | spin_unlock_irq(&xhci->lock); |
@@ -1035,7 +1040,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | |||
1035 | command = xhci_readl(xhci, &xhci->op_regs->command); | 1040 | command = xhci_readl(xhci, &xhci->op_regs->command); |
1036 | command |= CMD_RUN; | 1041 | command |= CMD_RUN; |
1037 | xhci_writel(xhci, command, &xhci->op_regs->command); | 1042 | xhci_writel(xhci, command, &xhci->op_regs->command); |
1038 | handshake(xhci, &xhci->op_regs->status, STS_HALT, | 1043 | xhci_handshake(xhci, &xhci->op_regs->status, STS_HALT, |
1039 | 0, 250 * 1000); | 1044 | 0, 250 * 1000); |
1040 | 1045 | ||
1041 | /* step 5: walk topology and initialize portsc, | 1046 | /* step 5: walk topology and initialize portsc, |
@@ -2254,7 +2259,7 @@ static bool xhci_is_async_ep(unsigned int ep_type) | |||
2254 | 2259 | ||
2255 | static bool xhci_is_sync_in_ep(unsigned int ep_type) | 2260 | static bool xhci_is_sync_in_ep(unsigned int ep_type) |
2256 | { | 2261 | { |
2257 | return (ep_type == ISOC_IN_EP || ep_type != INT_IN_EP); | 2262 | return (ep_type == ISOC_IN_EP || ep_type == INT_IN_EP); |
2258 | } | 2263 | } |
2259 | 2264 | ||
2260 | static unsigned int xhci_get_ss_bw_consumed(struct xhci_bw_info *ep_bw) | 2265 | static unsigned int xhci_get_ss_bw_consumed(struct xhci_bw_info *ep_bw) |
@@ -3874,7 +3879,8 @@ static int xhci_usb2_software_lpm_test(struct usb_hcd *hcd, | |||
3874 | spin_lock_irqsave(&xhci->lock, flags); | 3879 | spin_lock_irqsave(&xhci->lock, flags); |
3875 | 3880 | ||
3876 | /* Check L1 Status */ | 3881 | /* Check L1 Status */ |
3877 | ret = handshake(xhci, pm_addr, PORT_L1S_MASK, PORT_L1S_SUCCESS, 125); | 3882 | ret = xhci_handshake(xhci, pm_addr, |
3883 | PORT_L1S_MASK, PORT_L1S_SUCCESS, 125); | ||
3878 | if (ret != -ETIMEDOUT) { | 3884 | if (ret != -ETIMEDOUT) { |
3879 | /* enter L1 successfully */ | 3885 | /* enter L1 successfully */ |
3880 | temp = xhci_readl(xhci, addr); | 3886 | temp = xhci_readl(xhci, addr); |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 53df4e70ca07..f791bd0aee6c 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
@@ -1720,7 +1720,7 @@ static inline void xhci_unregister_plat(void) | |||
1720 | 1720 | ||
1721 | /* xHCI host controller glue */ | 1721 | /* xHCI host controller glue */ |
1722 | typedef void (*xhci_get_quirks_t)(struct device *, struct xhci_hcd *); | 1722 | typedef void (*xhci_get_quirks_t)(struct device *, struct xhci_hcd *); |
1723 | int handshake(struct xhci_hcd *xhci, void __iomem *ptr, | 1723 | int xhci_handshake(struct xhci_hcd *xhci, void __iomem *ptr, |
1724 | u32 mask, u32 done, int usec); | 1724 | u32 mask, u32 done, int usec); |
1725 | void xhci_quiesce(struct xhci_hcd *xhci); | 1725 | void xhci_quiesce(struct xhci_hcd *xhci); |
1726 | int xhci_halt(struct xhci_hcd *xhci); | 1726 | int xhci_halt(struct xhci_hcd *xhci); |
diff --git a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig index a8f05239350e..fecde69bfa7d 100644 --- a/drivers/usb/misc/Kconfig +++ b/drivers/usb/misc/Kconfig | |||
@@ -246,6 +246,7 @@ config USB_YUREX | |||
246 | 246 | ||
247 | config USB_EZUSB_FX2 | 247 | config USB_EZUSB_FX2 |
248 | tristate "Functions for loading firmware on EZUSB chips" | 248 | tristate "Functions for loading firmware on EZUSB chips" |
249 | depends on USB | ||
249 | help | 250 | help |
250 | Say Y here if you need EZUSB device support. | 251 | Say Y here if you need EZUSB device support. |
251 | (Cypress FX/FX2/FX2LP microcontrollers) | 252 | (Cypress FX/FX2/FX2LP microcontrollers) |
diff --git a/drivers/usb/misc/ezusb.c b/drivers/usb/misc/ezusb.c index 6589268a6515..e712afed947c 100644 --- a/drivers/usb/misc/ezusb.c +++ b/drivers/usb/misc/ezusb.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/usb.h> | 15 | #include <linux/usb.h> |
16 | #include <linux/firmware.h> | 16 | #include <linux/firmware.h> |
17 | #include <linux/ihex.h> | 17 | #include <linux/ihex.h> |
18 | #include <linux/usb/ezusb.h> | ||
18 | 19 | ||
19 | struct ezusb_fx_type { | 20 | struct ezusb_fx_type { |
20 | /* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */ | 21 | /* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */ |
@@ -22,21 +23,16 @@ struct ezusb_fx_type { | |||
22 | unsigned short max_internal_adress; | 23 | unsigned short max_internal_adress; |
23 | }; | 24 | }; |
24 | 25 | ||
25 | struct ezusb_fx_type ezusb_fx1 = { | 26 | static struct ezusb_fx_type ezusb_fx1 = { |
26 | .cpucs_reg = 0x7F92, | 27 | .cpucs_reg = 0x7F92, |
27 | .max_internal_adress = 0x1B3F, | 28 | .max_internal_adress = 0x1B3F, |
28 | }; | 29 | }; |
29 | 30 | ||
30 | struct ezusb_fx_type ezusb_fx2 = { | ||
31 | .cpucs_reg = 0xE600, | ||
32 | .max_internal_adress = 0x3FFF, | ||
33 | }; | ||
34 | |||
35 | /* Commands for writing to memory */ | 31 | /* Commands for writing to memory */ |
36 | #define WRITE_INT_RAM 0xA0 | 32 | #define WRITE_INT_RAM 0xA0 |
37 | #define WRITE_EXT_RAM 0xA3 | 33 | #define WRITE_EXT_RAM 0xA3 |
38 | 34 | ||
39 | int ezusb_writememory(struct usb_device *dev, int address, | 35 | static int ezusb_writememory(struct usb_device *dev, int address, |
40 | unsigned char *data, int length, __u8 request) | 36 | unsigned char *data, int length, __u8 request) |
41 | { | 37 | { |
42 | int result; | 38 | int result; |
@@ -58,10 +54,9 @@ int ezusb_writememory(struct usb_device *dev, int address, | |||
58 | kfree(transfer_buffer); | 54 | kfree(transfer_buffer); |
59 | return result; | 55 | return result; |
60 | } | 56 | } |
61 | EXPORT_SYMBOL_GPL(ezusb_writememory); | ||
62 | 57 | ||
63 | int ezusb_set_reset(struct usb_device *dev, unsigned short cpucs_reg, | 58 | static int ezusb_set_reset(struct usb_device *dev, unsigned short cpucs_reg, |
64 | unsigned char reset_bit) | 59 | unsigned char reset_bit) |
65 | { | 60 | { |
66 | int response = ezusb_writememory(dev, cpucs_reg, &reset_bit, 1, WRITE_INT_RAM); | 61 | int response = ezusb_writememory(dev, cpucs_reg, &reset_bit, 1, WRITE_INT_RAM); |
67 | if (response < 0) | 62 | if (response < 0) |
@@ -76,12 +71,6 @@ int ezusb_fx1_set_reset(struct usb_device *dev, unsigned char reset_bit) | |||
76 | } | 71 | } |
77 | EXPORT_SYMBOL_GPL(ezusb_fx1_set_reset); | 72 | EXPORT_SYMBOL_GPL(ezusb_fx1_set_reset); |
78 | 73 | ||
79 | int ezusb_fx2_set_reset(struct usb_device *dev, unsigned char reset_bit) | ||
80 | { | ||
81 | return ezusb_set_reset(dev, ezusb_fx2.cpucs_reg, reset_bit); | ||
82 | } | ||
83 | EXPORT_SYMBOL_GPL(ezusb_fx2_set_reset); | ||
84 | |||
85 | static int ezusb_ihex_firmware_download(struct usb_device *dev, | 74 | static int ezusb_ihex_firmware_download(struct usb_device *dev, |
86 | struct ezusb_fx_type fx, | 75 | struct ezusb_fx_type fx, |
87 | const char *firmware_path) | 76 | const char *firmware_path) |
@@ -151,11 +140,28 @@ int ezusb_fx1_ihex_firmware_download(struct usb_device *dev, | |||
151 | } | 140 | } |
152 | EXPORT_SYMBOL_GPL(ezusb_fx1_ihex_firmware_download); | 141 | EXPORT_SYMBOL_GPL(ezusb_fx1_ihex_firmware_download); |
153 | 142 | ||
143 | #if 0 | ||
144 | /* | ||
145 | * Once someone one needs these fx2 functions, uncomment them | ||
146 | * and add them to ezusb.h and all should be good. | ||
147 | */ | ||
148 | static struct ezusb_fx_type ezusb_fx2 = { | ||
149 | .cpucs_reg = 0xE600, | ||
150 | .max_internal_adress = 0x3FFF, | ||
151 | }; | ||
152 | |||
153 | int ezusb_fx2_set_reset(struct usb_device *dev, unsigned char reset_bit) | ||
154 | { | ||
155 | return ezusb_set_reset(dev, ezusb_fx2.cpucs_reg, reset_bit); | ||
156 | } | ||
157 | EXPORT_SYMBOL_GPL(ezusb_fx2_set_reset); | ||
158 | |||
154 | int ezusb_fx2_ihex_firmware_download(struct usb_device *dev, | 159 | int ezusb_fx2_ihex_firmware_download(struct usb_device *dev, |
155 | const char *firmware_path) | 160 | const char *firmware_path) |
156 | { | 161 | { |
157 | return ezusb_ihex_firmware_download(dev, ezusb_fx2, firmware_path); | 162 | return ezusb_ihex_firmware_download(dev, ezusb_fx2, firmware_path); |
158 | } | 163 | } |
159 | EXPORT_SYMBOL_GPL(ezusb_fx2_ihex_firmware_download); | 164 | EXPORT_SYMBOL_GPL(ezusb_fx2_ihex_firmware_download); |
165 | #endif | ||
160 | 166 | ||
161 | MODULE_LICENSE("GPL"); | 167 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index 055b84adedac..7667b12f2ff5 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c | |||
@@ -423,6 +423,9 @@ alloc_sglist(int nents, int max, int vary) | |||
423 | unsigned i; | 423 | unsigned i; |
424 | unsigned size = max; | 424 | unsigned size = max; |
425 | 425 | ||
426 | if (max == 0) | ||
427 | return NULL; | ||
428 | |||
426 | sg = kmalloc_array(nents, sizeof *sg, GFP_KERNEL); | 429 | sg = kmalloc_array(nents, sizeof *sg, GFP_KERNEL); |
427 | if (!sg) | 430 | if (!sg) |
428 | return NULL; | 431 | return NULL; |
@@ -2386,6 +2389,7 @@ static struct usbtest_info gz_info = { | |||
2386 | .name = "Linux gadget zero", | 2389 | .name = "Linux gadget zero", |
2387 | .autoconf = 1, | 2390 | .autoconf = 1, |
2388 | .ctrl_out = 1, | 2391 | .ctrl_out = 1, |
2392 | .iso = 1, | ||
2389 | .alt = 0, | 2393 | .alt = 0, |
2390 | }; | 2394 | }; |
2391 | 2395 | ||
diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c index c964d6af178b..3d1c71b50f76 100644 --- a/drivers/usb/musb/am35x.c +++ b/drivers/usb/musb/am35x.c | |||
@@ -455,7 +455,7 @@ static const struct musb_platform_ops am35x_ops = { | |||
455 | 455 | ||
456 | static u64 am35x_dmamask = DMA_BIT_MASK(32); | 456 | static u64 am35x_dmamask = DMA_BIT_MASK(32); |
457 | 457 | ||
458 | static int __devinit am35x_probe(struct platform_device *pdev) | 458 | static int am35x_probe(struct platform_device *pdev) |
459 | { | 459 | { |
460 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; | 460 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; |
461 | struct platform_device *musb; | 461 | struct platform_device *musb; |
@@ -465,7 +465,6 @@ static int __devinit am35x_probe(struct platform_device *pdev) | |||
465 | struct clk *clk; | 465 | struct clk *clk; |
466 | 466 | ||
467 | int ret = -ENOMEM; | 467 | int ret = -ENOMEM; |
468 | int musbid; | ||
469 | 468 | ||
470 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); | 469 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); |
471 | if (!glue) { | 470 | if (!glue) { |
@@ -473,18 +472,10 @@ static int __devinit am35x_probe(struct platform_device *pdev) | |||
473 | goto err0; | 472 | goto err0; |
474 | } | 473 | } |
475 | 474 | ||
476 | /* get the musb id */ | 475 | musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO); |
477 | musbid = musb_get_id(&pdev->dev, GFP_KERNEL); | ||
478 | if (musbid < 0) { | ||
479 | dev_err(&pdev->dev, "failed to allocate musb id\n"); | ||
480 | ret = -ENOMEM; | ||
481 | goto err1; | ||
482 | } | ||
483 | |||
484 | musb = platform_device_alloc("musb-hdrc", musbid); | ||
485 | if (!musb) { | 476 | if (!musb) { |
486 | dev_err(&pdev->dev, "failed to allocate musb device\n"); | 477 | dev_err(&pdev->dev, "failed to allocate musb device\n"); |
487 | goto err2; | 478 | goto err1; |
488 | } | 479 | } |
489 | 480 | ||
490 | phy_clk = clk_get(&pdev->dev, "fck"); | 481 | phy_clk = clk_get(&pdev->dev, "fck"); |
@@ -513,7 +504,6 @@ static int __devinit am35x_probe(struct platform_device *pdev) | |||
513 | goto err6; | 504 | goto err6; |
514 | } | 505 | } |
515 | 506 | ||
516 | musb->id = musbid; | ||
517 | musb->dev.parent = &pdev->dev; | 507 | musb->dev.parent = &pdev->dev; |
518 | musb->dev.dma_mask = &am35x_dmamask; | 508 | musb->dev.dma_mask = &am35x_dmamask; |
519 | musb->dev.coherent_dma_mask = am35x_dmamask; | 509 | musb->dev.coherent_dma_mask = am35x_dmamask; |
@@ -563,9 +553,6 @@ err4: | |||
563 | err3: | 553 | err3: |
564 | platform_device_put(musb); | 554 | platform_device_put(musb); |
565 | 555 | ||
566 | err2: | ||
567 | musb_put_id(&pdev->dev, musbid); | ||
568 | |||
569 | err1: | 556 | err1: |
570 | kfree(glue); | 557 | kfree(glue); |
571 | 558 | ||
@@ -573,13 +560,11 @@ err0: | |||
573 | return ret; | 560 | return ret; |
574 | } | 561 | } |
575 | 562 | ||
576 | static int __devexit am35x_remove(struct platform_device *pdev) | 563 | static int am35x_remove(struct platform_device *pdev) |
577 | { | 564 | { |
578 | struct am35x_glue *glue = platform_get_drvdata(pdev); | 565 | struct am35x_glue *glue = platform_get_drvdata(pdev); |
579 | 566 | ||
580 | musb_put_id(&pdev->dev, glue->musb->id); | 567 | platform_device_unregister(glue->musb); |
581 | platform_device_del(glue->musb); | ||
582 | platform_device_put(glue->musb); | ||
583 | clk_disable(glue->clk); | 568 | clk_disable(glue->clk); |
584 | clk_disable(glue->phy_clk); | 569 | clk_disable(glue->phy_clk); |
585 | clk_put(glue->clk); | 570 | clk_put(glue->clk); |
@@ -644,7 +629,7 @@ static struct dev_pm_ops am35x_pm_ops = { | |||
644 | 629 | ||
645 | static struct platform_driver am35x_driver = { | 630 | static struct platform_driver am35x_driver = { |
646 | .probe = am35x_probe, | 631 | .probe = am35x_probe, |
647 | .remove = __devexit_p(am35x_remove), | 632 | .remove = am35x_remove, |
648 | .driver = { | 633 | .driver = { |
649 | .name = "musb-am35x", | 634 | .name = "musb-am35x", |
650 | .pm = DEV_PM_OPS, | 635 | .pm = DEV_PM_OPS, |
@@ -654,15 +639,4 @@ static struct platform_driver am35x_driver = { | |||
654 | MODULE_DESCRIPTION("AM35x MUSB Glue Layer"); | 639 | MODULE_DESCRIPTION("AM35x MUSB Glue Layer"); |
655 | MODULE_AUTHOR("Ajay Kumar Gupta <ajay.gupta@ti.com>"); | 640 | MODULE_AUTHOR("Ajay Kumar Gupta <ajay.gupta@ti.com>"); |
656 | MODULE_LICENSE("GPL v2"); | 641 | MODULE_LICENSE("GPL v2"); |
657 | 642 | module_platform_driver(am35x_driver); | |
658 | static int __init am35x_init(void) | ||
659 | { | ||
660 | return platform_driver_register(&am35x_driver); | ||
661 | } | ||
662 | module_init(am35x_init); | ||
663 | |||
664 | static void __exit am35x_exit(void) | ||
665 | { | ||
666 | platform_driver_unregister(&am35x_driver); | ||
667 | } | ||
668 | module_exit(am35x_exit); | ||
diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c index e8cff9bb9d23..14dab9f9b3d0 100644 --- a/drivers/usb/musb/blackfin.c +++ b/drivers/usb/musb/blackfin.c | |||
@@ -448,14 +448,13 @@ static const struct musb_platform_ops bfin_ops = { | |||
448 | 448 | ||
449 | static u64 bfin_dmamask = DMA_BIT_MASK(32); | 449 | static u64 bfin_dmamask = DMA_BIT_MASK(32); |
450 | 450 | ||
451 | static int __devinit bfin_probe(struct platform_device *pdev) | 451 | static int bfin_probe(struct platform_device *pdev) |
452 | { | 452 | { |
453 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; | 453 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; |
454 | struct platform_device *musb; | 454 | struct platform_device *musb; |
455 | struct bfin_glue *glue; | 455 | struct bfin_glue *glue; |
456 | 456 | ||
457 | int ret = -ENOMEM; | 457 | int ret = -ENOMEM; |
458 | int musbid; | ||
459 | 458 | ||
460 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); | 459 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); |
461 | if (!glue) { | 460 | if (!glue) { |
@@ -463,21 +462,12 @@ static int __devinit bfin_probe(struct platform_device *pdev) | |||
463 | goto err0; | 462 | goto err0; |
464 | } | 463 | } |
465 | 464 | ||
466 | /* get the musb id */ | 465 | musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO); |
467 | musbid = musb_get_id(&pdev->dev, GFP_KERNEL); | ||
468 | if (musbid < 0) { | ||
469 | dev_err(&pdev->dev, "failed to allocate musb id\n"); | ||
470 | ret = -ENOMEM; | ||
471 | goto err1; | ||
472 | } | ||
473 | |||
474 | musb = platform_device_alloc("musb-hdrc", musbid); | ||
475 | if (!musb) { | 466 | if (!musb) { |
476 | dev_err(&pdev->dev, "failed to allocate musb device\n"); | 467 | dev_err(&pdev->dev, "failed to allocate musb device\n"); |
477 | goto err2; | 468 | goto err1; |
478 | } | 469 | } |
479 | 470 | ||
480 | musb->id = musbid; | ||
481 | musb->dev.parent = &pdev->dev; | 471 | musb->dev.parent = &pdev->dev; |
482 | musb->dev.dma_mask = &bfin_dmamask; | 472 | musb->dev.dma_mask = &bfin_dmamask; |
483 | musb->dev.coherent_dma_mask = bfin_dmamask; | 473 | musb->dev.coherent_dma_mask = bfin_dmamask; |
@@ -513,9 +503,6 @@ static int __devinit bfin_probe(struct platform_device *pdev) | |||
513 | err3: | 503 | err3: |
514 | platform_device_put(musb); | 504 | platform_device_put(musb); |
515 | 505 | ||
516 | err2: | ||
517 | musb_put_id(&pdev->dev, musbid); | ||
518 | |||
519 | err1: | 506 | err1: |
520 | kfree(glue); | 507 | kfree(glue); |
521 | 508 | ||
@@ -523,13 +510,11 @@ err0: | |||
523 | return ret; | 510 | return ret; |
524 | } | 511 | } |
525 | 512 | ||
526 | static int __devexit bfin_remove(struct platform_device *pdev) | 513 | static int bfin_remove(struct platform_device *pdev) |
527 | { | 514 | { |
528 | struct bfin_glue *glue = platform_get_drvdata(pdev); | 515 | struct bfin_glue *glue = platform_get_drvdata(pdev); |
529 | 516 | ||
530 | musb_put_id(&pdev->dev, glue->musb->id); | 517 | platform_device_unregister(glue->musb); |
531 | platform_device_del(glue->musb); | ||
532 | platform_device_put(glue->musb); | ||
533 | kfree(glue); | 518 | kfree(glue); |
534 | 519 | ||
535 | return 0; | 520 | return 0; |
@@ -585,15 +570,4 @@ static struct platform_driver bfin_driver = { | |||
585 | MODULE_DESCRIPTION("Blackfin MUSB Glue Layer"); | 570 | MODULE_DESCRIPTION("Blackfin MUSB Glue Layer"); |
586 | MODULE_AUTHOR("Bryan Wy <cooloney@kernel.org>"); | 571 | MODULE_AUTHOR("Bryan Wy <cooloney@kernel.org>"); |
587 | MODULE_LICENSE("GPL v2"); | 572 | MODULE_LICENSE("GPL v2"); |
588 | 573 | module_platform_driver(bfin_driver); | |
589 | static int __init bfin_init(void) | ||
590 | { | ||
591 | return platform_driver_register(&bfin_driver); | ||
592 | } | ||
593 | module_init(bfin_init); | ||
594 | |||
595 | static void __exit bfin_exit(void) | ||
596 | { | ||
597 | platform_driver_unregister(&bfin_driver); | ||
598 | } | ||
599 | module_exit(bfin_exit); | ||
diff --git a/drivers/usb/musb/cppi_dma.c b/drivers/usb/musb/cppi_dma.c index e19da82b4782..0968dd7a859d 100644 --- a/drivers/usb/musb/cppi_dma.c +++ b/drivers/usb/musb/cppi_dma.c | |||
@@ -1314,10 +1314,10 @@ irqreturn_t cppi_interrupt(int irq, void *dev_id) | |||
1314 | 1314 | ||
1315 | return IRQ_HANDLED; | 1315 | return IRQ_HANDLED; |
1316 | } | 1316 | } |
1317 | EXPORT_SYMBOL_GPL(cppi_interrupt); | ||
1317 | 1318 | ||
1318 | /* Instantiate a software object representing a DMA controller. */ | 1319 | /* Instantiate a software object representing a DMA controller. */ |
1319 | struct dma_controller *__devinit | 1320 | struct dma_controller *dma_controller_create(struct musb *musb, void __iomem *mregs) |
1320 | dma_controller_create(struct musb *musb, void __iomem *mregs) | ||
1321 | { | 1321 | { |
1322 | struct cppi *controller; | 1322 | struct cppi *controller; |
1323 | struct device *dev = musb->controller; | 1323 | struct device *dev = musb->controller; |
diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c index 8bc44b76eec2..97996af2646e 100644 --- a/drivers/usb/musb/da8xx.c +++ b/drivers/usb/musb/da8xx.c | |||
@@ -471,7 +471,7 @@ static const struct musb_platform_ops da8xx_ops = { | |||
471 | 471 | ||
472 | static u64 da8xx_dmamask = DMA_BIT_MASK(32); | 472 | static u64 da8xx_dmamask = DMA_BIT_MASK(32); |
473 | 473 | ||
474 | static int __devinit da8xx_probe(struct platform_device *pdev) | 474 | static int da8xx_probe(struct platform_device *pdev) |
475 | { | 475 | { |
476 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; | 476 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; |
477 | struct platform_device *musb; | 477 | struct platform_device *musb; |
@@ -480,7 +480,6 @@ static int __devinit da8xx_probe(struct platform_device *pdev) | |||
480 | struct clk *clk; | 480 | struct clk *clk; |
481 | 481 | ||
482 | int ret = -ENOMEM; | 482 | int ret = -ENOMEM; |
483 | int musbid; | ||
484 | 483 | ||
485 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); | 484 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); |
486 | if (!glue) { | 485 | if (!glue) { |
@@ -488,18 +487,10 @@ static int __devinit da8xx_probe(struct platform_device *pdev) | |||
488 | goto err0; | 487 | goto err0; |
489 | } | 488 | } |
490 | 489 | ||
491 | /* get the musb id */ | 490 | musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO); |
492 | musbid = musb_get_id(&pdev->dev, GFP_KERNEL); | ||
493 | if (musbid < 0) { | ||
494 | dev_err(&pdev->dev, "failed to allocate musb id\n"); | ||
495 | ret = -ENOMEM; | ||
496 | goto err1; | ||
497 | } | ||
498 | |||
499 | musb = platform_device_alloc("musb-hdrc", musbid); | ||
500 | if (!musb) { | 491 | if (!musb) { |
501 | dev_err(&pdev->dev, "failed to allocate musb device\n"); | 492 | dev_err(&pdev->dev, "failed to allocate musb device\n"); |
502 | goto err2; | 493 | goto err1; |
503 | } | 494 | } |
504 | 495 | ||
505 | clk = clk_get(&pdev->dev, "usb20"); | 496 | clk = clk_get(&pdev->dev, "usb20"); |
@@ -515,7 +506,6 @@ static int __devinit da8xx_probe(struct platform_device *pdev) | |||
515 | goto err4; | 506 | goto err4; |
516 | } | 507 | } |
517 | 508 | ||
518 | musb->id = musbid; | ||
519 | musb->dev.parent = &pdev->dev; | 509 | musb->dev.parent = &pdev->dev; |
520 | musb->dev.dma_mask = &da8xx_dmamask; | 510 | musb->dev.dma_mask = &da8xx_dmamask; |
521 | musb->dev.coherent_dma_mask = da8xx_dmamask; | 511 | musb->dev.coherent_dma_mask = da8xx_dmamask; |
@@ -558,9 +548,6 @@ err4: | |||
558 | err3: | 548 | err3: |
559 | platform_device_put(musb); | 549 | platform_device_put(musb); |
560 | 550 | ||
561 | err2: | ||
562 | musb_put_id(&pdev->dev, musbid); | ||
563 | |||
564 | err1: | 551 | err1: |
565 | kfree(glue); | 552 | kfree(glue); |
566 | 553 | ||
@@ -568,13 +555,11 @@ err0: | |||
568 | return ret; | 555 | return ret; |
569 | } | 556 | } |
570 | 557 | ||
571 | static int __devexit da8xx_remove(struct platform_device *pdev) | 558 | static int da8xx_remove(struct platform_device *pdev) |
572 | { | 559 | { |
573 | struct da8xx_glue *glue = platform_get_drvdata(pdev); | 560 | struct da8xx_glue *glue = platform_get_drvdata(pdev); |
574 | 561 | ||
575 | musb_put_id(&pdev->dev, glue->musb->id); | 562 | platform_device_unregister(glue->musb); |
576 | platform_device_del(glue->musb); | ||
577 | platform_device_put(glue->musb); | ||
578 | clk_disable(glue->clk); | 563 | clk_disable(glue->clk); |
579 | clk_put(glue->clk); | 564 | clk_put(glue->clk); |
580 | kfree(glue); | 565 | kfree(glue); |
@@ -584,7 +569,7 @@ static int __devexit da8xx_remove(struct platform_device *pdev) | |||
584 | 569 | ||
585 | static struct platform_driver da8xx_driver = { | 570 | static struct platform_driver da8xx_driver = { |
586 | .probe = da8xx_probe, | 571 | .probe = da8xx_probe, |
587 | .remove = __devexit_p(da8xx_remove), | 572 | .remove = da8xx_remove, |
588 | .driver = { | 573 | .driver = { |
589 | .name = "musb-da8xx", | 574 | .name = "musb-da8xx", |
590 | }, | 575 | }, |
@@ -593,15 +578,4 @@ static struct platform_driver da8xx_driver = { | |||
593 | MODULE_DESCRIPTION("DA8xx/OMAP-L1x MUSB Glue Layer"); | 578 | MODULE_DESCRIPTION("DA8xx/OMAP-L1x MUSB Glue Layer"); |
594 | MODULE_AUTHOR("Sergei Shtylyov <sshtylyov@ru.mvista.com>"); | 579 | MODULE_AUTHOR("Sergei Shtylyov <sshtylyov@ru.mvista.com>"); |
595 | MODULE_LICENSE("GPL v2"); | 580 | MODULE_LICENSE("GPL v2"); |
596 | 581 | module_platform_driver(da8xx_driver); | |
597 | static int __init da8xx_init(void) | ||
598 | { | ||
599 | return platform_driver_register(&da8xx_driver); | ||
600 | } | ||
601 | module_init(da8xx_init); | ||
602 | |||
603 | static void __exit da8xx_exit(void) | ||
604 | { | ||
605 | platform_driver_unregister(&da8xx_driver); | ||
606 | } | ||
607 | module_exit(da8xx_exit); | ||
diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c index 606bfd00cde6..b1c01cad28b2 100644 --- a/drivers/usb/musb/davinci.c +++ b/drivers/usb/musb/davinci.c | |||
@@ -504,7 +504,7 @@ static const struct musb_platform_ops davinci_ops = { | |||
504 | 504 | ||
505 | static u64 davinci_dmamask = DMA_BIT_MASK(32); | 505 | static u64 davinci_dmamask = DMA_BIT_MASK(32); |
506 | 506 | ||
507 | static int __devinit davinci_probe(struct platform_device *pdev) | 507 | static int davinci_probe(struct platform_device *pdev) |
508 | { | 508 | { |
509 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; | 509 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; |
510 | struct platform_device *musb; | 510 | struct platform_device *musb; |
@@ -512,7 +512,6 @@ static int __devinit davinci_probe(struct platform_device *pdev) | |||
512 | struct clk *clk; | 512 | struct clk *clk; |
513 | 513 | ||
514 | int ret = -ENOMEM; | 514 | int ret = -ENOMEM; |
515 | int musbid; | ||
516 | 515 | ||
517 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); | 516 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); |
518 | if (!glue) { | 517 | if (!glue) { |
@@ -520,18 +519,10 @@ static int __devinit davinci_probe(struct platform_device *pdev) | |||
520 | goto err0; | 519 | goto err0; |
521 | } | 520 | } |
522 | 521 | ||
523 | /* get the musb id */ | 522 | musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO); |
524 | musbid = musb_get_id(&pdev->dev, GFP_KERNEL); | ||
525 | if (musbid < 0) { | ||
526 | dev_err(&pdev->dev, "failed to allocate musb id\n"); | ||
527 | ret = -ENOMEM; | ||
528 | goto err1; | ||
529 | } | ||
530 | |||
531 | musb = platform_device_alloc("musb-hdrc", musbid); | ||
532 | if (!musb) { | 523 | if (!musb) { |
533 | dev_err(&pdev->dev, "failed to allocate musb device\n"); | 524 | dev_err(&pdev->dev, "failed to allocate musb device\n"); |
534 | goto err2; | 525 | goto err1; |
535 | } | 526 | } |
536 | 527 | ||
537 | clk = clk_get(&pdev->dev, "usb"); | 528 | clk = clk_get(&pdev->dev, "usb"); |
@@ -547,7 +538,6 @@ static int __devinit davinci_probe(struct platform_device *pdev) | |||
547 | goto err4; | 538 | goto err4; |
548 | } | 539 | } |
549 | 540 | ||
550 | musb->id = musbid; | ||
551 | musb->dev.parent = &pdev->dev; | 541 | musb->dev.parent = &pdev->dev; |
552 | musb->dev.dma_mask = &davinci_dmamask; | 542 | musb->dev.dma_mask = &davinci_dmamask; |
553 | musb->dev.coherent_dma_mask = davinci_dmamask; | 543 | musb->dev.coherent_dma_mask = davinci_dmamask; |
@@ -590,9 +580,6 @@ err4: | |||
590 | err3: | 580 | err3: |
591 | platform_device_put(musb); | 581 | platform_device_put(musb); |
592 | 582 | ||
593 | err2: | ||
594 | musb_put_id(&pdev->dev, musbid); | ||
595 | |||
596 | err1: | 583 | err1: |
597 | kfree(glue); | 584 | kfree(glue); |
598 | 585 | ||
@@ -600,13 +587,11 @@ err0: | |||
600 | return ret; | 587 | return ret; |
601 | } | 588 | } |
602 | 589 | ||
603 | static int __devexit davinci_remove(struct platform_device *pdev) | 590 | static int davinci_remove(struct platform_device *pdev) |
604 | { | 591 | { |
605 | struct davinci_glue *glue = platform_get_drvdata(pdev); | 592 | struct davinci_glue *glue = platform_get_drvdata(pdev); |
606 | 593 | ||
607 | musb_put_id(&pdev->dev, glue->musb->id); | 594 | platform_device_unregister(glue->musb); |
608 | platform_device_del(glue->musb); | ||
609 | platform_device_put(glue->musb); | ||
610 | clk_disable(glue->clk); | 595 | clk_disable(glue->clk); |
611 | clk_put(glue->clk); | 596 | clk_put(glue->clk); |
612 | kfree(glue); | 597 | kfree(glue); |
@@ -616,7 +601,7 @@ static int __devexit davinci_remove(struct platform_device *pdev) | |||
616 | 601 | ||
617 | static struct platform_driver davinci_driver = { | 602 | static struct platform_driver davinci_driver = { |
618 | .probe = davinci_probe, | 603 | .probe = davinci_probe, |
619 | .remove = __devexit_p(davinci_remove), | 604 | .remove = davinci_remove, |
620 | .driver = { | 605 | .driver = { |
621 | .name = "musb-davinci", | 606 | .name = "musb-davinci", |
622 | }, | 607 | }, |
@@ -625,15 +610,4 @@ static struct platform_driver davinci_driver = { | |||
625 | MODULE_DESCRIPTION("DaVinci MUSB Glue Layer"); | 610 | MODULE_DESCRIPTION("DaVinci MUSB Glue Layer"); |
626 | MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>"); | 611 | MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>"); |
627 | MODULE_LICENSE("GPL v2"); | 612 | MODULE_LICENSE("GPL v2"); |
628 | 613 | module_platform_driver(davinci_driver); | |
629 | static int __init davinci_init(void) | ||
630 | { | ||
631 | return platform_driver_register(&davinci_driver); | ||
632 | } | ||
633 | module_init(davinci_init); | ||
634 | |||
635 | static void __exit davinci_exit(void) | ||
636 | { | ||
637 | platform_driver_unregister(&davinci_driver); | ||
638 | } | ||
639 | module_exit(davinci_exit); | ||
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index bb56a0e8b23b..57cc9c6eaa9f 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
@@ -116,7 +116,6 @@ | |||
116 | 116 | ||
117 | #define MUSB_DRIVER_NAME "musb-hdrc" | 117 | #define MUSB_DRIVER_NAME "musb-hdrc" |
118 | const char musb_driver_name[] = MUSB_DRIVER_NAME; | 118 | const char musb_driver_name[] = MUSB_DRIVER_NAME; |
119 | static DEFINE_IDA(musb_ida); | ||
120 | 119 | ||
121 | MODULE_DESCRIPTION(DRIVER_INFO); | 120 | MODULE_DESCRIPTION(DRIVER_INFO); |
122 | MODULE_AUTHOR(DRIVER_AUTHOR); | 121 | MODULE_AUTHOR(DRIVER_AUTHOR); |
@@ -133,35 +132,6 @@ static inline struct musb *dev_to_musb(struct device *dev) | |||
133 | 132 | ||
134 | /*-------------------------------------------------------------------------*/ | 133 | /*-------------------------------------------------------------------------*/ |
135 | 134 | ||
136 | int musb_get_id(struct device *dev, gfp_t gfp_mask) | ||
137 | { | ||
138 | int ret; | ||
139 | int id; | ||
140 | |||
141 | ret = ida_pre_get(&musb_ida, gfp_mask); | ||
142 | if (!ret) { | ||
143 | dev_err(dev, "failed to reserve resource for id\n"); | ||
144 | return -ENOMEM; | ||
145 | } | ||
146 | |||
147 | ret = ida_get_new(&musb_ida, &id); | ||
148 | if (ret < 0) { | ||
149 | dev_err(dev, "failed to allocate a new id\n"); | ||
150 | return ret; | ||
151 | } | ||
152 | |||
153 | return id; | ||
154 | } | ||
155 | EXPORT_SYMBOL_GPL(musb_get_id); | ||
156 | |||
157 | void musb_put_id(struct device *dev, int id) | ||
158 | { | ||
159 | |||
160 | dev_dbg(dev, "removing id %d\n", id); | ||
161 | ida_remove(&musb_ida, id); | ||
162 | } | ||
163 | EXPORT_SYMBOL_GPL(musb_put_id); | ||
164 | |||
165 | #ifndef CONFIG_BLACKFIN | 135 | #ifndef CONFIG_BLACKFIN |
166 | static int musb_ulpi_read(struct usb_phy *phy, u32 offset) | 136 | static int musb_ulpi_read(struct usb_phy *phy, u32 offset) |
167 | { | 137 | { |
@@ -467,12 +437,12 @@ void musb_hnp_stop(struct musb *musb) | |||
467 | */ | 437 | */ |
468 | 438 | ||
469 | static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | 439 | static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, |
470 | u8 devctl, u8 power) | 440 | u8 devctl) |
471 | { | 441 | { |
472 | struct usb_otg *otg = musb->xceiv->otg; | 442 | struct usb_otg *otg = musb->xceiv->otg; |
473 | irqreturn_t handled = IRQ_NONE; | 443 | irqreturn_t handled = IRQ_NONE; |
474 | 444 | ||
475 | dev_dbg(musb->controller, "<== Power=%02x, DevCtl=%02x, int_usb=0x%x\n", power, devctl, | 445 | dev_dbg(musb->controller, "<== DevCtl=%02x, int_usb=0x%x\n", devctl, |
476 | int_usb); | 446 | int_usb); |
477 | 447 | ||
478 | /* in host mode, the peripheral may issue remote wakeup. | 448 | /* in host mode, the peripheral may issue remote wakeup. |
@@ -485,6 +455,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
485 | 455 | ||
486 | if (devctl & MUSB_DEVCTL_HM) { | 456 | if (devctl & MUSB_DEVCTL_HM) { |
487 | void __iomem *mbase = musb->mregs; | 457 | void __iomem *mbase = musb->mregs; |
458 | u8 power; | ||
488 | 459 | ||
489 | switch (musb->xceiv->state) { | 460 | switch (musb->xceiv->state) { |
490 | case OTG_STATE_A_SUSPEND: | 461 | case OTG_STATE_A_SUSPEND: |
@@ -492,6 +463,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
492 | * will stop RESUME signaling | 463 | * will stop RESUME signaling |
493 | */ | 464 | */ |
494 | 465 | ||
466 | power = musb_readb(musb->mregs, MUSB_POWER); | ||
495 | if (power & MUSB_POWER_SUSPENDM) { | 467 | if (power & MUSB_POWER_SUSPENDM) { |
496 | /* spurious */ | 468 | /* spurious */ |
497 | musb->int_usb &= ~MUSB_INTR_SUSPEND; | 469 | musb->int_usb &= ~MUSB_INTR_SUSPEND; |
@@ -655,8 +627,8 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
655 | } | 627 | } |
656 | 628 | ||
657 | if (int_usb & MUSB_INTR_SUSPEND) { | 629 | if (int_usb & MUSB_INTR_SUSPEND) { |
658 | dev_dbg(musb->controller, "SUSPEND (%s) devctl %02x power %02x\n", | 630 | dev_dbg(musb->controller, "SUSPEND (%s) devctl %02x\n", |
659 | otg_state_string(musb->xceiv->state), devctl, power); | 631 | otg_state_string(musb->xceiv->state), devctl); |
660 | handled = IRQ_HANDLED; | 632 | handled = IRQ_HANDLED; |
661 | 633 | ||
662 | switch (musb->xceiv->state) { | 634 | switch (musb->xceiv->state) { |
@@ -722,8 +694,10 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
722 | if (is_peripheral_active(musb)) { | 694 | if (is_peripheral_active(musb)) { |
723 | /* REVISIT HNP; just force disconnect */ | 695 | /* REVISIT HNP; just force disconnect */ |
724 | } | 696 | } |
725 | musb_writew(musb->mregs, MUSB_INTRTXE, musb->epmask); | 697 | musb->intrtxe = musb->epmask; |
726 | musb_writew(musb->mregs, MUSB_INTRRXE, musb->epmask & 0xfffe); | 698 | musb_writew(musb->mregs, MUSB_INTRTXE, musb->intrtxe); |
699 | musb->intrrxe = musb->epmask & 0xfffe; | ||
700 | musb_writew(musb->mregs, MUSB_INTRRXE, musb->intrrxe); | ||
727 | musb_writeb(musb->mregs, MUSB_INTRUSBE, 0xf7); | 701 | musb_writeb(musb->mregs, MUSB_INTRUSBE, 0xf7); |
728 | musb->port1_status &= ~(USB_PORT_STAT_LOW_SPEED | 702 | musb->port1_status &= ~(USB_PORT_STAT_LOW_SPEED |
729 | |USB_PORT_STAT_HIGH_SPEED | 703 | |USB_PORT_STAT_HIGH_SPEED |
@@ -944,8 +918,10 @@ void musb_start(struct musb *musb) | |||
944 | dev_dbg(musb->controller, "<== devctl %02x\n", devctl); | 918 | dev_dbg(musb->controller, "<== devctl %02x\n", devctl); |
945 | 919 | ||
946 | /* Set INT enable registers, enable interrupts */ | 920 | /* Set INT enable registers, enable interrupts */ |
947 | musb_writew(regs, MUSB_INTRTXE, musb->epmask); | 921 | musb->intrtxe = musb->epmask; |
948 | musb_writew(regs, MUSB_INTRRXE, musb->epmask & 0xfffe); | 922 | musb_writew(regs, MUSB_INTRTXE, musb->intrtxe); |
923 | musb->intrrxe = musb->epmask & 0xfffe; | ||
924 | musb_writew(regs, MUSB_INTRRXE, musb->intrrxe); | ||
949 | musb_writeb(regs, MUSB_INTRUSBE, 0xf7); | 925 | musb_writeb(regs, MUSB_INTRUSBE, 0xf7); |
950 | 926 | ||
951 | musb_writeb(regs, MUSB_TESTMODE, 0); | 927 | musb_writeb(regs, MUSB_TESTMODE, 0); |
@@ -983,7 +959,9 @@ static void musb_generic_disable(struct musb *musb) | |||
983 | 959 | ||
984 | /* disable interrupts */ | 960 | /* disable interrupts */ |
985 | musb_writeb(mbase, MUSB_INTRUSBE, 0); | 961 | musb_writeb(mbase, MUSB_INTRUSBE, 0); |
962 | musb->intrtxe = 0; | ||
986 | musb_writew(mbase, MUSB_INTRTXE, 0); | 963 | musb_writew(mbase, MUSB_INTRTXE, 0); |
964 | musb->intrrxe = 0; | ||
987 | musb_writew(mbase, MUSB_INTRRXE, 0); | 965 | musb_writew(mbase, MUSB_INTRRXE, 0); |
988 | 966 | ||
989 | /* off */ | 967 | /* off */ |
@@ -1062,12 +1040,12 @@ static void musb_shutdown(struct platform_device *pdev) | |||
1062 | || defined(CONFIG_USB_MUSB_AM35X_MODULE) \ | 1040 | || defined(CONFIG_USB_MUSB_AM35X_MODULE) \ |
1063 | || defined(CONFIG_USB_MUSB_DSPS) \ | 1041 | || defined(CONFIG_USB_MUSB_DSPS) \ |
1064 | || defined(CONFIG_USB_MUSB_DSPS_MODULE) | 1042 | || defined(CONFIG_USB_MUSB_DSPS_MODULE) |
1065 | static ushort __devinitdata fifo_mode = 4; | 1043 | static ushort fifo_mode = 4; |
1066 | #elif defined(CONFIG_USB_MUSB_UX500) \ | 1044 | #elif defined(CONFIG_USB_MUSB_UX500) \ |
1067 | || defined(CONFIG_USB_MUSB_UX500_MODULE) | 1045 | || defined(CONFIG_USB_MUSB_UX500_MODULE) |
1068 | static ushort __devinitdata fifo_mode = 5; | 1046 | static ushort fifo_mode = 5; |
1069 | #else | 1047 | #else |
1070 | static ushort __devinitdata fifo_mode = 2; | 1048 | static ushort fifo_mode = 2; |
1071 | #endif | 1049 | #endif |
1072 | 1050 | ||
1073 | /* "modprobe ... fifo_mode=1" etc */ | 1051 | /* "modprobe ... fifo_mode=1" etc */ |
@@ -1080,7 +1058,7 @@ MODULE_PARM_DESC(fifo_mode, "initial endpoint configuration"); | |||
1080 | */ | 1058 | */ |
1081 | 1059 | ||
1082 | /* mode 0 - fits in 2KB */ | 1060 | /* mode 0 - fits in 2KB */ |
1083 | static struct musb_fifo_cfg __devinitdata mode_0_cfg[] = { | 1061 | static struct musb_fifo_cfg mode_0_cfg[] = { |
1084 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, | 1062 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, |
1085 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, | 1063 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, |
1086 | { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, }, | 1064 | { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, }, |
@@ -1089,7 +1067,7 @@ static struct musb_fifo_cfg __devinitdata mode_0_cfg[] = { | |||
1089 | }; | 1067 | }; |
1090 | 1068 | ||
1091 | /* mode 1 - fits in 4KB */ | 1069 | /* mode 1 - fits in 4KB */ |
1092 | static struct musb_fifo_cfg __devinitdata mode_1_cfg[] = { | 1070 | static struct musb_fifo_cfg mode_1_cfg[] = { |
1093 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, }, | 1071 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, }, |
1094 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, }, | 1072 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, }, |
1095 | { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, .mode = BUF_DOUBLE, }, | 1073 | { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, .mode = BUF_DOUBLE, }, |
@@ -1098,7 +1076,7 @@ static struct musb_fifo_cfg __devinitdata mode_1_cfg[] = { | |||
1098 | }; | 1076 | }; |
1099 | 1077 | ||
1100 | /* mode 2 - fits in 4KB */ | 1078 | /* mode 2 - fits in 4KB */ |
1101 | static struct musb_fifo_cfg __devinitdata mode_2_cfg[] = { | 1079 | static struct musb_fifo_cfg mode_2_cfg[] = { |
1102 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, | 1080 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, |
1103 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, | 1081 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, |
1104 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, | 1082 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, |
@@ -1108,7 +1086,7 @@ static struct musb_fifo_cfg __devinitdata mode_2_cfg[] = { | |||
1108 | }; | 1086 | }; |
1109 | 1087 | ||
1110 | /* mode 3 - fits in 4KB */ | 1088 | /* mode 3 - fits in 4KB */ |
1111 | static struct musb_fifo_cfg __devinitdata mode_3_cfg[] = { | 1089 | static struct musb_fifo_cfg mode_3_cfg[] = { |
1112 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, }, | 1090 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, }, |
1113 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, }, | 1091 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, }, |
1114 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, | 1092 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, |
@@ -1118,7 +1096,7 @@ static struct musb_fifo_cfg __devinitdata mode_3_cfg[] = { | |||
1118 | }; | 1096 | }; |
1119 | 1097 | ||
1120 | /* mode 4 - fits in 16KB */ | 1098 | /* mode 4 - fits in 16KB */ |
1121 | static struct musb_fifo_cfg __devinitdata mode_4_cfg[] = { | 1099 | static struct musb_fifo_cfg mode_4_cfg[] = { |
1122 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, | 1100 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, |
1123 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, | 1101 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, |
1124 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, | 1102 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, |
@@ -1149,7 +1127,7 @@ static struct musb_fifo_cfg __devinitdata mode_4_cfg[] = { | |||
1149 | }; | 1127 | }; |
1150 | 1128 | ||
1151 | /* mode 5 - fits in 8KB */ | 1129 | /* mode 5 - fits in 8KB */ |
1152 | static struct musb_fifo_cfg __devinitdata mode_5_cfg[] = { | 1130 | static struct musb_fifo_cfg mode_5_cfg[] = { |
1153 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, | 1131 | { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, |
1154 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, | 1132 | { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, |
1155 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, | 1133 | { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, |
@@ -1185,7 +1163,7 @@ static struct musb_fifo_cfg __devinitdata mode_5_cfg[] = { | |||
1185 | * | 1163 | * |
1186 | * returns negative errno or offset for next fifo. | 1164 | * returns negative errno or offset for next fifo. |
1187 | */ | 1165 | */ |
1188 | static int __devinit | 1166 | static int |
1189 | fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, | 1167 | fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, |
1190 | const struct musb_fifo_cfg *cfg, u16 offset) | 1168 | const struct musb_fifo_cfg *cfg, u16 offset) |
1191 | { | 1169 | { |
@@ -1256,11 +1234,11 @@ fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, | |||
1256 | return offset + (maxpacket << ((c_size & MUSB_FIFOSZ_DPB) ? 1 : 0)); | 1234 | return offset + (maxpacket << ((c_size & MUSB_FIFOSZ_DPB) ? 1 : 0)); |
1257 | } | 1235 | } |
1258 | 1236 | ||
1259 | static struct musb_fifo_cfg __devinitdata ep0_cfg = { | 1237 | static struct musb_fifo_cfg ep0_cfg = { |
1260 | .style = FIFO_RXTX, .maxpacket = 64, | 1238 | .style = FIFO_RXTX, .maxpacket = 64, |
1261 | }; | 1239 | }; |
1262 | 1240 | ||
1263 | static int __devinit ep_config_from_table(struct musb *musb) | 1241 | static int ep_config_from_table(struct musb *musb) |
1264 | { | 1242 | { |
1265 | const struct musb_fifo_cfg *cfg; | 1243 | const struct musb_fifo_cfg *cfg; |
1266 | unsigned i, n; | 1244 | unsigned i, n; |
@@ -1351,7 +1329,7 @@ done: | |||
1351 | * ep_config_from_hw - when MUSB_C_DYNFIFO_DEF is false | 1329 | * ep_config_from_hw - when MUSB_C_DYNFIFO_DEF is false |
1352 | * @param musb the controller | 1330 | * @param musb the controller |
1353 | */ | 1331 | */ |
1354 | static int __devinit ep_config_from_hw(struct musb *musb) | 1332 | static int ep_config_from_hw(struct musb *musb) |
1355 | { | 1333 | { |
1356 | u8 epnum = 0; | 1334 | u8 epnum = 0; |
1357 | struct musb_hw_ep *hw_ep; | 1335 | struct musb_hw_ep *hw_ep; |
@@ -1398,7 +1376,7 @@ enum { MUSB_CONTROLLER_MHDRC, MUSB_CONTROLLER_HDRC, }; | |||
1398 | /* Initialize MUSB (M)HDRC part of the USB hardware subsystem; | 1376 | /* Initialize MUSB (M)HDRC part of the USB hardware subsystem; |
1399 | * configure endpoints, or take their config from silicon | 1377 | * configure endpoints, or take their config from silicon |
1400 | */ | 1378 | */ |
1401 | static int __devinit musb_core_init(u16 musb_type, struct musb *musb) | 1379 | static int musb_core_init(u16 musb_type, struct musb *musb) |
1402 | { | 1380 | { |
1403 | u8 reg; | 1381 | u8 reg; |
1404 | char *type; | 1382 | char *type; |
@@ -1523,33 +1501,6 @@ static int __devinit musb_core_init(u16 musb_type, struct musb *musb) | |||
1523 | 1501 | ||
1524 | /*-------------------------------------------------------------------------*/ | 1502 | /*-------------------------------------------------------------------------*/ |
1525 | 1503 | ||
1526 | #if defined(CONFIG_SOC_OMAP2430) || defined(CONFIG_SOC_OMAP3430) || \ | ||
1527 | defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_ARCH_U8500) | ||
1528 | |||
1529 | static irqreturn_t generic_interrupt(int irq, void *__hci) | ||
1530 | { | ||
1531 | unsigned long flags; | ||
1532 | irqreturn_t retval = IRQ_NONE; | ||
1533 | struct musb *musb = __hci; | ||
1534 | |||
1535 | spin_lock_irqsave(&musb->lock, flags); | ||
1536 | |||
1537 | musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB); | ||
1538 | musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX); | ||
1539 | musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX); | ||
1540 | |||
1541 | if (musb->int_usb || musb->int_tx || musb->int_rx) | ||
1542 | retval = musb_interrupt(musb); | ||
1543 | |||
1544 | spin_unlock_irqrestore(&musb->lock, flags); | ||
1545 | |||
1546 | return retval; | ||
1547 | } | ||
1548 | |||
1549 | #else | ||
1550 | #define generic_interrupt NULL | ||
1551 | #endif | ||
1552 | |||
1553 | /* | 1504 | /* |
1554 | * handle all the irqs defined by the HDRC core. for now we expect: other | 1505 | * handle all the irqs defined by the HDRC core. for now we expect: other |
1555 | * irq sources (phy, dma, etc) will be handled first, musb->int_* values | 1506 | * irq sources (phy, dma, etc) will be handled first, musb->int_* values |
@@ -1560,12 +1511,11 @@ static irqreturn_t generic_interrupt(int irq, void *__hci) | |||
1560 | irqreturn_t musb_interrupt(struct musb *musb) | 1511 | irqreturn_t musb_interrupt(struct musb *musb) |
1561 | { | 1512 | { |
1562 | irqreturn_t retval = IRQ_NONE; | 1513 | irqreturn_t retval = IRQ_NONE; |
1563 | u8 devctl, power; | 1514 | u8 devctl; |
1564 | int ep_num; | 1515 | int ep_num; |
1565 | u32 reg; | 1516 | u32 reg; |
1566 | 1517 | ||
1567 | devctl = musb_readb(musb->mregs, MUSB_DEVCTL); | 1518 | devctl = musb_readb(musb->mregs, MUSB_DEVCTL); |
1568 | power = musb_readb(musb->mregs, MUSB_POWER); | ||
1569 | 1519 | ||
1570 | dev_dbg(musb->controller, "** IRQ %s usb%04x tx%04x rx%04x\n", | 1520 | dev_dbg(musb->controller, "** IRQ %s usb%04x tx%04x rx%04x\n", |
1571 | (devctl & MUSB_DEVCTL_HM) ? "host" : "peripheral", | 1521 | (devctl & MUSB_DEVCTL_HM) ? "host" : "peripheral", |
@@ -1576,7 +1526,7 @@ irqreturn_t musb_interrupt(struct musb *musb) | |||
1576 | */ | 1526 | */ |
1577 | if (musb->int_usb) | 1527 | if (musb->int_usb) |
1578 | retval |= musb_stage0_irq(musb, musb->int_usb, | 1528 | retval |= musb_stage0_irq(musb, musb->int_usb, |
1579 | devctl, power); | 1529 | devctl); |
1580 | 1530 | ||
1581 | /* "stage 1" is handling endpoint irqs */ | 1531 | /* "stage 1" is handling endpoint irqs */ |
1582 | 1532 | ||
@@ -1628,7 +1578,7 @@ irqreturn_t musb_interrupt(struct musb *musb) | |||
1628 | EXPORT_SYMBOL_GPL(musb_interrupt); | 1578 | EXPORT_SYMBOL_GPL(musb_interrupt); |
1629 | 1579 | ||
1630 | #ifndef CONFIG_MUSB_PIO_ONLY | 1580 | #ifndef CONFIG_MUSB_PIO_ONLY |
1631 | static bool __devinitdata use_dma = 1; | 1581 | static bool use_dma = 1; |
1632 | 1582 | ||
1633 | /* "modprobe ... use_dma=0" etc */ | 1583 | /* "modprobe ... use_dma=0" etc */ |
1634 | module_param(use_dma, bool, 0); | 1584 | module_param(use_dma, bool, 0); |
@@ -1809,8 +1759,7 @@ static void musb_irq_work(struct work_struct *data) | |||
1809 | * Init support | 1759 | * Init support |
1810 | */ | 1760 | */ |
1811 | 1761 | ||
1812 | static struct musb *__devinit | 1762 | static struct musb *allocate_instance(struct device *dev, |
1813 | allocate_instance(struct device *dev, | ||
1814 | struct musb_hdrc_config *config, void __iomem *mbase) | 1763 | struct musb_hdrc_config *config, void __iomem *mbase) |
1815 | { | 1764 | { |
1816 | struct musb *musb; | 1765 | struct musb *musb; |
@@ -1885,7 +1834,7 @@ static void musb_free(struct musb *musb) | |||
1885 | * @ctrl: virtual address of controller registers, | 1834 | * @ctrl: virtual address of controller registers, |
1886 | * not yet corrected for platform-specific offsets | 1835 | * not yet corrected for platform-specific offsets |
1887 | */ | 1836 | */ |
1888 | static int __devinit | 1837 | static int |
1889 | musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) | 1838 | musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) |
1890 | { | 1839 | { |
1891 | int status; | 1840 | int status; |
@@ -1919,7 +1868,8 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) | |||
1919 | musb->ops = plat->platform_ops; | 1868 | musb->ops = plat->platform_ops; |
1920 | 1869 | ||
1921 | /* The musb_platform_init() call: | 1870 | /* The musb_platform_init() call: |
1922 | * - adjusts musb->mregs and musb->isr if needed, | 1871 | * - adjusts musb->mregs |
1872 | * - sets the musb->isr | ||
1923 | * - may initialize an integrated tranceiver | 1873 | * - may initialize an integrated tranceiver |
1924 | * - initializes musb->xceiv, usually by otg_get_phy() | 1874 | * - initializes musb->xceiv, usually by otg_get_phy() |
1925 | * - stops powering VBUS | 1875 | * - stops powering VBUS |
@@ -1929,7 +1879,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) | |||
1929 | * external/discrete ones in various flavors (twl4030 family, | 1879 | * external/discrete ones in various flavors (twl4030 family, |
1930 | * isp1504, non-OTG, etc) mostly hooking up through ULPI. | 1880 | * isp1504, non-OTG, etc) mostly hooking up through ULPI. |
1931 | */ | 1881 | */ |
1932 | musb->isr = generic_interrupt; | ||
1933 | status = musb_platform_init(musb); | 1882 | status = musb_platform_init(musb); |
1934 | if (status < 0) | 1883 | if (status < 0) |
1935 | goto fail1; | 1884 | goto fail1; |
@@ -2060,7 +2009,7 @@ fail0: | |||
2060 | /* all implementations (PCI bridge to FPGA, VLYNQ, etc) should just | 2009 | /* all implementations (PCI bridge to FPGA, VLYNQ, etc) should just |
2061 | * bridge to a platform device; this driver then suffices. | 2010 | * bridge to a platform device; this driver then suffices. |
2062 | */ | 2011 | */ |
2063 | static int __devinit musb_probe(struct platform_device *pdev) | 2012 | static int musb_probe(struct platform_device *pdev) |
2064 | { | 2013 | { |
2065 | struct device *dev = &pdev->dev; | 2014 | struct device *dev = &pdev->dev; |
2066 | int irq = platform_get_irq_byname(pdev, "mc"); | 2015 | int irq = platform_get_irq_byname(pdev, "mc"); |
@@ -2085,7 +2034,7 @@ static int __devinit musb_probe(struct platform_device *pdev) | |||
2085 | return status; | 2034 | return status; |
2086 | } | 2035 | } |
2087 | 2036 | ||
2088 | static int __devexit musb_remove(struct platform_device *pdev) | 2037 | static int musb_remove(struct platform_device *pdev) |
2089 | { | 2038 | { |
2090 | struct device *dev = &pdev->dev; | 2039 | struct device *dev = &pdev->dev; |
2091 | struct musb *musb = dev_to_musb(dev); | 2040 | struct musb *musb = dev_to_musb(dev); |
@@ -2120,8 +2069,6 @@ static void musb_save_context(struct musb *musb) | |||
2120 | musb->context.testmode = musb_readb(musb_base, MUSB_TESTMODE); | 2069 | musb->context.testmode = musb_readb(musb_base, MUSB_TESTMODE); |
2121 | musb->context.busctl = musb_read_ulpi_buscontrol(musb->mregs); | 2070 | musb->context.busctl = musb_read_ulpi_buscontrol(musb->mregs); |
2122 | musb->context.power = musb_readb(musb_base, MUSB_POWER); | 2071 | musb->context.power = musb_readb(musb_base, MUSB_POWER); |
2123 | musb->context.intrtxe = musb_readw(musb_base, MUSB_INTRTXE); | ||
2124 | musb->context.intrrxe = musb_readw(musb_base, MUSB_INTRRXE); | ||
2125 | musb->context.intrusbe = musb_readb(musb_base, MUSB_INTRUSBE); | 2072 | musb->context.intrusbe = musb_readb(musb_base, MUSB_INTRUSBE); |
2126 | musb->context.index = musb_readb(musb_base, MUSB_INDEX); | 2073 | musb->context.index = musb_readb(musb_base, MUSB_INDEX); |
2127 | musb->context.devctl = musb_readb(musb_base, MUSB_DEVCTL); | 2074 | musb->context.devctl = musb_readb(musb_base, MUSB_DEVCTL); |
@@ -2194,8 +2141,8 @@ static void musb_restore_context(struct musb *musb) | |||
2194 | musb_writeb(musb_base, MUSB_TESTMODE, musb->context.testmode); | 2141 | musb_writeb(musb_base, MUSB_TESTMODE, musb->context.testmode); |
2195 | musb_write_ulpi_buscontrol(musb->mregs, musb->context.busctl); | 2142 | musb_write_ulpi_buscontrol(musb->mregs, musb->context.busctl); |
2196 | musb_writeb(musb_base, MUSB_POWER, musb->context.power); | 2143 | musb_writeb(musb_base, MUSB_POWER, musb->context.power); |
2197 | musb_writew(musb_base, MUSB_INTRTXE, musb->context.intrtxe); | 2144 | musb_writew(musb_base, MUSB_INTRTXE, musb->intrtxe); |
2198 | musb_writew(musb_base, MUSB_INTRRXE, musb->context.intrrxe); | 2145 | musb_writew(musb_base, MUSB_INTRRXE, musb->intrrxe); |
2199 | musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe); | 2146 | musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe); |
2200 | musb_writeb(musb_base, MUSB_DEVCTL, musb->context.devctl); | 2147 | musb_writeb(musb_base, MUSB_DEVCTL, musb->context.devctl); |
2201 | 2148 | ||
@@ -2340,7 +2287,7 @@ static struct platform_driver musb_driver = { | |||
2340 | .pm = MUSB_DEV_PM_OPS, | 2287 | .pm = MUSB_DEV_PM_OPS, |
2341 | }, | 2288 | }, |
2342 | .probe = musb_probe, | 2289 | .probe = musb_probe, |
2343 | .remove = __devexit_p(musb_remove), | 2290 | .remove = musb_remove, |
2344 | .shutdown = musb_shutdown, | 2291 | .shutdown = musb_shutdown, |
2345 | }; | 2292 | }; |
2346 | 2293 | ||
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index c158aacd6de8..7fb4819a6f11 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h | |||
@@ -288,7 +288,6 @@ struct musb_csr_regs { | |||
288 | struct musb_context_registers { | 288 | struct musb_context_registers { |
289 | 289 | ||
290 | u8 power; | 290 | u8 power; |
291 | u16 intrtxe, intrrxe; | ||
292 | u8 intrusbe; | 291 | u8 intrusbe; |
293 | u16 frame; | 292 | u16 frame; |
294 | u8 index, testmode; | 293 | u8 index, testmode; |
@@ -313,6 +312,8 @@ struct musb { | |||
313 | struct work_struct irq_work; | 312 | struct work_struct irq_work; |
314 | u16 hwvers; | 313 | u16 hwvers; |
315 | 314 | ||
315 | u16 intrrxe; | ||
316 | u16 intrtxe; | ||
316 | /* this hub status bit is reserved by USB 2.0 and not seen by usbcore */ | 317 | /* this hub status bit is reserved by USB 2.0 and not seen by usbcore */ |
317 | #define MUSB_PORT_STAT_RESUME (1 << 31) | 318 | #define MUSB_PORT_STAT_RESUME (1 << 31) |
318 | 319 | ||
@@ -521,8 +522,6 @@ extern const char musb_driver_name[]; | |||
521 | 522 | ||
522 | extern void musb_start(struct musb *musb); | 523 | extern void musb_start(struct musb *musb); |
523 | extern void musb_stop(struct musb *musb); | 524 | extern void musb_stop(struct musb *musb); |
524 | extern int musb_get_id(struct device *dev, gfp_t gfp_mask); | ||
525 | extern void musb_put_id(struct device *dev, int id); | ||
526 | 525 | ||
527 | extern void musb_write_fifo(struct musb_hw_ep *ep, u16 len, const u8 *src); | 526 | extern void musb_write_fifo(struct musb_hw_ep *ep, u16 len, const u8 *src); |
528 | extern void musb_read_fifo(struct musb_hw_ep *ep, u16 len, u8 *dst); | 527 | extern void musb_read_fifo(struct musb_hw_ep *ep, u16 len, u8 *dst); |
diff --git a/drivers/usb/musb/musb_debugfs.c b/drivers/usb/musb/musb_debugfs.c index 1d6e8af94c06..4c216790e86b 100644 --- a/drivers/usb/musb/musb_debugfs.c +++ b/drivers/usb/musb/musb_debugfs.c | |||
@@ -233,7 +233,7 @@ static const struct file_operations musb_test_mode_fops = { | |||
233 | .release = single_release, | 233 | .release = single_release, |
234 | }; | 234 | }; |
235 | 235 | ||
236 | int __devinit musb_init_debugfs(struct musb *musb) | 236 | int musb_init_debugfs(struct musb *musb) |
237 | { | 237 | { |
238 | struct dentry *root; | 238 | struct dentry *root; |
239 | struct dentry *file; | 239 | struct dentry *file; |
diff --git a/drivers/usb/musb/musb_dma.h b/drivers/usb/musb/musb_dma.h index 24d39210d4ab..1b6b827b769f 100644 --- a/drivers/usb/musb/musb_dma.h +++ b/drivers/usb/musb/musb_dma.h | |||
@@ -178,8 +178,7 @@ struct dma_controller { | |||
178 | extern void musb_dma_completion(struct musb *musb, u8 epnum, u8 transmit); | 178 | extern void musb_dma_completion(struct musb *musb, u8 epnum, u8 transmit); |
179 | 179 | ||
180 | 180 | ||
181 | extern struct dma_controller *__devinit | 181 | extern struct dma_controller *dma_controller_create(struct musb *, void __iomem *); |
182 | dma_controller_create(struct musb *, void __iomem *); | ||
183 | 182 | ||
184 | extern void dma_controller_destroy(struct dma_controller *); | 183 | extern void dma_controller_destroy(struct dma_controller *); |
185 | 184 | ||
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c index ff5f112053d2..9a975aa0dee2 100644 --- a/drivers/usb/musb/musb_dsps.c +++ b/drivers/usb/musb/musb_dsps.c | |||
@@ -124,8 +124,44 @@ struct dsps_glue { | |||
124 | const struct dsps_musb_wrapper *wrp; /* wrapper register offsets */ | 124 | const struct dsps_musb_wrapper *wrp; /* wrapper register offsets */ |
125 | struct timer_list timer[2]; /* otg_workaround timer */ | 125 | struct timer_list timer[2]; /* otg_workaround timer */ |
126 | unsigned long last_timer[2]; /* last timer data for each instance */ | 126 | unsigned long last_timer[2]; /* last timer data for each instance */ |
127 | u32 __iomem *usb_ctrl[2]; | ||
127 | }; | 128 | }; |
128 | 129 | ||
130 | #define DSPS_AM33XX_CONTROL_MODULE_PHYS_0 0x44e10620 | ||
131 | #define DSPS_AM33XX_CONTROL_MODULE_PHYS_1 0x44e10628 | ||
132 | |||
133 | static const resource_size_t dsps_control_module_phys[] = { | ||
134 | DSPS_AM33XX_CONTROL_MODULE_PHYS_0, | ||
135 | DSPS_AM33XX_CONTROL_MODULE_PHYS_1, | ||
136 | }; | ||
137 | |||
138 | /** | ||
139 | * musb_dsps_phy_control - phy on/off | ||
140 | * @glue: struct dsps_glue * | ||
141 | * @id: musb instance | ||
142 | * @on: flag for phy to be switched on or off | ||
143 | * | ||
144 | * This is to enable the PHY using usb_ctrl register in system control | ||
145 | * module space. | ||
146 | * | ||
147 | * XXX: This function will be removed once we have a seperate driver for | ||
148 | * control module | ||
149 | */ | ||
150 | static void musb_dsps_phy_control(struct dsps_glue *glue, u8 id, u8 on) | ||
151 | { | ||
152 | u32 usbphycfg; | ||
153 | |||
154 | usbphycfg = readl(glue->usb_ctrl[id]); | ||
155 | |||
156 | if (on) { | ||
157 | usbphycfg &= ~(USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN); | ||
158 | usbphycfg |= USBPHY_OTGVDET_EN | USBPHY_OTGSESSEND_EN; | ||
159 | } else { | ||
160 | usbphycfg |= USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN; | ||
161 | } | ||
162 | |||
163 | writel(usbphycfg, glue->usb_ctrl[id]); | ||
164 | } | ||
129 | /** | 165 | /** |
130 | * dsps_musb_enable - enable interrupts | 166 | * dsps_musb_enable - enable interrupts |
131 | */ | 167 | */ |
@@ -296,7 +332,7 @@ static irqreturn_t dsps_interrupt(int irq, void *hci) | |||
296 | * Also, DRVVBUS pulses for SRP (but not at 5V) ... | 332 | * Also, DRVVBUS pulses for SRP (but not at 5V) ... |
297 | */ | 333 | */ |
298 | if (usbintr & MUSB_INTR_BABBLE) | 334 | if (usbintr & MUSB_INTR_BABBLE) |
299 | pr_info("CAUTION: musb: Babble Interrupt Occured\n"); | 335 | pr_info("CAUTION: musb: Babble Interrupt Occurred\n"); |
300 | 336 | ||
301 | if (usbintr & ((1 << wrp->drvvbus) << wrp->usb_shift)) { | 337 | if (usbintr & ((1 << wrp->drvvbus) << wrp->usb_shift)) { |
302 | int drvvbus = dsps_readl(reg_base, wrp->status); | 338 | int drvvbus = dsps_readl(reg_base, wrp->status); |
@@ -365,11 +401,9 @@ static irqreturn_t dsps_interrupt(int irq, void *hci) | |||
365 | static int dsps_musb_init(struct musb *musb) | 401 | static int dsps_musb_init(struct musb *musb) |
366 | { | 402 | { |
367 | struct device *dev = musb->controller; | 403 | struct device *dev = musb->controller; |
368 | struct musb_hdrc_platform_data *plat = dev->platform_data; | ||
369 | struct platform_device *pdev = to_platform_device(dev); | 404 | struct platform_device *pdev = to_platform_device(dev); |
370 | struct dsps_glue *glue = dev_get_drvdata(dev->parent); | 405 | struct dsps_glue *glue = dev_get_drvdata(dev->parent); |
371 | const struct dsps_musb_wrapper *wrp = glue->wrp; | 406 | const struct dsps_musb_wrapper *wrp = glue->wrp; |
372 | struct omap_musb_board_data *data = plat->board_data; | ||
373 | void __iomem *reg_base = musb->ctrl_base; | 407 | void __iomem *reg_base = musb->ctrl_base; |
374 | u32 rev, val; | 408 | u32 rev, val; |
375 | int status; | 409 | int status; |
@@ -377,7 +411,8 @@ static int dsps_musb_init(struct musb *musb) | |||
377 | /* mentor core register starts at offset of 0x400 from musb base */ | 411 | /* mentor core register starts at offset of 0x400 from musb base */ |
378 | musb->mregs += wrp->musb_core_offset; | 412 | musb->mregs += wrp->musb_core_offset; |
379 | 413 | ||
380 | /* Get the NOP PHY */ | 414 | /* NOP driver needs change if supporting dual instance */ |
415 | usb_nop_xceiv_register(); | ||
381 | musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); | 416 | musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); |
382 | if (IS_ERR_OR_NULL(musb->xceiv)) | 417 | if (IS_ERR_OR_NULL(musb->xceiv)) |
383 | return -ENODEV; | 418 | return -ENODEV; |
@@ -395,8 +430,7 @@ static int dsps_musb_init(struct musb *musb) | |||
395 | dsps_writel(reg_base, wrp->control, (1 << wrp->reset)); | 430 | dsps_writel(reg_base, wrp->control, (1 << wrp->reset)); |
396 | 431 | ||
397 | /* Start the on-chip PHY and its PLL. */ | 432 | /* Start the on-chip PHY and its PLL. */ |
398 | if (data->set_phy_power) | 433 | musb_dsps_phy_control(glue, pdev->id, 1); |
399 | data->set_phy_power(1); | ||
400 | 434 | ||
401 | musb->isr = dsps_interrupt; | 435 | musb->isr = dsps_interrupt; |
402 | 436 | ||
@@ -418,16 +452,13 @@ err0: | |||
418 | static int dsps_musb_exit(struct musb *musb) | 452 | static int dsps_musb_exit(struct musb *musb) |
419 | { | 453 | { |
420 | struct device *dev = musb->controller; | 454 | struct device *dev = musb->controller; |
421 | struct musb_hdrc_platform_data *plat = dev->platform_data; | ||
422 | struct omap_musb_board_data *data = plat->board_data; | ||
423 | struct platform_device *pdev = to_platform_device(dev); | 455 | struct platform_device *pdev = to_platform_device(dev); |
424 | struct dsps_glue *glue = dev_get_drvdata(dev->parent); | 456 | struct dsps_glue *glue = dev_get_drvdata(dev->parent); |
425 | 457 | ||
426 | del_timer_sync(&glue->timer[pdev->id]); | 458 | del_timer_sync(&glue->timer[pdev->id]); |
427 | 459 | ||
428 | /* Shutdown the on-chip PHY and its PLL. */ | 460 | /* Shutdown the on-chip PHY and its PLL. */ |
429 | if (data->set_phy_power) | 461 | musb_dsps_phy_control(glue, pdev->id, 0); |
430 | data->set_phy_power(0); | ||
431 | 462 | ||
432 | /* NOP driver needs change if supporting dual instance */ | 463 | /* NOP driver needs change if supporting dual instance */ |
433 | usb_put_phy(musb->xceiv); | 464 | usb_put_phy(musb->xceiv); |
@@ -448,7 +479,7 @@ static struct musb_platform_ops dsps_ops = { | |||
448 | 479 | ||
449 | static u64 musb_dmamask = DMA_BIT_MASK(32); | 480 | static u64 musb_dmamask = DMA_BIT_MASK(32); |
450 | 481 | ||
451 | static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id) | 482 | static int dsps_create_musb_pdev(struct dsps_glue *glue, u8 id) |
452 | { | 483 | { |
453 | struct device *dev = glue->dev; | 484 | struct device *dev = glue->dev; |
454 | struct platform_device *pdev = to_platform_device(dev); | 485 | struct platform_device *pdev = to_platform_device(dev); |
@@ -459,24 +490,33 @@ static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id) | |||
459 | struct resource *res; | 490 | struct resource *res; |
460 | struct resource resources[2]; | 491 | struct resource resources[2]; |
461 | char res_name[11]; | 492 | char res_name[11]; |
462 | int ret, musbid; | 493 | int ret; |
463 | 494 | ||
464 | /* get memory resource */ | 495 | resources[0].start = dsps_control_module_phys[id]; |
465 | snprintf(res_name, sizeof(res_name), "musb%d", id); | 496 | resources[0].end = resources[0].start + SZ_4 - 1; |
466 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, res_name); | 497 | resources[0].flags = IORESOURCE_MEM; |
498 | |||
499 | glue->usb_ctrl[id] = devm_request_and_ioremap(&pdev->dev, resources); | ||
500 | if (glue->usb_ctrl[id] == NULL) { | ||
501 | dev_err(dev, "Failed to obtain usb_ctrl%d memory\n", id); | ||
502 | ret = -ENODEV; | ||
503 | goto err0; | ||
504 | } | ||
505 | |||
506 | /* first resource is for usbss, so start index from 1 */ | ||
507 | res = platform_get_resource(pdev, IORESOURCE_MEM, id + 1); | ||
467 | if (!res) { | 508 | if (!res) { |
468 | dev_err(dev, "%s get mem resource failed\n", res_name); | 509 | dev_err(dev, "failed to get memory for instance %d\n", id); |
469 | ret = -ENODEV; | 510 | ret = -ENODEV; |
470 | goto err0; | 511 | goto err0; |
471 | } | 512 | } |
472 | res->parent = NULL; | 513 | res->parent = NULL; |
473 | resources[0] = *res; | 514 | resources[0] = *res; |
474 | 515 | ||
475 | /* get irq resource */ | 516 | /* first resource is for usbss, so start index from 1 */ |
476 | snprintf(res_name, sizeof(res_name), "musb%d-irq", id); | 517 | res = platform_get_resource(pdev, IORESOURCE_IRQ, id + 1); |
477 | res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, res_name); | ||
478 | if (!res) { | 518 | if (!res) { |
479 | dev_err(dev, "%s get irq resource failed\n", res_name); | 519 | dev_err(dev, "failed to get irq for instance %d\n", id); |
480 | ret = -ENODEV; | 520 | ret = -ENODEV; |
481 | goto err0; | 521 | goto err0; |
482 | } | 522 | } |
@@ -484,22 +524,14 @@ static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id) | |||
484 | resources[1] = *res; | 524 | resources[1] = *res; |
485 | resources[1].name = "mc"; | 525 | resources[1].name = "mc"; |
486 | 526 | ||
487 | /* get the musb id */ | ||
488 | musbid = musb_get_id(dev, GFP_KERNEL); | ||
489 | if (musbid < 0) { | ||
490 | dev_err(dev, "failed to allocate musb id\n"); | ||
491 | ret = -ENOMEM; | ||
492 | goto err0; | ||
493 | } | ||
494 | /* allocate the child platform device */ | 527 | /* allocate the child platform device */ |
495 | musb = platform_device_alloc("musb-hdrc", musbid); | 528 | musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO); |
496 | if (!musb) { | 529 | if (!musb) { |
497 | dev_err(dev, "failed to allocate musb device\n"); | 530 | dev_err(dev, "failed to allocate musb device\n"); |
498 | ret = -ENOMEM; | 531 | ret = -ENOMEM; |
499 | goto err1; | 532 | goto err0; |
500 | } | 533 | } |
501 | 534 | ||
502 | musb->id = musbid; | ||
503 | musb->dev.parent = dev; | 535 | musb->dev.parent = dev; |
504 | musb->dev.dma_mask = &musb_dmamask; | 536 | musb->dev.dma_mask = &musb_dmamask; |
505 | musb->dev.coherent_dma_mask = musb_dmamask; | 537 | musb->dev.coherent_dma_mask = musb_dmamask; |
@@ -556,20 +588,11 @@ static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id) | |||
556 | 588 | ||
557 | err2: | 589 | err2: |
558 | platform_device_put(musb); | 590 | platform_device_put(musb); |
559 | err1: | ||
560 | musb_put_id(dev, musbid); | ||
561 | err0: | 591 | err0: |
562 | return ret; | 592 | return ret; |
563 | } | 593 | } |
564 | 594 | ||
565 | static void dsps_delete_musb_pdev(struct dsps_glue *glue, u8 id) | 595 | static int dsps_probe(struct platform_device *pdev) |
566 | { | ||
567 | musb_put_id(glue->dev, glue->musb[id]->id); | ||
568 | platform_device_del(glue->musb[id]); | ||
569 | platform_device_put(glue->musb[id]); | ||
570 | } | ||
571 | |||
572 | static int __devinit dsps_probe(struct platform_device *pdev) | ||
573 | { | 596 | { |
574 | struct device_node *np = pdev->dev.of_node; | 597 | struct device_node *np = pdev->dev.of_node; |
575 | const struct of_device_id *match; | 598 | const struct of_device_id *match; |
@@ -628,7 +651,7 @@ static int __devinit dsps_probe(struct platform_device *pdev) | |||
628 | dev_err(&pdev->dev, "failed to create child pdev\n"); | 651 | dev_err(&pdev->dev, "failed to create child pdev\n"); |
629 | /* release resources of previously created instances */ | 652 | /* release resources of previously created instances */ |
630 | for (i--; i >= 0 ; i--) | 653 | for (i--; i >= 0 ; i--) |
631 | dsps_delete_musb_pdev(glue, i); | 654 | platform_device_unregister(glue->musb[i]); |
632 | goto err3; | 655 | goto err3; |
633 | } | 656 | } |
634 | } | 657 | } |
@@ -645,7 +668,7 @@ err1: | |||
645 | err0: | 668 | err0: |
646 | return ret; | 669 | return ret; |
647 | } | 670 | } |
648 | static int __devexit dsps_remove(struct platform_device *pdev) | 671 | static int dsps_remove(struct platform_device *pdev) |
649 | { | 672 | { |
650 | struct dsps_glue *glue = platform_get_drvdata(pdev); | 673 | struct dsps_glue *glue = platform_get_drvdata(pdev); |
651 | const struct dsps_musb_wrapper *wrp = glue->wrp; | 674 | const struct dsps_musb_wrapper *wrp = glue->wrp; |
@@ -653,7 +676,7 @@ static int __devexit dsps_remove(struct platform_device *pdev) | |||
653 | 676 | ||
654 | /* delete the child platform device */ | 677 | /* delete the child platform device */ |
655 | for (i = 0; i < wrp->instances ; i++) | 678 | for (i = 0; i < wrp->instances ; i++) |
656 | dsps_delete_musb_pdev(glue, i); | 679 | platform_device_unregister(glue->musb[i]); |
657 | 680 | ||
658 | /* disable usbss clocks */ | 681 | /* disable usbss clocks */ |
659 | pm_runtime_put(&pdev->dev); | 682 | pm_runtime_put(&pdev->dev); |
@@ -666,24 +689,26 @@ static int __devexit dsps_remove(struct platform_device *pdev) | |||
666 | #ifdef CONFIG_PM_SLEEP | 689 | #ifdef CONFIG_PM_SLEEP |
667 | static int dsps_suspend(struct device *dev) | 690 | static int dsps_suspend(struct device *dev) |
668 | { | 691 | { |
669 | struct musb_hdrc_platform_data *plat = dev->platform_data; | 692 | struct platform_device *pdev = to_platform_device(dev->parent); |
670 | struct omap_musb_board_data *data = plat->board_data; | 693 | struct dsps_glue *glue = platform_get_drvdata(pdev); |
694 | const struct dsps_musb_wrapper *wrp = glue->wrp; | ||
695 | int i; | ||
671 | 696 | ||
672 | /* Shutdown the on-chip PHY and its PLL. */ | 697 | for (i = 0; i < wrp->instances; i++) |
673 | if (data->set_phy_power) | 698 | musb_dsps_phy_control(glue, i, 0); |
674 | data->set_phy_power(0); | ||
675 | 699 | ||
676 | return 0; | 700 | return 0; |
677 | } | 701 | } |
678 | 702 | ||
679 | static int dsps_resume(struct device *dev) | 703 | static int dsps_resume(struct device *dev) |
680 | { | 704 | { |
681 | struct musb_hdrc_platform_data *plat = dev->platform_data; | 705 | struct platform_device *pdev = to_platform_device(dev->parent); |
682 | struct omap_musb_board_data *data = plat->board_data; | 706 | struct dsps_glue *glue = platform_get_drvdata(pdev); |
707 | const struct dsps_musb_wrapper *wrp = glue->wrp; | ||
708 | int i; | ||
683 | 709 | ||
684 | /* Start the on-chip PHY and its PLL. */ | 710 | for (i = 0; i < wrp->instances; i++) |
685 | if (data->set_phy_power) | 711 | musb_dsps_phy_control(glue, i, 1); |
686 | data->set_phy_power(1); | ||
687 | 712 | ||
688 | return 0; | 713 | return 0; |
689 | } | 714 | } |
@@ -691,7 +716,7 @@ static int dsps_resume(struct device *dev) | |||
691 | 716 | ||
692 | static SIMPLE_DEV_PM_OPS(dsps_pm_ops, dsps_suspend, dsps_resume); | 717 | static SIMPLE_DEV_PM_OPS(dsps_pm_ops, dsps_suspend, dsps_resume); |
693 | 718 | ||
694 | static const struct dsps_musb_wrapper ti81xx_driver_data __devinitconst = { | 719 | static const struct dsps_musb_wrapper ti81xx_driver_data = { |
695 | .revision = 0x00, | 720 | .revision = 0x00, |
696 | .control = 0x14, | 721 | .control = 0x14, |
697 | .status = 0x18, | 722 | .status = 0x18, |
@@ -719,10 +744,10 @@ static const struct dsps_musb_wrapper ti81xx_driver_data __devinitconst = { | |||
719 | .rxep_bitmap = (0xfffe << 16), | 744 | .rxep_bitmap = (0xfffe << 16), |
720 | .musb_core_offset = 0x400, | 745 | .musb_core_offset = 0x400, |
721 | .poll_seconds = 2, | 746 | .poll_seconds = 2, |
722 | .instances = 2, | 747 | .instances = 1, |
723 | }; | 748 | }; |
724 | 749 | ||
725 | static const struct platform_device_id musb_dsps_id_table[] __devinitconst = { | 750 | static const struct platform_device_id musb_dsps_id_table[] = { |
726 | { | 751 | { |
727 | .name = "musb-ti81xx", | 752 | .name = "musb-ti81xx", |
728 | .driver_data = (kernel_ulong_t) &ti81xx_driver_data, | 753 | .driver_data = (kernel_ulong_t) &ti81xx_driver_data, |
@@ -732,7 +757,7 @@ static const struct platform_device_id musb_dsps_id_table[] __devinitconst = { | |||
732 | MODULE_DEVICE_TABLE(platform, musb_dsps_id_table); | 757 | MODULE_DEVICE_TABLE(platform, musb_dsps_id_table); |
733 | 758 | ||
734 | #ifdef CONFIG_OF | 759 | #ifdef CONFIG_OF |
735 | static const struct of_device_id musb_dsps_of_match[] __devinitconst = { | 760 | static const struct of_device_id musb_dsps_of_match[] = { |
736 | { .compatible = "ti,musb-am33xx", | 761 | { .compatible = "ti,musb-am33xx", |
737 | .data = (void *) &ti81xx_driver_data, }, | 762 | .data = (void *) &ti81xx_driver_data, }, |
738 | { }, | 763 | { }, |
@@ -742,7 +767,7 @@ MODULE_DEVICE_TABLE(of, musb_dsps_of_match); | |||
742 | 767 | ||
743 | static struct platform_driver dsps_usbss_driver = { | 768 | static struct platform_driver dsps_usbss_driver = { |
744 | .probe = dsps_probe, | 769 | .probe = dsps_probe, |
745 | .remove = __devexit_p(dsps_remove), | 770 | .remove = dsps_remove, |
746 | .driver = { | 771 | .driver = { |
747 | .name = "musb-dsps", | 772 | .name = "musb-dsps", |
748 | .pm = &dsps_pm_ops, | 773 | .pm = &dsps_pm_ops, |
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index b6b84dacc791..876787438c2f 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
@@ -1090,7 +1090,6 @@ static int musb_gadget_enable(struct usb_ep *ep, | |||
1090 | */ | 1090 | */ |
1091 | musb_ep_select(mbase, epnum); | 1091 | musb_ep_select(mbase, epnum); |
1092 | if (usb_endpoint_dir_in(desc)) { | 1092 | if (usb_endpoint_dir_in(desc)) { |
1093 | u16 int_txe = musb_readw(mbase, MUSB_INTRTXE); | ||
1094 | 1093 | ||
1095 | if (hw_ep->is_shared_fifo) | 1094 | if (hw_ep->is_shared_fifo) |
1096 | musb_ep->is_in = 1; | 1095 | musb_ep->is_in = 1; |
@@ -1102,8 +1101,8 @@ static int musb_gadget_enable(struct usb_ep *ep, | |||
1102 | goto fail; | 1101 | goto fail; |
1103 | } | 1102 | } |
1104 | 1103 | ||
1105 | int_txe |= (1 << epnum); | 1104 | musb->intrtxe |= (1 << epnum); |
1106 | musb_writew(mbase, MUSB_INTRTXE, int_txe); | 1105 | musb_writew(mbase, MUSB_INTRTXE, musb->intrtxe); |
1107 | 1106 | ||
1108 | /* REVISIT if can_bulk_split(), use by updating "tmp"; | 1107 | /* REVISIT if can_bulk_split(), use by updating "tmp"; |
1109 | * likewise high bandwidth periodic tx | 1108 | * likewise high bandwidth periodic tx |
@@ -1130,7 +1129,6 @@ static int musb_gadget_enable(struct usb_ep *ep, | |||
1130 | musb_writew(regs, MUSB_TXCSR, csr); | 1129 | musb_writew(regs, MUSB_TXCSR, csr); |
1131 | 1130 | ||
1132 | } else { | 1131 | } else { |
1133 | u16 int_rxe = musb_readw(mbase, MUSB_INTRRXE); | ||
1134 | 1132 | ||
1135 | if (hw_ep->is_shared_fifo) | 1133 | if (hw_ep->is_shared_fifo) |
1136 | musb_ep->is_in = 0; | 1134 | musb_ep->is_in = 0; |
@@ -1142,8 +1140,8 @@ static int musb_gadget_enable(struct usb_ep *ep, | |||
1142 | goto fail; | 1140 | goto fail; |
1143 | } | 1141 | } |
1144 | 1142 | ||
1145 | int_rxe |= (1 << epnum); | 1143 | musb->intrrxe |= (1 << epnum); |
1146 | musb_writew(mbase, MUSB_INTRRXE, int_rxe); | 1144 | musb_writew(mbase, MUSB_INTRRXE, musb->intrrxe); |
1147 | 1145 | ||
1148 | /* REVISIT if can_bulk_combine() use by updating "tmp" | 1146 | /* REVISIT if can_bulk_combine() use by updating "tmp" |
1149 | * likewise high bandwidth periodic rx | 1147 | * likewise high bandwidth periodic rx |
@@ -1231,14 +1229,12 @@ static int musb_gadget_disable(struct usb_ep *ep) | |||
1231 | 1229 | ||
1232 | /* zero the endpoint sizes */ | 1230 | /* zero the endpoint sizes */ |
1233 | if (musb_ep->is_in) { | 1231 | if (musb_ep->is_in) { |
1234 | u16 int_txe = musb_readw(musb->mregs, MUSB_INTRTXE); | 1232 | musb->intrtxe &= ~(1 << epnum); |
1235 | int_txe &= ~(1 << epnum); | 1233 | musb_writew(musb->mregs, MUSB_INTRTXE, musb->intrtxe); |
1236 | musb_writew(musb->mregs, MUSB_INTRTXE, int_txe); | ||
1237 | musb_writew(epio, MUSB_TXMAXP, 0); | 1234 | musb_writew(epio, MUSB_TXMAXP, 0); |
1238 | } else { | 1235 | } else { |
1239 | u16 int_rxe = musb_readw(musb->mregs, MUSB_INTRRXE); | 1236 | musb->intrrxe &= ~(1 << epnum); |
1240 | int_rxe &= ~(1 << epnum); | 1237 | musb_writew(musb->mregs, MUSB_INTRRXE, musb->intrrxe); |
1241 | musb_writew(musb->mregs, MUSB_INTRRXE, int_rxe); | ||
1242 | musb_writew(epio, MUSB_RXMAXP, 0); | 1238 | musb_writew(epio, MUSB_RXMAXP, 0); |
1243 | } | 1239 | } |
1244 | 1240 | ||
@@ -1554,7 +1550,7 @@ static void musb_gadget_fifo_flush(struct usb_ep *ep) | |||
1554 | void __iomem *epio = musb->endpoints[epnum].regs; | 1550 | void __iomem *epio = musb->endpoints[epnum].regs; |
1555 | void __iomem *mbase; | 1551 | void __iomem *mbase; |
1556 | unsigned long flags; | 1552 | unsigned long flags; |
1557 | u16 csr, int_txe; | 1553 | u16 csr; |
1558 | 1554 | ||
1559 | mbase = musb->mregs; | 1555 | mbase = musb->mregs; |
1560 | 1556 | ||
@@ -1562,8 +1558,7 @@ static void musb_gadget_fifo_flush(struct usb_ep *ep) | |||
1562 | musb_ep_select(mbase, (u8) epnum); | 1558 | musb_ep_select(mbase, (u8) epnum); |
1563 | 1559 | ||
1564 | /* disable interrupts */ | 1560 | /* disable interrupts */ |
1565 | int_txe = musb_readw(mbase, MUSB_INTRTXE); | 1561 | musb_writew(mbase, MUSB_INTRTXE, musb->intrtxe & ~(1 << epnum)); |
1566 | musb_writew(mbase, MUSB_INTRTXE, int_txe & ~(1 << epnum)); | ||
1567 | 1562 | ||
1568 | if (musb_ep->is_in) { | 1563 | if (musb_ep->is_in) { |
1569 | csr = musb_readw(epio, MUSB_TXCSR); | 1564 | csr = musb_readw(epio, MUSB_TXCSR); |
@@ -1587,7 +1582,7 @@ static void musb_gadget_fifo_flush(struct usb_ep *ep) | |||
1587 | } | 1582 | } |
1588 | 1583 | ||
1589 | /* re-enable interrupt */ | 1584 | /* re-enable interrupt */ |
1590 | musb_writew(mbase, MUSB_INTRTXE, int_txe); | 1585 | musb_writew(mbase, MUSB_INTRTXE, musb->intrtxe); |
1591 | spin_unlock_irqrestore(&musb->lock, flags); | 1586 | spin_unlock_irqrestore(&musb->lock, flags); |
1592 | } | 1587 | } |
1593 | 1588 | ||
@@ -1792,7 +1787,7 @@ static void musb_gadget_release(struct device *dev) | |||
1792 | } | 1787 | } |
1793 | 1788 | ||
1794 | 1789 | ||
1795 | static void __devinit | 1790 | static void |
1796 | init_peripheral_ep(struct musb *musb, struct musb_ep *ep, u8 epnum, int is_in) | 1791 | init_peripheral_ep(struct musb *musb, struct musb_ep *ep, u8 epnum, int is_in) |
1797 | { | 1792 | { |
1798 | struct musb_hw_ep *hw_ep = musb->endpoints + epnum; | 1793 | struct musb_hw_ep *hw_ep = musb->endpoints + epnum; |
@@ -1829,7 +1824,7 @@ init_peripheral_ep(struct musb *musb, struct musb_ep *ep, u8 epnum, int is_in) | |||
1829 | * Initialize the endpoints exposed to peripheral drivers, with backlinks | 1824 | * Initialize the endpoints exposed to peripheral drivers, with backlinks |
1830 | * to the rest of the driver state. | 1825 | * to the rest of the driver state. |
1831 | */ | 1826 | */ |
1832 | static inline void __devinit musb_g_init_endpoints(struct musb *musb) | 1827 | static inline void musb_g_init_endpoints(struct musb *musb) |
1833 | { | 1828 | { |
1834 | u8 epnum; | 1829 | u8 epnum; |
1835 | struct musb_hw_ep *hw_ep; | 1830 | struct musb_hw_ep *hw_ep; |
@@ -1862,7 +1857,7 @@ static inline void __devinit musb_g_init_endpoints(struct musb *musb) | |||
1862 | /* called once during driver setup to initialize and link into | 1857 | /* called once during driver setup to initialize and link into |
1863 | * the driver model; memory is zeroed. | 1858 | * the driver model; memory is zeroed. |
1864 | */ | 1859 | */ |
1865 | int __devinit musb_gadget_setup(struct musb *musb) | 1860 | int musb_gadget_setup(struct musb *musb) |
1866 | { | 1861 | { |
1867 | int status; | 1862 | int status; |
1868 | 1863 | ||
@@ -2176,10 +2171,9 @@ __acquires(musb->lock) | |||
2176 | u8 devctl = musb_readb(mbase, MUSB_DEVCTL); | 2171 | u8 devctl = musb_readb(mbase, MUSB_DEVCTL); |
2177 | u8 power; | 2172 | u8 power; |
2178 | 2173 | ||
2179 | dev_dbg(musb->controller, "<== %s addr=%x driver '%s'\n", | 2174 | dev_dbg(musb->controller, "<== %s driver '%s'\n", |
2180 | (devctl & MUSB_DEVCTL_BDEVICE) | 2175 | (devctl & MUSB_DEVCTL_BDEVICE) |
2181 | ? "B-Device" : "A-Device", | 2176 | ? "B-Device" : "A-Device", |
2182 | musb_readb(mbase, MUSB_FADDR), | ||
2183 | musb->gadget_driver | 2177 | musb->gadget_driver |
2184 | ? musb->gadget_driver->driver.name | 2178 | ? musb->gadget_driver->driver.name |
2185 | : NULL | 2179 | : NULL |
diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c index e40d7647caf1..c9c1ac4e075f 100644 --- a/drivers/usb/musb/musb_gadget_ep0.c +++ b/drivers/usb/musb/musb_gadget_ep0.c | |||
@@ -673,10 +673,8 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb) | |||
673 | csr = musb_readw(regs, MUSB_CSR0); | 673 | csr = musb_readw(regs, MUSB_CSR0); |
674 | len = musb_readb(regs, MUSB_COUNT0); | 674 | len = musb_readb(regs, MUSB_COUNT0); |
675 | 675 | ||
676 | dev_dbg(musb->controller, "csr %04x, count %d, myaddr %d, ep0stage %s\n", | 676 | dev_dbg(musb->controller, "csr %04x, count %d, ep0stage %s\n", |
677 | csr, len, | 677 | csr, len, decode_ep0stage(musb->ep0_state)); |
678 | musb_readb(mbase, MUSB_FADDR), | ||
679 | decode_ep0stage(musb->ep0_state)); | ||
680 | 678 | ||
681 | if (csr & MUSB_CSR0_P_DATAEND) { | 679 | if (csr & MUSB_CSR0_P_DATAEND) { |
682 | /* | 680 | /* |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 3df6a76b851d..e9f0fd9ddd2d 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
@@ -740,7 +740,7 @@ static void musb_ep_program(struct musb *musb, u8 epnum, | |||
740 | csr = musb_readw(epio, MUSB_TXCSR); | 740 | csr = musb_readw(epio, MUSB_TXCSR); |
741 | 741 | ||
742 | /* disable interrupt in case we flush */ | 742 | /* disable interrupt in case we flush */ |
743 | int_txe = musb_readw(mbase, MUSB_INTRTXE); | 743 | int_txe = musb->intrtxe; |
744 | musb_writew(mbase, MUSB_INTRTXE, int_txe & ~(1 << epnum)); | 744 | musb_writew(mbase, MUSB_INTRTXE, int_txe & ~(1 << epnum)); |
745 | 745 | ||
746 | /* general endpoint setup */ | 746 | /* general endpoint setup */ |
diff --git a/drivers/usb/musb/musbhsdma.c b/drivers/usb/musb/musbhsdma.c index 0fc6ca6bc60a..3d1fd52a15a9 100644 --- a/drivers/usb/musb/musbhsdma.c +++ b/drivers/usb/musb/musbhsdma.c | |||
@@ -380,8 +380,7 @@ void dma_controller_destroy(struct dma_controller *c) | |||
380 | kfree(controller); | 380 | kfree(controller); |
381 | } | 381 | } |
382 | 382 | ||
383 | struct dma_controller *__devinit | 383 | struct dma_controller *dma_controller_create(struct musb *musb, void __iomem *base) |
384 | dma_controller_create(struct musb *musb, void __iomem *base) | ||
385 | { | 384 | { |
386 | struct musb_dma_controller *controller; | 385 | struct musb_dma_controller *controller; |
387 | struct device *dev = musb->controller; | 386 | struct device *dev = musb->controller; |
diff --git a/drivers/usb/musb/musbhsdma.h b/drivers/usb/musb/musbhsdma.h index 320fd4afb93f..f7b13fd25257 100644 --- a/drivers/usb/musb/musbhsdma.h +++ b/drivers/usb/musb/musbhsdma.h | |||
@@ -31,10 +31,6 @@ | |||
31 | * | 31 | * |
32 | */ | 32 | */ |
33 | 33 | ||
34 | #if defined(CONFIG_SOC_OMAP2430) || defined(CONFIG_SOC_OMAP3430) | ||
35 | #include "omap2430.h" | ||
36 | #endif | ||
37 | |||
38 | #ifndef CONFIG_BLACKFIN | 34 | #ifndef CONFIG_BLACKFIN |
39 | 35 | ||
40 | #define MUSB_HSDMA_BASE 0x200 | 36 | #define MUSB_HSDMA_BASE 0x200 |
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index a538fe17a966..da00af460794 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c | |||
@@ -333,6 +333,26 @@ static void omap_musb_mailbox_work(struct work_struct *mailbox_work) | |||
333 | omap_musb_set_mailbox(glue); | 333 | omap_musb_set_mailbox(glue); |
334 | } | 334 | } |
335 | 335 | ||
336 | static irqreturn_t omap2430_musb_interrupt(int irq, void *__hci) | ||
337 | { | ||
338 | unsigned long flags; | ||
339 | irqreturn_t retval = IRQ_NONE; | ||
340 | struct musb *musb = __hci; | ||
341 | |||
342 | spin_lock_irqsave(&musb->lock, flags); | ||
343 | |||
344 | musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB); | ||
345 | musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX); | ||
346 | musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX); | ||
347 | |||
348 | if (musb->int_usb || musb->int_tx || musb->int_rx) | ||
349 | retval = musb_interrupt(musb); | ||
350 | |||
351 | spin_unlock_irqrestore(&musb->lock, flags); | ||
352 | |||
353 | return retval; | ||
354 | } | ||
355 | |||
336 | static int omap2430_musb_init(struct musb *musb) | 356 | static int omap2430_musb_init(struct musb *musb) |
337 | { | 357 | { |
338 | u32 l; | 358 | u32 l; |
@@ -352,6 +372,8 @@ static int omap2430_musb_init(struct musb *musb) | |||
352 | return -ENODEV; | 372 | return -ENODEV; |
353 | } | 373 | } |
354 | 374 | ||
375 | musb->isr = omap2430_musb_interrupt; | ||
376 | |||
355 | status = pm_runtime_get_sync(dev); | 377 | status = pm_runtime_get_sync(dev); |
356 | if (status < 0) { | 378 | if (status < 0) { |
357 | dev_err(dev, "pm_runtime_get_sync FAILED %d\n", status); | 379 | dev_err(dev, "pm_runtime_get_sync FAILED %d\n", status); |
@@ -468,7 +490,7 @@ static const struct musb_platform_ops omap2430_ops = { | |||
468 | 490 | ||
469 | static u64 omap2430_dmamask = DMA_BIT_MASK(32); | 491 | static u64 omap2430_dmamask = DMA_BIT_MASK(32); |
470 | 492 | ||
471 | static int __devinit omap2430_probe(struct platform_device *pdev) | 493 | static int omap2430_probe(struct platform_device *pdev) |
472 | { | 494 | { |
473 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; | 495 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; |
474 | struct omap_musb_board_data *data; | 496 | struct omap_musb_board_data *data; |
@@ -478,7 +500,6 @@ static int __devinit omap2430_probe(struct platform_device *pdev) | |||
478 | struct musb_hdrc_config *config; | 500 | struct musb_hdrc_config *config; |
479 | struct resource *res; | 501 | struct resource *res; |
480 | int ret = -ENOMEM; | 502 | int ret = -ENOMEM; |
481 | int musbid; | ||
482 | 503 | ||
483 | glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL); | 504 | glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL); |
484 | if (!glue) { | 505 | if (!glue) { |
@@ -486,21 +507,12 @@ static int __devinit omap2430_probe(struct platform_device *pdev) | |||
486 | goto err0; | 507 | goto err0; |
487 | } | 508 | } |
488 | 509 | ||
489 | /* get the musb id */ | 510 | musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO); |
490 | musbid = musb_get_id(&pdev->dev, GFP_KERNEL); | ||
491 | if (musbid < 0) { | ||
492 | dev_err(&pdev->dev, "failed to allocate musb id\n"); | ||
493 | ret = -ENOMEM; | ||
494 | goto err0; | ||
495 | } | ||
496 | |||
497 | musb = platform_device_alloc("musb-hdrc", musbid); | ||
498 | if (!musb) { | 511 | if (!musb) { |
499 | dev_err(&pdev->dev, "failed to allocate musb device\n"); | 512 | dev_err(&pdev->dev, "failed to allocate musb device\n"); |
500 | goto err1; | 513 | goto err0; |
501 | } | 514 | } |
502 | 515 | ||
503 | musb->id = musbid; | ||
504 | musb->dev.parent = &pdev->dev; | 516 | musb->dev.parent = &pdev->dev; |
505 | musb->dev.dma_mask = &omap2430_dmamask; | 517 | musb->dev.dma_mask = &omap2430_dmamask; |
506 | musb->dev.coherent_dma_mask = omap2430_dmamask; | 518 | musb->dev.coherent_dma_mask = omap2430_dmamask; |
@@ -521,7 +533,7 @@ static int __devinit omap2430_probe(struct platform_device *pdev) | |||
521 | dev_err(&pdev->dev, | 533 | dev_err(&pdev->dev, |
522 | "failed to allocate musb platfrom data\n"); | 534 | "failed to allocate musb platfrom data\n"); |
523 | ret = -ENOMEM; | 535 | ret = -ENOMEM; |
524 | goto err1; | 536 | goto err2; |
525 | } | 537 | } |
526 | 538 | ||
527 | data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); | 539 | data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); |
@@ -529,14 +541,14 @@ static int __devinit omap2430_probe(struct platform_device *pdev) | |||
529 | dev_err(&pdev->dev, | 541 | dev_err(&pdev->dev, |
530 | "failed to allocate musb board data\n"); | 542 | "failed to allocate musb board data\n"); |
531 | ret = -ENOMEM; | 543 | ret = -ENOMEM; |
532 | goto err1; | 544 | goto err2; |
533 | } | 545 | } |
534 | 546 | ||
535 | config = devm_kzalloc(&pdev->dev, sizeof(*config), GFP_KERNEL); | 547 | config = devm_kzalloc(&pdev->dev, sizeof(*config), GFP_KERNEL); |
536 | if (!data) { | 548 | if (!data) { |
537 | dev_err(&pdev->dev, | 549 | dev_err(&pdev->dev, |
538 | "failed to allocate musb hdrc config\n"); | 550 | "failed to allocate musb hdrc config\n"); |
539 | goto err1; | 551 | goto err2; |
540 | } | 552 | } |
541 | 553 | ||
542 | of_property_read_u32(np, "mode", (u32 *)&pdata->mode); | 554 | of_property_read_u32(np, "mode", (u32 *)&pdata->mode); |
@@ -589,19 +601,15 @@ static int __devinit omap2430_probe(struct platform_device *pdev) | |||
589 | err2: | 601 | err2: |
590 | platform_device_put(musb); | 602 | platform_device_put(musb); |
591 | 603 | ||
592 | err1: | ||
593 | musb_put_id(&pdev->dev, musbid); | ||
594 | |||
595 | err0: | 604 | err0: |
596 | return ret; | 605 | return ret; |
597 | } | 606 | } |
598 | 607 | ||
599 | static int __devexit omap2430_remove(struct platform_device *pdev) | 608 | static int omap2430_remove(struct platform_device *pdev) |
600 | { | 609 | { |
601 | struct omap2430_glue *glue = platform_get_drvdata(pdev); | 610 | struct omap2430_glue *glue = platform_get_drvdata(pdev); |
602 | 611 | ||
603 | cancel_work_sync(&glue->omap_musb_mailbox_work); | 612 | cancel_work_sync(&glue->omap_musb_mailbox_work); |
604 | musb_put_id(&pdev->dev, glue->musb->id); | ||
605 | platform_device_unregister(glue->musb); | 613 | platform_device_unregister(glue->musb); |
606 | 614 | ||
607 | return 0; | 615 | return 0; |
@@ -666,7 +674,7 @@ MODULE_DEVICE_TABLE(of, omap2430_id_table); | |||
666 | 674 | ||
667 | static struct platform_driver omap2430_driver = { | 675 | static struct platform_driver omap2430_driver = { |
668 | .probe = omap2430_probe, | 676 | .probe = omap2430_probe, |
669 | .remove = __devexit_p(omap2430_remove), | 677 | .remove = omap2430_remove, |
670 | .driver = { | 678 | .driver = { |
671 | .name = "musb-omap2430", | 679 | .name = "musb-omap2430", |
672 | .pm = DEV_PM_OPS, | 680 | .pm = DEV_PM_OPS, |
diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c index dc4d75ea13ad..8bde6fc5eb75 100644 --- a/drivers/usb/musb/tusb6010.c +++ b/drivers/usb/musb/tusb6010.c | |||
@@ -1153,14 +1153,13 @@ static const struct musb_platform_ops tusb_ops = { | |||
1153 | 1153 | ||
1154 | static u64 tusb_dmamask = DMA_BIT_MASK(32); | 1154 | static u64 tusb_dmamask = DMA_BIT_MASK(32); |
1155 | 1155 | ||
1156 | static int __devinit tusb_probe(struct platform_device *pdev) | 1156 | static int tusb_probe(struct platform_device *pdev) |
1157 | { | 1157 | { |
1158 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; | 1158 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; |
1159 | struct platform_device *musb; | 1159 | struct platform_device *musb; |
1160 | struct tusb6010_glue *glue; | 1160 | struct tusb6010_glue *glue; |
1161 | 1161 | ||
1162 | int ret = -ENOMEM; | 1162 | int ret = -ENOMEM; |
1163 | int musbid; | ||
1164 | 1163 | ||
1165 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); | 1164 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); |
1166 | if (!glue) { | 1165 | if (!glue) { |
@@ -1168,21 +1167,12 @@ static int __devinit tusb_probe(struct platform_device *pdev) | |||
1168 | goto err0; | 1167 | goto err0; |
1169 | } | 1168 | } |
1170 | 1169 | ||
1171 | /* get the musb id */ | 1170 | musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO); |
1172 | musbid = musb_get_id(&pdev->dev, GFP_KERNEL); | ||
1173 | if (musbid < 0) { | ||
1174 | dev_err(&pdev->dev, "failed to allocate musb id\n"); | ||
1175 | ret = -ENOMEM; | ||
1176 | goto err1; | ||
1177 | } | ||
1178 | |||
1179 | musb = platform_device_alloc("musb-hdrc", musbid); | ||
1180 | if (!musb) { | 1171 | if (!musb) { |
1181 | dev_err(&pdev->dev, "failed to allocate musb device\n"); | 1172 | dev_err(&pdev->dev, "failed to allocate musb device\n"); |
1182 | goto err2; | 1173 | goto err1; |
1183 | } | 1174 | } |
1184 | 1175 | ||
1185 | musb->id = musbid; | ||
1186 | musb->dev.parent = &pdev->dev; | 1176 | musb->dev.parent = &pdev->dev; |
1187 | musb->dev.dma_mask = &tusb_dmamask; | 1177 | musb->dev.dma_mask = &tusb_dmamask; |
1188 | musb->dev.coherent_dma_mask = tusb_dmamask; | 1178 | musb->dev.coherent_dma_mask = tusb_dmamask; |
@@ -1218,9 +1208,6 @@ static int __devinit tusb_probe(struct platform_device *pdev) | |||
1218 | err3: | 1208 | err3: |
1219 | platform_device_put(musb); | 1209 | platform_device_put(musb); |
1220 | 1210 | ||
1221 | err2: | ||
1222 | musb_put_id(&pdev->dev, musbid); | ||
1223 | |||
1224 | err1: | 1211 | err1: |
1225 | kfree(glue); | 1212 | kfree(glue); |
1226 | 1213 | ||
@@ -1228,13 +1215,11 @@ err0: | |||
1228 | return ret; | 1215 | return ret; |
1229 | } | 1216 | } |
1230 | 1217 | ||
1231 | static int __devexit tusb_remove(struct platform_device *pdev) | 1218 | static int tusb_remove(struct platform_device *pdev) |
1232 | { | 1219 | { |
1233 | struct tusb6010_glue *glue = platform_get_drvdata(pdev); | 1220 | struct tusb6010_glue *glue = platform_get_drvdata(pdev); |
1234 | 1221 | ||
1235 | musb_put_id(&pdev->dev, glue->musb->id); | 1222 | platform_device_unregister(glue->musb); |
1236 | platform_device_del(glue->musb); | ||
1237 | platform_device_put(glue->musb); | ||
1238 | kfree(glue); | 1223 | kfree(glue); |
1239 | 1224 | ||
1240 | return 0; | 1225 | return 0; |
@@ -1242,7 +1227,7 @@ static int __devexit tusb_remove(struct platform_device *pdev) | |||
1242 | 1227 | ||
1243 | static struct platform_driver tusb_driver = { | 1228 | static struct platform_driver tusb_driver = { |
1244 | .probe = tusb_probe, | 1229 | .probe = tusb_probe, |
1245 | .remove = __devexit_p(tusb_remove), | 1230 | .remove = tusb_remove, |
1246 | .driver = { | 1231 | .driver = { |
1247 | .name = "musb-tusb", | 1232 | .name = "musb-tusb", |
1248 | }, | 1233 | }, |
@@ -1251,15 +1236,4 @@ static struct platform_driver tusb_driver = { | |||
1251 | MODULE_DESCRIPTION("TUSB6010 MUSB Glue Layer"); | 1236 | MODULE_DESCRIPTION("TUSB6010 MUSB Glue Layer"); |
1252 | MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>"); | 1237 | MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>"); |
1253 | MODULE_LICENSE("GPL v2"); | 1238 | MODULE_LICENSE("GPL v2"); |
1254 | 1239 | module_platform_driver(tusb_driver); | |
1255 | static int __init tusb_init(void) | ||
1256 | { | ||
1257 | return platform_driver_register(&tusb_driver); | ||
1258 | } | ||
1259 | module_init(tusb_init); | ||
1260 | |||
1261 | static void __exit tusb_exit(void) | ||
1262 | { | ||
1263 | platform_driver_unregister(&tusb_driver); | ||
1264 | } | ||
1265 | module_exit(tusb_exit); | ||
diff --git a/drivers/usb/musb/tusb6010_omap.c b/drivers/usb/musb/tusb6010_omap.c index 7a62b95dac24..2c46d42e6618 100644 --- a/drivers/usb/musb/tusb6010_omap.c +++ b/drivers/usb/musb/tusb6010_omap.c | |||
@@ -661,8 +661,7 @@ void dma_controller_destroy(struct dma_controller *c) | |||
661 | kfree(tusb_dma); | 661 | kfree(tusb_dma); |
662 | } | 662 | } |
663 | 663 | ||
664 | struct dma_controller *__devinit | 664 | struct dma_controller *dma_controller_create(struct musb *musb, void __iomem *base) |
665 | dma_controller_create(struct musb *musb, void __iomem *base) | ||
666 | { | 665 | { |
667 | void __iomem *tbase = musb->ctrl_base; | 666 | void __iomem *tbase = musb->ctrl_base; |
668 | struct tusb_omap_dma *tusb_dma; | 667 | struct tusb_omap_dma *tusb_dma; |
diff --git a/drivers/usb/musb/ux500.c b/drivers/usb/musb/ux500.c index 0e62f504410e..a27ca1a9c994 100644 --- a/drivers/usb/musb/ux500.c +++ b/drivers/usb/musb/ux500.c | |||
@@ -36,6 +36,26 @@ struct ux500_glue { | |||
36 | }; | 36 | }; |
37 | #define glue_to_musb(g) platform_get_drvdata(g->musb) | 37 | #define glue_to_musb(g) platform_get_drvdata(g->musb) |
38 | 38 | ||
39 | static irqreturn_t ux500_musb_interrupt(int irq, void *__hci) | ||
40 | { | ||
41 | unsigned long flags; | ||
42 | irqreturn_t retval = IRQ_NONE; | ||
43 | struct musb *musb = __hci; | ||
44 | |||
45 | spin_lock_irqsave(&musb->lock, flags); | ||
46 | |||
47 | musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB); | ||
48 | musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX); | ||
49 | musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX); | ||
50 | |||
51 | if (musb->int_usb || musb->int_tx || musb->int_rx) | ||
52 | retval = musb_interrupt(musb); | ||
53 | |||
54 | spin_unlock_irqrestore(&musb->lock, flags); | ||
55 | |||
56 | return retval; | ||
57 | } | ||
58 | |||
39 | static int ux500_musb_init(struct musb *musb) | 59 | static int ux500_musb_init(struct musb *musb) |
40 | { | 60 | { |
41 | musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); | 61 | musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); |
@@ -44,6 +64,8 @@ static int ux500_musb_init(struct musb *musb) | |||
44 | return -ENODEV; | 64 | return -ENODEV; |
45 | } | 65 | } |
46 | 66 | ||
67 | musb->isr = ux500_musb_interrupt; | ||
68 | |||
47 | return 0; | 69 | return 0; |
48 | } | 70 | } |
49 | 71 | ||
@@ -59,13 +81,12 @@ static const struct musb_platform_ops ux500_ops = { | |||
59 | .exit = ux500_musb_exit, | 81 | .exit = ux500_musb_exit, |
60 | }; | 82 | }; |
61 | 83 | ||
62 | static int __devinit ux500_probe(struct platform_device *pdev) | 84 | static int ux500_probe(struct platform_device *pdev) |
63 | { | 85 | { |
64 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; | 86 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; |
65 | struct platform_device *musb; | 87 | struct platform_device *musb; |
66 | struct ux500_glue *glue; | 88 | struct ux500_glue *glue; |
67 | struct clk *clk; | 89 | struct clk *clk; |
68 | int musbid; | ||
69 | int ret = -ENOMEM; | 90 | int ret = -ENOMEM; |
70 | 91 | ||
71 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); | 92 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); |
@@ -74,18 +95,10 @@ static int __devinit ux500_probe(struct platform_device *pdev) | |||
74 | goto err0; | 95 | goto err0; |
75 | } | 96 | } |
76 | 97 | ||
77 | /* get the musb id */ | 98 | musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO); |
78 | musbid = musb_get_id(&pdev->dev, GFP_KERNEL); | ||
79 | if (musbid < 0) { | ||
80 | dev_err(&pdev->dev, "failed to allocate musb id\n"); | ||
81 | ret = -ENOMEM; | ||
82 | goto err1; | ||
83 | } | ||
84 | |||
85 | musb = platform_device_alloc("musb-hdrc", musbid); | ||
86 | if (!musb) { | 99 | if (!musb) { |
87 | dev_err(&pdev->dev, "failed to allocate musb device\n"); | 100 | dev_err(&pdev->dev, "failed to allocate musb device\n"); |
88 | goto err2; | 101 | goto err1; |
89 | } | 102 | } |
90 | 103 | ||
91 | clk = clk_get(&pdev->dev, "usb"); | 104 | clk = clk_get(&pdev->dev, "usb"); |
@@ -101,7 +114,6 @@ static int __devinit ux500_probe(struct platform_device *pdev) | |||
101 | goto err4; | 114 | goto err4; |
102 | } | 115 | } |
103 | 116 | ||
104 | musb->id = musbid; | ||
105 | musb->dev.parent = &pdev->dev; | 117 | musb->dev.parent = &pdev->dev; |
106 | musb->dev.dma_mask = pdev->dev.dma_mask; | 118 | musb->dev.dma_mask = pdev->dev.dma_mask; |
107 | musb->dev.coherent_dma_mask = pdev->dev.coherent_dma_mask; | 119 | musb->dev.coherent_dma_mask = pdev->dev.coherent_dma_mask; |
@@ -144,9 +156,6 @@ err4: | |||
144 | err3: | 156 | err3: |
145 | platform_device_put(musb); | 157 | platform_device_put(musb); |
146 | 158 | ||
147 | err2: | ||
148 | musb_put_id(&pdev->dev, musbid); | ||
149 | |||
150 | err1: | 159 | err1: |
151 | kfree(glue); | 160 | kfree(glue); |
152 | 161 | ||
@@ -154,13 +163,11 @@ err0: | |||
154 | return ret; | 163 | return ret; |
155 | } | 164 | } |
156 | 165 | ||
157 | static int __devexit ux500_remove(struct platform_device *pdev) | 166 | static int ux500_remove(struct platform_device *pdev) |
158 | { | 167 | { |
159 | struct ux500_glue *glue = platform_get_drvdata(pdev); | 168 | struct ux500_glue *glue = platform_get_drvdata(pdev); |
160 | 169 | ||
161 | musb_put_id(&pdev->dev, glue->musb->id); | 170 | platform_device_unregister(glue->musb); |
162 | platform_device_del(glue->musb); | ||
163 | platform_device_put(glue->musb); | ||
164 | clk_disable(glue->clk); | 171 | clk_disable(glue->clk); |
165 | clk_put(glue->clk); | 172 | clk_put(glue->clk); |
166 | kfree(glue); | 173 | kfree(glue); |
@@ -209,7 +216,7 @@ static const struct dev_pm_ops ux500_pm_ops = { | |||
209 | 216 | ||
210 | static struct platform_driver ux500_driver = { | 217 | static struct platform_driver ux500_driver = { |
211 | .probe = ux500_probe, | 218 | .probe = ux500_probe, |
212 | .remove = __devexit_p(ux500_remove), | 219 | .remove = ux500_remove, |
213 | .driver = { | 220 | .driver = { |
214 | .name = "musb-ux500", | 221 | .name = "musb-ux500", |
215 | .pm = DEV_PM_OPS, | 222 | .pm = DEV_PM_OPS, |
@@ -219,15 +226,4 @@ static struct platform_driver ux500_driver = { | |||
219 | MODULE_DESCRIPTION("UX500 MUSB Glue Layer"); | 226 | MODULE_DESCRIPTION("UX500 MUSB Glue Layer"); |
220 | MODULE_AUTHOR("Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com>"); | 227 | MODULE_AUTHOR("Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com>"); |
221 | MODULE_LICENSE("GPL v2"); | 228 | MODULE_LICENSE("GPL v2"); |
222 | 229 | module_platform_driver(ux500_driver); | |
223 | static int __init ux500_init(void) | ||
224 | { | ||
225 | return platform_driver_register(&ux500_driver); | ||
226 | } | ||
227 | module_init(ux500_init); | ||
228 | |||
229 | static void __exit ux500_exit(void) | ||
230 | { | ||
231 | platform_driver_unregister(&ux500_driver); | ||
232 | } | ||
233 | module_exit(ux500_exit); | ||
diff --git a/drivers/usb/musb/ux500_dma.c b/drivers/usb/musb/ux500_dma.c index f1059e725ea8..039e567dd3b6 100644 --- a/drivers/usb/musb/ux500_dma.c +++ b/drivers/usb/musb/ux500_dma.c | |||
@@ -364,8 +364,7 @@ void dma_controller_destroy(struct dma_controller *c) | |||
364 | kfree(controller); | 364 | kfree(controller); |
365 | } | 365 | } |
366 | 366 | ||
367 | struct dma_controller *__devinit | 367 | struct dma_controller *dma_controller_create(struct musb *musb, void __iomem *base) |
368 | dma_controller_create(struct musb *musb, void __iomem *base) | ||
369 | { | 368 | { |
370 | struct ux500_dma_controller *controller; | 369 | struct ux500_dma_controller *controller; |
371 | struct platform_device *pdev = to_platform_device(musb->controller); | 370 | struct platform_device *pdev = to_platform_device(musb->controller); |
diff --git a/drivers/usb/otg/ab8500-usb.c b/drivers/usb/otg/ab8500-usb.c index ae8ad561f083..2d86f26a0183 100644 --- a/drivers/usb/otg/ab8500-usb.c +++ b/drivers/usb/otg/ab8500-usb.c | |||
@@ -468,7 +468,7 @@ static int ab8500_usb_v2_res_setup(struct platform_device *pdev, | |||
468 | return 0; | 468 | return 0; |
469 | } | 469 | } |
470 | 470 | ||
471 | static int __devinit ab8500_usb_probe(struct platform_device *pdev) | 471 | static int ab8500_usb_probe(struct platform_device *pdev) |
472 | { | 472 | { |
473 | struct ab8500_usb *ab; | 473 | struct ab8500_usb *ab; |
474 | struct usb_otg *otg; | 474 | struct usb_otg *otg; |
@@ -546,7 +546,7 @@ fail0: | |||
546 | return err; | 546 | return err; |
547 | } | 547 | } |
548 | 548 | ||
549 | static int __devexit ab8500_usb_remove(struct platform_device *pdev) | 549 | static int ab8500_usb_remove(struct platform_device *pdev) |
550 | { | 550 | { |
551 | struct ab8500_usb *ab = platform_get_drvdata(pdev); | 551 | struct ab8500_usb *ab = platform_get_drvdata(pdev); |
552 | 552 | ||
@@ -571,7 +571,7 @@ static int __devexit ab8500_usb_remove(struct platform_device *pdev) | |||
571 | 571 | ||
572 | static struct platform_driver ab8500_usb_driver = { | 572 | static struct platform_driver ab8500_usb_driver = { |
573 | .probe = ab8500_usb_probe, | 573 | .probe = ab8500_usb_probe, |
574 | .remove = __devexit_p(ab8500_usb_remove), | 574 | .remove = ab8500_usb_remove, |
575 | .driver = { | 575 | .driver = { |
576 | .name = "ab8500-usb", | 576 | .name = "ab8500-usb", |
577 | .owner = THIS_MODULE, | 577 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/otg/fsl_otg.c b/drivers/usb/otg/fsl_otg.c index c19d1d7173a9..d16adb41eb21 100644 --- a/drivers/usb/otg/fsl_otg.c +++ b/drivers/usb/otg/fsl_otg.c | |||
@@ -1110,7 +1110,7 @@ static const struct file_operations otg_fops = { | |||
1110 | .release = fsl_otg_release, | 1110 | .release = fsl_otg_release, |
1111 | }; | 1111 | }; |
1112 | 1112 | ||
1113 | static int __devinit fsl_otg_probe(struct platform_device *pdev) | 1113 | static int fsl_otg_probe(struct platform_device *pdev) |
1114 | { | 1114 | { |
1115 | int ret; | 1115 | int ret; |
1116 | 1116 | ||
@@ -1144,7 +1144,7 @@ static int __devinit fsl_otg_probe(struct platform_device *pdev) | |||
1144 | return ret; | 1144 | return ret; |
1145 | } | 1145 | } |
1146 | 1146 | ||
1147 | static int __devexit fsl_otg_remove(struct platform_device *pdev) | 1147 | static int fsl_otg_remove(struct platform_device *pdev) |
1148 | { | 1148 | { |
1149 | struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; | 1149 | struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; |
1150 | 1150 | ||
@@ -1169,7 +1169,7 @@ static int __devexit fsl_otg_remove(struct platform_device *pdev) | |||
1169 | 1169 | ||
1170 | struct platform_driver fsl_otg_driver = { | 1170 | struct platform_driver fsl_otg_driver = { |
1171 | .probe = fsl_otg_probe, | 1171 | .probe = fsl_otg_probe, |
1172 | .remove = __devexit_p(fsl_otg_remove), | 1172 | .remove = fsl_otg_remove, |
1173 | .driver = { | 1173 | .driver = { |
1174 | .name = driver_name, | 1174 | .name = driver_name, |
1175 | .owner = THIS_MODULE, | 1175 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/otg/isp1301_omap.c b/drivers/usb/otg/isp1301_omap.c index ceee2119bffa..af9cb11626b2 100644 --- a/drivers/usb/otg/isp1301_omap.c +++ b/drivers/usb/otg/isp1301_omap.c | |||
@@ -1493,7 +1493,7 @@ isp1301_start_hnp(struct usb_otg *otg) | |||
1493 | 1493 | ||
1494 | /*-------------------------------------------------------------------------*/ | 1494 | /*-------------------------------------------------------------------------*/ |
1495 | 1495 | ||
1496 | static int __devinit | 1496 | static int |
1497 | isp1301_probe(struct i2c_client *i2c, const struct i2c_device_id *id) | 1497 | isp1301_probe(struct i2c_client *i2c, const struct i2c_device_id *id) |
1498 | { | 1498 | { |
1499 | int status; | 1499 | int status; |
diff --git a/drivers/usb/otg/msm_otg.c b/drivers/usb/otg/msm_otg.c index 9f5fc906041a..3b9f0d951132 100644 --- a/drivers/usb/otg/msm_otg.c +++ b/drivers/usb/otg/msm_otg.c | |||
@@ -1606,7 +1606,7 @@ free_motg: | |||
1606 | return ret; | 1606 | return ret; |
1607 | } | 1607 | } |
1608 | 1608 | ||
1609 | static int __devexit msm_otg_remove(struct platform_device *pdev) | 1609 | static int msm_otg_remove(struct platform_device *pdev) |
1610 | { | 1610 | { |
1611 | struct msm_otg *motg = platform_get_drvdata(pdev); | 1611 | struct msm_otg *motg = platform_get_drvdata(pdev); |
1612 | struct usb_phy *phy = &motg->phy; | 1612 | struct usb_phy *phy = &motg->phy; |
@@ -1746,7 +1746,7 @@ static const struct dev_pm_ops msm_otg_dev_pm_ops = { | |||
1746 | #endif | 1746 | #endif |
1747 | 1747 | ||
1748 | static struct platform_driver msm_otg_driver = { | 1748 | static struct platform_driver msm_otg_driver = { |
1749 | .remove = __devexit_p(msm_otg_remove), | 1749 | .remove = msm_otg_remove, |
1750 | .driver = { | 1750 | .driver = { |
1751 | .name = DRIVER_NAME, | 1751 | .name = DRIVER_NAME, |
1752 | .owner = THIS_MODULE, | 1752 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/otg/mv_otg.c b/drivers/usb/otg/mv_otg.c index 3f124e8f5792..1dd57504186d 100644 --- a/drivers/usb/otg/mv_otg.c +++ b/drivers/usb/otg/mv_otg.c | |||
@@ -958,16 +958,4 @@ static struct platform_driver mv_otg_driver = { | |||
958 | .resume = mv_otg_resume, | 958 | .resume = mv_otg_resume, |
959 | #endif | 959 | #endif |
960 | }; | 960 | }; |
961 | 961 | module_platform_driver(mv_otg_driver); | |
962 | static int __init mv_otg_init(void) | ||
963 | { | ||
964 | return platform_driver_register(&mv_otg_driver); | ||
965 | } | ||
966 | |||
967 | static void __exit mv_otg_exit(void) | ||
968 | { | ||
969 | platform_driver_unregister(&mv_otg_driver); | ||
970 | } | ||
971 | |||
972 | module_init(mv_otg_init); | ||
973 | module_exit(mv_otg_exit); | ||
diff --git a/drivers/usb/otg/mxs-phy.c b/drivers/usb/otg/mxs-phy.c index 88db976647cf..76302720055a 100644 --- a/drivers/usb/otg/mxs-phy.c +++ b/drivers/usb/otg/mxs-phy.c | |||
@@ -20,7 +20,6 @@ | |||
20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
21 | #include <linux/err.h> | 21 | #include <linux/err.h> |
22 | #include <linux/io.h> | 22 | #include <linux/io.h> |
23 | #include <linux/workqueue.h> | ||
24 | 23 | ||
25 | #define DRIVER_NAME "mxs_phy" | 24 | #define DRIVER_NAME "mxs_phy" |
26 | 25 | ||
@@ -35,16 +34,9 @@ | |||
35 | #define BM_USBPHY_CTRL_ENUTMILEVEL2 BIT(14) | 34 | #define BM_USBPHY_CTRL_ENUTMILEVEL2 BIT(14) |
36 | #define BM_USBPHY_CTRL_ENHOSTDISCONDETECT BIT(1) | 35 | #define BM_USBPHY_CTRL_ENHOSTDISCONDETECT BIT(1) |
37 | 36 | ||
38 | /* | ||
39 | * Amount of delay in miliseconds to safely enable ENHOSTDISCONDETECT bit | ||
40 | * so that connection and reset processing can be completed for the root hub. | ||
41 | */ | ||
42 | #define MXY_PHY_ENHOSTDISCONDETECT_DELAY 250 | ||
43 | |||
44 | struct mxs_phy { | 37 | struct mxs_phy { |
45 | struct usb_phy phy; | 38 | struct usb_phy phy; |
46 | struct clk *clk; | 39 | struct clk *clk; |
47 | struct delayed_work enhostdiscondetect_work; | ||
48 | }; | 40 | }; |
49 | 41 | ||
50 | #define to_mxs_phy(p) container_of((p), struct mxs_phy, phy) | 42 | #define to_mxs_phy(p) container_of((p), struct mxs_phy, phy) |
@@ -70,7 +62,6 @@ static int mxs_phy_init(struct usb_phy *phy) | |||
70 | 62 | ||
71 | clk_prepare_enable(mxs_phy->clk); | 63 | clk_prepare_enable(mxs_phy->clk); |
72 | mxs_phy_hw_init(mxs_phy); | 64 | mxs_phy_hw_init(mxs_phy); |
73 | INIT_DELAYED_WORK(&mxs_phy->enhostdiscondetect_work, NULL); | ||
74 | 65 | ||
75 | return 0; | 66 | return 0; |
76 | } | 67 | } |
@@ -85,46 +76,28 @@ static void mxs_phy_shutdown(struct usb_phy *phy) | |||
85 | clk_disable_unprepare(mxs_phy->clk); | 76 | clk_disable_unprepare(mxs_phy->clk); |
86 | } | 77 | } |
87 | 78 | ||
88 | static void mxs_phy_enhostdiscondetect_delay(struct work_struct *ws) | 79 | static int mxs_phy_on_connect(struct usb_phy *phy, |
80 | enum usb_device_speed speed) | ||
89 | { | 81 | { |
90 | struct mxs_phy *mxs_phy = container_of(ws, struct mxs_phy, | 82 | dev_dbg(phy->dev, "%s speed device has connected\n", |
91 | enhostdiscondetect_work.work); | 83 | (speed == USB_SPEED_HIGH) ? "high" : "non-high"); |
92 | |||
93 | /* Enable HOSTDISCONDETECT after delay. */ | ||
94 | dev_dbg(mxs_phy->phy.dev, "Setting ENHOSTDISCONDETECT\n"); | ||
95 | writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT, | ||
96 | mxs_phy->phy.io_priv + HW_USBPHY_CTRL_SET); | ||
97 | } | ||
98 | |||
99 | static int mxs_phy_on_connect(struct usb_phy *phy, int port) | ||
100 | { | ||
101 | struct mxs_phy *mxs_phy = to_mxs_phy(phy); | ||
102 | |||
103 | dev_dbg(phy->dev, "Connect on port %d\n", port); | ||
104 | |||
105 | mxs_phy_hw_init(mxs_phy); | ||
106 | 84 | ||
107 | /* | 85 | if (speed == USB_SPEED_HIGH) |
108 | * Delay enabling ENHOSTDISCONDETECT so that connection and | 86 | writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT, |
109 | * reset processing can be completed for the root hub. | 87 | phy->io_priv + HW_USBPHY_CTRL_SET); |
110 | */ | ||
111 | dev_dbg(phy->dev, "Delaying setting ENHOSTDISCONDETECT\n"); | ||
112 | PREPARE_DELAYED_WORK(&mxs_phy->enhostdiscondetect_work, | ||
113 | mxs_phy_enhostdiscondetect_delay); | ||
114 | schedule_delayed_work(&mxs_phy->enhostdiscondetect_work, | ||
115 | msecs_to_jiffies(MXY_PHY_ENHOSTDISCONDETECT_DELAY)); | ||
116 | 88 | ||
117 | return 0; | 89 | return 0; |
118 | } | 90 | } |
119 | 91 | ||
120 | static int mxs_phy_on_disconnect(struct usb_phy *phy, int port) | 92 | static int mxs_phy_on_disconnect(struct usb_phy *phy, |
93 | enum usb_device_speed speed) | ||
121 | { | 94 | { |
122 | dev_dbg(phy->dev, "Disconnect on port %d\n", port); | 95 | dev_dbg(phy->dev, "%s speed device has disconnected\n", |
96 | (speed == USB_SPEED_HIGH) ? "high" : "non-high"); | ||
123 | 97 | ||
124 | /* No need to delay before clearing ENHOSTDISCONDETECT. */ | 98 | if (speed == USB_SPEED_HIGH) |
125 | dev_dbg(phy->dev, "Clearing ENHOSTDISCONDETECT\n"); | 99 | writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT, |
126 | writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT, | 100 | phy->io_priv + HW_USBPHY_CTRL_CLR); |
127 | phy->io_priv + HW_USBPHY_CTRL_CLR); | ||
128 | 101 | ||
129 | return 0; | 102 | return 0; |
130 | } | 103 | } |
@@ -176,7 +149,7 @@ static int mxs_phy_probe(struct platform_device *pdev) | |||
176 | return 0; | 149 | return 0; |
177 | } | 150 | } |
178 | 151 | ||
179 | static int __devexit mxs_phy_remove(struct platform_device *pdev) | 152 | static int mxs_phy_remove(struct platform_device *pdev) |
180 | { | 153 | { |
181 | platform_set_drvdata(pdev, NULL); | 154 | platform_set_drvdata(pdev, NULL); |
182 | 155 | ||
@@ -191,7 +164,7 @@ MODULE_DEVICE_TABLE(of, mxs_phy_dt_ids); | |||
191 | 164 | ||
192 | static struct platform_driver mxs_phy_driver = { | 165 | static struct platform_driver mxs_phy_driver = { |
193 | .probe = mxs_phy_probe, | 166 | .probe = mxs_phy_probe, |
194 | .remove = __devexit_p(mxs_phy_remove), | 167 | .remove = mxs_phy_remove, |
195 | .driver = { | 168 | .driver = { |
196 | .name = DRIVER_NAME, | 169 | .name = DRIVER_NAME, |
197 | .owner = THIS_MODULE, | 170 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/otg/nop-usb-xceiv.c b/drivers/usb/otg/nop-usb-xceiv.c index e52e35e7adaf..a3ce24b94a73 100644 --- a/drivers/usb/otg/nop-usb-xceiv.c +++ b/drivers/usb/otg/nop-usb-xceiv.c | |||
@@ -93,7 +93,7 @@ static int nop_set_host(struct usb_otg *otg, struct usb_bus *host) | |||
93 | return 0; | 93 | return 0; |
94 | } | 94 | } |
95 | 95 | ||
96 | static int __devinit nop_usb_xceiv_probe(struct platform_device *pdev) | 96 | static int nop_usb_xceiv_probe(struct platform_device *pdev) |
97 | { | 97 | { |
98 | struct nop_usb_xceiv_platform_data *pdata = pdev->dev.platform_data; | 98 | struct nop_usb_xceiv_platform_data *pdata = pdev->dev.platform_data; |
99 | struct nop_usb_xceiv *nop; | 99 | struct nop_usb_xceiv *nop; |
@@ -141,7 +141,7 @@ exit: | |||
141 | return err; | 141 | return err; |
142 | } | 142 | } |
143 | 143 | ||
144 | static int __devexit nop_usb_xceiv_remove(struct platform_device *pdev) | 144 | static int nop_usb_xceiv_remove(struct platform_device *pdev) |
145 | { | 145 | { |
146 | struct nop_usb_xceiv *nop = platform_get_drvdata(pdev); | 146 | struct nop_usb_xceiv *nop = platform_get_drvdata(pdev); |
147 | 147 | ||
@@ -156,7 +156,7 @@ static int __devexit nop_usb_xceiv_remove(struct platform_device *pdev) | |||
156 | 156 | ||
157 | static struct platform_driver nop_usb_xceiv_driver = { | 157 | static struct platform_driver nop_usb_xceiv_driver = { |
158 | .probe = nop_usb_xceiv_probe, | 158 | .probe = nop_usb_xceiv_probe, |
159 | .remove = __devexit_p(nop_usb_xceiv_remove), | 159 | .remove = nop_usb_xceiv_remove, |
160 | .driver = { | 160 | .driver = { |
161 | .name = "nop_usb_xceiv", | 161 | .name = "nop_usb_xceiv", |
162 | .owner = THIS_MODULE, | 162 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/otg/twl4030-usb.c b/drivers/usb/otg/twl4030-usb.c index f0d2e7530cfe..0a701938ab53 100644 --- a/drivers/usb/otg/twl4030-usb.c +++ b/drivers/usb/otg/twl4030-usb.c | |||
@@ -123,10 +123,10 @@ | |||
123 | #define PHY_CLK_CTRL_STS 0xFF | 123 | #define PHY_CLK_CTRL_STS 0xFF |
124 | #define PHY_DPLL_CLK (1 << 0) | 124 | #define PHY_DPLL_CLK (1 << 0) |
125 | 125 | ||
126 | /* In module TWL4030_MODULE_PM_MASTER */ | 126 | /* In module TWL_MODULE_PM_MASTER */ |
127 | #define STS_HW_CONDITIONS 0x0F | 127 | #define STS_HW_CONDITIONS 0x0F |
128 | 128 | ||
129 | /* In module TWL4030_MODULE_PM_RECEIVER */ | 129 | /* In module TWL_MODULE_PM_RECEIVER */ |
130 | #define VUSB_DEDICATED1 0x7D | 130 | #define VUSB_DEDICATED1 0x7D |
131 | #define VUSB_DEDICATED2 0x7E | 131 | #define VUSB_DEDICATED2 0x7E |
132 | #define VUSB1V5_DEV_GRP 0x71 | 132 | #define VUSB1V5_DEV_GRP 0x71 |
@@ -195,14 +195,14 @@ static int twl4030_i2c_write_u8_verify(struct twl4030_usb *twl, | |||
195 | } | 195 | } |
196 | 196 | ||
197 | #define twl4030_usb_write_verify(twl, address, data) \ | 197 | #define twl4030_usb_write_verify(twl, address, data) \ |
198 | twl4030_i2c_write_u8_verify(twl, TWL4030_MODULE_USB, (data), (address)) | 198 | twl4030_i2c_write_u8_verify(twl, TWL_MODULE_USB, (data), (address)) |
199 | 199 | ||
200 | static inline int twl4030_usb_write(struct twl4030_usb *twl, | 200 | static inline int twl4030_usb_write(struct twl4030_usb *twl, |
201 | u8 address, u8 data) | 201 | u8 address, u8 data) |
202 | { | 202 | { |
203 | int ret = 0; | 203 | int ret = 0; |
204 | 204 | ||
205 | ret = twl_i2c_write_u8(TWL4030_MODULE_USB, data, address); | 205 | ret = twl_i2c_write_u8(TWL_MODULE_USB, data, address); |
206 | if (ret < 0) | 206 | if (ret < 0) |
207 | dev_dbg(twl->dev, | 207 | dev_dbg(twl->dev, |
208 | "TWL4030:USB:Write[0x%x] Error %d\n", address, ret); | 208 | "TWL4030:USB:Write[0x%x] Error %d\n", address, ret); |
@@ -227,7 +227,7 @@ static inline int twl4030_readb(struct twl4030_usb *twl, u8 module, u8 address) | |||
227 | 227 | ||
228 | static inline int twl4030_usb_read(struct twl4030_usb *twl, u8 address) | 228 | static inline int twl4030_usb_read(struct twl4030_usb *twl, u8 address) |
229 | { | 229 | { |
230 | return twl4030_readb(twl, TWL4030_MODULE_USB, address); | 230 | return twl4030_readb(twl, TWL_MODULE_USB, address); |
231 | } | 231 | } |
232 | 232 | ||
233 | /*-------------------------------------------------------------------------*/ | 233 | /*-------------------------------------------------------------------------*/ |
@@ -264,8 +264,7 @@ static enum omap_musb_vbus_id_status | |||
264 | * signal is active, the OTG module is activated, and | 264 | * signal is active, the OTG module is activated, and |
265 | * its interrupt may be raised (may wake the system). | 265 | * its interrupt may be raised (may wake the system). |
266 | */ | 266 | */ |
267 | status = twl4030_readb(twl, TWL4030_MODULE_PM_MASTER, | 267 | status = twl4030_readb(twl, TWL_MODULE_PM_MASTER, STS_HW_CONDITIONS); |
268 | STS_HW_CONDITIONS); | ||
269 | if (status < 0) | 268 | if (status < 0) |
270 | dev_err(twl->dev, "USB link status err %d\n", status); | 269 | dev_err(twl->dev, "USB link status err %d\n", status); |
271 | else if (status & (BIT(7) | BIT(2))) { | 270 | else if (status & (BIT(7) | BIT(2))) { |
@@ -372,8 +371,7 @@ static void twl4030_phy_power(struct twl4030_usb *twl, int on) | |||
372 | * SLEEP. We work around this by clearing the bit after usv3v1 | 371 | * SLEEP. We work around this by clearing the bit after usv3v1 |
373 | * is re-activated. This ensures that VUSB3V1 is really active. | 372 | * is re-activated. This ensures that VUSB3V1 is really active. |
374 | */ | 373 | */ |
375 | twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, | 374 | twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB_DEDICATED2); |
376 | VUSB_DEDICATED2); | ||
377 | regulator_enable(twl->usb1v5); | 375 | regulator_enable(twl->usb1v5); |
378 | __twl4030_phy_power(twl, 1); | 376 | __twl4030_phy_power(twl, 1); |
379 | twl4030_usb_write(twl, PHY_CLK_CTRL, | 377 | twl4030_usb_write(twl, PHY_CLK_CTRL, |
@@ -419,50 +417,48 @@ static void twl4030_phy_resume(struct twl4030_usb *twl) | |||
419 | static int twl4030_usb_ldo_init(struct twl4030_usb *twl) | 417 | static int twl4030_usb_ldo_init(struct twl4030_usb *twl) |
420 | { | 418 | { |
421 | /* Enable writing to power configuration registers */ | 419 | /* Enable writing to power configuration registers */ |
422 | twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, | 420 | twl_i2c_write_u8(TWL_MODULE_PM_MASTER, TWL4030_PM_MASTER_KEY_CFG1, |
423 | TWL4030_PM_MASTER_KEY_CFG1, | 421 | TWL4030_PM_MASTER_PROTECT_KEY); |
424 | TWL4030_PM_MASTER_PROTECT_KEY); | ||
425 | 422 | ||
426 | twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, | 423 | twl_i2c_write_u8(TWL_MODULE_PM_MASTER, TWL4030_PM_MASTER_KEY_CFG2, |
427 | TWL4030_PM_MASTER_KEY_CFG2, | 424 | TWL4030_PM_MASTER_PROTECT_KEY); |
428 | TWL4030_PM_MASTER_PROTECT_KEY); | ||
429 | 425 | ||
430 | /* Keep VUSB3V1 LDO in sleep state until VBUS/ID change detected*/ | 426 | /* Keep VUSB3V1 LDO in sleep state until VBUS/ID change detected*/ |
431 | /*twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB_DEDICATED2);*/ | 427 | /*twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB_DEDICATED2);*/ |
432 | 428 | ||
433 | /* input to VUSB3V1 LDO is from VBAT, not VBUS */ | 429 | /* input to VUSB3V1 LDO is from VBAT, not VBUS */ |
434 | twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x14, VUSB_DEDICATED1); | 430 | twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0x14, VUSB_DEDICATED1); |
435 | 431 | ||
436 | /* Initialize 3.1V regulator */ | 432 | /* Initialize 3.1V regulator */ |
437 | twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB3V1_DEV_GRP); | 433 | twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB3V1_DEV_GRP); |
438 | 434 | ||
439 | twl->usb3v1 = regulator_get(twl->dev, "usb3v1"); | 435 | twl->usb3v1 = regulator_get(twl->dev, "usb3v1"); |
440 | if (IS_ERR(twl->usb3v1)) | 436 | if (IS_ERR(twl->usb3v1)) |
441 | return -ENODEV; | 437 | return -ENODEV; |
442 | 438 | ||
443 | twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB3V1_TYPE); | 439 | twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB3V1_TYPE); |
444 | 440 | ||
445 | /* Initialize 1.5V regulator */ | 441 | /* Initialize 1.5V regulator */ |
446 | twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB1V5_DEV_GRP); | 442 | twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB1V5_DEV_GRP); |
447 | 443 | ||
448 | twl->usb1v5 = regulator_get(twl->dev, "usb1v5"); | 444 | twl->usb1v5 = regulator_get(twl->dev, "usb1v5"); |
449 | if (IS_ERR(twl->usb1v5)) | 445 | if (IS_ERR(twl->usb1v5)) |
450 | goto fail1; | 446 | goto fail1; |
451 | 447 | ||
452 | twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB1V5_TYPE); | 448 | twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB1V5_TYPE); |
453 | 449 | ||
454 | /* Initialize 1.8V regulator */ | 450 | /* Initialize 1.8V regulator */ |
455 | twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB1V8_DEV_GRP); | 451 | twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB1V8_DEV_GRP); |
456 | 452 | ||
457 | twl->usb1v8 = regulator_get(twl->dev, "usb1v8"); | 453 | twl->usb1v8 = regulator_get(twl->dev, "usb1v8"); |
458 | if (IS_ERR(twl->usb1v8)) | 454 | if (IS_ERR(twl->usb1v8)) |
459 | goto fail2; | 455 | goto fail2; |
460 | 456 | ||
461 | twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB1V8_TYPE); | 457 | twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB1V8_TYPE); |
462 | 458 | ||
463 | /* disable access to power configuration registers */ | 459 | /* disable access to power configuration registers */ |
464 | twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0, | 460 | twl_i2c_write_u8(TWL_MODULE_PM_MASTER, 0, |
465 | TWL4030_PM_MASTER_PROTECT_KEY); | 461 | TWL4030_PM_MASTER_PROTECT_KEY); |
466 | 462 | ||
467 | return 0; | 463 | return 0; |
468 | 464 | ||
@@ -579,7 +575,7 @@ static int twl4030_set_host(struct usb_otg *otg, struct usb_bus *host) | |||
579 | return 0; | 575 | return 0; |
580 | } | 576 | } |
581 | 577 | ||
582 | static int __devinit twl4030_usb_probe(struct platform_device *pdev) | 578 | static int twl4030_usb_probe(struct platform_device *pdev) |
583 | { | 579 | { |
584 | struct twl4030_usb_data *pdata = pdev->dev.platform_data; | 580 | struct twl4030_usb_data *pdata = pdev->dev.platform_data; |
585 | struct twl4030_usb *twl; | 581 | struct twl4030_usb *twl; |
diff --git a/drivers/usb/otg/twl6030-usb.c b/drivers/usb/otg/twl6030-usb.c index fcadef7864f1..8cd6cf49bdbd 100644 --- a/drivers/usb/otg/twl6030-usb.c +++ b/drivers/usb/otg/twl6030-usb.c | |||
@@ -310,7 +310,7 @@ static int twl6030_set_vbus(struct phy_companion *comparator, bool enabled) | |||
310 | return 0; | 310 | return 0; |
311 | } | 311 | } |
312 | 312 | ||
313 | static int __devinit twl6030_usb_probe(struct platform_device *pdev) | 313 | static int twl6030_usb_probe(struct platform_device *pdev) |
314 | { | 314 | { |
315 | u32 ret; | 315 | u32 ret; |
316 | struct twl6030_usb *twl; | 316 | struct twl6030_usb *twl; |
diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig index 63c339b3e676..7eb73c561bd2 100644 --- a/drivers/usb/phy/Kconfig +++ b/drivers/usb/phy/Kconfig | |||
@@ -32,3 +32,15 @@ config MV_U3D_PHY | |||
32 | help | 32 | help |
33 | Enable this to support Marvell USB 3.0 phy controller for Marvell | 33 | Enable this to support Marvell USB 3.0 phy controller for Marvell |
34 | SoC. | 34 | SoC. |
35 | |||
36 | config USB_RCAR_PHY | ||
37 | tristate "Renesas R-Car USB phy support" | ||
38 | depends on USB || USB_GADGET | ||
39 | select USB_OTG_UTILS | ||
40 | help | ||
41 | Say Y here to add support for the Renesas R-Car USB phy driver. | ||
42 | This chip is typically used as USB phy for USB host, gadget. | ||
43 | This driver supports: R8A7779 | ||
44 | |||
45 | To compile this driver as a module, choose M here: the | ||
46 | module will be called rcar-phy. | ||
diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile index b069f29f1225..1a579a860a03 100644 --- a/drivers/usb/phy/Makefile +++ b/drivers/usb/phy/Makefile | |||
@@ -8,3 +8,4 @@ obj-$(CONFIG_OMAP_USB2) += omap-usb2.o | |||
8 | obj-$(CONFIG_USB_ISP1301) += isp1301.o | 8 | obj-$(CONFIG_USB_ISP1301) += isp1301.o |
9 | obj-$(CONFIG_MV_U3D_PHY) += mv_u3d_phy.o | 9 | obj-$(CONFIG_MV_U3D_PHY) += mv_u3d_phy.o |
10 | obj-$(CONFIG_USB_EHCI_TEGRA) += tegra_usb_phy.o | 10 | obj-$(CONFIG_USB_EHCI_TEGRA) += tegra_usb_phy.o |
11 | obj-$(CONFIG_USB_RCAR_PHY) += rcar-phy.o | ||
diff --git a/drivers/usb/phy/mv_u3d_phy.c b/drivers/usb/phy/mv_u3d_phy.c index 9f1c5d3c60ec..eaddbe3d4304 100644 --- a/drivers/usb/phy/mv_u3d_phy.c +++ b/drivers/usb/phy/mv_u3d_phy.c | |||
@@ -262,7 +262,7 @@ calstart: | |||
262 | return 0; | 262 | return 0; |
263 | } | 263 | } |
264 | 264 | ||
265 | static int __devinit mv_u3d_phy_probe(struct platform_device *pdev) | 265 | static int mv_u3d_phy_probe(struct platform_device *pdev) |
266 | { | 266 | { |
267 | struct mv_u3d_phy *mv_u3d_phy; | 267 | struct mv_u3d_phy *mv_u3d_phy; |
268 | struct mv_usb_platform_data *pdata; | 268 | struct mv_usb_platform_data *pdata; |
@@ -331,7 +331,7 @@ static int __exit mv_u3d_phy_remove(struct platform_device *pdev) | |||
331 | 331 | ||
332 | static struct platform_driver mv_u3d_phy_driver = { | 332 | static struct platform_driver mv_u3d_phy_driver = { |
333 | .probe = mv_u3d_phy_probe, | 333 | .probe = mv_u3d_phy_probe, |
334 | .remove = __devexit_p(mv_u3d_phy_remove), | 334 | .remove = mv_u3d_phy_remove, |
335 | .driver = { | 335 | .driver = { |
336 | .name = "mv-u3d-phy", | 336 | .name = "mv-u3d-phy", |
337 | .owner = THIS_MODULE, | 337 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/phy/omap-usb2.c b/drivers/usb/phy/omap-usb2.c index 15ab3d6f2e8c..26ae8f49225c 100644 --- a/drivers/usb/phy/omap-usb2.c +++ b/drivers/usb/phy/omap-usb2.c | |||
@@ -141,7 +141,7 @@ static int omap_usb2_suspend(struct usb_phy *x, int suspend) | |||
141 | return 0; | 141 | return 0; |
142 | } | 142 | } |
143 | 143 | ||
144 | static int __devinit omap_usb2_probe(struct platform_device *pdev) | 144 | static int omap_usb2_probe(struct platform_device *pdev) |
145 | { | 145 | { |
146 | struct omap_usb *phy; | 146 | struct omap_usb *phy; |
147 | struct usb_otg *otg; | 147 | struct usb_otg *otg; |
@@ -199,7 +199,7 @@ static int __devinit omap_usb2_probe(struct platform_device *pdev) | |||
199 | return 0; | 199 | return 0; |
200 | } | 200 | } |
201 | 201 | ||
202 | static int __devexit omap_usb2_remove(struct platform_device *pdev) | 202 | static int omap_usb2_remove(struct platform_device *pdev) |
203 | { | 203 | { |
204 | struct omap_usb *phy = platform_get_drvdata(pdev); | 204 | struct omap_usb *phy = platform_get_drvdata(pdev); |
205 | 205 | ||
@@ -254,7 +254,7 @@ MODULE_DEVICE_TABLE(of, omap_usb2_id_table); | |||
254 | 254 | ||
255 | static struct platform_driver omap_usb2_driver = { | 255 | static struct platform_driver omap_usb2_driver = { |
256 | .probe = omap_usb2_probe, | 256 | .probe = omap_usb2_probe, |
257 | .remove = __devexit_p(omap_usb2_remove), | 257 | .remove = omap_usb2_remove, |
258 | .driver = { | 258 | .driver = { |
259 | .name = "omap-usb2", | 259 | .name = "omap-usb2", |
260 | .owner = THIS_MODULE, | 260 | .owner = THIS_MODULE, |
diff --git a/drivers/usb/phy/rcar-phy.c b/drivers/usb/phy/rcar-phy.c new file mode 100644 index 000000000000..a35681b0c501 --- /dev/null +++ b/drivers/usb/phy/rcar-phy.c | |||
@@ -0,0 +1,220 @@ | |||
1 | /* | ||
2 | * Renesas R-Car USB phy driver | ||
3 | * | ||
4 | * Copyright (C) 2012 Renesas Solutions Corp. | ||
5 | * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/delay.h> | ||
13 | #include <linux/io.h> | ||
14 | #include <linux/usb/otg.h> | ||
15 | #include <linux/platform_device.h> | ||
16 | #include <linux/spinlock.h> | ||
17 | #include <linux/module.h> | ||
18 | |||
19 | /* USBH common register */ | ||
20 | #define USBPCTRL0 0x0800 | ||
21 | #define USBPCTRL1 0x0804 | ||
22 | #define USBST 0x0808 | ||
23 | #define USBEH0 0x080C | ||
24 | #define USBOH0 0x081C | ||
25 | #define USBCTL0 0x0858 | ||
26 | #define EIIBC1 0x0094 | ||
27 | #define EIIBC2 0x009C | ||
28 | |||
29 | /* USBPCTRL1 */ | ||
30 | #define PHY_RST (1 << 2) | ||
31 | #define PLL_ENB (1 << 1) | ||
32 | #define PHY_ENB (1 << 0) | ||
33 | |||
34 | /* USBST */ | ||
35 | #define ST_ACT (1 << 31) | ||
36 | #define ST_PLL (1 << 30) | ||
37 | |||
38 | struct rcar_usb_phy_priv { | ||
39 | struct usb_phy phy; | ||
40 | spinlock_t lock; | ||
41 | |||
42 | void __iomem *reg0; | ||
43 | void __iomem *reg1; | ||
44 | int counter; | ||
45 | }; | ||
46 | |||
47 | #define usb_phy_to_priv(p) container_of(p, struct rcar_usb_phy_priv, phy) | ||
48 | |||
49 | |||
50 | /* | ||
51 | * USB initial/install operation. | ||
52 | * | ||
53 | * This function setup USB phy. | ||
54 | * The used value and setting order came from | ||
55 | * [USB :: Initial setting] on datasheet. | ||
56 | */ | ||
57 | static int rcar_usb_phy_init(struct usb_phy *phy) | ||
58 | { | ||
59 | struct rcar_usb_phy_priv *priv = usb_phy_to_priv(phy); | ||
60 | struct device *dev = phy->dev; | ||
61 | void __iomem *reg0 = priv->reg0; | ||
62 | void __iomem *reg1 = priv->reg1; | ||
63 | int i; | ||
64 | u32 val; | ||
65 | unsigned long flags; | ||
66 | |||
67 | spin_lock_irqsave(&priv->lock, flags); | ||
68 | if (priv->counter++ == 0) { | ||
69 | |||
70 | /* | ||
71 | * USB phy start-up | ||
72 | */ | ||
73 | |||
74 | /* (1) USB-PHY standby release */ | ||
75 | iowrite32(PHY_ENB, (reg0 + USBPCTRL1)); | ||
76 | |||
77 | /* (2) start USB-PHY internal PLL */ | ||
78 | iowrite32(PHY_ENB | PLL_ENB, (reg0 + USBPCTRL1)); | ||
79 | |||
80 | /* (3) USB module status check */ | ||
81 | for (i = 0; i < 1024; i++) { | ||
82 | udelay(10); | ||
83 | val = ioread32(reg0 + USBST); | ||
84 | if (val == (ST_ACT | ST_PLL)) | ||
85 | break; | ||
86 | } | ||
87 | |||
88 | if (val != (ST_ACT | ST_PLL)) { | ||
89 | dev_err(dev, "USB phy not ready\n"); | ||
90 | goto phy_init_end; | ||
91 | } | ||
92 | |||
93 | /* (4) USB-PHY reset clear */ | ||
94 | iowrite32(PHY_ENB | PLL_ENB | PHY_RST, (reg0 + USBPCTRL1)); | ||
95 | |||
96 | /* set platform specific port settings */ | ||
97 | iowrite32(0x00000000, (reg0 + USBPCTRL0)); | ||
98 | |||
99 | /* | ||
100 | * EHCI IP internal buffer setting | ||
101 | * EHCI IP internal buffer enable | ||
102 | * | ||
103 | * These are recommended value of a datasheet | ||
104 | * see [USB :: EHCI internal buffer setting] | ||
105 | */ | ||
106 | iowrite32(0x00ff0040, (reg0 + EIIBC1)); | ||
107 | iowrite32(0x00ff0040, (reg1 + EIIBC1)); | ||
108 | |||
109 | iowrite32(0x00000001, (reg0 + EIIBC2)); | ||
110 | iowrite32(0x00000001, (reg1 + EIIBC2)); | ||
111 | |||
112 | /* | ||
113 | * Bus alignment settings | ||
114 | */ | ||
115 | |||
116 | /* (1) EHCI bus alignment (little endian) */ | ||
117 | iowrite32(0x00000000, (reg0 + USBEH0)); | ||
118 | |||
119 | /* (1) OHCI bus alignment (little endian) */ | ||
120 | iowrite32(0x00000000, (reg0 + USBOH0)); | ||
121 | } | ||
122 | |||
123 | phy_init_end: | ||
124 | spin_unlock_irqrestore(&priv->lock, flags); | ||
125 | |||
126 | return 0; | ||
127 | } | ||
128 | |||
129 | static void rcar_usb_phy_shutdown(struct usb_phy *phy) | ||
130 | { | ||
131 | struct rcar_usb_phy_priv *priv = usb_phy_to_priv(phy); | ||
132 | void __iomem *reg0 = priv->reg0; | ||
133 | unsigned long flags; | ||
134 | |||
135 | spin_lock_irqsave(&priv->lock, flags); | ||
136 | |||
137 | if (priv->counter-- == 1) { /* last user */ | ||
138 | iowrite32(0x00000000, (reg0 + USBPCTRL0)); | ||
139 | iowrite32(0x00000000, (reg0 + USBPCTRL1)); | ||
140 | } | ||
141 | |||
142 | spin_unlock_irqrestore(&priv->lock, flags); | ||
143 | } | ||
144 | |||
145 | static int rcar_usb_phy_probe(struct platform_device *pdev) | ||
146 | { | ||
147 | struct rcar_usb_phy_priv *priv; | ||
148 | struct resource *res0, *res1; | ||
149 | struct device *dev = &pdev->dev; | ||
150 | void __iomem *reg0, *reg1; | ||
151 | int ret; | ||
152 | |||
153 | res0 = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
154 | res1 = platform_get_resource(pdev, IORESOURCE_MEM, 1); | ||
155 | if (!res0 || !res1) { | ||
156 | dev_err(dev, "Not enough platform resources\n"); | ||
157 | return -EINVAL; | ||
158 | } | ||
159 | |||
160 | /* | ||
161 | * CAUTION | ||
162 | * | ||
163 | * Because this phy address is also mapped under OHCI/EHCI address area, | ||
164 | * this driver can't use devm_request_and_ioremap(dev, res) here | ||
165 | */ | ||
166 | reg0 = devm_ioremap_nocache(dev, res0->start, resource_size(res0)); | ||
167 | reg1 = devm_ioremap_nocache(dev, res1->start, resource_size(res1)); | ||
168 | if (!reg0 || !reg1) { | ||
169 | dev_err(dev, "ioremap error\n"); | ||
170 | return -ENOMEM; | ||
171 | } | ||
172 | |||
173 | priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); | ||
174 | if (!priv) { | ||
175 | dev_err(dev, "priv data allocation error\n"); | ||
176 | return -ENOMEM; | ||
177 | } | ||
178 | |||
179 | priv->reg0 = reg0; | ||
180 | priv->reg1 = reg1; | ||
181 | priv->counter = 0; | ||
182 | priv->phy.dev = dev; | ||
183 | priv->phy.label = dev_name(dev); | ||
184 | priv->phy.init = rcar_usb_phy_init; | ||
185 | priv->phy.shutdown = rcar_usb_phy_shutdown; | ||
186 | spin_lock_init(&priv->lock); | ||
187 | |||
188 | ret = usb_add_phy(&priv->phy, USB_PHY_TYPE_USB2); | ||
189 | if (ret < 0) { | ||
190 | dev_err(dev, "usb phy addition error\n"); | ||
191 | return ret; | ||
192 | } | ||
193 | |||
194 | platform_set_drvdata(pdev, priv); | ||
195 | |||
196 | return ret; | ||
197 | } | ||
198 | |||
199 | static int rcar_usb_phy_remove(struct platform_device *pdev) | ||
200 | { | ||
201 | struct rcar_usb_phy_priv *priv = platform_get_drvdata(pdev); | ||
202 | |||
203 | usb_remove_phy(&priv->phy); | ||
204 | |||
205 | return 0; | ||
206 | } | ||
207 | |||
208 | static struct platform_driver rcar_usb_phy_driver = { | ||
209 | .driver = { | ||
210 | .name = "rcar_usb_phy", | ||
211 | }, | ||
212 | .probe = rcar_usb_phy_probe, | ||
213 | .remove = rcar_usb_phy_remove, | ||
214 | }; | ||
215 | |||
216 | module_platform_driver(rcar_usb_phy_driver); | ||
217 | |||
218 | MODULE_LICENSE("GPL v2"); | ||
219 | MODULE_DESCRIPTION("Renesas R-Car USB phy"); | ||
220 | MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>"); | ||
diff --git a/drivers/usb/phy/tegra_usb_phy.c b/drivers/usb/phy/tegra_usb_phy.c index 987116f9efcd..9d13c81754e0 100644 --- a/drivers/usb/phy/tegra_usb_phy.c +++ b/drivers/usb/phy/tegra_usb_phy.c | |||
@@ -29,7 +29,9 @@ | |||
29 | #include <linux/usb/ulpi.h> | 29 | #include <linux/usb/ulpi.h> |
30 | #include <asm/mach-types.h> | 30 | #include <asm/mach-types.h> |
31 | #include <linux/usb/tegra_usb_phy.h> | 31 | #include <linux/usb/tegra_usb_phy.h> |
32 | #include <mach/iomap.h> | 32 | |
33 | #define TEGRA_USB_BASE 0xC5000000 | ||
34 | #define TEGRA_USB_SIZE SZ_16K | ||
33 | 35 | ||
34 | #define ULPI_VIEWPORT 0x170 | 36 | #define ULPI_VIEWPORT 0x170 |
35 | 37 | ||
diff --git a/drivers/usb/renesas_usbhs/common.c b/drivers/usb/renesas_usbhs/common.c index 072edc1cc55f..38bce046f4d0 100644 --- a/drivers/usb/renesas_usbhs/common.c +++ b/drivers/usb/renesas_usbhs/common.c | |||
@@ -132,6 +132,11 @@ void usbhs_sys_function_ctrl(struct usbhs_priv *priv, int enable) | |||
132 | usbhs_bset(priv, SYSCFG, mask, enable ? val : 0); | 132 | usbhs_bset(priv, SYSCFG, mask, enable ? val : 0); |
133 | } | 133 | } |
134 | 134 | ||
135 | void usbhs_sys_function_pullup(struct usbhs_priv *priv, int enable) | ||
136 | { | ||
137 | usbhs_bset(priv, SYSCFG, DPRPU, enable ? DPRPU : 0); | ||
138 | } | ||
139 | |||
135 | void usbhs_sys_set_test_mode(struct usbhs_priv *priv, u16 mode) | 140 | void usbhs_sys_set_test_mode(struct usbhs_priv *priv, u16 mode) |
136 | { | 141 | { |
137 | usbhs_write(priv, TESTMODE, mode); | 142 | usbhs_write(priv, TESTMODE, mode); |
@@ -551,7 +556,7 @@ probe_end_pipe_exit: | |||
551 | return ret; | 556 | return ret; |
552 | } | 557 | } |
553 | 558 | ||
554 | static int __devexit usbhs_remove(struct platform_device *pdev) | 559 | static int usbhs_remove(struct platform_device *pdev) |
555 | { | 560 | { |
556 | struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev); | 561 | struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev); |
557 | struct renesas_usbhs_platform_info *info = pdev->dev.platform_data; | 562 | struct renesas_usbhs_platform_info *info = pdev->dev.platform_data; |
@@ -631,7 +636,7 @@ static struct platform_driver renesas_usbhs_driver = { | |||
631 | .pm = &usbhsc_pm_ops, | 636 | .pm = &usbhsc_pm_ops, |
632 | }, | 637 | }, |
633 | .probe = usbhs_probe, | 638 | .probe = usbhs_probe, |
634 | .remove = __devexit_p(usbhs_remove), | 639 | .remove = usbhs_remove, |
635 | }; | 640 | }; |
636 | 641 | ||
637 | module_platform_driver(renesas_usbhs_driver); | 642 | module_platform_driver(renesas_usbhs_driver); |
diff --git a/drivers/usb/renesas_usbhs/common.h b/drivers/usb/renesas_usbhs/common.h index dddf40a59ded..c69dd2fba360 100644 --- a/drivers/usb/renesas_usbhs/common.h +++ b/drivers/usb/renesas_usbhs/common.h | |||
@@ -285,6 +285,7 @@ void usbhs_bset(struct usbhs_priv *priv, u32 reg, u16 mask, u16 data); | |||
285 | */ | 285 | */ |
286 | void usbhs_sys_host_ctrl(struct usbhs_priv *priv, int enable); | 286 | void usbhs_sys_host_ctrl(struct usbhs_priv *priv, int enable); |
287 | void usbhs_sys_function_ctrl(struct usbhs_priv *priv, int enable); | 287 | void usbhs_sys_function_ctrl(struct usbhs_priv *priv, int enable); |
288 | void usbhs_sys_function_pullup(struct usbhs_priv *priv, int enable); | ||
288 | void usbhs_sys_set_test_mode(struct usbhs_priv *priv, u16 mode); | 289 | void usbhs_sys_set_test_mode(struct usbhs_priv *priv, u16 mode); |
289 | 290 | ||
290 | /* | 291 | /* |
diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c index c021b202c0f3..9538f0feafe2 100644 --- a/drivers/usb/renesas_usbhs/fifo.c +++ b/drivers/usb/renesas_usbhs/fifo.c | |||
@@ -163,7 +163,7 @@ static int usbhsf_pkt_handler(struct usbhs_pipe *pipe, int type) | |||
163 | func = pkt->handler->dma_done; | 163 | func = pkt->handler->dma_done; |
164 | break; | 164 | break; |
165 | default: | 165 | default: |
166 | dev_err(dev, "unknown pkt hander\n"); | 166 | dev_err(dev, "unknown pkt handler\n"); |
167 | goto __usbhs_pkt_handler_end; | 167 | goto __usbhs_pkt_handler_end; |
168 | } | 168 | } |
169 | 169 | ||
@@ -192,8 +192,8 @@ void usbhs_pkt_start(struct usbhs_pipe *pipe) | |||
192 | /* | 192 | /* |
193 | * irq enable/disable function | 193 | * irq enable/disable function |
194 | */ | 194 | */ |
195 | #define usbhsf_irq_empty_ctrl(p, e) usbhsf_irq_callback_ctrl(p, bempsts, e) | 195 | #define usbhsf_irq_empty_ctrl(p, e) usbhsf_irq_callback_ctrl(p, irq_bempsts, e) |
196 | #define usbhsf_irq_ready_ctrl(p, e) usbhsf_irq_callback_ctrl(p, brdysts, e) | 196 | #define usbhsf_irq_ready_ctrl(p, e) usbhsf_irq_callback_ctrl(p, irq_brdysts, e) |
197 | #define usbhsf_irq_callback_ctrl(pipe, status, enable) \ | 197 | #define usbhsf_irq_callback_ctrl(pipe, status, enable) \ |
198 | ({ \ | 198 | ({ \ |
199 | struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); \ | 199 | struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); \ |
@@ -202,9 +202,9 @@ void usbhs_pkt_start(struct usbhs_pipe *pipe) | |||
202 | if (!mod) \ | 202 | if (!mod) \ |
203 | return; \ | 203 | return; \ |
204 | if (enable) \ | 204 | if (enable) \ |
205 | mod->irq_##status |= status; \ | 205 | mod->status |= status; \ |
206 | else \ | 206 | else \ |
207 | mod->irq_##status &= ~status; \ | 207 | mod->status &= ~status; \ |
208 | usbhs_irq_callback_update(priv, mod); \ | 208 | usbhs_irq_callback_update(priv, mod); \ |
209 | }) | 209 | }) |
210 | 210 | ||
@@ -488,6 +488,8 @@ static int usbhsf_pio_try_push(struct usbhs_pkt *pkt, int *is_done) | |||
488 | usbhs_pipe_data_sequence(pipe, pkt->sequence); | 488 | usbhs_pipe_data_sequence(pipe, pkt->sequence); |
489 | pkt->sequence = -1; /* -1 sequence will be ignored */ | 489 | pkt->sequence = -1; /* -1 sequence will be ignored */ |
490 | 490 | ||
491 | usbhs_pipe_set_trans_count_if_bulk(pipe, pkt->length); | ||
492 | |||
491 | ret = usbhsf_fifo_select(pipe, fifo, 1); | 493 | ret = usbhsf_fifo_select(pipe, fifo, 1); |
492 | if (ret < 0) | 494 | if (ret < 0) |
493 | return 0; | 495 | return 0; |
@@ -594,6 +596,7 @@ static int usbhsf_prepare_pop(struct usbhs_pkt *pkt, int *is_done) | |||
594 | usbhs_pipe_data_sequence(pipe, pkt->sequence); | 596 | usbhs_pipe_data_sequence(pipe, pkt->sequence); |
595 | pkt->sequence = -1; /* -1 sequence will be ignored */ | 597 | pkt->sequence = -1; /* -1 sequence will be ignored */ |
596 | 598 | ||
599 | usbhs_pipe_set_trans_count_if_bulk(pipe, pkt->length); | ||
597 | usbhs_pipe_enable(pipe); | 600 | usbhs_pipe_enable(pipe); |
598 | usbhsf_rx_irq_ctrl(pipe, 1); | 601 | usbhsf_rx_irq_ctrl(pipe, 1); |
599 | 602 | ||
@@ -795,6 +798,7 @@ static void xfer_work(struct work_struct *work) | |||
795 | dev_dbg(dev, " %s %d (%d/ %d)\n", | 798 | dev_dbg(dev, " %s %d (%d/ %d)\n", |
796 | fifo->name, usbhs_pipe_number(pipe), pkt->length, pkt->zero); | 799 | fifo->name, usbhs_pipe_number(pipe), pkt->length, pkt->zero); |
797 | 800 | ||
801 | usbhs_pipe_set_trans_count_if_bulk(pipe, pkt->trans); | ||
798 | usbhs_pipe_enable(pipe); | 802 | usbhs_pipe_enable(pipe); |
799 | usbhsf_dma_start(pipe, fifo); | 803 | usbhsf_dma_start(pipe, fifo); |
800 | dma_async_issue_pending(chan); | 804 | dma_async_issue_pending(chan); |
diff --git a/drivers/usb/renesas_usbhs/mod.c b/drivers/usb/renesas_usbhs/mod.c index 61933a90e5bf..6a030b931a3b 100644 --- a/drivers/usb/renesas_usbhs/mod.c +++ b/drivers/usb/renesas_usbhs/mod.c | |||
@@ -151,7 +151,7 @@ int usbhs_mod_probe(struct usbhs_priv *priv) | |||
151 | goto mod_init_host_err; | 151 | goto mod_init_host_err; |
152 | 152 | ||
153 | /* irq settings */ | 153 | /* irq settings */ |
154 | ret = request_irq(priv->irq, usbhs_interrupt, | 154 | ret = devm_request_irq(dev, priv->irq, usbhs_interrupt, |
155 | priv->irqflags, dev_name(dev), priv); | 155 | priv->irqflags, dev_name(dev), priv); |
156 | if (ret) { | 156 | if (ret) { |
157 | dev_err(dev, "irq request err\n"); | 157 | dev_err(dev, "irq request err\n"); |
@@ -172,7 +172,6 @@ void usbhs_mod_remove(struct usbhs_priv *priv) | |||
172 | { | 172 | { |
173 | usbhs_mod_host_remove(priv); | 173 | usbhs_mod_host_remove(priv); |
174 | usbhs_mod_gadget_remove(priv); | 174 | usbhs_mod_gadget_remove(priv); |
175 | free_irq(priv->irq, priv); | ||
176 | } | 175 | } |
177 | 176 | ||
178 | /* | 177 | /* |
diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c index 28478ce26c34..dd41f61893ef 100644 --- a/drivers/usb/renesas_usbhs/mod_gadget.c +++ b/drivers/usb/renesas_usbhs/mod_gadget.c | |||
@@ -883,6 +883,16 @@ static int usbhsg_get_frame(struct usb_gadget *gadget) | |||
883 | return usbhs_frame_get_num(priv); | 883 | return usbhs_frame_get_num(priv); |
884 | } | 884 | } |
885 | 885 | ||
886 | static int usbhsg_pullup(struct usb_gadget *gadget, int is_on) | ||
887 | { | ||
888 | struct usbhsg_gpriv *gpriv = usbhsg_gadget_to_gpriv(gadget); | ||
889 | struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv); | ||
890 | |||
891 | usbhs_sys_function_pullup(priv, is_on); | ||
892 | |||
893 | return 0; | ||
894 | } | ||
895 | |||
886 | static int usbhsg_set_selfpowered(struct usb_gadget *gadget, int is_self) | 896 | static int usbhsg_set_selfpowered(struct usb_gadget *gadget, int is_self) |
887 | { | 897 | { |
888 | struct usbhsg_gpriv *gpriv = usbhsg_gadget_to_gpriv(gadget); | 898 | struct usbhsg_gpriv *gpriv = usbhsg_gadget_to_gpriv(gadget); |
@@ -900,6 +910,7 @@ static struct usb_gadget_ops usbhsg_gadget_ops = { | |||
900 | .set_selfpowered = usbhsg_set_selfpowered, | 910 | .set_selfpowered = usbhsg_set_selfpowered, |
901 | .udc_start = usbhsg_gadget_start, | 911 | .udc_start = usbhsg_gadget_start, |
902 | .udc_stop = usbhsg_gadget_stop, | 912 | .udc_stop = usbhsg_gadget_stop, |
913 | .pullup = usbhsg_pullup, | ||
903 | }; | 914 | }; |
904 | 915 | ||
905 | static int usbhsg_start(struct usbhs_priv *priv) | 916 | static int usbhsg_start(struct usbhs_priv *priv) |
diff --git a/drivers/usb/renesas_usbhs/mod_host.c b/drivers/usb/renesas_usbhs/mod_host.c index 069cd765400c..3d3cd6ca2689 100644 --- a/drivers/usb/renesas_usbhs/mod_host.c +++ b/drivers/usb/renesas_usbhs/mod_host.c | |||
@@ -85,6 +85,7 @@ struct usbhsh_ep { | |||
85 | struct usbhsh_device *udev; /* attached udev */ | 85 | struct usbhsh_device *udev; /* attached udev */ |
86 | struct usb_host_endpoint *ep; | 86 | struct usb_host_endpoint *ep; |
87 | struct list_head ep_list; /* list to usbhsh_device */ | 87 | struct list_head ep_list; /* list to usbhsh_device */ |
88 | unsigned int counter; /* pipe attach counter */ | ||
88 | }; | 89 | }; |
89 | 90 | ||
90 | #define USBHSH_DEVICE_MAX 10 /* see DEVADDn / DCPMAXP / PIPEMAXP */ | 91 | #define USBHSH_DEVICE_MAX 10 /* see DEVADDn / DCPMAXP / PIPEMAXP */ |
@@ -271,8 +272,12 @@ static int usbhsh_pipe_attach(struct usbhsh_hpriv *hpriv, | |||
271 | /******************** spin lock ********************/ | 272 | /******************** spin lock ********************/ |
272 | usbhs_lock(priv, flags); | 273 | usbhs_lock(priv, flags); |
273 | 274 | ||
274 | if (unlikely(usbhsh_uep_to_pipe(uep))) { | 275 | /* |
275 | dev_err(dev, "uep already has pipe\n"); | 276 | * if uep has been attached to pipe, |
277 | * reuse it | ||
278 | */ | ||
279 | if (usbhsh_uep_to_pipe(uep)) { | ||
280 | ret = 0; | ||
276 | goto usbhsh_pipe_attach_done; | 281 | goto usbhsh_pipe_attach_done; |
277 | } | 282 | } |
278 | 283 | ||
@@ -320,6 +325,9 @@ static int usbhsh_pipe_attach(struct usbhsh_hpriv *hpriv, | |||
320 | } | 325 | } |
321 | 326 | ||
322 | usbhsh_pipe_attach_done: | 327 | usbhsh_pipe_attach_done: |
328 | if (0 == ret) | ||
329 | uep->counter++; | ||
330 | |||
323 | usbhs_unlock(priv, flags); | 331 | usbhs_unlock(priv, flags); |
324 | /******************** spin unlock ******************/ | 332 | /******************** spin unlock ******************/ |
325 | 333 | ||
@@ -346,7 +354,7 @@ static void usbhsh_pipe_detach(struct usbhsh_hpriv *hpriv, | |||
346 | 354 | ||
347 | if (unlikely(!pipe)) { | 355 | if (unlikely(!pipe)) { |
348 | dev_err(dev, "uep doens't have pipe\n"); | 356 | dev_err(dev, "uep doens't have pipe\n"); |
349 | } else { | 357 | } else if (1 == uep->counter--) { /* last user */ |
350 | struct usb_host_endpoint *ep = usbhsh_uep_to_ep(uep); | 358 | struct usb_host_endpoint *ep = usbhsh_uep_to_ep(uep); |
351 | struct usbhsh_device *udev = usbhsh_uep_to_udev(uep); | 359 | struct usbhsh_device *udev = usbhsh_uep_to_udev(uep); |
352 | 360 | ||
@@ -391,6 +399,7 @@ static int usbhsh_endpoint_attach(struct usbhsh_hpriv *hpriv, | |||
391 | /* | 399 | /* |
392 | * init endpoint | 400 | * init endpoint |
393 | */ | 401 | */ |
402 | uep->counter = 0; | ||
394 | INIT_LIST_HEAD(&uep->ep_list); | 403 | INIT_LIST_HEAD(&uep->ep_list); |
395 | list_add_tail(&uep->ep_list, &udev->ep_list_head); | 404 | list_add_tail(&uep->ep_list, &udev->ep_list_head); |
396 | 405 | ||
@@ -686,9 +695,9 @@ static int usbhsh_queue_push(struct usb_hcd *hcd, | |||
686 | } | 695 | } |
687 | 696 | ||
688 | if (usb_pipein(urb->pipe)) | 697 | if (usb_pipein(urb->pipe)) |
689 | pipe->handler = &usbhs_fifo_pio_pop_handler; | 698 | pipe->handler = &usbhs_fifo_dma_pop_handler; |
690 | else | 699 | else |
691 | pipe->handler = &usbhs_fifo_pio_push_handler; | 700 | pipe->handler = &usbhs_fifo_dma_push_handler; |
692 | 701 | ||
693 | buf = (void *)(urb->transfer_buffer + urb->actual_length); | 702 | buf = (void *)(urb->transfer_buffer + urb->actual_length); |
694 | len = urb->transfer_buffer_length - urb->actual_length; | 703 | len = urb->transfer_buffer_length - urb->actual_length; |
@@ -921,6 +930,19 @@ static int usbhsh_dcp_queue_push(struct usb_hcd *hcd, | |||
921 | */ | 930 | */ |
922 | static int usbhsh_dma_map_ctrl(struct usbhs_pkt *pkt, int map) | 931 | static int usbhsh_dma_map_ctrl(struct usbhs_pkt *pkt, int map) |
923 | { | 932 | { |
933 | if (map) { | ||
934 | struct usbhsh_request *ureq = usbhsh_pkt_to_ureq(pkt); | ||
935 | struct urb *urb = ureq->urb; | ||
936 | |||
937 | /* it can not use scatter/gather */ | ||
938 | if (urb->num_sgs) | ||
939 | return -EINVAL; | ||
940 | |||
941 | pkt->dma = urb->transfer_dma; | ||
942 | if (!pkt->dma) | ||
943 | return -EINVAL; | ||
944 | } | ||
945 | |||
924 | return 0; | 946 | return 0; |
925 | } | 947 | } |
926 | 948 | ||
@@ -946,7 +968,6 @@ static int usbhsh_urb_enqueue(struct usb_hcd *hcd, | |||
946 | struct usb_host_endpoint *ep = urb->ep; | 968 | struct usb_host_endpoint *ep = urb->ep; |
947 | struct usbhsh_device *new_udev = NULL; | 969 | struct usbhsh_device *new_udev = NULL; |
948 | int is_dir_in = usb_pipein(urb->pipe); | 970 | int is_dir_in = usb_pipein(urb->pipe); |
949 | int i; | ||
950 | int ret; | 971 | int ret; |
951 | 972 | ||
952 | dev_dbg(dev, "%s (%s)\n", __func__, is_dir_in ? "in" : "out"); | 973 | dev_dbg(dev, "%s (%s)\n", __func__, is_dir_in ? "in" : "out"); |
@@ -992,13 +1013,7 @@ static int usbhsh_urb_enqueue(struct usb_hcd *hcd, | |||
992 | * attach pipe to endpoint | 1013 | * attach pipe to endpoint |
993 | * see [image of mod_host] | 1014 | * see [image of mod_host] |
994 | */ | 1015 | */ |
995 | for (i = 0; i < 1024; i++) { | 1016 | ret = usbhsh_pipe_attach(hpriv, urb); |
996 | ret = usbhsh_pipe_attach(hpriv, urb); | ||
997 | if (ret < 0) | ||
998 | msleep(100); | ||
999 | else | ||
1000 | break; | ||
1001 | } | ||
1002 | if (ret < 0) { | 1017 | if (ret < 0) { |
1003 | dev_err(dev, "pipe attach failed\n"); | 1018 | dev_err(dev, "pipe attach failed\n"); |
1004 | goto usbhsh_urb_enqueue_error_free_endpoint; | 1019 | goto usbhsh_urb_enqueue_error_free_endpoint; |
@@ -1072,8 +1087,6 @@ static void usbhsh_endpoint_disable(struct usb_hcd *hcd, | |||
1072 | static int usbhsh_hub_status_data(struct usb_hcd *hcd, char *buf) | 1087 | static int usbhsh_hub_status_data(struct usb_hcd *hcd, char *buf) |
1073 | { | 1088 | { |
1074 | struct usbhsh_hpriv *hpriv = usbhsh_hcd_to_hpriv(hcd); | 1089 | struct usbhsh_hpriv *hpriv = usbhsh_hcd_to_hpriv(hcd); |
1075 | struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); | ||
1076 | struct device *dev = usbhs_priv_to_dev(priv); | ||
1077 | int roothub_id = 1; /* only 1 root hub */ | 1090 | int roothub_id = 1; /* only 1 root hub */ |
1078 | 1091 | ||
1079 | /* | 1092 | /* |
@@ -1085,8 +1098,6 @@ static int usbhsh_hub_status_data(struct usb_hcd *hcd, char *buf) | |||
1085 | else | 1098 | else |
1086 | *buf = 0; | 1099 | *buf = 0; |
1087 | 1100 | ||
1088 | dev_dbg(dev, "%s (%02x)\n", __func__, *buf); | ||
1089 | |||
1090 | return !!(*buf); | 1101 | return !!(*buf); |
1091 | } | 1102 | } |
1092 | 1103 | ||
diff --git a/drivers/usb/renesas_usbhs/pipe.c b/drivers/usb/renesas_usbhs/pipe.c index 122526cfd32b..7926e1c700f1 100644 --- a/drivers/usb/renesas_usbhs/pipe.c +++ b/drivers/usb/renesas_usbhs/pipe.c | |||
@@ -93,6 +93,82 @@ static void usbhsp_pipe_cfg_set(struct usbhs_pipe *pipe, u16 mask, u16 val) | |||
93 | } | 93 | } |
94 | 94 | ||
95 | /* | 95 | /* |
96 | * PIPEnTRN/PIPEnTRE functions | ||
97 | */ | ||
98 | static void usbhsp_pipe_trn_set(struct usbhs_pipe *pipe, u16 mask, u16 val) | ||
99 | { | ||
100 | struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); | ||
101 | struct device *dev = usbhs_priv_to_dev(priv); | ||
102 | int num = usbhs_pipe_number(pipe); | ||
103 | u16 reg; | ||
104 | |||
105 | /* | ||
106 | * It is impossible to calculate address, | ||
107 | * since PIPEnTRN addresses were mapped randomly. | ||
108 | */ | ||
109 | #define CASE_PIPExTRN(a) \ | ||
110 | case 0x ## a: \ | ||
111 | reg = PIPE ## a ## TRN; \ | ||
112 | break; | ||
113 | |||
114 | switch (num) { | ||
115 | CASE_PIPExTRN(1); | ||
116 | CASE_PIPExTRN(2); | ||
117 | CASE_PIPExTRN(3); | ||
118 | CASE_PIPExTRN(4); | ||
119 | CASE_PIPExTRN(5); | ||
120 | CASE_PIPExTRN(B); | ||
121 | CASE_PIPExTRN(C); | ||
122 | CASE_PIPExTRN(D); | ||
123 | CASE_PIPExTRN(E); | ||
124 | CASE_PIPExTRN(F); | ||
125 | CASE_PIPExTRN(9); | ||
126 | CASE_PIPExTRN(A); | ||
127 | default: | ||
128 | dev_err(dev, "unknown pipe (%d)\n", num); | ||
129 | return; | ||
130 | } | ||
131 | __usbhsp_pipe_xxx_set(pipe, 0, reg, mask, val); | ||
132 | } | ||
133 | |||
134 | static void usbhsp_pipe_tre_set(struct usbhs_pipe *pipe, u16 mask, u16 val) | ||
135 | { | ||
136 | struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); | ||
137 | struct device *dev = usbhs_priv_to_dev(priv); | ||
138 | int num = usbhs_pipe_number(pipe); | ||
139 | u16 reg; | ||
140 | |||
141 | /* | ||
142 | * It is impossible to calculate address, | ||
143 | * since PIPEnTRE addresses were mapped randomly. | ||
144 | */ | ||
145 | #define CASE_PIPExTRE(a) \ | ||
146 | case 0x ## a: \ | ||
147 | reg = PIPE ## a ## TRE; \ | ||
148 | break; | ||
149 | |||
150 | switch (num) { | ||
151 | CASE_PIPExTRE(1); | ||
152 | CASE_PIPExTRE(2); | ||
153 | CASE_PIPExTRE(3); | ||
154 | CASE_PIPExTRE(4); | ||
155 | CASE_PIPExTRE(5); | ||
156 | CASE_PIPExTRE(B); | ||
157 | CASE_PIPExTRE(C); | ||
158 | CASE_PIPExTRE(D); | ||
159 | CASE_PIPExTRE(E); | ||
160 | CASE_PIPExTRE(F); | ||
161 | CASE_PIPExTRE(9); | ||
162 | CASE_PIPExTRE(A); | ||
163 | default: | ||
164 | dev_err(dev, "unknown pipe (%d)\n", num); | ||
165 | return; | ||
166 | } | ||
167 | |||
168 | __usbhsp_pipe_xxx_set(pipe, 0, reg, mask, val); | ||
169 | } | ||
170 | |||
171 | /* | ||
96 | * PIPEBUF | 172 | * PIPEBUF |
97 | */ | 173 | */ |
98 | static void usbhsp_pipe_buf_set(struct usbhs_pipe *pipe, u16 mask, u16 val) | 174 | static void usbhsp_pipe_buf_set(struct usbhs_pipe *pipe, u16 mask, u16 val) |
@@ -264,6 +340,31 @@ int usbhs_pipe_is_stall(struct usbhs_pipe *pipe) | |||
264 | return (int)(pid == PID_STALL10 || pid == PID_STALL11); | 340 | return (int)(pid == PID_STALL10 || pid == PID_STALL11); |
265 | } | 341 | } |
266 | 342 | ||
343 | void usbhs_pipe_set_trans_count_if_bulk(struct usbhs_pipe *pipe, int len) | ||
344 | { | ||
345 | if (!usbhs_pipe_type_is(pipe, USB_ENDPOINT_XFER_BULK)) | ||
346 | return; | ||
347 | |||
348 | /* | ||
349 | * clear and disable transfer counter for IN/OUT pipe | ||
350 | */ | ||
351 | usbhsp_pipe_tre_set(pipe, TRCLR | TRENB, TRCLR); | ||
352 | |||
353 | /* | ||
354 | * Only IN direction bulk pipe can use transfer count. | ||
355 | * Without using this function, | ||
356 | * received data will break if it was large data size. | ||
357 | * see PIPEnTRN/PIPEnTRE for detail | ||
358 | */ | ||
359 | if (usbhs_pipe_is_dir_in(pipe)) { | ||
360 | int maxp = usbhs_pipe_get_maxpacket(pipe); | ||
361 | |||
362 | usbhsp_pipe_trn_set(pipe, 0xffff, DIV_ROUND_UP(len, maxp)); | ||
363 | usbhsp_pipe_tre_set(pipe, TRENB, TRENB); /* enable */ | ||
364 | } | ||
365 | } | ||
366 | |||
367 | |||
267 | /* | 368 | /* |
268 | * pipe setup | 369 | * pipe setup |
269 | */ | 370 | */ |
diff --git a/drivers/usb/renesas_usbhs/pipe.h b/drivers/usb/renesas_usbhs/pipe.h index 3d80c7b1fd1b..b476fde955bf 100644 --- a/drivers/usb/renesas_usbhs/pipe.h +++ b/drivers/usb/renesas_usbhs/pipe.h | |||
@@ -88,6 +88,7 @@ void usbhs_pipe_enable(struct usbhs_pipe *pipe); | |||
88 | void usbhs_pipe_disable(struct usbhs_pipe *pipe); | 88 | void usbhs_pipe_disable(struct usbhs_pipe *pipe); |
89 | void usbhs_pipe_stall(struct usbhs_pipe *pipe); | 89 | void usbhs_pipe_stall(struct usbhs_pipe *pipe); |
90 | int usbhs_pipe_is_stall(struct usbhs_pipe *pipe); | 90 | int usbhs_pipe_is_stall(struct usbhs_pipe *pipe); |
91 | void usbhs_pipe_set_trans_count_if_bulk(struct usbhs_pipe *pipe, int len); | ||
91 | void usbhs_pipe_select_fifo(struct usbhs_pipe *pipe, struct usbhs_fifo *fifo); | 92 | void usbhs_pipe_select_fifo(struct usbhs_pipe *pipe, struct usbhs_fifo *fifo); |
92 | void usbhs_pipe_config_update(struct usbhs_pipe *pipe, u16 devsel, | 93 | void usbhs_pipe_config_update(struct usbhs_pipe *pipe, u16 devsel, |
93 | u16 epnum, u16 maxp); | 94 | u16 epnum, u16 maxp); |
diff --git a/drivers/usb/serial/aircable.c b/drivers/usb/serial/aircable.c index 54e1bb6372e7..6d110a3bc7e7 100644 --- a/drivers/usb/serial/aircable.c +++ b/drivers/usb/serial/aircable.c | |||
@@ -68,10 +68,6 @@ | |||
68 | #define THROTTLED 0x01 | 68 | #define THROTTLED 0x01 |
69 | #define ACTUALLY_THROTTLED 0x02 | 69 | #define ACTUALLY_THROTTLED 0x02 |
70 | 70 | ||
71 | /* | ||
72 | * Version Information | ||
73 | */ | ||
74 | #define DRIVER_VERSION "v2.0" | ||
75 | #define DRIVER_AUTHOR "Naranjo, Manuel Francisco <naranjo.manuel@gmail.com>, Johan Hovold <jhovold@gmail.com>" | 71 | #define DRIVER_AUTHOR "Naranjo, Manuel Francisco <naranjo.manuel@gmail.com>, Johan Hovold <jhovold@gmail.com>" |
76 | #define DRIVER_DESC "AIRcable USB Driver" | 72 | #define DRIVER_DESC "AIRcable USB Driver" |
77 | 73 | ||
@@ -192,5 +188,4 @@ module_usb_serial_driver(serial_drivers, id_table); | |||
192 | 188 | ||
193 | MODULE_AUTHOR(DRIVER_AUTHOR); | 189 | MODULE_AUTHOR(DRIVER_AUTHOR); |
194 | MODULE_DESCRIPTION(DRIVER_DESC); | 190 | MODULE_DESCRIPTION(DRIVER_DESC); |
195 | MODULE_VERSION(DRIVER_VERSION); | ||
196 | MODULE_LICENSE("GPL"); | 191 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index bd50a8a41a0f..a88882c0e237 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c | |||
@@ -37,11 +37,6 @@ | |||
37 | #include <linux/mutex.h> | 37 | #include <linux/mutex.h> |
38 | #include <linux/spinlock.h> | 38 | #include <linux/spinlock.h> |
39 | 39 | ||
40 | /* | ||
41 | * Version information | ||
42 | */ | ||
43 | |||
44 | #define DRIVER_VERSION "v0.7" | ||
45 | #define DRIVER_AUTHOR "Bart Hartgers <bart.hartgers+ark3116@gmail.com>" | 40 | #define DRIVER_AUTHOR "Bart Hartgers <bart.hartgers+ark3116@gmail.com>" |
46 | #define DRIVER_DESC "USB ARK3116 serial/IrDA driver" | 41 | #define DRIVER_DESC "USB ARK3116 serial/IrDA driver" |
47 | #define DRIVER_DEV_DESC "ARK3116 RS232/IrDA" | 42 | #define DRIVER_DEV_DESC "ARK3116 RS232/IrDA" |
diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c index ea29556f0d72..b72a4c166705 100644 --- a/drivers/usb/serial/belkin_sa.c +++ b/drivers/usb/serial/belkin_sa.c | |||
@@ -37,10 +37,6 @@ | |||
37 | #include <linux/usb/serial.h> | 37 | #include <linux/usb/serial.h> |
38 | #include "belkin_sa.h" | 38 | #include "belkin_sa.h" |
39 | 39 | ||
40 | /* | ||
41 | * Version Information | ||
42 | */ | ||
43 | #define DRIVER_VERSION "v1.3" | ||
44 | #define DRIVER_AUTHOR "William Greathouse <wgreathouse@smva.com>" | 40 | #define DRIVER_AUTHOR "William Greathouse <wgreathouse@smva.com>" |
45 | #define DRIVER_DESC "USB Belkin Serial converter driver" | 41 | #define DRIVER_DESC "USB Belkin Serial converter driver" |
46 | 42 | ||
@@ -509,5 +505,4 @@ module_usb_serial_driver(serial_drivers, id_table); | |||
509 | 505 | ||
510 | MODULE_AUTHOR(DRIVER_AUTHOR); | 506 | MODULE_AUTHOR(DRIVER_AUTHOR); |
511 | MODULE_DESCRIPTION(DRIVER_DESC); | 507 | MODULE_DESCRIPTION(DRIVER_DESC); |
512 | MODULE_VERSION(DRIVER_VERSION); | ||
513 | MODULE_LICENSE("GPL"); | 508 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/bus.c b/drivers/usb/serial/bus.c index c15f2e7cefc7..37decb13d7eb 100644 --- a/drivers/usb/serial/bus.c +++ b/drivers/usb/serial/bus.c | |||
@@ -121,7 +121,6 @@ static int usb_serial_device_remove(struct device *dev) | |||
121 | return retval; | 121 | return retval; |
122 | } | 122 | } |
123 | 123 | ||
124 | #ifdef CONFIG_HOTPLUG | ||
125 | static ssize_t store_new_id(struct device_driver *driver, | 124 | static ssize_t store_new_id(struct device_driver *driver, |
126 | const char *buf, size_t count) | 125 | const char *buf, size_t count) |
127 | { | 126 | { |
@@ -159,15 +158,6 @@ static void free_dynids(struct usb_serial_driver *drv) | |||
159 | spin_unlock(&drv->dynids.lock); | 158 | spin_unlock(&drv->dynids.lock); |
160 | } | 159 | } |
161 | 160 | ||
162 | #else | ||
163 | static struct driver_attribute drv_attrs[] = { | ||
164 | __ATTR_NULL, | ||
165 | }; | ||
166 | static inline void free_dynids(struct usb_serial_driver *drv) | ||
167 | { | ||
168 | } | ||
169 | #endif | ||
170 | |||
171 | struct bus_type usb_serial_bus_type = { | 161 | struct bus_type usb_serial_bus_type = { |
172 | .name = "usb-serial", | 162 | .name = "usb-serial", |
173 | .match = usb_serial_device_match, | 163 | .match = usb_serial_device_match, |
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index eb033fc92a15..f14736f647ff 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
@@ -24,10 +24,6 @@ | |||
24 | #include <linux/uaccess.h> | 24 | #include <linux/uaccess.h> |
25 | #include <linux/usb/serial.h> | 25 | #include <linux/usb/serial.h> |
26 | 26 | ||
27 | /* | ||
28 | * Version Information | ||
29 | */ | ||
30 | #define DRIVER_VERSION "v0.09" | ||
31 | #define DRIVER_DESC "Silicon Labs CP210x RS232 serial adaptor driver" | 27 | #define DRIVER_DESC "Silicon Labs CP210x RS232 serial adaptor driver" |
32 | 28 | ||
33 | /* | 29 | /* |
@@ -35,8 +31,7 @@ | |||
35 | */ | 31 | */ |
36 | static int cp210x_open(struct tty_struct *tty, struct usb_serial_port *); | 32 | static int cp210x_open(struct tty_struct *tty, struct usb_serial_port *); |
37 | static void cp210x_close(struct usb_serial_port *); | 33 | static void cp210x_close(struct usb_serial_port *); |
38 | static void cp210x_get_termios(struct tty_struct *, | 34 | static void cp210x_get_termios(struct tty_struct *, struct usb_serial_port *); |
39 | struct usb_serial_port *port); | ||
40 | static void cp210x_get_termios_port(struct usb_serial_port *port, | 35 | static void cp210x_get_termios_port(struct usb_serial_port *port, |
41 | unsigned int *cflagp, unsigned int *baudp); | 36 | unsigned int *cflagp, unsigned int *baudp); |
42 | static void cp210x_change_speed(struct tty_struct *, struct usb_serial_port *, | 37 | static void cp210x_change_speed(struct tty_struct *, struct usb_serial_port *, |
@@ -118,6 +113,7 @@ static const struct usb_device_id id_table[] = { | |||
118 | { USB_DEVICE(0x10C4, 0x8477) }, /* Balluff RFID */ | 113 | { USB_DEVICE(0x10C4, 0x8477) }, /* Balluff RFID */ |
119 | { USB_DEVICE(0x10C4, 0x85EA) }, /* AC-Services IBUS-IF */ | 114 | { USB_DEVICE(0x10C4, 0x85EA) }, /* AC-Services IBUS-IF */ |
120 | { USB_DEVICE(0x10C4, 0x85EB) }, /* AC-Services CIS-IBUS */ | 115 | { USB_DEVICE(0x10C4, 0x85EB) }, /* AC-Services CIS-IBUS */ |
116 | { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ | ||
121 | { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ | 117 | { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ |
122 | { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ | 118 | { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ |
123 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ | 119 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ |
@@ -169,7 +165,7 @@ struct cp210x_serial_private { | |||
169 | static struct usb_serial_driver cp210x_device = { | 165 | static struct usb_serial_driver cp210x_device = { |
170 | .driver = { | 166 | .driver = { |
171 | .owner = THIS_MODULE, | 167 | .owner = THIS_MODULE, |
172 | .name = "cp210x", | 168 | .name = "cp210x", |
173 | }, | 169 | }, |
174 | .id_table = id_table, | 170 | .id_table = id_table, |
175 | .num_ports = 1, | 171 | .num_ports = 1, |
@@ -179,7 +175,7 @@ static struct usb_serial_driver cp210x_device = { | |||
179 | .close = cp210x_close, | 175 | .close = cp210x_close, |
180 | .break_ctl = cp210x_break_ctl, | 176 | .break_ctl = cp210x_break_ctl, |
181 | .set_termios = cp210x_set_termios, | 177 | .set_termios = cp210x_set_termios, |
182 | .tiocmget = cp210x_tiocmget, | 178 | .tiocmget = cp210x_tiocmget, |
183 | .tiocmset = cp210x_tiocmset, | 179 | .tiocmset = cp210x_tiocmset, |
184 | .attach = cp210x_startup, | 180 | .attach = cp210x_startup, |
185 | .release = cp210x_release, | 181 | .release = cp210x_release, |
@@ -281,7 +277,7 @@ static int cp210x_get_config(struct usb_serial_port *port, u8 request, | |||
281 | int result, i, length; | 277 | int result, i, length; |
282 | 278 | ||
283 | /* Number of integers required to contain the array */ | 279 | /* Number of integers required to contain the array */ |
284 | length = (((size - 1) | 3) + 1)/4; | 280 | length = (((size - 1) | 3) + 1) / 4; |
285 | 281 | ||
286 | buf = kcalloc(length, sizeof(__le32), GFP_KERNEL); | 282 | buf = kcalloc(length, sizeof(__le32), GFP_KERNEL); |
287 | if (!buf) { | 283 | if (!buf) { |
@@ -328,12 +324,11 @@ static int cp210x_set_config(struct usb_serial_port *port, u8 request, | |||
328 | int result, i, length; | 324 | int result, i, length; |
329 | 325 | ||
330 | /* Number of integers required to contain the array */ | 326 | /* Number of integers required to contain the array */ |
331 | length = (((size - 1) | 3) + 1)/4; | 327 | length = (((size - 1) | 3) + 1) / 4; |
332 | 328 | ||
333 | buf = kmalloc(length * sizeof(__le32), GFP_KERNEL); | 329 | buf = kmalloc(length * sizeof(__le32), GFP_KERNEL); |
334 | if (!buf) { | 330 | if (!buf) { |
335 | dev_err(&port->dev, "%s - out of memory.\n", | 331 | dev_err(&port->dev, "%s - out of memory.\n", __func__); |
336 | __func__); | ||
337 | return -ENOMEM; | 332 | return -ENOMEM; |
338 | } | 333 | } |
339 | 334 | ||
@@ -384,7 +379,8 @@ static inline int cp210x_set_config_single(struct usb_serial_port *port, | |||
384 | * cp210x_quantise_baudrate | 379 | * cp210x_quantise_baudrate |
385 | * Quantises the baud rate as per AN205 Table 1 | 380 | * Quantises the baud rate as per AN205 Table 1 |
386 | */ | 381 | */ |
387 | static unsigned int cp210x_quantise_baudrate(unsigned int baud) { | 382 | static unsigned int cp210x_quantise_baudrate(unsigned int baud) |
383 | { | ||
388 | if (baud <= 300) | 384 | if (baud <= 300) |
389 | baud = 300; | 385 | baud = 300; |
390 | else if (baud <= 600) baud = 600; | 386 | else if (baud <= 600) baud = 600; |
@@ -467,9 +463,7 @@ static void cp210x_get_termios(struct tty_struct *tty, | |||
467 | cp210x_get_termios_port(tty->driver_data, | 463 | cp210x_get_termios_port(tty->driver_data, |
468 | &tty->termios.c_cflag, &baud); | 464 | &tty->termios.c_cflag, &baud); |
469 | tty_encode_baud_rate(tty, baud, baud); | 465 | tty_encode_baud_rate(tty, baud, baud); |
470 | } | 466 | } else { |
471 | |||
472 | else { | ||
473 | unsigned int cflag; | 467 | unsigned int cflag; |
474 | cflag = 0; | 468 | cflag = 0; |
475 | cp210x_get_termios_port(port, &cflag, &baud); | 469 | cp210x_get_termios_port(port, &cflag, &baud); |
@@ -693,8 +687,8 @@ static void cp210x_set_termios(struct tty_struct *tty, | |||
693 | break;*/ | 687 | break;*/ |
694 | default: | 688 | default: |
695 | dev_dbg(dev, "cp210x driver does not support the number of bits requested, using 8 bit mode\n"); | 689 | dev_dbg(dev, "cp210x driver does not support the number of bits requested, using 8 bit mode\n"); |
696 | bits |= BITS_DATA_8; | 690 | bits |= BITS_DATA_8; |
697 | break; | 691 | break; |
698 | } | 692 | } |
699 | if (cp210x_set_config(port, CP210X_SET_LINE_CTL, &bits, 2)) | 693 | if (cp210x_set_config(port, CP210X_SET_LINE_CTL, &bits, 2)) |
700 | dev_dbg(dev, "Number of data bits requested not supported by device\n"); | 694 | dev_dbg(dev, "Number of data bits requested not supported by device\n"); |
@@ -767,7 +761,7 @@ static void cp210x_set_termios(struct tty_struct *tty, | |||
767 | 761 | ||
768 | } | 762 | } |
769 | 763 | ||
770 | static int cp210x_tiocmset (struct tty_struct *tty, | 764 | static int cp210x_tiocmset(struct tty_struct *tty, |
771 | unsigned int set, unsigned int clear) | 765 | unsigned int set, unsigned int clear) |
772 | { | 766 | { |
773 | struct usb_serial_port *port = tty->driver_data; | 767 | struct usb_serial_port *port = tty->driver_data; |
@@ -809,7 +803,7 @@ static void cp210x_dtr_rts(struct usb_serial_port *p, int on) | |||
809 | cp210x_tiocmset_port(p, 0, TIOCM_DTR|TIOCM_RTS); | 803 | cp210x_tiocmset_port(p, 0, TIOCM_DTR|TIOCM_RTS); |
810 | } | 804 | } |
811 | 805 | ||
812 | static int cp210x_tiocmget (struct tty_struct *tty) | 806 | static int cp210x_tiocmget(struct tty_struct *tty) |
813 | { | 807 | { |
814 | struct usb_serial_port *port = tty->driver_data; | 808 | struct usb_serial_port *port = tty->driver_data; |
815 | unsigned int control; | 809 | unsigned int control; |
@@ -829,7 +823,7 @@ static int cp210x_tiocmget (struct tty_struct *tty) | |||
829 | return result; | 823 | return result; |
830 | } | 824 | } |
831 | 825 | ||
832 | static void cp210x_break_ctl (struct tty_struct *tty, int break_state) | 826 | static void cp210x_break_ctl(struct tty_struct *tty, int break_state) |
833 | { | 827 | { |
834 | struct usb_serial_port *port = tty->driver_data; | 828 | struct usb_serial_port *port = tty->driver_data; |
835 | unsigned int state; | 829 | unsigned int state; |
@@ -874,5 +868,4 @@ static void cp210x_release(struct usb_serial *serial) | |||
874 | module_usb_serial_driver(serial_drivers, id_table); | 868 | module_usb_serial_driver(serial_drivers, id_table); |
875 | 869 | ||
876 | MODULE_DESCRIPTION(DRIVER_DESC); | 870 | MODULE_DESCRIPTION(DRIVER_DESC); |
877 | MODULE_VERSION(DRIVER_VERSION); | ||
878 | MODULE_LICENSE("GPL"); | 871 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c index 4ee77dcbe690..69a4fa1cee25 100644 --- a/drivers/usb/serial/cyberjack.c +++ b/drivers/usb/serial/cyberjack.c | |||
@@ -43,10 +43,6 @@ | |||
43 | 43 | ||
44 | #define CYBERJACK_LOCAL_BUF_SIZE 32 | 44 | #define CYBERJACK_LOCAL_BUF_SIZE 32 |
45 | 45 | ||
46 | /* | ||
47 | * Version Information | ||
48 | */ | ||
49 | #define DRIVER_VERSION "v1.01" | ||
50 | #define DRIVER_AUTHOR "Matthias Bruestle" | 46 | #define DRIVER_AUTHOR "Matthias Bruestle" |
51 | #define DRIVER_DESC "REINER SCT cyberJack pinpad/e-com USB Chipcard Reader Driver" | 47 | #define DRIVER_DESC "REINER SCT cyberJack pinpad/e-com USB Chipcard Reader Driver" |
52 | 48 | ||
@@ -441,5 +437,4 @@ module_usb_serial_driver(serial_drivers, id_table); | |||
441 | 437 | ||
442 | MODULE_AUTHOR(DRIVER_AUTHOR); | 438 | MODULE_AUTHOR(DRIVER_AUTHOR); |
443 | MODULE_DESCRIPTION(DRIVER_DESC); | 439 | MODULE_DESCRIPTION(DRIVER_DESC); |
444 | MODULE_VERSION(DRIVER_VERSION); | ||
445 | MODULE_LICENSE("GPL"); | 440 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index f0da1279c114..fd8c35fd452e 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
@@ -50,10 +50,6 @@ static bool stats; | |||
50 | static int interval; | 50 | static int interval; |
51 | static bool unstable_bauds; | 51 | static bool unstable_bauds; |
52 | 52 | ||
53 | /* | ||
54 | * Version Information | ||
55 | */ | ||
56 | #define DRIVER_VERSION "v1.10" | ||
57 | #define DRIVER_AUTHOR "Lonnie Mendez <dignome@gmail.com>, Neil Whelchel <koyama@firstlight.net>" | 53 | #define DRIVER_AUTHOR "Lonnie Mendez <dignome@gmail.com>, Neil Whelchel <koyama@firstlight.net>" |
58 | #define DRIVER_DESC "Cypress USB to Serial Driver" | 54 | #define DRIVER_DESC "Cypress USB to Serial Driver" |
59 | 55 | ||
@@ -1303,7 +1299,6 @@ module_usb_serial_driver(serial_drivers, id_table_combined); | |||
1303 | 1299 | ||
1304 | MODULE_AUTHOR(DRIVER_AUTHOR); | 1300 | MODULE_AUTHOR(DRIVER_AUTHOR); |
1305 | MODULE_DESCRIPTION(DRIVER_DESC); | 1301 | MODULE_DESCRIPTION(DRIVER_DESC); |
1306 | MODULE_VERSION(DRIVER_VERSION); | ||
1307 | MODULE_LICENSE("GPL"); | 1302 | MODULE_LICENSE("GPL"); |
1308 | 1303 | ||
1309 | module_param(stats, bool, S_IRUGO | S_IWUSR); | 1304 | module_param(stats, bool, S_IRUGO | S_IWUSR); |
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index b50fa1c6d885..45d4af62967f 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c | |||
@@ -32,10 +32,6 @@ | |||
32 | 32 | ||
33 | /* Defines */ | 33 | /* Defines */ |
34 | 34 | ||
35 | /* | ||
36 | * Version Information | ||
37 | */ | ||
38 | #define DRIVER_VERSION "v1.80.1.2" | ||
39 | #define DRIVER_AUTHOR "Peter Berger <pberger@brimson.com>, Al Borchers <borchers@steinerpoint.com>" | 35 | #define DRIVER_AUTHOR "Peter Berger <pberger@brimson.com>, Al Borchers <borchers@steinerpoint.com>" |
40 | #define DRIVER_DESC "Digi AccelePort USB-2/USB-4 Serial Converter driver" | 36 | #define DRIVER_DESC "Digi AccelePort USB-2/USB-4 Serial Converter driver" |
41 | 37 | ||
diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c index 43ede4a1e12c..0f658618db13 100644 --- a/drivers/usb/serial/empeg.c +++ b/drivers/usb/serial/empeg.c | |||
@@ -28,10 +28,6 @@ | |||
28 | #include <linux/usb.h> | 28 | #include <linux/usb.h> |
29 | #include <linux/usb/serial.h> | 29 | #include <linux/usb/serial.h> |
30 | 30 | ||
31 | /* | ||
32 | * Version Information | ||
33 | */ | ||
34 | #define DRIVER_VERSION "v1.3" | ||
35 | #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Gary Brubaker <xavyer@ix.netcom.com>" | 31 | #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Gary Brubaker <xavyer@ix.netcom.com>" |
36 | #define DRIVER_DESC "USB Empeg Mark I/II Driver" | 32 | #define DRIVER_DESC "USB Empeg Mark I/II Driver" |
37 | 33 | ||
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index be845873e23d..0a373b3ae96a 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -73,7 +73,6 @@ struct ftdi_private { | |||
73 | char prev_status; /* Used for TIOCMIWAIT */ | 73 | char prev_status; /* Used for TIOCMIWAIT */ |
74 | bool dev_gone; /* Used to abort TIOCMIWAIT */ | 74 | bool dev_gone; /* Used to abort TIOCMIWAIT */ |
75 | char transmit_empty; /* If transmitter is empty or not */ | 75 | char transmit_empty; /* If transmitter is empty or not */ |
76 | struct usb_serial_port *port; | ||
77 | __u16 interface; /* FT2232C, FT2232H or FT4232H port interface | 76 | __u16 interface; /* FT2232C, FT2232H or FT4232H port interface |
78 | (0 for FT232/245) */ | 77 | (0 for FT232/245) */ |
79 | 78 | ||
@@ -192,6 +191,7 @@ static struct usb_device_id id_table_combined [] = { | |||
192 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) }, | 191 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) }, |
193 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) }, | 192 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) }, |
194 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) }, | 193 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) }, |
194 | { USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) }, | ||
195 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, | 195 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, |
196 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, | 196 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, |
197 | { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) }, | 197 | { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) }, |
@@ -923,6 +923,9 @@ static int ftdi_get_icount(struct tty_struct *tty, | |||
923 | static int ftdi_ioctl(struct tty_struct *tty, | 923 | static int ftdi_ioctl(struct tty_struct *tty, |
924 | unsigned int cmd, unsigned long arg); | 924 | unsigned int cmd, unsigned long arg); |
925 | static void ftdi_break_ctl(struct tty_struct *tty, int break_state); | 925 | static void ftdi_break_ctl(struct tty_struct *tty, int break_state); |
926 | static int ftdi_chars_in_buffer(struct tty_struct *tty); | ||
927 | static int ftdi_get_modem_status(struct tty_struct *tty, | ||
928 | unsigned char status[2]); | ||
926 | 929 | ||
927 | static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base); | 930 | static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base); |
928 | static unsigned short int ftdi_232am_baud_to_divisor(int baud); | 931 | static unsigned short int ftdi_232am_baud_to_divisor(int baud); |
@@ -957,6 +960,7 @@ static struct usb_serial_driver ftdi_sio_device = { | |||
957 | .ioctl = ftdi_ioctl, | 960 | .ioctl = ftdi_ioctl, |
958 | .set_termios = ftdi_set_termios, | 961 | .set_termios = ftdi_set_termios, |
959 | .break_ctl = ftdi_break_ctl, | 962 | .break_ctl = ftdi_break_ctl, |
963 | .chars_in_buffer = ftdi_chars_in_buffer, | ||
960 | }; | 964 | }; |
961 | 965 | ||
962 | static struct usb_serial_driver * const serial_drivers[] = { | 966 | static struct usb_serial_driver * const serial_drivers[] = { |
@@ -1090,6 +1094,7 @@ static int update_mctrl(struct usb_serial_port *port, unsigned int set, | |||
1090 | __func__, | 1094 | __func__, |
1091 | (set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged", | 1095 | (set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged", |
1092 | (set & TIOCM_RTS) ? "HIGH" : (clear & TIOCM_RTS) ? "LOW" : "unchanged"); | 1096 | (set & TIOCM_RTS) ? "HIGH" : (clear & TIOCM_RTS) ? "LOW" : "unchanged"); |
1097 | rv = usb_translate_errors(rv); | ||
1093 | } else { | 1098 | } else { |
1094 | dev_dbg(dev, "%s - DTR %s, RTS %s\n", __func__, | 1099 | dev_dbg(dev, "%s - DTR %s, RTS %s\n", __func__, |
1095 | (set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged", | 1100 | (set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged", |
@@ -1682,7 +1687,6 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port) | |||
1682 | 1687 | ||
1683 | kref_init(&priv->kref); | 1688 | kref_init(&priv->kref); |
1684 | mutex_init(&priv->cfg_lock); | 1689 | mutex_init(&priv->cfg_lock); |
1685 | memset(&priv->icount, 0x00, sizeof(priv->icount)); | ||
1686 | init_waitqueue_head(&priv->delta_msr_wait); | 1690 | init_waitqueue_head(&priv->delta_msr_wait); |
1687 | 1691 | ||
1688 | priv->flags = ASYNC_LOW_LATENCY; | 1692 | priv->flags = ASYNC_LOW_LATENCY; |
@@ -1691,7 +1695,6 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port) | |||
1691 | if (quirk && quirk->port_probe) | 1695 | if (quirk && quirk->port_probe) |
1692 | quirk->port_probe(priv); | 1696 | quirk->port_probe(priv); |
1693 | 1697 | ||
1694 | priv->port = port; | ||
1695 | usb_set_serial_port_data(port, priv); | 1698 | usb_set_serial_port_data(port, priv); |
1696 | 1699 | ||
1697 | ftdi_determine_type(port); | 1700 | ftdi_determine_type(port); |
@@ -1781,7 +1784,7 @@ static int ftdi_8u2232c_probe(struct usb_serial *serial) | |||
1781 | struct usb_device *udev = serial->dev; | 1784 | struct usb_device *udev = serial->dev; |
1782 | 1785 | ||
1783 | if ((udev->manufacturer && !strcmp(udev->manufacturer, "CALAO Systems")) || | 1786 | if ((udev->manufacturer && !strcmp(udev->manufacturer, "CALAO Systems")) || |
1784 | (udev->product && !strcmp(udev->product, "BeagleBone/XDS100"))) | 1787 | (udev->product && !strcmp(udev->product, "BeagleBone/XDS100V2"))) |
1785 | return ftdi_jtag_probe(serial); | 1788 | return ftdi_jtag_probe(serial); |
1786 | 1789 | ||
1787 | return 0; | 1790 | return 0; |
@@ -2089,6 +2092,29 @@ static void ftdi_break_ctl(struct tty_struct *tty, int break_state) | |||
2089 | 2092 | ||
2090 | } | 2093 | } |
2091 | 2094 | ||
2095 | static int ftdi_chars_in_buffer(struct tty_struct *tty) | ||
2096 | { | ||
2097 | struct usb_serial_port *port = tty->driver_data; | ||
2098 | int chars; | ||
2099 | unsigned char buf[2]; | ||
2100 | int ret; | ||
2101 | |||
2102 | chars = usb_serial_generic_chars_in_buffer(tty); | ||
2103 | if (chars) | ||
2104 | goto out; | ||
2105 | |||
2106 | /* Check if hardware buffer is empty. */ | ||
2107 | ret = ftdi_get_modem_status(tty, buf); | ||
2108 | if (ret == 2) { | ||
2109 | if (!(buf[1] & FTDI_RS_TEMT)) | ||
2110 | chars = 1; | ||
2111 | } | ||
2112 | out: | ||
2113 | dev_dbg(&port->dev, "%s - %d\n", __func__, chars); | ||
2114 | |||
2115 | return chars; | ||
2116 | } | ||
2117 | |||
2092 | /* old_termios contains the original termios settings and tty->termios contains | 2118 | /* old_termios contains the original termios settings and tty->termios contains |
2093 | * the new setting to be used | 2119 | * the new setting to be used |
2094 | * WARNING: set_termios calls this with old_termios in kernel space | 2120 | * WARNING: set_termios calls this with old_termios in kernel space |
@@ -2272,7 +2298,14 @@ no_c_cflag_changes: | |||
2272 | } | 2298 | } |
2273 | } | 2299 | } |
2274 | 2300 | ||
2275 | static int ftdi_tiocmget(struct tty_struct *tty) | 2301 | /* |
2302 | * Get modem-control status. | ||
2303 | * | ||
2304 | * Returns the number of status bytes retrieved (device dependant), or | ||
2305 | * negative error code. | ||
2306 | */ | ||
2307 | static int ftdi_get_modem_status(struct tty_struct *tty, | ||
2308 | unsigned char status[2]) | ||
2276 | { | 2309 | { |
2277 | struct usb_serial_port *port = tty->driver_data; | 2310 | struct usb_serial_port *port = tty->driver_data; |
2278 | struct ftdi_private *priv = usb_get_serial_port_data(port); | 2311 | struct ftdi_private *priv = usb_get_serial_port_data(port); |
@@ -2312,16 +2345,43 @@ static int ftdi_tiocmget(struct tty_struct *tty) | |||
2312 | FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE, | 2345 | FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE, |
2313 | 0, priv->interface, | 2346 | 0, priv->interface, |
2314 | buf, len, WDR_TIMEOUT); | 2347 | buf, len, WDR_TIMEOUT); |
2315 | if (ret < 0) | 2348 | if (ret < 0) { |
2349 | dev_err(&port->dev, "failed to get modem status: %d\n", ret); | ||
2350 | ret = usb_translate_errors(ret); | ||
2316 | goto out; | 2351 | goto out; |
2352 | } | ||
2317 | 2353 | ||
2318 | ret = (buf[0] & FTDI_SIO_DSR_MASK ? TIOCM_DSR : 0) | | 2354 | status[0] = buf[0]; |
2319 | (buf[0] & FTDI_SIO_CTS_MASK ? TIOCM_CTS : 0) | | 2355 | if (ret > 1) |
2320 | (buf[0] & FTDI_SIO_RI_MASK ? TIOCM_RI : 0) | | 2356 | status[1] = buf[1]; |
2321 | (buf[0] & FTDI_SIO_RLSD_MASK ? TIOCM_CD : 0) | | 2357 | else |
2322 | priv->last_dtr_rts; | 2358 | status[1] = 0; |
2359 | |||
2360 | dev_dbg(&port->dev, "%s - 0x%02x%02x\n", __func__, status[0], | ||
2361 | status[1]); | ||
2323 | out: | 2362 | out: |
2324 | kfree(buf); | 2363 | kfree(buf); |
2364 | |||
2365 | return ret; | ||
2366 | } | ||
2367 | |||
2368 | static int ftdi_tiocmget(struct tty_struct *tty) | ||
2369 | { | ||
2370 | struct usb_serial_port *port = tty->driver_data; | ||
2371 | struct ftdi_private *priv = usb_get_serial_port_data(port); | ||
2372 | unsigned char buf[2]; | ||
2373 | int ret; | ||
2374 | |||
2375 | ret = ftdi_get_modem_status(tty, buf); | ||
2376 | if (ret < 0) | ||
2377 | return ret; | ||
2378 | |||
2379 | ret = (buf[0] & FTDI_SIO_DSR_MASK ? TIOCM_DSR : 0) | | ||
2380 | (buf[0] & FTDI_SIO_CTS_MASK ? TIOCM_CTS : 0) | | ||
2381 | (buf[0] & FTDI_SIO_RI_MASK ? TIOCM_RI : 0) | | ||
2382 | (buf[0] & FTDI_SIO_RLSD_MASK ? TIOCM_CD : 0) | | ||
2383 | priv->last_dtr_rts; | ||
2384 | |||
2325 | return ret; | 2385 | return ret; |
2326 | } | 2386 | } |
2327 | 2387 | ||
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 57c12ef6625e..049b6e715fa4 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
@@ -752,6 +752,12 @@ | |||
752 | #define TTI_VID 0x103E /* Vendor Id */ | 752 | #define TTI_VID 0x103E /* Vendor Id */ |
753 | #define TTI_QL355P_PID 0x03E8 /* TTi QL355P power supply */ | 753 | #define TTI_QL355P_PID 0x03E8 /* TTi QL355P power supply */ |
754 | 754 | ||
755 | /* | ||
756 | * Newport Cooperation (www.newport.com) | ||
757 | */ | ||
758 | #define NEWPORT_VID 0x104D | ||
759 | #define NEWPORT_AGILIS_PID 0x3000 | ||
760 | |||
755 | /* Interbiometrics USB I/O Board */ | 761 | /* Interbiometrics USB I/O Board */ |
756 | /* Developed for Interbiometrics by Rudolf Gugler */ | 762 | /* Developed for Interbiometrics by Rudolf Gugler */ |
757 | #define INTERBIOMETRICS_VID 0x1209 | 763 | #define INTERBIOMETRICS_VID 0x1209 |
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index 296612153ea2..2ea70a631996 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c | |||
@@ -262,6 +262,7 @@ int usb_serial_generic_chars_in_buffer(struct tty_struct *tty) | |||
262 | dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars); | 262 | dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars); |
263 | return chars; | 263 | return chars; |
264 | } | 264 | } |
265 | EXPORT_SYMBOL_GPL(usb_serial_generic_chars_in_buffer); | ||
265 | 266 | ||
266 | static int usb_serial_generic_submit_read_urb(struct usb_serial_port *port, | 267 | static int usb_serial_generic_submit_read_urb(struct usb_serial_port *port, |
267 | int index, gfp_t mem_flags) | 268 | int index, gfp_t mem_flags) |
diff --git a/drivers/usb/serial/hp4x.c b/drivers/usb/serial/hp4x.c index 0bbaf21a9d1e..2cba60d90c79 100644 --- a/drivers/usb/serial/hp4x.c +++ b/drivers/usb/serial/hp4x.c | |||
@@ -20,10 +20,6 @@ | |||
20 | #include <linux/usb.h> | 20 | #include <linux/usb.h> |
21 | #include <linux/usb/serial.h> | 21 | #include <linux/usb/serial.h> |
22 | 22 | ||
23 | /* | ||
24 | * Version Information | ||
25 | */ | ||
26 | #define DRIVER_VERSION "v1.00" | ||
27 | #define DRIVER_DESC "HP4x (48/49) Generic Serial driver" | 23 | #define DRIVER_DESC "HP4x (48/49) Generic Serial driver" |
28 | 24 | ||
29 | #define HP_VENDOR_ID 0x03f0 | 25 | #define HP_VENDOR_ID 0x03f0 |
@@ -52,5 +48,4 @@ static struct usb_serial_driver * const serial_drivers[] = { | |||
52 | module_usb_serial_driver(serial_drivers, id_table); | 48 | module_usb_serial_driver(serial_drivers, id_table); |
53 | 49 | ||
54 | MODULE_DESCRIPTION(DRIVER_DESC); | 50 | MODULE_DESCRIPTION(DRIVER_DESC); |
55 | MODULE_VERSION(DRIVER_VERSION); | ||
56 | MODULE_LICENSE("GPL"); | 51 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index 5acc0d13864a..7b770c7f8b11 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c | |||
@@ -51,10 +51,6 @@ | |||
51 | #include "io_ionsp.h" /* info for the iosp messages */ | 51 | #include "io_ionsp.h" /* info for the iosp messages */ |
52 | #include "io_16654.h" /* 16654 UART defines */ | 52 | #include "io_16654.h" /* 16654 UART defines */ |
53 | 53 | ||
54 | /* | ||
55 | * Version Information | ||
56 | */ | ||
57 | #define DRIVER_VERSION "v2.7" | ||
58 | #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com> and David Iacovelli" | 54 | #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com> and David Iacovelli" |
59 | #define DRIVER_DESC "Edgeport USB Serial Driver" | 55 | #define DRIVER_DESC "Edgeport USB Serial Driver" |
60 | 56 | ||
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index 60023c2d2a31..58184f3de686 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c | |||
@@ -40,10 +40,6 @@ | |||
40 | #include "io_usbvend.h" | 40 | #include "io_usbvend.h" |
41 | #include "io_ti.h" | 41 | #include "io_ti.h" |
42 | 42 | ||
43 | /* | ||
44 | * Version Information | ||
45 | */ | ||
46 | #define DRIVER_VERSION "v0.7mode043006" | ||
47 | #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com> and David Iacovelli" | 43 | #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com> and David Iacovelli" |
48 | #define DRIVER_DESC "Edgeport USB Serial Driver" | 44 | #define DRIVER_DESC "Edgeport USB Serial Driver" |
49 | 45 | ||
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index 1068bf22e27e..76c9a847da5d 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c | |||
@@ -25,11 +25,6 @@ | |||
25 | 25 | ||
26 | #define KP_RETRIES 100 | 26 | #define KP_RETRIES 100 |
27 | 27 | ||
28 | /* | ||
29 | * Version Information | ||
30 | */ | ||
31 | |||
32 | #define DRIVER_VERSION "v1.0" | ||
33 | #define DRIVER_AUTHOR "Ganesh Varadarajan <ganesh@veritas.com>" | 28 | #define DRIVER_AUTHOR "Ganesh Varadarajan <ganesh@veritas.com>" |
34 | #define DRIVER_DESC "USB PocketPC PDA driver" | 29 | #define DRIVER_DESC "USB PocketPC PDA driver" |
35 | 30 | ||
diff --git a/drivers/usb/serial/ipw.c b/drivers/usb/serial/ipw.c index 4264821a3b34..155eab14b30e 100644 --- a/drivers/usb/serial/ipw.c +++ b/drivers/usb/serial/ipw.c | |||
@@ -49,10 +49,6 @@ | |||
49 | #include <linux/uaccess.h> | 49 | #include <linux/uaccess.h> |
50 | #include "usb-wwan.h" | 50 | #include "usb-wwan.h" |
51 | 51 | ||
52 | /* | ||
53 | * Version Information | ||
54 | */ | ||
55 | #define DRIVER_VERSION "v0.4" | ||
56 | #define DRIVER_AUTHOR "Roelf Diedericks" | 52 | #define DRIVER_AUTHOR "Roelf Diedericks" |
57 | #define DRIVER_DESC "IPWireless tty driver" | 53 | #define DRIVER_DESC "IPWireless tty driver" |
58 | 54 | ||
diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c index cd5533e81de7..1e1fbed65ef2 100644 --- a/drivers/usb/serial/iuu_phoenix.c +++ b/drivers/usb/serial/iuu_phoenix.c | |||
@@ -32,10 +32,6 @@ | |||
32 | #include "iuu_phoenix.h" | 32 | #include "iuu_phoenix.h" |
33 | #include <linux/random.h> | 33 | #include <linux/random.h> |
34 | 34 | ||
35 | /* | ||
36 | * Version Information | ||
37 | */ | ||
38 | #define DRIVER_VERSION "v0.12" | ||
39 | #define DRIVER_DESC "Infinity USB Unlimited Phoenix driver" | 35 | #define DRIVER_DESC "Infinity USB Unlimited Phoenix driver" |
40 | 36 | ||
41 | static const struct usb_device_id id_table[] = { | 37 | static const struct usb_device_id id_table[] = { |
@@ -1164,7 +1160,7 @@ static ssize_t store_vcc_mode(struct device *dev, | |||
1164 | struct iuu_private *priv = usb_get_serial_port_data(port); | 1160 | struct iuu_private *priv = usb_get_serial_port_data(port); |
1165 | unsigned long v; | 1161 | unsigned long v; |
1166 | 1162 | ||
1167 | if (strict_strtoul(buf, 10, &v)) { | 1163 | if (kstrtoul(buf, 10, &v)) { |
1168 | dev_err(dev, "%s - vcc_mode: %s is not a unsigned long\n", | 1164 | dev_err(dev, "%s - vcc_mode: %s is not a unsigned long\n", |
1169 | __func__, buf); | 1165 | __func__, buf); |
1170 | goto fail_store_vcc_mode; | 1166 | goto fail_store_vcc_mode; |
@@ -1232,8 +1228,6 @@ MODULE_AUTHOR("Alain Degreffe eczema@ecze.com"); | |||
1232 | MODULE_DESCRIPTION(DRIVER_DESC); | 1228 | MODULE_DESCRIPTION(DRIVER_DESC); |
1233 | MODULE_LICENSE("GPL"); | 1229 | MODULE_LICENSE("GPL"); |
1234 | 1230 | ||
1235 | MODULE_VERSION(DRIVER_VERSION); | ||
1236 | |||
1237 | module_param(xmas, bool, S_IRUGO | S_IWUSR); | 1231 | module_param(xmas, bool, S_IRUGO | S_IWUSR); |
1238 | MODULE_PARM_DESC(xmas, "Xmas colors enabled or not"); | 1232 | MODULE_PARM_DESC(xmas, "Xmas colors enabled or not"); |
1239 | 1233 | ||
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index cff8dd5b462d..97bc49f68efd 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c | |||
@@ -44,10 +44,6 @@ | |||
44 | #include <linux/usb/ezusb.h> | 44 | #include <linux/usb/ezusb.h> |
45 | #include "keyspan.h" | 45 | #include "keyspan.h" |
46 | 46 | ||
47 | /* | ||
48 | * Version Information | ||
49 | */ | ||
50 | #define DRIVER_VERSION "v1.1.5" | ||
51 | #define DRIVER_AUTHOR "Hugh Blemings <hugh@misc.nu" | 47 | #define DRIVER_AUTHOR "Hugh Blemings <hugh@misc.nu" |
52 | #define DRIVER_DESC "Keyspan USB to Serial Converter Driver" | 48 | #define DRIVER_DESC "Keyspan USB to Serial Converter Driver" |
53 | 49 | ||
diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c index bb87e29c4ac2..41b01092af07 100644 --- a/drivers/usb/serial/keyspan_pda.c +++ b/drivers/usb/serial/keyspan_pda.c | |||
@@ -42,10 +42,6 @@ | |||
42 | #undef XIRCOM | 42 | #undef XIRCOM |
43 | #endif | 43 | #endif |
44 | 44 | ||
45 | /* | ||
46 | * Version Information | ||
47 | */ | ||
48 | #define DRIVER_VERSION "v1.1" | ||
49 | #define DRIVER_AUTHOR "Brian Warner <warner@lothar.com>" | 45 | #define DRIVER_AUTHOR "Brian Warner <warner@lothar.com>" |
50 | #define DRIVER_DESC "USB Keyspan PDA Converter driver" | 46 | #define DRIVER_DESC "USB Keyspan PDA Converter driver" |
51 | 47 | ||
diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c index 1f4517864cd2..fc9e14a1e9b3 100644 --- a/drivers/usb/serial/kl5kusb105.c +++ b/drivers/usb/serial/kl5kusb105.c | |||
@@ -49,10 +49,6 @@ | |||
49 | #include <linux/usb/serial.h> | 49 | #include <linux/usb/serial.h> |
50 | #include "kl5kusb105.h" | 50 | #include "kl5kusb105.h" |
51 | 51 | ||
52 | /* | ||
53 | * Version Information | ||
54 | */ | ||
55 | #define DRIVER_VERSION "v0.4" | ||
56 | #define DRIVER_AUTHOR "Utz-Uwe Haus <haus@uuhaus.de>, Johan Hovold <jhovold@gmail.com>" | 52 | #define DRIVER_AUTHOR "Utz-Uwe Haus <haus@uuhaus.de>, Johan Hovold <jhovold@gmail.com>" |
57 | #define DRIVER_DESC "KLSI KL5KUSB105 chipset USB->Serial Converter driver" | 53 | #define DRIVER_DESC "KLSI KL5KUSB105 chipset USB->Serial Converter driver" |
58 | 54 | ||
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index c9ca7a5b12e0..b747ba615d0b 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c | |||
@@ -38,8 +38,6 @@ | |||
38 | #include <linux/ioctl.h> | 38 | #include <linux/ioctl.h> |
39 | #include "kobil_sct.h" | 39 | #include "kobil_sct.h" |
40 | 40 | ||
41 | /* Version Information */ | ||
42 | #define DRIVER_VERSION "21/05/2004" | ||
43 | #define DRIVER_AUTHOR "KOBIL Systems GmbH - http://www.kobil.com" | 41 | #define DRIVER_AUTHOR "KOBIL Systems GmbH - http://www.kobil.com" |
44 | #define DRIVER_DESC "KOBIL USB Smart Card Terminal Driver (experimental)" | 42 | #define DRIVER_DESC "KOBIL USB Smart Card Terminal Driver (experimental)" |
45 | 43 | ||
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index 8a2081004107..b6911757c855 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c | |||
@@ -38,10 +38,6 @@ | |||
38 | #include <linux/ioctl.h> | 38 | #include <linux/ioctl.h> |
39 | #include "mct_u232.h" | 39 | #include "mct_u232.h" |
40 | 40 | ||
41 | /* | ||
42 | * Version Information | ||
43 | */ | ||
44 | #define DRIVER_VERSION "z2.1" /* Linux in-kernel version */ | ||
45 | #define DRIVER_AUTHOR "Wolfgang Grandegger <wolfgang@ces.ch>" | 41 | #define DRIVER_AUTHOR "Wolfgang Grandegger <wolfgang@ces.ch>" |
46 | #define DRIVER_DESC "Magic Control Technology USB-RS232 converter driver" | 42 | #define DRIVER_DESC "Magic Control Technology USB-RS232 converter driver" |
47 | 43 | ||
diff --git a/drivers/usb/serial/metro-usb.c b/drivers/usb/serial/metro-usb.c index 6f29c74eb769..3d258448c29a 100644 --- a/drivers/usb/serial/metro-usb.c +++ b/drivers/usb/serial/metro-usb.c | |||
@@ -20,8 +20,6 @@ | |||
20 | #include <linux/uaccess.h> | 20 | #include <linux/uaccess.h> |
21 | #include <linux/usb/serial.h> | 21 | #include <linux/usb/serial.h> |
22 | 22 | ||
23 | /* Version Information */ | ||
24 | #define DRIVER_VERSION "v1.2.0.0" | ||
25 | #define DRIVER_DESC "Metrologic Instruments Inc. - USB-POS driver" | 23 | #define DRIVER_DESC "Metrologic Instruments Inc. - USB-POS driver" |
26 | 24 | ||
27 | /* Product information. */ | 25 | /* Product information. */ |
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c index 75267421aad8..f57a6b1fe787 100644 --- a/drivers/usb/serial/mos7720.c +++ b/drivers/usb/serial/mos7720.c | |||
@@ -36,10 +36,6 @@ | |||
36 | #include <linux/uaccess.h> | 36 | #include <linux/uaccess.h> |
37 | #include <linux/parport.h> | 37 | #include <linux/parport.h> |
38 | 38 | ||
39 | /* | ||
40 | * Version Information | ||
41 | */ | ||
42 | #define DRIVER_VERSION "2.1" | ||
43 | #define DRIVER_AUTHOR "Aspire Communications pvt Ltd." | 39 | #define DRIVER_AUTHOR "Aspire Communications pvt Ltd." |
44 | #define DRIVER_DESC "Moschip USB Serial Driver" | 40 | #define DRIVER_DESC "Moschip USB Serial Driver" |
45 | 41 | ||
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index 1cf3375ec1af..66d9e088d9d9 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c | |||
@@ -35,10 +35,6 @@ | |||
35 | #include <linux/usb/serial.h> | 35 | #include <linux/usb/serial.h> |
36 | #include <linux/uaccess.h> | 36 | #include <linux/uaccess.h> |
37 | 37 | ||
38 | /* | ||
39 | * Version Information | ||
40 | */ | ||
41 | #define DRIVER_VERSION "1.3.2" | ||
42 | #define DRIVER_DESC "Moschip 7840/7820 USB Serial Driver" | 38 | #define DRIVER_DESC "Moschip 7840/7820 USB Serial Driver" |
43 | 39 | ||
44 | /* | 40 | /* |
diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c index 9ab73d295774..7818af931a48 100644 --- a/drivers/usb/serial/omninet.c +++ b/drivers/usb/serial/omninet.c | |||
@@ -23,10 +23,6 @@ | |||
23 | #include <linux/usb.h> | 23 | #include <linux/usb.h> |
24 | #include <linux/usb/serial.h> | 24 | #include <linux/usb/serial.h> |
25 | 25 | ||
26 | /* | ||
27 | * Version Information | ||
28 | */ | ||
29 | #define DRIVER_VERSION "v1.1" | ||
30 | #define DRIVER_AUTHOR "Alessandro Zummo" | 26 | #define DRIVER_AUTHOR "Alessandro Zummo" |
31 | #define DRIVER_DESC "USB ZyXEL omni.net LCD PLUS Driver" | 27 | #define DRIVER_DESC "USB ZyXEL omni.net LCD PLUS Driver" |
32 | 28 | ||
diff --git a/drivers/usb/serial/opticon.c b/drivers/usb/serial/opticon.c index 6aba731d4864..c6bfb83efb1e 100644 --- a/drivers/usb/serial/opticon.c +++ b/drivers/usb/serial/opticon.c | |||
@@ -1,6 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Opticon USB barcode to serial driver | 2 | * Opticon USB barcode to serial driver |
3 | * | 3 | * |
4 | * Copyright (C) 2011 - 2012 Johan Hovold <jhovold@gmail.com> | ||
4 | * Copyright (C) 2011 Martin Jansen <martin.jansen@opticon.com> | 5 | * Copyright (C) 2011 Martin Jansen <martin.jansen@opticon.com> |
5 | * Copyright (C) 2008 - 2009 Greg Kroah-Hartman <gregkh@suse.de> | 6 | * Copyright (C) 2008 - 2009 Greg Kroah-Hartman <gregkh@suse.de> |
6 | * Copyright (C) 2008 - 2009 Novell Inc. | 7 | * Copyright (C) 2008 - 2009 Novell Inc. |
@@ -40,114 +41,70 @@ MODULE_DEVICE_TABLE(usb, id_table); | |||
40 | 41 | ||
41 | /* This structure holds all of the individual device information */ | 42 | /* This structure holds all of the individual device information */ |
42 | struct opticon_private { | 43 | struct opticon_private { |
43 | struct usb_device *udev; | ||
44 | struct usb_serial *serial; | ||
45 | struct usb_serial_port *port; | ||
46 | unsigned char *bulk_in_buffer; | ||
47 | struct urb *bulk_read_urb; | ||
48 | int buffer_size; | ||
49 | u8 bulk_address; | ||
50 | spinlock_t lock; /* protects the following flags */ | 44 | spinlock_t lock; /* protects the following flags */ |
51 | bool throttled; | ||
52 | bool actually_throttled; | ||
53 | bool rts; | 45 | bool rts; |
54 | bool cts; | 46 | bool cts; |
55 | int outstanding_urbs; | 47 | int outstanding_urbs; |
56 | }; | 48 | }; |
57 | 49 | ||
58 | 50 | ||
59 | 51 | static void opticon_process_data_packet(struct usb_serial_port *port, | |
60 | static void opticon_read_bulk_callback(struct urb *urb) | 52 | const unsigned char *buf, size_t len) |
61 | { | 53 | { |
62 | struct opticon_private *priv = urb->context; | ||
63 | unsigned char *data = urb->transfer_buffer; | ||
64 | struct usb_serial_port *port = priv->port; | ||
65 | int status = urb->status; | ||
66 | struct tty_struct *tty; | 54 | struct tty_struct *tty; |
67 | int result; | 55 | |
68 | int data_length; | 56 | tty = tty_port_tty_get(&port->port); |
57 | if (!tty) | ||
58 | return; | ||
59 | |||
60 | tty_insert_flip_string(tty, buf, len); | ||
61 | tty_flip_buffer_push(tty); | ||
62 | tty_kref_put(tty); | ||
63 | } | ||
64 | |||
65 | static void opticon_process_status_packet(struct usb_serial_port *port, | ||
66 | const unsigned char *buf, size_t len) | ||
67 | { | ||
68 | struct opticon_private *priv = usb_get_serial_port_data(port); | ||
69 | unsigned long flags; | 69 | unsigned long flags; |
70 | 70 | ||
71 | switch (status) { | 71 | spin_lock_irqsave(&priv->lock, flags); |
72 | case 0: | 72 | if (buf[0] == 0x00) |
73 | /* success */ | 73 | priv->cts = false; |
74 | break; | 74 | else |
75 | case -ECONNRESET: | 75 | priv->cts = true; |
76 | case -ENOENT: | 76 | spin_unlock_irqrestore(&priv->lock, flags); |
77 | case -ESHUTDOWN: | 77 | } |
78 | /* this urb is terminated, clean up */ | 78 | |
79 | dev_dbg(&priv->udev->dev, "%s - urb shutting down with status: %d\n", | 79 | static void opticon_process_read_urb(struct urb *urb) |
80 | __func__, status); | 80 | { |
81 | struct usb_serial_port *port = urb->context; | ||
82 | const unsigned char *hdr = urb->transfer_buffer; | ||
83 | const unsigned char *data = hdr + 2; | ||
84 | size_t data_len = urb->actual_length - 2; | ||
85 | |||
86 | if (urb->actual_length <= 2) { | ||
87 | dev_dbg(&port->dev, "malformed packet received: %d bytes\n", | ||
88 | urb->actual_length); | ||
81 | return; | 89 | return; |
82 | default: | ||
83 | dev_dbg(&priv->udev->dev, "%s - nonzero urb status received: %d\n", | ||
84 | __func__, status); | ||
85 | goto exit; | ||
86 | } | 90 | } |
87 | 91 | /* | |
88 | usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data); | 92 | * Data from the device comes with a 2 byte header: |
89 | 93 | * | |
90 | if (urb->actual_length > 2) { | 94 | * <0x00><0x00>data... |
91 | data_length = urb->actual_length - 2; | 95 | * This is real data to be sent to the tty layer |
92 | 96 | * <0x00><0x01>level | |
93 | /* | 97 | * This is a CTS level change, the third byte is the CTS |
94 | * Data from the device comes with a 2 byte header: | 98 | * value (0 for low, 1 for high). |
95 | * | 99 | */ |
96 | * <0x00><0x00>data... | 100 | if ((hdr[0] == 0x00) && (hdr[1] == 0x00)) { |
97 | * This is real data to be sent to the tty layer | 101 | opticon_process_data_packet(port, data, data_len); |
98 | * <0x00><0x01)level | 102 | } else if ((hdr[0] == 0x00) && (hdr[1] == 0x01)) { |
99 | * This is a CTS level change, the third byte is the CTS | 103 | opticon_process_status_packet(port, data, data_len); |
100 | * value (0 for low, 1 for high). | ||
101 | */ | ||
102 | if ((data[0] == 0x00) && (data[1] == 0x00)) { | ||
103 | /* real data, send it to the tty layer */ | ||
104 | tty = tty_port_tty_get(&port->port); | ||
105 | if (tty) { | ||
106 | tty_insert_flip_string(tty, data + 2, | ||
107 | data_length); | ||
108 | tty_flip_buffer_push(tty); | ||
109 | tty_kref_put(tty); | ||
110 | } | ||
111 | } else { | ||
112 | if ((data[0] == 0x00) && (data[1] == 0x01)) { | ||
113 | spin_lock_irqsave(&priv->lock, flags); | ||
114 | /* CTS status information package */ | ||
115 | if (data[2] == 0x00) | ||
116 | priv->cts = false; | ||
117 | else | ||
118 | priv->cts = true; | ||
119 | spin_unlock_irqrestore(&priv->lock, flags); | ||
120 | } else { | ||
121 | dev_dbg(&priv->udev->dev, | ||
122 | "Unknown data packet received from the device:" | ||
123 | " %2x %2x\n", | ||
124 | data[0], data[1]); | ||
125 | } | ||
126 | } | ||
127 | } else { | 104 | } else { |
128 | dev_dbg(&priv->udev->dev, | 105 | dev_dbg(&port->dev, "unknown packet received: %02x %02x\n", |
129 | "Improper amount of data received from the device, " | 106 | hdr[0], hdr[1]); |
130 | "%d bytes", urb->actual_length); | ||
131 | } | 107 | } |
132 | |||
133 | exit: | ||
134 | spin_lock(&priv->lock); | ||
135 | |||
136 | /* Continue trying to always read if we should */ | ||
137 | if (!priv->throttled) { | ||
138 | usb_fill_bulk_urb(priv->bulk_read_urb, priv->udev, | ||
139 | usb_rcvbulkpipe(priv->udev, | ||
140 | priv->bulk_address), | ||
141 | priv->bulk_in_buffer, priv->buffer_size, | ||
142 | opticon_read_bulk_callback, priv); | ||
143 | result = usb_submit_urb(priv->bulk_read_urb, GFP_ATOMIC); | ||
144 | if (result) | ||
145 | dev_err(&port->dev, | ||
146 | "%s - failed resubmitting read urb, error %d\n", | ||
147 | __func__, result); | ||
148 | } else | ||
149 | priv->actually_throttled = true; | ||
150 | spin_unlock(&priv->lock); | ||
151 | } | 108 | } |
152 | 109 | ||
153 | static int send_control_msg(struct usb_serial_port *port, u8 requesttype, | 110 | static int send_control_msg(struct usb_serial_port *port, u8 requesttype, |
@@ -175,52 +132,35 @@ static int send_control_msg(struct usb_serial_port *port, u8 requesttype, | |||
175 | 132 | ||
176 | static int opticon_open(struct tty_struct *tty, struct usb_serial_port *port) | 133 | static int opticon_open(struct tty_struct *tty, struct usb_serial_port *port) |
177 | { | 134 | { |
178 | struct opticon_private *priv = usb_get_serial_data(port->serial); | 135 | struct opticon_private *priv = usb_get_serial_port_data(port); |
179 | unsigned long flags; | 136 | unsigned long flags; |
180 | int result = 0; | 137 | int res; |
181 | 138 | ||
182 | spin_lock_irqsave(&priv->lock, flags); | 139 | spin_lock_irqsave(&priv->lock, flags); |
183 | priv->throttled = false; | ||
184 | priv->actually_throttled = false; | ||
185 | priv->port = port; | ||
186 | priv->rts = false; | 140 | priv->rts = false; |
187 | spin_unlock_irqrestore(&priv->lock, flags); | 141 | spin_unlock_irqrestore(&priv->lock, flags); |
188 | 142 | ||
189 | /* Clear RTS line */ | 143 | /* Clear RTS line */ |
190 | send_control_msg(port, CONTROL_RTS, 0); | 144 | send_control_msg(port, CONTROL_RTS, 0); |
191 | 145 | ||
192 | /* Setup the read URB and start reading from the device */ | ||
193 | usb_fill_bulk_urb(priv->bulk_read_urb, priv->udev, | ||
194 | usb_rcvbulkpipe(priv->udev, | ||
195 | priv->bulk_address), | ||
196 | priv->bulk_in_buffer, priv->buffer_size, | ||
197 | opticon_read_bulk_callback, priv); | ||
198 | |||
199 | /* clear the halt status of the enpoint */ | 146 | /* clear the halt status of the enpoint */ |
200 | usb_clear_halt(priv->udev, priv->bulk_read_urb->pipe); | 147 | usb_clear_halt(port->serial->dev, port->read_urb->pipe); |
148 | |||
149 | res = usb_serial_generic_open(tty, port); | ||
150 | if (!res) | ||
151 | return res; | ||
201 | 152 | ||
202 | result = usb_submit_urb(priv->bulk_read_urb, GFP_KERNEL); | ||
203 | if (result) | ||
204 | dev_err(&port->dev, | ||
205 | "%s - failed resubmitting read urb, error %d\n", | ||
206 | __func__, result); | ||
207 | /* Request CTS line state, sometimes during opening the current | 153 | /* Request CTS line state, sometimes during opening the current |
208 | * CTS state can be missed. */ | 154 | * CTS state can be missed. */ |
209 | send_control_msg(port, RESEND_CTS_STATE, 1); | 155 | send_control_msg(port, RESEND_CTS_STATE, 1); |
210 | return result; | ||
211 | } | ||
212 | |||
213 | static void opticon_close(struct usb_serial_port *port) | ||
214 | { | ||
215 | struct opticon_private *priv = usb_get_serial_data(port->serial); | ||
216 | 156 | ||
217 | /* shutdown our urbs */ | 157 | return res; |
218 | usb_kill_urb(priv->bulk_read_urb); | ||
219 | } | 158 | } |
220 | 159 | ||
221 | static void opticon_write_control_callback(struct urb *urb) | 160 | static void opticon_write_control_callback(struct urb *urb) |
222 | { | 161 | { |
223 | struct opticon_private *priv = urb->context; | 162 | struct usb_serial_port *port = urb->context; |
163 | struct opticon_private *priv = usb_get_serial_port_data(port); | ||
224 | int status = urb->status; | 164 | int status = urb->status; |
225 | unsigned long flags; | 165 | unsigned long flags; |
226 | 166 | ||
@@ -231,20 +171,21 @@ static void opticon_write_control_callback(struct urb *urb) | |||
231 | kfree(urb->setup_packet); | 171 | kfree(urb->setup_packet); |
232 | 172 | ||
233 | if (status) | 173 | if (status) |
234 | dev_dbg(&priv->udev->dev, "%s - nonzero write bulk status received: %d\n", | 174 | dev_dbg(&port->dev, |
175 | "%s - non-zero urb status received: %d\n", | ||
235 | __func__, status); | 176 | __func__, status); |
236 | 177 | ||
237 | spin_lock_irqsave(&priv->lock, flags); | 178 | spin_lock_irqsave(&priv->lock, flags); |
238 | --priv->outstanding_urbs; | 179 | --priv->outstanding_urbs; |
239 | spin_unlock_irqrestore(&priv->lock, flags); | 180 | spin_unlock_irqrestore(&priv->lock, flags); |
240 | 181 | ||
241 | usb_serial_port_softint(priv->port); | 182 | usb_serial_port_softint(port); |
242 | } | 183 | } |
243 | 184 | ||
244 | static int opticon_write(struct tty_struct *tty, struct usb_serial_port *port, | 185 | static int opticon_write(struct tty_struct *tty, struct usb_serial_port *port, |
245 | const unsigned char *buf, int count) | 186 | const unsigned char *buf, int count) |
246 | { | 187 | { |
247 | struct opticon_private *priv = usb_get_serial_data(port->serial); | 188 | struct opticon_private *priv = usb_get_serial_port_data(port); |
248 | struct usb_serial *serial = port->serial; | 189 | struct usb_serial *serial = port->serial; |
249 | struct urb *urb; | 190 | struct urb *urb; |
250 | unsigned char *buffer; | 191 | unsigned char *buffer; |
@@ -298,7 +239,7 @@ static int opticon_write(struct tty_struct *tty, struct usb_serial_port *port, | |||
298 | usb_fill_control_urb(urb, serial->dev, | 239 | usb_fill_control_urb(urb, serial->dev, |
299 | usb_sndctrlpipe(serial->dev, 0), | 240 | usb_sndctrlpipe(serial->dev, 0), |
300 | (unsigned char *)dr, buffer, count, | 241 | (unsigned char *)dr, buffer, count, |
301 | opticon_write_control_callback, priv); | 242 | opticon_write_control_callback, port); |
302 | 243 | ||
303 | /* send it down the pipe */ | 244 | /* send it down the pipe */ |
304 | status = usb_submit_urb(urb, GFP_ATOMIC); | 245 | status = usb_submit_urb(urb, GFP_ATOMIC); |
@@ -331,7 +272,7 @@ error_no_buffer: | |||
331 | static int opticon_write_room(struct tty_struct *tty) | 272 | static int opticon_write_room(struct tty_struct *tty) |
332 | { | 273 | { |
333 | struct usb_serial_port *port = tty->driver_data; | 274 | struct usb_serial_port *port = tty->driver_data; |
334 | struct opticon_private *priv = usb_get_serial_data(port->serial); | 275 | struct opticon_private *priv = usb_get_serial_port_data(port); |
335 | unsigned long flags; | 276 | unsigned long flags; |
336 | 277 | ||
337 | /* | 278 | /* |
@@ -350,44 +291,10 @@ static int opticon_write_room(struct tty_struct *tty) | |||
350 | return 2048; | 291 | return 2048; |
351 | } | 292 | } |
352 | 293 | ||
353 | static void opticon_throttle(struct tty_struct *tty) | ||
354 | { | ||
355 | struct usb_serial_port *port = tty->driver_data; | ||
356 | struct opticon_private *priv = usb_get_serial_data(port->serial); | ||
357 | unsigned long flags; | ||
358 | |||
359 | spin_lock_irqsave(&priv->lock, flags); | ||
360 | priv->throttled = true; | ||
361 | spin_unlock_irqrestore(&priv->lock, flags); | ||
362 | } | ||
363 | |||
364 | |||
365 | static void opticon_unthrottle(struct tty_struct *tty) | ||
366 | { | ||
367 | struct usb_serial_port *port = tty->driver_data; | ||
368 | struct opticon_private *priv = usb_get_serial_data(port->serial); | ||
369 | unsigned long flags; | ||
370 | int result, was_throttled; | ||
371 | |||
372 | spin_lock_irqsave(&priv->lock, flags); | ||
373 | priv->throttled = false; | ||
374 | was_throttled = priv->actually_throttled; | ||
375 | priv->actually_throttled = false; | ||
376 | spin_unlock_irqrestore(&priv->lock, flags); | ||
377 | |||
378 | if (was_throttled) { | ||
379 | result = usb_submit_urb(priv->bulk_read_urb, GFP_ATOMIC); | ||
380 | if (result) | ||
381 | dev_err(&port->dev, | ||
382 | "%s - failed submitting read urb, error %d\n", | ||
383 | __func__, result); | ||
384 | } | ||
385 | } | ||
386 | |||
387 | static int opticon_tiocmget(struct tty_struct *tty) | 294 | static int opticon_tiocmget(struct tty_struct *tty) |
388 | { | 295 | { |
389 | struct usb_serial_port *port = tty->driver_data; | 296 | struct usb_serial_port *port = tty->driver_data; |
390 | struct opticon_private *priv = usb_get_serial_data(port->serial); | 297 | struct opticon_private *priv = usb_get_serial_port_data(port); |
391 | unsigned long flags; | 298 | unsigned long flags; |
392 | int result = 0; | 299 | int result = 0; |
393 | 300 | ||
@@ -407,7 +314,7 @@ static int opticon_tiocmset(struct tty_struct *tty, | |||
407 | { | 314 | { |
408 | struct usb_serial_port *port = tty->driver_data; | 315 | struct usb_serial_port *port = tty->driver_data; |
409 | struct usb_serial *serial = port->serial; | 316 | struct usb_serial *serial = port->serial; |
410 | struct opticon_private *priv = usb_get_serial_data(port->serial); | 317 | struct opticon_private *priv = usb_get_serial_port_data(port); |
411 | unsigned long flags; | 318 | unsigned long flags; |
412 | bool rts; | 319 | bool rts; |
413 | bool changed = false; | 320 | bool changed = false; |
@@ -438,7 +345,7 @@ static int opticon_tiocmset(struct tty_struct *tty, | |||
438 | return ret; | 345 | return ret; |
439 | } | 346 | } |
440 | 347 | ||
441 | static int get_serial_info(struct opticon_private *priv, | 348 | static int get_serial_info(struct usb_serial_port *port, |
442 | struct serial_struct __user *serial) | 349 | struct serial_struct __user *serial) |
443 | { | 350 | { |
444 | struct serial_struct tmp; | 351 | struct serial_struct tmp; |
@@ -450,7 +357,7 @@ static int get_serial_info(struct opticon_private *priv, | |||
450 | 357 | ||
451 | /* fake emulate a 16550 uart to make userspace code happy */ | 358 | /* fake emulate a 16550 uart to make userspace code happy */ |
452 | tmp.type = PORT_16550A; | 359 | tmp.type = PORT_16550A; |
453 | tmp.line = priv->serial->minor; | 360 | tmp.line = port->serial->minor; |
454 | tmp.port = 0; | 361 | tmp.port = 0; |
455 | tmp.irq = 0; | 362 | tmp.irq = 0; |
456 | tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ; | 363 | tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ; |
@@ -468,13 +375,12 @@ static int opticon_ioctl(struct tty_struct *tty, | |||
468 | unsigned int cmd, unsigned long arg) | 375 | unsigned int cmd, unsigned long arg) |
469 | { | 376 | { |
470 | struct usb_serial_port *port = tty->driver_data; | 377 | struct usb_serial_port *port = tty->driver_data; |
471 | struct opticon_private *priv = usb_get_serial_data(port->serial); | ||
472 | 378 | ||
473 | dev_dbg(&port->dev, "%s - port %d, cmd = 0x%x\n", __func__, port->number, cmd); | 379 | dev_dbg(&port->dev, "%s - port %d, cmd = 0x%x\n", __func__, port->number, cmd); |
474 | 380 | ||
475 | switch (cmd) { | 381 | switch (cmd) { |
476 | case TIOCGSERIAL: | 382 | case TIOCGSERIAL: |
477 | return get_serial_info(priv, | 383 | return get_serial_info(port, |
478 | (struct serial_struct __user *)arg); | 384 | (struct serial_struct __user *)arg); |
479 | } | 385 | } |
480 | 386 | ||
@@ -483,106 +389,36 @@ static int opticon_ioctl(struct tty_struct *tty, | |||
483 | 389 | ||
484 | static int opticon_startup(struct usb_serial *serial) | 390 | static int opticon_startup(struct usb_serial *serial) |
485 | { | 391 | { |
486 | struct opticon_private *priv; | 392 | if (!serial->num_bulk_in) { |
487 | struct usb_host_interface *intf; | 393 | dev_err(&serial->dev->dev, "no bulk in endpoint\n"); |
488 | int i; | 394 | return -ENODEV; |
489 | int retval = -ENOMEM; | ||
490 | bool bulk_in_found = false; | ||
491 | |||
492 | /* create our private serial structure */ | ||
493 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | ||
494 | if (priv == NULL) { | ||
495 | dev_err(&serial->dev->dev, "%s - Out of memory\n", __func__); | ||
496 | return -ENOMEM; | ||
497 | } | ||
498 | spin_lock_init(&priv->lock); | ||
499 | priv->serial = serial; | ||
500 | priv->port = serial->port[0]; | ||
501 | priv->udev = serial->dev; | ||
502 | priv->outstanding_urbs = 0; /* Init the outstanding urbs */ | ||
503 | |||
504 | /* find our bulk endpoint */ | ||
505 | intf = serial->interface->altsetting; | ||
506 | for (i = 0; i < intf->desc.bNumEndpoints; ++i) { | ||
507 | struct usb_endpoint_descriptor *endpoint; | ||
508 | |||
509 | endpoint = &intf->endpoint[i].desc; | ||
510 | if (!usb_endpoint_is_bulk_in(endpoint)) | ||
511 | continue; | ||
512 | |||
513 | priv->bulk_read_urb = usb_alloc_urb(0, GFP_KERNEL); | ||
514 | if (!priv->bulk_read_urb) { | ||
515 | dev_err(&priv->udev->dev, "out of memory\n"); | ||
516 | goto error; | ||
517 | } | ||
518 | |||
519 | priv->buffer_size = usb_endpoint_maxp(endpoint) * 2; | ||
520 | priv->bulk_in_buffer = kmalloc(priv->buffer_size, GFP_KERNEL); | ||
521 | if (!priv->bulk_in_buffer) { | ||
522 | dev_err(&priv->udev->dev, "out of memory\n"); | ||
523 | goto error; | ||
524 | } | ||
525 | |||
526 | priv->bulk_address = endpoint->bEndpointAddress; | ||
527 | |||
528 | bulk_in_found = true; | ||
529 | break; | ||
530 | } | ||
531 | |||
532 | if (!bulk_in_found) { | ||
533 | dev_err(&priv->udev->dev, | ||
534 | "Error - the proper endpoints were not found!\n"); | ||
535 | goto error; | ||
536 | } | 395 | } |
537 | 396 | ||
538 | usb_set_serial_data(serial, priv); | ||
539 | return 0; | 397 | return 0; |
540 | |||
541 | error: | ||
542 | usb_free_urb(priv->bulk_read_urb); | ||
543 | kfree(priv->bulk_in_buffer); | ||
544 | kfree(priv); | ||
545 | return retval; | ||
546 | } | 398 | } |
547 | 399 | ||
548 | static void opticon_disconnect(struct usb_serial *serial) | 400 | static int opticon_port_probe(struct usb_serial_port *port) |
549 | { | 401 | { |
550 | struct opticon_private *priv = usb_get_serial_data(serial); | 402 | struct opticon_private *priv; |
551 | |||
552 | usb_kill_urb(priv->bulk_read_urb); | ||
553 | usb_free_urb(priv->bulk_read_urb); | ||
554 | } | ||
555 | 403 | ||
556 | static void opticon_release(struct usb_serial *serial) | 404 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); |
557 | { | 405 | if (!priv) |
558 | struct opticon_private *priv = usb_get_serial_data(serial); | 406 | return -ENOMEM; |
559 | 407 | ||
560 | kfree(priv->bulk_in_buffer); | 408 | spin_lock_init(&priv->lock); |
561 | kfree(priv); | ||
562 | } | ||
563 | 409 | ||
564 | static int opticon_suspend(struct usb_serial *serial, pm_message_t message) | 410 | usb_set_serial_port_data(port, priv); |
565 | { | ||
566 | struct opticon_private *priv = usb_get_serial_data(serial); | ||
567 | 411 | ||
568 | usb_kill_urb(priv->bulk_read_urb); | ||
569 | return 0; | 412 | return 0; |
570 | } | 413 | } |
571 | 414 | ||
572 | static int opticon_resume(struct usb_serial *serial) | 415 | static int opticon_port_remove(struct usb_serial_port *port) |
573 | { | 416 | { |
574 | struct opticon_private *priv = usb_get_serial_data(serial); | 417 | struct opticon_private *priv = usb_get_serial_port_data(port); |
575 | struct usb_serial_port *port = serial->port[0]; | 418 | |
576 | int result; | 419 | kfree(priv); |
577 | 420 | ||
578 | mutex_lock(&port->port.mutex); | 421 | return 0; |
579 | /* This is protected by the port mutex against close/open */ | ||
580 | if (test_bit(ASYNCB_INITIALIZED, &port->port.flags)) | ||
581 | result = usb_submit_urb(priv->bulk_read_urb, GFP_NOIO); | ||
582 | else | ||
583 | result = 0; | ||
584 | mutex_unlock(&port->port.mutex); | ||
585 | return result; | ||
586 | } | 422 | } |
587 | 423 | ||
588 | static struct usb_serial_driver opticon_device = { | 424 | static struct usb_serial_driver opticon_device = { |
@@ -592,20 +428,19 @@ static struct usb_serial_driver opticon_device = { | |||
592 | }, | 428 | }, |
593 | .id_table = id_table, | 429 | .id_table = id_table, |
594 | .num_ports = 1, | 430 | .num_ports = 1, |
431 | .bulk_in_size = 256, | ||
595 | .attach = opticon_startup, | 432 | .attach = opticon_startup, |
433 | .port_probe = opticon_port_probe, | ||
434 | .port_remove = opticon_port_remove, | ||
596 | .open = opticon_open, | 435 | .open = opticon_open, |
597 | .close = opticon_close, | ||
598 | .write = opticon_write, | 436 | .write = opticon_write, |
599 | .write_room = opticon_write_room, | 437 | .write_room = opticon_write_room, |
600 | .disconnect = opticon_disconnect, | 438 | .throttle = usb_serial_generic_throttle, |
601 | .release = opticon_release, | 439 | .unthrottle = usb_serial_generic_unthrottle, |
602 | .throttle = opticon_throttle, | ||
603 | .unthrottle = opticon_unthrottle, | ||
604 | .ioctl = opticon_ioctl, | 440 | .ioctl = opticon_ioctl, |
605 | .tiocmget = opticon_tiocmget, | 441 | .tiocmget = opticon_tiocmget, |
606 | .tiocmset = opticon_tiocmset, | 442 | .tiocmset = opticon_tiocmset, |
607 | .suspend = opticon_suspend, | 443 | .process_read_urb = opticon_process_read_urb, |
608 | .resume = opticon_resume, | ||
609 | }; | 444 | }; |
610 | 445 | ||
611 | static struct usb_serial_driver * const serial_drivers[] = { | 446 | static struct usb_serial_driver * const serial_drivers[] = { |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index edc64bb6f457..e6f87b76c715 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -28,7 +28,6 @@ | |||
28 | device features. | 28 | device features. |
29 | */ | 29 | */ |
30 | 30 | ||
31 | #define DRIVER_VERSION "v0.7.2" | ||
32 | #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>" | 31 | #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>" |
33 | #define DRIVER_DESC "USB Driver for GSM modems" | 32 | #define DRIVER_DESC "USB Driver for GSM modems" |
34 | 33 | ||
@@ -81,6 +80,7 @@ static void option_instat_callback(struct urb *urb); | |||
81 | #define OPTION_PRODUCT_GTM380_MODEM 0x7201 | 80 | #define OPTION_PRODUCT_GTM380_MODEM 0x7201 |
82 | 81 | ||
83 | #define HUAWEI_VENDOR_ID 0x12D1 | 82 | #define HUAWEI_VENDOR_ID 0x12D1 |
83 | #define HUAWEI_PRODUCT_E173 0x140C | ||
84 | #define HUAWEI_PRODUCT_K4505 0x1464 | 84 | #define HUAWEI_PRODUCT_K4505 0x1464 |
85 | #define HUAWEI_PRODUCT_K3765 0x1465 | 85 | #define HUAWEI_PRODUCT_K3765 0x1465 |
86 | #define HUAWEI_PRODUCT_K4605 0x14C6 | 86 | #define HUAWEI_PRODUCT_K4605 0x14C6 |
@@ -553,6 +553,8 @@ static const struct usb_device_id option_ids[] = { | |||
553 | { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLX) }, | 553 | { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLX) }, |
554 | { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GKE) }, | 554 | { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GKE) }, |
555 | { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLE) }, | 555 | { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLE) }, |
556 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173, 0xff, 0xff, 0xff), | ||
557 | .driver_info = (kernel_ulong_t) &net_intf1_blacklist }, | ||
556 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4505, 0xff, 0xff, 0xff), | 558 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4505, 0xff, 0xff, 0xff), |
557 | .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, | 559 | .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, |
558 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff), | 560 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff), |
@@ -741,23 +743,23 @@ static const struct usb_device_id option_ids[] = { | |||
741 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) }, | 743 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) }, |
742 | { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) }, | 744 | { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) }, |
743 | { USB_DEVICE(YISO_VENDOR_ID, YISO_PRODUCT_U893) }, | 745 | { USB_DEVICE(YISO_VENDOR_ID, YISO_PRODUCT_U893) }, |
744 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) }, | 746 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1, 0xff) }, |
745 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) }, | 747 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2, 0xff) }, |
746 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1004) }, | 748 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1004, 0xff) }, |
747 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1005) }, | 749 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1005, 0xff) }, |
748 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1006) }, | 750 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1006, 0xff) }, |
749 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1007) }, | 751 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1007, 0xff) }, |
750 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1008) }, | 752 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1008, 0xff) }, |
751 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1009) }, | 753 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1009, 0xff) }, |
752 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100A) }, | 754 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100A, 0xff) }, |
753 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100B) }, | 755 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100B, 0xff) }, |
754 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100C) }, | 756 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100C, 0xff) }, |
755 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100D) }, | 757 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100D, 0xff) }, |
756 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100E) }, | 758 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100E, 0xff) }, |
757 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100F) }, | 759 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100F, 0xff) }, |
758 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1010) }, | 760 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1010, 0xff) }, |
759 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1011) }, | 761 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1011, 0xff) }, |
760 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012) }, | 762 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012, 0xff) }, |
761 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) }, | 763 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) }, |
762 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, | 764 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, |
763 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */ | 765 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */ |
@@ -884,6 +886,10 @@ static const struct usb_device_id option_ids[] = { | |||
884 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0126, 0xff, 0xff, 0xff), | 886 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0126, 0xff, 0xff, 0xff), |
885 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, | 887 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
886 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0128, 0xff, 0xff, 0xff) }, | 888 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0128, 0xff, 0xff, 0xff) }, |
889 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0135, 0xff, 0xff, 0xff) }, | ||
890 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0136, 0xff, 0xff, 0xff) }, | ||
891 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0137, 0xff, 0xff, 0xff) }, | ||
892 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0139, 0xff, 0xff, 0xff) }, | ||
887 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0142, 0xff, 0xff, 0xff) }, | 893 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0142, 0xff, 0xff, 0xff) }, |
888 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0143, 0xff, 0xff, 0xff) }, | 894 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0143, 0xff, 0xff, 0xff) }, |
889 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0144, 0xff, 0xff, 0xff) }, | 895 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0144, 0xff, 0xff, 0xff) }, |
@@ -904,20 +910,34 @@ static const struct usb_device_id option_ids[] = { | |||
904 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, | 910 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, |
905 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff), | 911 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff), |
906 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 912 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
913 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0189, 0xff, 0xff, 0xff) }, | ||
907 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0191, 0xff, 0xff, 0xff), /* ZTE EuFi890 */ | 914 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0191, 0xff, 0xff, 0xff), /* ZTE EuFi890 */ |
908 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 915 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
916 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0196, 0xff, 0xff, 0xff) }, | ||
917 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0197, 0xff, 0xff, 0xff) }, | ||
909 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0199, 0xff, 0xff, 0xff), /* ZTE MF820S */ | 918 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0199, 0xff, 0xff, 0xff), /* ZTE MF820S */ |
910 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | 919 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, |
920 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0200, 0xff, 0xff, 0xff) }, | ||
921 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0201, 0xff, 0xff, 0xff) }, | ||
922 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0254, 0xff, 0xff, 0xff) }, | ||
911 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0257, 0xff, 0xff, 0xff), /* ZTE MF821 */ | 923 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0257, 0xff, 0xff, 0xff), /* ZTE MF821 */ |
912 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, | 924 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, |
925 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0265, 0xff, 0xff, 0xff) }, | ||
926 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0284, 0xff, 0xff, 0xff) }, | ||
927 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0317, 0xff, 0xff, 0xff) }, | ||
913 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0326, 0xff, 0xff, 0xff), | 928 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0326, 0xff, 0xff, 0xff), |
914 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 929 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
930 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0330, 0xff, 0xff, 0xff) }, | ||
931 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0395, 0xff, 0xff, 0xff) }, | ||
932 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0414, 0xff, 0xff, 0xff) }, | ||
933 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0417, 0xff, 0xff, 0xff) }, | ||
915 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff), | 934 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff), |
916 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 935 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
917 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff), | 936 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff), |
918 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 937 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
919 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff), | 938 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff), |
920 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 939 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
940 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1018, 0xff, 0xff, 0xff) }, | ||
921 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1021, 0xff, 0xff, 0xff), | 941 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1021, 0xff, 0xff, 0xff), |
922 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, | 942 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, |
923 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) }, | 943 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) }, |
@@ -1097,6 +1117,10 @@ static const struct usb_device_id option_ids[] = { | |||
1097 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1298, 0xff, 0xff, 0xff) }, | 1117 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1298, 0xff, 0xff, 0xff) }, |
1098 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1299, 0xff, 0xff, 0xff) }, | 1118 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1299, 0xff, 0xff, 0xff) }, |
1099 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1300, 0xff, 0xff, 0xff) }, | 1119 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1300, 0xff, 0xff, 0xff) }, |
1120 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1301, 0xff, 0xff, 0xff) }, | ||
1121 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1302, 0xff, 0xff, 0xff) }, | ||
1122 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1303, 0xff, 0xff, 0xff) }, | ||
1123 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1333, 0xff, 0xff, 0xff) }, | ||
1100 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1401, 0xff, 0xff, 0xff), | 1124 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1401, 0xff, 0xff, 0xff), |
1101 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, | 1125 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, |
1102 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1402, 0xff, 0xff, 0xff), | 1126 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1402, 0xff, 0xff, 0xff), |
@@ -1174,22 +1198,22 @@ static const struct usb_device_id option_ids[] = { | |||
1174 | { USB_DEVICE(LONGCHEER_VENDOR_ID, ZOOM_PRODUCT_4597) }, | 1198 | { USB_DEVICE(LONGCHEER_VENDOR_ID, ZOOM_PRODUCT_4597) }, |
1175 | { USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) }, | 1199 | { USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) }, |
1176 | /* Pirelli */ | 1200 | /* Pirelli */ |
1177 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_1)}, | 1201 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_1, 0xff) }, |
1178 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_2)}, | 1202 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_2, 0xff) }, |
1179 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1004)}, | 1203 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1004, 0xff) }, |
1180 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1005)}, | 1204 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1005, 0xff) }, |
1181 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1006)}, | 1205 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1006, 0xff) }, |
1182 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1007)}, | 1206 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1007, 0xff) }, |
1183 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1008)}, | 1207 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1008, 0xff) }, |
1184 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1009)}, | 1208 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1009, 0xff) }, |
1185 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100A)}, | 1209 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100A, 0xff) }, |
1186 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100B) }, | 1210 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100B, 0xff) }, |
1187 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100C) }, | 1211 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100C, 0xff) }, |
1188 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100D) }, | 1212 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100D, 0xff) }, |
1189 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100E) }, | 1213 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100E, 0xff) }, |
1190 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100F) }, | 1214 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100F, 0xff) }, |
1191 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1011)}, | 1215 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1011, 0xff) }, |
1192 | { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1012)}, | 1216 | { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1012, 0xff) }, |
1193 | /* Cinterion */ | 1217 | /* Cinterion */ |
1194 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) }, | 1218 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) }, |
1195 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) }, | 1219 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) }, |
@@ -1350,20 +1374,10 @@ static int option_probe(struct usb_serial *serial, | |||
1350 | &serial->interface->cur_altsetting->desc; | 1374 | &serial->interface->cur_altsetting->desc; |
1351 | struct usb_device_descriptor *dev_desc = &serial->dev->descriptor; | 1375 | struct usb_device_descriptor *dev_desc = &serial->dev->descriptor; |
1352 | 1376 | ||
1353 | /* | 1377 | /* Never bind to the CD-Rom emulation interface */ |
1354 | * D-Link DWM 652 still exposes CD-Rom emulation interface in modem | 1378 | if (iface_desc->bInterfaceClass == 0x08) |
1355 | * mode. | ||
1356 | */ | ||
1357 | if (dev_desc->idVendor == DLINK_VENDOR_ID && | ||
1358 | dev_desc->idProduct == DLINK_PRODUCT_DWM_652 && | ||
1359 | iface_desc->bInterfaceClass == 0x08) | ||
1360 | return -ENODEV; | 1379 | return -ENODEV; |
1361 | 1380 | ||
1362 | /* Bandrich modem and AT command interface is 0xff */ | ||
1363 | if ((dev_desc->idVendor == BANDRICH_VENDOR_ID || | ||
1364 | dev_desc->idVendor == PIRELLI_VENDOR_ID) && | ||
1365 | iface_desc->bInterfaceClass != 0xff) | ||
1366 | return -ENODEV; | ||
1367 | /* | 1381 | /* |
1368 | * Don't bind reserved interfaces (like network ones) which often have | 1382 | * Don't bind reserved interfaces (like network ones) which often have |
1369 | * the same class/subclass/protocol as the serial interfaces. Look at | 1383 | * the same class/subclass/protocol as the serial interfaces. Look at |
@@ -1378,9 +1392,9 @@ static int option_probe(struct usb_serial *serial, | |||
1378 | * Don't bind network interface on Samsung GT-B3730, it is handled by | 1392 | * Don't bind network interface on Samsung GT-B3730, it is handled by |
1379 | * a separate module. | 1393 | * a separate module. |
1380 | */ | 1394 | */ |
1381 | if (dev_desc->idVendor == SAMSUNG_VENDOR_ID && | 1395 | if (dev_desc->idVendor == cpu_to_le16(SAMSUNG_VENDOR_ID) && |
1382 | dev_desc->idProduct == SAMSUNG_PRODUCT_GT_B3730 && | 1396 | dev_desc->idProduct == cpu_to_le16(SAMSUNG_PRODUCT_GT_B3730) && |
1383 | iface_desc->bInterfaceClass != USB_CLASS_CDC_DATA) | 1397 | iface_desc->bInterfaceClass != USB_CLASS_CDC_DATA) |
1384 | return -ENODEV; | 1398 | return -ENODEV; |
1385 | 1399 | ||
1386 | /* Store device id so we can use it during attach. */ | 1400 | /* Store device id so we can use it during attach. */ |
@@ -1518,5 +1532,4 @@ static int option_send_setup(struct usb_serial_port *port) | |||
1518 | 1532 | ||
1519 | MODULE_AUTHOR(DRIVER_AUTHOR); | 1533 | MODULE_AUTHOR(DRIVER_AUTHOR); |
1520 | MODULE_DESCRIPTION(DRIVER_DESC); | 1534 | MODULE_DESCRIPTION(DRIVER_DESC); |
1521 | MODULE_VERSION(DRIVER_VERSION); | ||
1522 | MODULE_LICENSE("GPL"); | 1535 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c index cee9a52ca891..d217fd6ee43f 100644 --- a/drivers/usb/serial/oti6858.c +++ b/drivers/usb/serial/oti6858.c | |||
@@ -57,7 +57,6 @@ | |||
57 | #define OTI6858_DESCRIPTION \ | 57 | #define OTI6858_DESCRIPTION \ |
58 | "Ours Technology Inc. OTi-6858 USB to serial adapter driver" | 58 | "Ours Technology Inc. OTi-6858 USB to serial adapter driver" |
59 | #define OTI6858_AUTHOR "Tomasz Michal Lukaszewski <FIXME@FIXME>" | 59 | #define OTI6858_AUTHOR "Tomasz Michal Lukaszewski <FIXME@FIXME>" |
60 | #define OTI6858_VERSION "0.2" | ||
61 | 60 | ||
62 | static const struct usb_device_id id_table[] = { | 61 | static const struct usb_device_id id_table[] = { |
63 | { USB_DEVICE(OTI6858_VENDOR_ID, OTI6858_PRODUCT_ID) }, | 62 | { USB_DEVICE(OTI6858_VENDOR_ID, OTI6858_PRODUCT_ID) }, |
@@ -899,5 +898,4 @@ module_usb_serial_driver(serial_drivers, id_table); | |||
899 | 898 | ||
900 | MODULE_DESCRIPTION(OTI6858_DESCRIPTION); | 899 | MODULE_DESCRIPTION(OTI6858_DESCRIPTION); |
901 | MODULE_AUTHOR(OTI6858_AUTHOR); | 900 | MODULE_AUTHOR(OTI6858_AUTHOR); |
902 | MODULE_VERSION(OTI6858_VERSION); | ||
903 | MODULE_LICENSE("GPL"); | 901 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/quatech2.c b/drivers/usb/serial/quatech2.c index ffcfc962ab10..d152be97d041 100644 --- a/drivers/usb/serial/quatech2.c +++ b/drivers/usb/serial/quatech2.c | |||
@@ -65,8 +65,6 @@ | |||
65 | #define QT2_WRITE_BUFFER_SIZE 512 /* size of write buffer */ | 65 | #define QT2_WRITE_BUFFER_SIZE 512 /* size of write buffer */ |
66 | #define QT2_WRITE_CONTROL_SIZE 5 /* control bytes used for a write */ | 66 | #define QT2_WRITE_CONTROL_SIZE 5 /* control bytes used for a write */ |
67 | 67 | ||
68 | /* Version Information */ | ||
69 | #define DRIVER_VERSION "v0.1" | ||
70 | #define DRIVER_DESC "Quatech 2nd gen USB to Serial Driver" | 68 | #define DRIVER_DESC "Quatech 2nd gen USB to Serial Driver" |
71 | 69 | ||
72 | #define USB_VENDOR_ID_QUATECH 0x061d | 70 | #define USB_VENDOR_ID_QUATECH 0x061d |
diff --git a/drivers/usb/serial/siemens_mpi.c b/drivers/usb/serial/siemens_mpi.c index e4a1787cdbac..a76b1ae54a2a 100644 --- a/drivers/usb/serial/siemens_mpi.c +++ b/drivers/usb/serial/siemens_mpi.c | |||
@@ -16,8 +16,6 @@ | |||
16 | #include <linux/usb.h> | 16 | #include <linux/usb.h> |
17 | #include <linux/usb/serial.h> | 17 | #include <linux/usb/serial.h> |
18 | 18 | ||
19 | /* Version Information */ | ||
20 | #define DRIVER_VERSION "Version 0.1 09/26/2005" | ||
21 | #define DRIVER_AUTHOR "Thomas Hergenhahn@web.de http://libnodave.sf.net" | 19 | #define DRIVER_AUTHOR "Thomas Hergenhahn@web.de http://libnodave.sf.net" |
22 | #define DRIVER_DESC "Driver for Siemens USB/MPI adapter" | 20 | #define DRIVER_DESC "Driver for Siemens USB/MPI adapter" |
23 | 21 | ||
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c index 270860f6bb2a..af06f2f5f38b 100644 --- a/drivers/usb/serial/sierra.c +++ b/drivers/usb/serial/sierra.c | |||
@@ -18,7 +18,7 @@ | |||
18 | */ | 18 | */ |
19 | /* Uncomment to log function calls */ | 19 | /* Uncomment to log function calls */ |
20 | /* #define DEBUG */ | 20 | /* #define DEBUG */ |
21 | #define DRIVER_VERSION "v.1.7.16" | 21 | |
22 | #define DRIVER_AUTHOR "Kevin Lloyd, Elina Pasheva, Matthew Safar, Rory Filer" | 22 | #define DRIVER_AUTHOR "Kevin Lloyd, Elina Pasheva, Matthew Safar, Rory Filer" |
23 | #define DRIVER_DESC "USB Driver for Sierra Wireless USB modems" | 23 | #define DRIVER_DESC "USB Driver for Sierra Wireless USB modems" |
24 | 24 | ||
@@ -1078,7 +1078,6 @@ module_usb_serial_driver(serial_drivers, id_table); | |||
1078 | 1078 | ||
1079 | MODULE_AUTHOR(DRIVER_AUTHOR); | 1079 | MODULE_AUTHOR(DRIVER_AUTHOR); |
1080 | MODULE_DESCRIPTION(DRIVER_DESC); | 1080 | MODULE_DESCRIPTION(DRIVER_DESC); |
1081 | MODULE_VERSION(DRIVER_VERSION); | ||
1082 | MODULE_LICENSE("GPL"); | 1081 | MODULE_LICENSE("GPL"); |
1083 | 1082 | ||
1084 | module_param(nmea, bool, S_IRUGO | S_IWUSR); | 1083 | module_param(nmea, bool, S_IRUGO | S_IWUSR); |
diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c index 769c137f8975..a42536af1256 100644 --- a/drivers/usb/serial/spcp8x5.c +++ b/drivers/usb/serial/spcp8x5.c | |||
@@ -28,9 +28,6 @@ | |||
28 | #include <linux/usb.h> | 28 | #include <linux/usb.h> |
29 | #include <linux/usb/serial.h> | 29 | #include <linux/usb/serial.h> |
30 | 30 | ||
31 | |||
32 | /* Version Information */ | ||
33 | #define DRIVER_VERSION "v0.10" | ||
34 | #define DRIVER_DESC "SPCP8x5 USB to serial adaptor driver" | 31 | #define DRIVER_DESC "SPCP8x5 USB to serial adaptor driver" |
35 | 32 | ||
36 | #define SPCP8x5_007_VID 0x04FC | 33 | #define SPCP8x5_007_VID 0x04FC |
@@ -651,5 +648,4 @@ static struct usb_serial_driver * const serial_drivers[] = { | |||
651 | module_usb_serial_driver(serial_drivers, id_table); | 648 | module_usb_serial_driver(serial_drivers, id_table); |
652 | 649 | ||
653 | MODULE_DESCRIPTION(DRIVER_DESC); | 650 | MODULE_DESCRIPTION(DRIVER_DESC); |
654 | MODULE_VERSION(DRIVER_VERSION); | ||
655 | MODULE_LICENSE("GPL"); | 651 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/ssu100.c b/drivers/usb/serial/ssu100.c index 868d1e6852e2..4543ea350229 100644 --- a/drivers/usb/serial/ssu100.c +++ b/drivers/usb/serial/ssu100.c | |||
@@ -46,8 +46,6 @@ | |||
46 | #define FULLPWRBIT 0x00000080 | 46 | #define FULLPWRBIT 0x00000080 |
47 | #define NEXT_BOARD_POWER_BIT 0x00000004 | 47 | #define NEXT_BOARD_POWER_BIT 0x00000004 |
48 | 48 | ||
49 | /* Version Information */ | ||
50 | #define DRIVER_VERSION "v0.1" | ||
51 | #define DRIVER_DESC "Quatech SSU-100 USB to Serial Driver" | 49 | #define DRIVER_DESC "Quatech SSU-100 USB to Serial Driver" |
52 | 50 | ||
53 | #define USB_VENDOR_ID_QUATECH 0x061d /* Quatech VID */ | 51 | #define USB_VENDOR_ID_QUATECH 0x061d /* Quatech VID */ |
diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c index a3e9c095f0d8..01c94aada56c 100644 --- a/drivers/usb/serial/usb_wwan.c +++ b/drivers/usb/serial/usb_wwan.c | |||
@@ -19,7 +19,6 @@ | |||
19 | - controlling the baud rate doesn't make sense | 19 | - controlling the baud rate doesn't make sense |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #define DRIVER_VERSION "v0.7.2" | ||
23 | #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>" | 22 | #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>" |
24 | #define DRIVER_DESC "USB Driver for GSM modems" | 23 | #define DRIVER_DESC "USB Driver for GSM modems" |
25 | 24 | ||
@@ -710,5 +709,4 @@ EXPORT_SYMBOL(usb_wwan_resume); | |||
710 | 709 | ||
711 | MODULE_AUTHOR(DRIVER_AUTHOR); | 710 | MODULE_AUTHOR(DRIVER_AUTHOR); |
712 | MODULE_DESCRIPTION(DRIVER_DESC); | 711 | MODULE_DESCRIPTION(DRIVER_DESC); |
713 | MODULE_VERSION(DRIVER_VERSION); | ||
714 | MODULE_LICENSE("GPL"); | 712 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/serial/vivopay-serial.c b/drivers/usb/serial/vivopay-serial.c index 0c0aa876c209..6299526ff8c3 100644 --- a/drivers/usb/serial/vivopay-serial.c +++ b/drivers/usb/serial/vivopay-serial.c | |||
@@ -10,8 +10,6 @@ | |||
10 | #include <linux/usb.h> | 10 | #include <linux/usb.h> |
11 | #include <linux/usb/serial.h> | 11 | #include <linux/usb/serial.h> |
12 | 12 | ||
13 | |||
14 | #define DRIVER_VERSION "v1.0" | ||
15 | #define DRIVER_DESC "ViVOpay USB Serial Driver" | 13 | #define DRIVER_DESC "ViVOpay USB Serial Driver" |
16 | 14 | ||
17 | #define VIVOPAY_VENDOR_ID 0x1d5f | 15 | #define VIVOPAY_VENDOR_ID 0x1d5f |
@@ -42,5 +40,4 @@ module_usb_serial_driver(serial_drivers, id_table); | |||
42 | 40 | ||
43 | MODULE_AUTHOR("Forest Bond <forest.bond@outpostembedded.com>"); | 41 | MODULE_AUTHOR("Forest Bond <forest.bond@outpostembedded.com>"); |
44 | MODULE_DESCRIPTION(DRIVER_DESC); | 42 | MODULE_DESCRIPTION(DRIVER_DESC); |
45 | MODULE_VERSION(DRIVER_VERSION); | ||
46 | MODULE_LICENSE("GPL"); | 43 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig index 0ae7bb64b5ea..eab04a6b5fbc 100644 --- a/drivers/usb/storage/Kconfig +++ b/drivers/usb/storage/Kconfig | |||
@@ -203,7 +203,7 @@ config USB_STORAGE_ENE_UB6250 | |||
203 | 203 | ||
204 | config USB_UAS | 204 | config USB_UAS |
205 | tristate "USB Attached SCSI" | 205 | tristate "USB Attached SCSI" |
206 | depends on USB && SCSI | 206 | depends on USB && SCSI && BROKEN |
207 | help | 207 | help |
208 | The USB Attached SCSI protocol is supported by some USB | 208 | The USB Attached SCSI protocol is supported by some USB |
209 | storage devices. It permits higher performance by supporting | 209 | storage devices. It permits higher performance by supporting |
diff --git a/drivers/usb/storage/realtek_cr.c b/drivers/usb/storage/realtek_cr.c index d36446dd7ae8..ea5f2586fbdd 100644 --- a/drivers/usb/storage/realtek_cr.c +++ b/drivers/usb/storage/realtek_cr.c | |||
@@ -455,7 +455,7 @@ static int rts51x_check_status(struct us_data *us, u8 lun) | |||
455 | u8 buf[16]; | 455 | u8 buf[16]; |
456 | 456 | ||
457 | retval = rts51x_read_status(us, lun, buf, 16, &(chip->status_len)); | 457 | retval = rts51x_read_status(us, lun, buf, 16, &(chip->status_len)); |
458 | if (retval < 0) | 458 | if (retval != STATUS_SUCCESS) |
459 | return -EIO; | 459 | return -EIO; |
460 | 460 | ||
461 | US_DEBUGP("chip->status_len = %d\n", chip->status_len); | 461 | US_DEBUGP("chip->status_len = %d\n", chip->status_len); |
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 12aa72630aed..31b3e1a61bbd 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c | |||
@@ -925,7 +925,6 @@ int usb_stor_probe1(struct us_data **pus, | |||
925 | host->max_cmd_len = 16; | 925 | host->max_cmd_len = 16; |
926 | host->sg_tablesize = usb_stor_sg_tablesize(intf); | 926 | host->sg_tablesize = usb_stor_sg_tablesize(intf); |
927 | *pus = us = host_to_us(host); | 927 | *pus = us = host_to_us(host); |
928 | memset(us, 0, sizeof(struct us_data)); | ||
929 | mutex_init(&(us->dev_mutex)); | 928 | mutex_init(&(us->dev_mutex)); |
930 | us_set_lock_class(&us->dev_mutex, intf); | 929 | us_set_lock_class(&us->dev_mutex, intf); |
931 | init_completion(&us->cmnd_ready); | 930 | init_completion(&us->cmnd_ready); |
diff --git a/drivers/usb/usb-skeleton.c b/drivers/usb/usb-skeleton.c index 0616f235bd6b..ce310170829f 100644 --- a/drivers/usb/usb-skeleton.c +++ b/drivers/usb/usb-skeleton.c | |||
@@ -105,20 +105,15 @@ static int skel_open(struct inode *inode, struct file *file) | |||
105 | goto exit; | 105 | goto exit; |
106 | } | 106 | } |
107 | 107 | ||
108 | /* increment our usage count for the device */ | ||
109 | kref_get(&dev->kref); | ||
110 | |||
111 | /* lock the device to allow correctly handling errors | ||
112 | * in resumption */ | ||
113 | mutex_lock(&dev->io_mutex); | ||
114 | |||
115 | retval = usb_autopm_get_interface(interface); | 108 | retval = usb_autopm_get_interface(interface); |
116 | if (retval) | 109 | if (retval) |
117 | goto out_err; | 110 | goto exit; |
111 | |||
112 | /* increment our usage count for the device */ | ||
113 | kref_get(&dev->kref); | ||
118 | 114 | ||
119 | /* save our object in the file's private structure */ | 115 | /* save our object in the file's private structure */ |
120 | file->private_data = dev; | 116 | file->private_data = dev; |
121 | mutex_unlock(&dev->io_mutex); | ||
122 | 117 | ||
123 | exit: | 118 | exit: |
124 | return retval; | 119 | return retval; |
diff --git a/drivers/usb/wusbcore/devconnect.c b/drivers/usb/wusbcore/devconnect.c index 231009af65a3..1d365316960c 100644 --- a/drivers/usb/wusbcore/devconnect.c +++ b/drivers/usb/wusbcore/devconnect.c | |||
@@ -847,19 +847,6 @@ static void wusb_dev_bos_rm(struct wusb_dev *wusb_dev) | |||
847 | wusb_dev->wusb_cap_descr = NULL; | 847 | wusb_dev->wusb_cap_descr = NULL; |
848 | }; | 848 | }; |
849 | 849 | ||
850 | static struct usb_wireless_cap_descriptor wusb_cap_descr_default = { | ||
851 | .bLength = sizeof(wusb_cap_descr_default), | ||
852 | .bDescriptorType = USB_DT_DEVICE_CAPABILITY, | ||
853 | .bDevCapabilityType = USB_CAP_TYPE_WIRELESS_USB, | ||
854 | |||
855 | .bmAttributes = USB_WIRELESS_BEACON_NONE, | ||
856 | .wPHYRates = cpu_to_le16(USB_WIRELESS_PHY_53), | ||
857 | .bmTFITXPowerInfo = 0, | ||
858 | .bmFFITXPowerInfo = 0, | ||
859 | .bmBandGroup = cpu_to_le16(0x0001), /* WUSB1.0[7.4.1] bottom */ | ||
860 | .bReserved = 0 | ||
861 | }; | ||
862 | |||
863 | /* | 850 | /* |
864 | * USB stack's device addition Notifier Callback | 851 | * USB stack's device addition Notifier Callback |
865 | * | 852 | * |
diff --git a/drivers/uwb/Kconfig b/drivers/uwb/Kconfig index d100f54ed650..2431eedbe6a5 100644 --- a/drivers/uwb/Kconfig +++ b/drivers/uwb/Kconfig | |||
@@ -3,8 +3,7 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | menuconfig UWB | 5 | menuconfig UWB |
6 | tristate "Ultra Wideband devices (EXPERIMENTAL)" | 6 | tristate "Ultra Wideband devices" |
7 | depends on EXPERIMENTAL | ||
8 | depends on PCI | 7 | depends on PCI |
9 | default n | 8 | default n |
10 | help | 9 | help |
diff --git a/drivers/uwb/reset.c b/drivers/uwb/reset.c index 703228559e89..8b47c9cdd642 100644 --- a/drivers/uwb/reset.c +++ b/drivers/uwb/reset.c | |||
@@ -97,6 +97,7 @@ int uwb_rc_cmd_async(struct uwb_rc *rc, const char *cmd_name, | |||
97 | neh = uwb_rc_neh_add(rc, cmd, expected_type, expected_event, cb, arg); | 97 | neh = uwb_rc_neh_add(rc, cmd, expected_type, expected_event, cb, arg); |
98 | if (IS_ERR(neh)) { | 98 | if (IS_ERR(neh)) { |
99 | result = PTR_ERR(neh); | 99 | result = PTR_ERR(neh); |
100 | uwb_dev_unlock(&rc->uwb_dev); | ||
100 | goto out; | 101 | goto out; |
101 | } | 102 | } |
102 | 103 | ||
diff --git a/drivers/uwb/umc-bus.c b/drivers/uwb/umc-bus.c index 82a84d53120f..5c5b3fc9088a 100644 --- a/drivers/uwb/umc-bus.c +++ b/drivers/uwb/umc-bus.c | |||
@@ -63,7 +63,7 @@ int umc_controller_reset(struct umc_dev *umc) | |||
63 | struct device *parent = umc->dev.parent; | 63 | struct device *parent = umc->dev.parent; |
64 | int ret = 0; | 64 | int ret = 0; |
65 | 65 | ||
66 | if (device_trylock(parent)) | 66 | if (!device_trylock(parent)) |
67 | return -EAGAIN; | 67 | return -EAGAIN; |
68 | ret = device_for_each_child(parent, parent, umc_bus_pre_reset_helper); | 68 | ret = device_for_each_child(parent, parent, umc_bus_pre_reset_helper); |
69 | if (ret >= 0) | 69 | if (ret >= 0) |
diff --git a/firmware/Makefile b/firmware/Makefile index eeb14030d8a2..cbb09ce9730a 100644 --- a/firmware/Makefile +++ b/firmware/Makefile | |||
@@ -97,7 +97,6 @@ fw-shipped-$(CONFIG_TEHUTI) += tehuti/bdx.bin | |||
97 | fw-shipped-$(CONFIG_TIGON3) += tigon/tg3.bin tigon/tg3_tso.bin \ | 97 | fw-shipped-$(CONFIG_TIGON3) += tigon/tg3.bin tigon/tg3_tso.bin \ |
98 | tigon/tg3_tso5.bin | 98 | tigon/tg3_tso5.bin |
99 | fw-shipped-$(CONFIG_TYPHOON) += 3com/typhoon.bin | 99 | fw-shipped-$(CONFIG_TYPHOON) += 3com/typhoon.bin |
100 | fw-shipped-$(CONFIG_USB_DABUSB) += dabusb/firmware.fw dabusb/bitstream.bin | ||
101 | fw-shipped-$(CONFIG_USB_EMI26) += emi26/loader.fw emi26/firmware.fw \ | 100 | fw-shipped-$(CONFIG_USB_EMI26) += emi26/loader.fw emi26/firmware.fw \ |
102 | emi26/bitstream.fw | 101 | emi26/bitstream.fw |
103 | fw-shipped-$(CONFIG_USB_EMI62) += emi62/loader.fw emi62/bitstream.fw \ | 102 | fw-shipped-$(CONFIG_USB_EMI62) += emi62/loader.fw emi62/bitstream.fw \ |
diff --git a/firmware/dabusb/bitstream.bin.ihex b/firmware/dabusb/bitstream.bin.ihex deleted file mode 100644 index 5021a4b1e63f..000000000000 --- a/firmware/dabusb/bitstream.bin.ihex +++ /dev/null | |||
@@ -1,761 +0,0 @@ | |||
1 | :1000000000090FF00FF00FF00FF000000161000D7C | ||
2 | :1000100064616275736274722E6E63640062000BB9 | ||
3 | :10002000733130786C76713130300063000B3139C8 | ||
4 | :1000300039392F30392F32340064000931303A34E5 | ||
5 | :10004000323A3436006500002EC0FF20175F9F5BF8 | ||
6 | :10005000FEFBBBB7BBBBFBBFAFEFFBDFB7FBFB7F61 | ||
7 | :10006000BFB7EFF2FFFBFEFFFFEFFFFEFFBFFFFF9B | ||
8 | :10007000FFFFAFFFFAFFFFFFC9FFFFFFDFFFFFFF3B | ||
9 | :10008000FFFFFFFFFFFFFFFFFFFFFFFBFFA3FFFBE4 | ||
10 | :10009000FEFFBFEFE3FEFFBFE3FEFFBF6FFBF6FF18 | ||
11 | :1000A000BFFF47FFFF9FEEF9FECF9FEFFBCF9BEE19 | ||
12 | :1000B000F8FEEF8FEEFBFE0BFFFFFFFFFFFFFFFFE2 | ||
13 | :1000C000FFFFBFFFFFFBFFFFBFFFFFFC17FFFFFFAF | ||
14 | :1000D000FFFFFF7FFFFFFF7FFFFFFBFFFF7FFFFFB4 | ||
15 | :1000E000FC3FFFFFFFFFFFFFFFFFFFFBFFFFFFFFE7 | ||
16 | :1000F000FFFFFFFFFFFE5FFFFFFDFFFFDBFFFDFFD9 | ||
17 | :1001000077FFFDFFFFDFFEFDFFFFF2FFFFFFFFFFB9 | ||
18 | :10011000FFFDFFFFFFFDFFFFFFFFFFFFFFFFFFE111 | ||
19 | :100120007FFFFFFFFFFFFFFFFFFFFFFFFF3FFFFF1F | ||
20 | :10013000FFFFFFFFE3FFFFFFFFFFFFFFFFFFFFBF2B | ||
21 | :10014000FFFEFFFFFFFFFFFFFF67FFFFFFFFFFFF58 | ||
22 | :100150007FFFFFFF7FFFFFFFFFFFDFFFFFFF2FFF9F | ||
23 | :10016000F3FDFF7FDEF7FDFF7FF77DFF7FDFF7BD4C | ||
24 | :10017000FF7FFF1FFFEFFBFEFFBFEFFBFEFFEFFB6D | ||
25 | :10018000FEFFBFEFFBFEFFFF3FFE7F9FE7F9FE7F15 | ||
26 | :100190009FE7FA7F9FE7F9FE7F9FE7FFFC7FBFBFE6 | ||
27 | :1001A000EFFBFEFFBFEFFBB7BFEFFBFEFFBFEFFBB9 | ||
28 | :1001B000FFE0FDF9FE7F9FE7F9FE7F9DF9FE7D9D43 | ||
29 | :1001C000E7F9FE7F9FEDEDFFFDFF7FDFF7FDFF7F8E | ||
30 | :1001D000DFFDFF7FDFF7FDFF7FDFFF9BFFEFFBFE14 | ||
31 | :1001E000FBBFEFBBFEFFAFBBBEFFBFEFFBFEFFFFE2 | ||
32 | :1001F000B7BFDBF6BDBF6BDBF6F9BF5BD6F9BF6FF0 | ||
33 | :10020000DBF6FDBFFF0EFFFFFFFF5FFFF7FFFF7F86 | ||
34 | :10021000F7BDFFFFFFFFFFFFFFDF9FFFFFFFFEFFB9 | ||
35 | :10022000FFEFFEFEFFFF77FFFBFBFFFFFFFFF83F47 | ||
36 | :10023000FFFDFFFFFFFDFFFFFFFFFFFFFFFFFFFFD2 | ||
37 | :10024000FFFFFFF47FFFFEFDBEFFDFFEFFFFEF7F3E | ||
38 | :10025000FFCFFFCFFFFFFFDFE6FFFF7FDFF7DD7F91 | ||
39 | :100260007FDFF7FF7FDFD7FDFF7FDFF7FFCDFFF2F7 | ||
40 | :10027000FFFF4F7FF4FFFFFFE7EFFFFFFFFFFFFFF1 | ||
41 | :10028000FFFFBBFFEFFFFEFFFFFFEFFFFFEFFFFBF7 | ||
42 | :10029000FFFFFFFFFFFFFF65EFFFFF7FFFFDEFFFAA | ||
43 | :1002A000FFFFFEFFFFFFFFFFFFFFFFFECFDFFEFFB1 | ||
44 | :1002B000FFFBFFFFFFFFF3FFFFFFFFFFFFFFFFFF5E | ||
45 | :1002C000FEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F | ||
46 | :1002D000FFFFFFFFFFFEBFFFFFFFE37FFFFFFFFF0B | ||
47 | :1002E000FFFFEFEBFFFEBFFFEBFFFC7FFFFFFFEE2B | ||
48 | :1002F000FFFFFFFFFFFFDDFFD6FFFDBFFFFBFFFEA0 | ||
49 | :10030000FDFFFFFDEFFFFFFFFFFFFFDEFFFFFFFF32 | ||
50 | :10031000FFFFBFFFFDFF7FBFFF5FDFFFFFBF77FF77 | ||
51 | :10032000FFFF7FD7FFFFFFFFFFC3FFFFFFFFDFEFF1 | ||
52 | :10033000FFFFFEFBFFFFDFBFFFFFFFFFEDFFB7FF8C | ||
53 | :10034000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD | ||
54 | :10035000FFFFFFAF7FFFFFFFFFFFFFFFFFFFFFFF7D | ||
55 | :10036000FFFFFFFFFFFFFFFFDFBFDFF3FDFBFF5BD3 | ||
56 | :10037000FDFFBFEFF7FFFF7DFFFFFFFFF83BFFBF74 | ||
57 | :100380006FFFFEFFBFFFEB7DFFEFFBFEFFFFFFFFF9 | ||
58 | :10039000FFF27FFCFF3FDFEDFEFFFFFFFFEF5FF7A8 | ||
59 | :1003A000B5FFEFFFFFFFE03F9F9EFFFFEFFFDFFF87 | ||
60 | :1003B000BF5FBFCFF3FFFFFFFFFFFF69AF33FDFF5D | ||
61 | :1003C000FBFFFFFFFFFCFF7FD9FFDFFFFFFFFFF514 | ||
62 | :1003D000A3DF6EDEFFFFBDFFFFFEFFFFFFFEE7FDB9 | ||
63 | :1003E000FFFFFFF9EFC6FEB7ADE5F9FFFFFFCFFF57 | ||
64 | :1003F000FFFFCDFB7FFFFFFFF9F60FDFECCF7FFFA5 | ||
65 | :10040000FB7FFFFFFFFDFFFEF9FD7FFF7FFFF95B35 | ||
66 | :10041000FF73DCFD7BDFFFFFFF7BFFFFF753D6FFA2 | ||
67 | :10042000FFFFFFD89FFEFFEF7FEEFFFFFFFBEDED2D | ||
68 | :10043000FDFFFEFFFFFB7FFFE27FFF6FD857F7FF57 | ||
69 | :10044000FFFFDFFFE8FFFFFDFFFFFC7FFFE4FFFB97 | ||
70 | :10045000EFFBFEDFB7EDFFFEDF7FFFFE7FB7FFFFA5 | ||
71 | :10046000FFFF89FFFFCFF3FE7FFFEFFFFE7E7FFBE5 | ||
72 | :10047000FFFFFFFFFFFFFFF1FFEB7AD5BF6FDBBE92 | ||
73 | :10048000FDB7D8F6E5BF6FFBFEF5BD7E06FFDFF7D3 | ||
74 | :10049000FBF6FF3FFFDBFFFF6FFBF7FFFFFFFBFEFE | ||
75 | :1004A000F7AFFFB7EDEFF7FEFFFFDFFFFEFFEFFF58 | ||
76 | :1004B000FFFFFFBFF7FC1FEEFBFEBDFF7F5FD7FD19 | ||
77 | :1004C000FB43FFFFFDFF5FFFF7FFF93FFFCFF3FDAA | ||
78 | :1004D000F77EEFA7F9FE8FA7E9F37E9FFBF8FFFFFA | ||
79 | :1004E0003FFD7F5FDFFDFFFF5FFFFD5FFFFF7FFDE4 | ||
80 | :1004F0007FFD9FFFE0FFFAF8BE6F9FE6F8BE3F9AD0 | ||
81 | :10050000F9BE6F9FE2F9FE6F9FF9FFF5FD7FCFDF28 | ||
82 | :10051000FDFD7FFFF5FFFFFFF7F5FD0FDBFFD3FFCD | ||
83 | :10052000EBFAFFFFBFFFFAFFFFCBFBFEFFFFEBFA8B | ||
84 | :10053000FEFFFFB7FFFFFFFFBFFFDFF5FFFFD7FFA6 | ||
85 | :10054000FFFFDFD7F5FF7FFE4FFFFDFF7F7FFFAD92 | ||
86 | :10055000EBFBFFADFFFFFFFFAFEBFBFFFC0DFFFF72 | ||
87 | :10056000DFD2FDFFFFFDF6FFFF7FFFFF1FFFFFFF55 | ||
88 | :10057000FFFB3F7DEB32FEBF2FEBFAAEBDE0FA7E14 | ||
89 | :10058000BFADEBFAFEBFF57FFFDEFEE3FBFFFFFF33 | ||
90 | :10059000DFEF4FDFFF7FDFFFF7FFFFF87FFFFFEFAA | ||
91 | :1005A000FBFFFFFFEFFFFFDFEDFBDFFFBFFFFFFF05 | ||
92 | :1005B00081FFFFFFFF3FFFFFFFFFFEDDFEEFFDFFBF | ||
93 | :1005C000FFFBFEF7FF93FDFB7EFFFE87E9FF7FB396 | ||
94 | :1005D0009FFEFEFFAFFDFE7E3FFE67FFFFF7FFFFC2 | ||
95 | :1005E000FCF7DFFDFF7FFFFF7F6DFFFFFEFFFF2FAB | ||
96 | :1005F000FFBFFFFFEEFFBEFFFFFEFFEFFFFFFEFFAF | ||
97 | :10060000EFFFFFFA5FFFFFFBFFFFEFFFFBFEFDFFCA | ||
98 | :10061000FEFFFBFFFFFF7FFFFEBFDFFFFBFFFFF7DC | ||
99 | :10062000FCFDFFFFFFFFFF7FFFFFFFFFFFF27FFFEC | ||
100 | :10063000FFFFFF7FFFFFFFFFF3FFFFFFEFFBFFFF6A | ||
101 | :10064000FFDFE2FFFFFBFFFFFFFFFFFFFBE7FFFD19 | ||
102 | :10065000FFFFFFBFFFFFFFEDEFFDFFFFDFD7F5FD62 | ||
103 | :100660007F5DFDFF7FDF97F4FD7B5FFFC9FFFBFE32 | ||
104 | :10067000FFBFFF5FFFFFF7FFEFFDFFEFFFFFFFFF94 | ||
105 | :10068000FFF7FFD7FD7D7FFFFFFFFFEFDFF7FDFFE8 | ||
106 | :10069000BBFFFF7FFFFEE3FFF9FE7FBFEFFBFEFF27 | ||
107 | :1006A000BFF9FEFF9FEFF9FEFFBFF3DAFF37CDF38F | ||
108 | :1006B0007CDF37CDF37F37CDF37CDF37CCF37F5A48 | ||
109 | :1006C000BDF6FDBF6FDBF6FDBF6FDEFDBF6FDBF676 | ||
110 | :1006D000FDBF6FFEF16FEB7ADEB7ADEB7ADEB7AF41 | ||
111 | :1006E0007ADEB7ADEB7ADEB7FF7EFFFECDB36CDB13 | ||
112 | :1006F00036CDB36CDECDB36CDB36CDB36CDFC9BFAA | ||
113 | :10070000F7BDEF7A9EA7A9EA7AB7BDEA7BDEA7BD5F | ||
114 | :10071000CA728D91FFEFFBFEFFBFEFFBFEF7EFFB11 | ||
115 | :10072000FEFFBFEFFBFEFFFE87FFF6FDBF6FDBF6B0 | ||
116 | :10073000FDBF6FF6FDBF6FDBF6FDBF6FFE4FFFBF66 | ||
117 | :10074000EFBBEEFBBEEFBBEFBEEFBBEEFBBEEFBB06 | ||
118 | :10075000EFFC5FFFFFFF3FCFF3FCFF3FCFFCFF3F0E | ||
119 | :10076000CFF3FCFF3FCFFD9FFEBFAFEBFAFEBFAF65 | ||
120 | :10077000EBFEBFAFEBFAFEBFAFEBFFE16FFDFF7F1C | ||
121 | :10078000DFF7FDFF7FDFFDFF7FDFF7FDFF7FDFFF8F | ||
122 | :100790007ABFFBFEDFB7EDFB7EDFB7FB7EDFB7ED99 | ||
123 | :1007A000FB7EDFB7FFC9FFFFBFEFFBFEFFBFEFFB25 | ||
124 | :1007B000FFBFEFFBFEFFBFEEFBFEBBFFFEFFBFEF89 | ||
125 | :1007C000FBFEFFBFEFFEFFBFEFFBFEFF3FCFFFE7EC | ||
126 | :1007D000FEFFF5FD775DD735DD77D7F5CD7B5DD7AE | ||
127 | :1007E000F5DD77FE27FFFF8BE2F8BE2F8BE2F9AF36 | ||
128 | :1007F0008BE2F8BE2F8BE2F9FE1FFF5FD7F5FD7F7E | ||
129 | :100800005FD7F5FF5FD7F5FD7F5FD7F5FFFA3FFEB6 | ||
130 | :10081000BFAFEBFAFEBFAFEBECBFAFEBFAFEBFAF83 | ||
131 | :10082000EBFFFE7FFD7FFFFFFFFFFFFFFFFFFFFFEF | ||
132 | :10083000FFFFFFFFFFFFFFE6FFFADFF7FDFF7FDFB0 | ||
133 | :10084000F7FCFFDFF7FDFF7FDFF7FDFFF5FFFFFFA1 | ||
134 | :10085000FFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFAC | ||
135 | :10086000FF02FFFEBFABEBFABEBF23EBDE1FAFEA1A | ||
136 | :10087000FAFEAFAFEBFD97FFF3FC7B1FCFF1FC7FE0 | ||
137 | :100880001FF1FC771FCDF1FCFF1FFE87FFAFEFFAD2 | ||
138 | :10089000FEFFAFEFFAFDBF2BFB7EBFBFEBFBFBFB09 | ||
139 | :1008A000DFFFFBF7FFFF7FF7F7FFFDDFFEFCDFFF5A | ||
140 | :1008B000DFFFFDFFDABFFFBBEFFBF9FFBEEFFBFB86 | ||
141 | :1008C000BFEFFBFEFFBFEFFBFFF77FFDD7FFFF7F13 | ||
142 | :1008D000FFFFFFFEF7FFFEFFF7FFFF7FFFFFECFFCD | ||
143 | :1008E000FFFEDFBFFFFBFEFFBB68AE1FAEFBFBFFE3 | ||
144 | :1008F000FFBFFFD5FF7FFFFFF7FEFEFFBFEF9FFDAE | ||
145 | :100900007FFFCBFFFFDFFFFFBBF7BFFFFFFFFFDF77 | ||
146 | :10091000FFBFFBFFFFFFDE3FFFFFFFFFFFA7FFFF64 | ||
147 | :10092000FFFFEFFF7FFBFDFB7FFFFFFFFFCFF37CB0 | ||
148 | :10093000FF7F8D7FFFFFFFFFFBFFF7FBFEFDFFFF4C | ||
149 | :10094000FFFFF7FDFF7FFD1FFDFFFFFFFFBFDFFF85 | ||
150 | :10095000FFFE5CFF6DFF7FABE7F1FFFD9FFFFFAD8B | ||
151 | :10096000EB7A3F1FFFFFFEBFAFF3DEF5FF8FFBDF2C | ||
152 | :10097000E67FFFDFF3FDFF7EFFFFFFFFFFFDF7F3E5 | ||
153 | :100980007FDFF7EFFFF63F9FDFFFFFEEFFFFEFFB9D | ||
154 | :10099000FFFFF9FBFE4FBFEFBBFF69AFAFFCFF3FAF | ||
155 | :1009A000DDFFFCBF8FFFFDF3BFED9EFCBF6FF5D3F6 | ||
156 | :1009B000DFFFDBD6F5EFFDFEFFB9FF1FD2A9AFFFCA | ||
157 | :1009C000DBF7BFEF46FFFFADEB7ADFEFF7FF7FF717 | ||
158 | :1009D0009FEDFF7FFFADEB7FF56FFFFDFBD6F4F7DB | ||
159 | :1009E000FBF97E7FFF5FC2FEBFFDFB33DFF95BFFDC | ||
160 | :1009F000FFDD677DCFEFDBECFF77DDF7FDFFFFDE8F | ||
161 | :100A0000A7BFD49FFFFFBFEFFEFFDFEFBBFFFFEFEE | ||
162 | :100A1000EBFAFFEFBDFBFFE27FFFDFDFF7FDBFBBC0 | ||
163 | :100A200073F7FD7FDFDEF7BFEADBF6FFD6FFFF6679 | ||
164 | :100A3000FFBEFFBF6BD9F6DFFFFB7E7FB77EFFFEF9 | ||
165 | :100A4000FFCDFFFE7FFFFCFD3FFBFBF7FFFFFBF64B | ||
166 | :100A50007DFE7FFFFCFFB9FFF9FAFEBFAF5BD6ED6D | ||
167 | :100A6000AD7BF6F9BFEFF8FAFEBFFEE6FFFFF7FD3C | ||
168 | :100A7000FF7FBFEFF3FFFF6FF7FEFFFFF7FDFEF70E | ||
169 | :100A8000EFFFFBEFFB7EDEFEFFBFFFFEFFFFFBFF86 | ||
170 | :100A9000FFEFFB6FFC1FFEE7FFFFFFEFFFD3B4BBD1 | ||
171 | :100AA000FFFFFDBF6FE3FEFFBFFCBFF7CFF7FDFF0A | ||
172 | :100AB0002FDFABEAFFDFE7EA9AAFEFFBFEFFF53F80 | ||
173 | :100AC000FD7EFFD7F5FBFFFDF7FF7FFEF7FDFFD7AC | ||
174 | :100AD000FFD77FEE7FFA79FE2F8BE6F9FE3F9EF976 | ||
175 | :100AE000BE2F0BE7F9FE2F9FFDFFFE7D7F5FD7FF37 | ||
176 | :100AF000FF7FFFFDFF7F5F97FFFD7F5FFFE3FFFF4E | ||
177 | :100B0000FAFEBFAFFBFBFFFFCFEBFEBFAFFFFAFE6E | ||
178 | :100B1000BFFF87FFFFF5FFFFFFFFFDFF7FFFFFFF29 | ||
179 | :100B2000FBFFFFF5FFFFFE0FFFFDEBFFFFF7FFEF02 | ||
180 | :100B30007BDFFEFFFFDFF7FDEB7FDFFF5FFFFFFFE8 | ||
181 | :100B4000FFFDBFFF7EFABFC7DBF7BD3FFBFFF6FF30 | ||
182 | :100B5000FAAFFFEBFAFE3F2FEAFA3EADC9BAF6ADA7 | ||
183 | :100B6000AFEBFAF6BFFE7FFFFFFDFFF17F3FCFF156 | ||
184 | :100B7000EFFF7FFFBCDFDFF7DDFFE07FFFFFFEFF62 | ||
185 | :100B8000FAECBB7F5FFFFBECFFEFB7FFF7FFFFB5B2 | ||
186 | :100B9000FFFF7FFFFFFFEEDF5FDFDEFFAEE777FFE8 | ||
187 | :100BA000FFDFF7FFE3FFFABBFEFFAFFDFBFEBFABCE | ||
188 | :100BB000F9FEFFBF7FBFFEBDFED7FF9FFDFFBEEF6B | ||
189 | :100BC000FFEEFDBB5BEFFF7FEFFFEFFF7FFF4FFF10 | ||
190 | :100BD000EFFBBCFCFFFFFFFEFEFDFAFEFBFFFDF39B | ||
191 | :100BE000FBFFF85FFFFFD7F5FDDFEFFFF3DC5FCE24 | ||
192 | :100BF000F5BDFFFFD7FFFFF93FFFDFF7FFFEFFFD6A | ||
193 | :100C0000FFFBFFF7B97DFEDFFFFFFFFFF97FFFFE70 | ||
194 | :100C1000FFFF7FFFFEFFFFF7F6FFBFF1F8FFFFFFCB | ||
195 | :100C2000FFE0FFFFFFFFF9FFFFFFFFFFEFEFFFFF19 | ||
196 | :100C30009BFB7FFFFFFFC1FFDFFF3F5FD7BFEFBB26 | ||
197 | :100C4000DEEEFF7FDFFFFEF57FDFFF99FFFFFAFF9C | ||
198 | :100C5000BFFDEB7AFFB7FEFEFFFFEFFFFFFDBFFF1B | ||
199 | :100C600097FFFDF7FF7FF7FFFFFD5FFEF3F9DFDF83 | ||
200 | :100C7000FFFFFCFFFF83FFFFFEFF9EECFBEEFF9FED | ||
201 | :100C8000BFEFFFFEED7BFFFFFFF15AFFFFFDFF7C93 | ||
202 | :100C9000693BDFFF7F1FDFFFFDBAFFFFFBFF5BBD8F | ||
203 | :100CA000FFFFFFFFD7B6EDE9FFD6BD6F5FFBFFEF9C | ||
204 | :100CB000FF5FFEF66FFFFFFFFFF7EB7ADFFF9F7F1F | ||
205 | :100CC0007FFFB7FFFFFEDFFF6CFFFBFFBB6FEBFE9D | ||
206 | :100CD000CCF7A5FA5CF575BBB7DFFE6F5FC5BFFD4E | ||
207 | :100CE0007BFEFF95E729CF4FF591EE6BDFEFFD54CB | ||
208 | :100CF000F5BDB1FFEFEEFBBEBFAFFEDEBD6FDAF2BA | ||
209 | :100D0000FFAFBEFFFFFD7EA7FFF7FFBFEF7BF6FD46 | ||
210 | :100D1000BD4AF28585BF5BFEB5FDFAFF4FFFFEDFE2 | ||
211 | :100D2000FFEDFFBFFFBF7FFEFFB76DFFF7BFBFEF58 | ||
212 | :100D3000FD1FFFFE7DFF67FFFFFF3F7FFEBFFFE759 | ||
213 | :100D4000DFE7FFEF6BFC1FFFBFEFFBFEDEBFAFFA7D | ||
214 | :100D5000FFB6EFF9FEFF8FEFDBEFAB6FFBFEFFFFA0 | ||
215 | :100D6000EFFDFF7FFFFFDEFFFFEFFFFFFF3FFF6CA9 | ||
216 | :100D7000FFBFFBFFFEFFFBFEDFFFFFEFFFFFBFFF3D | ||
217 | :100D8000FFFEFBFFD57FFFFFEFFBFFFFBFEF43B58C | ||
218 | :100D9000FD6FCFD6BE3F7FDBFEC3FFFDFFAFEBFB9A | ||
219 | :100DA000FCFF3EEFE8FABDCDAAFEFE7DCFFFB7FF08 | ||
220 | :100DB000F7FFFFFFFDFF75CD52D7FDFBF7DDFBEF22 | ||
221 | :100DC000EBFFFF4FFFBF9FE7F9FC7F8BC3F9AF8FAE | ||
222 | :100DD000E7E9BE7F9FE6F9FC5FFFFFF7FDFF7A5F63 | ||
223 | :100DE000D7EDFFFFD7FFDD7FE7FFFCFFFC3FFFFFF5 | ||
224 | :100DF000FFFBFFFEBFAFFFFDFFEFFFEBFFFFFFFFBE | ||
225 | :100E0000FFF77FFF7FDFFFFDFD7FFEF7FD7FDFFF49 | ||
226 | :100E1000FDFFFFDFFBFFEEFFFBFFF7FDFF7ADFF5D6 | ||
227 | :100E2000FDFADFF7FCFF7FDFBFEDFFC9FFDFFFBF8C | ||
228 | :100E30002FFBFFBCADFFF7FFFFEFD3FF7DBF6FFFC1 | ||
229 | :100E4000FAFFFEBFAEEAFABEADA5EBCEBFA7EB5AE6 | ||
230 | :100E5000DEBDAF6BFD57FFFFF47F1F7FFDFF7F36C9 | ||
231 | :100E6000F0DF79FFFFFFF7FDBFFF87FFFBF3FCFF1C | ||
232 | :100E7000FFFFFF7EFFBFDFFFFFFFFFFFFDBFF89F0C | ||
233 | :100E8000FFFFFFFFBFFFFFFDF7FCBDFFFEFFFFFF02 | ||
234 | :100E9000FFFFFBF9BFFFFFEBE2FEFFBFEFA9BA2F99 | ||
235 | :100EA000EBF9FE77DFF7FFFFF97FFFFF7FEFD7FF5B | ||
236 | :100EB000FDFFFBF5FFBF6FDFFFFFFDFFFFF0FFFF53 | ||
237 | :100EC000FF3FCFFFBAEE9BBFEED7FECDEFFFDFBFF8 | ||
238 | :100ED000FFFFC5FFFFFD7F4FFDF6D9FF4FD6FDBFDA | ||
239 | :100EE0006EFFFFF47FFF7F8BFFFFFFFFF7FFF9FE31 | ||
240 | :100EF00037FFD9FBF5AFFDFFFFFBFFFF07FFFFFF4C | ||
241 | :100F0000FBF7FFFDFF7CFA7E4FFCDF1DC7FFFFFFF5 | ||
242 | :100F1000FFAEFFFFFFFFFDFBFFFFFEFEFCFF7F7F3D | ||
243 | :100F2000BFEFFEFFFFFF5FFDFFFFFFFD6F5AD77BA7 | ||
244 | :100F3000BE5FFE39FFF7FFF7FDFEAA1FFFFFFFFFB1 | ||
245 | :100F4000FEFEABAFFDFEBFFFF7FF7FFE8FE3FBEEC4 | ||
246 | :100F50007FFFFFFFFFEBFBFFFDBFEFDFFFFFFFFFAB | ||
247 | :100F6000FFFFFFFBE43FFFDFFFFFFFFFF3EFBBFBF4 | ||
248 | :100F7000BFEFBBFFD7BFFFFFFF29AFF7FFFFFBFFAF | ||
249 | :100F8000FBE6FF0FFB3FDF0FFFAFFFFFFFF5C3DF08 | ||
250 | :100F90005FFFFFFFFE6BCABEBCFF9FF2BFFFFEFA02 | ||
251 | :100FA000FFFFEF16FFFFFFFFFFFCDF97FD79FF3725 | ||
252 | :100FB000E77FFFFFB5FFFFF62FFFFDFBFEFFFFFD05 | ||
253 | :100FC0005F575FFFDB52DFFFFDBFFFFFFCDBFF7BF7 | ||
254 | :100FD000B5FD7FFF719C6EFFF635A59BFFFFFDFF02 | ||
255 | :100FE000FFDB9E7FFEEFFBFFFFBDEFFFDEB7F94BA0 | ||
256 | :100FF000FFF5EFFFFFFFE87EFFEADFF7FFFD695B2C | ||
257 | :10100000FC9FEF78D6FFEBEFFFFFFFE8FFFFEDFF60 | ||
258 | :10101000FFFFFFE3F9F6BFFFFFFEDFFF7FFFFFFFEC | ||
259 | :10102000D1FFFFE7FFFFFFFFE7F9FFBF7FD9FFFD1C | ||
260 | :10103000FE7FFFFEFFF9FFFBD6DFBFEF5BD6FFBFF2 | ||
261 | :10104000FBF6FFBFEFF8F6DDBEFE16FFBFEFFFFEBB | ||
262 | :10105000FFBFEFFFFFFF6FFBFFFFFF6FF3FFF7EF38 | ||
263 | :10106000FBFFBFFFEFFEFFBFFFFFFFBEBFFFEFFFB6 | ||
264 | :101070007FEFFFFD17FB7BFFFFFD7FDBF6F47FFAC1 | ||
265 | :10108000FEF5BFEBE3F7FFFFE9BFFFAFF7FDF37E30 | ||
266 | :101090008FA3EAFFCBF3EEFFBFEFF7F9FFFE7FFF71 | ||
267 | :1010A000FFFFFFF5FBF6FFF52FFEFBD7BFFFBEDF0F | ||
268 | :1010B0009FFFF0FFFFF9FE7F8FA3F8FE6F9FF9F609 | ||
269 | :1010C0002F9FE7F9FE2F9FE1FFFFFF7FDFF7F5FD81 | ||
270 | :1010D0007F7FF5FF9F5FFBFEFF7FFFFFCBFFFFFBE7 | ||
271 | :1010E000FEFFBFAFFBFEFFDFFEFEBFF7FFFFFFFF10 | ||
272 | :1010F000FFC7FFFFFDFF7FDDF7FDFFFFD7FFFD7F90 | ||
273 | :10110000FFFBFDFFFFFEEF7FFDEFFBFEFBFDFF7F23 | ||
274 | :10111000DFFDFF7ADFF7FDFFFFFFFF1FFFFFD3F7C4 | ||
275 | :10112000FFFF6FDBFFFFEFCBF4FFFFFFFFFFFFFED3 | ||
276 | :1011300029FFE8DA769FAF6ADAFE35EBDAD6BFAB85 | ||
277 | :10114000EB7ADEBFD77FFFFEFFBFEFFDDF77BFFD8E | ||
278 | :1011500037EFFFEFFF3FFFFFFFFE7FFFFFFFF77E51 | ||
279 | :10116000DFFFFFFFFAB77FFFFFFEFFFFFFFF89FFF3 | ||
280 | :10117000FFFFFFFFFFFFFFFFFF9FFBFFFFFFE7FFFB | ||
281 | :10118000FFFFFFAAFFABFBFAEFBFFFDFFA7BB9FE61 | ||
282 | :10119000FEFFFDFFF7FE3FFFB7FFF7EEFF7FEFFF1C | ||
283 | :1011A000FF7FFF1FFBFFBFFBFEFFBDFFFF2FFFBF4A | ||
284 | :1011B000FF7FDFFAFFFFFCEEF5F3BEFB0FEFF3BEA0 | ||
285 | :1011C000EFFC5FFF5AFFF7DFFFFFFED5FC5FFBF28E | ||
286 | :1011D000FFFF2FBBF3FFFFBFFFEFFFEFFFFFFFFF9F | ||
287 | :1011E000BFFFFFFD7BFFDFB9FFFBFFD87FFFFFFFE6 | ||
288 | :1011F000FBFFFC7F1FBFE0DFF7EFFFFD7FFEDFFFA0 | ||
289 | :10120000E0FFFFFDEFFBFFFEF7DFFFEB5FFFF7FF08 | ||
290 | :10121000FFFFFFBFFFFDFFFDFFFFFFF7FDFF3BDC13 | ||
291 | :10122000FD6D7B5F57F5FD7F5FFFB1FFEBFFFFFFBC | ||
292 | :10123000FBFBFEFFBFFBBEFFBFEFFBFEFFAFFEF7FA | ||
293 | :10124000DFDFFFFFFF7FCFF3F8FFD7FBFF5FBFF7C5 | ||
294 | :10125000FBFF7FFE23FFFFFE7FF3FFFBFEFFFFF39D | ||
295 | :10126000FFFFF5F9FF3FFFFFF09AFFBE7FFFFCF99C | ||
296 | :10127000FFFDAFEBFEBFFFCFF3FE7FFFFF5BBDFFC8 | ||
297 | :10128000BCEBFFD7D4AFAFFDFFCFF7FDFF7FDFF79C | ||
298 | :10129000FDFEFF6FFFFBFFFFFFFD7F5EFDBFDBF687 | ||
299 | :1012A000FDBF6FFBEEFDFF7AFFFAFBFF3FFBB75F71 | ||
300 | :1012B000D6F71F71DC771DC731DC77DFF9BFF55B2F | ||
301 | :1012C000F4D79DAEFFBFFDBFDBF6FDBF6FDBF6FEC3 | ||
302 | :1012D0003D81FFEBFEFEFEFFEB7ADF7D777DF5794A | ||
303 | :1012E000DF57DDF57D7EE6FFD63FBF7FFFD4F53FBC | ||
304 | :1012F000BFFBBEEFB3EEFB9EEFBBFE8BFFFEDFB787 | ||
305 | :10130000EDFFF7FDFEFFEFBBEEFFBEEFBBEEEBFC2C | ||
306 | :101310001FFFFFFDFFE7FFF7FDFFEFFEFFBFEFFB46 | ||
307 | :10132000FEFFBFEBFA1FFFB7EF5BFEFFAFEBDDE7A2 | ||
308 | :10133000DE779DE779DE779DBFE66FFFFEFFBFEFAB | ||
309 | :10134000FBFEFDBF6FF6FDBF6FDBF6FDBFFF7EFF4F | ||
310 | :10135000FFFBFEFEFFEFFBFDEF7EF7BDEF7BDEF751 | ||
311 | :10136000BDEFFFD5FFBFFFEFFEFFFC3F0FE7FE7FA6 | ||
312 | :101370009FE7F9FE7F9FE7FEF3FFFEDFADDF67EE3D | ||
313 | :10138000FBBFEFFEFFBFEFFBFEFFBFEFFF23FFFF43 | ||
314 | :10139000FFFF7FFFF3BCDBFEFBFFFBBEF7FBFF7F26 | ||
315 | :1013A000DFFFCFFBFF9FE3F9BE3F8FE779FF9DE7AC | ||
316 | :1013B000F9FE7F9FE7F9FE5FFFCFF7FFFFFFDFF743 | ||
317 | :1013C000FE7FE7F9FE7FFFFFFBFEFFFFBFFFBFBF12 | ||
318 | :1013D000FFFEFFBFEFFFFDFFFFFFFFFFFFF7FDFF7A | ||
319 | :1013E000FF3FFFBFFFF7FFFF7FDFFFFFFFFFFFFFB5 | ||
320 | :1013F000FFFFFFFFFFE8EFFF5FF7BFF9FEDFB7FD7D | ||
321 | :10140000FFDFF7FDFF7FDFF7FDFFDDFFF2FFBFFF2F | ||
322 | :10141000FFBFFFFF2FF2FFBF2F7BD2F7BF2FFFBB16 | ||
323 | :10142000FFEE8FAFEBFAFE3FA769CE8FA4EAFAEE8C | ||
324 | :10143000B7AEEBFDC7FFF7F7FFFFFFFFFF7F3EF300 | ||
325 | :1014400074FF3F4FFFE7FF3FFEA7FFFFDFF7B7FF48 | ||
326 | :10145000F7FFBAEF37EBFBFEBFFBFEF3FFF9DFFF51 | ||
327 | :10146000BFFFFFFFBFFFFFFFFDDFFFFDFFFFFBFE35 | ||
328 | :10147000FDFFFBBFFE3FEDFFDFBE3DA7FBFA3FE6F2 | ||
329 | :10148000E1FEFE3FEFE3DFF57FFEFF7EFFFFFFFFA4 | ||
330 | :10149000EF6FF6FF7DEFD7DEFF7DEFFFF2FFFFFF7F | ||
331 | :1014A000FFFFFF7BDEFBE6EEEF376EF37EEB37EF01 | ||
332 | :1014B000FFC1FFFEFFF7EFFFFFFFBF3FD2DFBF2FF0 | ||
333 | :1014C0007BE2FFFE3BBDDBFFFEFFFFFFFFFFEFFE0A | ||
334 | :1014D000FFFBFFFFBFFFFBDFFFBFFFB7FFFFBFEF5C | ||
335 | :1014E000FFFFFFFFFFFF0FFF7FFF1FEFF1FDFFF685 | ||
336 | :1014F000AFFFFFFFFFFFEFFFFFFFFE9FFFFFFF7745 | ||
337 | :10150000EFF7FBFFFE5FFFFFBFCFFBF7DDF7F5FF58 | ||
338 | :101510005FD5F5FD7F5FD7F5FFFB0FFFFFA9EA7AE7 | ||
339 | :10152000FFAF8FFEDFAFEFFBFEFFBFEFFBDFE55F3F | ||
340 | :10153000FFFFFFFFFFBD57FFFF6F77BFF7FBFF7F89 | ||
341 | :10154000BFF7FFFCBFFF9FFFFFEFFFFEFFFFFF1F87 | ||
342 | :10155000CFFFFCFFFFFFFFFB65AFF37CFF3FDFFF2B | ||
343 | :10156000FDE9FE7FE7FFFE7FFFFFFFFFFDE3DFFBFF | ||
344 | :10157000DBF6FDEF5BFBFFDFFCFF3FDFF3FDFF7FF3 | ||
345 | :10158000DFEF66FFDFADEB7ADEF7F7E7D9FD9F67A8 | ||
346 | :10159000D9F67D9FE7DFF547FD655BD6F4FEFFEFEB | ||
347 | :1015A000FF6DF6DDB76DDB76DCB77DFA9BF66D9DE2 | ||
348 | :1015B0006759DFF7DDFFEBFEBFAFEBFAFEBFAFE32E | ||
349 | :1015C000D19FFFBDBFEFFEF7BFBFF7D77FDDF79D10 | ||
350 | :1015D000DF7FDFF7FFE07FFDC1DFF7FDC77F7FFB28 | ||
351 | :1015E000FFBBECFB3EFFBFECFBFFD87FBF6CFFBE39 | ||
352 | :1015F000FFBFEDFFEFFEFBBFEFFBFEFFBFEEFFC542 | ||
353 | :10160000FFAF6FFFFCFD3FE7FFFEFFEFFBFEFFBFFD | ||
354 | :10161000EFFBFEBF89FEFABAFEBFAFFBF6F5D97D40 | ||
355 | :101620009765D9745D9765D3FED6FFBFF7FDFF7F41 | ||
356 | :10163000BFCFFBFEFFEFFBFEFFBFEFFBFFF68FFB15 | ||
357 | :10164000FFEFFB7EDBFEFFBEEFEEFBBEEFBBEEFB74 | ||
358 | :10165000BEFFFFDFFF43FFFFFBEF5FB7FE7FE7F952 | ||
359 | :10166000FE7F9FE7F9FE7FF9BFFEAF77FDFF2FAF4B | ||
360 | :10167000A7FEFFEFFBFEFFBFEFFBFEFFF17FEFDFFB | ||
361 | :10168000FF97F5EFFFDFFFFFBFFFBFFFFFFEFFFF8D | ||
362 | :10169000FFE0FFFFF9FE2F8BE3F8BE779FF9DA77C3 | ||
363 | :1016A0009DE779DE779FDDFFFDFD7F5FD7FDFF7F43 | ||
364 | :1016B000E7FE7F97E7FBFEFFBFEFFFABFFEFFAFE12 | ||
365 | :1016C000BFAFFFFAFFFFDFFFFBFFF7FDFF7FDFFF8D | ||
366 | :1016D00067FFF7F5FFFFFFDFFDFFFFFFFFFFFFFFE6 | ||
367 | :1016E000FFFFFFFFFFEFFFBDEBFFFFF7ADEBFFDFFE | ||
368 | :1016F000FDFF3FDFF7FDFF7FDFFF5FFFF7FFFFFD30 | ||
369 | :10170000BFFFCBF4FF7FD3F7FD3F7FD3F7FFFC3F55 | ||
370 | :10171000FFEAFABEAFABEBBAF4956B52D4AD2F4AE9 | ||
371 | :10172000D2F6BFD27FF73FFFFFF37FFFFFF7FFBA8D | ||
372 | :10173000DFFBFDFFBFFFFBFFF87FEAFFFEFEDFFFE1 | ||
373 | :10174000F7FF7FBBFFFFBFDFFBFFFFBFFFB17FFFE7 | ||
374 | :10175000FBEFFFFFFFFFFFBFCFFEFFFFEFFFF7FF36 | ||
375 | :10176000FFFFF1FF69BEFABFAFE2FFFEFDAFF3FE80 | ||
376 | :10177000FFBFEFFBFCFFFF07FD95DBDF7FDFAFFF68 | ||
377 | :10178000F7AF36FEBF65EBF6FE9F6FFE07FFCFFF9C | ||
378 | :10179000F8FEFFCFFFF6FAE7FBFEFFBBEDF9FFFF18 | ||
379 | :1017A000FF5FFFFFFF75FFEF7EFDE0E85ED3E5F929 | ||
380 | :1017B0003E5FD7F7FFFA2FFBFFFFFFFFFEFFFF7F24 | ||
381 | :1017C0007FD7F57D5F57D5F5EFFFF37FFC7FFFC730 | ||
382 | :1017D000F1FFFF1FCFB0FF3FCFF3FCFF3FCEFFE491 | ||
383 | :1017E000FFDF7FFEF7BBFFFFDFEFEEFFBFEFFBFE8C | ||
384 | :1017F000BFBFEFFFD1FFFFFFFDFBFFFDFFFB9FE939 | ||
385 | :10180000FE7F9FE7F9FE7FBFFFB3FFFFF7FFFFAF4C | ||
386 | :10181000F7FFB63FEBFAFEBFAFEBFAFEBFFEA7FF46 | ||
387 | :10182000FFFFFFFFF7FFFFFFFE9FF7F9FF7F9FE737 | ||
388 | :10183000FFFFFEAF6FFFFFFF9FFFDFFF7D5FDDFF5D | ||
389 | :10184000FBBFE7BBFFFBDF6D5F7EFFFFFFFFFFFF1F | ||
390 | :10185000EBF7FFE7EFF7FFFF7FFFF7FFFC8FFFEFEF | ||
391 | :10186000FDFEFFBEF4F27DD7CFFF3FFFFFFFFFFF7E | ||
392 | :10187000FFCF6BFFBF3FFBF2FC7FEBFF9FFAFFFF49 | ||
393 | :101880003FFFF3FFFFFD70F7FFFFBFFFFBD7FEF544 | ||
394 | :1018900077FF15DD77FDFF7FDFF7FBCDBFFFFDFF96 | ||
395 | :1018A000FFDF37CDF9ECFEEFBBF4FB3F4FB3FFFD9D | ||
396 | :1018B000CBFFE97E549FE54BB7FFDD7DC771DD7738 | ||
397 | :1018C0005DD775CD7FD6FFD3F6F93F6D95AF7FFE1F | ||
398 | :1018D000FFEFFBFEFFBFEFFBFEF6C7FFAD7BCAFFCE | ||
399 | :1018E000BFBFEFFDE3DFB7EDFB7EDF37EDE3FBDFEF | ||
400 | :1018F000FF525C15FDCF7FDFFEEFEFFBFEFFBFEC7D | ||
401 | :101900007BFEFFFE3E7FDAF7FDFF7FFFFFFBEFBBB5 | ||
402 | :101910006FFBFEFFBFEFFBFFF77DFFD8FFFDBF7F33 | ||
403 | :10192000FBFFFF9FFBFE7F9FE7F9FE7F9FEA7FF6AD | ||
404 | :10193000BFBD6A5AF6E5BF775F6DDD775DD775DDB0 | ||
405 | :1019400077FFA5BFCFFBFFFFBFCFFBFDFFBFF3FEC0 | ||
406 | :10195000FFBFEFFBFEFFFDABFFBFBFFFFBFF7FEF56 | ||
407 | :10196000FFBEFBEEFBBEEFBBEEFBBFFFB5FFD0BC87 | ||
408 | :10197000FD2F4BF7FFFF9FF9FE7F9FE7F9FE7F9F4B | ||
409 | :10198000FA8FFDABFADABFAFB3FDFFBFFBFEFFBFBF | ||
410 | :10199000EFFBFEF7BFFF9FFF77F7BDFD77DFFF7E11 | ||
411 | :1019A000DFEDBBFEFFBEEFFBFEFFFA3FFFBE6F8F1A | ||
412 | :1019B000E6F9FE7F9FC7FE7F9FE7F9FE7F9FE7FB6B | ||
413 | :1019C0007FFF7FCFFFFDFFFFDFFBAFBFEFFFFEFF1E | ||
414 | :1019D0009FEFFBFFFCFFFBFEFFFFFFFFFEFFFFF79C | ||
415 | :1019E000FFFFFFFFFFFFFFFFFFF5FFFFFF3FDFF7F9 | ||
416 | :1019F000FFFF7FEFFEFFBFFFFBFFFFBFEFFFB37FE8 | ||
417 | :101A0000FF7B5EF7FDFF7B7FF7FF7FDFF7FDFF7F4B | ||
418 | :101A1000DFF7FF17FFFFFF7FFFFFDDF6FCBFCBF215 | ||
419 | :101A2000BCBF2FCBF2FCBFFE8FFFFA7EBFA7EBDA65 | ||
420 | :101A3000FCBFAF7AFEBFAFEAFAFEBFAFF4DFFEFF36 | ||
421 | :101A4000F33C7F3EFFCFF8BF8FE3F8FE3F8FE7E820 | ||
422 | :101A5000FFFC9FFFFFCFEBB3E7FB7BF3FEFFCFDB8A | ||
423 | :101A6000FBFBBF6F6FDFEC7FFFFFF7FDFDFFFFFFAD | ||
424 | :101A7000FFB2BFFFDEFDBDEFFBF6DFEAE7DBFEBB3B | ||
425 | :101A8000FFEBFBBF9F8FE8FE3F8FA3F8FE3F8FFF6A | ||
426 | :101A9000F87EFDFD7FFFFBCDFFFDFF5FEFFDFFFF4C | ||
427 | :101AA000DFF7FDFFBE90FFFFEEFF3FBFF3BBFEB7CA | ||
428 | :101AB000ABFAFEAFADEAFADEABFF63FFFEF2FFB3B7 | ||
429 | :101AC000FFDFEE7DFF03F1F43F1FC3F1EC7FFE6FFC | ||
430 | :101AD000FFFBFBFF9FFFBFFF7B5FFDFFDFF7FDFD10 | ||
431 | :101AE0007F7FDFFECFFBFFFFAFFBFF1FEFA5FDBF3B | ||
432 | :101AF000DFFB7DFFBFDFFBFFFD3BFFFFFFFFFFFDC8 | ||
433 | :101B0000AFF3FFFB7FBFD7FBBF7FBBF7FFF87FFFC4 | ||
434 | :101B1000FA5FD7FFDF7FEFFFFF7FDBF7FDFF7FDFA0 | ||
435 | :101B2000B7FBECFFFFF7BFEFFDFCFBFFEFF0FE3F65 | ||
436 | :101B30008FE3F8FE3F8FEF8DFFFFEF7FBFFFFBFFCF | ||
437 | :101B4000DBBFFFFFFFFFFFFFFFFFFFEFD8FF2E7F91 | ||
438 | :101B5000BEEFFE6EFFBFF9FFFFF3FFFFFFFFFFFFCA | ||
439 | :101B6000FC66BE47F37FDFFE879FFFFFFFFFE7FFB7 | ||
440 | :101B7000FFFFFFFFFFD66F7CFB4FD2FFFD2BFEFF69 | ||
441 | :101B8000FFFD5FD7D5F57DFFFFFFBF9BFFFFDFB7F1 | ||
442 | :101B9000FFFFDFFF3FCFFE7FBFEFFBFCFF3FFFD923 | ||
443 | :101BA000BFFE97EC8FB7FE9B7DFDB7DD771DC7713C | ||
444 | :101BB000DD775DD7F36FFD3F73DDAFFD7AFFFFAFDC | ||
445 | :101BC000FEFDBFEFFBFEFFBFEF667FFFFFBFBFFF66 | ||
446 | :101BD000FBFFF7DFFDFB7DDFB7CDF37C5F3F913F80 | ||
447 | :101BE000FF3DEF7BFFFCFFCAEFFEFFBDEFFB1EE7F3 | ||
448 | :101BF000BBEC7FB3FFFD9FFFFFFEFFFF7FBFFBFE40 | ||
449 | :101C0000FFBFEFFBEEFBBFDF67FFFFBFEFDBFFBCFC | ||
450 | :101C1000FE7FFBFF9FEFF9FE7F9FE7F9FE87FFEE58 | ||
451 | :101C2000FBBEE5BFEFF9D765F7DDE77DDF775DD771 | ||
452 | :101C30007FF89BFEFFBFEFFBFFFFBFEFFBFF7FCFF8 | ||
453 | :101C4000F3FCFFBFEFFFDB3FEFFBFEFFDFFFFEFB21 | ||
454 | :101C5000BBEFBFEFBBEEFBBEEFBBFFFC7FFD3B5B13 | ||
455 | :101C6000D6E5FD4FC3FBFFBFEFFBFEFFBFEFFBFF62 | ||
456 | :101C7000B4FFFABC8FB2E9D22ECFFBFFBFEFFBFE61 | ||
457 | :101C8000FFBFEFFBFFECFFFDFD7FDFF7E4DF5FFF52 | ||
458 | :101C9000FFFBFFFFFFFFFFFFFFFFC3FFEFE6F8FEC5 | ||
459 | :101CA0003F8B83F9FE7FE7F9FE7F9FE7F9FE7F1701 | ||
460 | :101CB000FDFFFFFF7F5FF72CFFFFFFFE7FFFE7F9D0 | ||
461 | :101CC000FE7F9FFE2FFFFFEFFFFEBFEFADFFFF7F09 | ||
462 | :101CD000FFFFFFFFFFFFFFFFFEDFFFDFFFFDFD7FD9 | ||
463 | :101CE000DFF7FFFFFFFFFFFFFFFFFFFFFFFA3FFEF2 | ||
464 | :101CF000F7FDEF7AFFB1BDFF7FF7FDFF7FDFF7FD57 | ||
465 | :101D0000FF7FF327FFDFFFDDFFFC9BFFCBFCBF2F37 | ||
466 | :101D1000CBF2FCBF2FC9FFDEFFDFAFEBDAFEBBAFBC | ||
467 | :101D2000EBF8F7AFE8FAFEBFAFEBF2FFFDFFFFEF16 | ||
468 | :101D3000BDD7BFFFFFDE8FB8DE378DA378DA3F8FC8 | ||
469 | :101D4000FFA1FFFFFBFBFFFFFFFFA7BDFB76FDBF72 | ||
470 | :101D5000EFDBFEBBBFFE277FFFFEFEFDF5FFEFF5CD | ||
471 | :101D6000DF1FE7FDFF7FDFF7FDFFFFCDFDAEFFFAD1 | ||
472 | :101D70003E3FABFDF87E8FE3F8FE3E8FE3F8FFFEBB | ||
473 | :101D80001FEFDFBFFEDEDFD9FFDFBCFFFF7FFFEF0E | ||
474 | :101D9000FD7FDFF7F93FFEFFFF6FFEDEBFF7EDEAE5 | ||
475 | :101DA000FD8F83F8EA3F8FEFFFF47FFFEFEF7BF3C8 | ||
476 | :101DB000F15FFFFFF13B7FDFF7FDFFFFFFFFE0FF7C | ||
477 | :101DC000FFFFF7FF6FFF7FFFFFF7DEF7BFEFFBF7C8 | ||
478 | :101DD000FDFFFFF5FAFFFFFBE7FFF3F87FF3DFFFFF | ||
479 | :101DE000FFFFFFFFFFFF1FEFBBFFFFFFFFFFFFFD39 | ||
480 | :101DF000FF7FFF9FFFFFFFFFFFFFFFCFFF37FFFFCB | ||
481 | :101E00007FDF775DE7FCFFBFF7F5FBFFFFD7F5FB53 | ||
482 | :101E1000FFFF45FD7FEAFDBEBFDFF7FFFFDBFBFEF7 | ||
483 | :101E2000FFBFEFFFFFFFFB5F7FFFFEFFFFFFFFFF37 | ||
484 | :101E3000FFFEFFEFFDFF7FDFFFEFFBF80FF3FFF982 | ||
485 | :101E40002EFBFEFCF3EFFFFFBFFFFBE7FFFE7EFF75 | ||
486 | :101E5000C06BCFFF34DFF1FDFFEFFFFFFFDFF7FDCA | ||
487 | :101E6000CF7F9CFDFD6CF7FFF6FDEB2B9FFFFCFE8B | ||
488 | :101E70007EFFFFFFFFD7F3F7FFFBE1BFFFEB7ADE4B | ||
489 | :101E8000D7FBFFF9FEFFFFF3DE7FFDE77FFFFDBB22 | ||
490 | :101E9000FFFF7ECCF6AF5F7FFEF47DF7FDBB6EDB10 | ||
491 | :101EA000B7FFF7DF66FFFFF73DCFDEBDFFFFDEDBED | ||
492 | :101EB0008DF77EDFB7EF7FFFF687FFFFEFFEDEBF18 | ||
493 | :101EC000FFFFFFBBEFFDFF7BDEF73FFFBFFBDBFF4D | ||
494 | :101ED000F2B6FDBD7FE7FFFFFF6FF7FFFFFFFE7765 | ||
495 | :101EE000FFBFF8AFFFDFBFFFBF7FFBFFFFFFDBFEE2 | ||
496 | :101EF000FFBFFFFAFFFDFFF67FFF9FFFFF3FEFF8F9 | ||
497 | :101F0000EE7E9FBAFEBF8FEFFEFEF9FFFA7FFE7EE8 | ||
498 | :101F1000BFAFFB96FD9FEF5E65BEEF5BB6FFBEE316 | ||
499 | :101F2000FFB5BFFFFDFF7FFFEFDFFEFFBFFBFEFF43 | ||
500 | :101F3000BFCFFFFFFFFD9BFFFEFBFEDFFF7FFFF735 | ||
501 | :101F4000FEFFDFFBFBFEFFFFFFFFFFB7FEFAFFAB6D | ||
502 | :101F5000EFFFFDB57B7FFBF7FDFFFFDDFFEF8FFFA1 | ||
503 | :101F60002FFFFB7CFF3FDF73EBFE3FFFEFFBFEFF2E | ||
504 | :101F7000EFFDFFBFFD0FFFFFFFF5F9FF7FD7FDFF6F | ||
505 | :101F8000DFFFF7FBFF7FBFFFFFF09FFFFE7F8BE3CD | ||
506 | :101F9000F9DE279BE6BE7F9BC3F8DE7F9DE7FE7FD1 | ||
507 | :101FA000FFFF5FD7FFFFFF4FFBFFFF7FFFAFFF9FED | ||
508 | :101FB0007FFBFFE8FFFFFEBFAFFFFFFEBFEFF7FFB6 | ||
509 | :101FC000BFFFFFFFFFFFF7FFFCFFFFFD7FFFFFFFEE | ||
510 | :101FD000FD3FCFFFFFFFFFF7FFFD7FFFFF93FFFFF9 | ||
511 | :101FE0007ADFF7FFFF7B7FB7EFFFFFFDBFFDFBFF52 | ||
512 | :101FF000F7FFD7FFFFFFFC9F6FCBFFF4BBDFD6FDE2 | ||
513 | :10200000BF2FD3F7FFDFFFCFFFFABEBDAF6ADABE47 | ||
514 | :10201000BBAB3ABE2DAEEBDAF63FADF5DDFFCFF14F | ||
515 | :10202000FFF97FFF73FEFFCFC3F4F72FF3FFFCFF31 | ||
516 | :102030007C1FFF3F4FFF7EFFEFBDF6FEFF2BEFDC67 | ||
517 | :10204000FBFDFFFBFFEA7BFFFFFFFFFFFBF7DFFF6F | ||
518 | :10205000E37DFFB7FFBFFFFFDFFFF8FFBFFFBFEB71 | ||
519 | :10206000E7FAFE3DBFE9FCBFFFFAFBFEFFFFFFD929 | ||
520 | :10207000FFFFFFF67FFFF67DFFDFCFFDBFFBEF7EAB | ||
521 | :10208000FF7FFFFFD3FFFDFBFFFBFFFFFFEFFFBF66 | ||
522 | :10209000FEFFF7EFFFFFFFFBFF87FFFDFFFFFFFFE7 | ||
523 | :1020A0007BFEFFFE3BF7F7FF3FFFFFFFFFFF0FFF4A | ||
524 | :1020B000FFFFFFFBFFFFFFF7FFFFADFFFEF7FFFF97 | ||
525 | :1020C0005FFFFFDFFFFDFFF5FFDFFFBDFFE9FFC79C | ||
526 | :1020D000F3FFFFF7FFF3FFF83BFFFF7BDFBFFBEFF3 | ||
527 | :1020E000FBFFFBF7F7BBFFFFFFFFFBFFFE7FF37F6D | ||
528 | :1020F0005EB7BFFD7FFFF97FFBFFEBFD7F7FFFEF4B | ||
529 | :10210000FBE03FFEBFBFDFFF7EFFF7FFFFFEBFFF2D | ||
530 | :10211000DB78FFFFFFEEA1BFF5DEFBF7FFFBFFFF64 | ||
531 | :10212000FFFFFBFFFFD7FFFFFFFFEFF0FFFFFFF316 | ||
532 | :10213000F7FFEFFFE7CFFFFBFFEFFFFF9F9FEFFCF6 | ||
533 | :1021400016BFFEF3E4FFFFC6FFE7FFFFFDFFBFFF83 | ||
534 | :10215000FF3FFFBFD6AF7FFE6B7E7FFFAFFFFFBFAE | ||
535 | :10216000FF5FFFFEFFFFFEFFFFBDDBFFFE5FF2FF35 | ||
536 | :10217000FF5FFFFFFFFFFFFFEF7FFFFFFFFFDEBF00 | ||
537 | :10218000FFFFEFFB77FEBD7F5FFFFFFFDF6FEDFF20 | ||
538 | :10219000FDFF7FFD6FFFFF77DACFFD5FFFBFFFFF22 | ||
539 | :1021A000DF7FFFFBFFFFFFFF667FFFFEBFE7BFFA9A | ||
540 | :1021B000FFFEFFFFFFDFFF59EFFFEFFB7F89FFFF10 | ||
541 | :1021C000E9FF6FFFF5FFFFFFFFFF7FF2F7FFFFEF74 | ||
542 | :1021D000F87FFBFFFDFFFFD9FFEFBBFFFFFFBFEF66 | ||
543 | :1021E000DEFFFF9F7FDFFFF7FFFFFFFFDFFFFFAF98 | ||
544 | :1021F000FFFFF73FEB9FFE7F9E7F9FFE87FFEDDB9C | ||
545 | :1022000056FFBFAF0BD2FFEFDB6E7DBD6FF8FE3F19 | ||
546 | :10221000FA5BFFFDBFEFFFBF6FDBE6FFFF3FFFDFB6 | ||
547 | :10222000FEFFFFFFFFDA3FFFFBFEFEFFFFDFF7BD14 | ||
548 | :10223000FFFDFFFEFFFBFFFFFFFFF15FFD9FDFFDE7 | ||
549 | :10224000FFFD7FFFFFFFFF76FAFFFF7FE3F8FFAEA2 | ||
550 | :10225000FFFB7E9D73FFFA7FDFFFFF7FFFFBCDFF5C | ||
551 | :102260007FEFFBFFFDFFF77F7FEFFFEDFFFFFFB588 | ||
552 | :10227000FFBFFFBFFDEFDBF7FF93FFEFE2F9BE7F8C | ||
553 | :102280008BE7F9FE6BE7F9FE7F9FE7F9FE7F47FFDB | ||
554 | :10229000FFFDFF9FFFD7FFFFFFFFF5FF9FFFF7FE4B | ||
555 | :1022A000FFBFFE6FFFFFFBFFFFFFAFFFFFFF7FFBE7 | ||
556 | :1022B000FFFEFFFFFFFFFFFDDFFFFFF7FFFFFFDF79 | ||
557 | :1022C000FFFFFF5FFFFFFFFF5FFBFEFFF837FFFF32 | ||
558 | :1022D000EFFF7FFEBFFFFFFEBFFFFF7FFFBFFDFFE2 | ||
559 | :1022E0007FFA7FFFFF6FFFFF7DFFCFFFFFFF4FFFF5 | ||
560 | :1022F000F2FFFFFFFFFFFABFFFAEEBFAFEBBADEB55 | ||
561 | :10230000FAF7AF6BFAF6BF25E9F27F45FFFFFDF75D | ||
562 | :10231000F7BFFFDFFFFFBFFBFFDFF3FFF73FCFFF9D | ||
563 | :10232000A1FFFFBFE7FFFF7FFF3DFFFFFFF7FF2F8D | ||
564 | :10233000FFFBF57FFE57FFFFFFFFFFFFFFFFFFF7EC | ||
565 | :102340003FFFFEFFFFFFFDFEF7EEAFFEEEE7FAFFF9 | ||
566 | :10235000FE9DF95EFEFFEBFFFFDFA7FFFFFFFCDB4B | ||
567 | :10236000FFFFFF7EFBFFFFEFFBFDFFDBFFFFFFEF4C | ||
568 | :10237000FFFFFFFDBFFEBFFF6F7FFFF7FFFFF9FF0E | ||
569 | :10238000F7FFBFDEF7FFFFFFFA7FFDBF5FFFFFBF75 | ||
570 | :10239000FFEDFFF7BFFFFFEFFFDFFFFFFFE6FFFBF4 | ||
571 | :1023A0007FFFFFFFFFFFF7FFFFFFFFFFFFFFEBFFD9 | ||
572 | :1023B000FDFFF5FFF67FDFBDCFFFFFFFFFDFFFFF74 | ||
573 | :1023C000FFF9FFFFFFFFFFE3FFEEBFFF7DEFFEFF23 | ||
574 | :1023D000FFFFBFFFFFFFFFFEFFFFFFFFE7FFB5AE01 | ||
575 | :1023E000FFFFB6FEBFFFFFBFFFFFFFFFFFFFFFFFC7 | ||
576 | :1023F000FF27FFEFFE7FDFFF7EFFFFFFFFFFFFFFF7 | ||
577 | :10240000FFFFFDFFF7F99FFF5FFFFFFFFFFFFF7F6C | ||
578 | :10241000FFFFFEFFFFFFFFFFFFFFFF0FFFE7BFFE16 | ||
579 | :10242000FFBFFFFFFFFFFCBFFFFFFEFFFFFFFFC47B | ||
580 | :102430006BFF291FFBAFFFFFFFFFFFEF1BFEFFFC42 | ||
581 | :102440006FFFFFFD6AF7D7F5BFFFFEFFFFFFFFFF3E | ||
582 | :10245000FEBFFFFFFAFFFFF7FBDDBFFFE7FFFFFF58 | ||
583 | :10246000FFFFFFFFFFFD7FFFFFF5FFFFF7FDB3EF6E | ||
584 | :10247000FD7E5DFFFDFFFFFFFD7FD2F5FB7ECBB74D | ||
585 | :10248000FFFFFFC6FFFDEE63FFFFFFFFFFF6FD65E9 | ||
586 | :102490005BDFFFD5FFFFFFF6E7BFF7A9FFFFEDFF0B | ||
587 | :1024A000FFFFFFFFEBFFFFFFAFFFFFFFF81BFFE3A7 | ||
588 | :1024B000D0BFFFE1FFFFFFFFFFD7FFFFFF5FFFFF81 | ||
589 | :1024C000FFFFAFFFDB76BFFF7FFFBFEFFEFFBFEF7A | ||
590 | :1024D000FBFEFFFFFFBFF27FFF9FFEBDFE7FFFFF02 | ||
591 | :1024E000FFFFFFFFFFFFFFFFFFF73FEC7FF695BB0E | ||
592 | :1024F000EFF8FEFCBF2FDAFCBF2FCBF2FCBFEFFFE3 | ||
593 | :10250000A9BFCFFBFFFFFFFEDDB76DF6D9B66D9B10 | ||
594 | :1025100076D9BFFBFDA3FFBFEFFFEFFFFFFF7FDF1C | ||
595 | :10252000FDEF7BDEF7FDEF7FFFFF05FFFAFE7FEF9C | ||
596 | :10253000E3FFFFFD7FFFFFFFFF5FFFFFFD7FFBAFBF | ||
597 | :10254000FF63C8FFBFEFFFFFFA7FFFFFFFFE9FF7AC | ||
598 | :10255000FFFABFFE9FFB7FFFFFEFD7FFFFF5FFFFF7 | ||
599 | :10256000FFFFFD7FFFFFBFFFF9BFFFBE279FE7F91A | ||
600 | :10257000FE7F8BE7FE7F9FE2F9FE7F9FE7F17FFF03 | ||
601 | :10258000FFFFFBFEFFFFFFD7FFFFFFFFF5FFFFFF92 | ||
602 | :10259000D7FFFAFFFEFFFFFFFDFFFFFFAFF7FFFFD3 | ||
603 | :1025A000FFEBFFFFFFAFFFC4FFF7FFFFEFFFFFFFF2 | ||
604 | :1025B000FF5FFFFFFFFFD7FFFFFFFFFFEBFFFB7A90 | ||
605 | :1025C000DFF7FDFFFFFEBFFFFF7FFFAFFFFFFFF75E | ||
606 | :1025D000EFE3FFDDD2FFDFFFFFF2FCBFCBF6FDBF75 | ||
607 | :1025E0002FCBFF7FDFDEAFFFDAEEBFAFE9FAF4BD3E | ||
608 | :1025F000AF5AAEBBAB6BDADEBFADD75EFFFFBFFC41 | ||
609 | :10260000FFDFFDFFFFFFFFDFF7FFFFFFFFFDFFFA2B | ||
610 | :102610001FFFFEFBEFBFFDFFFDBD77FFFFFFFF9D2F | ||
611 | :10262000EFFFFFFFEF7DFFFBFEEFFFFFFFFFFFF779 | ||
612 | :10263000FFFFFFFFFFFFFFEEBFE4FBFFFE3FFEFFDC | ||
613 | :10264000FFFFFFAFEAFEBFAFEBFAFEFFFFFF55F65D | ||
614 | :10265000FFFEF7FF7FFFEBF75FC5FD7F5FD7F5FF5D | ||
615 | :102660006FFBFF8AFFFFFFFFEBFFFFFFFFFBBFBF1B | ||
616 | :10267000EFFBFFFFFFFFFBFF77DFFBFFFD7FEFFFC0 | ||
617 | :10268000FFFFBF7FFFDFBFFFFBFFFFFFFEEFDFFFAF | ||
618 | :10269000FEFF9FEF7DFFF7FF7FFFFFDFF7FDFFEFFF | ||
619 | :1026A000DFFFDFFFFFFFFFFFFFFFFFFFFDFFFFFB80 | ||
620 | :1026B000FDFFBFDFD1FFF83BFFFFFFFFFFFFFFFF85 | ||
621 | :1026C0007EDBFDFF77DBB77DBFFBFFF87FED7B5E39 | ||
622 | :1026D000FFFEFFFF4FD7FD7FDFD7F5FF7FFFFFFF37 | ||
623 | :1026E000F23FFEFFBFFFFFFFFFBFEFFEFF3BEEFF2E | ||
624 | :1026F000FCEFFFFFFF85FFFDFEFFF5FFFFFEFFDFA5 | ||
625 | :10270000FBFF5FBFFFFDFFFFFFFFA8FFFF9F9EFFD7 | ||
626 | :10271000FFFF7FF3FFFFCFFFF7FDFF7FFFFFFC16FB | ||
627 | :10272000BFCFA3E5EF7FFFF3E4FFCF93FCFF3FCFE5 | ||
628 | :10273000FFFFFFD60F7DBF6EFBF4FCAF6DDB77B7FD | ||
629 | :102740006DDBF6FDBFFFFFFFBF9BFADEB7B7EDF90C | ||
630 | :102750007EB7ACEBD6B3ADEB7ADFFFFFFFD8BFFFA0 | ||
631 | :10276000B7ED9F6FDDF768DB37B36CDB36CDB37F3A | ||
632 | :10277000FF7FF56FFDEF793DF793E47A9EADEA7A3E | ||
633 | :102780009EF7BDEFFFFFFF767FFBC6FFBBEFDAFED4 | ||
634 | :10279000FDBFFBFEFFBFEFFBFFFFFBFFA5FFFDAB98 | ||
635 | :1027A0006F78DE178F79DFFDFF7FDFF7FDFFFFFB1F | ||
636 | :1027B000FFFBFFEFFBEFFBFEFFBBDAF3EF3BCEF3DC | ||
637 | :1027C000BCEF3FCFDFFFB7FFFFFFCF73FFBFEFFFD0 | ||
638 | :1027D000F3FF3FCFF3FCFF3DCF9FFE07FFAFEBFEC4 | ||
639 | :1027E000FDBFEFEBFAFFAFEBFAFEBFAFFBFE3FFB27 | ||
640 | :1027F0009BFF7FDFFFF3FEFFDEF7BF7BDEF7BDEF62 | ||
641 | :102800007BFEFFFFDF3FFEFFB7FFEFF7FFBFEDFEF1 | ||
642 | :10281000DFB7EDFB7EDFFFFFFFFD5FEFEBFAFEF5BD | ||
643 | :10282000BF6FFFFFFFFFFFFFFFFFFFFEF8FFA8FFE7 | ||
644 | :10283000FFBFEFFB6AFBB7EFFBFFBFEFFBFEFFBF86 | ||
645 | :10284000EFFBFFE0FFFFFD7F5CD77DDFF35CF5CDA5 | ||
646 | :10285000735ED7B5FD7FEFFFDBFFFFE2F8BE2F8F82 | ||
647 | :10286000E7F8BE6BE2F8BE2F8BE2F9FE7FE7FFD7F9 | ||
648 | :10287000F5FD7FFFF7F5FD7FD7F5FD7F5FD7F5FF0E | ||
649 | :10288000FFFF8FFFAFEBFAFFFFBFEBFAFF2FEBFA73 | ||
650 | :10289000FEBFAFEBFFFFFE5FFF5FFFFFFDFFFFD758 | ||
651 | :1028A000FFFFFFFFFFFFFFFFFFFFFFFFBFFEB7FDC3 | ||
652 | :1028B000FF7EDFF7ADFF7FF7FDFF7FDFF7FDFF7FD7 | ||
653 | :1028C000F67FFFFFFFDBF6FCAFFFFFFFFFF7FFFF29 | ||
654 | :1028D000FFFFFFFFFFECBFFFAFEBFAF6AB8FEBFAAA | ||
655 | :1028E000F7A5EBFABEBFAFEBFAFF6DFFFF7FDF335B | ||
656 | :1028F000DDFF7FFEF7FC7FFBFFFFFFFFFFFFFFA970 | ||
657 | :10290000FFFDFFFFFEFFFFDFFFFFEFEFFDFF7FFF9C | ||
658 | :10291000FFFFFFFEA7FFFFFF77DFF7FD9F7FFE773B | ||
659 | :10292000EFFFFFFFFFFFFFFFFFAFBFAFFFF9BEBF2E | ||
660 | :102930008FFBFEFEEFFBFEFFBFEFFBFFFFFDDF6F38 | ||
661 | :10294000EFFF7FFFBFBFDFFFFCFFDFF7FDEF7FDFA4 | ||
662 | :10295000FFFFFF3FF6FFCFFFDBFBF7FFEB7AFFFF49 | ||
663 | :10296000FFBFEFFBFFFFFFFE6DFDFF5FFBFFFFF70C | ||
664 | :10297000FF5FF5FFFFFFFFFFFFFFFFFFF8FFFBFF1C | ||
665 | :10298000FFFDFFFFFFFFE7F6BFFFFFFFFFFBFFFFBE | ||
666 | :10299000FFC9FFFFFFBDFFBFAFEFEF3FD1FC7FFBE4 | ||
667 | :1029A000C7FFFFFFFFFFE3FFFFFFFFFDFFFF77FF15 | ||
668 | :1029B000DFB7FDF7FDF7FFFFFFFFFF57FFF7A5FDAF | ||
669 | :1029C0003FDFBFBFFE7FFFFFFFDFFAFDFFFFFFFE20 | ||
670 | :1029D00087FFE9FFFEEFBFEFFEFEFFEFFFFFFFFF08 | ||
671 | :1029E000FFFFFFFFFA9FFF3FFFFDFD57DFFDF3FFF6 | ||
672 | :1029F000DFFDFF5FDFF5FDFFFFF98FFFFFFFEE7FDC | ||
673 | :102A0000FFFFBF5EFEECFB3F7F9FEFF9FFFFCD6B4B | ||
674 | :102A1000FFFFFFC5F3FCFA38FFAF3FEE7F9FFFD902 | ||
675 | :102A2000FFFFFD7AF7FFF3FFAF6FDBF2B9E9FBFFC2 | ||
676 | :102A3000FFFFFEFFFFEFFFFBC5BFFFEFFF5EB7AD80 | ||
677 | :102A4000CD797CFFFFFFFFFFFFFFFFFFFD93FFEF4F | ||
678 | :102A5000EAFEBFEF5BD2CDF56D77DFF7FDFF7FDFDD | ||
679 | :102A6000FFFF66FFD5657D5F759D657FD6FB4FFFD8 | ||
680 | :102A7000FFFFFFFFFFFFF6C7FFBFEFFAFEFFBFEB51 | ||
681 | :102A8000FFDFFF7EFFFFEFFD7ED7FF78DFFF5FDF19 | ||
682 | :102A9000F5BF7FDFC5FF3FF67EFF0FEFF23EBFFFC2 | ||
683 | :102AA000FB3FFFFB7FFFB3FEFBF6FDFFDAF7FDFF09 | ||
684 | :102AB0007FDFF7BFFFFA7FFFFFFFFF9FFFF3DCF928 | ||
685 | :102AC000BFCEE7F9FE7F9FE7FFFFE27FFEFFBFEF8C | ||
686 | :102AD000EBFAFF9F671EFF8FE7F8FE7F8FEFFFBDCA | ||
687 | :102AE000BFFFFBFFFFDFF7FFFCFFBFFFFFFFFFFFA5 | ||
688 | :102AF000FFFFFFFDB3FFFFEFFFFFBFEDFFFBEEFEAC | ||
689 | :102B0000FFFFEFFFFEFFFFFFFFB5FFB7FDFD6EFF0D | ||
690 | :102B1000FFFEFD2FD8FEBF8FEBF9FE3FFFFACFFF80 | ||
691 | :102B2000E7D9FABFDF77FCFB3FABFEFFBFEFFBFE51 | ||
692 | :102B3000FFFFEE1FFFDFF7FFFFFF5F9735BF5EFE72 | ||
693 | :102B4000BFEFFFF7FDFFFFFABFFFBE6F9FE7F8BEC5 | ||
694 | :102B50002F8B66947D9DE7F9FE7F9FE7F17FFFFF56 | ||
695 | :102B6000FFF7F5FD7F5FFBFD9EFFFBFEFFFFEFFF25 | ||
696 | :102B7000FFA0FFFFFFBFEFEBFAFEBFB7F7F7FFFFC6 | ||
697 | :102B8000FDFFFFFFFFFFDDFFFDFFFFFFD7FFFFFFA3 | ||
698 | :102B90007FF5FFFFEFFFFFFFBFFFFFABFEFBFEFF79 | ||
699 | :102BA000F7AFFFFFDEF7EB5FDFF7FDFF7FDFFFFF34 | ||
700 | :102BB000B3FFC9FEFFFFFFFFD6FFFFCBFFFFDFFF25 | ||
701 | :102BC000FFFFFFFFFC8FFFBABEBFAFEB78FEB7ADD4 | ||
702 | :102BD0003AFEB7AFEB7AFEBFAFFF9FFFFFDFFCFF10 | ||
703 | :102BE000FFFEC3FEFFFF33FCFFBFDFF3FFFFBB9F12 | ||
704 | :102BF000FFFFFFEBDFFFFFAFF76FF9BFEFFDFFFF59 | ||
705 | :102C0000FFFFFFE37FFFFFFFFBFFFFBFFDFBF7FFC2 | ||
706 | :102C1000DFF7FFFEEF5FBDFFFAFFF8FFBFAFFBFE80 | ||
707 | :102C2000FE3FEFE8FFDFF3FDFFFFFFFFFFEDFFFBE0 | ||
708 | :102C3000FDFFAFFFFFFEFEBFDBFFFFFFBFFFDFFFBC | ||
709 | :102C4000FDFFCBFFFFFFFFFFBF6FFF7FB7B3FFFFAE | ||
710 | :102C5000DFFFFBEFFFFFFF07FFFBFFFFFFEDFFF5D0 | ||
711 | :102C60007CFF7FFEFFFFEFCFFFFBFFFF2FFFFFFF8C | ||
712 | :102C7000FFF3FFFBFFFEFFFFFFFFFFFFBFFFFFFFB5 | ||
713 | :102C8000FD1BFFFFFFFFFFFFFFFFFE7CFFFFFFFFBE | ||
714 | :102C9000EFFFFFFFFFFBBF7FFDFFFFFFFFFFFFFF1A | ||
715 | :102CA000DBFFFFFFFFFFFFFDFFFFF07FFFFFFFFFE9 | ||
716 | :102CB000FFFFFFFFFFFBFFDFFFFFFFFFFFFDBFFE8B | ||
717 | :102CC0007FFFFFFFFFFFFFFFFFEFFEFFBFFFFFFFE5 | ||
718 | :102CD000FFFFEFFAB5FFFFFFF7F7FFFFFFFFDFFB97 | ||
719 | :102CE000FCFFFFFEFF7FDFBFFFCBBFF9FE7F9FE74B | ||
720 | :102CF000F9FE7F97E1FE799FE7FDFE7FDFFE37FF5C | ||
721 | :102D0000FBDEDEBDEFF3FEFBAFEBFEFFFFCFFFFE12 | ||
722 | :102D1000FFBFFF8FFFEFFBFEFFBFE7F95E7FEFFB1B | ||
723 | :102D2000DAFFBFEFFBFEFFFD1FFFFFFFFFFFFFDF2F | ||
724 | :102D3000FFFF7FFFFFF7FB7FFFFFFFFFFC3FFFBFB2 | ||
725 | :102D4000EFFBFEFFBFEF7B7FBFEFFBFEFFB5EFFBAF | ||
726 | :102D5000BFFA7FFCFF3FCFF3FCFF3FCFBCFF3FEF4D | ||
727 | :102D6000F3FCFE3FCFFFEEEFFBFEFFBFEFFB6AD7AA | ||
728 | :102D7000B7FBF8FFB7EFBAFEFFBF7FE9FFF97E5F51 | ||
729 | :102D800097E5F9FE7FBFF97E5F9FE5FBFE5FB7FF2A | ||
730 | :102D9000A3FFF7FDFF7FDFF7FDFF5EF77DFF77DF26 | ||
731 | :102DA000F7FDFF7FFFD7FFFFFFFFFFFFFDDFFB7F8B | ||
732 | :102DB000FFFFEFFFFEFBFFFFBFFE8FFFDFF7FDFD15 | ||
733 | :102DC0007FDFF7FD3EDFF5BDFF7FDFF7FDF7FF9FFC | ||
734 | :102DD000FFFFFFFFFFFFFFFFFFFDFFBEFFFFFFFF46 | ||
735 | :102DE000FFFFFFFD3FFFDFF7FDFF7FDFF7FDFFCFB9 | ||
736 | :102DF00077FCFF5FDFF7FDFFF47FFFFFFFFFFFFFC3 | ||
737 | :102E0000FFFFFFFFFFFFFFFFFFFDFFFFFFEEFFFFE5 | ||
738 | :102E1000FFFFFFFFFFFFFFFFEDFBFFFFBFFFFFFF18 | ||
739 | :102E2000FFFFE9FFFFFFFFFFFFFBFFFFFFD3FFFFF8 | ||
740 | :102E3000BF3FFBFFFFFFFBF3FFFFFFFFFFFFFFFFB6 | ||
741 | :102E4000FFFFFFFFFFFEFFF7FFFFFFFF17FFFFFF83 | ||
742 | :102E5000DFFFFDFFFFFFFFFFDFDFFFFDFFFFDFF70E | ||
743 | :102E6000FF4FFFFFFFFFFFFFFFFFFFFEFFFFFFFD25 | ||
744 | :102E7000FFFFFFFFFEFF9FFFFFFFFFFFFFFFFFFFC3 | ||
745 | :102E8000FDFFFFFFFFFF7FFFFFFF7A3FFFFFFFFF19 | ||
746 | :102E9000FFFFFF7FFFFFFFFFFFFFFFFFFFFFFFF2CF | ||
747 | :102EA0007FFFFBFEFFBFEFF8FEFFBFFBFEFF8FECD7 | ||
748 | :102EB000FBFEFFBFF8F7FEFFBFEFFBFEFDBFCFEC51 | ||
749 | :102EC000FF3FEFDBF8FFBFCFFFF9FFFFBFFFFBFFC7 | ||
750 | :102ED000FFFFEFFBDFFFFFFFFFFFBFFFFFFFBBFFBA | ||
751 | :102EE000EFFBFEEFBFEEEBFBFEFFEFFEEEBFFEEBF8 | ||
752 | :102EF000FFEFFF17FF7EEBBBFEBFBEFBEF5BF7BD37 | ||
753 | :0A2F0000FBCFBFBFBBFB7ECCEFFF91 | ||
754 | :00000001FF | ||
755 | |||
756 | * Copyright (C) 1999 BayCom GmbH | ||
757 | * | ||
758 | * Redistribution and use in source and binary forms, with or without | ||
759 | * modification, are permitted provided that redistributions of source | ||
760 | * code retain the above copyright notice and this comment without | ||
761 | * modification. | ||
diff --git a/firmware/dabusb/firmware.HEX b/firmware/dabusb/firmware.HEX deleted file mode 100644 index 7c258df2b0a7..000000000000 --- a/firmware/dabusb/firmware.HEX +++ /dev/null | |||
@@ -1,649 +0,0 @@ | |||
1 | :02000000215786 | ||
2 | :0300030002016691 | ||
3 | :03000B0002016689 | ||
4 | :0300130002016681 | ||
5 | :03001B0002016679 | ||
6 | :0300230002016671 | ||
7 | :03002B0002016669 | ||
8 | :0300330002030FB6 | ||
9 | :03003B0002016659 | ||
10 | :03004300020100B7 | ||
11 | :03004B0002016649 | ||
12 | :0300530002016641 | ||
13 | :03005B000204BDDF | ||
14 | :0300630002016730 | ||
15 | :03010000020C5A94 | ||
16 | :030104000201ED08 | ||
17 | :030108000202519F | ||
18 | :03010C0002027C70 | ||
19 | :030110000202E404 | ||
20 | :0101140032B8 | ||
21 | :0101180032B4 | ||
22 | :03011C000205FDDC | ||
23 | :03012000020000DA | ||
24 | :03012400020000D6 | ||
25 | :0301280002043C92 | ||
26 | :03012C0002046A60 | ||
27 | :03013000020000CA | ||
28 | :03013400020000C6 | ||
29 | :03013800020000C2 | ||
30 | :03013C00020000BE | ||
31 | :03014000020000BA | ||
32 | :03014400020000B6 | ||
33 | :03014800020000B2 | ||
34 | :03014C00020000AE | ||
35 | :03015000020000AA | ||
36 | :03015400020000A6 | ||
37 | :0A01570075817FE5826003020161FB | ||
38 | :0501610012076F21648C | ||
39 | :010166003266 | ||
40 | :0E016700C0D0C086C082C083C0E0907F97E009 | ||
41 | :0E0175004480F0907F69F0F0F0F0F0F0F0F0D0 | ||
42 | :0E018300F0F0F0F0F0F0F0F0F0F0F0F0F0F04E | ||
43 | :0E019100F0F0F0F0F0F0F0F0F0F0907F97E07A | ||
44 | :03019F00557FF099 | ||
45 | :0E01A200907F9AE030E423907F68F0F0F0F058 | ||
46 | :0E01B000F0F0F0F0F0F0F0F0F0F0F0F0F0F021 | ||
47 | :0E01BE00F0F0F0F0F0F0F0F0F0F0F0F0F0F013 | ||
48 | :0E01CC00E5D8C2E3F5D8D0E0D083D082D0864B | ||
49 | :0301DA00D0D03250 | ||
50 | :0801DD0075860090FFC37C054C | ||
51 | :0701E500A3E582458370F9D8 | ||
52 | :0101EC0022F0 | ||
53 | :0E01ED00C0E0C0F0C082C083C002C003C0D01A | ||
54 | :0E01FB0075D000C086758600E591C2E4F591CE | ||
55 | :0D020900908800E0F541907FAB7402F0900A | ||
56 | :090216007FAB7402F0E5326021B7 | ||
57 | :04021F007A007B00E6 | ||
58 | :0B022300C3EA9418EB64809480501232 | ||
59 | :0E022E00907F69F0F0F0F0F0F0F0F00ABA0006 | ||
60 | :02023C00010BB4 | ||
61 | :02023E0080E35B | ||
62 | :02024000D08666 | ||
63 | :0E024200D0D0D003D002D083D082D0F0D0E054 | ||
64 | :01025000327B | ||
65 | :0E025100C0E0C0F0C082C083C0D075D000C035 | ||
66 | :0E025F0086758600E591C2E4F591907FAB7440 | ||
67 | :04026D0004F0D08643 | ||
68 | :0B027100D0D0D083D082D0F0D0E0329B | ||
69 | :0E027C00C0E0C0F0C082C083C002C003C00456 | ||
70 | :0E028A00C005C006C007C000C001C0D075D0BE | ||
71 | :0D02980000C086758600E591C2E4F59190E6 | ||
72 | :0C02A5007FAB7408F0756E00756F0212DC | ||
73 | :0602B1001144757039755F | ||
74 | :0602B700710C75720212C9 | ||
75 | :0C02BD001175907FD6E4F075D820D08633 | ||
76 | :0E02C900D0D0D001D000D007D006D005D00490 | ||
77 | :0D02D700D003D002D083D082D0F0D0E0322E | ||
78 | :0E02E400C0E0C0F0C082C083C0D075D000C0A2 | ||
79 | :0E02F20086758600E591C2E4F591907FAB74AD | ||
80 | :0403000010F0D086A3 | ||
81 | :0B030400D0D0D083D082D0F0D0E03207 | ||
82 | :0E030F00C0E0C0F0C082C083C002C003C004C2 | ||
83 | :0E031D00C005C006C007C000C001C0D075D02A | ||
84 | :0C032B0000C086758600756E00756F02BC | ||
85 | :0703370012114475704075BE | ||
86 | :06033E00710C7572021241 | ||
87 | :0E0344001175907FD67402F0907FD67406F08B | ||
88 | :0503520075D810D086F3 | ||
89 | :0E035700D0D0D001D000D007D006D005D00401 | ||
90 | :0D036500D003D002D083D082D0F0D0E0329F | ||
91 | :0D037200907FA57480F0907FA6749AF01221 | ||
92 | :0C037F00101B907FA6E542F012101B90AE | ||
93 | :0D038B007FA6E543F012101B907FA5744083 | ||
94 | :01039800F074 | ||
95 | :010399002241 | ||
96 | :0D039A00907FA57480F0907FA6749AF012F9 | ||
97 | :0C03A700101B907FA6E544F012101B9084 | ||
98 | :0C03B3007FA6E545F012101B907FA6E528 | ||
99 | :0B03BF0046F012101B907FA57440F068 | ||
100 | :0103CA002210 | ||
101 | :0A03CB0075440275450075460012E6 | ||
102 | :0903D500039A75420375430012FE | ||
103 | :0203DE000372A8 | ||
104 | :0103E00022FA | ||
105 | :0C03E100908800E536F09088007410252C | ||
106 | :0903ED0036F01201DD75420175C4 | ||
107 | :0903F600431812037275440275EC | ||
108 | :0903FF00450075460012039A75D1 | ||
109 | :08040800420375434412037224 | ||
110 | :0104100022C9 | ||
111 | :0E041100C0E0C0F0C082C083C0D075D000C073 | ||
112 | :0E041F0086758600E591C2E4F591907FAA747F | ||
113 | :04042D0002F0D08683 | ||
114 | :0B043100D0D0D083D082D0F0D0E032D9 | ||
115 | :0E043C00C0E0C0F0C082C083C0D075D000C048 | ||
116 | :0E044A0086758600E591C2E4F591907FA97455 | ||
117 | :0704580004F0753001D086AD | ||
118 | :0B045F00D0D0D083D082D0F0D0E032AB | ||
119 | :0E046A00C0E0C0F0C082C083C0D075D000C01A | ||
120 | :0E04780086758600E591C2E4F591907FAA7426 | ||
121 | :0704860004F0753101D0867E | ||
122 | :0B048D00D0D0D083D082D0F0D0E0327D | ||
123 | :0E049800C0E0C0F0C082C083C0D075D000C0EC | ||
124 | :0C04A60086758600E591C2E5F591D086D0 | ||
125 | :0B04B200D0D0D083D082D0F0D0E03258 | ||
126 | :0E04BD00C0E0C0F0C082C083C0D075D000C0C7 | ||
127 | :0C04CB0086758600E591C2E7F591D086A9 | ||
128 | :0B04D700D0D0D083D082D0F0D0E03233 | ||
129 | :0C04E200907FEAE0FA8A20907F96E4F018 | ||
130 | :0104EE0022EB | ||
131 | :0704EF00907FEAE0FA8A2188 | ||
132 | :0104F60022E3 | ||
133 | :0E04F700901713E0FA901715E0FB74802AFAB4 | ||
134 | :0E05050074802BFBEA0303543FFCEAC423542A | ||
135 | :0E0513001FFA2CFAEB0303543FFCEBC42354F5 | ||
136 | :0B0521001FFB2CFB90170AE0FC60029F | ||
137 | :02052C007A0053 | ||
138 | :07052E0090170CE0FC6002D5 | ||
139 | :020535007B0049 | ||
140 | :0B053700EA2BFCC313F53A7544028B5D | ||
141 | :07054200458A4612039A7579 | ||
142 | :090549006E08756F001211447573 | ||
143 | :040552007047757108 | ||
144 | :080556000C757202121175858B | ||
145 | :05055E003A731211A028 | ||
146 | :010563002275 | ||
147 | :0E056400907F96E0FA907F9674806502F0908A | ||
148 | :0E0572007FEBE0FA907FEAE0FB907FEFE0FC89 | ||
149 | :0E0580003395E0FD8C057C00907FEEE0FE33AD | ||
150 | :0E058E0095E0FFEC2EFCED3FFD907FE9E0FED6 | ||
151 | :05059C00BE0102800316 | ||
152 | :0305A1000205F957 | ||
153 | :0605A400BC0121BD001E98 | ||
154 | :0E05AA00EAC40354F8FCEB25E0FD2C2400FC11 | ||
155 | :0E05B800E43417FD907EC0E0FE8C828D83F04F | ||
156 | :0205C600803182 | ||
157 | :0E05C800EAC40354F8FAEB25E0FB2AFA2400FB | ||
158 | :0E05D600FBE43417FC907EC0E0FD8B828C832A | ||
159 | :0E05E400F074012A2400FAE43417FB907EC163 | ||
160 | :0705F200E0FC8A828B83F01C | ||
161 | :0305F90075380151 | ||
162 | :0105FC0022DC | ||
163 | :0E05FD00C0E0C0F0C082C083C002C003C004D2 | ||
164 | :0E060B00C005C006C007C000C001C0D075D039 | ||
165 | :0D06190000C086758600E591C2E4F5919061 | ||
166 | :0D0626007FAA7401F0120564753700D086BC | ||
167 | :0E063300D0D0D001D000D007D006D005D00422 | ||
168 | :0D064100D003D002D083D082D0F0D0E032C0 | ||
169 | :0E064E00907FEBE0FA907FEAE0FB907FEEE019 | ||
170 | :0E065C00FC3395E0FD907F96E0FE907F967453 | ||
171 | :0E066A00806506F0907F007401F0EAC403542E | ||
172 | :0E067800F8FEEB25E0FB2EFE2400FBE4341719 | ||
173 | :0E068600FF8B828F83E0FB74012E2400FEE4C4 | ||
174 | :0E0694003417FF8E828F83E0FE907FE9E0FF37 | ||
175 | :0306A200BF810A0B | ||
176 | :0A06A500907F00EBF0907F01EEF073 | ||
177 | :0806AF00907FE9E0FBBB821A19 | ||
178 | :0306B700BA010C79 | ||
179 | :0C06BA00907F00E4F0907F01E4F0800BE2 | ||
180 | :0B06C600907F00E4F0907F0174B5F01D | ||
181 | :0806D100907FE9E0FBBB831BF5 | ||
182 | :0306D900BA010D56 | ||
183 | :0D06DC00907F007401F0907F01E4F0800B2E | ||
184 | :0B06E900907F00E4F0907F017412F09D | ||
185 | :0806F400907FE9E0FBBB841CD0 | ||
186 | :0306FC00BA010D33 | ||
187 | :0D06FF00907F007401F0907F01E4F0800C0A | ||
188 | :0C070C00907F007480F0907F017401F079 | ||
189 | :05071800907FB5ECF03C | ||
190 | :01071D0022B9 | ||
191 | :0C071E0075360D908800741DF0756B801E | ||
192 | :0A072A00756C3C1210E2756B8075CF | ||
193 | :090734006C0F1210E2756B807568 | ||
194 | :09073D006C061210E2756B807568 | ||
195 | :070746006C011210E27A00C1 | ||
196 | :03074D00BAFF00F0 | ||
197 | :02075000500A4D | ||
198 | :0A075200C0021201DDD0020A80F19E | ||
199 | :0A075C00756B80756C3C1210E2759D | ||
200 | :080766006B80756C0F1210E2AC | ||
201 | :01076E002268 | ||
202 | :0E076F00907FA1E4F0907FAF7401F0907F9234 | ||
203 | :0E077D007402F0758E3175892175880075C87B | ||
204 | :0E078B0000758D4075984075C04075870075EB | ||
205 | :0907990020007521007522007595 | ||
206 | :0507A200230075470073 | ||
207 | :0707A700C3E5479420501147 | ||
208 | :0D07AE00E5472400F582E43417F583E4F0FC | ||
209 | :0407BB00054780E886 | ||
210 | :0907BF00E4F540F53FE4F53CF5DA | ||
211 | :0707C8003BE4F53EF53D7531 | ||
212 | :0B07CF003200753700753900907F93F1 | ||
213 | :0E07DA00743CF0907F9C74FFF0907F967480CA | ||
214 | :0E07E800F0907F947470F0907F9D748FF0906D | ||
215 | :0E07F6007F97E4F0907F9574C2F0907F987426 | ||
216 | :0E08040028F0907F9E7428F0907FF0E4F09032 | ||
217 | :0E0812007FF1E4F0907FF2E4F0907FF3E4F0E9 | ||
218 | :0E082000907FF4E4F0907FF5E4F0907FF6E432 | ||
219 | :0E082E00F0907FF7E4F0907FF8E4F0907FF90F | ||
220 | :0E083C007438F0907FFA74A0F0907FFB74A0E7 | ||
221 | :0E084A00F0907FFC74A0F0907FFD74A0F09001 | ||
222 | :0E0858007FFE74A0F0907FFF74A0F0907FE010 | ||
223 | :0E0866007403F0907FE17401F0907FDD7480E8 | ||
224 | :0B087400F012124312071E7A007B00F6 | ||
225 | :09087F00C3EA941EEB940050172B | ||
226 | :0C088800908800E0F54790880BE0F547F1 | ||
227 | :09089400907F68F00ABA00010B24 | ||
228 | :02089D0080E0F9 | ||
229 | :0C089F001203E1907FD6E4F07A007B00A9 | ||
230 | :0D08AB008A048B05C3EA94E0EB942E501AEA | ||
231 | :0E08B800C002C003C004C0051201DDD005D08F | ||
232 | :0A08C60004D003D0020ABA00010BAF | ||
233 | :0208D00080D9CD | ||
234 | :0D08D200907FD67402F0907FD67406F090EF | ||
235 | :0E08DF007FDE7405F0907FDF7405F0907FAC33 | ||
236 | :0E08ED00E4F0907FAD7405F075A88075F810EA | ||
237 | :0D08FB00907FAE740BF0907FE27488F09057 | ||
238 | :0C0908007FAB7408F075E81175320175C2 | ||
239 | :0C0914003100753000C004C0051204F76B | ||
240 | :0A092000D005D004753400753501D0 | ||
241 | :0D092A00907FAE7403F08C02BA00028003CF | ||
242 | :03093700020A3F72 | ||
243 | :0C093A00853334907F9D748FF0907F9780 | ||
244 | :0E0946007408F0907F9D7488F0907F9AE0FA1C | ||
245 | :0C09540074055AF533907F9D748FF0906D | ||
246 | :0D0960007F977402F0907F9D7482F0E53364 | ||
247 | :0D096D0025E0FA907F9AE05405FB4AF5332F | ||
248 | :02097A00600C0F | ||
249 | :0C097C00907F96E0FA907F9674804AF01D | ||
250 | :0B098800756E00756F00C004C0051202 | ||
251 | :0E0993001144D005D004901713E0FA74802AA6 | ||
252 | :0609A100FAE533B404295D | ||
253 | :0309A700BAA000F3 | ||
254 | :0209AA005024D7 | ||
255 | :0D09AC00901713E004FB0B901713EBF09075 | ||
256 | :0E09B9001713E0FB901715F0C002C004C00534 | ||
257 | :0909C7001204F7D005D004D0029F | ||
258 | :0509D000E533B402262E | ||
259 | :0609D500C374049A5020D7 | ||
260 | :0D09DB00901713E0FA1A1A901713EAF09023 | ||
261 | :0D09E8001713E0FA901715F0C004C00512B7 | ||
262 | :0609F50004F7D005D00458 | ||
263 | :0509FB00E533B4081D06 | ||
264 | :040A0000E534701950 | ||
265 | :0A0A040074012535540FF5358535D2 | ||
266 | :0C0A0E0075757600C004C0051213FED000 | ||
267 | :030A1A0005D00400 | ||
268 | :050A1D00E533B4011DEA | ||
269 | :040A2200E53470192E | ||
270 | :0A0A2600E53524FF540FF535853542 | ||
271 | :0C0A300075757600C004C0051213FED0DE | ||
272 | :030A3C0005D004DE | ||
273 | :0E0A3F00C004C0051201DDD005D004907F96E2 | ||
274 | :0E0A4D00E0FA907F96747F5AF0907F977408BD | ||
275 | :0A0A5B00F0C3EC9400ED9402400893 | ||
276 | :080A6500907F96E0FA20E608FC | ||
277 | :080A6D00C3E49C74089D5013C2 | ||
278 | :0E0A7500907F96E0FA907F9674406502F07CC8 | ||
279 | :050A8300007D0080056C | ||
280 | :050A88000CBC00010D93 | ||
281 | :050A8D00E538B4010E84 | ||
282 | :0D0A9200C004C0051204F7D005D00475386B | ||
283 | :010A9F000056 | ||
284 | :070AA000E531700302092A91 | ||
285 | :0A0AA700907FC9E0FA7003020C2DE5 | ||
286 | :0E0AB100907F96E0FA907F9674806502F09038 | ||
287 | :090ABF007DC0E0FABA2C028003AC | ||
288 | :030AC800020B36E8 | ||
289 | :050ACB007532007B0004 | ||
290 | :030AD000BB640004 | ||
291 | :020AD300501CB5 | ||
292 | :0E0AD500C002C003C004C0051201DDD005D070 | ||
293 | :0D0AE30004D003D00290880FE0F5470B808F | ||
294 | :010AF000DF26 | ||
295 | :0D0AF100C002C004C00512071E1203E1126E | ||
296 | :0C0AFE0004F7D005D004D002756E00751E | ||
297 | :0D0B0A006F01C002C004C005121144D005E7 | ||
298 | :090B1700D004D00275704D757117 | ||
299 | :0B0B20000C757202C002C004C0051278 | ||
300 | :0B0B2B001175D005D004D002020C2D83 | ||
301 | :030B3600BA2A3B9D | ||
302 | :0D0B3900907F987420F0C002C004C0051227 | ||
303 | :0E0B460001DDD005D004D002907F987428F015 | ||
304 | :020B54007B0024 | ||
305 | :030B5600BB0A00D7 | ||
306 | :050B59004003020C2D19 | ||
307 | :0E0B5E00C002C003C004C0051201DDD005D0E6 | ||
308 | :080B6C0004D003D0020B80E26B | ||
309 | :030B7400BA2B1A7F | ||
310 | :080B7700907FC9E0FBBB4012B6 | ||
311 | :0E0B7F00C002C004C005121205D005D004D07B | ||
312 | :040B8D0002020C2D27 | ||
313 | :030B9100BA101F78 | ||
314 | :0E0B9400907F96E0FB907F9674806503F0C022 | ||
315 | :0E0BA20002C004C00512103DD005D004D002E0 | ||
316 | :030BB000020C2D07 | ||
317 | :030BB300BA111262 | ||
318 | :0E0BB600C002C004C00512106AD005D004D0E1 | ||
319 | :040BC40002020C2DF0 | ||
320 | :030BC800BA12124C | ||
321 | :0E0BCB00C002C004C00512108FD005D004D0A7 | ||
322 | :040BD90002020C2DDB | ||
323 | :030BDD00BA130B3D | ||
324 | :0B0BE000907DC1E0FB908800F0804297 | ||
325 | :030BEB00BA141128 | ||
326 | :0E0BEE00C002C004C0051211DDD005D004D035 | ||
327 | :030BFC0002802E46 | ||
328 | :030BFF00BA151D07 | ||
329 | :0C0C0200907DC1E0F575907DC2E0F576B4 | ||
330 | :0E0C0E00C002C004C0051213FED005D004D0F1 | ||
331 | :030C1C0002800E45 | ||
332 | :030C1F00BA160BF7 | ||
333 | :0B0C2200C004C0051213A3D005D004CD | ||
334 | :0B0C2D00907FC9E4F075310002092A35 | ||
335 | :010C38002299 | ||
336 | :070C3900535550454E4400E5 | ||
337 | :070C4000524553554D4500DC | ||
338 | :060C470020566F6C200036 | ||
339 | :0D0C4D004441425553422076312E30300094 | ||
340 | :0E0C5A00C0E0C0F0C082C083C002C003C0046E | ||
341 | :0E0C6800C005C006C007C000C001C0D075D0D6 | ||
342 | :0D0C760000C086758600E591C2E4F59190FE | ||
343 | :0E0C83007FAB7401F0907FE8E0FA907FE9E02B | ||
344 | :060C9100FBBB0002800322 | ||
345 | :030C9700020D3813 | ||
346 | :030C9A00BA801409 | ||
347 | :0E0C9D00907F007401F0907F01E4F0907FB52D | ||
348 | :060CAB007402F0020ECD00 | ||
349 | :050CB100BA820280037D | ||
350 | :030CB600020D1D0F | ||
351 | :080CB900907FECE0FCBC01009F | ||
352 | :020CC1004021D0 | ||
353 | :060CC300C374079C401BF6 | ||
354 | :0E0CC900EC24FF25E0FD24C6F582E4347FF51F | ||
355 | :0D0CD70083E0FD530501907F00EDF0802BC0 | ||
356 | :030CE400BC8100D0 | ||
357 | :020CE7004021AA | ||
358 | :060CE900C374879C401B50 | ||
359 | :0E0CEF00EC247F25E0FC24B6F582E4347FF58A | ||
360 | :0D0CFD0083E0FC530401907F00ECF08005C3 | ||
361 | :050D0A00907F00E4F001 | ||
362 | :0E0D0F00907F01E4F0907FB57402F0020ECDEB | ||
363 | :050D1D00BA8102800311 | ||
364 | :030D2200020EC5F9 | ||
365 | :0E0D2500907F00E4F0907F01E4F0907FB574C1 | ||
366 | :050D330002F0020ECDEC | ||
367 | :030D3800BB012DCF | ||
368 | :060D3B00BA0003020ECD18 | ||
369 | :030D4100BA0211E2 | ||
370 | :0D0D4400755900C002C003120EF0D003D09C | ||
371 | :040D510002020ECDBF | ||
372 | :050D5500BA2102800339 | ||
373 | :030D5A00020ECDB9 | ||
374 | :0B0D5D00753701907FC5E4F0020ECD59 | ||
375 | :030D6800BB031FAB | ||
376 | :060D6B00BA0003020ECDE8 | ||
377 | :050D7100BA020280033C | ||
378 | :030D7600020ECD9D | ||
379 | :0D0D7900755901C002C003120EF0D003D066 | ||
380 | :040D860002020ECD8A | ||
381 | :030D8A00BB065451 | ||
382 | :050D8D00BA80028003A2 | ||
383 | :030D9200020EC589 | ||
384 | :080D9500907FEBE0FCBC0115AE | ||
385 | :0C0D9D007CFB7D0F8D067F00907FD4EE64 | ||
386 | :090DA900F0907FD5ECF0020ECDB4 | ||
387 | :0A0DB200907FEBE0FCBC020280031E | ||
388 | :030DBC00020EC55F | ||
389 | :0A0DBF00907FEAE0FCBC0002800314 | ||
390 | :030DC900020EC552 | ||
391 | :0C0DCC007C3B7D0F8D067F00907FD4EEF5 | ||
392 | :090DD800F0907FD5ECF0020ECD85 | ||
393 | :060DE100BB0703020EC572 | ||
394 | :030DE700BB081036 | ||
395 | :0D0DEA00AC48907F00ECF0907FB57401F0F4 | ||
396 | :030DF700020ECD1C | ||
397 | :030DFA00BB093101 | ||
398 | :050DFD00BA00028003B2 | ||
399 | :030E0200020EC518 | ||
400 | :0E0E0500907FEAE0FCC374019C5003020EC50E | ||
401 | :080E1300907FEAE0FCBC000A3C | ||
402 | :0A0E1B00901721E4F0901722E4F094 | ||
403 | :090E2500907FEAE0F548020ECDD1 | ||
404 | :030E2E00BB0A27D5 | ||
405 | :050E3100BA81028003FC | ||
406 | :030E3600020EC5E4 | ||
407 | :0E0E3900907FECE0FA2420FAE43417FC8A8261 | ||
408 | :0E0E47008C83E0FA907F00F0907FB57401F08C | ||
409 | :030E5500020ECDBD | ||
410 | :050E5800BB0B0280034A | ||
411 | :030E5D00020EA9D9 | ||
412 | :0D0E6000901720E4F0907FECE0FABA011A40 | ||
413 | :080E6D00907FEDE0FABA0012DB | ||
414 | :0E0E7500907FEAE0FA901721F0C0031204E229 | ||
415 | :040E8300D0038046D2 | ||
416 | :080E8700907FECE0FABA023E94 | ||
417 | :080E8F00907FEDE0FABA003695 | ||
418 | :0D0E9700C0031204EFD003907FEAE0FA9050 | ||
419 | :050EA4001722F080247C | ||
420 | :050EA900BB12028017DE | ||
421 | :050EAE00BB8102800D74 | ||
422 | :050EB300BB8302800872 | ||
423 | :050EB800BB8202800373 | ||
424 | :030EBD00BB8405EE | ||
425 | :050EC00012064E80083F | ||
426 | :080EC500907FB47403F0800675 | ||
427 | :060ECD00907FB47402F0F6 | ||
428 | :020ED300D086C7 | ||
429 | :0E0ED500D0D0D001D000D007D006D005D00478 | ||
430 | :0D0EE300D003D002D083D082D0F0D0E03216 | ||
431 | :0B0EF000907FECE0F55AC39401401D18 | ||
432 | :070EFB00C37407955A40166D | ||
433 | :0D0F0200E55A24FF25E0FA24C6F582E43408 | ||
434 | :090F0F007FF583AA59EAF0802263 | ||
435 | :070F1800C3E55A9481401B60 | ||
436 | :070F1F00C37487955A4014CA | ||
437 | :0D0F2600E55A24FF25E0FA24B6F582E434F4 | ||
438 | :070F33007FF583AA59EAF0E3 | ||
439 | :010F3A002294 | ||
440 | :0E0F3B000902BA000301004000090400000092 | ||
441 | :0E0F49000101000009240100013D0001010C1E | ||
442 | :0E0F570024020110070002030000000D240612 | ||
443 | :0E0F650003010215000300030000092403022B | ||
444 | :0E0F7300010100010009240304020300030031 | ||
445 | :0E0F8100092403050306000100090401000015 | ||
446 | :0E0F8F00010200000904010101010200000737 | ||
447 | :0E0F9D002401020101000B24020102021001D6 | ||
448 | :0E0FAB0080BB00090588050001010000072534 | ||
449 | :0E0FB900010000000009040200020000000018 | ||
450 | :0E0FC7000705820240000007050202400000FC | ||
451 | :0E0FD50009040201030000000007058202402B | ||
452 | :0E0FE30000000705020240000009058905A074 | ||
453 | :0A0FF1000101000000FFFFFFFF00F8 | ||
454 | :0E0FFB00120100010000004047059999000115 | ||
455 | :0E10090000000001000000000000000902BA13 | ||
456 | :0410170000030100D1 | ||
457 | :02101B007A0059 | ||
458 | :03101D00BA050011 | ||
459 | :02102000501767 | ||
460 | :08102200907FA5E0FB30E00522 | ||
461 | :05102A00900001800DA3 | ||
462 | :0A102F00C0021201DDD0020A80E4C5 | ||
463 | :0310390090000123 | ||
464 | :01103C002291 | ||
465 | :0E103D00907DC1E0F9A3E0FAA3E0FB7C007D0A | ||
466 | :04104B007EEB6012C6 | ||
467 | :0E104F0089828A83E0A3A982AA838C828D8382 | ||
468 | :04105D00F00CDBEECA | ||
469 | :08106100907DC3E0907FB9F01F | ||
470 | :011069002264 | ||
471 | :0E106A00907DC1E0F9A3E0FAA3E0FB7CC47D19 | ||
472 | :041078007DEB60E5C7 | ||
473 | :0E107C008C828D83E00C89828A83F0A3A98286 | ||
474 | :04108A00AA83DBEE6C | ||
475 | :01108E00223F | ||
476 | :0E108F00907FA57480F00586907DC1E00586F7 | ||
477 | :0E109D00A3F012101B907FA60586A3A3E0F916 | ||
478 | :0510AB006016A305869C | ||
479 | :0D10B000907FA60586E0A30586F0C0011222 | ||
480 | :0610BD00101BD001D9ED6B | ||
481 | :0610C300907FA57440F0CF | ||
482 | :0110C9002204 | ||
483 | :0810CA009088027401F07A0025 | ||
484 | :0310D200BAFF0062 | ||
485 | :0210D500500ABF | ||
486 | :0A10D700C0021201DDD0020A80F110 | ||
487 | :0110E10022EC | ||
488 | :0510E200E56BB4C0083D | ||
489 | :0810E700908803E56CF080061F | ||
490 | :0610EF00908802E56CF0A0 | ||
491 | :0410F5007A007B0002 | ||
492 | :0B10F900C3EA9432EB6480948050073F | ||
493 | :051104000ABA00010B16 | ||
494 | :0211090080EE76 | ||
495 | :01110B0022C1 | ||
496 | :0A110C00908803E56DF005397A00C4 | ||
497 | :03111600BA2800F4 | ||
498 | :02111900500381 | ||
499 | :03111B000A80F84F | ||
500 | :05111E00E539B41008E2 | ||
501 | :0811230090880274C0F0800EF8 | ||
502 | :05112B00E539B42009C4 | ||
503 | :091130009088027480F07539000A | ||
504 | :021139007A003A | ||
505 | :03113B00BA2800CF | ||
506 | :02113E0050035C | ||
507 | :031140000A80F82A | ||
508 | :011143002289 | ||
509 | :04114400E56F6002F1 | ||
510 | :0211480080071E | ||
511 | :07114A007A007539008005F1 | ||
512 | :051151007A4075391021 | ||
513 | :09115600E56E2AFAE56E2539F573 | ||
514 | :0A115F003990880274802AF07A00AB | ||
515 | :08116900C3EA648094A850035E | ||
516 | :031171000A80F5FC | ||
517 | :011174002258 | ||
518 | :06117500AA70AB71AC7220 | ||
519 | :0C117B008A828B838CF01214EEFD601849 | ||
520 | :0D1187008D6DC002C003C00412110CD00415 | ||
521 | :09119400D003D0020ABA00010BDD | ||
522 | :02119D0080DCF4 | ||
523 | :01119F00222D | ||
524 | :0D11A000E573C4540FFA53020FC374099A8B | ||
525 | :0211AD005006EA | ||
526 | :0611AF0074372AFB8004E6 | ||
527 | :0411B50074302AFB6D | ||
528 | :0C11B9008B6DC00312110CD003AA7353FD | ||
529 | :0811C500020FC374099A5006E1 | ||
530 | :0611CD0074372AFB8004C8 | ||
531 | :0411D30074302AFB4F | ||
532 | :0511D7008B6D12110CEC | ||
533 | :0111DC0022F0 | ||
534 | :0711DD00907DC3E0FA600FF2 | ||
535 | :0C11E400907DC1E0F56E907DC2E0F56FDB | ||
536 | :0311F00012114495 | ||
537 | :0C11F300907DFFE4F07570C475717D758F | ||
538 | :0511FF007201121175E0 | ||
539 | :0112040022C7 | ||
540 | :021205007A0469 | ||
541 | :03120700BA4000EA | ||
542 | :02120A0050365C | ||
543 | :0E120C00EA24C0F582E4347DF583E0FB7C002B | ||
544 | :03121A00BC08000D | ||
545 | :02121D0050205F | ||
546 | :06121F008B05ED30E70B2A | ||
547 | :0B122500907F967442F074C3F08008C4 | ||
548 | :08123000907F96E4F07481F058 | ||
549 | :07123800EB25E0FB0C80DB5D | ||
550 | :03123F000A80C55D | ||
551 | :011242002289 | ||
552 | :041243007A007BEFC3 | ||
553 | :03124700BA1000DA | ||
554 | :02124A00502032 | ||
555 | :0E124C0074112BFB2400FCE43418FD8C828D01 | ||
556 | :0E125A0083E4F0EA2400F582E43419F583E41D | ||
557 | :04126800F00A80DB2D | ||
558 | :01126C00225F | ||
559 | :0E126D0074F82400F58274033484F583E4F0F1 | ||
560 | :0E127B0074F92400F58274033484F583E4F0E2 | ||
561 | :0E12890074FA2400F58274033484F583E4F0D3 | ||
562 | :0E12970074FB2400F58274033484F583E4F0C4 | ||
563 | :0E12A50074FF2400F58274033484F583E4F0B2 | ||
564 | :0112B3002218 | ||
565 | :0E12B4001203CB12126D7AC07B877C0174018D | ||
566 | :0E12C2002AFDE43BFE8C078A828B838CF0743D | ||
567 | :0E12D000011214BF2DFAE43EFB8F048D828EB6 | ||
568 | :0E12DE00838FF074061214BF74012AFDE43BE6 | ||
569 | :0E12EC00FE8C078A828B838CF0E41214BF7490 | ||
570 | :0E12FA00012DFAE43EFB8F048D828E838FF06F | ||
571 | :0E130800740B1214BF74012AFDE43BFE8C0727 | ||
572 | :0E1316008A828B838CF074081214BF74012D30 | ||
573 | :0E132400FAE43EFB8F048D828E838FF07401FD | ||
574 | :0E1332001214BF2AFDE43BFE8C078A828B83D7 | ||
575 | :0E1340008CF0E41214BF74012DFAE43EFB8F12 | ||
576 | :0E134E00048D828E838FF074031214BF7D0015 | ||
577 | :03135C00BD0600CB | ||
578 | :02135F0050122A | ||
579 | :0B1361008A828B838CF00ABA00010B1B | ||
580 | :07136C00E41214BF0D80E93B | ||
581 | :0D1373008A828B838CF0E5741214BF74F92C | ||
582 | :0E1380002400F58274033484F583740FF07436 | ||
583 | :0E138E00FE2400F58274033484F5837401F0AC | ||
584 | :06139C001203E11204F748 | ||
585 | :0113A2002228 | ||
586 | :0D13A300907DC1E0FA2400FBE43419FC90B9 | ||
587 | :0E13B0007DC2E0FD8B828C83F075F011EAA403 | ||
588 | :0313BE00FA7B00B7 | ||
589 | :0313C100BB10005E | ||
590 | :0213C4005024B3 | ||
591 | :0E13C600EA2400FCE43418FDEB2CFCE43DFDB1 | ||
592 | :0E13D40074042B24C0F582E4347DF583E0FE22 | ||
593 | :0813E2008C828D83F00B80D793 | ||
594 | :0E13EA00EA2400FAE43418FB74102AF582E4B9 | ||
595 | :0513F8003BF583E4F069 | ||
596 | :0113FD0022CD | ||
597 | :0413FE00E57660022E | ||
598 | :02140200801652 | ||
599 | :0C140400740F5575FA8A752400F582E417 | ||
600 | :0A1410003419F583E0F5741212B4EC | ||
601 | :0A141A001210CA756E00756F001203 | ||
602 | :0614240011447570B9755A | ||
603 | :06142A007114757202123C | ||
604 | :0B1430001175E576B402047401800120 | ||
605 | :01143B00E4CC | ||
606 | :03143C00FA700F34 | ||
607 | :0C143F0074012575F573C0021211A0D0D5 | ||
608 | :03144B0002800A12 | ||
609 | :0A144E00857573C0021211A0D002D0 | ||
610 | :0C145800756E00756F01C002121144D0C7 | ||
611 | :0414640002EA701A0E | ||
612 | :0D14680075F011E575A4FA2400FAE43418BB | ||
613 | :09147500FB8A708B717572011283 | ||
614 | :04147E00117580362E | ||
615 | :021482007A00EE | ||
616 | :03148400BA10009B | ||
617 | :02148700502FE4 | ||
618 | :0D148900EA2400F582E43419F583E0FBE568 | ||
619 | :0414960075B5031B0A | ||
620 | :0E149A0075F011EAA4FB2400FBE43418FC8B6F | ||
621 | :0914A800708C71757201C0021212 | ||
622 | :0414B1001175D002DF | ||
623 | :0314B5000A80CCDE | ||
624 | :0114B8002211 | ||
625 | :0614B90050726F67200075 | ||
626 | :0E14BF00C8C0E0C8C0E0E5F0600B14600F1478 | ||
627 | :0714CD00601114601280158C | ||
628 | :0714D400D0E0A882F6800EB3 | ||
629 | :0514DB00D0E0F08009E3 | ||
630 | :0414E000D0E08005D3 | ||
631 | :0514E400D0E0A882F237 | ||
632 | :0414E900C8D0E0C8BF | ||
633 | :0114ED0022DC | ||
634 | :0E14EE00C8C0E0E5F0600D14600F14600F142C | ||
635 | :0614FC00601074FF800F78 | ||
636 | :05150200A882E6800A4A | ||
637 | :03150700E080077A | ||
638 | :04150A00E4938003E3 | ||
639 | :03150E00A882E2CE | ||
640 | :04151100F8D0E0C866 | ||
641 | :0115150022B3 | ||
642 | :00000001FF | ||
643 | |||
644 | * Copyright (C) 1999 BayCom GmbH | ||
645 | * | ||
646 | * Redistribution and use in source and binary forms, with or without | ||
647 | * modification, are permitted provided that redistributions of source | ||
648 | * code retain the above copyright notice and this comment without | ||
649 | * modification. | ||
diff --git a/include/linux/usb.h b/include/linux/usb.h index 10278d18709c..689b14b26c8d 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -482,6 +482,7 @@ struct usb3_lpm_parameters { | |||
482 | * @connect_time: time device was first connected | 482 | * @connect_time: time device was first connected |
483 | * @do_remote_wakeup: remote wakeup should be enabled | 483 | * @do_remote_wakeup: remote wakeup should be enabled |
484 | * @reset_resume: needs reset instead of resume | 484 | * @reset_resume: needs reset instead of resume |
485 | * @port_is_suspended: the upstream port is suspended (L2 or U3) | ||
485 | * @wusb_dev: if this is a Wireless USB device, link to the WUSB | 486 | * @wusb_dev: if this is a Wireless USB device, link to the WUSB |
486 | * specific data for the device. | 487 | * specific data for the device. |
487 | * @slot_id: Slot ID assigned by xHCI | 488 | * @slot_id: Slot ID assigned by xHCI |
@@ -560,6 +561,7 @@ struct usb_device { | |||
560 | 561 | ||
561 | unsigned do_remote_wakeup:1; | 562 | unsigned do_remote_wakeup:1; |
562 | unsigned reset_resume:1; | 563 | unsigned reset_resume:1; |
564 | unsigned port_is_suspended:1; | ||
563 | #endif | 565 | #endif |
564 | struct wusb_dev *wusb_dev; | 566 | struct wusb_dev *wusb_dev; |
565 | int slot_id; | 567 | int slot_id; |
@@ -588,8 +590,9 @@ extern struct usb_device *usb_hub_find_child(struct usb_device *hdev, | |||
588 | */ | 590 | */ |
589 | #define usb_hub_for_each_child(hdev, port1, child) \ | 591 | #define usb_hub_for_each_child(hdev, port1, child) \ |
590 | for (port1 = 1, child = usb_hub_find_child(hdev, port1); \ | 592 | for (port1 = 1, child = usb_hub_find_child(hdev, port1); \ |
591 | port1 <= hdev->maxchild; \ | 593 | port1 <= hdev->maxchild; \ |
592 | child = usb_hub_find_child(hdev, ++port1)) | 594 | child = usb_hub_find_child(hdev, ++port1)) \ |
595 | if (!child) continue; else | ||
593 | 596 | ||
594 | /* USB device locking */ | 597 | /* USB device locking */ |
595 | #define usb_lock_device(udev) device_lock(&(udev)->dev) | 598 | #define usb_lock_device(udev) device_lock(&(udev)->dev) |
@@ -805,6 +808,22 @@ static inline int usb_make_path(struct usb_device *dev, char *buf, size_t size) | |||
805 | .bcdDevice_hi = (hi) | 808 | .bcdDevice_hi = (hi) |
806 | 809 | ||
807 | /** | 810 | /** |
811 | * USB_DEVICE_INTERFACE_CLASS - describe a usb device with a specific interface class | ||
812 | * @vend: the 16 bit USB Vendor ID | ||
813 | * @prod: the 16 bit USB Product ID | ||
814 | * @cl: bInterfaceClass value | ||
815 | * | ||
816 | * This macro is used to create a struct usb_device_id that matches a | ||
817 | * specific interface class of devices. | ||
818 | */ | ||
819 | #define USB_DEVICE_INTERFACE_CLASS(vend, prod, cl) \ | ||
820 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ | ||
821 | USB_DEVICE_ID_MATCH_INT_CLASS, \ | ||
822 | .idVendor = (vend), \ | ||
823 | .idProduct = (prod), \ | ||
824 | .bInterfaceClass = (cl) | ||
825 | |||
826 | /** | ||
808 | * USB_DEVICE_INTERFACE_PROTOCOL - describe a usb device with a specific interface protocol | 827 | * USB_DEVICE_INTERFACE_PROTOCOL - describe a usb device with a specific interface protocol |
809 | * @vend: the 16 bit USB Vendor ID | 828 | * @vend: the 16 bit USB Vendor ID |
810 | * @prod: the 16 bit USB Product ID | 829 | * @prod: the 16 bit USB Product ID |
@@ -1129,8 +1148,8 @@ extern int usb_disabled(void); | |||
1129 | * Note: URB_DIR_IN/OUT is automatically set in usb_submit_urb(). | 1148 | * Note: URB_DIR_IN/OUT is automatically set in usb_submit_urb(). |
1130 | */ | 1149 | */ |
1131 | #define URB_SHORT_NOT_OK 0x0001 /* report short reads as errors */ | 1150 | #define URB_SHORT_NOT_OK 0x0001 /* report short reads as errors */ |
1132 | #define URB_ISO_ASAP 0x0002 /* iso-only, urb->start_frame | 1151 | #define URB_ISO_ASAP 0x0002 /* iso-only; use the first unexpired |
1133 | * ignored */ | 1152 | * slot in the schedule */ |
1134 | #define URB_NO_TRANSFER_DMA_MAP 0x0004 /* urb->transfer_dma valid on submit */ | 1153 | #define URB_NO_TRANSFER_DMA_MAP 0x0004 /* urb->transfer_dma valid on submit */ |
1135 | #define URB_NO_FSBR 0x0020 /* UHCI-specific */ | 1154 | #define URB_NO_FSBR 0x0020 /* UHCI-specific */ |
1136 | #define URB_ZERO_PACKET 0x0040 /* Finish bulk OUT with short packet */ | 1155 | #define URB_ZERO_PACKET 0x0040 /* Finish bulk OUT with short packet */ |
@@ -1309,15 +1328,20 @@ typedef void (*usb_complete_t)(struct urb *); | |||
1309 | * the transfer interval in the endpoint descriptor is logarithmic. | 1328 | * the transfer interval in the endpoint descriptor is logarithmic. |
1310 | * Device drivers must convert that value to linear units themselves.) | 1329 | * Device drivers must convert that value to linear units themselves.) |
1311 | * | 1330 | * |
1312 | * Isochronous URBs normally use the URB_ISO_ASAP transfer flag, telling | 1331 | * If an isochronous endpoint queue isn't already running, the host |
1313 | * the host controller to schedule the transfer as soon as bandwidth | 1332 | * controller will schedule a new URB to start as soon as bandwidth |
1314 | * utilization allows, and then set start_frame to reflect the actual frame | 1333 | * utilization allows. If the queue is running then a new URB will be |
1315 | * selected during submission. Otherwise drivers must specify the start_frame | 1334 | * scheduled to start in the first transfer slot following the end of the |
1316 | * and handle the case where the transfer can't begin then. However, drivers | 1335 | * preceding URB, if that slot has not already expired. If the slot has |
1317 | * won't know how bandwidth is currently allocated, and while they can | 1336 | * expired (which can happen when IRQ delivery is delayed for a long time), |
1318 | * find the current frame using usb_get_current_frame_number () they can't | 1337 | * the scheduling behavior depends on the URB_ISO_ASAP flag. If the flag |
1319 | * know the range for that frame number. (Ranges for frame counter values | 1338 | * is clear then the URB will be scheduled to start in the expired slot, |
1320 | * are HC-specific, and can go from 256 to 65536 frames from "now".) | 1339 | * implying that some of its packets will not be transferred; if the flag |
1340 | * is set then the URB will be scheduled in the first unexpired slot, | ||
1341 | * breaking the queue's synchronization. Upon URB completion, the | ||
1342 | * start_frame field will be set to the (micro)frame number in which the | ||
1343 | * transfer was scheduled. Ranges for frame counter values are HC-specific | ||
1344 | * and can go from as low as 256 to as high as 65536 frames. | ||
1321 | * | 1345 | * |
1322 | * Isochronous URBs have a different data transfer model, in part because | 1346 | * Isochronous URBs have a different data transfer model, in part because |
1323 | * the quality of service is only "best effort". Callers provide specially | 1347 | * the quality of service is only "best effort". Callers provide specially |
diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index f8dda0621800..b09c37e04a91 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <linux/version.h> | 38 | #include <linux/version.h> |
39 | #include <linux/usb/ch9.h> | 39 | #include <linux/usb/ch9.h> |
40 | #include <linux/usb/gadget.h> | 40 | #include <linux/usb/gadget.h> |
41 | #include <linux/log2.h> | ||
41 | 42 | ||
42 | /* | 43 | /* |
43 | * USB function drivers should return USB_GADGET_DELAYED_STATUS if they | 44 | * USB function drivers should return USB_GADGET_DELAYED_STATUS if they |
@@ -51,6 +52,7 @@ | |||
51 | /* big enough to hold our biggest descriptor */ | 52 | /* big enough to hold our biggest descriptor */ |
52 | #define USB_COMP_EP0_BUFSIZ 1024 | 53 | #define USB_COMP_EP0_BUFSIZ 1024 |
53 | 54 | ||
55 | #define USB_MS_TO_HS_INTERVAL(x) (ilog2((x * 1000 / 125)) + 1) | ||
54 | struct usb_configuration; | 56 | struct usb_configuration; |
55 | 57 | ||
56 | /** | 58 | /** |
@@ -117,7 +119,7 @@ struct usb_configuration; | |||
117 | struct usb_function { | 119 | struct usb_function { |
118 | const char *name; | 120 | const char *name; |
119 | struct usb_gadget_strings **strings; | 121 | struct usb_gadget_strings **strings; |
120 | struct usb_descriptor_header **descriptors; | 122 | struct usb_descriptor_header **fs_descriptors; |
121 | struct usb_descriptor_header **hs_descriptors; | 123 | struct usb_descriptor_header **hs_descriptors; |
122 | struct usb_descriptor_header **ss_descriptors; | 124 | struct usb_descriptor_header **ss_descriptors; |
123 | 125 | ||
diff --git a/include/linux/usb/ehci_pdriver.h b/include/linux/usb/ehci_pdriver.h index c9d09f8b7ff2..99238b096f7e 100644 --- a/include/linux/usb/ehci_pdriver.h +++ b/include/linux/usb/ehci_pdriver.h | |||
@@ -29,6 +29,8 @@ | |||
29 | * initialization. | 29 | * initialization. |
30 | * @port_power_off: set to 1 if the controller needs to be powered down | 30 | * @port_power_off: set to 1 if the controller needs to be powered down |
31 | * after initialization. | 31 | * after initialization. |
32 | * @no_io_watchdog: set to 1 if the controller does not need the I/O | ||
33 | * watchdog to run. | ||
32 | * | 34 | * |
33 | * These are general configuration options for the EHCI controller. All of | 35 | * These are general configuration options for the EHCI controller. All of |
34 | * these options are activating more or less workarounds for some hardware. | 36 | * these options are activating more or less workarounds for some hardware. |
@@ -39,8 +41,7 @@ struct usb_ehci_pdata { | |||
39 | unsigned has_synopsys_hc_bug:1; | 41 | unsigned has_synopsys_hc_bug:1; |
40 | unsigned big_endian_desc:1; | 42 | unsigned big_endian_desc:1; |
41 | unsigned big_endian_mmio:1; | 43 | unsigned big_endian_mmio:1; |
42 | unsigned port_power_on:1; | 44 | unsigned no_io_watchdog:1; |
43 | unsigned port_power_off:1; | ||
44 | 45 | ||
45 | /* Turn on all power and clocks */ | 46 | /* Turn on all power and clocks */ |
46 | int (*power_on)(struct platform_device *pdev); | 47 | int (*power_on)(struct platform_device *pdev); |
diff --git a/include/linux/usb/ezusb.h b/include/linux/usb/ezusb.h index fc618d8d1e92..639ee45779fb 100644 --- a/include/linux/usb/ezusb.h +++ b/include/linux/usb/ezusb.h | |||
@@ -1,16 +1,8 @@ | |||
1 | #ifndef __EZUSB_H | 1 | #ifndef __EZUSB_H |
2 | #define __EZUSB_H | 2 | #define __EZUSB_H |
3 | 3 | ||
4 | |||
5 | extern int ezusb_writememory(struct usb_device *dev, int address, | ||
6 | unsigned char *data, int length, __u8 bRequest); | ||
7 | |||
8 | extern int ezusb_fx1_set_reset(struct usb_device *dev, unsigned char reset_bit); | 4 | extern int ezusb_fx1_set_reset(struct usb_device *dev, unsigned char reset_bit); |
9 | extern int ezusb_fx2_set_reset(struct usb_device *dev, unsigned char reset_bit); | ||
10 | |||
11 | extern int ezusb_fx1_ihex_firmware_download(struct usb_device *dev, | 5 | extern int ezusb_fx1_ihex_firmware_download(struct usb_device *dev, |
12 | const char *firmware_path); | 6 | const char *firmware_path); |
13 | extern int ezusb_fx2_ihex_firmware_download(struct usb_device *dev, | ||
14 | const char *firmware_path); | ||
15 | 7 | ||
16 | #endif /* __EZUSB_H */ | 8 | #endif /* __EZUSB_H */ |
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index 5b6e50888248..0af6569b8cc6 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h | |||
@@ -939,6 +939,13 @@ static inline void usb_free_descriptors(struct usb_descriptor_header **v) | |||
939 | kfree(v); | 939 | kfree(v); |
940 | } | 940 | } |
941 | 941 | ||
942 | struct usb_function; | ||
943 | int usb_assign_descriptors(struct usb_function *f, | ||
944 | struct usb_descriptor_header **fs, | ||
945 | struct usb_descriptor_header **hs, | ||
946 | struct usb_descriptor_header **ss); | ||
947 | void usb_free_all_descriptors(struct usb_function *f); | ||
948 | |||
942 | /*-------------------------------------------------------------------------*/ | 949 | /*-------------------------------------------------------------------------*/ |
943 | 950 | ||
944 | /* utility to simplify map/unmap of usb_requests to/from DMA */ | 951 | /* utility to simplify map/unmap of usb_requests to/from DMA */ |
diff --git a/include/linux/usb/ohci_pdriver.h b/include/linux/usb/ohci_pdriver.h index 74e7755168b7..012f2b7eb2b6 100644 --- a/include/linux/usb/ohci_pdriver.h +++ b/include/linux/usb/ohci_pdriver.h | |||
@@ -25,6 +25,7 @@ | |||
25 | * @big_endian_desc: BE descriptors | 25 | * @big_endian_desc: BE descriptors |
26 | * @big_endian_mmio: BE registers | 26 | * @big_endian_mmio: BE registers |
27 | * @no_big_frame_no: no big endian frame_no shift | 27 | * @no_big_frame_no: no big endian frame_no shift |
28 | * @num_ports: number of ports | ||
28 | * | 29 | * |
29 | * These are general configuration options for the OHCI controller. All of | 30 | * These are general configuration options for the OHCI controller. All of |
30 | * these options are activating more or less workarounds for some hardware. | 31 | * these options are activating more or less workarounds for some hardware. |
@@ -33,6 +34,7 @@ struct usb_ohci_pdata { | |||
33 | unsigned big_endian_desc:1; | 34 | unsigned big_endian_desc:1; |
34 | unsigned big_endian_mmio:1; | 35 | unsigned big_endian_mmio:1; |
35 | unsigned no_big_frame_no:1; | 36 | unsigned no_big_frame_no:1; |
37 | unsigned int num_ports; | ||
36 | 38 | ||
37 | /* Turn on all power and clocks */ | 39 | /* Turn on all power and clocks */ |
38 | int (*power_on)(struct platform_device *pdev); | 40 | int (*power_on)(struct platform_device *pdev); |
diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h index 06b5bae35b29..a29ae1eb9346 100644 --- a/include/linux/usb/phy.h +++ b/include/linux/usb/phy.h | |||
@@ -10,6 +10,7 @@ | |||
10 | #define __LINUX_USB_PHY_H | 10 | #define __LINUX_USB_PHY_H |
11 | 11 | ||
12 | #include <linux/notifier.h> | 12 | #include <linux/notifier.h> |
13 | #include <linux/usb.h> | ||
13 | 14 | ||
14 | enum usb_phy_events { | 15 | enum usb_phy_events { |
15 | USB_EVENT_NONE, /* no events or cable disconnected */ | 16 | USB_EVENT_NONE, /* no events or cable disconnected */ |
@@ -99,8 +100,10 @@ struct usb_phy { | |||
99 | int suspend); | 100 | int suspend); |
100 | 101 | ||
101 | /* notify phy connect status change */ | 102 | /* notify phy connect status change */ |
102 | int (*notify_connect)(struct usb_phy *x, int port); | 103 | int (*notify_connect)(struct usb_phy *x, |
103 | int (*notify_disconnect)(struct usb_phy *x, int port); | 104 | enum usb_device_speed speed); |
105 | int (*notify_disconnect)(struct usb_phy *x, | ||
106 | enum usb_device_speed speed); | ||
104 | }; | 107 | }; |
105 | 108 | ||
106 | 109 | ||
@@ -189,19 +192,19 @@ usb_phy_set_suspend(struct usb_phy *x, int suspend) | |||
189 | } | 192 | } |
190 | 193 | ||
191 | static inline int | 194 | static inline int |
192 | usb_phy_notify_connect(struct usb_phy *x, int port) | 195 | usb_phy_notify_connect(struct usb_phy *x, enum usb_device_speed speed) |
193 | { | 196 | { |
194 | if (x->notify_connect) | 197 | if (x->notify_connect) |
195 | return x->notify_connect(x, port); | 198 | return x->notify_connect(x, speed); |
196 | else | 199 | else |
197 | return 0; | 200 | return 0; |
198 | } | 201 | } |
199 | 202 | ||
200 | static inline int | 203 | static inline int |
201 | usb_phy_notify_disconnect(struct usb_phy *x, int port) | 204 | usb_phy_notify_disconnect(struct usb_phy *x, enum usb_device_speed speed) |
202 | { | 205 | { |
203 | if (x->notify_disconnect) | 206 | if (x->notify_disconnect) |
204 | return x->notify_disconnect(x, port); | 207 | return x->notify_disconnect(x, speed); |
205 | else | 208 | else |
206 | return 0; | 209 | return 0; |
207 | } | 210 | } |