diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-23 15:33:02 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-23 15:33:02 -0400 |
| commit | c44dead70a841d90ddc01968012f323c33217c9e (patch) | |
| tree | 85489ebe9b9a3413cd8ee197ffb40c8aa8d97e63 | |
| parent | 99dff5856220a02b8711f2e8746413ea6e53ccf6 (diff) | |
| parent | d5f6db9e1aff6ccf1876224f152c0268b0c8a992 (diff) | |
Merge branch 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6
* 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6: (205 commits)
USB: EHCI: Remove SPARC_LEON {read,write}_be definitions from ehci.h
USB: UHCI: Support big endian GRUSBHC HC
sparc: add {read,write}*_be routines
USB: UHCI: Add support for big endian descriptors
USB: UHCI: Use ACCESS_ONCE rather than using a full compiler barrier
USB: UHCI: Add support for big endian mmio
usb-storage: Correct adjust_quirks to include latest flags
usb/isp1760: Fix possible unlink problems
usb/isp1760: Move function isp1760_endpoint_disable() within file.
USB: remove remaining usages of hcd->state from usbcore and fix regression
usb: musb: ux500: add configuration and build options for ux500 dma
usb: musb: ux500: add dma glue layer for ux500
usb: musb: ux500: add dma name for ux500
usb: musb: ux500: add ux500 specific code for gadget side
usb: musb: fix compile error
usb-storage: fix up the unusual_realtek device list
USB: gadget: f_audio: Fix invalid dereference of initdata
EHCI: don't rescan interrupt QHs needlessly
OHCI: fix regression caused by nVidia shutdown workaround
USB: OTG: msm: Free VCCCX regulator even if we can't set the voltage
...
184 files changed, 14673 insertions, 3402 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index c603ef7b056..7c6624e7a5c 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -2585,6 +2585,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | |||
| 2585 | bytes of sense data); | 2585 | bytes of sense data); |
| 2586 | c = FIX_CAPACITY (decrease the reported | 2586 | c = FIX_CAPACITY (decrease the reported |
| 2587 | device capacity by one sector); | 2587 | device capacity by one sector); |
| 2588 | d = NO_READ_DISC_INFO (don't use | ||
| 2589 | READ_DISC_INFO command); | ||
| 2590 | e = NO_READ_CAPACITY_16 (don't use | ||
| 2591 | READ_CAPACITY_16 command); | ||
| 2588 | h = CAPACITY_HEURISTICS (decrease the | 2592 | h = CAPACITY_HEURISTICS (decrease the |
| 2589 | reported device capacity by one | 2593 | reported device capacity by one |
| 2590 | sector if the number is odd); | 2594 | sector if the number is odd); |
diff --git a/Documentation/usb/callbacks.txt b/Documentation/usb/callbacks.txt index bfb36b34b79..9e85846bdb9 100644 --- a/Documentation/usb/callbacks.txt +++ b/Documentation/usb/callbacks.txt | |||
| @@ -95,9 +95,11 @@ pre_reset | |||
| 95 | 95 | ||
| 96 | int (*pre_reset)(struct usb_interface *intf); | 96 | int (*pre_reset)(struct usb_interface *intf); |
| 97 | 97 | ||
| 98 | Another driver or user space is triggering a reset on the device which | 98 | A driver or user space is triggering a reset on the device which |
| 99 | contains the interface passed as an argument. Cease IO and save any | 99 | contains the interface passed as an argument. Cease IO, wait for all |
| 100 | device state you need to restore. | 100 | outstanding URBs to complete, and save any device state you need to |
| 101 | restore. No more URBs may be submitted until the post_reset method | ||
| 102 | is called. | ||
| 101 | 103 | ||
| 102 | If you need to allocate memory here, use GFP_NOIO or GFP_ATOMIC, if you | 104 | If you need to allocate memory here, use GFP_NOIO or GFP_ATOMIC, if you |
| 103 | are in atomic context. | 105 | are in atomic context. |
diff --git a/Documentation/usb/linux-cdc-acm.inf b/Documentation/usb/linux-cdc-acm.inf index 612e7220fb2..37a02ce5484 100644 --- a/Documentation/usb/linux-cdc-acm.inf +++ b/Documentation/usb/linux-cdc-acm.inf | |||
| @@ -90,10 +90,10 @@ ServiceBinary=%12%\USBSER.sys | |||
| 90 | [SourceDisksFiles] | 90 | [SourceDisksFiles] |
| 91 | [SourceDisksNames] | 91 | [SourceDisksNames] |
| 92 | [DeviceList] | 92 | [DeviceList] |
| 93 | %DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7, USB\VID_0525&PID_A4AB&MI_02 | 93 | %DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7, USB\VID_1D6B&PID_0104&MI_02 |
| 94 | 94 | ||
| 95 | [DeviceList.NTamd64] | 95 | [DeviceList.NTamd64] |
| 96 | %DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7, USB\VID_0525&PID_A4AB&MI_02 | 96 | %DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7, USB\VID_1D6B&PID_0104&MI_02 |
| 97 | 97 | ||
| 98 | 98 | ||
| 99 | ;------------------------------------------------------------------------------ | 99 | ;------------------------------------------------------------------------------ |
diff --git a/Documentation/usb/linux.inf b/Documentation/usb/linux.inf index 4dee9585122..4ffa715b0ae 100644 --- a/Documentation/usb/linux.inf +++ b/Documentation/usb/linux.inf | |||
| @@ -18,15 +18,15 @@ DriverVer = 06/21/2006,6.0.6000.16384 | |||
| 18 | 18 | ||
| 19 | ; Decoration for x86 architecture | 19 | ; Decoration for x86 architecture |
| 20 | [LinuxDevices.NTx86] | 20 | [LinuxDevices.NTx86] |
| 21 | %LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2, USB\VID_0525&PID_a4ab&MI_00 | 21 | %LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2, USB\VID_1d6b&PID_0104&MI_00 |
| 22 | 22 | ||
| 23 | ; Decoration for x64 architecture | 23 | ; Decoration for x64 architecture |
| 24 | [LinuxDevices.NTamd64] | 24 | [LinuxDevices.NTamd64] |
| 25 | %LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2, USB\VID_0525&PID_a4ab&MI_00 | 25 | %LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2, USB\VID_1d6b&PID_0104&MI_00 |
| 26 | 26 | ||
| 27 | ; Decoration for ia64 architecture | 27 | ; Decoration for ia64 architecture |
| 28 | [LinuxDevices.NTia64] | 28 | [LinuxDevices.NTia64] |
| 29 | %LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2, USB\VID_0525&PID_a4ab&MI_00 | 29 | %LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2, USB\VID_1d6b&PID_0104&MI_00 |
| 30 | 30 | ||
| 31 | ;@@@ This is the common setting for setup | 31 | ;@@@ This is the common setting for setup |
| 32 | [ControlFlags] | 32 | [ControlFlags] |
diff --git a/MAINTAINERS b/MAINTAINERS index a301ffa78ea..0b415248ae2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -4253,7 +4253,7 @@ F: include/linux/isicom.h | |||
| 4253 | MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER | 4253 | MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER |
| 4254 | M: Felipe Balbi <balbi@ti.com> | 4254 | M: Felipe Balbi <balbi@ti.com> |
| 4255 | L: linux-usb@vger.kernel.org | 4255 | L: linux-usb@vger.kernel.org |
| 4256 | T: git git://gitorious.org/usb/usb.git | 4256 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git |
| 4257 | S: Maintained | 4257 | S: Maintained |
| 4258 | F: drivers/usb/musb/ | 4258 | F: drivers/usb/musb/ |
| 4259 | 4259 | ||
| @@ -4588,6 +4588,7 @@ M: Felipe Balbi <balbi@ti.com> | |||
| 4588 | M: David Brownell <dbrownell@users.sourceforge.net> | 4588 | M: David Brownell <dbrownell@users.sourceforge.net> |
| 4589 | L: linux-usb@vger.kernel.org | 4589 | L: linux-usb@vger.kernel.org |
| 4590 | L: linux-omap@vger.kernel.org | 4590 | L: linux-omap@vger.kernel.org |
| 4591 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git | ||
| 4591 | S: Maintained | 4592 | S: Maintained |
| 4592 | F: drivers/usb/*/*omap* | 4593 | F: drivers/usb/*/*omap* |
| 4593 | F: arch/arm/*omap*/usb* | 4594 | F: arch/arm/*omap*/usb* |
diff --git a/arch/arm/mach-exynos4/Kconfig b/arch/arm/mach-exynos4/Kconfig index e849f67be47..805196207ce 100644 --- a/arch/arm/mach-exynos4/Kconfig +++ b/arch/arm/mach-exynos4/Kconfig | |||
| @@ -170,6 +170,7 @@ config MACH_NURI | |||
| 170 | select S3C_DEV_HSMMC3 | 170 | select S3C_DEV_HSMMC3 |
| 171 | select S3C_DEV_I2C1 | 171 | select S3C_DEV_I2C1 |
| 172 | select S3C_DEV_I2C5 | 172 | select S3C_DEV_I2C5 |
| 173 | select S5P_DEV_USB_EHCI | ||
| 173 | select EXYNOS4_SETUP_I2C1 | 174 | select EXYNOS4_SETUP_I2C1 |
| 174 | select EXYNOS4_SETUP_I2C5 | 175 | select EXYNOS4_SETUP_I2C5 |
| 175 | select EXYNOS4_SETUP_SDHCI | 176 | select EXYNOS4_SETUP_SDHCI |
diff --git a/arch/arm/mach-exynos4/Makefile b/arch/arm/mach-exynos4/Makefile index 9be104f63c0..777897551e4 100644 --- a/arch/arm/mach-exynos4/Makefile +++ b/arch/arm/mach-exynos4/Makefile | |||
| @@ -54,3 +54,5 @@ obj-$(CONFIG_EXYNOS4_SETUP_I2C7) += setup-i2c7.o | |||
| 54 | obj-$(CONFIG_EXYNOS4_SETUP_KEYPAD) += setup-keypad.o | 54 | obj-$(CONFIG_EXYNOS4_SETUP_KEYPAD) += setup-keypad.o |
| 55 | obj-$(CONFIG_EXYNOS4_SETUP_SDHCI) += setup-sdhci.o | 55 | obj-$(CONFIG_EXYNOS4_SETUP_SDHCI) += setup-sdhci.o |
| 56 | obj-$(CONFIG_EXYNOS4_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o | 56 | obj-$(CONFIG_EXYNOS4_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o |
| 57 | |||
| 58 | obj-$(CONFIG_USB_SUPPORT) += usb-phy.o | ||
diff --git a/arch/arm/mach-exynos4/cpu.c b/arch/arm/mach-exynos4/cpu.c index 79301139194..08813a6f66b 100644 --- a/arch/arm/mach-exynos4/cpu.c +++ b/arch/arm/mach-exynos4/cpu.c | |||
| @@ -97,7 +97,12 @@ static struct map_desc exynos4_iodesc[] __initdata = { | |||
| 97 | .pfn = __phys_to_pfn(EXYNOS4_PA_SROMC), | 97 | .pfn = __phys_to_pfn(EXYNOS4_PA_SROMC), |
| 98 | .length = SZ_4K, | 98 | .length = SZ_4K, |
| 99 | .type = MT_DEVICE, | 99 | .type = MT_DEVICE, |
| 100 | }, | 100 | }, { |
| 101 | .virtual = (unsigned long)S5P_VA_USB_HSPHY, | ||
| 102 | .pfn = __phys_to_pfn(EXYNOS4_PA_HSPHY), | ||
| 103 | .length = SZ_4K, | ||
| 104 | .type = MT_DEVICE, | ||
| 105 | } | ||
| 101 | }; | 106 | }; |
| 102 | 107 | ||
| 103 | static void exynos4_idle(void) | 108 | static void exynos4_idle(void) |
diff --git a/arch/arm/mach-exynos4/include/mach/map.h b/arch/arm/mach-exynos4/include/mach/map.h index 6330b73b9ea..0009e77a05f 100644 --- a/arch/arm/mach-exynos4/include/mach/map.h +++ b/arch/arm/mach-exynos4/include/mach/map.h | |||
| @@ -101,6 +101,9 @@ | |||
| 101 | 101 | ||
| 102 | #define EXYNOS4_PA_SROMC 0x12570000 | 102 | #define EXYNOS4_PA_SROMC 0x12570000 |
| 103 | 103 | ||
| 104 | #define EXYNOS4_PA_EHCI 0x12580000 | ||
| 105 | #define EXYNOS4_PA_HSPHY 0x125B0000 | ||
| 106 | |||
| 104 | #define EXYNOS4_PA_UART 0x13800000 | 107 | #define EXYNOS4_PA_UART 0x13800000 |
| 105 | 108 | ||
| 106 | #define EXYNOS4_PA_IIC(x) (0x13860000 + ((x) * 0x10000)) | 109 | #define EXYNOS4_PA_IIC(x) (0x13860000 + ((x) * 0x10000)) |
| @@ -143,6 +146,7 @@ | |||
| 143 | #define S5P_PA_SROMC EXYNOS4_PA_SROMC | 146 | #define S5P_PA_SROMC EXYNOS4_PA_SROMC |
| 144 | #define S5P_PA_SYSCON EXYNOS4_PA_SYSCON | 147 | #define S5P_PA_SYSCON EXYNOS4_PA_SYSCON |
| 145 | #define S5P_PA_TIMER EXYNOS4_PA_TIMER | 148 | #define S5P_PA_TIMER EXYNOS4_PA_TIMER |
| 149 | #define S5P_PA_EHCI EXYNOS4_PA_EHCI | ||
| 146 | 150 | ||
| 147 | #define SAMSUNG_PA_KEYPAD EXYNOS4_PA_KEYPAD | 151 | #define SAMSUNG_PA_KEYPAD EXYNOS4_PA_KEYPAD |
| 148 | 152 | ||
diff --git a/arch/arm/mach-exynos4/include/mach/regs-pmu.h b/arch/arm/mach-exynos4/include/mach/regs-pmu.h index 62b0014d05e..a9643371f8e 100644 --- a/arch/arm/mach-exynos4/include/mach/regs-pmu.h +++ b/arch/arm/mach-exynos4/include/mach/regs-pmu.h | |||
| @@ -33,6 +33,9 @@ | |||
| 33 | #define S5P_EINT_WAKEUP_MASK S5P_PMUREG(0x0604) | 33 | #define S5P_EINT_WAKEUP_MASK S5P_PMUREG(0x0604) |
| 34 | #define S5P_WAKEUP_MASK S5P_PMUREG(0x0608) | 34 | #define S5P_WAKEUP_MASK S5P_PMUREG(0x0608) |
| 35 | 35 | ||
| 36 | #define S5P_USBHOST_PHY_CONTROL S5P_PMUREG(0x0708) | ||
| 37 | #define S5P_USBHOST_PHY_ENABLE (1 << 0) | ||
| 38 | |||
| 36 | #define S5P_MIPI_DPHY_CONTROL(n) S5P_PMUREG(0x0710 + (n) * 4) | 39 | #define S5P_MIPI_DPHY_CONTROL(n) S5P_PMUREG(0x0710 + (n) * 4) |
| 37 | #define S5P_MIPI_DPHY_ENABLE (1 << 0) | 40 | #define S5P_MIPI_DPHY_ENABLE (1 << 0) |
| 38 | #define S5P_MIPI_DPHY_SRESETN (1 << 1) | 41 | #define S5P_MIPI_DPHY_SRESETN (1 << 1) |
diff --git a/arch/arm/mach-exynos4/include/mach/regs-usb-phy.h b/arch/arm/mach-exynos4/include/mach/regs-usb-phy.h new file mode 100644 index 00000000000..703118d5173 --- /dev/null +++ b/arch/arm/mach-exynos4/include/mach/regs-usb-phy.h | |||
| @@ -0,0 +1,64 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2011 Samsung Electronics Co.Ltd | ||
| 3 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify it | ||
| 6 | * under the terms of the GNU General Public License as published by the | ||
| 7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 8 | * option) any later version. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef __PLAT_S5P_REGS_USB_PHY_H | ||
| 12 | #define __PLAT_S5P_REGS_USB_PHY_H | ||
| 13 | |||
| 14 | #define EXYNOS4_HSOTG_PHYREG(x) ((x) + S5P_VA_USB_HSPHY) | ||
| 15 | |||
| 16 | #define EXYNOS4_PHYPWR EXYNOS4_HSOTG_PHYREG(0x00) | ||
| 17 | #define PHY1_HSIC_NORMAL_MASK (0xf << 9) | ||
| 18 | #define PHY1_HSIC1_SLEEP (1 << 12) | ||
| 19 | #define PHY1_HSIC1_FORCE_SUSPEND (1 << 11) | ||
| 20 | #define PHY1_HSIC0_SLEEP (1 << 10) | ||
| 21 | #define PHY1_HSIC0_FORCE_SUSPEND (1 << 9) | ||
| 22 | |||
| 23 | #define PHY1_STD_NORMAL_MASK (0x7 << 6) | ||
| 24 | #define PHY1_STD_SLEEP (1 << 8) | ||
| 25 | #define PHY1_STD_ANALOG_POWERDOWN (1 << 7) | ||
| 26 | #define PHY1_STD_FORCE_SUSPEND (1 << 6) | ||
| 27 | |||
| 28 | #define PHY0_NORMAL_MASK (0x39 << 0) | ||
| 29 | #define PHY0_SLEEP (1 << 5) | ||
| 30 | #define PHY0_OTG_DISABLE (1 << 4) | ||
| 31 | #define PHY0_ANALOG_POWERDOWN (1 << 3) | ||
| 32 | #define PHY0_FORCE_SUSPEND (1 << 0) | ||
| 33 | |||
| 34 | #define EXYNOS4_PHYCLK EXYNOS4_HSOTG_PHYREG(0x04) | ||
| 35 | #define PHY1_COMMON_ON_N (1 << 7) | ||
| 36 | #define PHY0_COMMON_ON_N (1 << 4) | ||
| 37 | #define PHY0_ID_PULLUP (1 << 2) | ||
| 38 | #define CLKSEL_MASK (0x3 << 0) | ||
| 39 | #define CLKSEL_SHIFT (0) | ||
| 40 | #define CLKSEL_48M (0x0 << 0) | ||
| 41 | #define CLKSEL_12M (0x2 << 0) | ||
| 42 | #define CLKSEL_24M (0x3 << 0) | ||
| 43 | |||
| 44 | #define EXYNOS4_RSTCON EXYNOS4_HSOTG_PHYREG(0x08) | ||
| 45 | #define HOST_LINK_PORT_SWRST_MASK (0xf << 6) | ||
| 46 | #define HOST_LINK_PORT2_SWRST (1 << 9) | ||
| 47 | #define HOST_LINK_PORT1_SWRST (1 << 8) | ||
| 48 | #define HOST_LINK_PORT0_SWRST (1 << 7) | ||
| 49 | #define HOST_LINK_ALL_SWRST (1 << 6) | ||
| 50 | |||
| 51 | #define PHY1_SWRST_MASK (0x7 << 3) | ||
| 52 | #define PHY1_HSIC_SWRST (1 << 5) | ||
| 53 | #define PHY1_STD_SWRST (1 << 4) | ||
| 54 | #define PHY1_ALL_SWRST (1 << 3) | ||
| 55 | |||
| 56 | #define PHY0_SWRST_MASK (0x7 << 0) | ||
| 57 | #define PHY0_PHYLINK_SWRST (1 << 2) | ||
| 58 | #define PHY0_HLINK_SWRST (1 << 1) | ||
| 59 | #define PHY0_SWRST (1 << 0) | ||
| 60 | |||
| 61 | #define EXYNOS4_PHY1CON EXYNOS4_HSOTG_PHYREG(0x34) | ||
| 62 | #define FPENABLEN (1 << 0) | ||
| 63 | |||
| 64 | #endif /* __PLAT_S5P_REGS_USB_PHY_H */ | ||
diff --git a/arch/arm/mach-exynos4/mach-nuri.c b/arch/arm/mach-exynos4/mach-nuri.c index b79ad010d19..bb5d12f43af 100644 --- a/arch/arm/mach-exynos4/mach-nuri.c +++ b/arch/arm/mach-exynos4/mach-nuri.c | |||
| @@ -30,6 +30,8 @@ | |||
| 30 | #include <plat/cpu.h> | 30 | #include <plat/cpu.h> |
| 31 | #include <plat/devs.h> | 31 | #include <plat/devs.h> |
| 32 | #include <plat/sdhci.h> | 32 | #include <plat/sdhci.h> |
| 33 | #include <plat/ehci.h> | ||
| 34 | #include <plat/clock.h> | ||
| 33 | 35 | ||
| 34 | #include <mach/map.h> | 36 | #include <mach/map.h> |
| 35 | 37 | ||
| @@ -262,6 +264,16 @@ static struct i2c_board_info i2c5_devs[] __initdata = { | |||
| 262 | /* max8997, To be updated */ | 264 | /* max8997, To be updated */ |
| 263 | }; | 265 | }; |
| 264 | 266 | ||
| 267 | /* USB EHCI */ | ||
| 268 | static struct s5p_ehci_platdata nuri_ehci_pdata; | ||
| 269 | |||
| 270 | static void __init nuri_ehci_init(void) | ||
| 271 | { | ||
| 272 | struct s5p_ehci_platdata *pdata = &nuri_ehci_pdata; | ||
| 273 | |||
| 274 | s5p_ehci_set_platdata(pdata); | ||
| 275 | } | ||
| 276 | |||
| 265 | static struct platform_device *nuri_devices[] __initdata = { | 277 | static struct platform_device *nuri_devices[] __initdata = { |
| 266 | /* Samsung Platform Devices */ | 278 | /* Samsung Platform Devices */ |
| 267 | &emmc_fixed_voltage, | 279 | &emmc_fixed_voltage, |
| @@ -270,6 +282,7 @@ static struct platform_device *nuri_devices[] __initdata = { | |||
| 270 | &s3c_device_hsmmc3, | 282 | &s3c_device_hsmmc3, |
| 271 | &s3c_device_wdt, | 283 | &s3c_device_wdt, |
| 272 | &s3c_device_timer[0], | 284 | &s3c_device_timer[0], |
| 285 | &s5p_device_ehci, | ||
| 273 | 286 | ||
| 274 | /* NURI Devices */ | 287 | /* NURI Devices */ |
| 275 | &nuri_gpio_keys, | 288 | &nuri_gpio_keys, |
| @@ -291,6 +304,9 @@ static void __init nuri_machine_init(void) | |||
| 291 | i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs)); | 304 | i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs)); |
| 292 | i2c_register_board_info(5, i2c5_devs, ARRAY_SIZE(i2c5_devs)); | 305 | i2c_register_board_info(5, i2c5_devs, ARRAY_SIZE(i2c5_devs)); |
| 293 | 306 | ||
| 307 | nuri_ehci_init(); | ||
| 308 | clk_xusbxti.rate = 24000000; | ||
| 309 | |||
| 294 | /* Last */ | 310 | /* Last */ |
| 295 | platform_add_devices(nuri_devices, ARRAY_SIZE(nuri_devices)); | 311 | platform_add_devices(nuri_devices, ARRAY_SIZE(nuri_devices)); |
| 296 | } | 312 | } |
diff --git a/arch/arm/mach-exynos4/usb-phy.c b/arch/arm/mach-exynos4/usb-phy.c new file mode 100644 index 00000000000..0883c1b824b --- /dev/null +++ b/arch/arm/mach-exynos4/usb-phy.c | |||
| @@ -0,0 +1,136 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2011 Samsung Electronics Co.Ltd | ||
| 3 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify it | ||
| 6 | * under the terms of the GNU General Public License as published by the | ||
| 7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 8 | * option) any later version. | ||
| 9 | * | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <linux/clk.h> | ||
| 13 | #include <linux/delay.h> | ||
| 14 | #include <linux/err.h> | ||
| 15 | #include <linux/io.h> | ||
| 16 | #include <linux/platform_device.h> | ||
| 17 | #include <mach/regs-pmu.h> | ||
| 18 | #include <mach/regs-usb-phy.h> | ||
| 19 | #include <plat/cpu.h> | ||
| 20 | #include <plat/usb-phy.h> | ||
| 21 | |||
| 22 | static int exynos4_usb_phy1_init(struct platform_device *pdev) | ||
| 23 | { | ||
| 24 | struct clk *otg_clk; | ||
| 25 | struct clk *xusbxti_clk; | ||
| 26 | u32 phyclk; | ||
| 27 | u32 rstcon; | ||
| 28 | int err; | ||
| 29 | |||
| 30 | otg_clk = clk_get(&pdev->dev, "otg"); | ||
| 31 | if (IS_ERR(otg_clk)) { | ||
| 32 | dev_err(&pdev->dev, "Failed to get otg clock\n"); | ||
| 33 | return PTR_ERR(otg_clk); | ||
| 34 | } | ||
| 35 | |||
| 36 | err = clk_enable(otg_clk); | ||
| 37 | if (err) { | ||
| 38 | clk_put(otg_clk); | ||
| 39 | return err; | ||
| 40 | } | ||
| 41 | |||
| 42 | writel(readl(S5P_USBHOST_PHY_CONTROL) | S5P_USBHOST_PHY_ENABLE, | ||
| 43 | S5P_USBHOST_PHY_CONTROL); | ||
| 44 | |||
| 45 | /* set clock frequency for PLL */ | ||
| 46 | phyclk = readl(EXYNOS4_PHYCLK) & ~CLKSEL_MASK; | ||
| 47 | |||
| 48 | xusbxti_clk = clk_get(&pdev->dev, "xusbxti"); | ||
| 49 | if (xusbxti_clk && !IS_ERR(xusbxti_clk)) { | ||
| 50 | switch (clk_get_rate(xusbxti_clk)) { | ||
| 51 | case 12 * MHZ: | ||
| 52 | phyclk |= CLKSEL_12M; | ||
| 53 | break; | ||
| 54 | case 24 * MHZ: | ||
| 55 | phyclk |= CLKSEL_24M; | ||
| 56 | break; | ||
| 57 | default: | ||
| 58 | case 48 * MHZ: | ||
| 59 | /* default reference clock */ | ||
| 60 | break; | ||
| 61 | } | ||
| 62 | clk_put(xusbxti_clk); | ||
| 63 | } | ||
| 64 | |||
| 65 | writel(phyclk, EXYNOS4_PHYCLK); | ||
| 66 | |||
| 67 | /* floating prevention logic: disable */ | ||
| 68 | writel((readl(EXYNOS4_PHY1CON) | FPENABLEN), EXYNOS4_PHY1CON); | ||
| 69 | |||
| 70 | /* set to normal HSIC 0 and 1 of PHY1 */ | ||
| 71 | writel((readl(EXYNOS4_PHYPWR) & ~PHY1_HSIC_NORMAL_MASK), | ||
| 72 | EXYNOS4_PHYPWR); | ||
| 73 | |||
| 74 | /* set to normal standard USB of PHY1 */ | ||
| 75 | writel((readl(EXYNOS4_PHYPWR) & ~PHY1_STD_NORMAL_MASK), EXYNOS4_PHYPWR); | ||
| 76 | |||
| 77 | /* reset all ports of both PHY and Link */ | ||
| 78 | rstcon = readl(EXYNOS4_RSTCON) | HOST_LINK_PORT_SWRST_MASK | | ||
| 79 | PHY1_SWRST_MASK; | ||
| 80 | writel(rstcon, EXYNOS4_RSTCON); | ||
| 81 | udelay(10); | ||
| 82 | |||
| 83 | rstcon &= ~(HOST_LINK_PORT_SWRST_MASK | PHY1_SWRST_MASK); | ||
| 84 | writel(rstcon, EXYNOS4_RSTCON); | ||
| 85 | udelay(50); | ||
| 86 | |||
| 87 | clk_disable(otg_clk); | ||
| 88 | clk_put(otg_clk); | ||
| 89 | |||
| 90 | return 0; | ||
| 91 | } | ||
| 92 | |||
| 93 | static int exynos4_usb_phy1_exit(struct platform_device *pdev) | ||
| 94 | { | ||
| 95 | struct clk *otg_clk; | ||
| 96 | int err; | ||
| 97 | |||
| 98 | otg_clk = clk_get(&pdev->dev, "otg"); | ||
| 99 | if (IS_ERR(otg_clk)) { | ||
| 100 | dev_err(&pdev->dev, "Failed to get otg clock\n"); | ||
| 101 | return PTR_ERR(otg_clk); | ||
| 102 | } | ||
| 103 | |||
| 104 | err = clk_enable(otg_clk); | ||
| 105 | if (err) { | ||
| 106 | clk_put(otg_clk); | ||
| 107 | return err; | ||
| 108 | } | ||
| 109 | |||
| 110 | writel((readl(EXYNOS4_PHYPWR) | PHY1_STD_ANALOG_POWERDOWN), | ||
| 111 | EXYNOS4_PHYPWR); | ||
| 112 | |||
| 113 | writel(readl(S5P_USBHOST_PHY_CONTROL) & ~S5P_USBHOST_PHY_ENABLE, | ||
| 114 | S5P_USBHOST_PHY_CONTROL); | ||
| 115 | |||
| 116 | clk_disable(otg_clk); | ||
| 117 | clk_put(otg_clk); | ||
| 118 | |||
| 119 | return 0; | ||
| 120 | } | ||
| 121 | |||
| 122 | int s5p_usb_phy_init(struct platform_device *pdev, int type) | ||
| 123 | { | ||
| 124 | if (type == S5P_USB_PHY_HOST) | ||
| 125 | return exynos4_usb_phy1_init(pdev); | ||
| 126 | |||
| 127 | return -EINVAL; | ||
| 128 | } | ||
| 129 | |||
| 130 | int s5p_usb_phy_exit(struct platform_device *pdev, int type) | ||
| 131 | { | ||
| 132 | if (type == S5P_USB_PHY_HOST) | ||
| 133 | return exynos4_usb_phy1_exit(pdev); | ||
| 134 | |||
| 135 | return -EINVAL; | ||
| 136 | } | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/map.h b/arch/arm/mach-s3c2410/include/mach/map.h index 25bbf5a942d..425552d84b6 100644 --- a/arch/arm/mach-s3c2410/include/mach/map.h +++ b/arch/arm/mach-s3c2410/include/mach/map.h | |||
| @@ -21,6 +21,10 @@ | |||
| 21 | /* USB host controller */ | 21 | /* USB host controller */ |
| 22 | #define S3C2410_PA_USBHOST (0x49000000) | 22 | #define S3C2410_PA_USBHOST (0x49000000) |
| 23 | 23 | ||
| 24 | /* S3C2416/S3C2443/S3C2450 High-Speed USB Gadget */ | ||
| 25 | #define S3C2416_PA_HSUDC (0x49800000) | ||
| 26 | #define S3C2416_SZ_HSUDC (SZ_4K) | ||
| 27 | |||
| 24 | /* DMA controller */ | 28 | /* DMA controller */ |
| 25 | #define S3C2410_PA_DMA (0x4B000000) | 29 | #define S3C2410_PA_DMA (0x4B000000) |
| 26 | #define S3C24XX_SZ_DMA SZ_1M | 30 | #define S3C24XX_SZ_DMA SZ_1M |
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-s3c2443-clock.h b/arch/arm/mach-s3c2410/include/mach/regs-s3c2443-clock.h index 44494a56e68..5e06c726583 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-s3c2443-clock.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-s3c2443-clock.h | |||
| @@ -37,6 +37,10 @@ | |||
| 37 | #define S3C2443_SYSID S3C2443_CLKREG(0x5C) | 37 | #define S3C2443_SYSID S3C2443_CLKREG(0x5C) |
| 38 | #define S3C2443_PWRCFG S3C2443_CLKREG(0x60) | 38 | #define S3C2443_PWRCFG S3C2443_CLKREG(0x60) |
| 39 | #define S3C2443_RSTCON S3C2443_CLKREG(0x64) | 39 | #define S3C2443_RSTCON S3C2443_CLKREG(0x64) |
| 40 | #define S3C2443_PHYCTRL S3C2443_CLKREG(0x80) | ||
| 41 | #define S3C2443_PHYPWR S3C2443_CLKREG(0x84) | ||
| 42 | #define S3C2443_URSTCON S3C2443_CLKREG(0x88) | ||
| 43 | #define S3C2443_UCLKCON S3C2443_CLKREG(0x8C) | ||
| 40 | 44 | ||
| 41 | #define S3C2443_SWRST_RESET (0x533c2443) | 45 | #define S3C2443_SWRST_RESET (0x533c2443) |
| 42 | 46 | ||
| @@ -121,6 +125,27 @@ | |||
| 121 | 125 | ||
| 122 | #define S3C2443_PWRCFG_SLEEP (1<<15) | 126 | #define S3C2443_PWRCFG_SLEEP (1<<15) |
| 123 | 127 | ||
| 128 | #define S3C2443_PWRCFG_USBPHY (1 << 4) | ||
| 129 | |||
| 130 | #define S3C2443_URSTCON_FUNCRST (1 << 2) | ||
| 131 | #define S3C2443_URSTCON_PHYRST (1 << 0) | ||
| 132 | |||
| 133 | #define S3C2443_PHYCTRL_CLKSEL (1 << 3) | ||
| 134 | #define S3C2443_PHYCTRL_EXTCLK (1 << 2) | ||
| 135 | #define S3C2443_PHYCTRL_PLLSEL (1 << 1) | ||
| 136 | #define S3C2443_PHYCTRL_DSPORT (1 << 0) | ||
| 137 | |||
| 138 | #define S3C2443_PHYPWR_COMMON_ON (1 << 31) | ||
| 139 | #define S3C2443_PHYPWR_ANALOG_PD (1 << 4) | ||
| 140 | #define S3C2443_PHYPWR_PLL_REFCLK (1 << 3) | ||
| 141 | #define S3C2443_PHYPWR_XO_ON (1 << 2) | ||
| 142 | #define S3C2443_PHYPWR_PLL_PWRDN (1 << 1) | ||
| 143 | #define S3C2443_PHYPWR_FSUSPEND (1 << 0) | ||
| 144 | |||
| 145 | #define S3C2443_UCLKCON_DETECT_VBUS (1 << 31) | ||
| 146 | #define S3C2443_UCLKCON_FUNC_CLKEN (1 << 2) | ||
| 147 | #define S3C2443_UCLKCON_TCLKEN (1 << 0) | ||
| 148 | |||
| 124 | #include <asm/div64.h> | 149 | #include <asm/div64.h> |
| 125 | 150 | ||
| 126 | static inline unsigned int | 151 | static inline unsigned int |
diff --git a/arch/arm/mach-s3c2416/mach-smdk2416.c b/arch/arm/mach-s3c2416/mach-smdk2416.c index 3f83177246c..ac27ebb31c9 100644 --- a/arch/arm/mach-s3c2416/mach-smdk2416.c +++ b/arch/arm/mach-s3c2416/mach-smdk2416.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/mtd/partitions.h> | 23 | #include <linux/mtd/partitions.h> |
| 24 | #include <linux/gpio.h> | 24 | #include <linux/gpio.h> |
| 25 | #include <linux/fb.h> | 25 | #include <linux/fb.h> |
| 26 | #include <linux/delay.h> | ||
| 26 | 27 | ||
| 27 | #include <asm/mach/arch.h> | 28 | #include <asm/mach/arch.h> |
| 28 | #include <asm/mach/map.h> | 29 | #include <asm/mach/map.h> |
| @@ -35,6 +36,7 @@ | |||
| 35 | #include <plat/regs-serial.h> | 36 | #include <plat/regs-serial.h> |
| 36 | #include <mach/regs-gpio.h> | 37 | #include <mach/regs-gpio.h> |
| 37 | #include <mach/regs-lcd.h> | 38 | #include <mach/regs-lcd.h> |
| 39 | #include <mach/regs-s3c2443-clock.h> | ||
| 38 | 40 | ||
| 39 | #include <mach/idle.h> | 41 | #include <mach/idle.h> |
| 40 | #include <mach/leds-gpio.h> | 42 | #include <mach/leds-gpio.h> |
| @@ -47,6 +49,7 @@ | |||
| 47 | #include <plat/cpu.h> | 49 | #include <plat/cpu.h> |
| 48 | #include <plat/nand.h> | 50 | #include <plat/nand.h> |
| 49 | #include <plat/sdhci.h> | 51 | #include <plat/sdhci.h> |
| 52 | #include <plat/udc.h> | ||
| 50 | 53 | ||
| 51 | #include <plat/regs-fb-v4.h> | 54 | #include <plat/regs-fb-v4.h> |
| 52 | #include <plat/fb.h> | 55 | #include <plat/fb.h> |
| @@ -121,6 +124,27 @@ static struct s3c2410_uartcfg smdk2416_uartcfgs[] __initdata = { | |||
| 121 | } | 124 | } |
| 122 | }; | 125 | }; |
| 123 | 126 | ||
| 127 | void smdk2416_hsudc_gpio_init(void) | ||
| 128 | { | ||
| 129 | s3c_gpio_setpull(S3C2410_GPH(14), S3C_GPIO_PULL_UP); | ||
| 130 | s3c_gpio_setpull(S3C2410_GPF(2), S3C_GPIO_PULL_NONE); | ||
| 131 | s3c_gpio_cfgpin(S3C2410_GPH(14), S3C_GPIO_SFN(1)); | ||
| 132 | s3c2410_modify_misccr(S3C2416_MISCCR_SEL_SUSPND, 0); | ||
| 133 | } | ||
| 134 | |||
| 135 | void smdk2416_hsudc_gpio_uninit(void) | ||
| 136 | { | ||
| 137 | s3c2410_modify_misccr(S3C2416_MISCCR_SEL_SUSPND, 1); | ||
| 138 | s3c_gpio_setpull(S3C2410_GPH(14), S3C_GPIO_PULL_NONE); | ||
| 139 | s3c_gpio_cfgpin(S3C2410_GPH(14), S3C_GPIO_SFN(0)); | ||
| 140 | } | ||
| 141 | |||
| 142 | struct s3c24xx_hsudc_platdata smdk2416_hsudc_platdata = { | ||
| 143 | .epnum = 9, | ||
| 144 | .gpio_init = smdk2416_hsudc_gpio_init, | ||
| 145 | .gpio_uninit = smdk2416_hsudc_gpio_uninit, | ||
| 146 | }; | ||
| 147 | |||
| 124 | struct s3c_fb_pd_win smdk2416_fb_win[] = { | 148 | struct s3c_fb_pd_win smdk2416_fb_win[] = { |
| 125 | [0] = { | 149 | [0] = { |
| 126 | /* think this is the same as the smdk6410 */ | 150 | /* think this is the same as the smdk6410 */ |
| @@ -186,6 +210,7 @@ static struct platform_device *smdk2416_devices[] __initdata = { | |||
| 186 | &s3c_device_i2c0, | 210 | &s3c_device_i2c0, |
| 187 | &s3c_device_hsmmc0, | 211 | &s3c_device_hsmmc0, |
| 188 | &s3c_device_hsmmc1, | 212 | &s3c_device_hsmmc1, |
| 213 | &s3c_device_usb_hsudc, | ||
| 189 | }; | 214 | }; |
| 190 | 215 | ||
| 191 | static void __init smdk2416_map_io(void) | 216 | static void __init smdk2416_map_io(void) |
| @@ -203,6 +228,8 @@ static void __init smdk2416_machine_init(void) | |||
| 203 | s3c_sdhci0_set_platdata(&smdk2416_hsmmc0_pdata); | 228 | s3c_sdhci0_set_platdata(&smdk2416_hsmmc0_pdata); |
| 204 | s3c_sdhci1_set_platdata(&smdk2416_hsmmc1_pdata); | 229 | s3c_sdhci1_set_platdata(&smdk2416_hsmmc1_pdata); |
| 205 | 230 | ||
| 231 | s3c24xx_hsudc_set_platdata(&smdk2416_hsudc_platdata); | ||
| 232 | |||
| 206 | gpio_request(S3C2410_GPB(4), "USBHost Power"); | 233 | gpio_request(S3C2410_GPB(4), "USBHost Power"); |
| 207 | gpio_direction_output(S3C2410_GPB(4), 1); | 234 | gpio_direction_output(S3C2410_GPB(4), 1); |
| 208 | 235 | ||
diff --git a/arch/arm/plat-s3c24xx/devs.c b/arch/arm/plat-s3c24xx/devs.c index 268f3ed0a10..73667994518 100644 --- a/arch/arm/plat-s3c24xx/devs.c +++ b/arch/arm/plat-s3c24xx/devs.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/io.h> | 22 | #include <linux/io.h> |
| 23 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
| 24 | #include <linux/string.h> | 24 | #include <linux/string.h> |
| 25 | #include <linux/dma-mapping.h> | ||
| 25 | 26 | ||
| 26 | #include <asm/mach/arch.h> | 27 | #include <asm/mach/arch.h> |
| 27 | #include <asm/mach/map.h> | 28 | #include <asm/mach/map.h> |
| @@ -233,6 +234,46 @@ void __init s3c24xx_udc_set_platdata(struct s3c2410_udc_mach_info *pd) | |||
| 233 | } | 234 | } |
| 234 | } | 235 | } |
| 235 | 236 | ||
| 237 | /* USB High Speed 2.0 Device (Gadget) */ | ||
| 238 | static struct resource s3c_hsudc_resource[] = { | ||
| 239 | [0] = { | ||
| 240 | .start = S3C2416_PA_HSUDC, | ||
| 241 | .end = S3C2416_PA_HSUDC + S3C2416_SZ_HSUDC - 1, | ||
| 242 | .flags = IORESOURCE_MEM, | ||
| 243 | }, | ||
| 244 | [1] = { | ||
| 245 | .start = IRQ_USBD, | ||
| 246 | .end = IRQ_USBD, | ||
| 247 | .flags = IORESOURCE_IRQ, | ||
| 248 | } | ||
| 249 | }; | ||
| 250 | |||
| 251 | static u64 s3c_hsudc_dmamask = DMA_BIT_MASK(32); | ||
| 252 | |||
| 253 | struct platform_device s3c_device_usb_hsudc = { | ||
| 254 | .name = "s3c-hsudc", | ||
| 255 | .id = -1, | ||
| 256 | .num_resources = ARRAY_SIZE(s3c_hsudc_resource), | ||
| 257 | .resource = s3c_hsudc_resource, | ||
| 258 | .dev = { | ||
| 259 | .dma_mask = &s3c_hsudc_dmamask, | ||
| 260 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 261 | }, | ||
| 262 | }; | ||
| 263 | |||
| 264 | void __init s3c24xx_hsudc_set_platdata(struct s3c24xx_hsudc_platdata *pd) | ||
| 265 | { | ||
| 266 | struct s3c24xx_hsudc_platdata *npd; | ||
| 267 | |||
| 268 | npd = kmalloc(sizeof(*npd), GFP_KERNEL); | ||
| 269 | if (npd) { | ||
| 270 | memcpy(npd, pd, sizeof(*npd)); | ||
| 271 | s3c_device_usb_hsudc.dev.platform_data = npd; | ||
| 272 | } else { | ||
| 273 | printk(KERN_ERR "no memory for udc platform data\n"); | ||
| 274 | } | ||
| 275 | } | ||
| 276 | |||
| 236 | /* IIS */ | 277 | /* IIS */ |
| 237 | 278 | ||
| 238 | static struct resource s3c_iis_resource[] = { | 279 | static struct resource s3c_iis_resource[] = { |
diff --git a/arch/arm/plat-s3c24xx/include/plat/udc.h b/arch/arm/plat-s3c24xx/include/plat/udc.h index 80457c6414a..f6388424250 100644 --- a/arch/arm/plat-s3c24xx/include/plat/udc.h +++ b/arch/arm/plat-s3c24xx/include/plat/udc.h | |||
| @@ -37,4 +37,21 @@ struct s3c2410_udc_mach_info { | |||
| 37 | 37 | ||
| 38 | extern void __init s3c24xx_udc_set_platdata(struct s3c2410_udc_mach_info *); | 38 | extern void __init s3c24xx_udc_set_platdata(struct s3c2410_udc_mach_info *); |
| 39 | 39 | ||
| 40 | /** | ||
| 41 | * s3c24xx_hsudc_platdata - Platform data for USB High-Speed gadget controller. | ||
| 42 | * @epnum: Number of endpoints to be instantiated by the controller driver. | ||
| 43 | * @gpio_init: Platform specific USB related GPIO initialization. | ||
| 44 | * @gpio_uninit: Platform specific USB releted GPIO uninitialzation. | ||
| 45 | * | ||
| 46 | * Representation of platform data for the S3C24XX USB 2.0 High Speed gadget | ||
| 47 | * controllers. | ||
| 48 | */ | ||
| 49 | struct s3c24xx_hsudc_platdata { | ||
| 50 | unsigned int epnum; | ||
| 51 | void (*gpio_init)(void); | ||
| 52 | void (*gpio_uninit)(void); | ||
| 53 | }; | ||
| 54 | |||
| 55 | extern void __init s3c24xx_hsudc_set_platdata(struct s3c24xx_hsudc_platdata *pd); | ||
| 56 | |||
| 40 | #endif /* __ASM_ARM_ARCH_UDC_H */ | 57 | #endif /* __ASM_ARM_ARCH_UDC_H */ |
diff --git a/arch/arm/plat-s5p/Kconfig b/arch/arm/plat-s5p/Kconfig index 84922971658..6751bcf7b88 100644 --- a/arch/arm/plat-s5p/Kconfig +++ b/arch/arm/plat-s5p/Kconfig | |||
| @@ -85,6 +85,11 @@ config S5P_DEV_CSIS1 | |||
| 85 | help | 85 | help |
| 86 | Compile in platform device definitions for MIPI-CSIS channel 1 | 86 | Compile in platform device definitions for MIPI-CSIS channel 1 |
| 87 | 87 | ||
| 88 | config S5P_DEV_USB_EHCI | ||
| 89 | bool | ||
| 90 | help | ||
| 91 | Compile in platform device definition for USB EHCI | ||
| 92 | |||
| 88 | config S5P_SETUP_MIPIPHY | 93 | config S5P_SETUP_MIPIPHY |
| 89 | bool | 94 | bool |
| 90 | help | 95 | help |
diff --git a/arch/arm/plat-s5p/Makefile b/arch/arm/plat-s5p/Makefile index 42afff7f60b..e234cc4d49a 100644 --- a/arch/arm/plat-s5p/Makefile +++ b/arch/arm/plat-s5p/Makefile | |||
| @@ -33,4 +33,5 @@ obj-$(CONFIG_S5P_DEV_FIMC3) += dev-fimc3.o | |||
| 33 | obj-$(CONFIG_S5P_DEV_ONENAND) += dev-onenand.o | 33 | obj-$(CONFIG_S5P_DEV_ONENAND) += dev-onenand.o |
| 34 | obj-$(CONFIG_S5P_DEV_CSIS0) += dev-csis0.o | 34 | obj-$(CONFIG_S5P_DEV_CSIS0) += dev-csis0.o |
| 35 | obj-$(CONFIG_S5P_DEV_CSIS1) += dev-csis1.o | 35 | obj-$(CONFIG_S5P_DEV_CSIS1) += dev-csis1.o |
| 36 | obj-$(CONFIG_S5P_DEV_USB_EHCI) += dev-ehci.o | ||
| 36 | obj-$(CONFIG_S5P_SETUP_MIPIPHY) += setup-mipiphy.o | 37 | obj-$(CONFIG_S5P_SETUP_MIPIPHY) += setup-mipiphy.o |
diff --git a/arch/arm/plat-s5p/dev-ehci.c b/arch/arm/plat-s5p/dev-ehci.c new file mode 100644 index 00000000000..94080fff9e9 --- /dev/null +++ b/arch/arm/plat-s5p/dev-ehci.c | |||
| @@ -0,0 +1,57 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2011 Samsung Electronics Co.Ltd | ||
| 3 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify it | ||
| 6 | * under the terms of the GNU General Public License as published by the | ||
| 7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 8 | * option) any later version. | ||
| 9 | * | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <linux/platform_device.h> | ||
| 13 | #include <mach/irqs.h> | ||
| 14 | #include <mach/map.h> | ||
| 15 | #include <plat/devs.h> | ||
| 16 | #include <plat/ehci.h> | ||
| 17 | #include <plat/usb-phy.h> | ||
| 18 | |||
| 19 | /* USB EHCI Host Controller registration */ | ||
| 20 | static struct resource s5p_ehci_resource[] = { | ||
| 21 | [0] = { | ||
| 22 | .start = S5P_PA_EHCI, | ||
| 23 | .end = S5P_PA_EHCI + SZ_256 - 1, | ||
| 24 | .flags = IORESOURCE_MEM, | ||
| 25 | }, | ||
| 26 | [1] = { | ||
| 27 | .start = IRQ_USB_HOST, | ||
| 28 | .end = IRQ_USB_HOST, | ||
| 29 | .flags = IORESOURCE_IRQ, | ||
| 30 | } | ||
| 31 | }; | ||
| 32 | |||
| 33 | static u64 s5p_device_ehci_dmamask = 0xffffffffUL; | ||
| 34 | |||
| 35 | struct platform_device s5p_device_ehci = { | ||
| 36 | .name = "s5p-ehci", | ||
| 37 | .id = -1, | ||
| 38 | .num_resources = ARRAY_SIZE(s5p_ehci_resource), | ||
| 39 | .resource = s5p_ehci_resource, | ||
| 40 | .dev = { | ||
| 41 | .dma_mask = &s5p_device_ehci_dmamask, | ||
| 42 | .coherent_dma_mask = 0xffffffffUL | ||
| 43 | } | ||
| 44 | }; | ||
| 45 | |||
| 46 | void __init s5p_ehci_set_platdata(struct s5p_ehci_platdata *pd) | ||
| 47 | { | ||
| 48 | struct s5p_ehci_platdata *npd; | ||
| 49 | |||
| 50 | npd = s3c_set_platdata(pd, sizeof(struct s5p_ehci_platdata), | ||
| 51 | &s5p_device_ehci); | ||
| 52 | |||
| 53 | if (!npd->phy_init) | ||
| 54 | npd->phy_init = s5p_usb_phy_init; | ||
| 55 | if (!npd->phy_exit) | ||
| 56 | npd->phy_exit = s5p_usb_phy_exit; | ||
| 57 | } | ||
diff --git a/arch/arm/plat-s5p/include/plat/ehci.h b/arch/arm/plat-s5p/include/plat/ehci.h new file mode 100644 index 00000000000..6ae6810c756 --- /dev/null +++ b/arch/arm/plat-s5p/include/plat/ehci.h | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2011 Samsung Electronics Co.Ltd | ||
| 3 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify it | ||
| 6 | * under the terms of the GNU General Public License as published by the | ||
| 7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 8 | * option) any later version. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef __PLAT_S5P_EHCI_H | ||
| 12 | #define __PLAT_S5P_EHCI_H | ||
| 13 | |||
| 14 | struct s5p_ehci_platdata { | ||
| 15 | int (*phy_init)(struct platform_device *pdev, int type); | ||
| 16 | int (*phy_exit)(struct platform_device *pdev, int type); | ||
| 17 | }; | ||
| 18 | |||
| 19 | extern void s5p_ehci_set_platdata(struct s5p_ehci_platdata *pd); | ||
| 20 | |||
| 21 | #endif /* __PLAT_S5P_EHCI_H */ | ||
diff --git a/arch/arm/plat-s5p/include/plat/map-s5p.h b/arch/arm/plat-s5p/include/plat/map-s5p.h index d973d39666a..a6c3d327ce7 100644 --- a/arch/arm/plat-s5p/include/plat/map-s5p.h +++ b/arch/arm/plat-s5p/include/plat/map-s5p.h | |||
| @@ -39,7 +39,7 @@ | |||
| 39 | #define S5P_VA_TWD S5P_VA_COREPERI(0x600) | 39 | #define S5P_VA_TWD S5P_VA_COREPERI(0x600) |
| 40 | #define S5P_VA_GIC_DIST S5P_VA_COREPERI(0x1000) | 40 | #define S5P_VA_GIC_DIST S5P_VA_COREPERI(0x1000) |
| 41 | 41 | ||
| 42 | #define S3C_VA_USB_HSPHY S3C_ADDR(0x02900000) | 42 | #define S5P_VA_USB_HSPHY S3C_ADDR(0x02900000) |
| 43 | 43 | ||
| 44 | #define VA_VIC(x) (S3C_VA_IRQ + ((x) * 0x10000)) | 44 | #define VA_VIC(x) (S3C_VA_IRQ + ((x) * 0x10000)) |
| 45 | #define VA_VIC0 VA_VIC(0) | 45 | #define VA_VIC0 VA_VIC(0) |
diff --git a/arch/arm/plat-s5p/include/plat/usb-phy.h b/arch/arm/plat-s5p/include/plat/usb-phy.h new file mode 100644 index 00000000000..6dd6bcfca3c --- /dev/null +++ b/arch/arm/plat-s5p/include/plat/usb-phy.h | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2011 Samsung Electronics Co.Ltd | ||
| 3 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify it | ||
| 6 | * under the terms of the GNU General Public License as published by the | ||
| 7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 8 | * option) any later version. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef __PLAT_S5P_USB_PHY_H | ||
| 12 | #define __PLAT_S5P_USB_PHY_H | ||
| 13 | |||
| 14 | enum s5p_usb_phy_type { | ||
| 15 | S5P_USB_PHY_DEVICE, | ||
| 16 | S5P_USB_PHY_HOST, | ||
| 17 | }; | ||
| 18 | |||
| 19 | extern int s5p_usb_phy_init(struct platform_device *pdev, int type); | ||
| 20 | extern int s5p_usb_phy_exit(struct platform_device *pdev, int type); | ||
| 21 | |||
| 22 | #endif /* __PLAT_S5P_REGS_USB_PHY_H */ | ||
diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h index f0da6b70fba..39818d8da42 100644 --- a/arch/arm/plat-samsung/include/plat/devs.h +++ b/arch/arm/plat-samsung/include/plat/devs.h | |||
| @@ -88,6 +88,7 @@ extern struct platform_device s3c64xx_device_onenand1; | |||
| 88 | extern struct platform_device s5p_device_onenand; | 88 | extern struct platform_device s5p_device_onenand; |
| 89 | 89 | ||
| 90 | extern struct platform_device s3c_device_usbgadget; | 90 | extern struct platform_device s3c_device_usbgadget; |
| 91 | extern struct platform_device s3c_device_usb_hsudc; | ||
| 91 | extern struct platform_device s3c_device_usb_hsotg; | 92 | extern struct platform_device s3c_device_usb_hsotg; |
| 92 | 93 | ||
| 93 | extern struct platform_device s5pv210_device_ac97; | 94 | extern struct platform_device s5pv210_device_ac97; |
| @@ -142,6 +143,8 @@ extern struct platform_device s5p_device_fimc3; | |||
| 142 | extern struct platform_device s5p_device_mipi_csis0; | 143 | extern struct platform_device s5p_device_mipi_csis0; |
| 143 | extern struct platform_device s5p_device_mipi_csis1; | 144 | extern struct platform_device s5p_device_mipi_csis1; |
| 144 | 145 | ||
| 146 | extern struct platform_device s5p_device_ehci; | ||
| 147 | |||
| 145 | extern struct platform_device exynos4_device_sysmmu; | 148 | extern struct platform_device exynos4_device_sysmmu; |
| 146 | 149 | ||
| 147 | /* s3c2440 specific devices */ | 150 | /* s3c2440 specific devices */ |
diff --git a/arch/mips/ath79/Kconfig b/arch/mips/ath79/Kconfig index b05828260f7..47707410582 100644 --- a/arch/mips/ath79/Kconfig +++ b/arch/mips/ath79/Kconfig | |||
| @@ -26,12 +26,17 @@ config ATH79_MACH_PB44 | |||
| 26 | endmenu | 26 | endmenu |
| 27 | 27 | ||
| 28 | config SOC_AR71XX | 28 | config SOC_AR71XX |
| 29 | select USB_ARCH_HAS_EHCI | ||
| 30 | select USB_ARCH_HAS_OHCI | ||
| 29 | def_bool n | 31 | def_bool n |
| 30 | 32 | ||
| 31 | config SOC_AR724X | 33 | config SOC_AR724X |
| 34 | select USB_ARCH_HAS_EHCI | ||
| 35 | select USB_ARCH_HAS_OHCI | ||
| 32 | def_bool n | 36 | def_bool n |
| 33 | 37 | ||
| 34 | config SOC_AR913X | 38 | config SOC_AR913X |
| 39 | select USB_ARCH_HAS_EHCI | ||
| 35 | def_bool n | 40 | def_bool n |
| 36 | 41 | ||
| 37 | config ATH79_DEV_AR913X_WMAC | 42 | config ATH79_DEV_AR913X_WMAC |
diff --git a/drivers/Makefile b/drivers/Makefile index a29527f4ded..145aeadb6c0 100644 --- a/drivers/Makefile +++ b/drivers/Makefile | |||
| @@ -64,11 +64,10 @@ obj-$(CONFIG_ATA_OVER_ETH) += block/aoe/ | |||
| 64 | obj-$(CONFIG_PARIDE) += block/paride/ | 64 | obj-$(CONFIG_PARIDE) += block/paride/ |
| 65 | obj-$(CONFIG_TC) += tc/ | 65 | obj-$(CONFIG_TC) += tc/ |
| 66 | obj-$(CONFIG_UWB) += uwb/ | 66 | obj-$(CONFIG_UWB) += uwb/ |
| 67 | obj-$(CONFIG_USB_OTG_UTILS) += usb/otg/ | 67 | obj-$(CONFIG_USB_OTG_UTILS) += usb/ |
| 68 | obj-$(CONFIG_USB) += usb/ | 68 | obj-$(CONFIG_USB) += usb/ |
| 69 | obj-$(CONFIG_USB_MUSB_HDRC) += usb/musb/ | ||
| 70 | obj-$(CONFIG_PCI) += usb/ | 69 | obj-$(CONFIG_PCI) += usb/ |
| 71 | obj-$(CONFIG_USB_GADGET) += usb/gadget/ | 70 | obj-$(CONFIG_USB_GADGET) += usb/ |
| 72 | obj-$(CONFIG_SERIO) += input/serio/ | 71 | obj-$(CONFIG_SERIO) += input/serio/ |
| 73 | obj-$(CONFIG_GAMEPORT) += input/gameport/ | 72 | obj-$(CONFIG_GAMEPORT) += input/gameport/ |
| 74 | obj-$(CONFIG_INPUT) += input/ | 73 | obj-$(CONFIG_INPUT) += input/ |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 4140fd27141..c957c4b4fe7 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
| @@ -1775,19 +1775,37 @@ static const struct hid_device_id hid_ignore_list[] = { | |||
| 1775 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_GPEN_560) }, | 1775 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_GPEN_560) }, |
| 1776 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_KYE, 0x0058) }, | 1776 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_KYE, 0x0058) }, |
| 1777 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) }, | 1777 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) }, |
| 1778 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY2) }, | ||
| 1778 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) }, | 1779 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) }, |
| 1780 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY2) }, | ||
| 1779 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY) }, | 1781 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY) }, |
| 1782 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY2) }, | ||
| 1783 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYVOLTAGE) }, | ||
| 1784 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYCURRENT) }, | ||
| 1785 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) }, | ||
| 1786 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) }, | ||
| 1787 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) }, | ||
| 1780 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) }, | 1788 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) }, |
| 1781 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) }, | 1789 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) }, |
| 1782 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) }, | 1790 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) }, |
| 1783 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY1) }, | 1791 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIC) }, |
| 1792 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIB) }, | ||
| 1793 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY) }, | ||
| 1784 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY2) }, | 1794 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY2) }, |
| 1785 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_VIDEOCOM) }, | 1795 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_VIDEOCOM) }, |
| 1796 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOTOR) }, | ||
| 1786 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_COM3LAB) }, | 1797 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_COM3LAB) }, |
| 1787 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_TELEPORT) }, | 1798 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_TELEPORT) }, |
| 1788 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_NETWORKANALYSER) }, | 1799 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_NETWORKANALYSER) }, |
| 1789 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERCONTROL) }, | 1800 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERCONTROL) }, |
| 1790 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETEST) }, | 1801 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETEST) }, |
| 1802 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOSTANALYSER) }, | ||
| 1803 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOSTANALYSER2) }, | ||
| 1804 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_ABSESP) }, | ||
| 1805 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_AUTODATABUS) }, | ||
| 1806 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MCT) }, | ||
| 1807 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HYBRID) }, | ||
| 1808 | { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HEATCONTROL) }, | ||
| 1791 | { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS) }, | 1809 | { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS) }, |
| 1792 | { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS) }, | 1810 | { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS) }, |
| 1793 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1) }, | 1811 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1) }, |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index e715c43aa01..0b374a6d6db 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
| @@ -380,19 +380,38 @@ | |||
| 380 | 380 | ||
| 381 | #define USB_VENDOR_ID_LD 0x0f11 | 381 | #define USB_VENDOR_ID_LD 0x0f11 |
| 382 | #define USB_DEVICE_ID_LD_CASSY 0x1000 | 382 | #define USB_DEVICE_ID_LD_CASSY 0x1000 |
| 383 | #define USB_DEVICE_ID_LD_CASSY2 0x1001 | ||
| 383 | #define USB_DEVICE_ID_LD_POCKETCASSY 0x1010 | 384 | #define USB_DEVICE_ID_LD_POCKETCASSY 0x1010 |
| 385 | #define USB_DEVICE_ID_LD_POCKETCASSY2 0x1011 | ||
| 384 | #define USB_DEVICE_ID_LD_MOBILECASSY 0x1020 | 386 | #define USB_DEVICE_ID_LD_MOBILECASSY 0x1020 |
| 387 | #define USB_DEVICE_ID_LD_MOBILECASSY2 0x1021 | ||
| 388 | #define USB_DEVICE_ID_LD_MICROCASSYVOLTAGE 0x1031 | ||
| 389 | #define USB_DEVICE_ID_LD_MICROCASSYCURRENT 0x1032 | ||
| 390 | #define USB_DEVICE_ID_LD_MICROCASSYTIME 0x1033 | ||
| 391 | #define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE 0x1035 | ||
| 392 | #define USB_DEVICE_ID_LD_MICROCASSYPH 0x1038 | ||
| 385 | #define USB_DEVICE_ID_LD_JWM 0x1080 | 393 | #define USB_DEVICE_ID_LD_JWM 0x1080 |
| 386 | #define USB_DEVICE_ID_LD_DMMP 0x1081 | 394 | #define USB_DEVICE_ID_LD_DMMP 0x1081 |
| 387 | #define USB_DEVICE_ID_LD_UMIP 0x1090 | 395 | #define USB_DEVICE_ID_LD_UMIP 0x1090 |
| 388 | #define USB_DEVICE_ID_LD_XRAY1 0x1100 | 396 | #define USB_DEVICE_ID_LD_UMIC 0x10A0 |
| 397 | #define USB_DEVICE_ID_LD_UMIB 0x10B0 | ||
| 398 | #define USB_DEVICE_ID_LD_XRAY 0x1100 | ||
| 389 | #define USB_DEVICE_ID_LD_XRAY2 0x1101 | 399 | #define USB_DEVICE_ID_LD_XRAY2 0x1101 |
| 400 | #define USB_DEVICE_ID_LD_XRAYCT 0x1110 | ||
| 390 | #define USB_DEVICE_ID_LD_VIDEOCOM 0x1200 | 401 | #define USB_DEVICE_ID_LD_VIDEOCOM 0x1200 |
| 402 | #define USB_DEVICE_ID_LD_MOTOR 0x1210 | ||
| 391 | #define USB_DEVICE_ID_LD_COM3LAB 0x2000 | 403 | #define USB_DEVICE_ID_LD_COM3LAB 0x2000 |
| 392 | #define USB_DEVICE_ID_LD_TELEPORT 0x2010 | 404 | #define USB_DEVICE_ID_LD_TELEPORT 0x2010 |
| 393 | #define USB_DEVICE_ID_LD_NETWORKANALYSER 0x2020 | 405 | #define USB_DEVICE_ID_LD_NETWORKANALYSER 0x2020 |
| 394 | #define USB_DEVICE_ID_LD_POWERCONTROL 0x2030 | 406 | #define USB_DEVICE_ID_LD_POWERCONTROL 0x2030 |
| 395 | #define USB_DEVICE_ID_LD_MACHINETEST 0x2040 | 407 | #define USB_DEVICE_ID_LD_MACHINETEST 0x2040 |
| 408 | #define USB_DEVICE_ID_LD_MOSTANALYSER 0x2050 | ||
| 409 | #define USB_DEVICE_ID_LD_MOSTANALYSER2 0x2051 | ||
| 410 | #define USB_DEVICE_ID_LD_ABSESP 0x2060 | ||
| 411 | #define USB_DEVICE_ID_LD_AUTODATABUS 0x2070 | ||
| 412 | #define USB_DEVICE_ID_LD_MCT 0x2080 | ||
| 413 | #define USB_DEVICE_ID_LD_HYBRID 0x2090 | ||
| 414 | #define USB_DEVICE_ID_LD_HEATCONTROL 0x20A0 | ||
| 396 | 415 | ||
| 397 | #define USB_VENDOR_ID_LOGITECH 0x046d | 416 | #define USB_VENDOR_ID_LOGITECH 0x046d |
| 398 | #define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101 | 417 | #define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101 |
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index 006489d82dc..48f1781352f 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig | |||
| @@ -65,8 +65,10 @@ config USB_ARCH_HAS_EHCI | |||
| 65 | default y if ARCH_CNS3XXX | 65 | default y if ARCH_CNS3XXX |
| 66 | default y if ARCH_VT8500 | 66 | default y if ARCH_VT8500 |
| 67 | default y if PLAT_SPEAR | 67 | default y if PLAT_SPEAR |
| 68 | default y if PLAT_S5P | ||
| 68 | default y if ARCH_MSM | 69 | default y if ARCH_MSM |
| 69 | default y if MICROBLAZE | 70 | default y if MICROBLAZE |
| 71 | default y if SPARC_LEON | ||
| 70 | default PCI | 72 | default PCI |
| 71 | 73 | ||
| 72 | # ARM SA1111 chips have a non-PCI based "OHCI-compatible" USB host interface. | 74 | # ARM SA1111 chips have a non-PCI based "OHCI-compatible" USB host interface. |
| @@ -116,6 +118,8 @@ source "drivers/usb/host/Kconfig" | |||
| 116 | 118 | ||
| 117 | source "drivers/usb/musb/Kconfig" | 119 | source "drivers/usb/musb/Kconfig" |
| 118 | 120 | ||
| 121 | source "drivers/usb/renesas_usbhs/Kconfig" | ||
| 122 | |||
| 119 | source "drivers/usb/class/Kconfig" | 123 | source "drivers/usb/class/Kconfig" |
| 120 | 124 | ||
| 121 | source "drivers/usb/storage/Kconfig" | 125 | source "drivers/usb/storage/Kconfig" |
diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile index 239f050efa3..30ddf8dc4f7 100644 --- a/drivers/usb/Makefile +++ b/drivers/usb/Makefile | |||
| @@ -22,6 +22,7 @@ obj-$(CONFIG_USB_R8A66597_HCD) += host/ | |||
| 22 | obj-$(CONFIG_USB_HWA_HCD) += host/ | 22 | obj-$(CONFIG_USB_HWA_HCD) += host/ |
| 23 | obj-$(CONFIG_USB_ISP1760_HCD) += host/ | 23 | obj-$(CONFIG_USB_ISP1760_HCD) += host/ |
| 24 | obj-$(CONFIG_USB_IMX21_HCD) += host/ | 24 | obj-$(CONFIG_USB_IMX21_HCD) += host/ |
| 25 | obj-$(CONFIG_USB_FSL_MPH_DR_OF) += host/ | ||
| 25 | 26 | ||
| 26 | obj-$(CONFIG_USB_C67X00_HCD) += c67x00/ | 27 | obj-$(CONFIG_USB_C67X00_HCD) += c67x00/ |
| 27 | 28 | ||
| @@ -45,3 +46,8 @@ obj-$(CONFIG_EARLY_PRINTK_DBGP) += early/ | |||
| 45 | 46 | ||
| 46 | obj-$(CONFIG_USB_ATM) += atm/ | 47 | obj-$(CONFIG_USB_ATM) += atm/ |
| 47 | obj-$(CONFIG_USB_SPEEDTOUCH) += atm/ | 48 | obj-$(CONFIG_USB_SPEEDTOUCH) += atm/ |
| 49 | |||
| 50 | obj-$(CONFIG_USB_MUSB_HDRC) += musb/ | ||
| 51 | obj-$(CONFIG_USB_RENESAS_USBHS) += renesas_usbhs/ | ||
| 52 | obj-$(CONFIG_USB_OTG_UTILS) += otg/ | ||
| 53 | obj-$(CONFIG_USB_GADGET) += gadget/ | ||
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index e057e538146..395a347f2eb 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
| @@ -7,35 +7,12 @@ | |||
| 7 | * Copyright (c) 2000 Vojtech Pavlik <vojtech@suse.cz> | 7 | * Copyright (c) 2000 Vojtech Pavlik <vojtech@suse.cz> |
| 8 | * Copyright (c) 2004 Oliver Neukum <oliver@neukum.name> | 8 | * Copyright (c) 2004 Oliver Neukum <oliver@neukum.name> |
| 9 | * Copyright (c) 2005 David Kubicek <dave@awk.cz> | 9 | * Copyright (c) 2005 David Kubicek <dave@awk.cz> |
| 10 | * Copyright (c) 2011 Johan Hovold <jhovold@gmail.com> | ||
| 10 | * | 11 | * |
| 11 | * USB Abstract Control Model driver for USB modems and ISDN adapters | 12 | * USB Abstract Control Model driver for USB modems and ISDN adapters |
| 12 | * | 13 | * |
| 13 | * Sponsored by SuSE | 14 | * Sponsored by SuSE |
| 14 | * | 15 | * |
| 15 | * ChangeLog: | ||
| 16 | * v0.9 - thorough cleaning, URBification, almost a rewrite | ||
| 17 | * v0.10 - some more cleanups | ||
| 18 | * v0.11 - fixed flow control, read error doesn't stop reads | ||
| 19 | * v0.12 - added TIOCM ioctls, added break handling, made struct acm | ||
| 20 | * kmalloced | ||
| 21 | * v0.13 - added termios, added hangup | ||
| 22 | * v0.14 - sized down struct acm | ||
| 23 | * v0.15 - fixed flow control again - characters could be lost | ||
| 24 | * v0.16 - added code for modems with swapped data and control interfaces | ||
| 25 | * v0.17 - added new style probing | ||
| 26 | * v0.18 - fixed new style probing for devices with more configurations | ||
| 27 | * v0.19 - fixed CLOCAL handling (thanks to Richard Shih-Ping Chan) | ||
| 28 | * v0.20 - switched to probing on interface (rather than device) class | ||
| 29 | * v0.21 - revert to probing on device for devices with multiple configs | ||
| 30 | * v0.22 - probe only the control interface. if usbcore doesn't choose the | ||
| 31 | * config we want, sysadmin changes bConfigurationValue in sysfs. | ||
| 32 | * v0.23 - use softirq for rx processing, as needed by tty layer | ||
| 33 | * v0.24 - change probe method to evaluate CDC union descriptor | ||
| 34 | * v0.25 - downstream tasks paralelized to maximize throughput | ||
| 35 | * v0.26 - multiple write urbs, writesize increased | ||
| 36 | */ | ||
| 37 | |||
| 38 | /* | ||
| 39 | * This program is free software; you can redistribute it and/or modify | 16 | * This program is free software; you can redistribute it and/or modify |
| 40 | * it under the terms of the GNU General Public License as published by | 17 | * it under the terms of the GNU General Public License as published by |
| 41 | * the Free Software Foundation; either version 2 of the License, or | 18 | * the Free Software Foundation; either version 2 of the License, or |
| @@ -74,13 +51,7 @@ | |||
| 74 | #include "cdc-acm.h" | 51 | #include "cdc-acm.h" |
| 75 | 52 | ||
| 76 | 53 | ||
| 77 | #define ACM_CLOSE_TIMEOUT 15 /* seconds to let writes drain */ | 54 | #define DRIVER_AUTHOR "Armin Fuerst, Pavel Machek, Johannes Erdfelt, Vojtech Pavlik, David Kubicek, Johan Hovold" |
| 78 | |||
| 79 | /* | ||
| 80 | * Version Information | ||
| 81 | */ | ||
| 82 | #define DRIVER_VERSION "v0.26" | ||
| 83 | #define DRIVER_AUTHOR "Armin Fuerst, Pavel Machek, Johannes Erdfelt, Vojtech Pavlik, David Kubicek" | ||
| 84 | #define DRIVER_DESC "USB Abstract Control Model driver for USB modems and ISDN adapters" | 55 | #define DRIVER_DESC "USB Abstract Control Model driver for USB modems and ISDN adapters" |
| 85 | 56 | ||
| 86 | static struct usb_driver acm_driver; | 57 | static struct usb_driver acm_driver; |
| @@ -94,12 +65,6 @@ static DEFINE_MUTEX(open_mutex); | |||
| 94 | static const struct tty_port_operations acm_port_ops = { | 65 | static const struct tty_port_operations acm_port_ops = { |
| 95 | }; | 66 | }; |
| 96 | 67 | ||
| 97 | #ifdef VERBOSE_DEBUG | ||
| 98 | #define verbose 1 | ||
| 99 | #else | ||
| 100 | #define verbose 0 | ||
| 101 | #endif | ||
| 102 | |||
| 103 | /* | 68 | /* |
| 104 | * Functions for ACM control messages. | 69 | * Functions for ACM control messages. |
| 105 | */ | 70 | */ |
| @@ -111,8 +76,9 @@ static int acm_ctrl_msg(struct acm *acm, int request, int value, | |||
| 111 | request, USB_RT_ACM, value, | 76 | request, USB_RT_ACM, value, |
| 112 | acm->control->altsetting[0].desc.bInterfaceNumber, | 77 | acm->control->altsetting[0].desc.bInterfaceNumber, |
| 113 | buf, len, 5000); | 78 | buf, len, 5000); |
| 114 | dbg("acm_control_msg: rq: 0x%02x val: %#x len: %#x result: %d", | 79 | dev_dbg(&acm->control->dev, |
| 115 | request, value, len, retval); | 80 | "%s - rq 0x%02x, val %#x, len %#x, result %d\n", |
| 81 | __func__, request, value, len, retval); | ||
| 116 | return retval < 0 ? retval : 0; | 82 | return retval < 0 ? retval : 0; |
| 117 | } | 83 | } |
| 118 | 84 | ||
| @@ -192,7 +158,9 @@ static int acm_start_wb(struct acm *acm, struct acm_wb *wb) | |||
| 192 | 158 | ||
| 193 | rc = usb_submit_urb(wb->urb, GFP_ATOMIC); | 159 | rc = usb_submit_urb(wb->urb, GFP_ATOMIC); |
| 194 | if (rc < 0) { | 160 | if (rc < 0) { |
| 195 | dbg("usb_submit_urb(write bulk) failed: %d", rc); | 161 | dev_err(&acm->data->dev, |
| 162 | "%s - usb_submit_urb(write bulk) failed: %d\n", | ||
| 163 | __func__, rc); | ||
| 196 | acm_write_done(acm, wb); | 164 | acm_write_done(acm, wb); |
| 197 | } | 165 | } |
| 198 | return rc; | 166 | return rc; |
| @@ -211,7 +179,8 @@ static int acm_write_start(struct acm *acm, int wbn) | |||
| 211 | return -ENODEV; | 179 | return -ENODEV; |
| 212 | } | 180 | } |
| 213 | 181 | ||
| 214 | dbg("%s susp_count: %d", __func__, acm->susp_count); | 182 | dev_vdbg(&acm->data->dev, "%s - susp_count %d\n", __func__, |
| 183 | acm->susp_count); | ||
| 215 | usb_autopm_get_interface_async(acm->control); | 184 | usb_autopm_get_interface_async(acm->control); |
| 216 | if (acm->susp_count) { | 185 | if (acm->susp_count) { |
| 217 | if (!acm->delayed_wb) | 186 | if (!acm->delayed_wb) |
| @@ -287,10 +256,14 @@ static void acm_ctrl_irq(struct urb *urb) | |||
| 287 | case -ENOENT: | 256 | case -ENOENT: |
| 288 | case -ESHUTDOWN: | 257 | case -ESHUTDOWN: |
| 289 | /* this urb is terminated, clean up */ | 258 | /* this urb is terminated, clean up */ |
| 290 | dbg("%s - urb shutting down with status: %d", __func__, status); | 259 | dev_dbg(&acm->control->dev, |
| 260 | "%s - urb shutting down with status: %d\n", | ||
| 261 | __func__, status); | ||
| 291 | return; | 262 | return; |
| 292 | default: | 263 | default: |
| 293 | dbg("%s - nonzero urb status received: %d", __func__, status); | 264 | dev_dbg(&acm->control->dev, |
| 265 | "%s - nonzero urb status received: %d\n", | ||
| 266 | __func__, status); | ||
| 294 | goto exit; | 267 | goto exit; |
| 295 | } | 268 | } |
| 296 | 269 | ||
| @@ -302,8 +275,8 @@ static void acm_ctrl_irq(struct urb *urb) | |||
| 302 | data = (unsigned char *)(dr + 1); | 275 | data = (unsigned char *)(dr + 1); |
| 303 | switch (dr->bNotificationType) { | 276 | switch (dr->bNotificationType) { |
| 304 | case USB_CDC_NOTIFY_NETWORK_CONNECTION: | 277 | case USB_CDC_NOTIFY_NETWORK_CONNECTION: |
| 305 | dbg("%s network", dr->wValue ? | 278 | dev_dbg(&acm->control->dev, "%s - network connection: %d\n", |
| 306 | "connected to" : "disconnected from"); | 279 | __func__, dr->wValue); |
| 307 | break; | 280 | break; |
| 308 | 281 | ||
| 309 | case USB_CDC_NOTIFY_SERIAL_STATE: | 282 | case USB_CDC_NOTIFY_SERIAL_STATE: |
| @@ -313,7 +286,8 @@ static void acm_ctrl_irq(struct urb *urb) | |||
| 313 | if (tty) { | 286 | if (tty) { |
| 314 | if (!acm->clocal && | 287 | if (!acm->clocal && |
| 315 | (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) { | 288 | (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) { |
| 316 | dbg("calling hangup"); | 289 | dev_dbg(&acm->control->dev, |
| 290 | "%s - calling hangup\n", __func__); | ||
| 317 | tty_hangup(tty); | 291 | tty_hangup(tty); |
| 318 | } | 292 | } |
| 319 | tty_kref_put(tty); | 293 | tty_kref_put(tty); |
| @@ -321,7 +295,10 @@ static void acm_ctrl_irq(struct urb *urb) | |||
| 321 | 295 | ||
| 322 | acm->ctrlin = newctrl; | 296 | acm->ctrlin = newctrl; |
| 323 | 297 | ||
| 324 | dbg("input control lines: dcd%c dsr%c break%c ring%c framing%c parity%c overrun%c", | 298 | dev_dbg(&acm->control->dev, |
| 299 | "%s - input control lines: dcd%c dsr%c break%c " | ||
| 300 | "ring%c framing%c parity%c overrun%c\n", | ||
| 301 | __func__, | ||
| 325 | acm->ctrlin & ACM_CTRL_DCD ? '+' : '-', | 302 | acm->ctrlin & ACM_CTRL_DCD ? '+' : '-', |
| 326 | acm->ctrlin & ACM_CTRL_DSR ? '+' : '-', | 303 | acm->ctrlin & ACM_CTRL_DSR ? '+' : '-', |
| 327 | acm->ctrlin & ACM_CTRL_BRK ? '+' : '-', | 304 | acm->ctrlin & ACM_CTRL_BRK ? '+' : '-', |
| @@ -332,7 +309,10 @@ static void acm_ctrl_irq(struct urb *urb) | |||
| 332 | break; | 309 | break; |
| 333 | 310 | ||
| 334 | default: | 311 | default: |
| 335 | dbg("unknown notification %d received: index %d len %d data0 %d data1 %d", | 312 | dev_dbg(&acm->control->dev, |
| 313 | "%s - unknown notification %d received: index %d " | ||
| 314 | "len %d data0 %d data1 %d\n", | ||
| 315 | __func__, | ||
| 336 | dr->bNotificationType, dr->wIndex, | 316 | dr->bNotificationType, dr->wIndex, |
| 337 | dr->wLength, data[0], data[1]); | 317 | dr->wLength, data[0], data[1]); |
| 338 | break; | 318 | break; |
| @@ -340,166 +320,96 @@ static void acm_ctrl_irq(struct urb *urb) | |||
| 340 | exit: | 320 | exit: |
| 341 | retval = usb_submit_urb(urb, GFP_ATOMIC); | 321 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
| 342 | if (retval) | 322 | if (retval) |
| 343 | dev_err(&urb->dev->dev, "%s - usb_submit_urb failed with " | 323 | dev_err(&acm->control->dev, "%s - usb_submit_urb failed: %d\n", |
| 344 | "result %d", __func__, retval); | 324 | __func__, retval); |
| 345 | } | 325 | } |
| 346 | 326 | ||
| 347 | /* data interface returns incoming bytes, or we got unthrottled */ | 327 | static int acm_submit_read_urb(struct acm *acm, int index, gfp_t mem_flags) |
| 348 | static void acm_read_bulk(struct urb *urb) | ||
| 349 | { | 328 | { |
| 350 | struct acm_rb *buf; | 329 | int res; |
| 351 | struct acm_ru *rcv = urb->context; | 330 | |
| 352 | struct acm *acm = rcv->instance; | 331 | if (!test_and_clear_bit(index, &acm->read_urbs_free)) |
| 353 | int status = urb->status; | 332 | return 0; |
| 354 | 333 | ||
| 355 | dbg("Entering acm_read_bulk with status %d", status); | 334 | dev_vdbg(&acm->data->dev, "%s - urb %d\n", __func__, index); |
| 356 | 335 | ||
| 357 | if (!ACM_READY(acm)) { | 336 | res = usb_submit_urb(acm->read_urbs[index], mem_flags); |
| 358 | dev_dbg(&acm->data->dev, "Aborting, acm not ready"); | 337 | if (res) { |
| 359 | return; | 338 | if (res != -EPERM) { |
| 339 | dev_err(&acm->data->dev, | ||
| 340 | "%s - usb_submit_urb failed: %d\n", | ||
| 341 | __func__, res); | ||
| 342 | } | ||
| 343 | set_bit(index, &acm->read_urbs_free); | ||
| 344 | return res; | ||
| 360 | } | 345 | } |
| 361 | usb_mark_last_busy(acm->dev); | ||
| 362 | 346 | ||
| 363 | if (status) | 347 | return 0; |
| 364 | dev_dbg(&acm->data->dev, "bulk rx status %d\n", status); | 348 | } |
| 365 | 349 | ||
| 366 | buf = rcv->buffer; | 350 | static int acm_submit_read_urbs(struct acm *acm, gfp_t mem_flags) |
| 367 | buf->size = urb->actual_length; | 351 | { |
| 352 | int res; | ||
| 353 | int i; | ||
| 368 | 354 | ||
| 369 | if (likely(status == 0)) { | 355 | for (i = 0; i < acm->rx_buflimit; ++i) { |
| 370 | spin_lock(&acm->read_lock); | 356 | res = acm_submit_read_urb(acm, i, mem_flags); |
| 371 | acm->processing++; | 357 | if (res) |
| 372 | list_add_tail(&rcv->list, &acm->spare_read_urbs); | 358 | return res; |
| 373 | list_add_tail(&buf->list, &acm->filled_read_bufs); | ||
| 374 | spin_unlock(&acm->read_lock); | ||
| 375 | } else { | ||
| 376 | /* we drop the buffer due to an error */ | ||
| 377 | spin_lock(&acm->read_lock); | ||
| 378 | list_add_tail(&rcv->list, &acm->spare_read_urbs); | ||
| 379 | list_add(&buf->list, &acm->spare_read_bufs); | ||
| 380 | spin_unlock(&acm->read_lock); | ||
| 381 | /* nevertheless the tasklet must be kicked unconditionally | ||
| 382 | so the queue cannot dry up */ | ||
| 383 | } | 359 | } |
| 384 | if (likely(!acm->susp_count)) | 360 | |
| 385 | tasklet_schedule(&acm->urb_task); | 361 | return 0; |
| 386 | } | 362 | } |
| 387 | 363 | ||
| 388 | static void acm_rx_tasklet(unsigned long _acm) | 364 | static void acm_process_read_urb(struct acm *acm, struct urb *urb) |
| 389 | { | 365 | { |
| 390 | struct acm *acm = (void *)_acm; | ||
| 391 | struct acm_rb *buf; | ||
| 392 | struct tty_struct *tty; | 366 | struct tty_struct *tty; |
| 393 | struct acm_ru *rcv; | ||
| 394 | unsigned long flags; | ||
| 395 | unsigned char throttled; | ||
| 396 | 367 | ||
| 397 | dbg("Entering acm_rx_tasklet"); | 368 | if (!urb->actual_length) |
| 398 | |||
| 399 | if (!ACM_READY(acm)) { | ||
| 400 | dbg("acm_rx_tasklet: ACM not ready"); | ||
| 401 | return; | 369 | return; |
| 402 | } | ||
| 403 | |||
| 404 | spin_lock_irqsave(&acm->throttle_lock, flags); | ||
| 405 | throttled = acm->throttle; | ||
| 406 | spin_unlock_irqrestore(&acm->throttle_lock, flags); | ||
| 407 | if (throttled) { | ||
| 408 | dbg("acm_rx_tasklet: throttled"); | ||
| 409 | return; | ||
| 410 | } | ||
| 411 | 370 | ||
| 412 | tty = tty_port_tty_get(&acm->port); | 371 | tty = tty_port_tty_get(&acm->port); |
| 372 | if (!tty) | ||
| 373 | return; | ||
| 413 | 374 | ||
| 414 | next_buffer: | 375 | tty_insert_flip_string(tty, urb->transfer_buffer, urb->actual_length); |
| 415 | spin_lock_irqsave(&acm->read_lock, flags); | 376 | tty_flip_buffer_push(tty); |
| 416 | if (list_empty(&acm->filled_read_bufs)) { | ||
| 417 | spin_unlock_irqrestore(&acm->read_lock, flags); | ||
| 418 | goto urbs; | ||
| 419 | } | ||
| 420 | buf = list_entry(acm->filled_read_bufs.next, | ||
| 421 | struct acm_rb, list); | ||
| 422 | list_del(&buf->list); | ||
| 423 | spin_unlock_irqrestore(&acm->read_lock, flags); | ||
| 424 | |||
| 425 | dbg("acm_rx_tasklet: procesing buf 0x%p, size = %d", buf, buf->size); | ||
| 426 | |||
| 427 | if (tty) { | ||
| 428 | spin_lock_irqsave(&acm->throttle_lock, flags); | ||
| 429 | throttled = acm->throttle; | ||
| 430 | spin_unlock_irqrestore(&acm->throttle_lock, flags); | ||
| 431 | if (!throttled) { | ||
| 432 | tty_insert_flip_string(tty, buf->base, buf->size); | ||
| 433 | tty_flip_buffer_push(tty); | ||
| 434 | } else { | ||
| 435 | tty_kref_put(tty); | ||
| 436 | dbg("Throttling noticed"); | ||
| 437 | spin_lock_irqsave(&acm->read_lock, flags); | ||
| 438 | list_add(&buf->list, &acm->filled_read_bufs); | ||
| 439 | spin_unlock_irqrestore(&acm->read_lock, flags); | ||
| 440 | return; | ||
| 441 | } | ||
| 442 | } | ||
| 443 | |||
| 444 | spin_lock_irqsave(&acm->read_lock, flags); | ||
| 445 | list_add(&buf->list, &acm->spare_read_bufs); | ||
| 446 | spin_unlock_irqrestore(&acm->read_lock, flags); | ||
| 447 | goto next_buffer; | ||
| 448 | 377 | ||
| 449 | urbs: | ||
| 450 | tty_kref_put(tty); | 378 | tty_kref_put(tty); |
| 379 | } | ||
| 451 | 380 | ||
| 452 | while (!list_empty(&acm->spare_read_bufs)) { | 381 | static void acm_read_bulk_callback(struct urb *urb) |
| 453 | spin_lock_irqsave(&acm->read_lock, flags); | 382 | { |
| 454 | if (list_empty(&acm->spare_read_urbs)) { | 383 | struct acm_rb *rb = urb->context; |
| 455 | acm->processing = 0; | 384 | struct acm *acm = rb->instance; |
| 456 | spin_unlock_irqrestore(&acm->read_lock, flags); | 385 | unsigned long flags; |
| 457 | return; | ||
| 458 | } | ||
| 459 | rcv = list_entry(acm->spare_read_urbs.next, | ||
| 460 | struct acm_ru, list); | ||
| 461 | list_del(&rcv->list); | ||
| 462 | spin_unlock_irqrestore(&acm->read_lock, flags); | ||
| 463 | 386 | ||
| 464 | buf = list_entry(acm->spare_read_bufs.next, | 387 | dev_vdbg(&acm->data->dev, "%s - urb %d, len %d\n", __func__, |
| 465 | struct acm_rb, list); | 388 | rb->index, urb->actual_length); |
| 466 | list_del(&buf->list); | 389 | set_bit(rb->index, &acm->read_urbs_free); |
| 467 | 390 | ||
| 468 | rcv->buffer = buf; | 391 | if (!acm->dev) { |
| 392 | dev_dbg(&acm->data->dev, "%s - disconnected\n", __func__); | ||
| 393 | return; | ||
| 394 | } | ||
| 395 | usb_mark_last_busy(acm->dev); | ||
| 469 | 396 | ||
| 470 | if (acm->is_int_ep) | 397 | if (urb->status) { |
| 471 | usb_fill_int_urb(rcv->urb, acm->dev, | 398 | dev_dbg(&acm->data->dev, "%s - non-zero urb status: %d\n", |
| 472 | acm->rx_endpoint, | 399 | __func__, urb->status); |
| 473 | buf->base, | 400 | return; |
| 474 | acm->readsize, | ||
| 475 | acm_read_bulk, rcv, acm->bInterval); | ||
| 476 | else | ||
| 477 | usb_fill_bulk_urb(rcv->urb, acm->dev, | ||
| 478 | acm->rx_endpoint, | ||
| 479 | buf->base, | ||
| 480 | acm->readsize, | ||
| 481 | acm_read_bulk, rcv); | ||
| 482 | rcv->urb->transfer_dma = buf->dma; | ||
| 483 | rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | ||
| 484 | |||
| 485 | /* This shouldn't kill the driver as unsuccessful URBs are | ||
| 486 | returned to the free-urbs-pool and resubmited ASAP */ | ||
| 487 | spin_lock_irqsave(&acm->read_lock, flags); | ||
| 488 | if (acm->susp_count || | ||
| 489 | usb_submit_urb(rcv->urb, GFP_ATOMIC) < 0) { | ||
| 490 | list_add(&buf->list, &acm->spare_read_bufs); | ||
| 491 | list_add(&rcv->list, &acm->spare_read_urbs); | ||
| 492 | acm->processing = 0; | ||
| 493 | spin_unlock_irqrestore(&acm->read_lock, flags); | ||
| 494 | return; | ||
| 495 | } else { | ||
| 496 | spin_unlock_irqrestore(&acm->read_lock, flags); | ||
| 497 | dbg("acm_rx_tasklet: sending urb 0x%p, rcv 0x%p, buf 0x%p", rcv->urb, rcv, buf); | ||
| 498 | } | ||
| 499 | } | 401 | } |
| 402 | acm_process_read_urb(acm, urb); | ||
| 403 | |||
| 404 | /* throttle device if requested by tty */ | ||
| 500 | spin_lock_irqsave(&acm->read_lock, flags); | 405 | spin_lock_irqsave(&acm->read_lock, flags); |
| 501 | acm->processing = 0; | 406 | acm->throttled = acm->throttle_req; |
| 502 | spin_unlock_irqrestore(&acm->read_lock, flags); | 407 | if (!acm->throttled && !acm->susp_count) { |
| 408 | spin_unlock_irqrestore(&acm->read_lock, flags); | ||
| 409 | acm_submit_read_urb(acm, rb->index, GFP_ATOMIC); | ||
| 410 | } else { | ||
| 411 | spin_unlock_irqrestore(&acm->read_lock, flags); | ||
| 412 | } | ||
| 503 | } | 413 | } |
| 504 | 414 | ||
| 505 | /* data interface wrote those outgoing bytes */ | 415 | /* data interface wrote those outgoing bytes */ |
| @@ -509,9 +419,9 @@ static void acm_write_bulk(struct urb *urb) | |||
| 509 | struct acm *acm = wb->instance; | 419 | struct acm *acm = wb->instance; |
| 510 | unsigned long flags; | 420 | unsigned long flags; |
| 511 | 421 | ||
| 512 | if (verbose || urb->status | 422 | if (urb->status || (urb->actual_length != urb->transfer_buffer_length)) |
| 513 | || (urb->actual_length != urb->transfer_buffer_length)) | 423 | dev_vdbg(&acm->data->dev, "%s - len %d/%d, status %d\n", |
| 514 | dev_dbg(&acm->data->dev, "tx %d/%d bytes -- > %d\n", | 424 | __func__, |
| 515 | urb->actual_length, | 425 | urb->actual_length, |
| 516 | urb->transfer_buffer_length, | 426 | urb->transfer_buffer_length, |
| 517 | urb->status); | 427 | urb->status); |
| @@ -521,8 +431,6 @@ static void acm_write_bulk(struct urb *urb) | |||
| 521 | spin_unlock_irqrestore(&acm->write_lock, flags); | 431 | spin_unlock_irqrestore(&acm->write_lock, flags); |
| 522 | if (ACM_READY(acm)) | 432 | if (ACM_READY(acm)) |
| 523 | schedule_work(&acm->work); | 433 | schedule_work(&acm->work); |
| 524 | else | ||
| 525 | wake_up_interruptible(&acm->drain_wait); | ||
| 526 | } | 434 | } |
| 527 | 435 | ||
| 528 | static void acm_softint(struct work_struct *work) | 436 | static void acm_softint(struct work_struct *work) |
| @@ -530,7 +438,8 @@ static void acm_softint(struct work_struct *work) | |||
| 530 | struct acm *acm = container_of(work, struct acm, work); | 438 | struct acm *acm = container_of(work, struct acm, work); |
| 531 | struct tty_struct *tty; | 439 | struct tty_struct *tty; |
| 532 | 440 | ||
| 533 | dev_vdbg(&acm->data->dev, "tx work\n"); | 441 | dev_vdbg(&acm->data->dev, "%s\n", __func__); |
| 442 | |||
| 534 | if (!ACM_READY(acm)) | 443 | if (!ACM_READY(acm)) |
| 535 | return; | 444 | return; |
| 536 | tty = tty_port_tty_get(&acm->port); | 445 | tty = tty_port_tty_get(&acm->port); |
| @@ -548,8 +457,6 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) | |||
| 548 | { | 457 | { |
| 549 | struct acm *acm; | 458 | struct acm *acm; |
| 550 | int rv = -ENODEV; | 459 | int rv = -ENODEV; |
| 551 | int i; | ||
| 552 | dbg("Entering acm_tty_open."); | ||
| 553 | 460 | ||
| 554 | mutex_lock(&open_mutex); | 461 | mutex_lock(&open_mutex); |
| 555 | 462 | ||
| @@ -559,6 +466,8 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) | |||
| 559 | else | 466 | else |
| 560 | rv = 0; | 467 | rv = 0; |
| 561 | 468 | ||
| 469 | dev_dbg(&acm->control->dev, "%s\n", __func__); | ||
| 470 | |||
| 562 | set_bit(TTY_NO_WRITE_SPLIT, &tty->flags); | 471 | set_bit(TTY_NO_WRITE_SPLIT, &tty->flags); |
| 563 | 472 | ||
| 564 | tty->driver_data = acm; | 473 | tty->driver_data = acm; |
| @@ -578,38 +487,28 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) | |||
| 578 | 487 | ||
| 579 | acm->ctrlurb->dev = acm->dev; | 488 | acm->ctrlurb->dev = acm->dev; |
| 580 | if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) { | 489 | if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) { |
| 581 | dbg("usb_submit_urb(ctrl irq) failed"); | 490 | dev_err(&acm->control->dev, |
| 491 | "%s - usb_submit_urb(ctrl irq) failed\n", __func__); | ||
| 582 | goto bail_out; | 492 | goto bail_out; |
| 583 | } | 493 | } |
| 584 | 494 | ||
| 585 | if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS) && | 495 | if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS) && |
| 586 | (acm->ctrl_caps & USB_CDC_CAP_LINE)) | 496 | (acm->ctrl_caps & USB_CDC_CAP_LINE)) |
| 587 | goto full_bailout; | 497 | goto bail_out; |
| 588 | 498 | ||
| 589 | usb_autopm_put_interface(acm->control); | 499 | usb_autopm_put_interface(acm->control); |
| 590 | 500 | ||
| 591 | INIT_LIST_HEAD(&acm->spare_read_urbs); | 501 | if (acm_submit_read_urbs(acm, GFP_KERNEL)) |
| 592 | INIT_LIST_HEAD(&acm->spare_read_bufs); | 502 | goto bail_out; |
| 593 | INIT_LIST_HEAD(&acm->filled_read_bufs); | ||
| 594 | |||
| 595 | for (i = 0; i < acm->rx_buflimit; i++) | ||
| 596 | list_add(&(acm->ru[i].list), &acm->spare_read_urbs); | ||
| 597 | for (i = 0; i < acm->rx_buflimit; i++) | ||
| 598 | list_add(&(acm->rb[i].list), &acm->spare_read_bufs); | ||
| 599 | |||
| 600 | acm->throttle = 0; | ||
| 601 | 503 | ||
| 602 | set_bit(ASYNCB_INITIALIZED, &acm->port.flags); | 504 | set_bit(ASYNCB_INITIALIZED, &acm->port.flags); |
| 603 | rv = tty_port_block_til_ready(&acm->port, tty, filp); | 505 | rv = tty_port_block_til_ready(&acm->port, tty, filp); |
| 604 | tasklet_schedule(&acm->urb_task); | ||
| 605 | 506 | ||
| 606 | mutex_unlock(&acm->mutex); | 507 | mutex_unlock(&acm->mutex); |
| 607 | out: | 508 | out: |
| 608 | mutex_unlock(&open_mutex); | 509 | mutex_unlock(&open_mutex); |
| 609 | return rv; | 510 | return rv; |
| 610 | 511 | ||
| 611 | full_bailout: | ||
| 612 | usb_kill_urb(acm->ctrlurb); | ||
| 613 | bail_out: | 512 | bail_out: |
| 614 | acm->port.count--; | 513 | acm->port.count--; |
| 615 | mutex_unlock(&acm->mutex); | 514 | mutex_unlock(&acm->mutex); |
| @@ -622,26 +521,24 @@ early_bail: | |||
| 622 | 521 | ||
| 623 | static void acm_tty_unregister(struct acm *acm) | 522 | static void acm_tty_unregister(struct acm *acm) |
| 624 | { | 523 | { |
| 625 | int i, nr; | 524 | int i; |
| 626 | 525 | ||
| 627 | nr = acm->rx_buflimit; | ||
| 628 | tty_unregister_device(acm_tty_driver, acm->minor); | 526 | tty_unregister_device(acm_tty_driver, acm->minor); |
| 629 | usb_put_intf(acm->control); | 527 | usb_put_intf(acm->control); |
| 630 | acm_table[acm->minor] = NULL; | 528 | acm_table[acm->minor] = NULL; |
| 631 | usb_free_urb(acm->ctrlurb); | 529 | usb_free_urb(acm->ctrlurb); |
| 632 | for (i = 0; i < ACM_NW; i++) | 530 | for (i = 0; i < ACM_NW; i++) |
| 633 | usb_free_urb(acm->wb[i].urb); | 531 | usb_free_urb(acm->wb[i].urb); |
| 634 | for (i = 0; i < nr; i++) | 532 | for (i = 0; i < acm->rx_buflimit; i++) |
| 635 | usb_free_urb(acm->ru[i].urb); | 533 | usb_free_urb(acm->read_urbs[i]); |
| 636 | kfree(acm->country_codes); | 534 | kfree(acm->country_codes); |
| 637 | kfree(acm); | 535 | kfree(acm); |
| 638 | } | 536 | } |
| 639 | 537 | ||
| 640 | static int acm_tty_chars_in_buffer(struct tty_struct *tty); | ||
| 641 | |||
| 642 | static void acm_port_down(struct acm *acm) | 538 | static void acm_port_down(struct acm *acm) |
| 643 | { | 539 | { |
| 644 | int i, nr = acm->rx_buflimit; | 540 | int i; |
| 541 | |||
| 645 | mutex_lock(&open_mutex); | 542 | mutex_lock(&open_mutex); |
| 646 | if (acm->dev) { | 543 | if (acm->dev) { |
| 647 | usb_autopm_get_interface(acm->control); | 544 | usb_autopm_get_interface(acm->control); |
| @@ -649,10 +546,8 @@ static void acm_port_down(struct acm *acm) | |||
| 649 | usb_kill_urb(acm->ctrlurb); | 546 | usb_kill_urb(acm->ctrlurb); |
| 650 | for (i = 0; i < ACM_NW; i++) | 547 | for (i = 0; i < ACM_NW; i++) |
| 651 | usb_kill_urb(acm->wb[i].urb); | 548 | usb_kill_urb(acm->wb[i].urb); |
| 652 | tasklet_disable(&acm->urb_task); | 549 | for (i = 0; i < acm->rx_buflimit; i++) |
| 653 | for (i = 0; i < nr; i++) | 550 | usb_kill_urb(acm->read_urbs[i]); |
| 654 | usb_kill_urb(acm->ru[i].urb); | ||
| 655 | tasklet_enable(&acm->urb_task); | ||
| 656 | acm->control->needs_remote_wakeup = 0; | 551 | acm->control->needs_remote_wakeup = 0; |
| 657 | usb_autopm_put_interface(acm->control); | 552 | usb_autopm_put_interface(acm->control); |
| 658 | } | 553 | } |
| @@ -698,13 +593,13 @@ static int acm_tty_write(struct tty_struct *tty, | |||
| 698 | int wbn; | 593 | int wbn; |
| 699 | struct acm_wb *wb; | 594 | struct acm_wb *wb; |
| 700 | 595 | ||
| 701 | dbg("Entering acm_tty_write to write %d bytes,", count); | ||
| 702 | |||
| 703 | if (!ACM_READY(acm)) | 596 | if (!ACM_READY(acm)) |
| 704 | return -EINVAL; | 597 | return -EINVAL; |
| 705 | if (!count) | 598 | if (!count) |
| 706 | return 0; | 599 | return 0; |
| 707 | 600 | ||
| 601 | dev_vdbg(&acm->data->dev, "%s - count %d\n", __func__, count); | ||
| 602 | |||
| 708 | spin_lock_irqsave(&acm->write_lock, flags); | 603 | spin_lock_irqsave(&acm->write_lock, flags); |
| 709 | wbn = acm_wb_alloc(acm); | 604 | wbn = acm_wb_alloc(acm); |
| 710 | if (wbn < 0) { | 605 | if (wbn < 0) { |
| @@ -714,7 +609,7 @@ static int acm_tty_write(struct tty_struct *tty, | |||
| 714 | wb = &acm->wb[wbn]; | 609 | wb = &acm->wb[wbn]; |
| 715 | 610 | ||
| 716 | count = (count > acm->writesize) ? acm->writesize : count; | 611 | count = (count > acm->writesize) ? acm->writesize : count; |
| 717 | dbg("Get %d bytes...", count); | 612 | dev_vdbg(&acm->data->dev, "%s - write %d\n", __func__, count); |
| 718 | memcpy(wb->buf, buf, count); | 613 | memcpy(wb->buf, buf, count); |
| 719 | wb->len = count; | 614 | wb->len = count; |
| 720 | spin_unlock_irqrestore(&acm->write_lock, flags); | 615 | spin_unlock_irqrestore(&acm->write_lock, flags); |
| @@ -751,22 +646,31 @@ static int acm_tty_chars_in_buffer(struct tty_struct *tty) | |||
| 751 | static void acm_tty_throttle(struct tty_struct *tty) | 646 | static void acm_tty_throttle(struct tty_struct *tty) |
| 752 | { | 647 | { |
| 753 | struct acm *acm = tty->driver_data; | 648 | struct acm *acm = tty->driver_data; |
| 649 | |||
| 754 | if (!ACM_READY(acm)) | 650 | if (!ACM_READY(acm)) |
| 755 | return; | 651 | return; |
| 756 | spin_lock_bh(&acm->throttle_lock); | 652 | |
| 757 | acm->throttle = 1; | 653 | spin_lock_irq(&acm->read_lock); |
| 758 | spin_unlock_bh(&acm->throttle_lock); | 654 | acm->throttle_req = 1; |
| 655 | spin_unlock_irq(&acm->read_lock); | ||
| 759 | } | 656 | } |
| 760 | 657 | ||
| 761 | static void acm_tty_unthrottle(struct tty_struct *tty) | 658 | static void acm_tty_unthrottle(struct tty_struct *tty) |
| 762 | { | 659 | { |
| 763 | struct acm *acm = tty->driver_data; | 660 | struct acm *acm = tty->driver_data; |
| 661 | unsigned int was_throttled; | ||
| 662 | |||
| 764 | if (!ACM_READY(acm)) | 663 | if (!ACM_READY(acm)) |
| 765 | return; | 664 | return; |
| 766 | spin_lock_bh(&acm->throttle_lock); | 665 | |
| 767 | acm->throttle = 0; | 666 | spin_lock_irq(&acm->read_lock); |
| 768 | spin_unlock_bh(&acm->throttle_lock); | 667 | was_throttled = acm->throttled; |
| 769 | tasklet_schedule(&acm->urb_task); | 668 | acm->throttled = 0; |
| 669 | acm->throttle_req = 0; | ||
| 670 | spin_unlock_irq(&acm->read_lock); | ||
| 671 | |||
| 672 | if (was_throttled) | ||
| 673 | acm_submit_read_urbs(acm, GFP_KERNEL); | ||
| 770 | } | 674 | } |
| 771 | 675 | ||
| 772 | static int acm_tty_break_ctl(struct tty_struct *tty, int state) | 676 | static int acm_tty_break_ctl(struct tty_struct *tty, int state) |
| @@ -777,7 +681,8 @@ static int acm_tty_break_ctl(struct tty_struct *tty, int state) | |||
| 777 | return -EINVAL; | 681 | return -EINVAL; |
| 778 | retval = acm_send_break(acm, state ? 0xffff : 0); | 682 | retval = acm_send_break(acm, state ? 0xffff : 0); |
| 779 | if (retval < 0) | 683 | if (retval < 0) |
| 780 | dbg("send break failed"); | 684 | dev_dbg(&acm->control->dev, "%s - send break failed\n", |
| 685 | __func__); | ||
| 781 | return retval; | 686 | return retval; |
| 782 | } | 687 | } |
| 783 | 688 | ||
| @@ -872,7 +777,9 @@ static void acm_tty_set_termios(struct tty_struct *tty, | |||
| 872 | 777 | ||
| 873 | if (memcmp(&acm->line, &newline, sizeof newline)) { | 778 | if (memcmp(&acm->line, &newline, sizeof newline)) { |
| 874 | memcpy(&acm->line, &newline, sizeof newline); | 779 | memcpy(&acm->line, &newline, sizeof newline); |
| 875 | dbg("set line: %d %d %d %d", le32_to_cpu(newline.dwDTERate), | 780 | dev_dbg(&acm->control->dev, "%s - set line: %d %d %d %d\n", |
| 781 | __func__, | ||
| 782 | le32_to_cpu(newline.dwDTERate), | ||
| 876 | newline.bCharFormat, newline.bParityType, | 783 | newline.bCharFormat, newline.bParityType, |
| 877 | newline.bDataBits); | 784 | newline.bDataBits); |
| 878 | acm_set_line(acm, &acm->line); | 785 | acm_set_line(acm, &acm->line); |
| @@ -897,11 +804,11 @@ static void acm_write_buffers_free(struct acm *acm) | |||
| 897 | static void acm_read_buffers_free(struct acm *acm) | 804 | static void acm_read_buffers_free(struct acm *acm) |
| 898 | { | 805 | { |
| 899 | struct usb_device *usb_dev = interface_to_usbdev(acm->control); | 806 | struct usb_device *usb_dev = interface_to_usbdev(acm->control); |
| 900 | int i, n = acm->rx_buflimit; | 807 | int i; |
| 901 | 808 | ||
| 902 | for (i = 0; i < n; i++) | 809 | for (i = 0; i < acm->rx_buflimit; i++) |
| 903 | usb_free_coherent(usb_dev, acm->readsize, | 810 | usb_free_coherent(usb_dev, acm->readsize, |
| 904 | acm->rb[i].base, acm->rb[i].dma); | 811 | acm->read_buffers[i].base, acm->read_buffers[i].dma); |
| 905 | } | 812 | } |
| 906 | 813 | ||
| 907 | /* Little helper: write buffers allocate */ | 814 | /* Little helper: write buffers allocate */ |
| @@ -946,7 +853,7 @@ static int acm_probe(struct usb_interface *intf, | |||
| 946 | u8 ac_management_function = 0; | 853 | u8 ac_management_function = 0; |
| 947 | u8 call_management_function = 0; | 854 | u8 call_management_function = 0; |
| 948 | int call_interface_num = -1; | 855 | int call_interface_num = -1; |
| 949 | int data_interface_num; | 856 | int data_interface_num = -1; |
| 950 | unsigned long quirks; | 857 | unsigned long quirks; |
| 951 | int num_rx_buf; | 858 | int num_rx_buf; |
| 952 | int i; | 859 | int i; |
| @@ -1030,7 +937,11 @@ next_desc: | |||
| 1030 | if (!union_header) { | 937 | if (!union_header) { |
| 1031 | if (call_interface_num > 0) { | 938 | if (call_interface_num > 0) { |
| 1032 | dev_dbg(&intf->dev, "No union descriptor, using call management descriptor\n"); | 939 | dev_dbg(&intf->dev, "No union descriptor, using call management descriptor\n"); |
| 1033 | data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num)); | 940 | /* quirks for Droids MuIn LCD */ |
| 941 | if (quirks & NO_DATA_INTERFACE) | ||
| 942 | data_interface = usb_ifnum_to_if(usb_dev, 0); | ||
| 943 | else | ||
| 944 | data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num)); | ||
| 1034 | control_interface = intf; | 945 | control_interface = intf; |
| 1035 | } else { | 946 | } else { |
| 1036 | if (intf->cur_altsetting->desc.bNumEndpoints != 3) { | 947 | if (intf->cur_altsetting->desc.bNumEndpoints != 3) { |
| @@ -1133,7 +1044,7 @@ skip_normal_probe: | |||
| 1133 | epwrite = t; | 1044 | epwrite = t; |
| 1134 | } | 1045 | } |
| 1135 | made_compressed_probe: | 1046 | made_compressed_probe: |
| 1136 | dbg("interfaces are valid"); | 1047 | dev_dbg(&intf->dev, "interfaces are valid\n"); |
| 1137 | for (minor = 0; minor < ACM_TTY_MINORS && acm_table[minor]; minor++); | 1048 | for (minor = 0; minor < ACM_TTY_MINORS && acm_table[minor]; minor++); |
| 1138 | 1049 | ||
| 1139 | if (minor == ACM_TTY_MINORS) { | 1050 | if (minor == ACM_TTY_MINORS) { |
| @@ -1143,7 +1054,7 @@ made_compressed_probe: | |||
| 1143 | 1054 | ||
| 1144 | acm = kzalloc(sizeof(struct acm), GFP_KERNEL); | 1055 | acm = kzalloc(sizeof(struct acm), GFP_KERNEL); |
| 1145 | if (acm == NULL) { | 1056 | if (acm == NULL) { |
| 1146 | dev_dbg(&intf->dev, "out of memory (acm kzalloc)\n"); | 1057 | dev_err(&intf->dev, "out of memory (acm kzalloc)\n"); |
| 1147 | goto alloc_fail; | 1058 | goto alloc_fail; |
| 1148 | } | 1059 | } |
| 1149 | 1060 | ||
| @@ -1162,11 +1073,7 @@ made_compressed_probe: | |||
| 1162 | acm->ctrlsize = ctrlsize; | 1073 | acm->ctrlsize = ctrlsize; |
| 1163 | acm->readsize = readsize; | 1074 | acm->readsize = readsize; |
| 1164 | acm->rx_buflimit = num_rx_buf; | 1075 | acm->rx_buflimit = num_rx_buf; |
| 1165 | acm->urb_task.func = acm_rx_tasklet; | ||
| 1166 | acm->urb_task.data = (unsigned long) acm; | ||
| 1167 | INIT_WORK(&acm->work, acm_softint); | 1076 | INIT_WORK(&acm->work, acm_softint); |
| 1168 | init_waitqueue_head(&acm->drain_wait); | ||
| 1169 | spin_lock_init(&acm->throttle_lock); | ||
| 1170 | spin_lock_init(&acm->write_lock); | 1077 | spin_lock_init(&acm->write_lock); |
| 1171 | spin_lock_init(&acm->read_lock); | 1078 | spin_lock_init(&acm->read_lock); |
| 1172 | mutex_init(&acm->mutex); | 1079 | mutex_init(&acm->mutex); |
| @@ -1179,53 +1086,69 @@ made_compressed_probe: | |||
| 1179 | 1086 | ||
| 1180 | buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); | 1087 | buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); |
| 1181 | if (!buf) { | 1088 | if (!buf) { |
| 1182 | dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n"); | 1089 | dev_err(&intf->dev, "out of memory (ctrl buffer alloc)\n"); |
| 1183 | goto alloc_fail2; | 1090 | goto alloc_fail2; |
| 1184 | } | 1091 | } |
| 1185 | acm->ctrl_buffer = buf; | 1092 | acm->ctrl_buffer = buf; |
| 1186 | 1093 | ||
| 1187 | if (acm_write_buffers_alloc(acm) < 0) { | 1094 | if (acm_write_buffers_alloc(acm) < 0) { |
| 1188 | dev_dbg(&intf->dev, "out of memory (write buffer alloc)\n"); | 1095 | dev_err(&intf->dev, "out of memory (write buffer alloc)\n"); |
| 1189 | goto alloc_fail4; | 1096 | goto alloc_fail4; |
| 1190 | } | 1097 | } |
| 1191 | 1098 | ||
| 1192 | acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); | 1099 | acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); |
| 1193 | if (!acm->ctrlurb) { | 1100 | if (!acm->ctrlurb) { |
| 1194 | dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n"); | 1101 | dev_err(&intf->dev, "out of memory (ctrlurb kmalloc)\n"); |
| 1195 | goto alloc_fail5; | 1102 | goto alloc_fail5; |
| 1196 | } | 1103 | } |
| 1197 | for (i = 0; i < num_rx_buf; i++) { | 1104 | for (i = 0; i < num_rx_buf; i++) { |
| 1198 | struct acm_ru *rcv = &(acm->ru[i]); | 1105 | struct acm_rb *rb = &(acm->read_buffers[i]); |
| 1106 | struct urb *urb; | ||
| 1199 | 1107 | ||
| 1200 | rcv->urb = usb_alloc_urb(0, GFP_KERNEL); | 1108 | rb->base = usb_alloc_coherent(acm->dev, readsize, GFP_KERNEL, |
| 1201 | if (rcv->urb == NULL) { | 1109 | &rb->dma); |
| 1202 | dev_dbg(&intf->dev, | 1110 | if (!rb->base) { |
| 1203 | "out of memory (read urbs usb_alloc_urb)\n"); | 1111 | dev_err(&intf->dev, "out of memory " |
| 1112 | "(read bufs usb_alloc_coherent)\n"); | ||
| 1204 | goto alloc_fail6; | 1113 | goto alloc_fail6; |
| 1205 | } | 1114 | } |
| 1115 | rb->index = i; | ||
| 1116 | rb->instance = acm; | ||
| 1206 | 1117 | ||
| 1207 | rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | 1118 | urb = usb_alloc_urb(0, GFP_KERNEL); |
| 1208 | rcv->instance = acm; | 1119 | if (!urb) { |
| 1209 | } | 1120 | dev_err(&intf->dev, |
| 1210 | for (i = 0; i < num_rx_buf; i++) { | 1121 | "out of memory (read urbs usb_alloc_urb)\n"); |
| 1211 | struct acm_rb *rb = &(acm->rb[i]); | 1122 | goto alloc_fail6; |
| 1212 | 1123 | } | |
| 1213 | rb->base = usb_alloc_coherent(acm->dev, readsize, | 1124 | urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
| 1214 | GFP_KERNEL, &rb->dma); | 1125 | urb->transfer_dma = rb->dma; |
| 1215 | if (!rb->base) { | 1126 | if (acm->is_int_ep) { |
| 1216 | dev_dbg(&intf->dev, | 1127 | usb_fill_int_urb(urb, acm->dev, |
| 1217 | "out of memory (read bufs usb_alloc_coherent)\n"); | 1128 | acm->rx_endpoint, |
| 1218 | goto alloc_fail7; | 1129 | rb->base, |
| 1130 | acm->readsize, | ||
| 1131 | acm_read_bulk_callback, rb, | ||
| 1132 | acm->bInterval); | ||
| 1133 | } else { | ||
| 1134 | usb_fill_bulk_urb(urb, acm->dev, | ||
| 1135 | acm->rx_endpoint, | ||
| 1136 | rb->base, | ||
| 1137 | acm->readsize, | ||
| 1138 | acm_read_bulk_callback, rb); | ||
| 1219 | } | 1139 | } |
| 1140 | |||
| 1141 | acm->read_urbs[i] = urb; | ||
| 1142 | __set_bit(i, &acm->read_urbs_free); | ||
| 1220 | } | 1143 | } |
| 1221 | for (i = 0; i < ACM_NW; i++) { | 1144 | for (i = 0; i < ACM_NW; i++) { |
| 1222 | struct acm_wb *snd = &(acm->wb[i]); | 1145 | struct acm_wb *snd = &(acm->wb[i]); |
| 1223 | 1146 | ||
| 1224 | snd->urb = usb_alloc_urb(0, GFP_KERNEL); | 1147 | snd->urb = usb_alloc_urb(0, GFP_KERNEL); |
| 1225 | if (snd->urb == NULL) { | 1148 | if (snd->urb == NULL) { |
| 1226 | dev_dbg(&intf->dev, | 1149 | dev_err(&intf->dev, |
| 1227 | "out of memory (write urbs usb_alloc_urb)"); | 1150 | "out of memory (write urbs usb_alloc_urb)\n"); |
| 1228 | goto alloc_fail8; | 1151 | goto alloc_fail7; |
| 1229 | } | 1152 | } |
| 1230 | 1153 | ||
| 1231 | if (usb_endpoint_xfer_int(epwrite)) | 1154 | if (usb_endpoint_xfer_int(epwrite)) |
| @@ -1244,7 +1167,7 @@ made_compressed_probe: | |||
| 1244 | 1167 | ||
| 1245 | i = device_create_file(&intf->dev, &dev_attr_bmCapabilities); | 1168 | i = device_create_file(&intf->dev, &dev_attr_bmCapabilities); |
| 1246 | if (i < 0) | 1169 | if (i < 0) |
| 1247 | goto alloc_fail8; | 1170 | goto alloc_fail7; |
| 1248 | 1171 | ||
| 1249 | if (cfd) { /* export the country data */ | 1172 | if (cfd) { /* export the country data */ |
| 1250 | acm->country_codes = kmalloc(cfd->bLength - 4, GFP_KERNEL); | 1173 | acm->country_codes = kmalloc(cfd->bLength - 4, GFP_KERNEL); |
| @@ -1296,14 +1219,13 @@ skip_countries: | |||
| 1296 | acm_table[minor] = acm; | 1219 | acm_table[minor] = acm; |
| 1297 | 1220 | ||
| 1298 | return 0; | 1221 | return 0; |
| 1299 | alloc_fail8: | 1222 | alloc_fail7: |
| 1300 | for (i = 0; i < ACM_NW; i++) | 1223 | for (i = 0; i < ACM_NW; i++) |
| 1301 | usb_free_urb(acm->wb[i].urb); | 1224 | usb_free_urb(acm->wb[i].urb); |
| 1302 | alloc_fail7: | ||
| 1303 | acm_read_buffers_free(acm); | ||
| 1304 | alloc_fail6: | 1225 | alloc_fail6: |
| 1305 | for (i = 0; i < num_rx_buf; i++) | 1226 | for (i = 0; i < num_rx_buf; i++) |
| 1306 | usb_free_urb(acm->ru[i].urb); | 1227 | usb_free_urb(acm->read_urbs[i]); |
| 1228 | acm_read_buffers_free(acm); | ||
| 1307 | usb_free_urb(acm->ctrlurb); | 1229 | usb_free_urb(acm->ctrlurb); |
| 1308 | alloc_fail5: | 1230 | alloc_fail5: |
| 1309 | acm_write_buffers_free(acm); | 1231 | acm_write_buffers_free(acm); |
| @@ -1318,17 +1240,14 @@ alloc_fail: | |||
| 1318 | static void stop_data_traffic(struct acm *acm) | 1240 | static void stop_data_traffic(struct acm *acm) |
| 1319 | { | 1241 | { |
| 1320 | int i; | 1242 | int i; |
| 1321 | dbg("Entering stop_data_traffic"); | ||
| 1322 | 1243 | ||
| 1323 | tasklet_disable(&acm->urb_task); | 1244 | dev_dbg(&acm->control->dev, "%s\n", __func__); |
| 1324 | 1245 | ||
| 1325 | usb_kill_urb(acm->ctrlurb); | 1246 | usb_kill_urb(acm->ctrlurb); |
| 1326 | for (i = 0; i < ACM_NW; i++) | 1247 | for (i = 0; i < ACM_NW; i++) |
| 1327 | usb_kill_urb(acm->wb[i].urb); | 1248 | usb_kill_urb(acm->wb[i].urb); |
| 1328 | for (i = 0; i < acm->rx_buflimit; i++) | 1249 | for (i = 0; i < acm->rx_buflimit; i++) |
| 1329 | usb_kill_urb(acm->ru[i].urb); | 1250 | usb_kill_urb(acm->read_urbs[i]); |
| 1330 | |||
| 1331 | tasklet_enable(&acm->urb_task); | ||
| 1332 | 1251 | ||
| 1333 | cancel_work_sync(&acm->work); | 1252 | cancel_work_sync(&acm->work); |
| 1334 | } | 1253 | } |
| @@ -1389,11 +1308,9 @@ static int acm_suspend(struct usb_interface *intf, pm_message_t message) | |||
| 1389 | if (message.event & PM_EVENT_AUTO) { | 1308 | if (message.event & PM_EVENT_AUTO) { |
| 1390 | int b; | 1309 | int b; |
| 1391 | 1310 | ||
| 1392 | spin_lock_irq(&acm->read_lock); | 1311 | spin_lock_irq(&acm->write_lock); |
| 1393 | spin_lock(&acm->write_lock); | 1312 | b = acm->transmitting; |
| 1394 | b = acm->processing + acm->transmitting; | 1313 | spin_unlock_irq(&acm->write_lock); |
| 1395 | spin_unlock(&acm->write_lock); | ||
| 1396 | spin_unlock_irq(&acm->read_lock); | ||
| 1397 | if (b) | 1314 | if (b) |
| 1398 | return -EBUSY; | 1315 | return -EBUSY; |
| 1399 | } | 1316 | } |
| @@ -1455,7 +1372,7 @@ static int acm_resume(struct usb_interface *intf) | |||
| 1455 | if (rv < 0) | 1372 | if (rv < 0) |
| 1456 | goto err_out; | 1373 | goto err_out; |
| 1457 | 1374 | ||
| 1458 | tasklet_schedule(&acm->urb_task); | 1375 | rv = acm_submit_read_urbs(acm, GFP_NOIO); |
| 1459 | } | 1376 | } |
| 1460 | 1377 | ||
| 1461 | err_out: | 1378 | err_out: |
| @@ -1622,6 +1539,11 @@ static const struct usb_device_id acm_ids[] = { | |||
| 1622 | .driver_info = NOT_A_MODEM, | 1539 | .driver_info = NOT_A_MODEM, |
| 1623 | }, | 1540 | }, |
| 1624 | 1541 | ||
| 1542 | /* Support for Droids MuIn LCD */ | ||
| 1543 | { USB_DEVICE(0x04d8, 0x000b), | ||
| 1544 | .driver_info = NO_DATA_INTERFACE, | ||
| 1545 | }, | ||
| 1546 | |||
| 1625 | /* control interfaces without any protocol set */ | 1547 | /* control interfaces without any protocol set */ |
| 1626 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, | 1548 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, |
| 1627 | USB_CDC_PROTO_NONE) }, | 1549 | USB_CDC_PROTO_NONE) }, |
| @@ -1716,8 +1638,7 @@ static int __init acm_init(void) | |||
| 1716 | return retval; | 1638 | return retval; |
| 1717 | } | 1639 | } |
| 1718 | 1640 | ||
| 1719 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" | 1641 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n"); |
| 1720 | DRIVER_DESC "\n"); | ||
| 1721 | 1642 | ||
| 1722 | return 0; | 1643 | return 0; |
| 1723 | } | 1644 | } |
diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h index b4ea54dbf32..ca7937f26e2 100644 --- a/drivers/usb/class/cdc-acm.h +++ b/drivers/usb/class/cdc-acm.h | |||
| @@ -72,16 +72,10 @@ struct acm_wb { | |||
| 72 | }; | 72 | }; |
| 73 | 73 | ||
| 74 | struct acm_rb { | 74 | struct acm_rb { |
| 75 | struct list_head list; | ||
| 76 | int size; | 75 | int size; |
| 77 | unsigned char *base; | 76 | unsigned char *base; |
| 78 | dma_addr_t dma; | 77 | dma_addr_t dma; |
| 79 | }; | 78 | int index; |
| 80 | |||
| 81 | struct acm_ru { | ||
| 82 | struct list_head list; | ||
| 83 | struct acm_rb *buffer; | ||
| 84 | struct urb *urb; | ||
| 85 | struct acm *instance; | 79 | struct acm *instance; |
| 86 | }; | 80 | }; |
| 87 | 81 | ||
| @@ -97,35 +91,30 @@ struct acm { | |||
| 97 | unsigned int country_code_size; /* size of this buffer */ | 91 | unsigned int country_code_size; /* size of this buffer */ |
| 98 | unsigned int country_rel_date; /* release date of version */ | 92 | unsigned int country_rel_date; /* release date of version */ |
| 99 | struct acm_wb wb[ACM_NW]; | 93 | struct acm_wb wb[ACM_NW]; |
| 100 | struct acm_ru ru[ACM_NR]; | 94 | unsigned long read_urbs_free; |
| 101 | struct acm_rb rb[ACM_NR]; | 95 | struct urb *read_urbs[ACM_NR]; |
| 96 | struct acm_rb read_buffers[ACM_NR]; | ||
| 102 | int rx_buflimit; | 97 | int rx_buflimit; |
| 103 | int rx_endpoint; | 98 | int rx_endpoint; |
| 104 | spinlock_t read_lock; | 99 | spinlock_t read_lock; |
| 105 | struct list_head spare_read_urbs; | ||
| 106 | struct list_head spare_read_bufs; | ||
| 107 | struct list_head filled_read_bufs; | ||
| 108 | int write_used; /* number of non-empty write buffers */ | 100 | int write_used; /* number of non-empty write buffers */ |
| 109 | int processing; | ||
| 110 | int transmitting; | 101 | int transmitting; |
| 111 | spinlock_t write_lock; | 102 | spinlock_t write_lock; |
| 112 | struct mutex mutex; | 103 | struct mutex mutex; |
| 113 | struct usb_cdc_line_coding line; /* bits, stop, parity */ | 104 | struct usb_cdc_line_coding line; /* bits, stop, parity */ |
| 114 | struct work_struct work; /* work queue entry for line discipline waking up */ | 105 | struct work_struct work; /* work queue entry for line discipline waking up */ |
| 115 | wait_queue_head_t drain_wait; /* close processing */ | ||
| 116 | struct tasklet_struct urb_task; /* rx processing */ | ||
| 117 | spinlock_t throttle_lock; /* synchronize throtteling and read callback */ | ||
| 118 | unsigned int ctrlin; /* input control lines (DCD, DSR, RI, break, overruns) */ | 106 | unsigned int ctrlin; /* input control lines (DCD, DSR, RI, break, overruns) */ |
| 119 | unsigned int ctrlout; /* output control lines (DTR, RTS) */ | 107 | unsigned int ctrlout; /* output control lines (DTR, RTS) */ |
| 120 | unsigned int writesize; /* max packet size for the output bulk endpoint */ | 108 | unsigned int writesize; /* max packet size for the output bulk endpoint */ |
| 121 | unsigned int readsize,ctrlsize; /* buffer sizes for freeing */ | 109 | unsigned int readsize,ctrlsize; /* buffer sizes for freeing */ |
| 122 | unsigned int minor; /* acm minor number */ | 110 | unsigned int minor; /* acm minor number */ |
| 123 | unsigned char throttle; /* throttled by tty layer */ | ||
| 124 | unsigned char clocal; /* termios CLOCAL */ | 111 | unsigned char clocal; /* termios CLOCAL */ |
| 125 | unsigned int ctrl_caps; /* control capabilities from the class specific header */ | 112 | unsigned int ctrl_caps; /* control capabilities from the class specific header */ |
| 126 | unsigned int susp_count; /* number of suspended interfaces */ | 113 | unsigned int susp_count; /* number of suspended interfaces */ |
| 127 | unsigned int combined_interfaces:1; /* control and data collapsed */ | 114 | unsigned int combined_interfaces:1; /* control and data collapsed */ |
| 128 | unsigned int is_int_ep:1; /* interrupt endpoints contrary to spec used */ | 115 | unsigned int is_int_ep:1; /* interrupt endpoints contrary to spec used */ |
| 116 | unsigned int throttled:1; /* actually throttled */ | ||
| 117 | unsigned int throttle_req:1; /* throttle requested */ | ||
| 129 | u8 bInterval; | 118 | u8 bInterval; |
| 130 | struct acm_wb *delayed_wb; /* write queued for a device about to be woken */ | 119 | struct acm_wb *delayed_wb; /* write queued for a device about to be woken */ |
| 131 | }; | 120 | }; |
| @@ -137,3 +126,4 @@ struct acm { | |||
| 137 | #define SINGLE_RX_URB 2 | 126 | #define SINGLE_RX_URB 2 |
| 138 | #define NO_CAP_LINE 4 | 127 | #define NO_CAP_LINE 4 |
| 139 | #define NOT_A_MODEM 8 | 128 | #define NOT_A_MODEM 8 |
| 129 | #define NO_DATA_INTERFACE 16 | ||
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index a97c018dd41..2b9ff518b50 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c | |||
| @@ -542,6 +542,8 @@ static int wdm_open(struct inode *inode, struct file *file) | |||
| 542 | 542 | ||
| 543 | mutex_lock(&desc->lock); | 543 | mutex_lock(&desc->lock); |
| 544 | if (!desc->count++) { | 544 | if (!desc->count++) { |
| 545 | desc->werr = 0; | ||
| 546 | desc->rerr = 0; | ||
| 545 | rv = usb_submit_urb(desc->validity, GFP_KERNEL); | 547 | rv = usb_submit_urb(desc->validity, GFP_KERNEL); |
| 546 | if (rv < 0) { | 548 | if (rv < 0) { |
| 547 | desc->count--; | 549 | desc->count--; |
| @@ -853,6 +855,18 @@ static int wdm_pre_reset(struct usb_interface *intf) | |||
| 853 | struct wdm_device *desc = usb_get_intfdata(intf); | 855 | struct wdm_device *desc = usb_get_intfdata(intf); |
| 854 | 856 | ||
| 855 | mutex_lock(&desc->lock); | 857 | mutex_lock(&desc->lock); |
| 858 | kill_urbs(desc); | ||
| 859 | |||
| 860 | /* | ||
| 861 | * we notify everybody using poll of | ||
| 862 | * an exceptional situation | ||
| 863 | * must be done before recovery lest a spontaneous | ||
| 864 | * message from the device is lost | ||
| 865 | */ | ||
| 866 | spin_lock_irq(&desc->iuspin); | ||
| 867 | desc->rerr = -EINTR; | ||
| 868 | spin_unlock_irq(&desc->iuspin); | ||
| 869 | wake_up_all(&desc->wait); | ||
| 856 | return 0; | 870 | return 0; |
| 857 | } | 871 | } |
| 858 | 872 | ||
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c index 83126b03e7c..c962608b4b9 100644 --- a/drivers/usb/core/config.c +++ b/drivers/usb/core/config.c | |||
| @@ -129,7 +129,7 @@ static void usb_parse_ss_endpoint_companion(struct device *ddev, int cfgno, | |||
| 129 | max_tx = ep->desc.wMaxPacketSize * (desc->bMaxBurst + 1); | 129 | max_tx = ep->desc.wMaxPacketSize * (desc->bMaxBurst + 1); |
| 130 | else | 130 | else |
| 131 | max_tx = 999999; | 131 | max_tx = 999999; |
| 132 | if (desc->wBytesPerInterval > max_tx) { | 132 | if (le16_to_cpu(desc->wBytesPerInterval) > max_tx) { |
| 133 | dev_warn(ddev, "%s endpoint with wBytesPerInterval of %d in " | 133 | dev_warn(ddev, "%s endpoint with wBytesPerInterval of %d in " |
| 134 | "config %d interface %d altsetting %d ep %d: " | 134 | "config %d interface %d altsetting %d ep %d: " |
| 135 | "setting to %d\n", | 135 | "setting to %d\n", |
diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c index 96fdfb815f8..0149c0976e9 100644 --- a/drivers/usb/core/devices.c +++ b/drivers/usb/core/devices.c | |||
| @@ -64,49 +64,49 @@ | |||
| 64 | /* Define ALLOW_SERIAL_NUMBER if you want to see the serial number of devices */ | 64 | /* Define ALLOW_SERIAL_NUMBER if you want to see the serial number of devices */ |
| 65 | #define ALLOW_SERIAL_NUMBER | 65 | #define ALLOW_SERIAL_NUMBER |
| 66 | 66 | ||
| 67 | static const char *format_topo = | 67 | static const char format_topo[] = |
| 68 | /* T: Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=dddd MxCh=dd */ | 68 | /* T: Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=dddd MxCh=dd */ |
| 69 | "\nT: Bus=%2.2d Lev=%2.2d Prnt=%2.2d Port=%2.2d Cnt=%2.2d Dev#=%3d Spd=%-4s MxCh=%2d\n"; | 69 | "\nT: Bus=%2.2d Lev=%2.2d Prnt=%2.2d Port=%2.2d Cnt=%2.2d Dev#=%3d Spd=%-4s MxCh=%2d\n"; |
| 70 | 70 | ||
| 71 | static const char *format_string_manufacturer = | 71 | static const char format_string_manufacturer[] = |
| 72 | /* S: Manufacturer=xxxx */ | 72 | /* S: Manufacturer=xxxx */ |
| 73 | "S: Manufacturer=%.100s\n"; | 73 | "S: Manufacturer=%.100s\n"; |
| 74 | 74 | ||
| 75 | static const char *format_string_product = | 75 | static const char format_string_product[] = |
| 76 | /* S: Product=xxxx */ | 76 | /* S: Product=xxxx */ |
| 77 | "S: Product=%.100s\n"; | 77 | "S: Product=%.100s\n"; |
| 78 | 78 | ||
| 79 | #ifdef ALLOW_SERIAL_NUMBER | 79 | #ifdef ALLOW_SERIAL_NUMBER |
| 80 | static const char *format_string_serialnumber = | 80 | static const char format_string_serialnumber[] = |
| 81 | /* S: SerialNumber=xxxx */ | 81 | /* S: SerialNumber=xxxx */ |
| 82 | "S: SerialNumber=%.100s\n"; | 82 | "S: SerialNumber=%.100s\n"; |
| 83 | #endif | 83 | #endif |
| 84 | 84 | ||
| 85 | static const char *format_bandwidth = | 85 | static const char format_bandwidth[] = |
| 86 | /* B: Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd */ | 86 | /* B: Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd */ |
| 87 | "B: Alloc=%3d/%3d us (%2d%%), #Int=%3d, #Iso=%3d\n"; | 87 | "B: Alloc=%3d/%3d us (%2d%%), #Int=%3d, #Iso=%3d\n"; |
| 88 | 88 | ||
| 89 | static const char *format_device1 = | 89 | static const char format_device1[] = |
| 90 | /* D: Ver=xx.xx Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd */ | 90 | /* D: Ver=xx.xx Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd */ |
| 91 | "D: Ver=%2x.%02x Cls=%02x(%-5s) Sub=%02x Prot=%02x MxPS=%2d #Cfgs=%3d\n"; | 91 | "D: Ver=%2x.%02x Cls=%02x(%-5s) Sub=%02x Prot=%02x MxPS=%2d #Cfgs=%3d\n"; |
| 92 | 92 | ||
| 93 | static const char *format_device2 = | 93 | static const char format_device2[] = |
| 94 | /* P: Vendor=xxxx ProdID=xxxx Rev=xx.xx */ | 94 | /* P: Vendor=xxxx ProdID=xxxx Rev=xx.xx */ |
| 95 | "P: Vendor=%04x ProdID=%04x Rev=%2x.%02x\n"; | 95 | "P: Vendor=%04x ProdID=%04x Rev=%2x.%02x\n"; |
| 96 | 96 | ||
| 97 | static const char *format_config = | 97 | static const char format_config[] = |
| 98 | /* C: #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA */ | 98 | /* C: #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA */ |
| 99 | "C:%c #Ifs=%2d Cfg#=%2d Atr=%02x MxPwr=%3dmA\n"; | 99 | "C:%c #Ifs=%2d Cfg#=%2d Atr=%02x MxPwr=%3dmA\n"; |
| 100 | 100 | ||
| 101 | static const char *format_iad = | 101 | static const char format_iad[] = |
| 102 | /* A: FirstIf#=dd IfCount=dd Cls=xx(sssss) Sub=xx Prot=xx */ | 102 | /* A: FirstIf#=dd IfCount=dd Cls=xx(sssss) Sub=xx Prot=xx */ |
| 103 | "A: FirstIf#=%2d IfCount=%2d Cls=%02x(%-5s) Sub=%02x Prot=%02x\n"; | 103 | "A: FirstIf#=%2d IfCount=%2d Cls=%02x(%-5s) Sub=%02x Prot=%02x\n"; |
| 104 | 104 | ||
| 105 | static const char *format_iface = | 105 | static const char format_iface[] = |
| 106 | /* I: If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx Driver=xxxx*/ | 106 | /* I: If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx Driver=xxxx*/ |
| 107 | "I:%c If#=%2d Alt=%2d #EPs=%2d Cls=%02x(%-5s) Sub=%02x Prot=%02x Driver=%s\n"; | 107 | "I:%c If#=%2d Alt=%2d #EPs=%2d Cls=%02x(%-5s) Sub=%02x Prot=%02x Driver=%s\n"; |
| 108 | 108 | ||
| 109 | static const char *format_endpt = | 109 | static const char format_endpt[] = |
| 110 | /* E: Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=D?s */ | 110 | /* E: Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=D?s */ |
| 111 | "E: Ad=%02x(%c) Atr=%02x(%-4s) MxPS=%4d Ivl=%d%cs\n"; | 111 | "E: Ad=%02x(%c) Atr=%02x(%-4s) MxPS=%4d Ivl=%d%cs\n"; |
| 112 | 112 | ||
diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c index cf6a5423de0..99458c843d6 100644 --- a/drivers/usb/core/file.c +++ b/drivers/usb/core/file.c | |||
| @@ -236,13 +236,6 @@ EXPORT_SYMBOL_GPL(usb_register_dev); | |||
| 236 | void usb_deregister_dev(struct usb_interface *intf, | 236 | void usb_deregister_dev(struct usb_interface *intf, |
| 237 | struct usb_class_driver *class_driver) | 237 | struct usb_class_driver *class_driver) |
| 238 | { | 238 | { |
| 239 | int minor_base = class_driver->minor_base; | ||
| 240 | char name[20]; | ||
| 241 | |||
| 242 | #ifdef CONFIG_USB_DYNAMIC_MINORS | ||
| 243 | minor_base = 0; | ||
| 244 | #endif | ||
| 245 | |||
| 246 | if (intf->minor == -1) | 239 | if (intf->minor == -1) |
| 247 | return; | 240 | return; |
| 248 | 241 | ||
| @@ -252,7 +245,6 @@ void usb_deregister_dev(struct usb_interface *intf, | |||
| 252 | usb_minors[intf->minor] = NULL; | 245 | usb_minors[intf->minor] = NULL; |
| 253 | up_write(&minor_rwsem); | 246 | up_write(&minor_rwsem); |
| 254 | 247 | ||
| 255 | snprintf(name, sizeof(name), class_driver->name, intf->minor - minor_base); | ||
| 256 | device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor)); | 248 | device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor)); |
| 257 | intf->usb_dev = NULL; | 249 | intf->usb_dev = NULL; |
| 258 | intf->minor = -1; | 250 | intf->minor = -1; |
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 77a7faec8d7..ace9f8442e5 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
| @@ -986,7 +986,7 @@ static int register_root_hub(struct usb_hcd *hcd) | |||
| 986 | spin_unlock_irq (&hcd_root_hub_lock); | 986 | spin_unlock_irq (&hcd_root_hub_lock); |
| 987 | 987 | ||
| 988 | /* Did the HC die before the root hub was registered? */ | 988 | /* Did the HC die before the root hub was registered? */ |
| 989 | if (HCD_DEAD(hcd) || hcd->state == HC_STATE_HALT) | 989 | if (HCD_DEAD(hcd)) |
| 990 | usb_hc_died (hcd); /* This time clean up */ | 990 | usb_hc_died (hcd); /* This time clean up */ |
| 991 | } | 991 | } |
| 992 | 992 | ||
| @@ -2128,9 +2128,6 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd) | |||
| 2128 | set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags); | 2128 | set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags); |
| 2129 | if (hcd->shared_hcd) | 2129 | if (hcd->shared_hcd) |
| 2130 | set_bit(HCD_FLAG_SAW_IRQ, &hcd->shared_hcd->flags); | 2130 | set_bit(HCD_FLAG_SAW_IRQ, &hcd->shared_hcd->flags); |
| 2131 | |||
| 2132 | if (unlikely(hcd->state == HC_STATE_HALT)) | ||
| 2133 | usb_hc_died(hcd); | ||
| 2134 | rc = IRQ_HANDLED; | 2131 | rc = IRQ_HANDLED; |
| 2135 | } | 2132 | } |
| 2136 | 2133 | ||
| @@ -2407,6 +2404,7 @@ int usb_add_hcd(struct usb_hcd *hcd, | |||
| 2407 | rhdev->speed = USB_SPEED_SUPER; | 2404 | rhdev->speed = USB_SPEED_SUPER; |
| 2408 | break; | 2405 | break; |
| 2409 | default: | 2406 | default: |
| 2407 | retval = -EINVAL; | ||
| 2410 | goto err_set_rh_speed; | 2408 | goto err_set_rh_speed; |
| 2411 | } | 2409 | } |
| 2412 | 2410 | ||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 93720bdc9ef..79a58c3a2e2 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
| @@ -379,15 +379,6 @@ static int hub_port_status(struct usb_hub *hub, int port1, | |||
| 379 | *status = le16_to_cpu(hub->status->port.wPortStatus); | 379 | *status = le16_to_cpu(hub->status->port.wPortStatus); |
| 380 | *change = le16_to_cpu(hub->status->port.wPortChange); | 380 | *change = le16_to_cpu(hub->status->port.wPortChange); |
| 381 | 381 | ||
| 382 | if ((hub->hdev->parent != NULL) && | ||
| 383 | hub_is_superspeed(hub->hdev)) { | ||
| 384 | /* Translate the USB 3 port status */ | ||
| 385 | u16 tmp = *status & USB_SS_PORT_STAT_MASK; | ||
| 386 | if (*status & USB_SS_PORT_STAT_POWER) | ||
| 387 | tmp |= USB_PORT_STAT_POWER; | ||
| 388 | *status = tmp; | ||
| 389 | } | ||
| 390 | |||
| 391 | ret = 0; | 382 | ret = 0; |
| 392 | } | 383 | } |
| 393 | mutex_unlock(&hub->status_mutex); | 384 | mutex_unlock(&hub->status_mutex); |
| @@ -2160,11 +2151,76 @@ static int hub_port_reset(struct usb_hub *hub, int port1, | |||
| 2160 | return status; | 2151 | return status; |
| 2161 | } | 2152 | } |
| 2162 | 2153 | ||
| 2154 | /* Warm reset a USB3 protocol port */ | ||
| 2155 | static int hub_port_warm_reset(struct usb_hub *hub, int port) | ||
| 2156 | { | ||
| 2157 | int ret; | ||
| 2158 | u16 portstatus, portchange; | ||
| 2159 | |||
| 2160 | if (!hub_is_superspeed(hub->hdev)) { | ||
| 2161 | dev_err(hub->intfdev, "only USB3 hub support warm reset\n"); | ||
| 2162 | return -EINVAL; | ||
| 2163 | } | ||
| 2164 | |||
| 2165 | /* Warm reset the port */ | ||
| 2166 | ret = set_port_feature(hub->hdev, | ||
| 2167 | port, USB_PORT_FEAT_BH_PORT_RESET); | ||
| 2168 | if (ret) { | ||
| 2169 | dev_err(hub->intfdev, "cannot warm reset port %d\n", port); | ||
| 2170 | return ret; | ||
| 2171 | } | ||
| 2172 | |||
| 2173 | msleep(20); | ||
| 2174 | ret = hub_port_status(hub, port, &portstatus, &portchange); | ||
| 2175 | |||
| 2176 | if (portchange & USB_PORT_STAT_C_RESET) | ||
| 2177 | clear_port_feature(hub->hdev, port, USB_PORT_FEAT_C_RESET); | ||
| 2178 | |||
| 2179 | if (portchange & USB_PORT_STAT_C_BH_RESET) | ||
| 2180 | clear_port_feature(hub->hdev, port, | ||
| 2181 | USB_PORT_FEAT_C_BH_PORT_RESET); | ||
| 2182 | |||
| 2183 | if (portchange & USB_PORT_STAT_C_LINK_STATE) | ||
| 2184 | clear_port_feature(hub->hdev, port, | ||
| 2185 | USB_PORT_FEAT_C_PORT_LINK_STATE); | ||
| 2186 | |||
| 2187 | return ret; | ||
| 2188 | } | ||
| 2189 | |||
| 2190 | /* Check if a port is power on */ | ||
| 2191 | static int port_is_power_on(struct usb_hub *hub, unsigned portstatus) | ||
| 2192 | { | ||
| 2193 | int ret = 0; | ||
| 2194 | |||
| 2195 | if (hub_is_superspeed(hub->hdev)) { | ||
| 2196 | if (portstatus & USB_SS_PORT_STAT_POWER) | ||
| 2197 | ret = 1; | ||
| 2198 | } else { | ||
| 2199 | if (portstatus & USB_PORT_STAT_POWER) | ||
| 2200 | ret = 1; | ||
| 2201 | } | ||
| 2202 | |||
| 2203 | return ret; | ||
| 2204 | } | ||
| 2205 | |||
| 2163 | #ifdef CONFIG_PM | 2206 | #ifdef CONFIG_PM |
| 2164 | 2207 | ||
| 2165 | #define MASK_BITS (USB_PORT_STAT_POWER | USB_PORT_STAT_CONNECTION | \ | 2208 | /* Check if a port is suspended(USB2.0 port) or in U3 state(USB3.0 port) */ |
| 2166 | USB_PORT_STAT_SUSPEND) | 2209 | static int port_is_suspended(struct usb_hub *hub, unsigned portstatus) |
| 2167 | #define WANT_BITS (USB_PORT_STAT_POWER | USB_PORT_STAT_CONNECTION) | 2210 | { |
| 2211 | int ret = 0; | ||
| 2212 | |||
| 2213 | if (hub_is_superspeed(hub->hdev)) { | ||
| 2214 | if ((portstatus & USB_PORT_STAT_LINK_STATE) | ||
| 2215 | == USB_SS_PORT_LS_U3) | ||
| 2216 | ret = 1; | ||
| 2217 | } else { | ||
| 2218 | if (portstatus & USB_PORT_STAT_SUSPEND) | ||
| 2219 | ret = 1; | ||
| 2220 | } | ||
| 2221 | |||
| 2222 | return ret; | ||
| 2223 | } | ||
| 2168 | 2224 | ||
| 2169 | /* Determine whether the device on a port is ready for a normal resume, | 2225 | /* Determine whether the device on a port is ready for a normal resume, |
| 2170 | * is ready for a reset-resume, or should be disconnected. | 2226 | * is ready for a reset-resume, or should be disconnected. |
| @@ -2174,7 +2230,9 @@ static int check_port_resume_type(struct usb_device *udev, | |||
| 2174 | int status, unsigned portchange, unsigned portstatus) | 2230 | int status, unsigned portchange, unsigned portstatus) |
| 2175 | { | 2231 | { |
| 2176 | /* Is the device still present? */ | 2232 | /* Is the device still present? */ |
| 2177 | if (status || (portstatus & MASK_BITS) != WANT_BITS) { | 2233 | if (status || port_is_suspended(hub, portstatus) || |
| 2234 | !port_is_power_on(hub, portstatus) || | ||
| 2235 | !(portstatus & USB_PORT_STAT_CONNECTION)) { | ||
| 2178 | if (status >= 0) | 2236 | if (status >= 0) |
| 2179 | status = -ENODEV; | 2237 | status = -ENODEV; |
| 2180 | } | 2238 | } |
| @@ -2285,14 +2343,10 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) | |||
| 2285 | } | 2343 | } |
| 2286 | 2344 | ||
| 2287 | /* see 7.1.7.6 */ | 2345 | /* see 7.1.7.6 */ |
| 2288 | /* Clear PORT_POWER if it's a USB3.0 device connected to USB 3.0 | 2346 | if (hub_is_superspeed(hub->hdev)) |
| 2289 | * external hub. | 2347 | status = set_port_feature(hub->hdev, |
| 2290 | * FIXME: this is a temporary workaround to make the system able | 2348 | port1 | (USB_SS_PORT_LS_U3 << 3), |
| 2291 | * to suspend/resume. | 2349 | USB_PORT_FEAT_LINK_STATE); |
| 2292 | */ | ||
| 2293 | if ((hub->hdev->parent != NULL) && hub_is_superspeed(hub->hdev)) | ||
| 2294 | status = clear_port_feature(hub->hdev, port1, | ||
| 2295 | USB_PORT_FEAT_POWER); | ||
| 2296 | else | 2350 | else |
| 2297 | status = set_port_feature(hub->hdev, port1, | 2351 | status = set_port_feature(hub->hdev, port1, |
| 2298 | USB_PORT_FEAT_SUSPEND); | 2352 | USB_PORT_FEAT_SUSPEND); |
| @@ -2439,7 +2493,7 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) | |||
| 2439 | 2493 | ||
| 2440 | /* Skip the initial Clear-Suspend step for a remote wakeup */ | 2494 | /* Skip the initial Clear-Suspend step for a remote wakeup */ |
| 2441 | status = hub_port_status(hub, port1, &portstatus, &portchange); | 2495 | status = hub_port_status(hub, port1, &portstatus, &portchange); |
| 2442 | if (status == 0 && !(portstatus & USB_PORT_STAT_SUSPEND)) | 2496 | if (status == 0 && !port_is_suspended(hub, portstatus)) |
| 2443 | goto SuspendCleared; | 2497 | goto SuspendCleared; |
| 2444 | 2498 | ||
| 2445 | // dev_dbg(hub->intfdev, "resume port %d\n", port1); | 2499 | // dev_dbg(hub->intfdev, "resume port %d\n", port1); |
| @@ -2447,8 +2501,13 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) | |||
| 2447 | set_bit(port1, hub->busy_bits); | 2501 | set_bit(port1, hub->busy_bits); |
| 2448 | 2502 | ||
| 2449 | /* see 7.1.7.7; affects power usage, but not budgeting */ | 2503 | /* see 7.1.7.7; affects power usage, but not budgeting */ |
| 2450 | status = clear_port_feature(hub->hdev, | 2504 | if (hub_is_superspeed(hub->hdev)) |
| 2451 | port1, USB_PORT_FEAT_SUSPEND); | 2505 | status = set_port_feature(hub->hdev, |
| 2506 | port1 | (USB_SS_PORT_LS_U0 << 3), | ||
| 2507 | USB_PORT_FEAT_LINK_STATE); | ||
| 2508 | else | ||
| 2509 | status = clear_port_feature(hub->hdev, | ||
| 2510 | port1, USB_PORT_FEAT_SUSPEND); | ||
| 2452 | if (status) { | 2511 | if (status) { |
| 2453 | dev_dbg(hub->intfdev, "can't resume port %d, status %d\n", | 2512 | dev_dbg(hub->intfdev, "can't resume port %d, status %d\n", |
| 2454 | port1, status); | 2513 | port1, status); |
| @@ -2470,9 +2529,15 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) | |||
| 2470 | 2529 | ||
| 2471 | SuspendCleared: | 2530 | SuspendCleared: |
| 2472 | if (status == 0) { | 2531 | if (status == 0) { |
| 2473 | if (portchange & USB_PORT_STAT_C_SUSPEND) | 2532 | if (hub_is_superspeed(hub->hdev)) { |
| 2474 | clear_port_feature(hub->hdev, port1, | 2533 | if (portchange & USB_PORT_STAT_C_LINK_STATE) |
| 2475 | USB_PORT_FEAT_C_SUSPEND); | 2534 | clear_port_feature(hub->hdev, port1, |
| 2535 | USB_PORT_FEAT_C_PORT_LINK_STATE); | ||
| 2536 | } else { | ||
| 2537 | if (portchange & USB_PORT_STAT_C_SUSPEND) | ||
| 2538 | clear_port_feature(hub->hdev, port1, | ||
| 2539 | USB_PORT_FEAT_C_SUSPEND); | ||
| 2540 | } | ||
| 2476 | } | 2541 | } |
| 2477 | 2542 | ||
| 2478 | clear_bit(port1, hub->busy_bits); | 2543 | clear_bit(port1, hub->busy_bits); |
| @@ -3147,7 +3212,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, | |||
| 3147 | 3212 | ||
| 3148 | /* maybe switch power back on (e.g. root hub was reset) */ | 3213 | /* maybe switch power back on (e.g. root hub was reset) */ |
| 3149 | if ((wHubCharacteristics & HUB_CHAR_LPSM) < 2 | 3214 | if ((wHubCharacteristics & HUB_CHAR_LPSM) < 2 |
| 3150 | && !(portstatus & USB_PORT_STAT_POWER)) | 3215 | && !port_is_power_on(hub, portstatus)) |
| 3151 | set_port_feature(hdev, port1, USB_PORT_FEAT_POWER); | 3216 | set_port_feature(hdev, port1, USB_PORT_FEAT_POWER); |
| 3152 | 3217 | ||
| 3153 | if (portstatus & USB_PORT_STAT_ENABLE) | 3218 | if (portstatus & USB_PORT_STAT_ENABLE) |
| @@ -3490,6 +3555,16 @@ static void hub_events(void) | |||
| 3490 | USB_PORT_FEAT_C_PORT_CONFIG_ERROR); | 3555 | USB_PORT_FEAT_C_PORT_CONFIG_ERROR); |
| 3491 | } | 3556 | } |
| 3492 | 3557 | ||
| 3558 | /* Warm reset a USB3 protocol port if it's in | ||
| 3559 | * SS.Inactive state. | ||
| 3560 | */ | ||
| 3561 | if (hub_is_superspeed(hub->hdev) && | ||
| 3562 | (portstatus & USB_PORT_STAT_LINK_STATE) | ||
| 3563 | == USB_SS_PORT_LS_SS_INACTIVE) { | ||
| 3564 | dev_dbg(hub_dev, "warm reset port %d\n", i); | ||
| 3565 | hub_port_warm_reset(hub, i); | ||
| 3566 | } | ||
| 3567 | |||
| 3493 | if (connect_change) | 3568 | if (connect_change) |
| 3494 | hub_port_connect_change(hub, i, | 3569 | hub_port_connect_change(hub, i, |
| 3495 | portstatus, portchange); | 3570 | portstatus, portchange); |
diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index 6781c369ce2..cf05b97693e 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c | |||
| @@ -842,22 +842,19 @@ const struct attribute_group *usb_interface_groups[] = { | |||
| 842 | NULL | 842 | NULL |
| 843 | }; | 843 | }; |
| 844 | 844 | ||
| 845 | int usb_create_sysfs_intf_files(struct usb_interface *intf) | 845 | void usb_create_sysfs_intf_files(struct usb_interface *intf) |
| 846 | { | 846 | { |
| 847 | struct usb_device *udev = interface_to_usbdev(intf); | 847 | struct usb_device *udev = interface_to_usbdev(intf); |
| 848 | struct usb_host_interface *alt = intf->cur_altsetting; | 848 | struct usb_host_interface *alt = intf->cur_altsetting; |
| 849 | int retval; | ||
| 850 | 849 | ||
| 851 | if (intf->sysfs_files_created || intf->unregistering) | 850 | if (intf->sysfs_files_created || intf->unregistering) |
| 852 | return 0; | 851 | return; |
| 853 | 852 | ||
| 854 | if (alt->string == NULL && | 853 | if (!alt->string && !(udev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS)) |
| 855 | !(udev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS)) | ||
| 856 | alt->string = usb_cache_string(udev, alt->desc.iInterface); | 854 | alt->string = usb_cache_string(udev, alt->desc.iInterface); |
| 857 | if (alt->string) | 855 | if (alt->string && device_create_file(&intf->dev, &dev_attr_interface)) |
| 858 | retval = device_create_file(&intf->dev, &dev_attr_interface); | 856 | ; /* We don't actually care if the function fails. */ |
| 859 | intf->sysfs_files_created = 1; | 857 | intf->sysfs_files_created = 1; |
| 860 | return 0; | ||
| 861 | } | 858 | } |
| 862 | 859 | ||
| 863 | void usb_remove_sysfs_intf_files(struct usb_interface *intf) | 860 | void usb_remove_sysfs_intf_files(struct usb_interface *intf) |
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index d9d4b169404..8706fc97e60 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
| @@ -953,8 +953,7 @@ static int usb_bus_notify(struct notifier_block *nb, unsigned long action, | |||
| 953 | if (dev->type == &usb_device_type) | 953 | if (dev->type == &usb_device_type) |
| 954 | (void) usb_create_sysfs_dev_files(to_usb_device(dev)); | 954 | (void) usb_create_sysfs_dev_files(to_usb_device(dev)); |
| 955 | else if (dev->type == &usb_if_device_type) | 955 | else if (dev->type == &usb_if_device_type) |
| 956 | (void) usb_create_sysfs_intf_files( | 956 | usb_create_sysfs_intf_files(to_usb_interface(dev)); |
| 957 | to_usb_interface(dev)); | ||
| 958 | break; | 957 | break; |
| 959 | 958 | ||
| 960 | case BUS_NOTIFY_DEL_DEVICE: | 959 | case BUS_NOTIFY_DEL_DEVICE: |
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h index d450b742137..d44d4b7bbf1 100644 --- a/drivers/usb/core/usb.h +++ b/drivers/usb/core/usb.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | extern int usb_create_sysfs_dev_files(struct usb_device *dev); | 5 | extern int usb_create_sysfs_dev_files(struct usb_device *dev); |
| 6 | extern void usb_remove_sysfs_dev_files(struct usb_device *dev); | 6 | extern void usb_remove_sysfs_dev_files(struct usb_device *dev); |
| 7 | extern int usb_create_sysfs_intf_files(struct usb_interface *intf); | 7 | extern void usb_create_sysfs_intf_files(struct usb_interface *intf); |
| 8 | extern void usb_remove_sysfs_intf_files(struct usb_interface *intf); | 8 | extern void usb_remove_sysfs_intf_files(struct usb_interface *intf); |
| 9 | extern int usb_create_ep_devs(struct device *parent, | 9 | extern int usb_create_ep_devs(struct device *parent, |
| 10 | struct usb_host_endpoint *endpoint, | 10 | struct usb_host_endpoint *endpoint, |
diff --git a/drivers/usb/early/ehci-dbgp.c b/drivers/usb/early/ehci-dbgp.c index a6a350f5827..1fc8f124980 100644 --- a/drivers/usb/early/ehci-dbgp.c +++ b/drivers/usb/early/ehci-dbgp.c | |||
| @@ -102,6 +102,9 @@ static struct kgdb_io kgdbdbgp_io_ops; | |||
| 102 | #define dbgp_kgdb_mode (0) | 102 | #define dbgp_kgdb_mode (0) |
| 103 | #endif | 103 | #endif |
| 104 | 104 | ||
| 105 | /* Local version of HC_LENGTH macro as ehci struct is not available here */ | ||
| 106 | #define EARLY_HC_LENGTH(p) (0x00ff & (p)) /* bits 7 : 0 */ | ||
| 107 | |||
| 105 | /* | 108 | /* |
| 106 | * USB Packet IDs (PIDs) | 109 | * USB Packet IDs (PIDs) |
| 107 | */ | 110 | */ |
| @@ -892,7 +895,7 @@ int __init early_dbgp_init(char *s) | |||
| 892 | dbgp_printk("ehci_bar: %p\n", ehci_bar); | 895 | dbgp_printk("ehci_bar: %p\n", ehci_bar); |
| 893 | 896 | ||
| 894 | ehci_caps = ehci_bar; | 897 | ehci_caps = ehci_bar; |
| 895 | ehci_regs = ehci_bar + HC_LENGTH(readl(&ehci_caps->hc_capbase)); | 898 | ehci_regs = ehci_bar + EARLY_HC_LENGTH(readl(&ehci_caps->hc_capbase)); |
| 896 | ehci_debug = ehci_bar + offset; | 899 | ehci_debug = ehci_bar + offset; |
| 897 | ehci_dev.bus = bus; | 900 | ehci_dev.bus = bus; |
| 898 | ehci_dev.slot = slot; | 901 | ehci_dev.slot = slot; |
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index bc5123cf41c..58456d1aec2 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
| @@ -260,6 +260,24 @@ config USB_R8A66597 | |||
| 260 | default USB_GADGET | 260 | default USB_GADGET |
| 261 | select USB_GADGET_SELECTED | 261 | select USB_GADGET_SELECTED |
| 262 | 262 | ||
| 263 | config USB_GADGET_RENESAS_USBHS | ||
| 264 | boolean "Renesas USBHS" | ||
| 265 | depends on USB_RENESAS_USBHS | ||
| 266 | select USB_GADGET_DUALSPEED | ||
| 267 | help | ||
| 268 | Renesas USBHS is a discrete USB host and peripheral controller | ||
| 269 | chip that supports both full and high speed USB 2.0 data transfers. | ||
| 270 | platform is able to configure endpoint (pipe) style | ||
| 271 | |||
| 272 | Say "y" to enable the gadget specific portion of the USBHS driver. | ||
| 273 | |||
| 274 | |||
| 275 | config USB_RENESAS_USBHS_UDC | ||
| 276 | tristate | ||
| 277 | depends on USB_GADGET_RENESAS_USBHS | ||
| 278 | default USB_GADGET | ||
| 279 | select USB_GADGET_SELECTED | ||
| 280 | |||
| 263 | config USB_GADGET_PXA27X | 281 | config USB_GADGET_PXA27X |
| 264 | boolean "PXA 27x" | 282 | boolean "PXA 27x" |
| 265 | depends on ARCH_PXA && (PXA27x || PXA3xx) | 283 | depends on ARCH_PXA && (PXA27x || PXA3xx) |
| @@ -338,6 +356,23 @@ config USB_S3C2410_DEBUG | |||
| 338 | boolean "S3C2410 udc debug messages" | 356 | boolean "S3C2410 udc debug messages" |
| 339 | depends on USB_GADGET_S3C2410 | 357 | depends on USB_GADGET_S3C2410 |
| 340 | 358 | ||
| 359 | config USB_GADGET_S3C_HSUDC | ||
| 360 | boolean "S3C2416, S3C2443 and S3C2450 USB Device Controller" | ||
| 361 | depends on ARCH_S3C2410 | ||
| 362 | select USB_GADGET_DUALSPEED | ||
| 363 | help | ||
| 364 | Samsung's S3C2416, S3C2443 and S3C2450 is an ARM9 based SoC | ||
| 365 | integrated with dual speed USB 2.0 device controller. It has | ||
| 366 | 8 endpoints, as well as endpoint zero. | ||
| 367 | |||
| 368 | This driver has been tested on S3C2416 and S3C2450 processors. | ||
| 369 | |||
| 370 | config USB_S3C_HSUDC | ||
| 371 | tristate | ||
| 372 | depends on USB_GADGET_S3C_HSUDC | ||
| 373 | default USB_GADGET | ||
| 374 | select USB_GADGET_SELECTED | ||
| 375 | |||
| 341 | config USB_GADGET_PXA_U2O | 376 | config USB_GADGET_PXA_U2O |
| 342 | boolean "PXA9xx Processor USB2.0 controller" | 377 | boolean "PXA9xx Processor USB2.0 controller" |
| 343 | select USB_GADGET_DUALSPEED | 378 | select USB_GADGET_DUALSPEED |
diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile index 1ea15ee74fd..4fe92b18a05 100644 --- a/drivers/usb/gadget/Makefile +++ b/drivers/usb/gadget/Makefile | |||
| @@ -22,6 +22,7 @@ obj-$(CONFIG_USB_R8A66597) += r8a66597-udc.o | |||
| 22 | obj-$(CONFIG_USB_FSL_QE) += fsl_qe_udc.o | 22 | obj-$(CONFIG_USB_FSL_QE) += fsl_qe_udc.o |
| 23 | obj-$(CONFIG_USB_CI13XXX_PCI) += ci13xxx_pci.o | 23 | obj-$(CONFIG_USB_CI13XXX_PCI) += ci13xxx_pci.o |
| 24 | obj-$(CONFIG_USB_S3C_HSOTG) += s3c-hsotg.o | 24 | obj-$(CONFIG_USB_S3C_HSOTG) += s3c-hsotg.o |
| 25 | obj-$(CONFIG_USB_S3C_HSUDC) += s3c-hsudc.o | ||
| 25 | obj-$(CONFIG_USB_LANGWELL) += langwell_udc.o | 26 | obj-$(CONFIG_USB_LANGWELL) += langwell_udc.o |
| 26 | obj-$(CONFIG_USB_EG20T) += pch_udc.o | 27 | obj-$(CONFIG_USB_EG20T) += pch_udc.o |
| 27 | obj-$(CONFIG_USB_PXA_U2O) += mv_udc.o | 28 | obj-$(CONFIG_USB_PXA_U2O) += mv_udc.o |
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 9b7cdb16f26..41dc093c0a1 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c | |||
| @@ -1767,7 +1767,7 @@ static int __init at91udc_probe(struct platform_device *pdev) | |||
| 1767 | } | 1767 | } |
| 1768 | 1768 | ||
| 1769 | /* newer chips have more FIFO memory than rm9200 */ | 1769 | /* newer chips have more FIFO memory than rm9200 */ |
| 1770 | if (cpu_is_at91sam9260()) { | 1770 | if (cpu_is_at91sam9260() || cpu_is_at91sam9g20()) { |
| 1771 | udc->ep[0].maxpacket = 64; | 1771 | udc->ep[0].maxpacket = 64; |
| 1772 | udc->ep[3].maxpacket = 64; | 1772 | udc->ep[3].maxpacket = 64; |
| 1773 | udc->ep[4].maxpacket = 512; | 1773 | udc->ep[4].maxpacket = 512; |
diff --git a/drivers/usb/gadget/ci13xxx_udc.c b/drivers/usb/gadget/ci13xxx_udc.c index e09178bc145..baaf87ed768 100644 --- a/drivers/usb/gadget/ci13xxx_udc.c +++ b/drivers/usb/gadget/ci13xxx_udc.c | |||
| @@ -310,7 +310,7 @@ static int hw_device_reset(struct ci13xxx *udc) | |||
| 310 | udc->udc_driver->notify_event(udc, | 310 | udc->udc_driver->notify_event(udc, |
| 311 | CI13XXX_CONTROLLER_RESET_EVENT); | 311 | CI13XXX_CONTROLLER_RESET_EVENT); |
| 312 | 312 | ||
| 313 | if (udc->udc_driver->flags && CI13XXX_DISABLE_STREAMING) | 313 | if (udc->udc_driver->flags & CI13XXX_DISABLE_STREAMING) |
| 314 | hw_cwrite(CAP_USBMODE, USBMODE_SDIS, USBMODE_SDIS); | 314 | hw_cwrite(CAP_USBMODE, USBMODE_SDIS, USBMODE_SDIS); |
| 315 | 315 | ||
| 316 | /* USBMODE should be configured step by step */ | 316 | /* USBMODE should be configured step by step */ |
| @@ -1634,8 +1634,6 @@ static int _gadget_stop_activity(struct usb_gadget *gadget) | |||
| 1634 | gadget_for_each_ep(ep, gadget) { | 1634 | gadget_for_each_ep(ep, gadget) { |
| 1635 | usb_ep_disable(ep); | 1635 | usb_ep_disable(ep); |
| 1636 | } | 1636 | } |
| 1637 | usb_ep_disable(&udc->ep0out.ep); | ||
| 1638 | usb_ep_disable(&udc->ep0in.ep); | ||
| 1639 | 1637 | ||
| 1640 | if (udc->status != NULL) { | 1638 | if (udc->status != NULL) { |
| 1641 | usb_ep_free_request(&udc->ep0in.ep, udc->status); | 1639 | usb_ep_free_request(&udc->ep0in.ep, udc->status); |
| @@ -1678,18 +1676,10 @@ __acquires(udc->lock) | |||
| 1678 | if (retval) | 1676 | if (retval) |
| 1679 | goto done; | 1677 | goto done; |
| 1680 | 1678 | ||
| 1681 | retval = usb_ep_enable(&udc->ep0out.ep, &ctrl_endpt_out_desc); | 1679 | udc->status = usb_ep_alloc_request(&udc->ep0in.ep, GFP_ATOMIC); |
| 1682 | if (retval) | 1680 | if (udc->status == NULL) |
| 1683 | goto done; | 1681 | retval = -ENOMEM; |
| 1684 | 1682 | ||
| 1685 | retval = usb_ep_enable(&udc->ep0in.ep, &ctrl_endpt_in_desc); | ||
| 1686 | if (!retval) { | ||
| 1687 | udc->status = usb_ep_alloc_request(&udc->ep0in.ep, GFP_ATOMIC); | ||
| 1688 | if (udc->status == NULL) { | ||
| 1689 | usb_ep_disable(&udc->ep0out.ep); | ||
| 1690 | retval = -ENOMEM; | ||
| 1691 | } | ||
| 1692 | } | ||
| 1693 | spin_lock(udc->lock); | 1683 | spin_lock(udc->lock); |
| 1694 | 1684 | ||
| 1695 | done: | 1685 | done: |
| @@ -1843,7 +1833,8 @@ __releases(mEp->lock) | |||
| 1843 | __acquires(mEp->lock) | 1833 | __acquires(mEp->lock) |
| 1844 | { | 1834 | { |
| 1845 | struct ci13xxx_req *mReq, *mReqTemp; | 1835 | struct ci13xxx_req *mReq, *mReqTemp; |
| 1846 | int retval; | 1836 | struct ci13xxx_ep *mEpTemp = mEp; |
| 1837 | int uninitialized_var(retval); | ||
| 1847 | 1838 | ||
| 1848 | trace("%p", mEp); | 1839 | trace("%p", mEp); |
| 1849 | 1840 | ||
| @@ -1859,12 +1850,15 @@ __acquires(mEp->lock) | |||
| 1859 | dbg_done(_usb_addr(mEp), mReq->ptr->token, retval); | 1850 | dbg_done(_usb_addr(mEp), mReq->ptr->token, retval); |
| 1860 | if (mReq->req.complete != NULL) { | 1851 | if (mReq->req.complete != NULL) { |
| 1861 | spin_unlock(mEp->lock); | 1852 | spin_unlock(mEp->lock); |
| 1862 | mReq->req.complete(&mEp->ep, &mReq->req); | 1853 | if ((mEp->type == USB_ENDPOINT_XFER_CONTROL) && |
| 1854 | mReq->req.length) | ||
| 1855 | mEpTemp = &_udc->ep0in; | ||
| 1856 | mReq->req.complete(&mEpTemp->ep, &mReq->req); | ||
| 1863 | spin_lock(mEp->lock); | 1857 | spin_lock(mEp->lock); |
| 1864 | } | 1858 | } |
| 1865 | } | 1859 | } |
| 1866 | 1860 | ||
| 1867 | if (retval == EBUSY) | 1861 | if (retval == -EBUSY) |
| 1868 | retval = 0; | 1862 | retval = 0; |
| 1869 | if (retval < 0) | 1863 | if (retval < 0) |
| 1870 | dbg_event(_usb_addr(mEp), "DONE", retval); | 1864 | dbg_event(_usb_addr(mEp), "DONE", retval); |
| @@ -1894,7 +1888,7 @@ __acquires(udc->lock) | |||
| 1894 | 1888 | ||
| 1895 | for (i = 0; i < hw_ep_max; i++) { | 1889 | for (i = 0; i < hw_ep_max; i++) { |
| 1896 | struct ci13xxx_ep *mEp = &udc->ci13xxx_ep[i]; | 1890 | struct ci13xxx_ep *mEp = &udc->ci13xxx_ep[i]; |
| 1897 | int type, num, err = -EINVAL; | 1891 | int type, num, dir, err = -EINVAL; |
| 1898 | struct usb_ctrlrequest req; | 1892 | struct usb_ctrlrequest req; |
| 1899 | 1893 | ||
| 1900 | if (mEp->desc == NULL) | 1894 | if (mEp->desc == NULL) |
| @@ -1952,7 +1946,10 @@ __acquires(udc->lock) | |||
| 1952 | if (req.wLength != 0) | 1946 | if (req.wLength != 0) |
| 1953 | break; | 1947 | break; |
| 1954 | num = le16_to_cpu(req.wIndex); | 1948 | num = le16_to_cpu(req.wIndex); |
| 1949 | dir = num & USB_ENDPOINT_DIR_MASK; | ||
| 1955 | num &= USB_ENDPOINT_NUMBER_MASK; | 1950 | num &= USB_ENDPOINT_NUMBER_MASK; |
| 1951 | if (dir) /* TX */ | ||
| 1952 | num += hw_ep_max/2; | ||
| 1956 | if (!udc->ci13xxx_ep[num].wedge) { | 1953 | if (!udc->ci13xxx_ep[num].wedge) { |
| 1957 | spin_unlock(udc->lock); | 1954 | spin_unlock(udc->lock); |
| 1958 | err = usb_ep_clear_halt( | 1955 | err = usb_ep_clear_halt( |
| @@ -2001,7 +1998,10 @@ __acquires(udc->lock) | |||
| 2001 | if (req.wLength != 0) | 1998 | if (req.wLength != 0) |
| 2002 | break; | 1999 | break; |
| 2003 | num = le16_to_cpu(req.wIndex); | 2000 | num = le16_to_cpu(req.wIndex); |
| 2001 | dir = num & USB_ENDPOINT_DIR_MASK; | ||
| 2004 | num &= USB_ENDPOINT_NUMBER_MASK; | 2002 | num &= USB_ENDPOINT_NUMBER_MASK; |
| 2003 | if (dir) /* TX */ | ||
| 2004 | num += hw_ep_max/2; | ||
| 2005 | 2005 | ||
| 2006 | spin_unlock(udc->lock); | 2006 | spin_unlock(udc->lock); |
| 2007 | err = usb_ep_set_halt(&udc->ci13xxx_ep[num].ep); | 2007 | err = usb_ep_set_halt(&udc->ci13xxx_ep[num].ep); |
| @@ -2110,7 +2110,12 @@ static int ep_enable(struct usb_ep *ep, | |||
| 2110 | (mEp->ep.maxpacket << ffs_nr(QH_MAX_PKT)) & QH_MAX_PKT; | 2110 | (mEp->ep.maxpacket << ffs_nr(QH_MAX_PKT)) & QH_MAX_PKT; |
| 2111 | mEp->qh.ptr->td.next |= TD_TERMINATE; /* needed? */ | 2111 | mEp->qh.ptr->td.next |= TD_TERMINATE; /* needed? */ |
| 2112 | 2112 | ||
| 2113 | retval |= hw_ep_enable(mEp->num, mEp->dir, mEp->type); | 2113 | /* |
| 2114 | * Enable endpoints in the HW other than ep0 as ep0 | ||
| 2115 | * is always enabled | ||
| 2116 | */ | ||
| 2117 | if (mEp->num) | ||
| 2118 | retval |= hw_ep_enable(mEp->num, mEp->dir, mEp->type); | ||
| 2114 | 2119 | ||
| 2115 | spin_unlock_irqrestore(mEp->lock, flags); | 2120 | spin_unlock_irqrestore(mEp->lock, flags); |
| 2116 | return retval; | 2121 | return retval; |
| @@ -2242,11 +2247,15 @@ static int ep_queue(struct usb_ep *ep, struct usb_request *req, | |||
| 2242 | 2247 | ||
| 2243 | spin_lock_irqsave(mEp->lock, flags); | 2248 | spin_lock_irqsave(mEp->lock, flags); |
| 2244 | 2249 | ||
| 2245 | if (mEp->type == USB_ENDPOINT_XFER_CONTROL && | 2250 | if (mEp->type == USB_ENDPOINT_XFER_CONTROL) { |
| 2246 | !list_empty(&mEp->qh.queue)) { | 2251 | if (req->length) |
| 2247 | _ep_nuke(mEp); | 2252 | mEp = (_udc->ep0_dir == RX) ? |
| 2248 | retval = -EOVERFLOW; | 2253 | &_udc->ep0out : &_udc->ep0in; |
| 2249 | warn("endpoint ctrl %X nuked", _usb_addr(mEp)); | 2254 | if (!list_empty(&mEp->qh.queue)) { |
| 2255 | _ep_nuke(mEp); | ||
| 2256 | retval = -EOVERFLOW; | ||
| 2257 | warn("endpoint ctrl %X nuked", _usb_addr(mEp)); | ||
| 2258 | } | ||
| 2250 | } | 2259 | } |
| 2251 | 2260 | ||
| 2252 | /* first nuke then test link, e.g. previous status has not sent */ | 2261 | /* first nuke then test link, e.g. previous status has not sent */ |
| @@ -2497,6 +2506,15 @@ out: | |||
| 2497 | return ret; | 2506 | return ret; |
| 2498 | } | 2507 | } |
| 2499 | 2508 | ||
| 2509 | static int ci13xxx_vbus_draw(struct usb_gadget *_gadget, unsigned mA) | ||
| 2510 | { | ||
| 2511 | struct ci13xxx *udc = container_of(_gadget, struct ci13xxx, gadget); | ||
| 2512 | |||
| 2513 | if (udc->transceiver) | ||
| 2514 | return otg_set_power(udc->transceiver, mA); | ||
| 2515 | return -ENOTSUPP; | ||
| 2516 | } | ||
| 2517 | |||
| 2500 | /** | 2518 | /** |
| 2501 | * Device operations part of the API to the USB controller hardware, | 2519 | * Device operations part of the API to the USB controller hardware, |
| 2502 | * which don't involve endpoints (or i/o) | 2520 | * which don't involve endpoints (or i/o) |
| @@ -2505,6 +2523,7 @@ out: | |||
| 2505 | static const struct usb_gadget_ops usb_gadget_ops = { | 2523 | static const struct usb_gadget_ops usb_gadget_ops = { |
| 2506 | .vbus_session = ci13xxx_vbus_session, | 2524 | .vbus_session = ci13xxx_vbus_session, |
| 2507 | .wakeup = ci13xxx_wakeup, | 2525 | .wakeup = ci13xxx_wakeup, |
| 2526 | .vbus_draw = ci13xxx_vbus_draw, | ||
| 2508 | }; | 2527 | }; |
| 2509 | 2528 | ||
| 2510 | /** | 2529 | /** |
| @@ -2595,6 +2614,14 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver, | |||
| 2595 | } | 2614 | } |
| 2596 | if (retval) | 2615 | if (retval) |
| 2597 | goto done; | 2616 | goto done; |
| 2617 | spin_unlock_irqrestore(udc->lock, flags); | ||
| 2618 | retval = usb_ep_enable(&udc->ep0out.ep, &ctrl_endpt_out_desc); | ||
| 2619 | if (retval) | ||
| 2620 | return retval; | ||
| 2621 | retval = usb_ep_enable(&udc->ep0in.ep, &ctrl_endpt_in_desc); | ||
| 2622 | if (retval) | ||
| 2623 | return retval; | ||
| 2624 | spin_lock_irqsave(udc->lock, flags); | ||
| 2598 | 2625 | ||
| 2599 | udc->gadget.ep0 = &udc->ep0in.ep; | 2626 | udc->gadget.ep0 = &udc->ep0in.ep; |
| 2600 | /* bind gadget */ | 2627 | /* bind gadget */ |
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 82314ed2250..5cbb1a41c22 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c | |||
| @@ -461,12 +461,23 @@ static int set_config(struct usb_composite_dev *cdev, | |||
| 461 | reset_config(cdev); | 461 | reset_config(cdev); |
| 462 | goto done; | 462 | goto done; |
| 463 | } | 463 | } |
| 464 | |||
| 465 | if (result == USB_GADGET_DELAYED_STATUS) { | ||
| 466 | DBG(cdev, | ||
| 467 | "%s: interface %d (%s) requested delayed status\n", | ||
| 468 | __func__, tmp, f->name); | ||
| 469 | cdev->delayed_status++; | ||
| 470 | DBG(cdev, "delayed_status count %d\n", | ||
| 471 | cdev->delayed_status); | ||
| 472 | } | ||
| 464 | } | 473 | } |
| 465 | 474 | ||
| 466 | /* when we return, be sure our power usage is valid */ | 475 | /* when we return, be sure our power usage is valid */ |
| 467 | power = c->bMaxPower ? (2 * c->bMaxPower) : CONFIG_USB_GADGET_VBUS_DRAW; | 476 | power = c->bMaxPower ? (2 * c->bMaxPower) : CONFIG_USB_GADGET_VBUS_DRAW; |
| 468 | done: | 477 | done: |
| 469 | usb_gadget_vbus_draw(gadget, power); | 478 | usb_gadget_vbus_draw(gadget, power); |
| 479 | if (result >= 0 && cdev->delayed_status) | ||
| 480 | result = USB_GADGET_DELAYED_STATUS; | ||
| 470 | return result; | 481 | return result; |
| 471 | } | 482 | } |
| 472 | 483 | ||
| @@ -895,6 +906,14 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | |||
| 895 | if (w_value && !f->set_alt) | 906 | if (w_value && !f->set_alt) |
| 896 | break; | 907 | break; |
| 897 | value = f->set_alt(f, w_index, w_value); | 908 | value = f->set_alt(f, w_index, w_value); |
| 909 | if (value == USB_GADGET_DELAYED_STATUS) { | ||
| 910 | DBG(cdev, | ||
| 911 | "%s: interface %d (%s) requested delayed status\n", | ||
| 912 | __func__, intf, f->name); | ||
| 913 | cdev->delayed_status++; | ||
| 914 | DBG(cdev, "delayed_status count %d\n", | ||
| 915 | cdev->delayed_status); | ||
| 916 | } | ||
| 898 | break; | 917 | break; |
| 899 | case USB_REQ_GET_INTERFACE: | 918 | case USB_REQ_GET_INTERFACE: |
| 900 | if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE)) | 919 | if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE)) |
| @@ -958,7 +977,7 @@ unknown: | |||
| 958 | } | 977 | } |
| 959 | 978 | ||
| 960 | /* respond with data transfer before status phase? */ | 979 | /* respond with data transfer before status phase? */ |
| 961 | if (value >= 0) { | 980 | if (value >= 0 && value != USB_GADGET_DELAYED_STATUS) { |
| 962 | req->length = value; | 981 | req->length = value; |
| 963 | req->zero = value < w_length; | 982 | req->zero = value < w_length; |
| 964 | value = usb_ep_queue(gadget->ep0, req, GFP_ATOMIC); | 983 | value = usb_ep_queue(gadget->ep0, req, GFP_ATOMIC); |
| @@ -967,6 +986,10 @@ unknown: | |||
| 967 | req->status = 0; | 986 | req->status = 0; |
| 968 | composite_setup_complete(gadget->ep0, req); | 987 | composite_setup_complete(gadget->ep0, req); |
| 969 | } | 988 | } |
| 989 | } else if (value == USB_GADGET_DELAYED_STATUS && w_length != 0) { | ||
| 990 | WARN(cdev, | ||
| 991 | "%s: Delayed status not supported for w_length != 0", | ||
| 992 | __func__); | ||
| 970 | } | 993 | } |
| 971 | 994 | ||
| 972 | done: | 995 | done: |
| @@ -1289,3 +1312,40 @@ void usb_composite_unregister(struct usb_composite_driver *driver) | |||
| 1289 | return; | 1312 | return; |
| 1290 | usb_gadget_unregister_driver(&composite_driver); | 1313 | usb_gadget_unregister_driver(&composite_driver); |
| 1291 | } | 1314 | } |
| 1315 | |||
| 1316 | /** | ||
| 1317 | * usb_composite_setup_continue() - Continue with the control transfer | ||
| 1318 | * @cdev: the composite device who's control transfer was kept waiting | ||
| 1319 | * | ||
| 1320 | * This function must be called by the USB function driver to continue | ||
| 1321 | * with the control transfer's data/status stage in case it had requested to | ||
| 1322 | * delay the data/status stages. A USB function's setup handler (e.g. set_alt()) | ||
| 1323 | * can request the composite framework to delay the setup request's data/status | ||
| 1324 | * stages by returning USB_GADGET_DELAYED_STATUS. | ||
| 1325 | */ | ||
| 1326 | void usb_composite_setup_continue(struct usb_composite_dev *cdev) | ||
| 1327 | { | ||
| 1328 | int value; | ||
| 1329 | struct usb_request *req = cdev->req; | ||
| 1330 | unsigned long flags; | ||
| 1331 | |||
| 1332 | DBG(cdev, "%s\n", __func__); | ||
| 1333 | spin_lock_irqsave(&cdev->lock, flags); | ||
| 1334 | |||
| 1335 | if (cdev->delayed_status == 0) { | ||
| 1336 | WARN(cdev, "%s: Unexpected call\n", __func__); | ||
| 1337 | |||
| 1338 | } else if (--cdev->delayed_status == 0) { | ||
| 1339 | DBG(cdev, "%s: Completing delayed status\n", __func__); | ||
| 1340 | req->length = 0; | ||
| 1341 | value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC); | ||
| 1342 | if (value < 0) { | ||
| 1343 | DBG(cdev, "ep_queue --> %d\n", value); | ||
| 1344 | req->status = 0; | ||
| 1345 | composite_setup_complete(cdev->gadget->ep0, req); | ||
| 1346 | } | ||
| 1347 | } | ||
| 1348 | |||
| 1349 | spin_unlock_irqrestore(&cdev->lock, flags); | ||
| 1350 | } | ||
| 1351 | |||
diff --git a/drivers/usb/gadget/dbgp.c b/drivers/usb/gadget/dbgp.c index e5ac8a316fe..dbe92ee8847 100644 --- a/drivers/usb/gadget/dbgp.c +++ b/drivers/usb/gadget/dbgp.c | |||
| @@ -261,8 +261,8 @@ static int __init dbgp_configure_endpoints(struct usb_gadget *gadget) | |||
| 261 | o_desc.wMaxPacketSize = | 261 | o_desc.wMaxPacketSize = |
| 262 | __constant_cpu_to_le16(USB_DEBUG_MAX_PACKET_SIZE); | 262 | __constant_cpu_to_le16(USB_DEBUG_MAX_PACKET_SIZE); |
| 263 | 263 | ||
| 264 | dbg_desc.bDebugInEndpoint = i_desc.bEndpointAddress & 0x7f; | 264 | dbg_desc.bDebugInEndpoint = i_desc.bEndpointAddress; |
| 265 | dbg_desc.bDebugOutEndpoint = o_desc.bEndpointAddress & 0x7f; | 265 | dbg_desc.bDebugOutEndpoint = o_desc.bEndpointAddress; |
| 266 | 266 | ||
| 267 | #ifdef CONFIG_USB_G_DBGP_SERIAL | 267 | #ifdef CONFIG_USB_G_DBGP_SERIAL |
| 268 | dbgp.serial->in = dbgp.i_ep; | 268 | dbgp.serial->in = dbgp.i_ep; |
| @@ -312,6 +312,7 @@ static int __init dbgp_bind(struct usb_gadget *gadget) | |||
| 312 | 312 | ||
| 313 | dbgp.req->length = DBGP_REQ_EP0_LEN; | 313 | dbgp.req->length = DBGP_REQ_EP0_LEN; |
| 314 | gadget->ep0->driver_data = gadget; | 314 | gadget->ep0->driver_data = gadget; |
| 315 | device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket; | ||
| 315 | 316 | ||
| 316 | #ifdef CONFIG_USB_G_DBGP_SERIAL | 317 | #ifdef CONFIG_USB_G_DBGP_SERIAL |
| 317 | dbgp.serial = kzalloc(sizeof(struct gserial), GFP_KERNEL); | 318 | dbgp.serial = kzalloc(sizeof(struct gserial), GFP_KERNEL); |
| @@ -350,9 +351,9 @@ static int dbgp_setup(struct usb_gadget *gadget, | |||
| 350 | u8 request = ctrl->bRequest; | 351 | u8 request = ctrl->bRequest; |
| 351 | u16 value = le16_to_cpu(ctrl->wValue); | 352 | u16 value = le16_to_cpu(ctrl->wValue); |
| 352 | u16 length = le16_to_cpu(ctrl->wLength); | 353 | u16 length = le16_to_cpu(ctrl->wLength); |
| 353 | int err = 0; | 354 | int err = -EOPNOTSUPP; |
| 354 | void *data; | 355 | void *data = NULL; |
| 355 | u16 len; | 356 | u16 len = 0; |
| 356 | 357 | ||
| 357 | gadget->ep0->driver_data = gadget; | 358 | gadget->ep0->driver_data = gadget; |
| 358 | 359 | ||
| @@ -371,10 +372,9 @@ static int dbgp_setup(struct usb_gadget *gadget, | |||
| 371 | default: | 372 | default: |
| 372 | goto fail; | 373 | goto fail; |
| 373 | } | 374 | } |
| 375 | err = 0; | ||
| 374 | } else if (request == USB_REQ_SET_FEATURE && | 376 | } else if (request == USB_REQ_SET_FEATURE && |
| 375 | value == USB_DEVICE_DEBUG_MODE) { | 377 | value == USB_DEVICE_DEBUG_MODE) { |
| 376 | len = 0; | ||
| 377 | data = NULL; | ||
| 378 | dev_dbg(&dbgp.gadget->dev, "setup: feat debug\n"); | 378 | dev_dbg(&dbgp.gadget->dev, "setup: feat debug\n"); |
| 379 | #ifdef CONFIG_USB_G_DBGP_PRINTK | 379 | #ifdef CONFIG_USB_G_DBGP_PRINTK |
| 380 | err = dbgp_enable_ep(); | 380 | err = dbgp_enable_ep(); |
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index 3214ca375d6..61ff927928a 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c | |||
| @@ -892,10 +892,11 @@ static int dummy_udc_probe (struct platform_device *pdev) | |||
| 892 | return rc; | 892 | return rc; |
| 893 | } | 893 | } |
| 894 | 894 | ||
| 895 | platform_set_drvdata (pdev, dum); | ||
| 896 | rc = device_create_file (&dum->gadget.dev, &dev_attr_function); | 895 | rc = device_create_file (&dum->gadget.dev, &dev_attr_function); |
| 897 | if (rc < 0) | 896 | if (rc < 0) |
| 898 | device_unregister (&dum->gadget.dev); | 897 | device_unregister (&dum->gadget.dev); |
| 898 | else | ||
| 899 | platform_set_drvdata(pdev, dum); | ||
| 899 | return rc; | 900 | return rc; |
| 900 | } | 901 | } |
| 901 | 902 | ||
| @@ -1995,11 +1996,29 @@ static int __init init (void) | |||
| 1995 | retval = platform_device_add(the_hcd_pdev); | 1996 | retval = platform_device_add(the_hcd_pdev); |
| 1996 | if (retval < 0) | 1997 | if (retval < 0) |
| 1997 | goto err_add_hcd; | 1998 | goto err_add_hcd; |
| 1999 | if (!the_controller) { | ||
| 2000 | /* | ||
| 2001 | * The hcd was added successfully but its probe function failed | ||
| 2002 | * for some reason. | ||
| 2003 | */ | ||
| 2004 | retval = -EINVAL; | ||
| 2005 | goto err_add_udc; | ||
| 2006 | } | ||
| 1998 | retval = platform_device_add(the_udc_pdev); | 2007 | retval = platform_device_add(the_udc_pdev); |
| 1999 | if (retval < 0) | 2008 | if (retval < 0) |
| 2000 | goto err_add_udc; | 2009 | goto err_add_udc; |
| 2010 | if (!platform_get_drvdata(the_udc_pdev)) { | ||
| 2011 | /* | ||
| 2012 | * The udc was added successfully but its probe function failed | ||
| 2013 | * for some reason. | ||
| 2014 | */ | ||
| 2015 | retval = -EINVAL; | ||
| 2016 | goto err_probe_udc; | ||
| 2017 | } | ||
| 2001 | return retval; | 2018 | return retval; |
| 2002 | 2019 | ||
| 2020 | err_probe_udc: | ||
| 2021 | platform_device_del(the_udc_pdev); | ||
| 2003 | err_add_udc: | 2022 | err_add_udc: |
| 2004 | platform_device_del(the_hcd_pdev); | 2023 | platform_device_del(the_hcd_pdev); |
| 2005 | err_add_hcd: | 2024 | err_add_hcd: |
diff --git a/drivers/usb/gadget/f_audio.c b/drivers/usb/gadget/f_audio.c index 0111f8a9cf7..8ee330a2ab5 100644 --- a/drivers/usb/gadget/f_audio.c +++ b/drivers/usb/gadget/f_audio.c | |||
| @@ -177,7 +177,7 @@ static struct uac_format_type_i_discrete_descriptor_1 as_type_i_desc = { | |||
| 177 | }; | 177 | }; |
| 178 | 178 | ||
| 179 | /* Standard ISO OUT Endpoint Descriptor */ | 179 | /* Standard ISO OUT Endpoint Descriptor */ |
| 180 | static struct usb_endpoint_descriptor as_out_ep_desc __initdata = { | 180 | static struct usb_endpoint_descriptor as_out_ep_desc = { |
| 181 | .bLength = USB_DT_ENDPOINT_AUDIO_SIZE, | 181 | .bLength = USB_DT_ENDPOINT_AUDIO_SIZE, |
| 182 | .bDescriptorType = USB_DT_ENDPOINT, | 182 | .bDescriptorType = USB_DT_ENDPOINT, |
| 183 | .bEndpointAddress = USB_DIR_OUT, | 183 | .bEndpointAddress = USB_DIR_OUT, |
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index 6d8e533949e..efb58f9f5aa 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c | |||
| @@ -347,6 +347,7 @@ struct fsg_operations { | |||
| 347 | /* Data shared by all the FSG instances. */ | 347 | /* Data shared by all the FSG instances. */ |
| 348 | struct fsg_common { | 348 | struct fsg_common { |
| 349 | struct usb_gadget *gadget; | 349 | struct usb_gadget *gadget; |
| 350 | struct usb_composite_dev *cdev; | ||
| 350 | struct fsg_dev *fsg, *new_fsg; | 351 | struct fsg_dev *fsg, *new_fsg; |
| 351 | wait_queue_head_t fsg_wait; | 352 | wait_queue_head_t fsg_wait; |
| 352 | 353 | ||
| @@ -613,6 +614,11 @@ static int fsg_setup(struct usb_function *f, | |||
| 613 | if (!fsg_is_set(fsg->common)) | 614 | if (!fsg_is_set(fsg->common)) |
| 614 | return -EOPNOTSUPP; | 615 | return -EOPNOTSUPP; |
| 615 | 616 | ||
| 617 | ++fsg->common->ep0_req_tag; /* Record arrival of a new request */ | ||
| 618 | req->context = NULL; | ||
| 619 | req->length = 0; | ||
| 620 | dump_msg(fsg, "ep0-setup", (u8 *) ctrl, sizeof(*ctrl)); | ||
| 621 | |||
| 616 | switch (ctrl->bRequest) { | 622 | switch (ctrl->bRequest) { |
| 617 | 623 | ||
| 618 | case USB_BULK_RESET_REQUEST: | 624 | case USB_BULK_RESET_REQUEST: |
| @@ -1584,37 +1590,6 @@ static int wedge_bulk_in_endpoint(struct fsg_dev *fsg) | |||
| 1584 | return rc; | 1590 | return rc; |
| 1585 | } | 1591 | } |
| 1586 | 1592 | ||
| 1587 | static int pad_with_zeros(struct fsg_dev *fsg) | ||
| 1588 | { | ||
| 1589 | struct fsg_buffhd *bh = fsg->common->next_buffhd_to_fill; | ||
| 1590 | u32 nkeep = bh->inreq->length; | ||
| 1591 | u32 nsend; | ||
| 1592 | int rc; | ||
| 1593 | |||
| 1594 | bh->state = BUF_STATE_EMPTY; /* For the first iteration */ | ||
| 1595 | fsg->common->usb_amount_left = nkeep + fsg->common->residue; | ||
| 1596 | while (fsg->common->usb_amount_left > 0) { | ||
| 1597 | |||
| 1598 | /* Wait for the next buffer to be free */ | ||
| 1599 | while (bh->state != BUF_STATE_EMPTY) { | ||
| 1600 | rc = sleep_thread(fsg->common); | ||
| 1601 | if (rc) | ||
| 1602 | return rc; | ||
| 1603 | } | ||
| 1604 | |||
| 1605 | nsend = min(fsg->common->usb_amount_left, FSG_BUFLEN); | ||
| 1606 | memset(bh->buf + nkeep, 0, nsend - nkeep); | ||
| 1607 | bh->inreq->length = nsend; | ||
| 1608 | bh->inreq->zero = 0; | ||
| 1609 | start_transfer(fsg, fsg->bulk_in, bh->inreq, | ||
| 1610 | &bh->inreq_busy, &bh->state); | ||
| 1611 | bh = fsg->common->next_buffhd_to_fill = bh->next; | ||
| 1612 | fsg->common->usb_amount_left -= nsend; | ||
| 1613 | nkeep = 0; | ||
| 1614 | } | ||
| 1615 | return 0; | ||
| 1616 | } | ||
| 1617 | |||
| 1618 | static int throw_away_data(struct fsg_common *common) | 1593 | static int throw_away_data(struct fsg_common *common) |
| 1619 | { | 1594 | { |
| 1620 | struct fsg_buffhd *bh; | 1595 | struct fsg_buffhd *bh; |
| @@ -1702,6 +1677,10 @@ static int finish_reply(struct fsg_common *common) | |||
| 1702 | if (common->data_size == 0) { | 1677 | if (common->data_size == 0) { |
| 1703 | /* Nothing to send */ | 1678 | /* Nothing to send */ |
| 1704 | 1679 | ||
| 1680 | /* Don't know what to do if common->fsg is NULL */ | ||
| 1681 | } else if (!fsg_is_set(common)) { | ||
| 1682 | rc = -EIO; | ||
| 1683 | |||
| 1705 | /* If there's no residue, simply send the last buffer */ | 1684 | /* If there's no residue, simply send the last buffer */ |
| 1706 | } else if (common->residue == 0) { | 1685 | } else if (common->residue == 0) { |
| 1707 | bh->inreq->zero = 0; | 1686 | bh->inreq->zero = 0; |
| @@ -1710,24 +1689,19 @@ static int finish_reply(struct fsg_common *common) | |||
| 1710 | common->next_buffhd_to_fill = bh->next; | 1689 | common->next_buffhd_to_fill = bh->next; |
| 1711 | 1690 | ||
| 1712 | /* | 1691 | /* |
| 1713 | * For Bulk-only, if we're allowed to stall then send the | 1692 | * For Bulk-only, mark the end of the data with a short |
| 1714 | * short packet and halt the bulk-in endpoint. If we can't | 1693 | * packet. If we are allowed to stall, halt the bulk-in |
| 1715 | * stall, pad out the remaining data with 0's. | 1694 | * endpoint. (Note: This violates the Bulk-Only Transport |
| 1695 | * specification, which requires us to pad the data if we | ||
| 1696 | * don't halt the endpoint. Presumably nobody will mind.) | ||
| 1716 | */ | 1697 | */ |
| 1717 | } else if (common->can_stall) { | 1698 | } else { |
| 1718 | bh->inreq->zero = 1; | 1699 | bh->inreq->zero = 1; |
| 1719 | if (!start_in_transfer(common, bh)) | 1700 | if (!start_in_transfer(common, bh)) |
| 1720 | /* Don't know what to do if | ||
| 1721 | * common->fsg is NULL */ | ||
| 1722 | rc = -EIO; | 1701 | rc = -EIO; |
| 1723 | common->next_buffhd_to_fill = bh->next; | 1702 | common->next_buffhd_to_fill = bh->next; |
| 1724 | if (common->fsg) | 1703 | if (common->can_stall) |
| 1725 | rc = halt_bulk_in_endpoint(common->fsg); | 1704 | rc = halt_bulk_in_endpoint(common->fsg); |
| 1726 | } else if (fsg_is_set(common)) { | ||
| 1727 | rc = pad_with_zeros(common->fsg); | ||
| 1728 | } else { | ||
| 1729 | /* Don't know what to do if common->fsg is NULL */ | ||
| 1730 | rc = -EIO; | ||
| 1731 | } | 1705 | } |
| 1732 | break; | 1706 | break; |
| 1733 | 1707 | ||
| @@ -1910,7 +1884,7 @@ static int check_command(struct fsg_common *common, int cmnd_size, | |||
| 1910 | common->lun, lun); | 1884 | common->lun, lun); |
| 1911 | 1885 | ||
| 1912 | /* Check the LUN */ | 1886 | /* Check the LUN */ |
| 1913 | if (common->lun >= 0 && common->lun < common->nluns) { | 1887 | if (common->lun < common->nluns) { |
| 1914 | curlun = &common->luns[common->lun]; | 1888 | curlun = &common->luns[common->lun]; |
| 1915 | common->curlun = curlun; | 1889 | common->curlun = curlun; |
| 1916 | if (common->cmnd[0] != REQUEST_SENSE) { | 1890 | if (common->cmnd[0] != REQUEST_SENSE) { |
| @@ -2468,7 +2442,7 @@ static int fsg_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
| 2468 | struct fsg_dev *fsg = fsg_from_func(f); | 2442 | struct fsg_dev *fsg = fsg_from_func(f); |
| 2469 | fsg->common->new_fsg = fsg; | 2443 | fsg->common->new_fsg = fsg; |
| 2470 | raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE); | 2444 | raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE); |
| 2471 | return 0; | 2445 | return USB_GADGET_DELAYED_STATUS; |
| 2472 | } | 2446 | } |
| 2473 | 2447 | ||
| 2474 | static void fsg_disable(struct usb_function *f) | 2448 | static void fsg_disable(struct usb_function *f) |
| @@ -2604,6 +2578,8 @@ static void handle_exception(struct fsg_common *common) | |||
| 2604 | 2578 | ||
| 2605 | case FSG_STATE_CONFIG_CHANGE: | 2579 | case FSG_STATE_CONFIG_CHANGE: |
| 2606 | do_set_interface(common, common->new_fsg); | 2580 | do_set_interface(common, common->new_fsg); |
| 2581 | if (common->new_fsg) | ||
| 2582 | usb_composite_setup_continue(common->cdev); | ||
| 2607 | break; | 2583 | break; |
| 2608 | 2584 | ||
| 2609 | case FSG_STATE_EXIT: | 2585 | case FSG_STATE_EXIT: |
| @@ -2774,6 +2750,7 @@ static struct fsg_common *fsg_common_init(struct fsg_common *common, | |||
| 2774 | common->gadget = gadget; | 2750 | common->gadget = gadget; |
| 2775 | common->ep0 = gadget->ep0; | 2751 | common->ep0 = gadget->ep0; |
| 2776 | common->ep0req = cdev->req; | 2752 | common->ep0req = cdev->req; |
| 2753 | common->cdev = cdev; | ||
| 2777 | 2754 | ||
| 2778 | /* Maybe allocate device-global string IDs, and patch descriptors */ | 2755 | /* Maybe allocate device-global string IDs, and patch descriptors */ |
| 2779 | if (fsg_strings[FSG_STRING_INTERFACE].id == 0) { | 2756 | if (fsg_strings[FSG_STRING_INTERFACE].id == 0) { |
| @@ -2800,6 +2777,7 @@ static struct fsg_common *fsg_common_init(struct fsg_common *common, | |||
| 2800 | for (i = 0, lcfg = cfg->luns; i < nluns; ++i, ++curlun, ++lcfg) { | 2777 | for (i = 0, lcfg = cfg->luns; i < nluns; ++i, ++curlun, ++lcfg) { |
| 2801 | curlun->cdrom = !!lcfg->cdrom; | 2778 | curlun->cdrom = !!lcfg->cdrom; |
| 2802 | curlun->ro = lcfg->cdrom || lcfg->ro; | 2779 | curlun->ro = lcfg->cdrom || lcfg->ro; |
| 2780 | curlun->initially_ro = curlun->ro; | ||
| 2803 | curlun->removable = lcfg->removable; | 2781 | curlun->removable = lcfg->removable; |
| 2804 | curlun->dev.release = fsg_lun_release; | 2782 | curlun->dev.release = fsg_lun_release; |
| 2805 | curlun->dev.parent = &gadget->dev; | 2783 | curlun->dev.parent = &gadget->dev; |
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index 882484a4039..fa12ec8364e 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c | |||
| @@ -420,8 +420,7 @@ rndis_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) | |||
| 420 | */ | 420 | */ |
| 421 | case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8) | 421 | case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8) |
| 422 | | USB_CDC_SEND_ENCAPSULATED_COMMAND: | 422 | | USB_CDC_SEND_ENCAPSULATED_COMMAND: |
| 423 | if (w_length > req->length || w_value | 423 | if (w_value || w_index != rndis->ctrl_id) |
| 424 | || w_index != rndis->ctrl_id) | ||
| 425 | goto invalid; | 424 | goto invalid; |
| 426 | /* read the request; process it later */ | 425 | /* read the request; process it later */ |
| 427 | value = w_length; | 426 | value = w_length; |
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c index a6eacb59571..0360f56221e 100644 --- a/drivers/usb/gadget/file_storage.c +++ b/drivers/usb/gadget/file_storage.c | |||
| @@ -1947,37 +1947,6 @@ static int wedge_bulk_in_endpoint(struct fsg_dev *fsg) | |||
| 1947 | return rc; | 1947 | return rc; |
| 1948 | } | 1948 | } |
| 1949 | 1949 | ||
| 1950 | static int pad_with_zeros(struct fsg_dev *fsg) | ||
| 1951 | { | ||
| 1952 | struct fsg_buffhd *bh = fsg->next_buffhd_to_fill; | ||
| 1953 | u32 nkeep = bh->inreq->length; | ||
| 1954 | u32 nsend; | ||
| 1955 | int rc; | ||
| 1956 | |||
| 1957 | bh->state = BUF_STATE_EMPTY; // For the first iteration | ||
| 1958 | fsg->usb_amount_left = nkeep + fsg->residue; | ||
| 1959 | while (fsg->usb_amount_left > 0) { | ||
| 1960 | |||
| 1961 | /* Wait for the next buffer to be free */ | ||
| 1962 | while (bh->state != BUF_STATE_EMPTY) { | ||
| 1963 | rc = sleep_thread(fsg); | ||
| 1964 | if (rc) | ||
| 1965 | return rc; | ||
| 1966 | } | ||
| 1967 | |||
| 1968 | nsend = min(fsg->usb_amount_left, (u32) mod_data.buflen); | ||
| 1969 | memset(bh->buf + nkeep, 0, nsend - nkeep); | ||
| 1970 | bh->inreq->length = nsend; | ||
| 1971 | bh->inreq->zero = 0; | ||
| 1972 | start_transfer(fsg, fsg->bulk_in, bh->inreq, | ||
| 1973 | &bh->inreq_busy, &bh->state); | ||
| 1974 | bh = fsg->next_buffhd_to_fill = bh->next; | ||
| 1975 | fsg->usb_amount_left -= nsend; | ||
| 1976 | nkeep = 0; | ||
| 1977 | } | ||
| 1978 | return 0; | ||
| 1979 | } | ||
| 1980 | |||
| 1981 | static int throw_away_data(struct fsg_dev *fsg) | 1950 | static int throw_away_data(struct fsg_dev *fsg) |
| 1982 | { | 1951 | { |
| 1983 | struct fsg_buffhd *bh; | 1952 | struct fsg_buffhd *bh; |
| @@ -2082,18 +2051,20 @@ static int finish_reply(struct fsg_dev *fsg) | |||
| 2082 | } | 2051 | } |
| 2083 | } | 2052 | } |
| 2084 | 2053 | ||
| 2085 | /* For Bulk-only, if we're allowed to stall then send the | 2054 | /* |
| 2086 | * short packet and halt the bulk-in endpoint. If we can't | 2055 | * For Bulk-only, mark the end of the data with a short |
| 2087 | * stall, pad out the remaining data with 0's. */ | 2056 | * packet. If we are allowed to stall, halt the bulk-in |
| 2057 | * endpoint. (Note: This violates the Bulk-Only Transport | ||
| 2058 | * specification, which requires us to pad the data if we | ||
| 2059 | * don't halt the endpoint. Presumably nobody will mind.) | ||
| 2060 | */ | ||
| 2088 | else { | 2061 | else { |
| 2089 | if (mod_data.can_stall) { | 2062 | bh->inreq->zero = 1; |
| 2090 | bh->inreq->zero = 1; | 2063 | start_transfer(fsg, fsg->bulk_in, bh->inreq, |
| 2091 | start_transfer(fsg, fsg->bulk_in, bh->inreq, | 2064 | &bh->inreq_busy, &bh->state); |
| 2092 | &bh->inreq_busy, &bh->state); | 2065 | fsg->next_buffhd_to_fill = bh->next; |
| 2093 | fsg->next_buffhd_to_fill = bh->next; | 2066 | if (mod_data.can_stall) |
| 2094 | rc = halt_bulk_in_endpoint(fsg); | 2067 | rc = halt_bulk_in_endpoint(fsg); |
| 2095 | } else | ||
| 2096 | rc = pad_with_zeros(fsg); | ||
| 2097 | } | 2068 | } |
| 2098 | break; | 2069 | break; |
| 2099 | 2070 | ||
| @@ -2314,7 +2285,7 @@ static int check_command(struct fsg_dev *fsg, int cmnd_size, | |||
| 2314 | fsg->lun = lun; // Use LUN from the command | 2285 | fsg->lun = lun; // Use LUN from the command |
| 2315 | 2286 | ||
| 2316 | /* Check the LUN */ | 2287 | /* Check the LUN */ |
| 2317 | if (fsg->lun >= 0 && fsg->lun < fsg->nluns) { | 2288 | if (fsg->lun < fsg->nluns) { |
| 2318 | fsg->curlun = curlun = &fsg->luns[fsg->lun]; | 2289 | fsg->curlun = curlun = &fsg->luns[fsg->lun]; |
| 2319 | if (fsg->cmnd[0] != REQUEST_SENSE) { | 2290 | if (fsg->cmnd[0] != REQUEST_SENSE) { |
| 2320 | curlun->sense_data = SS_NO_SENSE; | 2291 | curlun->sense_data = SS_NO_SENSE; |
diff --git a/drivers/usb/gadget/fsl_qe_udc.h b/drivers/usb/gadget/fsl_qe_udc.h index e35e24fd64b..1da5fb03d21 100644 --- a/drivers/usb/gadget/fsl_qe_udc.h +++ b/drivers/usb/gadget/fsl_qe_udc.h | |||
| @@ -207,7 +207,7 @@ struct qe_frame{ | |||
| 207 | 207 | ||
| 208 | /* Frame status field */ | 208 | /* Frame status field */ |
| 209 | /* Receive side */ | 209 | /* Receive side */ |
| 210 | #define FRAME_OK 0x00000000 /* Frame tranmitted or received OK */ | 210 | #define FRAME_OK 0x00000000 /* Frame transmitted or received OK */ |
| 211 | #define FRAME_ERROR 0x80000000 /* Error occurred on frame */ | 211 | #define FRAME_ERROR 0x80000000 /* Error occurred on frame */ |
| 212 | #define START_FRAME_LOST 0x40000000 /* START_FRAME_LOST */ | 212 | #define START_FRAME_LOST 0x40000000 /* START_FRAME_LOST */ |
| 213 | #define END_FRAME_LOST 0x20000000 /* END_FRAME_LOST */ | 213 | #define END_FRAME_LOST 0x20000000 /* END_FRAME_LOST */ |
diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c index 07499c1cdcc..2cd9a60c7f3 100644 --- a/drivers/usb/gadget/fsl_udc_core.c +++ b/drivers/usb/gadget/fsl_udc_core.c | |||
| @@ -1,12 +1,13 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2004-2007 Freescale Semicondutor, Inc. All rights reserved. | 2 | * Copyright (C) 2004-2007,2011 Freescale Semiconductor, Inc. |
| 3 | * All rights reserved. | ||
| 3 | * | 4 | * |
| 4 | * Author: Li Yang <leoli@freescale.com> | 5 | * Author: Li Yang <leoli@freescale.com> |
| 5 | * Jiang Bo <tanya.jiang@freescale.com> | 6 | * Jiang Bo <tanya.jiang@freescale.com> |
| 6 | * | 7 | * |
| 7 | * Description: | 8 | * Description: |
| 8 | * Freescale high-speed USB SOC DR module device controller driver. | 9 | * Freescale high-speed USB SOC DR module device controller driver. |
| 9 | * This can be found on MPC8349E/MPC8313E cpus. | 10 | * This can be found on MPC8349E/MPC8313E/MPC5121E cpus. |
| 10 | * The driver is previously named as mpc_udc. Based on bare board | 11 | * The driver is previously named as mpc_udc. Based on bare board |
| 11 | * code from Dave Liu and Shlomi Gridish. | 12 | * code from Dave Liu and Shlomi Gridish. |
| 12 | * | 13 | * |
| @@ -45,6 +46,7 @@ | |||
| 45 | #include <asm/system.h> | 46 | #include <asm/system.h> |
| 46 | #include <asm/unaligned.h> | 47 | #include <asm/unaligned.h> |
| 47 | #include <asm/dma.h> | 48 | #include <asm/dma.h> |
| 49 | #include <asm/cacheflush.h> | ||
| 48 | 50 | ||
| 49 | #include "fsl_usb2_udc.h" | 51 | #include "fsl_usb2_udc.h" |
| 50 | 52 | ||
| @@ -77,12 +79,64 @@ fsl_ep0_desc = { | |||
| 77 | static void fsl_ep_fifo_flush(struct usb_ep *_ep); | 79 | static void fsl_ep_fifo_flush(struct usb_ep *_ep); |
| 78 | 80 | ||
| 79 | #ifdef CONFIG_PPC32 | 81 | #ifdef CONFIG_PPC32 |
| 80 | #define fsl_readl(addr) in_le32(addr) | 82 | /* |
| 81 | #define fsl_writel(val32, addr) out_le32(addr, val32) | 83 | * On some SoCs, the USB controller registers can be big or little endian, |
| 82 | #else | 84 | * depending on the version of the chip. In order to be able to run the |
| 85 | * same kernel binary on 2 different versions of an SoC, the BE/LE decision | ||
| 86 | * must be made at run time. _fsl_readl and fsl_writel are pointers to the | ||
| 87 | * BE or LE readl() and writel() functions, and fsl_readl() and fsl_writel() | ||
| 88 | * call through those pointers. Platform code for SoCs that have BE USB | ||
| 89 | * registers should set pdata->big_endian_mmio flag. | ||
| 90 | * | ||
| 91 | * This also applies to controller-to-cpu accessors for the USB descriptors, | ||
| 92 | * since their endianness is also SoC dependant. Platform code for SoCs that | ||
| 93 | * have BE USB descriptors should set pdata->big_endian_desc flag. | ||
| 94 | */ | ||
| 95 | static u32 _fsl_readl_be(const unsigned __iomem *p) | ||
| 96 | { | ||
| 97 | return in_be32(p); | ||
| 98 | } | ||
| 99 | |||
| 100 | static u32 _fsl_readl_le(const unsigned __iomem *p) | ||
| 101 | { | ||
| 102 | return in_le32(p); | ||
| 103 | } | ||
| 104 | |||
| 105 | static void _fsl_writel_be(u32 v, unsigned __iomem *p) | ||
| 106 | { | ||
| 107 | out_be32(p, v); | ||
| 108 | } | ||
| 109 | |||
| 110 | static void _fsl_writel_le(u32 v, unsigned __iomem *p) | ||
| 111 | { | ||
| 112 | out_le32(p, v); | ||
| 113 | } | ||
| 114 | |||
| 115 | static u32 (*_fsl_readl)(const unsigned __iomem *p); | ||
| 116 | static void (*_fsl_writel)(u32 v, unsigned __iomem *p); | ||
| 117 | |||
| 118 | #define fsl_readl(p) (*_fsl_readl)((p)) | ||
| 119 | #define fsl_writel(v, p) (*_fsl_writel)((v), (p)) | ||
| 120 | |||
| 121 | static inline u32 cpu_to_hc32(const u32 x) | ||
| 122 | { | ||
| 123 | return udc_controller->pdata->big_endian_desc | ||
| 124 | ? (__force u32)cpu_to_be32(x) | ||
| 125 | : (__force u32)cpu_to_le32(x); | ||
| 126 | } | ||
| 127 | |||
| 128 | static inline u32 hc32_to_cpu(const u32 x) | ||
| 129 | { | ||
| 130 | return udc_controller->pdata->big_endian_desc | ||
| 131 | ? be32_to_cpu((__force __be32)x) | ||
| 132 | : le32_to_cpu((__force __le32)x); | ||
| 133 | } | ||
| 134 | #else /* !CONFIG_PPC32 */ | ||
| 83 | #define fsl_readl(addr) readl(addr) | 135 | #define fsl_readl(addr) readl(addr) |
| 84 | #define fsl_writel(val32, addr) writel(val32, addr) | 136 | #define fsl_writel(val32, addr) writel(val32, addr) |
| 85 | #endif | 137 | #define cpu_to_hc32(x) cpu_to_le32(x) |
| 138 | #define hc32_to_cpu(x) le32_to_cpu(x) | ||
| 139 | #endif /* CONFIG_PPC32 */ | ||
| 86 | 140 | ||
| 87 | /******************************************************************** | 141 | /******************************************************************** |
| 88 | * Internal Used Function | 142 | * Internal Used Function |
| @@ -177,7 +231,8 @@ static void nuke(struct fsl_ep *ep, int status) | |||
| 177 | 231 | ||
| 178 | static int dr_controller_setup(struct fsl_udc *udc) | 232 | static int dr_controller_setup(struct fsl_udc *udc) |
| 179 | { | 233 | { |
| 180 | unsigned int tmp, portctrl; | 234 | unsigned int tmp, portctrl, ep_num; |
| 235 | unsigned int max_no_of_ep; | ||
| 181 | #ifndef CONFIG_ARCH_MXC | 236 | #ifndef CONFIG_ARCH_MXC |
| 182 | unsigned int ctrl; | 237 | unsigned int ctrl; |
| 183 | #endif | 238 | #endif |
| @@ -226,9 +281,12 @@ static int dr_controller_setup(struct fsl_udc *udc) | |||
| 226 | 281 | ||
| 227 | /* Set the controller as device mode */ | 282 | /* Set the controller as device mode */ |
| 228 | tmp = fsl_readl(&dr_regs->usbmode); | 283 | tmp = fsl_readl(&dr_regs->usbmode); |
| 284 | tmp &= ~USB_MODE_CTRL_MODE_MASK; /* clear mode bits */ | ||
| 229 | tmp |= USB_MODE_CTRL_MODE_DEVICE; | 285 | tmp |= USB_MODE_CTRL_MODE_DEVICE; |
| 230 | /* Disable Setup Lockout */ | 286 | /* Disable Setup Lockout */ |
| 231 | tmp |= USB_MODE_SETUP_LOCK_OFF; | 287 | tmp |= USB_MODE_SETUP_LOCK_OFF; |
| 288 | if (udc->pdata->es) | ||
| 289 | tmp |= USB_MODE_ES; | ||
| 232 | fsl_writel(tmp, &dr_regs->usbmode); | 290 | fsl_writel(tmp, &dr_regs->usbmode); |
| 233 | 291 | ||
| 234 | /* Clear the setup status */ | 292 | /* Clear the setup status */ |
| @@ -242,22 +300,34 @@ static int dr_controller_setup(struct fsl_udc *udc) | |||
| 242 | udc->ep_qh, (int)tmp, | 300 | udc->ep_qh, (int)tmp, |
| 243 | fsl_readl(&dr_regs->endpointlistaddr)); | 301 | fsl_readl(&dr_regs->endpointlistaddr)); |
| 244 | 302 | ||
| 303 | max_no_of_ep = (0x0000001F & fsl_readl(&dr_regs->dccparams)); | ||
| 304 | for (ep_num = 1; ep_num < max_no_of_ep; ep_num++) { | ||
| 305 | tmp = fsl_readl(&dr_regs->endptctrl[ep_num]); | ||
| 306 | tmp &= ~(EPCTRL_TX_TYPE | EPCTRL_RX_TYPE); | ||
| 307 | tmp |= (EPCTRL_EP_TYPE_BULK << EPCTRL_TX_EP_TYPE_SHIFT) | ||
| 308 | | (EPCTRL_EP_TYPE_BULK << EPCTRL_RX_EP_TYPE_SHIFT); | ||
| 309 | fsl_writel(tmp, &dr_regs->endptctrl[ep_num]); | ||
| 310 | } | ||
| 245 | /* Config control enable i/o output, cpu endian register */ | 311 | /* Config control enable i/o output, cpu endian register */ |
| 246 | #ifndef CONFIG_ARCH_MXC | 312 | #ifndef CONFIG_ARCH_MXC |
| 247 | ctrl = __raw_readl(&usb_sys_regs->control); | 313 | if (udc->pdata->have_sysif_regs) { |
| 248 | ctrl |= USB_CTRL_IOENB; | 314 | ctrl = __raw_readl(&usb_sys_regs->control); |
| 249 | __raw_writel(ctrl, &usb_sys_regs->control); | 315 | ctrl |= USB_CTRL_IOENB; |
| 316 | __raw_writel(ctrl, &usb_sys_regs->control); | ||
| 317 | } | ||
| 250 | #endif | 318 | #endif |
| 251 | 319 | ||
| 252 | #if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE) | 320 | #if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE) |
| 253 | /* Turn on cache snooping hardware, since some PowerPC platforms | 321 | /* Turn on cache snooping hardware, since some PowerPC platforms |
| 254 | * wholly rely on hardware to deal with cache coherent. */ | 322 | * wholly rely on hardware to deal with cache coherent. */ |
| 255 | 323 | ||
| 256 | /* Setup Snooping for all the 4GB space */ | 324 | if (udc->pdata->have_sysif_regs) { |
| 257 | tmp = SNOOP_SIZE_2GB; /* starts from 0x0, size 2G */ | 325 | /* Setup Snooping for all the 4GB space */ |
| 258 | __raw_writel(tmp, &usb_sys_regs->snoop1); | 326 | tmp = SNOOP_SIZE_2GB; /* starts from 0x0, size 2G */ |
| 259 | tmp |= 0x80000000; /* starts from 0x8000000, size 2G */ | 327 | __raw_writel(tmp, &usb_sys_regs->snoop1); |
| 260 | __raw_writel(tmp, &usb_sys_regs->snoop2); | 328 | tmp |= 0x80000000; /* starts from 0x8000000, size 2G */ |
| 329 | __raw_writel(tmp, &usb_sys_regs->snoop2); | ||
| 330 | } | ||
| 261 | #endif | 331 | #endif |
| 262 | 332 | ||
| 263 | return 0; | 333 | return 0; |
| @@ -293,6 +363,19 @@ static void dr_controller_stop(struct fsl_udc *udc) | |||
| 293 | { | 363 | { |
| 294 | unsigned int tmp; | 364 | unsigned int tmp; |
| 295 | 365 | ||
| 366 | pr_debug("%s\n", __func__); | ||
| 367 | |||
| 368 | /* if we're in OTG mode, and the Host is currently using the port, | ||
| 369 | * stop now and don't rip the controller out from under the | ||
| 370 | * ehci driver | ||
| 371 | */ | ||
| 372 | if (udc->gadget.is_otg) { | ||
| 373 | if (!(fsl_readl(&dr_regs->otgsc) & OTGSC_STS_USB_ID)) { | ||
| 374 | pr_debug("udc: Leaving early\n"); | ||
| 375 | return; | ||
| 376 | } | ||
| 377 | } | ||
| 378 | |||
| 296 | /* disable all INTR */ | 379 | /* disable all INTR */ |
| 297 | fsl_writel(0, &dr_regs->usbintr); | 380 | fsl_writel(0, &dr_regs->usbintr); |
| 298 | 381 | ||
| @@ -318,12 +401,14 @@ static void dr_ep_setup(unsigned char ep_num, unsigned char dir, | |||
| 318 | if (ep_num) | 401 | if (ep_num) |
| 319 | tmp_epctrl |= EPCTRL_TX_DATA_TOGGLE_RST; | 402 | tmp_epctrl |= EPCTRL_TX_DATA_TOGGLE_RST; |
| 320 | tmp_epctrl |= EPCTRL_TX_ENABLE; | 403 | tmp_epctrl |= EPCTRL_TX_ENABLE; |
| 404 | tmp_epctrl &= ~EPCTRL_TX_TYPE; | ||
| 321 | tmp_epctrl |= ((unsigned int)(ep_type) | 405 | tmp_epctrl |= ((unsigned int)(ep_type) |
| 322 | << EPCTRL_TX_EP_TYPE_SHIFT); | 406 | << EPCTRL_TX_EP_TYPE_SHIFT); |
| 323 | } else { | 407 | } else { |
| 324 | if (ep_num) | 408 | if (ep_num) |
| 325 | tmp_epctrl |= EPCTRL_RX_DATA_TOGGLE_RST; | 409 | tmp_epctrl |= EPCTRL_RX_DATA_TOGGLE_RST; |
| 326 | tmp_epctrl |= EPCTRL_RX_ENABLE; | 410 | tmp_epctrl |= EPCTRL_RX_ENABLE; |
| 411 | tmp_epctrl &= ~EPCTRL_RX_TYPE; | ||
| 327 | tmp_epctrl |= ((unsigned int)(ep_type) | 412 | tmp_epctrl |= ((unsigned int)(ep_type) |
| 328 | << EPCTRL_RX_EP_TYPE_SHIFT); | 413 | << EPCTRL_RX_EP_TYPE_SHIFT); |
| 329 | } | 414 | } |
| @@ -409,7 +494,7 @@ static void struct_ep_qh_setup(struct fsl_udc *udc, unsigned char ep_num, | |||
| 409 | if (zlt) | 494 | if (zlt) |
| 410 | tmp |= EP_QUEUE_HEAD_ZLT_SEL; | 495 | tmp |= EP_QUEUE_HEAD_ZLT_SEL; |
| 411 | 496 | ||
| 412 | p_QH->max_pkt_length = cpu_to_le32(tmp); | 497 | p_QH->max_pkt_length = cpu_to_hc32(tmp); |
| 413 | p_QH->next_dtd_ptr = 1; | 498 | p_QH->next_dtd_ptr = 1; |
| 414 | p_QH->size_ioc_int_sts = 0; | 499 | p_QH->size_ioc_int_sts = 0; |
| 415 | } | 500 | } |
| @@ -546,10 +631,13 @@ static int fsl_ep_disable(struct usb_ep *_ep) | |||
| 546 | /* disable ep on controller */ | 631 | /* disable ep on controller */ |
| 547 | ep_num = ep_index(ep); | 632 | ep_num = ep_index(ep); |
| 548 | epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]); | 633 | epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]); |
| 549 | if (ep_is_in(ep)) | 634 | if (ep_is_in(ep)) { |
| 550 | epctrl &= ~EPCTRL_TX_ENABLE; | 635 | epctrl &= ~(EPCTRL_TX_ENABLE | EPCTRL_TX_TYPE); |
| 551 | else | 636 | epctrl |= EPCTRL_EP_TYPE_BULK << EPCTRL_TX_EP_TYPE_SHIFT; |
| 552 | epctrl &= ~EPCTRL_RX_ENABLE; | 637 | } else { |
| 638 | epctrl &= ~(EPCTRL_RX_ENABLE | EPCTRL_TX_TYPE); | ||
| 639 | epctrl |= EPCTRL_EP_TYPE_BULK << EPCTRL_RX_EP_TYPE_SHIFT; | ||
| 640 | } | ||
| 553 | fsl_writel(epctrl, &dr_regs->endptctrl[ep_num]); | 641 | fsl_writel(epctrl, &dr_regs->endptctrl[ep_num]); |
| 554 | 642 | ||
| 555 | udc = (struct fsl_udc *)ep->udc; | 643 | udc = (struct fsl_udc *)ep->udc; |
| @@ -616,7 +704,7 @@ static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req) | |||
| 616 | struct fsl_req *lastreq; | 704 | struct fsl_req *lastreq; |
| 617 | lastreq = list_entry(ep->queue.prev, struct fsl_req, queue); | 705 | lastreq = list_entry(ep->queue.prev, struct fsl_req, queue); |
| 618 | lastreq->tail->next_td_ptr = | 706 | lastreq->tail->next_td_ptr = |
| 619 | cpu_to_le32(req->head->td_dma & DTD_ADDR_MASK); | 707 | cpu_to_hc32(req->head->td_dma & DTD_ADDR_MASK); |
| 620 | /* Read prime bit, if 1 goto done */ | 708 | /* Read prime bit, if 1 goto done */ |
| 621 | if (fsl_readl(&dr_regs->endpointprime) & bitmask) | 709 | if (fsl_readl(&dr_regs->endpointprime) & bitmask) |
| 622 | goto out; | 710 | goto out; |
| @@ -641,10 +729,10 @@ static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req) | |||
| 641 | 729 | ||
| 642 | /* Write dQH next pointer and terminate bit to 0 */ | 730 | /* Write dQH next pointer and terminate bit to 0 */ |
| 643 | temp = req->head->td_dma & EP_QUEUE_HEAD_NEXT_POINTER_MASK; | 731 | temp = req->head->td_dma & EP_QUEUE_HEAD_NEXT_POINTER_MASK; |
| 644 | dQH->next_dtd_ptr = cpu_to_le32(temp); | 732 | dQH->next_dtd_ptr = cpu_to_hc32(temp); |
| 645 | 733 | ||
| 646 | /* Clear active and halt bit */ | 734 | /* Clear active and halt bit */ |
| 647 | temp = cpu_to_le32(~(EP_QUEUE_HEAD_STATUS_ACTIVE | 735 | temp = cpu_to_hc32(~(EP_QUEUE_HEAD_STATUS_ACTIVE |
| 648 | | EP_QUEUE_HEAD_STATUS_HALT)); | 736 | | EP_QUEUE_HEAD_STATUS_HALT)); |
| 649 | dQH->size_ioc_int_sts &= temp; | 737 | dQH->size_ioc_int_sts &= temp; |
| 650 | 738 | ||
| @@ -682,17 +770,17 @@ static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length, | |||
| 682 | 770 | ||
| 683 | dtd->td_dma = *dma; | 771 | dtd->td_dma = *dma; |
| 684 | /* Clear reserved field */ | 772 | /* Clear reserved field */ |
| 685 | swap_temp = cpu_to_le32(dtd->size_ioc_sts); | 773 | swap_temp = hc32_to_cpu(dtd->size_ioc_sts); |
| 686 | swap_temp &= ~DTD_RESERVED_FIELDS; | 774 | swap_temp &= ~DTD_RESERVED_FIELDS; |
| 687 | dtd->size_ioc_sts = cpu_to_le32(swap_temp); | 775 | dtd->size_ioc_sts = cpu_to_hc32(swap_temp); |
| 688 | 776 | ||
| 689 | /* Init all of buffer page pointers */ | 777 | /* Init all of buffer page pointers */ |
| 690 | swap_temp = (u32) (req->req.dma + req->req.actual); | 778 | swap_temp = (u32) (req->req.dma + req->req.actual); |
| 691 | dtd->buff_ptr0 = cpu_to_le32(swap_temp); | 779 | dtd->buff_ptr0 = cpu_to_hc32(swap_temp); |
| 692 | dtd->buff_ptr1 = cpu_to_le32(swap_temp + 0x1000); | 780 | dtd->buff_ptr1 = cpu_to_hc32(swap_temp + 0x1000); |
| 693 | dtd->buff_ptr2 = cpu_to_le32(swap_temp + 0x2000); | 781 | dtd->buff_ptr2 = cpu_to_hc32(swap_temp + 0x2000); |
| 694 | dtd->buff_ptr3 = cpu_to_le32(swap_temp + 0x3000); | 782 | dtd->buff_ptr3 = cpu_to_hc32(swap_temp + 0x3000); |
| 695 | dtd->buff_ptr4 = cpu_to_le32(swap_temp + 0x4000); | 783 | dtd->buff_ptr4 = cpu_to_hc32(swap_temp + 0x4000); |
| 696 | 784 | ||
| 697 | req->req.actual += *length; | 785 | req->req.actual += *length; |
| 698 | 786 | ||
| @@ -716,7 +804,7 @@ static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length, | |||
| 716 | if (*is_last && !req->req.no_interrupt) | 804 | if (*is_last && !req->req.no_interrupt) |
| 717 | swap_temp |= DTD_IOC; | 805 | swap_temp |= DTD_IOC; |
| 718 | 806 | ||
| 719 | dtd->size_ioc_sts = cpu_to_le32(swap_temp); | 807 | dtd->size_ioc_sts = cpu_to_hc32(swap_temp); |
| 720 | 808 | ||
| 721 | mb(); | 809 | mb(); |
| 722 | 810 | ||
| @@ -743,7 +831,7 @@ static int fsl_req_to_dtd(struct fsl_req *req) | |||
| 743 | is_first = 0; | 831 | is_first = 0; |
| 744 | req->head = dtd; | 832 | req->head = dtd; |
| 745 | } else { | 833 | } else { |
| 746 | last_dtd->next_td_ptr = cpu_to_le32(dma); | 834 | last_dtd->next_td_ptr = cpu_to_hc32(dma); |
| 747 | last_dtd->next_td_virt = dtd; | 835 | last_dtd->next_td_virt = dtd; |
| 748 | } | 836 | } |
| 749 | last_dtd = dtd; | 837 | last_dtd = dtd; |
| @@ -751,7 +839,7 @@ static int fsl_req_to_dtd(struct fsl_req *req) | |||
| 751 | req->dtd_count++; | 839 | req->dtd_count++; |
| 752 | } while (!is_last); | 840 | } while (!is_last); |
| 753 | 841 | ||
| 754 | dtd->next_td_ptr = cpu_to_le32(DTD_NEXT_TERMINATE); | 842 | dtd->next_td_ptr = cpu_to_hc32(DTD_NEXT_TERMINATE); |
| 755 | 843 | ||
| 756 | req->tail = dtd; | 844 | req->tail = dtd; |
| 757 | 845 | ||
| @@ -962,6 +1050,36 @@ out: | |||
| 962 | return status; | 1050 | return status; |
| 963 | } | 1051 | } |
| 964 | 1052 | ||
| 1053 | static int fsl_ep_fifo_status(struct usb_ep *_ep) | ||
| 1054 | { | ||
| 1055 | struct fsl_ep *ep; | ||
| 1056 | struct fsl_udc *udc; | ||
| 1057 | int size = 0; | ||
| 1058 | u32 bitmask; | ||
| 1059 | struct ep_queue_head *d_qh; | ||
| 1060 | |||
| 1061 | ep = container_of(_ep, struct fsl_ep, ep); | ||
| 1062 | if (!_ep || (!ep->desc && ep_index(ep) != 0)) | ||
| 1063 | return -ENODEV; | ||
| 1064 | |||
| 1065 | udc = (struct fsl_udc *)ep->udc; | ||
| 1066 | |||
| 1067 | if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) | ||
| 1068 | return -ESHUTDOWN; | ||
| 1069 | |||
| 1070 | d_qh = &ep->udc->ep_qh[ep_index(ep) * 2 + ep_is_in(ep)]; | ||
| 1071 | |||
| 1072 | bitmask = (ep_is_in(ep)) ? (1 << (ep_index(ep) + 16)) : | ||
| 1073 | (1 << (ep_index(ep))); | ||
| 1074 | |||
| 1075 | if (fsl_readl(&dr_regs->endptstatus) & bitmask) | ||
| 1076 | size = (d_qh->size_ioc_int_sts & DTD_PACKET_SIZE) | ||
| 1077 | >> DTD_LENGTH_BIT_POS; | ||
| 1078 | |||
| 1079 | pr_debug("%s %u\n", __func__, size); | ||
| 1080 | return size; | ||
| 1081 | } | ||
| 1082 | |||
| 965 | static void fsl_ep_fifo_flush(struct usb_ep *_ep) | 1083 | static void fsl_ep_fifo_flush(struct usb_ep *_ep) |
| 966 | { | 1084 | { |
| 967 | struct fsl_ep *ep; | 1085 | struct fsl_ep *ep; |
| @@ -1014,6 +1132,7 @@ static struct usb_ep_ops fsl_ep_ops = { | |||
| 1014 | .dequeue = fsl_ep_dequeue, | 1132 | .dequeue = fsl_ep_dequeue, |
| 1015 | 1133 | ||
| 1016 | .set_halt = fsl_ep_set_halt, | 1134 | .set_halt = fsl_ep_set_halt, |
| 1135 | .fifo_status = fsl_ep_fifo_status, | ||
| 1017 | .fifo_flush = fsl_ep_fifo_flush, /* flush fifo */ | 1136 | .fifo_flush = fsl_ep_fifo_flush, /* flush fifo */ |
| 1018 | }; | 1137 | }; |
| 1019 | 1138 | ||
| @@ -1228,6 +1347,10 @@ static void ch9getstatus(struct fsl_udc *udc, u8 request_type, u16 value, | |||
| 1228 | req = udc->status_req; | 1347 | req = udc->status_req; |
| 1229 | /* Fill in the reqest structure */ | 1348 | /* Fill in the reqest structure */ |
| 1230 | *((u16 *) req->req.buf) = cpu_to_le16(tmp); | 1349 | *((u16 *) req->req.buf) = cpu_to_le16(tmp); |
| 1350 | |||
| 1351 | /* flush cache for the req buffer */ | ||
| 1352 | flush_dcache_range((u32)req->req.buf, (u32)req->req.buf + 8); | ||
| 1353 | |||
| 1231 | req->ep = ep; | 1354 | req->ep = ep; |
| 1232 | req->req.length = 2; | 1355 | req->req.length = 2; |
| 1233 | req->req.status = -EINPROGRESS; | 1356 | req->req.status = -EINPROGRESS; |
| @@ -1280,6 +1403,7 @@ static void setup_received_irq(struct fsl_udc *udc, | |||
| 1280 | /* Status phase from udc */ | 1403 | /* Status phase from udc */ |
| 1281 | { | 1404 | { |
| 1282 | int rc = -EOPNOTSUPP; | 1405 | int rc = -EOPNOTSUPP; |
| 1406 | u16 ptc = 0; | ||
| 1283 | 1407 | ||
| 1284 | if ((setup->bRequestType & (USB_RECIP_MASK | USB_TYPE_MASK)) | 1408 | if ((setup->bRequestType & (USB_RECIP_MASK | USB_TYPE_MASK)) |
| 1285 | == (USB_RECIP_ENDPOINT | USB_TYPE_STANDARD)) { | 1409 | == (USB_RECIP_ENDPOINT | USB_TYPE_STANDARD)) { |
| @@ -1301,17 +1425,19 @@ static void setup_received_irq(struct fsl_udc *udc, | |||
| 1301 | | USB_TYPE_STANDARD)) { | 1425 | | USB_TYPE_STANDARD)) { |
| 1302 | /* Note: The driver has not include OTG support yet. | 1426 | /* Note: The driver has not include OTG support yet. |
| 1303 | * This will be set when OTG support is added */ | 1427 | * This will be set when OTG support is added */ |
| 1304 | if (!gadget_is_otg(&udc->gadget)) | 1428 | if (wValue == USB_DEVICE_TEST_MODE) |
| 1305 | break; | 1429 | ptc = wIndex >> 8; |
| 1306 | else if (setup->bRequest == USB_DEVICE_B_HNP_ENABLE) | 1430 | else if (gadget_is_otg(&udc->gadget)) { |
| 1307 | udc->gadget.b_hnp_enable = 1; | 1431 | if (setup->bRequest == |
| 1308 | else if (setup->bRequest == USB_DEVICE_A_HNP_SUPPORT) | 1432 | USB_DEVICE_B_HNP_ENABLE) |
| 1309 | udc->gadget.a_hnp_support = 1; | 1433 | udc->gadget.b_hnp_enable = 1; |
| 1310 | else if (setup->bRequest == | 1434 | else if (setup->bRequest == |
| 1311 | USB_DEVICE_A_ALT_HNP_SUPPORT) | 1435 | USB_DEVICE_A_HNP_SUPPORT) |
| 1312 | udc->gadget.a_alt_hnp_support = 1; | 1436 | udc->gadget.a_hnp_support = 1; |
| 1313 | else | 1437 | else if (setup->bRequest == |
| 1314 | break; | 1438 | USB_DEVICE_A_ALT_HNP_SUPPORT) |
| 1439 | udc->gadget.a_alt_hnp_support = 1; | ||
| 1440 | } | ||
| 1315 | rc = 0; | 1441 | rc = 0; |
| 1316 | } else | 1442 | } else |
| 1317 | break; | 1443 | break; |
| @@ -1320,6 +1446,15 @@ static void setup_received_irq(struct fsl_udc *udc, | |||
| 1320 | if (ep0_prime_status(udc, EP_DIR_IN)) | 1446 | if (ep0_prime_status(udc, EP_DIR_IN)) |
| 1321 | ep0stall(udc); | 1447 | ep0stall(udc); |
| 1322 | } | 1448 | } |
| 1449 | if (ptc) { | ||
| 1450 | u32 tmp; | ||
| 1451 | |||
| 1452 | mdelay(10); | ||
| 1453 | tmp = fsl_readl(&dr_regs->portsc1) | (ptc << 16); | ||
| 1454 | fsl_writel(tmp, &dr_regs->portsc1); | ||
| 1455 | printk(KERN_INFO "udc: switch to test mode %d.\n", ptc); | ||
| 1456 | } | ||
| 1457 | |||
| 1323 | return; | 1458 | return; |
| 1324 | } | 1459 | } |
| 1325 | 1460 | ||
| @@ -1394,6 +1529,7 @@ static void tripwire_handler(struct fsl_udc *udc, u8 ep_num, u8 *buffer_ptr) | |||
| 1394 | { | 1529 | { |
| 1395 | u32 temp; | 1530 | u32 temp; |
| 1396 | struct ep_queue_head *qh; | 1531 | struct ep_queue_head *qh; |
| 1532 | struct fsl_usb2_platform_data *pdata = udc->pdata; | ||
| 1397 | 1533 | ||
| 1398 | qh = &udc->ep_qh[ep_num * 2 + EP_DIR_OUT]; | 1534 | qh = &udc->ep_qh[ep_num * 2 + EP_DIR_OUT]; |
| 1399 | 1535 | ||
| @@ -1408,7 +1544,16 @@ static void tripwire_handler(struct fsl_udc *udc, u8 ep_num, u8 *buffer_ptr) | |||
| 1408 | fsl_writel(temp | USB_CMD_SUTW, &dr_regs->usbcmd); | 1544 | fsl_writel(temp | USB_CMD_SUTW, &dr_regs->usbcmd); |
| 1409 | 1545 | ||
| 1410 | /* Copy the setup packet to local buffer */ | 1546 | /* Copy the setup packet to local buffer */ |
| 1411 | memcpy(buffer_ptr, (u8 *) qh->setup_buffer, 8); | 1547 | if (pdata->le_setup_buf) { |
| 1548 | u32 *p = (u32 *)buffer_ptr; | ||
| 1549 | u32 *s = (u32 *)qh->setup_buffer; | ||
| 1550 | |||
| 1551 | /* Convert little endian setup buffer to CPU endian */ | ||
| 1552 | *p++ = le32_to_cpu(*s++); | ||
| 1553 | *p = le32_to_cpu(*s); | ||
| 1554 | } else { | ||
| 1555 | memcpy(buffer_ptr, (u8 *) qh->setup_buffer, 8); | ||
| 1556 | } | ||
| 1412 | } while (!(fsl_readl(&dr_regs->usbcmd) & USB_CMD_SUTW)); | 1557 | } while (!(fsl_readl(&dr_regs->usbcmd) & USB_CMD_SUTW)); |
| 1413 | 1558 | ||
| 1414 | /* Clear Setup Tripwire */ | 1559 | /* Clear Setup Tripwire */ |
| @@ -1432,19 +1577,19 @@ static int process_ep_req(struct fsl_udc *udc, int pipe, | |||
| 1432 | actual = curr_req->req.length; | 1577 | actual = curr_req->req.length; |
| 1433 | 1578 | ||
| 1434 | for (j = 0; j < curr_req->dtd_count; j++) { | 1579 | for (j = 0; j < curr_req->dtd_count; j++) { |
| 1435 | remaining_length = (le32_to_cpu(curr_td->size_ioc_sts) | 1580 | remaining_length = (hc32_to_cpu(curr_td->size_ioc_sts) |
| 1436 | & DTD_PACKET_SIZE) | 1581 | & DTD_PACKET_SIZE) |
| 1437 | >> DTD_LENGTH_BIT_POS; | 1582 | >> DTD_LENGTH_BIT_POS; |
| 1438 | actual -= remaining_length; | 1583 | actual -= remaining_length; |
| 1439 | 1584 | ||
| 1440 | if ((errors = le32_to_cpu(curr_td->size_ioc_sts) & | 1585 | errors = hc32_to_cpu(curr_td->size_ioc_sts); |
| 1441 | DTD_ERROR_MASK)) { | 1586 | if (errors & DTD_ERROR_MASK) { |
| 1442 | if (errors & DTD_STATUS_HALTED) { | 1587 | if (errors & DTD_STATUS_HALTED) { |
| 1443 | ERR("dTD error %08x QH=%d\n", errors, pipe); | 1588 | ERR("dTD error %08x QH=%d\n", errors, pipe); |
| 1444 | /* Clear the errors and Halt condition */ | 1589 | /* Clear the errors and Halt condition */ |
| 1445 | tmp = le32_to_cpu(curr_qh->size_ioc_int_sts); | 1590 | tmp = hc32_to_cpu(curr_qh->size_ioc_int_sts); |
| 1446 | tmp &= ~errors; | 1591 | tmp &= ~errors; |
| 1447 | curr_qh->size_ioc_int_sts = cpu_to_le32(tmp); | 1592 | curr_qh->size_ioc_int_sts = cpu_to_hc32(tmp); |
| 1448 | status = -EPIPE; | 1593 | status = -EPIPE; |
| 1449 | /* FIXME: continue with next queued TD? */ | 1594 | /* FIXME: continue with next queued TD? */ |
| 1450 | 1595 | ||
| @@ -1462,7 +1607,7 @@ static int process_ep_req(struct fsl_udc *udc, int pipe, | |||
| 1462 | ERR("Unknown error has occurred (0x%x)!\n", | 1607 | ERR("Unknown error has occurred (0x%x)!\n", |
| 1463 | errors); | 1608 | errors); |
| 1464 | 1609 | ||
| 1465 | } else if (le32_to_cpu(curr_td->size_ioc_sts) | 1610 | } else if (hc32_to_cpu(curr_td->size_ioc_sts) |
| 1466 | & DTD_STATUS_ACTIVE) { | 1611 | & DTD_STATUS_ACTIVE) { |
| 1467 | VDBG("Request not complete"); | 1612 | VDBG("Request not complete"); |
| 1468 | status = REQ_UNCOMPLETE; | 1613 | status = REQ_UNCOMPLETE; |
| @@ -1551,6 +1696,9 @@ static void port_change_irq(struct fsl_udc *udc) | |||
| 1551 | { | 1696 | { |
| 1552 | u32 speed; | 1697 | u32 speed; |
| 1553 | 1698 | ||
| 1699 | if (udc->bus_reset) | ||
| 1700 | udc->bus_reset = 0; | ||
| 1701 | |||
| 1554 | /* Bus resetting is finished */ | 1702 | /* Bus resetting is finished */ |
| 1555 | if (!(fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET)) { | 1703 | if (!(fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET)) { |
| 1556 | /* Get the speed */ | 1704 | /* Get the speed */ |
| @@ -1658,6 +1806,8 @@ static void reset_irq(struct fsl_udc *udc) | |||
| 1658 | 1806 | ||
| 1659 | if (fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET) { | 1807 | if (fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET) { |
| 1660 | VDBG("Bus reset"); | 1808 | VDBG("Bus reset"); |
| 1809 | /* Bus is reseting */ | ||
| 1810 | udc->bus_reset = 1; | ||
| 1661 | /* Reset all the queues, include XD, dTD, EP queue | 1811 | /* Reset all the queues, include XD, dTD, EP queue |
| 1662 | * head and TR Queue */ | 1812 | * head and TR Queue */ |
| 1663 | reset_queues(udc); | 1813 | reset_queues(udc); |
| @@ -1735,6 +1885,7 @@ static irqreturn_t fsl_udc_irq(int irq, void *_udc) | |||
| 1735 | 1885 | ||
| 1736 | /* Reset Received */ | 1886 | /* Reset Received */ |
| 1737 | if (irq_src & USB_STS_RESET) { | 1887 | if (irq_src & USB_STS_RESET) { |
| 1888 | VDBG("reset int"); | ||
| 1738 | reset_irq(udc); | 1889 | reset_irq(udc); |
| 1739 | status = IRQ_HANDLED; | 1890 | status = IRQ_HANDLED; |
| 1740 | } | 1891 | } |
| @@ -1792,11 +1943,30 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver, | |||
| 1792 | goto out; | 1943 | goto out; |
| 1793 | } | 1944 | } |
| 1794 | 1945 | ||
| 1795 | /* Enable DR IRQ reg and Set usbcmd reg Run bit */ | 1946 | if (udc_controller->transceiver) { |
| 1796 | dr_controller_run(udc_controller); | 1947 | /* Suspend the controller until OTG enable it */ |
| 1797 | udc_controller->usb_state = USB_STATE_ATTACHED; | 1948 | udc_controller->stopped = 1; |
| 1798 | udc_controller->ep0_state = WAIT_FOR_SETUP; | 1949 | printk(KERN_INFO "Suspend udc for OTG auto detect\n"); |
| 1799 | udc_controller->ep0_dir = 0; | 1950 | |
| 1951 | /* connect to bus through transceiver */ | ||
| 1952 | if (udc_controller->transceiver) { | ||
| 1953 | retval = otg_set_peripheral(udc_controller->transceiver, | ||
| 1954 | &udc_controller->gadget); | ||
| 1955 | if (retval < 0) { | ||
| 1956 | ERR("can't bind to transceiver\n"); | ||
| 1957 | driver->unbind(&udc_controller->gadget); | ||
| 1958 | udc_controller->gadget.dev.driver = 0; | ||
| 1959 | udc_controller->driver = 0; | ||
| 1960 | return retval; | ||
| 1961 | } | ||
| 1962 | } | ||
| 1963 | } else { | ||
| 1964 | /* Enable DR IRQ reg and set USBCMD reg Run bit */ | ||
| 1965 | dr_controller_run(udc_controller); | ||
| 1966 | udc_controller->usb_state = USB_STATE_ATTACHED; | ||
| 1967 | udc_controller->ep0_state = WAIT_FOR_SETUP; | ||
| 1968 | udc_controller->ep0_dir = 0; | ||
| 1969 | } | ||
| 1800 | printk(KERN_INFO "%s: bind to driver %s\n", | 1970 | printk(KERN_INFO "%s: bind to driver %s\n", |
| 1801 | udc_controller->gadget.name, driver->driver.name); | 1971 | udc_controller->gadget.name, driver->driver.name); |
| 1802 | 1972 | ||
| @@ -2044,16 +2214,18 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count, | |||
| 2044 | next += t; | 2214 | next += t; |
| 2045 | 2215 | ||
| 2046 | #ifndef CONFIG_ARCH_MXC | 2216 | #ifndef CONFIG_ARCH_MXC |
| 2047 | tmp_reg = usb_sys_regs->snoop1; | 2217 | if (udc->pdata->have_sysif_regs) { |
| 2048 | t = scnprintf(next, size, "Snoop1 Reg : = [0x%x]\n\n", tmp_reg); | 2218 | tmp_reg = usb_sys_regs->snoop1; |
| 2049 | size -= t; | 2219 | t = scnprintf(next, size, "Snoop1 Reg : = [0x%x]\n\n", tmp_reg); |
| 2050 | next += t; | 2220 | size -= t; |
| 2221 | next += t; | ||
| 2051 | 2222 | ||
| 2052 | tmp_reg = usb_sys_regs->control; | 2223 | tmp_reg = usb_sys_regs->control; |
| 2053 | t = scnprintf(next, size, "General Control Reg : = [0x%x]\n\n", | 2224 | t = scnprintf(next, size, "General Control Reg : = [0x%x]\n\n", |
| 2054 | tmp_reg); | 2225 | tmp_reg); |
| 2055 | size -= t; | 2226 | size -= t; |
| 2056 | next += t; | 2227 | next += t; |
| 2228 | } | ||
| 2057 | #endif | 2229 | #endif |
| 2058 | 2230 | ||
| 2059 | /* ------fsl_udc, fsl_ep, fsl_request structure information ----- */ | 2231 | /* ------fsl_udc, fsl_ep, fsl_request structure information ----- */ |
| @@ -2233,6 +2405,7 @@ static int __init struct_ep_setup(struct fsl_udc *udc, unsigned char index, | |||
| 2233 | */ | 2405 | */ |
| 2234 | static int __init fsl_udc_probe(struct platform_device *pdev) | 2406 | static int __init fsl_udc_probe(struct platform_device *pdev) |
| 2235 | { | 2407 | { |
| 2408 | struct fsl_usb2_platform_data *pdata; | ||
| 2236 | struct resource *res; | 2409 | struct resource *res; |
| 2237 | int ret = -ENODEV; | 2410 | int ret = -ENODEV; |
| 2238 | unsigned int i; | 2411 | unsigned int i; |
| @@ -2249,20 +2422,35 @@ static int __init fsl_udc_probe(struct platform_device *pdev) | |||
| 2249 | return -ENOMEM; | 2422 | return -ENOMEM; |
| 2250 | } | 2423 | } |
| 2251 | 2424 | ||
| 2425 | pdata = pdev->dev.platform_data; | ||
| 2426 | udc_controller->pdata = pdata; | ||
| 2252 | spin_lock_init(&udc_controller->lock); | 2427 | spin_lock_init(&udc_controller->lock); |
| 2253 | udc_controller->stopped = 1; | 2428 | udc_controller->stopped = 1; |
| 2254 | 2429 | ||
| 2430 | #ifdef CONFIG_USB_OTG | ||
| 2431 | if (pdata->operating_mode == FSL_USB2_DR_OTG) { | ||
| 2432 | udc_controller->transceiver = otg_get_transceiver(); | ||
| 2433 | if (!udc_controller->transceiver) { | ||
| 2434 | ERR("Can't find OTG driver!\n"); | ||
| 2435 | ret = -ENODEV; | ||
| 2436 | goto err_kfree; | ||
| 2437 | } | ||
| 2438 | } | ||
| 2439 | #endif | ||
| 2440 | |||
| 2255 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 2441 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 2256 | if (!res) { | 2442 | if (!res) { |
| 2257 | ret = -ENXIO; | 2443 | ret = -ENXIO; |
| 2258 | goto err_kfree; | 2444 | goto err_kfree; |
| 2259 | } | 2445 | } |
| 2260 | 2446 | ||
| 2261 | if (!request_mem_region(res->start, res->end - res->start + 1, | 2447 | if (pdata->operating_mode == FSL_USB2_DR_DEVICE) { |
| 2262 | driver_name)) { | 2448 | if (!request_mem_region(res->start, res->end - res->start + 1, |
| 2263 | ERR("request mem region for %s failed\n", pdev->name); | 2449 | driver_name)) { |
| 2264 | ret = -EBUSY; | 2450 | ERR("request mem region for %s failed\n", pdev->name); |
| 2265 | goto err_kfree; | 2451 | ret = -EBUSY; |
| 2452 | goto err_kfree; | ||
| 2453 | } | ||
| 2266 | } | 2454 | } |
| 2267 | 2455 | ||
| 2268 | dr_regs = ioremap(res->start, resource_size(res)); | 2456 | dr_regs = ioremap(res->start, resource_size(res)); |
| @@ -2271,9 +2459,29 @@ static int __init fsl_udc_probe(struct platform_device *pdev) | |||
| 2271 | goto err_release_mem_region; | 2459 | goto err_release_mem_region; |
| 2272 | } | 2460 | } |
| 2273 | 2461 | ||
| 2462 | pdata->regs = (void *)dr_regs; | ||
| 2463 | |||
| 2464 | /* | ||
| 2465 | * do platform specific init: check the clock, grab/config pins, etc. | ||
| 2466 | */ | ||
| 2467 | if (pdata->init && pdata->init(pdev)) { | ||
| 2468 | ret = -ENODEV; | ||
| 2469 | goto err_iounmap_noclk; | ||
| 2470 | } | ||
| 2471 | |||
| 2472 | /* Set accessors only after pdata->init() ! */ | ||
| 2473 | if (pdata->big_endian_mmio) { | ||
| 2474 | _fsl_readl = _fsl_readl_be; | ||
| 2475 | _fsl_writel = _fsl_writel_be; | ||
| 2476 | } else { | ||
| 2477 | _fsl_readl = _fsl_readl_le; | ||
| 2478 | _fsl_writel = _fsl_writel_le; | ||
| 2479 | } | ||
| 2480 | |||
| 2274 | #ifndef CONFIG_ARCH_MXC | 2481 | #ifndef CONFIG_ARCH_MXC |
| 2275 | usb_sys_regs = (struct usb_sys_interface *) | 2482 | if (pdata->have_sysif_regs) |
| 2276 | ((u32)dr_regs + USB_DR_SYS_OFFSET); | 2483 | usb_sys_regs = (struct usb_sys_interface *) |
| 2484 | ((u32)dr_regs + USB_DR_SYS_OFFSET); | ||
| 2277 | #endif | 2485 | #endif |
| 2278 | 2486 | ||
| 2279 | /* Initialize USB clocks */ | 2487 | /* Initialize USB clocks */ |
| @@ -2313,9 +2521,11 @@ static int __init fsl_udc_probe(struct platform_device *pdev) | |||
| 2313 | goto err_free_irq; | 2521 | goto err_free_irq; |
| 2314 | } | 2522 | } |
| 2315 | 2523 | ||
| 2316 | /* initialize usb hw reg except for regs for EP, | 2524 | if (!udc_controller->transceiver) { |
| 2317 | * leave usbintr reg untouched */ | 2525 | /* initialize usb hw reg except for regs for EP, |
| 2318 | dr_controller_setup(udc_controller); | 2526 | * leave usbintr reg untouched */ |
| 2527 | dr_controller_setup(udc_controller); | ||
| 2528 | } | ||
| 2319 | 2529 | ||
| 2320 | fsl_udc_clk_finalize(pdev); | 2530 | fsl_udc_clk_finalize(pdev); |
| 2321 | 2531 | ||
| @@ -2335,6 +2545,9 @@ static int __init fsl_udc_probe(struct platform_device *pdev) | |||
| 2335 | if (ret < 0) | 2545 | if (ret < 0) |
| 2336 | goto err_free_irq; | 2546 | goto err_free_irq; |
| 2337 | 2547 | ||
| 2548 | if (udc_controller->transceiver) | ||
| 2549 | udc_controller->gadget.is_otg = 1; | ||
| 2550 | |||
| 2338 | /* setup QH and epctrl for ep0 */ | 2551 | /* setup QH and epctrl for ep0 */ |
| 2339 | ep0_setup(udc_controller); | 2552 | ep0_setup(udc_controller); |
| 2340 | 2553 | ||
| @@ -2373,11 +2586,14 @@ err_unregister: | |||
| 2373 | err_free_irq: | 2586 | err_free_irq: |
| 2374 | free_irq(udc_controller->irq, udc_controller); | 2587 | free_irq(udc_controller->irq, udc_controller); |
| 2375 | err_iounmap: | 2588 | err_iounmap: |
| 2589 | if (pdata->exit) | ||
| 2590 | pdata->exit(pdev); | ||
| 2376 | fsl_udc_clk_release(); | 2591 | fsl_udc_clk_release(); |
| 2377 | err_iounmap_noclk: | 2592 | err_iounmap_noclk: |
| 2378 | iounmap(dr_regs); | 2593 | iounmap(dr_regs); |
| 2379 | err_release_mem_region: | 2594 | err_release_mem_region: |
| 2380 | release_mem_region(res->start, res->end - res->start + 1); | 2595 | if (pdata->operating_mode == FSL_USB2_DR_DEVICE) |
| 2596 | release_mem_region(res->start, res->end - res->start + 1); | ||
| 2381 | err_kfree: | 2597 | err_kfree: |
| 2382 | kfree(udc_controller); | 2598 | kfree(udc_controller); |
| 2383 | udc_controller = NULL; | 2599 | udc_controller = NULL; |
| @@ -2390,6 +2606,7 @@ err_kfree: | |||
| 2390 | static int __exit fsl_udc_remove(struct platform_device *pdev) | 2606 | static int __exit fsl_udc_remove(struct platform_device *pdev) |
| 2391 | { | 2607 | { |
| 2392 | struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 2608 | struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 2609 | struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; | ||
| 2393 | 2610 | ||
| 2394 | DECLARE_COMPLETION(done); | 2611 | DECLARE_COMPLETION(done); |
| 2395 | 2612 | ||
| @@ -2410,12 +2627,20 @@ static int __exit fsl_udc_remove(struct platform_device *pdev) | |||
| 2410 | dma_pool_destroy(udc_controller->td_pool); | 2627 | dma_pool_destroy(udc_controller->td_pool); |
| 2411 | free_irq(udc_controller->irq, udc_controller); | 2628 | free_irq(udc_controller->irq, udc_controller); |
| 2412 | iounmap(dr_regs); | 2629 | iounmap(dr_regs); |
| 2413 | release_mem_region(res->start, res->end - res->start + 1); | 2630 | if (pdata->operating_mode == FSL_USB2_DR_DEVICE) |
| 2631 | release_mem_region(res->start, res->end - res->start + 1); | ||
| 2414 | 2632 | ||
| 2415 | device_unregister(&udc_controller->gadget.dev); | 2633 | device_unregister(&udc_controller->gadget.dev); |
| 2416 | /* free udc --wait for the release() finished */ | 2634 | /* free udc --wait for the release() finished */ |
| 2417 | wait_for_completion(&done); | 2635 | wait_for_completion(&done); |
| 2418 | 2636 | ||
| 2637 | /* | ||
| 2638 | * do platform specific un-initialization: | ||
| 2639 | * release iomux pins, etc. | ||
| 2640 | */ | ||
| 2641 | if (pdata->exit) | ||
| 2642 | pdata->exit(pdev); | ||
| 2643 | |||
| 2419 | return 0; | 2644 | return 0; |
| 2420 | } | 2645 | } |
| 2421 | 2646 | ||
| @@ -2446,6 +2671,62 @@ static int fsl_udc_resume(struct platform_device *pdev) | |||
| 2446 | return 0; | 2671 | return 0; |
| 2447 | } | 2672 | } |
| 2448 | 2673 | ||
| 2674 | static int fsl_udc_otg_suspend(struct device *dev, pm_message_t state) | ||
| 2675 | { | ||
| 2676 | struct fsl_udc *udc = udc_controller; | ||
| 2677 | u32 mode, usbcmd; | ||
| 2678 | |||
| 2679 | mode = fsl_readl(&dr_regs->usbmode) & USB_MODE_CTRL_MODE_MASK; | ||
| 2680 | |||
| 2681 | pr_debug("%s(): mode 0x%x stopped %d\n", __func__, mode, udc->stopped); | ||
| 2682 | |||
| 2683 | /* | ||
| 2684 | * If the controller is already stopped, then this must be a | ||
| 2685 | * PM suspend. Remember this fact, so that we will leave the | ||
| 2686 | * controller stopped at PM resume time. | ||
| 2687 | */ | ||
| 2688 | if (udc->stopped) { | ||
| 2689 | pr_debug("gadget already stopped, leaving early\n"); | ||
| 2690 | udc->already_stopped = 1; | ||
| 2691 | return 0; | ||
| 2692 | } | ||
| 2693 | |||
| 2694 | if (mode != USB_MODE_CTRL_MODE_DEVICE) { | ||
| 2695 | pr_debug("gadget not in device mode, leaving early\n"); | ||
| 2696 | return 0; | ||
| 2697 | } | ||
| 2698 | |||
| 2699 | /* stop the controller */ | ||
| 2700 | usbcmd = fsl_readl(&dr_regs->usbcmd) & ~USB_CMD_RUN_STOP; | ||
| 2701 | fsl_writel(usbcmd, &dr_regs->usbcmd); | ||
| 2702 | |||
| 2703 | udc->stopped = 1; | ||
| 2704 | |||
| 2705 | pr_info("USB Gadget suspended\n"); | ||
| 2706 | |||
| 2707 | return 0; | ||
| 2708 | } | ||
| 2709 | |||
| 2710 | static int fsl_udc_otg_resume(struct device *dev) | ||
| 2711 | { | ||
| 2712 | pr_debug("%s(): stopped %d already_stopped %d\n", __func__, | ||
| 2713 | udc_controller->stopped, udc_controller->already_stopped); | ||
| 2714 | |||
| 2715 | /* | ||
| 2716 | * If the controller was stopped at suspend time, then | ||
| 2717 | * don't resume it now. | ||
| 2718 | */ | ||
| 2719 | if (udc_controller->already_stopped) { | ||
| 2720 | udc_controller->already_stopped = 0; | ||
| 2721 | pr_debug("gadget was already stopped, leaving early\n"); | ||
| 2722 | return 0; | ||
| 2723 | } | ||
| 2724 | |||
| 2725 | pr_info("USB Gadget resume\n"); | ||
| 2726 | |||
| 2727 | return fsl_udc_resume(NULL); | ||
| 2728 | } | ||
| 2729 | |||
| 2449 | /*------------------------------------------------------------------------- | 2730 | /*------------------------------------------------------------------------- |
| 2450 | Register entry point for the peripheral controller driver | 2731 | Register entry point for the peripheral controller driver |
| 2451 | --------------------------------------------------------------------------*/ | 2732 | --------------------------------------------------------------------------*/ |
| @@ -2458,6 +2739,9 @@ static struct platform_driver udc_driver = { | |||
| 2458 | .driver = { | 2739 | .driver = { |
| 2459 | .name = (char *)driver_name, | 2740 | .name = (char *)driver_name, |
| 2460 | .owner = THIS_MODULE, | 2741 | .owner = THIS_MODULE, |
| 2742 | /* udc suspend/resume called from OTG driver */ | ||
| 2743 | .suspend = fsl_udc_otg_suspend, | ||
| 2744 | .resume = fsl_udc_otg_resume, | ||
| 2461 | }, | 2745 | }, |
| 2462 | }; | 2746 | }; |
| 2463 | 2747 | ||
diff --git a/drivers/usb/gadget/fsl_usb2_udc.h b/drivers/usb/gadget/fsl_usb2_udc.h index e88cce5c2c0..1d51be83fda 100644 --- a/drivers/usb/gadget/fsl_usb2_udc.h +++ b/drivers/usb/gadget/fsl_usb2_udc.h | |||
| @@ -275,7 +275,9 @@ struct usb_sys_interface { | |||
| 275 | #define USB_MODE_CTRL_MODE_IDLE 0x00000000 | 275 | #define USB_MODE_CTRL_MODE_IDLE 0x00000000 |
| 276 | #define USB_MODE_CTRL_MODE_DEVICE 0x00000002 | 276 | #define USB_MODE_CTRL_MODE_DEVICE 0x00000002 |
| 277 | #define USB_MODE_CTRL_MODE_HOST 0x00000003 | 277 | #define USB_MODE_CTRL_MODE_HOST 0x00000003 |
| 278 | #define USB_MODE_CTRL_MODE_MASK 0x00000003 | ||
| 278 | #define USB_MODE_CTRL_MODE_RSV 0x00000001 | 279 | #define USB_MODE_CTRL_MODE_RSV 0x00000001 |
| 280 | #define USB_MODE_ES 0x00000004 /* Endian Select */ | ||
| 279 | #define USB_MODE_SETUP_LOCK_OFF 0x00000008 | 281 | #define USB_MODE_SETUP_LOCK_OFF 0x00000008 |
| 280 | #define USB_MODE_STREAM_DISABLE 0x00000010 | 282 | #define USB_MODE_STREAM_DISABLE 0x00000010 |
| 281 | /* Endpoint Flush Register */ | 283 | /* Endpoint Flush Register */ |
| @@ -461,6 +463,7 @@ struct fsl_ep { | |||
| 461 | struct fsl_udc { | 463 | struct fsl_udc { |
| 462 | struct usb_gadget gadget; | 464 | struct usb_gadget gadget; |
| 463 | struct usb_gadget_driver *driver; | 465 | struct usb_gadget_driver *driver; |
| 466 | struct fsl_usb2_platform_data *pdata; | ||
| 464 | struct completion *done; /* to make sure release() is done */ | 467 | struct completion *done; /* to make sure release() is done */ |
| 465 | struct fsl_ep *eps; | 468 | struct fsl_ep *eps; |
| 466 | unsigned int max_ep; | 469 | unsigned int max_ep; |
| @@ -473,6 +476,8 @@ struct fsl_udc { | |||
| 473 | unsigned vbus_active:1; | 476 | unsigned vbus_active:1; |
| 474 | unsigned stopped:1; | 477 | unsigned stopped:1; |
| 475 | unsigned remote_wakeup:1; | 478 | unsigned remote_wakeup:1; |
| 479 | unsigned already_stopped:1; | ||
| 480 | unsigned big_endian_desc:1; | ||
| 476 | 481 | ||
| 477 | struct ep_queue_head *ep_qh; /* Endpoints Queue-Head */ | 482 | struct ep_queue_head *ep_qh; /* Endpoints Queue-Head */ |
| 478 | struct fsl_req *status_req; /* ep0 status request */ | 483 | struct fsl_req *status_req; /* ep0 status request */ |
| @@ -483,6 +488,7 @@ struct fsl_udc { | |||
| 483 | dma_addr_t ep_qh_dma; /* dma address of QH */ | 488 | dma_addr_t ep_qh_dma; /* dma address of QH */ |
| 484 | 489 | ||
| 485 | u32 max_pipes; /* Device max pipes */ | 490 | u32 max_pipes; /* Device max pipes */ |
| 491 | u32 bus_reset; /* Device is bus resetting */ | ||
| 486 | u32 resume_state; /* USB state to resume */ | 492 | u32 resume_state; /* USB state to resume */ |
| 487 | u32 usb_state; /* USB current state */ | 493 | u32 usb_state; /* USB current state */ |
| 488 | u32 ep0_state; /* Endpoint zero state */ | 494 | u32 ep0_state; /* Endpoint zero state */ |
diff --git a/drivers/usb/gadget/gadget_chips.h b/drivers/usb/gadget/gadget_chips.h index e896f6359df..bcdac7c73e8 100644 --- a/drivers/usb/gadget/gadget_chips.h +++ b/drivers/usb/gadget/gadget_chips.h | |||
| @@ -136,6 +136,12 @@ | |||
| 136 | #define gadget_is_s3c_hsotg(g) 0 | 136 | #define gadget_is_s3c_hsotg(g) 0 |
| 137 | #endif | 137 | #endif |
| 138 | 138 | ||
| 139 | #ifdef CONFIG_USB_S3C_HSUDC | ||
| 140 | #define gadget_is_s3c_hsudc(g) (!strcmp("s3c-hsudc", (g)->name)) | ||
| 141 | #else | ||
| 142 | #define gadget_is_s3c_hsudc(g) 0 | ||
| 143 | #endif | ||
| 144 | |||
| 139 | #ifdef CONFIG_USB_GADGET_EG20T | 145 | #ifdef CONFIG_USB_GADGET_EG20T |
| 140 | #define gadget_is_pch(g) (!strcmp("pch_udc", (g)->name)) | 146 | #define gadget_is_pch(g) (!strcmp("pch_udc", (g)->name)) |
| 141 | #else | 147 | #else |
| @@ -148,6 +154,12 @@ | |||
| 148 | #define gadget_is_ci13xxx_msm(g) 0 | 154 | #define gadget_is_ci13xxx_msm(g) 0 |
| 149 | #endif | 155 | #endif |
| 150 | 156 | ||
| 157 | #ifdef CONFIG_USB_GADGET_RENESAS_USBHS | ||
| 158 | #define gadget_is_renesas_usbhs(g) (!strcmp("renesas_usbhs_udc", (g)->name)) | ||
| 159 | #else | ||
| 160 | #define gadget_is_renesas_usbhs(g) 0 | ||
| 161 | #endif | ||
| 162 | |||
| 151 | /** | 163 | /** |
| 152 | * usb_gadget_controller_number - support bcdDevice id convention | 164 | * usb_gadget_controller_number - support bcdDevice id convention |
| 153 | * @gadget: the controller being driven | 165 | * @gadget: the controller being driven |
| @@ -207,6 +219,11 @@ static inline int usb_gadget_controller_number(struct usb_gadget *gadget) | |||
| 207 | return 0x27; | 219 | return 0x27; |
| 208 | else if (gadget_is_ci13xxx_msm(gadget)) | 220 | else if (gadget_is_ci13xxx_msm(gadget)) |
| 209 | return 0x28; | 221 | return 0x28; |
| 222 | else if (gadget_is_renesas_usbhs(gadget)) | ||
| 223 | return 0x29; | ||
| 224 | else if (gadget_is_s3c_hsudc(gadget)) | ||
| 225 | return 0x30; | ||
| 226 | |||
| 210 | return -ENOENT; | 227 | return -ENOENT; |
| 211 | } | 228 | } |
| 212 | 229 | ||
diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c index c3f2bd42bd5..271ef94668e 100644 --- a/drivers/usb/gadget/printer.c +++ b/drivers/usb/gadget/printer.c | |||
| @@ -1189,6 +1189,8 @@ printer_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | |||
| 1189 | else if (gadget->a_alt_hnp_support) | 1189 | else if (gadget->a_alt_hnp_support) |
| 1190 | DBG(dev, "HNP needs a different root port\n"); | 1190 | DBG(dev, "HNP needs a different root port\n"); |
| 1191 | value = printer_set_config(dev, wValue); | 1191 | value = printer_set_config(dev, wValue); |
| 1192 | if (!value) | ||
| 1193 | value = set_interface(dev, PRINTER_INTERFACE); | ||
| 1192 | break; | 1194 | break; |
| 1193 | case USB_REQ_GET_CONFIGURATION: | 1195 | case USB_REQ_GET_CONFIGURATION: |
| 1194 | if (ctrl->bRequestType != USB_DIR_IN) | 1196 | if (ctrl->bRequestType != USB_DIR_IN) |
diff --git a/drivers/usb/gadget/s3c-hsotg.c b/drivers/usb/gadget/s3c-hsotg.c index 0912679de99..acb9cc418df 100644 --- a/drivers/usb/gadget/s3c-hsotg.c +++ b/drivers/usb/gadget/s3c-hsotg.c | |||
| @@ -1,5 +1,8 @@ | |||
| 1 | /* linux/drivers/usb/gadget/s3c-hsotg.c | 1 | /* linux/drivers/usb/gadget/s3c-hsotg.c |
| 2 | * | 2 | * |
| 3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com | ||
| 5 | * | ||
| 3 | * Copyright 2008 Openmoko, Inc. | 6 | * Copyright 2008 Openmoko, Inc. |
| 4 | * Copyright 2008 Simtec Electronics | 7 | * Copyright 2008 Simtec Electronics |
| 5 | * Ben Dooks <ben@simtec.co.uk> | 8 | * Ben Dooks <ben@simtec.co.uk> |
| @@ -613,11 +616,10 @@ static unsigned get_ep_limit(struct s3c_hsotg_ep *hs_ep) | |||
| 613 | maxpkt = S3C_DxEPTSIZ_PktCnt_LIMIT + 1; | 616 | maxpkt = S3C_DxEPTSIZ_PktCnt_LIMIT + 1; |
| 614 | } else { | 617 | } else { |
| 615 | maxsize = 64+64; | 618 | maxsize = 64+64; |
| 616 | if (hs_ep->dir_in) { | 619 | if (hs_ep->dir_in) |
| 617 | maxpkt = S3C_DIEPTSIZ0_PktCnt_LIMIT + 1; | 620 | maxpkt = S3C_DIEPTSIZ0_PktCnt_LIMIT + 1; |
| 618 | } else { | 621 | else |
| 619 | maxpkt = 2; | 622 | maxpkt = 2; |
| 620 | } | ||
| 621 | } | 623 | } |
| 622 | 624 | ||
| 623 | /* we made the constant loading easier above by using +1 */ | 625 | /* we made the constant loading easier above by using +1 */ |
| @@ -679,6 +681,14 @@ static void s3c_hsotg_start_req(struct s3c_hsotg *hsotg, | |||
| 679 | __func__, readl(hsotg->regs + epctrl_reg), index, | 681 | __func__, readl(hsotg->regs + epctrl_reg), index, |
| 680 | hs_ep->dir_in ? "in" : "out"); | 682 | hs_ep->dir_in ? "in" : "out"); |
| 681 | 683 | ||
| 684 | /* If endpoint is stalled, we will restart request later */ | ||
| 685 | ctrl = readl(hsotg->regs + epctrl_reg); | ||
| 686 | |||
| 687 | if (ctrl & S3C_DxEPCTL_Stall) { | ||
| 688 | dev_warn(hsotg->dev, "%s: ep%d is stalled\n", __func__, index); | ||
| 689 | return; | ||
| 690 | } | ||
| 691 | |||
| 682 | length = ureq->length - ureq->actual; | 692 | length = ureq->length - ureq->actual; |
| 683 | 693 | ||
| 684 | if (0) | 694 | if (0) |
| @@ -731,18 +741,6 @@ static void s3c_hsotg_start_req(struct s3c_hsotg *hsotg, | |||
| 731 | /* write size / packets */ | 741 | /* write size / packets */ |
| 732 | writel(epsize, hsotg->regs + epsize_reg); | 742 | writel(epsize, hsotg->regs + epsize_reg); |
| 733 | 743 | ||
| 734 | ctrl = readl(hsotg->regs + epctrl_reg); | ||
| 735 | |||
| 736 | if (ctrl & S3C_DxEPCTL_Stall) { | ||
| 737 | dev_warn(hsotg->dev, "%s: ep%d is stalled\n", __func__, index); | ||
| 738 | |||
| 739 | /* not sure what we can do here, if it is EP0 then we should | ||
| 740 | * get this cleared once the endpoint has transmitted the | ||
| 741 | * STALL packet, otherwise it needs to be cleared by the | ||
| 742 | * host. | ||
| 743 | */ | ||
| 744 | } | ||
| 745 | |||
| 746 | if (using_dma(hsotg)) { | 744 | if (using_dma(hsotg)) { |
| 747 | unsigned int dma_reg; | 745 | unsigned int dma_reg; |
| 748 | 746 | ||
| @@ -1048,6 +1046,20 @@ static int s3c_hsotg_process_req_status(struct s3c_hsotg *hsotg, | |||
| 1048 | static int s3c_hsotg_ep_sethalt(struct usb_ep *ep, int value); | 1046 | static int s3c_hsotg_ep_sethalt(struct usb_ep *ep, int value); |
| 1049 | 1047 | ||
| 1050 | /** | 1048 | /** |
| 1049 | * get_ep_head - return the first request on the endpoint | ||
| 1050 | * @hs_ep: The controller endpoint to get | ||
| 1051 | * | ||
| 1052 | * Get the first request on the endpoint. | ||
| 1053 | */ | ||
| 1054 | static struct s3c_hsotg_req *get_ep_head(struct s3c_hsotg_ep *hs_ep) | ||
| 1055 | { | ||
| 1056 | if (list_empty(&hs_ep->queue)) | ||
| 1057 | return NULL; | ||
| 1058 | |||
| 1059 | return list_first_entry(&hs_ep->queue, struct s3c_hsotg_req, queue); | ||
| 1060 | } | ||
| 1061 | |||
| 1062 | /** | ||
| 1051 | * s3c_hsotg_process_req_featire - process request {SET,CLEAR}_FEATURE | 1063 | * s3c_hsotg_process_req_featire - process request {SET,CLEAR}_FEATURE |
| 1052 | * @hsotg: The device state | 1064 | * @hsotg: The device state |
| 1053 | * @ctrl: USB control request | 1065 | * @ctrl: USB control request |
| @@ -1055,8 +1067,12 @@ static int s3c_hsotg_ep_sethalt(struct usb_ep *ep, int value); | |||
| 1055 | static int s3c_hsotg_process_req_feature(struct s3c_hsotg *hsotg, | 1067 | static int s3c_hsotg_process_req_feature(struct s3c_hsotg *hsotg, |
| 1056 | struct usb_ctrlrequest *ctrl) | 1068 | struct usb_ctrlrequest *ctrl) |
| 1057 | { | 1069 | { |
| 1070 | struct s3c_hsotg_ep *ep0 = &hsotg->eps[0]; | ||
| 1071 | struct s3c_hsotg_req *hs_req; | ||
| 1072 | bool restart; | ||
| 1058 | bool set = (ctrl->bRequest == USB_REQ_SET_FEATURE); | 1073 | bool set = (ctrl->bRequest == USB_REQ_SET_FEATURE); |
| 1059 | struct s3c_hsotg_ep *ep; | 1074 | struct s3c_hsotg_ep *ep; |
| 1075 | int ret; | ||
| 1060 | 1076 | ||
| 1061 | dev_dbg(hsotg->dev, "%s: %s_FEATURE\n", | 1077 | dev_dbg(hsotg->dev, "%s: %s_FEATURE\n", |
| 1062 | __func__, set ? "SET" : "CLEAR"); | 1078 | __func__, set ? "SET" : "CLEAR"); |
| @@ -1072,6 +1088,36 @@ static int s3c_hsotg_process_req_feature(struct s3c_hsotg *hsotg, | |||
| 1072 | switch (le16_to_cpu(ctrl->wValue)) { | 1088 | switch (le16_to_cpu(ctrl->wValue)) { |
| 1073 | case USB_ENDPOINT_HALT: | 1089 | case USB_ENDPOINT_HALT: |
| 1074 | s3c_hsotg_ep_sethalt(&ep->ep, set); | 1090 | s3c_hsotg_ep_sethalt(&ep->ep, set); |
| 1091 | |||
| 1092 | ret = s3c_hsotg_send_reply(hsotg, ep0, NULL, 0); | ||
| 1093 | if (ret) { | ||
| 1094 | dev_err(hsotg->dev, | ||
| 1095 | "%s: failed to send reply\n", __func__); | ||
| 1096 | return ret; | ||
| 1097 | } | ||
| 1098 | |||
| 1099 | if (!set) { | ||
| 1100 | /* | ||
| 1101 | * If we have request in progress, | ||
| 1102 | * then complete it | ||
| 1103 | */ | ||
| 1104 | if (ep->req) { | ||
| 1105 | hs_req = ep->req; | ||
| 1106 | ep->req = NULL; | ||
| 1107 | list_del_init(&hs_req->queue); | ||
| 1108 | hs_req->req.complete(&ep->ep, | ||
| 1109 | &hs_req->req); | ||
| 1110 | } | ||
| 1111 | |||
| 1112 | /* If we have pending request, then start it */ | ||
| 1113 | restart = !list_empty(&ep->queue); | ||
| 1114 | if (restart) { | ||
| 1115 | hs_req = get_ep_head(ep); | ||
| 1116 | s3c_hsotg_start_req(hsotg, ep, | ||
| 1117 | hs_req, false); | ||
| 1118 | } | ||
| 1119 | } | ||
| 1120 | |||
| 1075 | break; | 1121 | break; |
| 1076 | 1122 | ||
| 1077 | default: | 1123 | default: |
| @@ -1148,14 +1194,6 @@ static void s3c_hsotg_process_control(struct s3c_hsotg *hsotg, | |||
| 1148 | dev_dbg(hsotg->dev, "driver->setup() ret %d\n", ret); | 1194 | dev_dbg(hsotg->dev, "driver->setup() ret %d\n", ret); |
| 1149 | } | 1195 | } |
| 1150 | 1196 | ||
| 1151 | if (ret > 0) { | ||
| 1152 | if (!ep0->dir_in) { | ||
| 1153 | /* need to generate zlp in reply or take data */ | ||
| 1154 | /* todo - deal with any data we might be sent? */ | ||
| 1155 | ret = s3c_hsotg_send_reply(hsotg, ep0, NULL, 0); | ||
| 1156 | } | ||
| 1157 | } | ||
| 1158 | |||
| 1159 | /* the request is either unhandlable, or is not formatted correctly | 1197 | /* the request is either unhandlable, or is not formatted correctly |
| 1160 | * so respond with a STALL for the status stage to indicate failure. | 1198 | * so respond with a STALL for the status stage to indicate failure. |
| 1161 | */ | 1199 | */ |
| @@ -1247,20 +1285,6 @@ static void s3c_hsotg_enqueue_setup(struct s3c_hsotg *hsotg) | |||
| 1247 | } | 1285 | } |
| 1248 | 1286 | ||
| 1249 | /** | 1287 | /** |
| 1250 | * get_ep_head - return the first request on the endpoint | ||
| 1251 | * @hs_ep: The controller endpoint to get | ||
| 1252 | * | ||
| 1253 | * Get the first request on the endpoint. | ||
| 1254 | */ | ||
| 1255 | static struct s3c_hsotg_req *get_ep_head(struct s3c_hsotg_ep *hs_ep) | ||
| 1256 | { | ||
| 1257 | if (list_empty(&hs_ep->queue)) | ||
| 1258 | return NULL; | ||
| 1259 | |||
| 1260 | return list_first_entry(&hs_ep->queue, struct s3c_hsotg_req, queue); | ||
| 1261 | } | ||
| 1262 | |||
| 1263 | /** | ||
| 1264 | * s3c_hsotg_complete_request - complete a request given to us | 1288 | * s3c_hsotg_complete_request - complete a request given to us |
| 1265 | * @hsotg: The device state. | 1289 | * @hsotg: The device state. |
| 1266 | * @hs_ep: The endpoint the request was on. | 1290 | * @hs_ep: The endpoint the request was on. |
| @@ -1683,6 +1707,37 @@ bad_mps: | |||
| 1683 | dev_err(hsotg->dev, "ep%d: bad mps of %d\n", ep, mps); | 1707 | dev_err(hsotg->dev, "ep%d: bad mps of %d\n", ep, mps); |
| 1684 | } | 1708 | } |
| 1685 | 1709 | ||
| 1710 | /** | ||
| 1711 | * s3c_hsotg_txfifo_flush - flush Tx FIFO | ||
| 1712 | * @hsotg: The driver state | ||
| 1713 | * @idx: The index for the endpoint (0..15) | ||
| 1714 | */ | ||
| 1715 | static void s3c_hsotg_txfifo_flush(struct s3c_hsotg *hsotg, unsigned int idx) | ||
| 1716 | { | ||
| 1717 | int timeout; | ||
| 1718 | int val; | ||
| 1719 | |||
| 1720 | writel(S3C_GRSTCTL_TxFNum(idx) | S3C_GRSTCTL_TxFFlsh, | ||
| 1721 | hsotg->regs + S3C_GRSTCTL); | ||
| 1722 | |||
| 1723 | /* wait until the fifo is flushed */ | ||
| 1724 | timeout = 100; | ||
| 1725 | |||
| 1726 | while (1) { | ||
| 1727 | val = readl(hsotg->regs + S3C_GRSTCTL); | ||
| 1728 | |||
| 1729 | if ((val & (S3C_GRSTCTL_TxFFlsh)) == 0) | ||
| 1730 | break; | ||
| 1731 | |||
| 1732 | if (--timeout == 0) { | ||
| 1733 | dev_err(hsotg->dev, | ||
| 1734 | "%s: timeout flushing fifo (GRSTCTL=%08x)\n", | ||
| 1735 | __func__, val); | ||
| 1736 | } | ||
| 1737 | |||
| 1738 | udelay(1); | ||
| 1739 | } | ||
| 1740 | } | ||
| 1686 | 1741 | ||
| 1687 | /** | 1742 | /** |
| 1688 | * s3c_hsotg_trytx - check to see if anything needs transmitting | 1743 | * s3c_hsotg_trytx - check to see if anything needs transmitting |
| @@ -1775,10 +1830,12 @@ static void s3c_hsotg_epint(struct s3c_hsotg *hsotg, unsigned int idx, | |||
| 1775 | u32 epctl_reg = dir_in ? S3C_DIEPCTL(idx) : S3C_DOEPCTL(idx); | 1830 | u32 epctl_reg = dir_in ? S3C_DIEPCTL(idx) : S3C_DOEPCTL(idx); |
| 1776 | u32 epsiz_reg = dir_in ? S3C_DIEPTSIZ(idx) : S3C_DOEPTSIZ(idx); | 1831 | u32 epsiz_reg = dir_in ? S3C_DIEPTSIZ(idx) : S3C_DOEPTSIZ(idx); |
| 1777 | u32 ints; | 1832 | u32 ints; |
| 1778 | u32 clear = 0; | ||
| 1779 | 1833 | ||
| 1780 | ints = readl(hsotg->regs + epint_reg); | 1834 | ints = readl(hsotg->regs + epint_reg); |
| 1781 | 1835 | ||
| 1836 | /* Clear endpoint interrupts */ | ||
| 1837 | writel(ints, hsotg->regs + epint_reg); | ||
| 1838 | |||
| 1782 | dev_dbg(hsotg->dev, "%s: ep%d(%s) DxEPINT=0x%08x\n", | 1839 | dev_dbg(hsotg->dev, "%s: ep%d(%s) DxEPINT=0x%08x\n", |
| 1783 | __func__, idx, dir_in ? "in" : "out", ints); | 1840 | __func__, idx, dir_in ? "in" : "out", ints); |
| 1784 | 1841 | ||
| @@ -1801,19 +1858,28 @@ static void s3c_hsotg_epint(struct s3c_hsotg *hsotg, unsigned int idx, | |||
| 1801 | 1858 | ||
| 1802 | s3c_hsotg_handle_outdone(hsotg, idx, false); | 1859 | s3c_hsotg_handle_outdone(hsotg, idx, false); |
| 1803 | } | 1860 | } |
| 1804 | |||
| 1805 | clear |= S3C_DxEPINT_XferCompl; | ||
| 1806 | } | 1861 | } |
| 1807 | 1862 | ||
| 1808 | if (ints & S3C_DxEPINT_EPDisbld) { | 1863 | if (ints & S3C_DxEPINT_EPDisbld) { |
| 1809 | dev_dbg(hsotg->dev, "%s: EPDisbld\n", __func__); | 1864 | dev_dbg(hsotg->dev, "%s: EPDisbld\n", __func__); |
| 1810 | clear |= S3C_DxEPINT_EPDisbld; | 1865 | |
| 1866 | if (dir_in) { | ||
| 1867 | int epctl = readl(hsotg->regs + epctl_reg); | ||
| 1868 | |||
| 1869 | s3c_hsotg_txfifo_flush(hsotg, idx); | ||
| 1870 | |||
| 1871 | if ((epctl & S3C_DxEPCTL_Stall) && | ||
| 1872 | (epctl & S3C_DxEPCTL_EPType_Bulk)) { | ||
| 1873 | int dctl = readl(hsotg->regs + S3C_DCTL); | ||
| 1874 | |||
| 1875 | dctl |= S3C_DCTL_CGNPInNAK; | ||
| 1876 | writel(dctl, hsotg->regs + S3C_DCTL); | ||
| 1877 | } | ||
| 1878 | } | ||
| 1811 | } | 1879 | } |
| 1812 | 1880 | ||
| 1813 | if (ints & S3C_DxEPINT_AHBErr) { | 1881 | if (ints & S3C_DxEPINT_AHBErr) |
| 1814 | dev_dbg(hsotg->dev, "%s: AHBErr\n", __func__); | 1882 | dev_dbg(hsotg->dev, "%s: AHBErr\n", __func__); |
| 1815 | clear |= S3C_DxEPINT_AHBErr; | ||
| 1816 | } | ||
| 1817 | 1883 | ||
| 1818 | if (ints & S3C_DxEPINT_Setup) { /* Setup or Timeout */ | 1884 | if (ints & S3C_DxEPINT_Setup) { /* Setup or Timeout */ |
| 1819 | dev_dbg(hsotg->dev, "%s: Setup/Timeout\n", __func__); | 1885 | dev_dbg(hsotg->dev, "%s: Setup/Timeout\n", __func__); |
| @@ -1829,14 +1895,10 @@ static void s3c_hsotg_epint(struct s3c_hsotg *hsotg, unsigned int idx, | |||
| 1829 | else | 1895 | else |
| 1830 | s3c_hsotg_handle_outdone(hsotg, 0, true); | 1896 | s3c_hsotg_handle_outdone(hsotg, 0, true); |
| 1831 | } | 1897 | } |
| 1832 | |||
| 1833 | clear |= S3C_DxEPINT_Setup; | ||
| 1834 | } | 1898 | } |
| 1835 | 1899 | ||
| 1836 | if (ints & S3C_DxEPINT_Back2BackSetup) { | 1900 | if (ints & S3C_DxEPINT_Back2BackSetup) |
| 1837 | dev_dbg(hsotg->dev, "%s: B2BSetup/INEPNakEff\n", __func__); | 1901 | dev_dbg(hsotg->dev, "%s: B2BSetup/INEPNakEff\n", __func__); |
| 1838 | clear |= S3C_DxEPINT_Back2BackSetup; | ||
| 1839 | } | ||
| 1840 | 1902 | ||
| 1841 | if (dir_in) { | 1903 | if (dir_in) { |
| 1842 | /* not sure if this is important, but we'll clear it anyway | 1904 | /* not sure if this is important, but we'll clear it anyway |
| @@ -1844,14 +1906,12 @@ static void s3c_hsotg_epint(struct s3c_hsotg *hsotg, unsigned int idx, | |||
| 1844 | if (ints & S3C_DIEPMSK_INTknTXFEmpMsk) { | 1906 | if (ints & S3C_DIEPMSK_INTknTXFEmpMsk) { |
| 1845 | dev_dbg(hsotg->dev, "%s: ep%d: INTknTXFEmpMsk\n", | 1907 | dev_dbg(hsotg->dev, "%s: ep%d: INTknTXFEmpMsk\n", |
| 1846 | __func__, idx); | 1908 | __func__, idx); |
| 1847 | clear |= S3C_DIEPMSK_INTknTXFEmpMsk; | ||
| 1848 | } | 1909 | } |
| 1849 | 1910 | ||
| 1850 | /* this probably means something bad is happening */ | 1911 | /* this probably means something bad is happening */ |
| 1851 | if (ints & S3C_DIEPMSK_INTknEPMisMsk) { | 1912 | if (ints & S3C_DIEPMSK_INTknEPMisMsk) { |
| 1852 | dev_warn(hsotg->dev, "%s: ep%d: INTknEP\n", | 1913 | dev_warn(hsotg->dev, "%s: ep%d: INTknEP\n", |
| 1853 | __func__, idx); | 1914 | __func__, idx); |
| 1854 | clear |= S3C_DIEPMSK_INTknEPMisMsk; | ||
| 1855 | } | 1915 | } |
| 1856 | 1916 | ||
| 1857 | /* FIFO has space or is empty (see GAHBCFG) */ | 1917 | /* FIFO has space or is empty (see GAHBCFG) */ |
| @@ -1860,11 +1920,8 @@ static void s3c_hsotg_epint(struct s3c_hsotg *hsotg, unsigned int idx, | |||
| 1860 | dev_dbg(hsotg->dev, "%s: ep%d: TxFIFOEmpty\n", | 1920 | dev_dbg(hsotg->dev, "%s: ep%d: TxFIFOEmpty\n", |
| 1861 | __func__, idx); | 1921 | __func__, idx); |
| 1862 | s3c_hsotg_trytx(hsotg, hs_ep); | 1922 | s3c_hsotg_trytx(hsotg, hs_ep); |
| 1863 | clear |= S3C_DIEPMSK_TxFIFOEmpty; | ||
| 1864 | } | 1923 | } |
| 1865 | } | 1924 | } |
| 1866 | |||
| 1867 | writel(clear, hsotg->regs + epint_reg); | ||
| 1868 | } | 1925 | } |
| 1869 | 1926 | ||
| 1870 | /** | 1927 | /** |
| @@ -2056,7 +2113,6 @@ irq_retry: | |||
| 2056 | dev_info(hsotg->dev, "OTGInt: %08x\n", otgint); | 2113 | dev_info(hsotg->dev, "OTGInt: %08x\n", otgint); |
| 2057 | 2114 | ||
| 2058 | writel(otgint, hsotg->regs + S3C_GOTGINT); | 2115 | writel(otgint, hsotg->regs + S3C_GOTGINT); |
| 2059 | writel(S3C_GINTSTS_OTGInt, hsotg->regs + S3C_GINTSTS); | ||
| 2060 | } | 2116 | } |
| 2061 | 2117 | ||
| 2062 | if (gintsts & S3C_GINTSTS_DisconnInt) { | 2118 | if (gintsts & S3C_GINTSTS_DisconnInt) { |
| @@ -2072,8 +2128,9 @@ irq_retry: | |||
| 2072 | } | 2128 | } |
| 2073 | 2129 | ||
| 2074 | if (gintsts & S3C_GINTSTS_EnumDone) { | 2130 | if (gintsts & S3C_GINTSTS_EnumDone) { |
| 2075 | s3c_hsotg_irq_enumdone(hsotg); | ||
| 2076 | writel(S3C_GINTSTS_EnumDone, hsotg->regs + S3C_GINTSTS); | 2131 | writel(S3C_GINTSTS_EnumDone, hsotg->regs + S3C_GINTSTS); |
| 2132 | |||
| 2133 | s3c_hsotg_irq_enumdone(hsotg); | ||
| 2077 | } | 2134 | } |
| 2078 | 2135 | ||
| 2079 | if (gintsts & S3C_GINTSTS_ConIDStsChng) { | 2136 | if (gintsts & S3C_GINTSTS_ConIDStsChng) { |
| @@ -2101,10 +2158,6 @@ irq_retry: | |||
| 2101 | if (daint_in & 1) | 2158 | if (daint_in & 1) |
| 2102 | s3c_hsotg_epint(hsotg, ep, 1); | 2159 | s3c_hsotg_epint(hsotg, ep, 1); |
| 2103 | } | 2160 | } |
| 2104 | |||
| 2105 | writel(daint, hsotg->regs + S3C_DAINT); | ||
| 2106 | writel(gintsts & (S3C_GINTSTS_OEPInt | S3C_GINTSTS_IEPInt), | ||
| 2107 | hsotg->regs + S3C_GINTSTS); | ||
| 2108 | } | 2161 | } |
| 2109 | 2162 | ||
| 2110 | if (gintsts & S3C_GINTSTS_USBRst) { | 2163 | if (gintsts & S3C_GINTSTS_USBRst) { |
| @@ -2112,6 +2165,8 @@ irq_retry: | |||
| 2112 | dev_dbg(hsotg->dev, "GNPTXSTS=%08x\n", | 2165 | dev_dbg(hsotg->dev, "GNPTXSTS=%08x\n", |
| 2113 | readl(hsotg->regs + S3C_GNPTXSTS)); | 2166 | readl(hsotg->regs + S3C_GNPTXSTS)); |
| 2114 | 2167 | ||
| 2168 | writel(S3C_GINTSTS_USBRst, hsotg->regs + S3C_GINTSTS); | ||
| 2169 | |||
| 2115 | kill_all_requests(hsotg, &hsotg->eps[0], -ECONNRESET, true); | 2170 | kill_all_requests(hsotg, &hsotg->eps[0], -ECONNRESET, true); |
| 2116 | 2171 | ||
| 2117 | /* it seems after a reset we can end up with a situation | 2172 | /* it seems after a reset we can end up with a situation |
| @@ -2123,8 +2178,6 @@ irq_retry: | |||
| 2123 | s3c_hsotg_init_fifo(hsotg); | 2178 | s3c_hsotg_init_fifo(hsotg); |
| 2124 | 2179 | ||
| 2125 | s3c_hsotg_enqueue_setup(hsotg); | 2180 | s3c_hsotg_enqueue_setup(hsotg); |
| 2126 | |||
| 2127 | writel(S3C_GINTSTS_USBRst, hsotg->regs + S3C_GINTSTS); | ||
| 2128 | } | 2181 | } |
| 2129 | 2182 | ||
| 2130 | /* check both FIFOs */ | 2183 | /* check both FIFOs */ |
| @@ -2138,8 +2191,6 @@ irq_retry: | |||
| 2138 | 2191 | ||
| 2139 | s3c_hsotg_disable_gsint(hsotg, S3C_GINTSTS_NPTxFEmp); | 2192 | s3c_hsotg_disable_gsint(hsotg, S3C_GINTSTS_NPTxFEmp); |
| 2140 | s3c_hsotg_irq_fifoempty(hsotg, false); | 2193 | s3c_hsotg_irq_fifoempty(hsotg, false); |
| 2141 | |||
| 2142 | writel(S3C_GINTSTS_NPTxFEmp, hsotg->regs + S3C_GINTSTS); | ||
| 2143 | } | 2194 | } |
| 2144 | 2195 | ||
| 2145 | if (gintsts & S3C_GINTSTS_PTxFEmp) { | 2196 | if (gintsts & S3C_GINTSTS_PTxFEmp) { |
| @@ -2149,8 +2200,6 @@ irq_retry: | |||
| 2149 | 2200 | ||
| 2150 | s3c_hsotg_disable_gsint(hsotg, S3C_GINTSTS_PTxFEmp); | 2201 | s3c_hsotg_disable_gsint(hsotg, S3C_GINTSTS_PTxFEmp); |
| 2151 | s3c_hsotg_irq_fifoempty(hsotg, true); | 2202 | s3c_hsotg_irq_fifoempty(hsotg, true); |
| 2152 | |||
| 2153 | writel(S3C_GINTSTS_PTxFEmp, hsotg->regs + S3C_GINTSTS); | ||
| 2154 | } | 2203 | } |
| 2155 | 2204 | ||
| 2156 | if (gintsts & S3C_GINTSTS_RxFLvl) { | 2205 | if (gintsts & S3C_GINTSTS_RxFLvl) { |
| @@ -2159,7 +2208,6 @@ irq_retry: | |||
| 2159 | * set. */ | 2208 | * set. */ |
| 2160 | 2209 | ||
| 2161 | s3c_hsotg_handle_rx(hsotg); | 2210 | s3c_hsotg_handle_rx(hsotg); |
| 2162 | writel(S3C_GINTSTS_RxFLvl, hsotg->regs + S3C_GINTSTS); | ||
| 2163 | } | 2211 | } |
| 2164 | 2212 | ||
| 2165 | if (gintsts & S3C_GINTSTS_ModeMis) { | 2213 | if (gintsts & S3C_GINTSTS_ModeMis) { |
| @@ -2193,19 +2241,17 @@ irq_retry: | |||
| 2193 | if (gintsts & S3C_GINTSTS_GOUTNakEff) { | 2241 | if (gintsts & S3C_GINTSTS_GOUTNakEff) { |
| 2194 | dev_info(hsotg->dev, "GOUTNakEff triggered\n"); | 2242 | dev_info(hsotg->dev, "GOUTNakEff triggered\n"); |
| 2195 | 2243 | ||
| 2196 | s3c_hsotg_dump(hsotg); | ||
| 2197 | |||
| 2198 | writel(S3C_DCTL_CGOUTNak, hsotg->regs + S3C_DCTL); | 2244 | writel(S3C_DCTL_CGOUTNak, hsotg->regs + S3C_DCTL); |
| 2199 | writel(S3C_GINTSTS_GOUTNakEff, hsotg->regs + S3C_GINTSTS); | 2245 | |
| 2246 | s3c_hsotg_dump(hsotg); | ||
| 2200 | } | 2247 | } |
| 2201 | 2248 | ||
| 2202 | if (gintsts & S3C_GINTSTS_GINNakEff) { | 2249 | if (gintsts & S3C_GINTSTS_GINNakEff) { |
| 2203 | dev_info(hsotg->dev, "GINNakEff triggered\n"); | 2250 | dev_info(hsotg->dev, "GINNakEff triggered\n"); |
| 2204 | 2251 | ||
| 2205 | s3c_hsotg_dump(hsotg); | ||
| 2206 | |||
| 2207 | writel(S3C_DCTL_CGNPInNAK, hsotg->regs + S3C_DCTL); | 2252 | writel(S3C_DCTL_CGNPInNAK, hsotg->regs + S3C_DCTL); |
| 2208 | writel(S3C_GINTSTS_GINNakEff, hsotg->regs + S3C_GINTSTS); | 2253 | |
| 2254 | s3c_hsotg_dump(hsotg); | ||
| 2209 | } | 2255 | } |
| 2210 | 2256 | ||
| 2211 | /* if we've had fifo events, we should try and go around the | 2257 | /* if we've had fifo events, we should try and go around the |
| @@ -2403,11 +2449,6 @@ static int s3c_hsotg_ep_dequeue(struct usb_ep *ep, struct usb_request *req) | |||
| 2403 | 2449 | ||
| 2404 | dev_info(hs->dev, "ep_dequeue(%p,%p)\n", ep, req); | 2450 | dev_info(hs->dev, "ep_dequeue(%p,%p)\n", ep, req); |
| 2405 | 2451 | ||
| 2406 | if (hs_req == hs_ep->req) { | ||
| 2407 | dev_dbg(hs->dev, "%s: already in progress\n", __func__); | ||
| 2408 | return -EINPROGRESS; | ||
| 2409 | } | ||
| 2410 | |||
| 2411 | spin_lock_irqsave(&hs_ep->lock, flags); | 2452 | spin_lock_irqsave(&hs_ep->lock, flags); |
| 2412 | 2453 | ||
| 2413 | if (!on_list(hs_ep, hs_req)) { | 2454 | if (!on_list(hs_ep, hs_req)) { |
| @@ -2429,6 +2470,7 @@ static int s3c_hsotg_ep_sethalt(struct usb_ep *ep, int value) | |||
| 2429 | unsigned long irqflags; | 2470 | unsigned long irqflags; |
| 2430 | u32 epreg; | 2471 | u32 epreg; |
| 2431 | u32 epctl; | 2472 | u32 epctl; |
| 2473 | u32 xfertype; | ||
| 2432 | 2474 | ||
| 2433 | dev_info(hs->dev, "%s(ep %p %s, %d)\n", __func__, ep, ep->name, value); | 2475 | dev_info(hs->dev, "%s(ep %p %s, %d)\n", __func__, ep, ep->name, value); |
| 2434 | 2476 | ||
| @@ -2439,10 +2481,17 @@ static int s3c_hsotg_ep_sethalt(struct usb_ep *ep, int value) | |||
| 2439 | epreg = S3C_DIEPCTL(index); | 2481 | epreg = S3C_DIEPCTL(index); |
| 2440 | epctl = readl(hs->regs + epreg); | 2482 | epctl = readl(hs->regs + epreg); |
| 2441 | 2483 | ||
| 2442 | if (value) | 2484 | if (value) { |
| 2443 | epctl |= S3C_DxEPCTL_Stall; | 2485 | epctl |= S3C_DxEPCTL_Stall + S3C_DxEPCTL_SNAK; |
| 2444 | else | 2486 | if (epctl & S3C_DxEPCTL_EPEna) |
| 2487 | epctl |= S3C_DxEPCTL_EPDis; | ||
| 2488 | } else { | ||
| 2445 | epctl &= ~S3C_DxEPCTL_Stall; | 2489 | epctl &= ~S3C_DxEPCTL_Stall; |
| 2490 | xfertype = epctl & S3C_DxEPCTL_EPType_MASK; | ||
| 2491 | if (xfertype == S3C_DxEPCTL_EPType_Bulk || | ||
| 2492 | xfertype == S3C_DxEPCTL_EPType_Intterupt) | ||
| 2493 | epctl |= S3C_DxEPCTL_SetD0PID; | ||
| 2494 | } | ||
| 2446 | 2495 | ||
| 2447 | writel(epctl, hs->regs + epreg); | 2496 | writel(epctl, hs->regs + epreg); |
| 2448 | 2497 | ||
| @@ -2451,8 +2500,13 @@ static int s3c_hsotg_ep_sethalt(struct usb_ep *ep, int value) | |||
| 2451 | 2500 | ||
| 2452 | if (value) | 2501 | if (value) |
| 2453 | epctl |= S3C_DxEPCTL_Stall; | 2502 | epctl |= S3C_DxEPCTL_Stall; |
| 2454 | else | 2503 | else { |
| 2455 | epctl &= ~S3C_DxEPCTL_Stall; | 2504 | epctl &= ~S3C_DxEPCTL_Stall; |
| 2505 | xfertype = epctl & S3C_DxEPCTL_EPType_MASK; | ||
| 2506 | if (xfertype == S3C_DxEPCTL_EPType_Bulk || | ||
| 2507 | xfertype == S3C_DxEPCTL_EPType_Intterupt) | ||
| 2508 | epctl |= S3C_DxEPCTL_SetD0PID; | ||
| 2509 | } | ||
| 2456 | 2510 | ||
| 2457 | writel(epctl, hs->regs + epreg); | 2511 | writel(epctl, hs->regs + epreg); |
| 2458 | 2512 | ||
| @@ -2491,9 +2545,9 @@ static int s3c_hsotg_corereset(struct s3c_hsotg *hsotg) | |||
| 2491 | timeout = 1000; | 2545 | timeout = 1000; |
| 2492 | do { | 2546 | do { |
| 2493 | grstctl = readl(hsotg->regs + S3C_GRSTCTL); | 2547 | grstctl = readl(hsotg->regs + S3C_GRSTCTL); |
| 2494 | } while (!(grstctl & S3C_GRSTCTL_CSftRst) && timeout-- > 0); | 2548 | } while ((grstctl & S3C_GRSTCTL_CSftRst) && timeout-- > 0); |
| 2495 | 2549 | ||
| 2496 | if (!(grstctl & S3C_GRSTCTL_CSftRst)) { | 2550 | if (grstctl & S3C_GRSTCTL_CSftRst) { |
| 2497 | dev_err(hsotg->dev, "Failed to get CSftRst asserted\n"); | 2551 | dev_err(hsotg->dev, "Failed to get CSftRst asserted\n"); |
| 2498 | return -EINVAL; | 2552 | return -EINVAL; |
| 2499 | } | 2553 | } |
| @@ -2510,13 +2564,10 @@ static int s3c_hsotg_corereset(struct s3c_hsotg *hsotg) | |||
| 2510 | return -ETIMEDOUT; | 2564 | return -ETIMEDOUT; |
| 2511 | } | 2565 | } |
| 2512 | 2566 | ||
| 2513 | if (grstctl & S3C_GRSTCTL_CSftRst) | ||
| 2514 | continue; | ||
| 2515 | |||
| 2516 | if (!(grstctl & S3C_GRSTCTL_AHBIdle)) | 2567 | if (!(grstctl & S3C_GRSTCTL_AHBIdle)) |
| 2517 | continue; | 2568 | continue; |
| 2518 | 2569 | ||
| 2519 | break; /* reset done */ | 2570 | break; /* reset done */ |
| 2520 | } | 2571 | } |
| 2521 | 2572 | ||
| 2522 | dev_dbg(hsotg->dev, "reset successful\n"); | 2573 | dev_dbg(hsotg->dev, "reset successful\n"); |
| @@ -2588,6 +2639,12 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver, | |||
| 2588 | 2639 | ||
| 2589 | writel(1 << 18 | S3C_DCFG_DevSpd_HS, hsotg->regs + S3C_DCFG); | 2640 | writel(1 << 18 | S3C_DCFG_DevSpd_HS, hsotg->regs + S3C_DCFG); |
| 2590 | 2641 | ||
| 2642 | /* Clear any pending OTG interrupts */ | ||
| 2643 | writel(0xffffffff, hsotg->regs + S3C_GOTGINT); | ||
| 2644 | |||
| 2645 | /* Clear any pending interrupts */ | ||
| 2646 | writel(0xffffffff, hsotg->regs + S3C_GINTSTS); | ||
| 2647 | |||
| 2591 | writel(S3C_GINTSTS_DisconnInt | S3C_GINTSTS_SessReqInt | | 2648 | writel(S3C_GINTSTS_DisconnInt | S3C_GINTSTS_SessReqInt | |
| 2592 | S3C_GINTSTS_ConIDStsChng | S3C_GINTSTS_USBRst | | 2649 | S3C_GINTSTS_ConIDStsChng | S3C_GINTSTS_USBRst | |
| 2593 | S3C_GINTSTS_EnumDone | S3C_GINTSTS_OTGInt | | 2650 | S3C_GINTSTS_EnumDone | S3C_GINTSTS_OTGInt | |
| @@ -3261,7 +3318,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev) | |||
| 3261 | hsotg->clk = clk_get(&pdev->dev, "otg"); | 3318 | hsotg->clk = clk_get(&pdev->dev, "otg"); |
| 3262 | if (IS_ERR(hsotg->clk)) { | 3319 | if (IS_ERR(hsotg->clk)) { |
| 3263 | dev_err(dev, "cannot get otg clock\n"); | 3320 | dev_err(dev, "cannot get otg clock\n"); |
| 3264 | ret = -EINVAL; | 3321 | ret = PTR_ERR(hsotg->clk); |
| 3265 | goto err_mem; | 3322 | goto err_mem; |
| 3266 | } | 3323 | } |
| 3267 | 3324 | ||
diff --git a/drivers/usb/gadget/s3c-hsudc.c b/drivers/usb/gadget/s3c-hsudc.c new file mode 100644 index 00000000000..cfe3cf56d6b --- /dev/null +++ b/drivers/usb/gadget/s3c-hsudc.c | |||
| @@ -0,0 +1,1349 @@ | |||
| 1 | /* linux/drivers/usb/gadget/s3c-hsudc.c | ||
| 2 | * | ||
| 3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com/ | ||
| 5 | * | ||
| 6 | * S3C24XX USB 2.0 High-speed USB controller gadget driver | ||
| 7 | * | ||
| 8 | * The S3C24XX USB 2.0 high-speed USB controller supports upto 9 endpoints. | ||
| 9 | * Each endpoint can be configured as either in or out endpoint. Endpoints | ||
| 10 | * can be configured for Bulk or Interrupt transfer mode. | ||
| 11 | * | ||
| 12 | * This program is free software; you can redistribute it and/or modify | ||
| 13 | * it under the terms of the GNU General Public License version 2 as | ||
| 14 | * published by the Free Software Foundation. | ||
| 15 | */ | ||
| 16 | |||
| 17 | #include <linux/kernel.h> | ||
| 18 | #include <linux/module.h> | ||
| 19 | #include <linux/spinlock.h> | ||
| 20 | #include <linux/interrupt.h> | ||
| 21 | #include <linux/platform_device.h> | ||
| 22 | #include <linux/dma-mapping.h> | ||
| 23 | #include <linux/delay.h> | ||
| 24 | #include <linux/io.h> | ||
| 25 | #include <linux/slab.h> | ||
| 26 | #include <linux/clk.h> | ||
| 27 | #include <linux/usb/ch9.h> | ||
| 28 | #include <linux/usb/gadget.h> | ||
| 29 | |||
| 30 | #include <mach/regs-s3c2443-clock.h> | ||
| 31 | #include <plat/udc.h> | ||
| 32 | |||
| 33 | #define S3C_HSUDC_REG(x) (x) | ||
| 34 | |||
| 35 | /* Non-Indexed Registers */ | ||
| 36 | #define S3C_IR S3C_HSUDC_REG(0x00) /* Index Register */ | ||
| 37 | #define S3C_EIR S3C_HSUDC_REG(0x04) /* EP Intr Status */ | ||
| 38 | #define S3C_EIR_EP0 (1<<0) | ||
| 39 | #define S3C_EIER S3C_HSUDC_REG(0x08) /* EP Intr Enable */ | ||
| 40 | #define S3C_FAR S3C_HSUDC_REG(0x0c) /* Gadget Address */ | ||
| 41 | #define S3C_FNR S3C_HSUDC_REG(0x10) /* Frame Number */ | ||
| 42 | #define S3C_EDR S3C_HSUDC_REG(0x14) /* EP Direction */ | ||
| 43 | #define S3C_TR S3C_HSUDC_REG(0x18) /* Test Register */ | ||
| 44 | #define S3C_SSR S3C_HSUDC_REG(0x1c) /* System Status */ | ||
| 45 | #define S3C_SSR_DTZIEN_EN (0xff8f) | ||
| 46 | #define S3C_SSR_ERR (0xff80) | ||
| 47 | #define S3C_SSR_VBUSON (1 << 8) | ||
| 48 | #define S3C_SSR_HSP (1 << 4) | ||
| 49 | #define S3C_SSR_SDE (1 << 3) | ||
| 50 | #define S3C_SSR_RESUME (1 << 2) | ||
| 51 | #define S3C_SSR_SUSPEND (1 << 1) | ||
| 52 | #define S3C_SSR_RESET (1 << 0) | ||
| 53 | #define S3C_SCR S3C_HSUDC_REG(0x20) /* System Control */ | ||
| 54 | #define S3C_SCR_DTZIEN_EN (1 << 14) | ||
| 55 | #define S3C_SCR_RRD_EN (1 << 5) | ||
| 56 | #define S3C_SCR_SUS_EN (1 << 1) | ||
| 57 | #define S3C_SCR_RST_EN (1 << 0) | ||
| 58 | #define S3C_EP0SR S3C_HSUDC_REG(0x24) /* EP0 Status */ | ||
| 59 | #define S3C_EP0SR_EP0_LWO (1 << 6) | ||
| 60 | #define S3C_EP0SR_STALL (1 << 4) | ||
| 61 | #define S3C_EP0SR_TX_SUCCESS (1 << 1) | ||
| 62 | #define S3C_EP0SR_RX_SUCCESS (1 << 0) | ||
| 63 | #define S3C_EP0CR S3C_HSUDC_REG(0x28) /* EP0 Control */ | ||
| 64 | #define S3C_BR(_x) S3C_HSUDC_REG(0x60 + (_x * 4)) | ||
| 65 | |||
| 66 | /* Indexed Registers */ | ||
| 67 | #define S3C_ESR S3C_HSUDC_REG(0x2c) /* EPn Status */ | ||
| 68 | #define S3C_ESR_FLUSH (1 << 6) | ||
| 69 | #define S3C_ESR_STALL (1 << 5) | ||
| 70 | #define S3C_ESR_LWO (1 << 4) | ||
| 71 | #define S3C_ESR_PSIF_ONE (1 << 2) | ||
| 72 | #define S3C_ESR_PSIF_TWO (2 << 2) | ||
| 73 | #define S3C_ESR_TX_SUCCESS (1 << 1) | ||
| 74 | #define S3C_ESR_RX_SUCCESS (1 << 0) | ||
| 75 | #define S3C_ECR S3C_HSUDC_REG(0x30) /* EPn Control */ | ||
| 76 | #define S3C_ECR_DUEN (1 << 7) | ||
| 77 | #define S3C_ECR_FLUSH (1 << 6) | ||
| 78 | #define S3C_ECR_STALL (1 << 1) | ||
| 79 | #define S3C_ECR_IEMS (1 << 0) | ||
| 80 | #define S3C_BRCR S3C_HSUDC_REG(0x34) /* Read Count */ | ||
| 81 | #define S3C_BWCR S3C_HSUDC_REG(0x38) /* Write Count */ | ||
| 82 | #define S3C_MPR S3C_HSUDC_REG(0x3c) /* Max Pkt Size */ | ||
| 83 | |||
| 84 | #define WAIT_FOR_SETUP (0) | ||
| 85 | #define DATA_STATE_XMIT (1) | ||
| 86 | #define DATA_STATE_RECV (2) | ||
| 87 | |||
| 88 | /** | ||
| 89 | * struct s3c_hsudc_ep - Endpoint representation used by driver. | ||
| 90 | * @ep: USB gadget layer representation of device endpoint. | ||
| 91 | * @name: Endpoint name (as required by ep autoconfiguration). | ||
| 92 | * @dev: Reference to the device controller to which this EP belongs. | ||
| 93 | * @desc: Endpoint descriptor obtained from the gadget driver. | ||
| 94 | * @queue: Transfer request queue for the endpoint. | ||
| 95 | * @stopped: Maintains state of endpoint, set if EP is halted. | ||
| 96 | * @bEndpointAddress: EP address (including direction bit). | ||
| 97 | * @fifo: Base address of EP FIFO. | ||
| 98 | */ | ||
| 99 | struct s3c_hsudc_ep { | ||
| 100 | struct usb_ep ep; | ||
| 101 | char name[20]; | ||
| 102 | struct s3c_hsudc *dev; | ||
| 103 | const struct usb_endpoint_descriptor *desc; | ||
| 104 | struct list_head queue; | ||
| 105 | u8 stopped; | ||
| 106 | u8 wedge; | ||
| 107 | u8 bEndpointAddress; | ||
| 108 | void __iomem *fifo; | ||
| 109 | }; | ||
| 110 | |||
| 111 | /** | ||
| 112 | * struct s3c_hsudc_req - Driver encapsulation of USB gadget transfer request. | ||
| 113 | * @req: Reference to USB gadget transfer request. | ||
| 114 | * @queue: Used for inserting this request to the endpoint request queue. | ||
| 115 | */ | ||
| 116 | struct s3c_hsudc_req { | ||
| 117 | struct usb_request req; | ||
| 118 | struct list_head queue; | ||
| 119 | }; | ||
| 120 | |||
| 121 | /** | ||
| 122 | * struct s3c_hsudc - Driver's abstraction of the device controller. | ||
| 123 | * @gadget: Instance of usb_gadget which is referenced by gadget driver. | ||
| 124 | * @driver: Reference to currenty active gadget driver. | ||
| 125 | * @dev: The device reference used by probe function. | ||
| 126 | * @lock: Lock to synchronize the usage of Endpoints (EP's are indexed). | ||
| 127 | * @regs: Remapped base address of controller's register space. | ||
| 128 | * @mem_rsrc: Device memory resource used for remapping device register space. | ||
| 129 | * irq: IRQ number used by the controller. | ||
| 130 | * uclk: Reference to the controller clock. | ||
| 131 | * ep0state: Current state of EP0. | ||
| 132 | * ep: List of endpoints supported by the controller. | ||
| 133 | */ | ||
| 134 | struct s3c_hsudc { | ||
| 135 | struct usb_gadget gadget; | ||
| 136 | struct usb_gadget_driver *driver; | ||
| 137 | struct device *dev; | ||
| 138 | struct s3c24xx_hsudc_platdata *pd; | ||
| 139 | spinlock_t lock; | ||
| 140 | void __iomem *regs; | ||
| 141 | struct resource *mem_rsrc; | ||
| 142 | int irq; | ||
| 143 | struct clk *uclk; | ||
| 144 | int ep0state; | ||
| 145 | struct s3c_hsudc_ep ep[]; | ||
| 146 | }; | ||
| 147 | |||
| 148 | #define ep_maxpacket(_ep) ((_ep)->ep.maxpacket) | ||
| 149 | #define ep_is_in(_ep) ((_ep)->bEndpointAddress & USB_DIR_IN) | ||
| 150 | #define ep_index(_ep) ((_ep)->bEndpointAddress & \ | ||
| 151 | USB_ENDPOINT_NUMBER_MASK) | ||
| 152 | |||
| 153 | static struct s3c_hsudc *the_controller; | ||
| 154 | static const char driver_name[] = "s3c-udc"; | ||
| 155 | static const char ep0name[] = "ep0-control"; | ||
| 156 | |||
| 157 | static inline struct s3c_hsudc_req *our_req(struct usb_request *req) | ||
| 158 | { | ||
| 159 | return container_of(req, struct s3c_hsudc_req, req); | ||
| 160 | } | ||
| 161 | |||
| 162 | static inline struct s3c_hsudc_ep *our_ep(struct usb_ep *ep) | ||
| 163 | { | ||
| 164 | return container_of(ep, struct s3c_hsudc_ep, ep); | ||
| 165 | } | ||
| 166 | |||
| 167 | static inline struct s3c_hsudc *to_hsudc(struct usb_gadget *gadget) | ||
| 168 | { | ||
| 169 | return container_of(gadget, struct s3c_hsudc, gadget); | ||
| 170 | } | ||
| 171 | |||
| 172 | static inline void set_index(struct s3c_hsudc *hsudc, int ep_addr) | ||
| 173 | { | ||
| 174 | ep_addr &= USB_ENDPOINT_NUMBER_MASK; | ||
| 175 | writel(ep_addr, hsudc->regs + S3C_IR); | ||
| 176 | } | ||
| 177 | |||
| 178 | static inline void __orr32(void __iomem *ptr, u32 val) | ||
| 179 | { | ||
| 180 | writel(readl(ptr) | val, ptr); | ||
| 181 | } | ||
| 182 | |||
| 183 | static void s3c_hsudc_init_phy(void) | ||
| 184 | { | ||
| 185 | u32 cfg; | ||
| 186 | |||
| 187 | cfg = readl(S3C2443_PWRCFG) | S3C2443_PWRCFG_USBPHY; | ||
| 188 | writel(cfg, S3C2443_PWRCFG); | ||
| 189 | |||
| 190 | cfg = readl(S3C2443_URSTCON); | ||
| 191 | cfg |= (S3C2443_URSTCON_FUNCRST | S3C2443_URSTCON_PHYRST); | ||
| 192 | writel(cfg, S3C2443_URSTCON); | ||
| 193 | mdelay(1); | ||
| 194 | |||
| 195 | cfg = readl(S3C2443_URSTCON); | ||
| 196 | cfg &= ~(S3C2443_URSTCON_FUNCRST | S3C2443_URSTCON_PHYRST); | ||
| 197 | writel(cfg, S3C2443_URSTCON); | ||
| 198 | |||
| 199 | cfg = readl(S3C2443_PHYCTRL); | ||
| 200 | cfg &= ~(S3C2443_PHYCTRL_CLKSEL | S3C2443_PHYCTRL_DSPORT); | ||
| 201 | cfg |= (S3C2443_PHYCTRL_EXTCLK | S3C2443_PHYCTRL_PLLSEL); | ||
| 202 | writel(cfg, S3C2443_PHYCTRL); | ||
| 203 | |||
| 204 | cfg = readl(S3C2443_PHYPWR); | ||
| 205 | cfg &= ~(S3C2443_PHYPWR_FSUSPEND | S3C2443_PHYPWR_PLL_PWRDN | | ||
| 206 | S3C2443_PHYPWR_XO_ON | S3C2443_PHYPWR_PLL_REFCLK | | ||
| 207 | S3C2443_PHYPWR_ANALOG_PD); | ||
| 208 | cfg |= S3C2443_PHYPWR_COMMON_ON; | ||
| 209 | writel(cfg, S3C2443_PHYPWR); | ||
| 210 | |||
| 211 | cfg = readl(S3C2443_UCLKCON); | ||
| 212 | cfg |= (S3C2443_UCLKCON_DETECT_VBUS | S3C2443_UCLKCON_FUNC_CLKEN | | ||
| 213 | S3C2443_UCLKCON_TCLKEN); | ||
| 214 | writel(cfg, S3C2443_UCLKCON); | ||
| 215 | } | ||
| 216 | |||
| 217 | static void s3c_hsudc_uninit_phy(void) | ||
| 218 | { | ||
| 219 | u32 cfg; | ||
| 220 | |||
| 221 | cfg = readl(S3C2443_PWRCFG) & ~S3C2443_PWRCFG_USBPHY; | ||
| 222 | writel(cfg, S3C2443_PWRCFG); | ||
| 223 | |||
| 224 | writel(S3C2443_PHYPWR_FSUSPEND, S3C2443_PHYPWR); | ||
| 225 | |||
| 226 | cfg = readl(S3C2443_UCLKCON) & ~S3C2443_UCLKCON_FUNC_CLKEN; | ||
| 227 | writel(cfg, S3C2443_UCLKCON); | ||
| 228 | } | ||
| 229 | |||
| 230 | /** | ||
| 231 | * s3c_hsudc_complete_request - Complete a transfer request. | ||
| 232 | * @hsep: Endpoint to which the request belongs. | ||
| 233 | * @hsreq: Transfer request to be completed. | ||
| 234 | * @status: Transfer completion status for the transfer request. | ||
| 235 | */ | ||
| 236 | static void s3c_hsudc_complete_request(struct s3c_hsudc_ep *hsep, | ||
| 237 | struct s3c_hsudc_req *hsreq, int status) | ||
| 238 | { | ||
| 239 | unsigned int stopped = hsep->stopped; | ||
| 240 | struct s3c_hsudc *hsudc = hsep->dev; | ||
| 241 | |||
| 242 | list_del_init(&hsreq->queue); | ||
| 243 | hsreq->req.status = status; | ||
| 244 | |||
| 245 | if (!ep_index(hsep)) { | ||
| 246 | hsudc->ep0state = WAIT_FOR_SETUP; | ||
| 247 | hsep->bEndpointAddress &= ~USB_DIR_IN; | ||
| 248 | } | ||
| 249 | |||
| 250 | hsep->stopped = 1; | ||
| 251 | spin_unlock(&hsudc->lock); | ||
| 252 | if (hsreq->req.complete != NULL) | ||
| 253 | hsreq->req.complete(&hsep->ep, &hsreq->req); | ||
| 254 | spin_lock(&hsudc->lock); | ||
| 255 | hsep->stopped = stopped; | ||
| 256 | } | ||
| 257 | |||
| 258 | /** | ||
| 259 | * s3c_hsudc_nuke_ep - Terminate all requests queued for a endpoint. | ||
| 260 | * @hsep: Endpoint for which queued requests have to be terminated. | ||
| 261 | * @status: Transfer completion status for the transfer request. | ||
| 262 | */ | ||
| 263 | static void s3c_hsudc_nuke_ep(struct s3c_hsudc_ep *hsep, int status) | ||
| 264 | { | ||
| 265 | struct s3c_hsudc_req *hsreq; | ||
| 266 | |||
| 267 | while (!list_empty(&hsep->queue)) { | ||
| 268 | hsreq = list_entry(hsep->queue.next, | ||
| 269 | struct s3c_hsudc_req, queue); | ||
| 270 | s3c_hsudc_complete_request(hsep, hsreq, status); | ||
| 271 | } | ||
| 272 | } | ||
| 273 | |||
| 274 | /** | ||
| 275 | * s3c_hsudc_stop_activity - Stop activity on all endpoints. | ||
| 276 | * @hsudc: Device controller for which EP activity is to be stopped. | ||
| 277 | * @driver: Reference to the gadget driver which is currently active. | ||
| 278 | * | ||
| 279 | * All the endpoints are stopped and any pending transfer requests if any on | ||
| 280 | * the endpoint are terminated. | ||
| 281 | */ | ||
| 282 | static void s3c_hsudc_stop_activity(struct s3c_hsudc *hsudc, | ||
| 283 | struct usb_gadget_driver *driver) | ||
| 284 | { | ||
| 285 | struct s3c_hsudc_ep *hsep; | ||
| 286 | int epnum; | ||
| 287 | |||
| 288 | hsudc->gadget.speed = USB_SPEED_UNKNOWN; | ||
| 289 | |||
| 290 | for (epnum = 0; epnum < hsudc->pd->epnum; epnum++) { | ||
| 291 | hsep = &hsudc->ep[epnum]; | ||
| 292 | hsep->stopped = 1; | ||
| 293 | s3c_hsudc_nuke_ep(hsep, -ESHUTDOWN); | ||
| 294 | } | ||
| 295 | |||
| 296 | spin_unlock(&hsudc->lock); | ||
| 297 | driver->disconnect(&hsudc->gadget); | ||
| 298 | spin_lock(&hsudc->lock); | ||
| 299 | } | ||
| 300 | |||
| 301 | /** | ||
| 302 | * s3c_hsudc_read_setup_pkt - Read the received setup packet from EP0 fifo. | ||
| 303 | * @hsudc: Device controller from which setup packet is to be read. | ||
| 304 | * @buf: The buffer into which the setup packet is read. | ||
| 305 | * | ||
| 306 | * The setup packet received in the EP0 fifo is read and stored into a | ||
| 307 | * given buffer address. | ||
| 308 | */ | ||
| 309 | |||
| 310 | static void s3c_hsudc_read_setup_pkt(struct s3c_hsudc *hsudc, u16 *buf) | ||
| 311 | { | ||
| 312 | int count; | ||
| 313 | |||
| 314 | count = readl(hsudc->regs + S3C_BRCR); | ||
| 315 | while (count--) | ||
| 316 | *buf++ = (u16)readl(hsudc->regs + S3C_BR(0)); | ||
| 317 | |||
| 318 | writel(S3C_EP0SR_RX_SUCCESS, hsudc->regs + S3C_EP0SR); | ||
| 319 | } | ||
| 320 | |||
| 321 | /** | ||
| 322 | * s3c_hsudc_write_fifo - Write next chunk of transfer data to EP fifo. | ||
| 323 | * @hsep: Endpoint to which the data is to be written. | ||
| 324 | * @hsreq: Transfer request from which the next chunk of data is written. | ||
| 325 | * | ||
| 326 | * Write the next chunk of data from a transfer request to the endpoint FIFO. | ||
| 327 | * If the transfer request completes, 1 is returned, otherwise 0 is returned. | ||
| 328 | */ | ||
| 329 | static int s3c_hsudc_write_fifo(struct s3c_hsudc_ep *hsep, | ||
| 330 | struct s3c_hsudc_req *hsreq) | ||
| 331 | { | ||
| 332 | u16 *buf; | ||
| 333 | u32 max = ep_maxpacket(hsep); | ||
| 334 | u32 count, length; | ||
| 335 | bool is_last; | ||
| 336 | void __iomem *fifo = hsep->fifo; | ||
| 337 | |||
| 338 | buf = hsreq->req.buf + hsreq->req.actual; | ||
| 339 | prefetch(buf); | ||
| 340 | |||
| 341 | length = hsreq->req.length - hsreq->req.actual; | ||
| 342 | length = min(length, max); | ||
| 343 | hsreq->req.actual += length; | ||
| 344 | |||
| 345 | writel(length, hsep->dev->regs + S3C_BWCR); | ||
| 346 | for (count = 0; count < length; count += 2) | ||
| 347 | writel(*buf++, fifo); | ||
| 348 | |||
| 349 | if (count != max) { | ||
| 350 | is_last = true; | ||
| 351 | } else { | ||
| 352 | if (hsreq->req.length != hsreq->req.actual || hsreq->req.zero) | ||
| 353 | is_last = false; | ||
| 354 | else | ||
| 355 | is_last = true; | ||
| 356 | } | ||
| 357 | |||
| 358 | if (is_last) { | ||
| 359 | s3c_hsudc_complete_request(hsep, hsreq, 0); | ||
| 360 | return 1; | ||
| 361 | } | ||
| 362 | |||
| 363 | return 0; | ||
| 364 | } | ||
| 365 | |||
| 366 | /** | ||
| 367 | * s3c_hsudc_read_fifo - Read the next chunk of data from EP fifo. | ||
| 368 | * @hsep: Endpoint from which the data is to be read. | ||
| 369 | * @hsreq: Transfer request to which the next chunk of data read is written. | ||
| 370 | * | ||
| 371 | * Read the next chunk of data from the endpoint FIFO and a write it to the | ||
| 372 | * transfer request buffer. If the transfer request completes, 1 is returned, | ||
| 373 | * otherwise 0 is returned. | ||
| 374 | */ | ||
| 375 | static int s3c_hsudc_read_fifo(struct s3c_hsudc_ep *hsep, | ||
| 376 | struct s3c_hsudc_req *hsreq) | ||
| 377 | { | ||
| 378 | struct s3c_hsudc *hsudc = hsep->dev; | ||
| 379 | u32 csr, offset; | ||
| 380 | u16 *buf, word; | ||
| 381 | u32 buflen, rcnt, rlen; | ||
| 382 | void __iomem *fifo = hsep->fifo; | ||
| 383 | u32 is_short = 0; | ||
| 384 | |||
| 385 | offset = (ep_index(hsep)) ? S3C_ESR : S3C_EP0SR; | ||
| 386 | csr = readl(hsudc->regs + offset); | ||
| 387 | if (!(csr & S3C_ESR_RX_SUCCESS)) | ||
| 388 | return -EINVAL; | ||
| 389 | |||
| 390 | buf = hsreq->req.buf + hsreq->req.actual; | ||
| 391 | prefetchw(buf); | ||
| 392 | buflen = hsreq->req.length - hsreq->req.actual; | ||
| 393 | |||
| 394 | rcnt = readl(hsudc->regs + S3C_BRCR); | ||
| 395 | rlen = (csr & S3C_ESR_LWO) ? (rcnt * 2 - 1) : (rcnt * 2); | ||
| 396 | |||
| 397 | hsreq->req.actual += min(rlen, buflen); | ||
| 398 | is_short = (rlen < hsep->ep.maxpacket); | ||
| 399 | |||
| 400 | while (rcnt-- != 0) { | ||
| 401 | word = (u16)readl(fifo); | ||
| 402 | if (buflen) { | ||
| 403 | *buf++ = word; | ||
| 404 | buflen--; | ||
| 405 | } else { | ||
| 406 | hsreq->req.status = -EOVERFLOW; | ||
| 407 | } | ||
| 408 | } | ||
| 409 | |||
| 410 | writel(S3C_ESR_RX_SUCCESS, hsudc->regs + offset); | ||
| 411 | |||
| 412 | if (is_short || hsreq->req.actual == hsreq->req.length) { | ||
| 413 | s3c_hsudc_complete_request(hsep, hsreq, 0); | ||
| 414 | return 1; | ||
| 415 | } | ||
| 416 | |||
| 417 | return 0; | ||
| 418 | } | ||
| 419 | |||
| 420 | /** | ||
| 421 | * s3c_hsudc_epin_intr - Handle in-endpoint interrupt. | ||
| 422 | * @hsudc - Device controller for which the interrupt is to be handled. | ||
| 423 | * @ep_idx - Endpoint number on which an interrupt is pending. | ||
| 424 | * | ||
| 425 | * Handles interrupt for a in-endpoint. The interrupts that are handled are | ||
| 426 | * stall and data transmit complete interrupt. | ||
| 427 | */ | ||
| 428 | static void s3c_hsudc_epin_intr(struct s3c_hsudc *hsudc, u32 ep_idx) | ||
| 429 | { | ||
| 430 | struct s3c_hsudc_ep *hsep = &hsudc->ep[ep_idx]; | ||
| 431 | struct s3c_hsudc_req *hsreq; | ||
| 432 | u32 csr; | ||
| 433 | |||
| 434 | csr = readl((u32)hsudc->regs + S3C_ESR); | ||
| 435 | if (csr & S3C_ESR_STALL) { | ||
| 436 | writel(S3C_ESR_STALL, hsudc->regs + S3C_ESR); | ||
| 437 | return; | ||
| 438 | } | ||
| 439 | |||
| 440 | if (csr & S3C_ESR_TX_SUCCESS) { | ||
| 441 | writel(S3C_ESR_TX_SUCCESS, hsudc->regs + S3C_ESR); | ||
| 442 | if (list_empty(&hsep->queue)) | ||
| 443 | return; | ||
| 444 | |||
| 445 | hsreq = list_entry(hsep->queue.next, | ||
| 446 | struct s3c_hsudc_req, queue); | ||
| 447 | if ((s3c_hsudc_write_fifo(hsep, hsreq) == 0) && | ||
| 448 | (csr & S3C_ESR_PSIF_TWO)) | ||
| 449 | s3c_hsudc_write_fifo(hsep, hsreq); | ||
| 450 | } | ||
| 451 | } | ||
| 452 | |||
| 453 | /** | ||
| 454 | * s3c_hsudc_epout_intr - Handle out-endpoint interrupt. | ||
| 455 | * @hsudc - Device controller for which the interrupt is to be handled. | ||
| 456 | * @ep_idx - Endpoint number on which an interrupt is pending. | ||
| 457 | * | ||
| 458 | * Handles interrupt for a out-endpoint. The interrupts that are handled are | ||
| 459 | * stall, flush and data ready interrupt. | ||
| 460 | */ | ||
| 461 | static void s3c_hsudc_epout_intr(struct s3c_hsudc *hsudc, u32 ep_idx) | ||
| 462 | { | ||
| 463 | struct s3c_hsudc_ep *hsep = &hsudc->ep[ep_idx]; | ||
| 464 | struct s3c_hsudc_req *hsreq; | ||
| 465 | u32 csr; | ||
| 466 | |||
| 467 | csr = readl((u32)hsudc->regs + S3C_ESR); | ||
| 468 | if (csr & S3C_ESR_STALL) { | ||
| 469 | writel(S3C_ESR_STALL, hsudc->regs + S3C_ESR); | ||
| 470 | return; | ||
| 471 | } | ||
| 472 | |||
| 473 | if (csr & S3C_ESR_FLUSH) { | ||
| 474 | __orr32(hsudc->regs + S3C_ECR, S3C_ECR_FLUSH); | ||
| 475 | return; | ||
| 476 | } | ||
| 477 | |||
| 478 | if (csr & S3C_ESR_RX_SUCCESS) { | ||
| 479 | if (list_empty(&hsep->queue)) | ||
| 480 | return; | ||
| 481 | |||
| 482 | hsreq = list_entry(hsep->queue.next, | ||
| 483 | struct s3c_hsudc_req, queue); | ||
| 484 | if (((s3c_hsudc_read_fifo(hsep, hsreq)) == 0) && | ||
| 485 | (csr & S3C_ESR_PSIF_TWO)) | ||
| 486 | s3c_hsudc_read_fifo(hsep, hsreq); | ||
| 487 | } | ||
| 488 | } | ||
| 489 | |||
| 490 | /** s3c_hsudc_set_halt - Set or clear a endpoint halt. | ||
| 491 | * @_ep: Endpoint on which halt has to be set or cleared. | ||
| 492 | * @value: 1 for setting halt on endpoint, 0 to clear halt. | ||
| 493 | * | ||
| 494 | * Set or clear endpoint halt. If halt is set, the endpoint is stopped. | ||
| 495 | * If halt is cleared, for in-endpoints, if there are any pending | ||
| 496 | * transfer requests, transfers are started. | ||
| 497 | */ | ||
| 498 | static int s3c_hsudc_set_halt(struct usb_ep *_ep, int value) | ||
| 499 | { | ||
| 500 | struct s3c_hsudc_ep *hsep = our_ep(_ep); | ||
| 501 | struct s3c_hsudc *hsudc = hsep->dev; | ||
| 502 | struct s3c_hsudc_req *hsreq; | ||
| 503 | unsigned long irqflags; | ||
| 504 | u32 ecr; | ||
| 505 | u32 offset; | ||
| 506 | |||
| 507 | if (value && ep_is_in(hsep) && !list_empty(&hsep->queue)) | ||
| 508 | return -EAGAIN; | ||
| 509 | |||
| 510 | spin_lock_irqsave(&hsudc->lock, irqflags); | ||
| 511 | set_index(hsudc, ep_index(hsep)); | ||
| 512 | offset = (ep_index(hsep)) ? S3C_ECR : S3C_EP0CR; | ||
| 513 | ecr = readl(hsudc->regs + offset); | ||
| 514 | |||
| 515 | if (value) { | ||
| 516 | ecr |= S3C_ECR_STALL; | ||
| 517 | if (ep_index(hsep)) | ||
| 518 | ecr |= S3C_ECR_FLUSH; | ||
| 519 | hsep->stopped = 1; | ||
| 520 | } else { | ||
| 521 | ecr &= ~S3C_ECR_STALL; | ||
| 522 | hsep->stopped = hsep->wedge = 0; | ||
| 523 | } | ||
| 524 | writel(ecr, hsudc->regs + offset); | ||
| 525 | |||
| 526 | if (ep_is_in(hsep) && !list_empty(&hsep->queue) && !value) { | ||
| 527 | hsreq = list_entry(hsep->queue.next, | ||
| 528 | struct s3c_hsudc_req, queue); | ||
| 529 | if (hsreq) | ||
| 530 | s3c_hsudc_write_fifo(hsep, hsreq); | ||
| 531 | } | ||
| 532 | |||
| 533 | spin_unlock_irqrestore(&hsudc->lock, irqflags); | ||
| 534 | return 0; | ||
| 535 | } | ||
| 536 | |||
| 537 | /** s3c_hsudc_set_wedge - Sets the halt feature with the clear requests ignored | ||
| 538 | * @_ep: Endpoint on which wedge has to be set. | ||
| 539 | * | ||
| 540 | * Sets the halt feature with the clear requests ignored. | ||
| 541 | */ | ||
| 542 | static int s3c_hsudc_set_wedge(struct usb_ep *_ep) | ||
| 543 | { | ||
| 544 | struct s3c_hsudc_ep *hsep = our_ep(_ep); | ||
| 545 | |||
| 546 | if (!hsep) | ||
| 547 | return -EINVAL; | ||
| 548 | |||
| 549 | hsep->wedge = 1; | ||
| 550 | return usb_ep_set_halt(_ep); | ||
| 551 | } | ||
| 552 | |||
| 553 | /** s3c_hsudc_handle_reqfeat - Handle set feature or clear feature requests. | ||
| 554 | * @_ep: Device controller on which the set/clear feature needs to be handled. | ||
| 555 | * @ctrl: Control request as received on the endpoint 0. | ||
| 556 | * | ||
| 557 | * Handle set feature or clear feature control requests on the control endpoint. | ||
| 558 | */ | ||
| 559 | static int s3c_hsudc_handle_reqfeat(struct s3c_hsudc *hsudc, | ||
| 560 | struct usb_ctrlrequest *ctrl) | ||
| 561 | { | ||
| 562 | struct s3c_hsudc_ep *hsep; | ||
| 563 | bool set = (ctrl->bRequest == USB_REQ_SET_FEATURE); | ||
| 564 | u8 ep_num = ctrl->wIndex & USB_ENDPOINT_NUMBER_MASK; | ||
| 565 | |||
| 566 | if (ctrl->bRequestType == USB_RECIP_ENDPOINT) { | ||
| 567 | hsep = &hsudc->ep[ep_num]; | ||
| 568 | switch (le16_to_cpu(ctrl->wValue)) { | ||
| 569 | case USB_ENDPOINT_HALT: | ||
| 570 | if (set || (!set && !hsep->wedge)) | ||
| 571 | s3c_hsudc_set_halt(&hsep->ep, set); | ||
| 572 | return 0; | ||
| 573 | } | ||
| 574 | } | ||
| 575 | |||
| 576 | return -ENOENT; | ||
| 577 | } | ||
| 578 | |||
| 579 | /** | ||
| 580 | * s3c_hsudc_process_req_status - Handle get status control request. | ||
| 581 | * @hsudc: Device controller on which get status request has be handled. | ||
| 582 | * @ctrl: Control request as received on the endpoint 0. | ||
| 583 | * | ||
| 584 | * Handle get status control request received on control endpoint. | ||
| 585 | */ | ||
| 586 | static void s3c_hsudc_process_req_status(struct s3c_hsudc *hsudc, | ||
| 587 | struct usb_ctrlrequest *ctrl) | ||
| 588 | { | ||
| 589 | struct s3c_hsudc_ep *hsep0 = &hsudc->ep[0]; | ||
| 590 | struct s3c_hsudc_req hsreq; | ||
| 591 | struct s3c_hsudc_ep *hsep; | ||
| 592 | __le16 reply; | ||
| 593 | u8 epnum; | ||
| 594 | |||
| 595 | switch (ctrl->bRequestType & USB_RECIP_MASK) { | ||
| 596 | case USB_RECIP_DEVICE: | ||
| 597 | reply = cpu_to_le16(0); | ||
| 598 | break; | ||
| 599 | |||
| 600 | case USB_RECIP_INTERFACE: | ||
| 601 | reply = cpu_to_le16(0); | ||
| 602 | break; | ||
| 603 | |||
| 604 | case USB_RECIP_ENDPOINT: | ||
| 605 | epnum = le16_to_cpu(ctrl->wIndex) & USB_ENDPOINT_NUMBER_MASK; | ||
| 606 | hsep = &hsudc->ep[epnum]; | ||
| 607 | reply = cpu_to_le16(hsep->stopped ? 1 : 0); | ||
| 608 | break; | ||
| 609 | } | ||
| 610 | |||
| 611 | INIT_LIST_HEAD(&hsreq.queue); | ||
| 612 | hsreq.req.length = 2; | ||
| 613 | hsreq.req.buf = &reply; | ||
| 614 | hsreq.req.actual = 0; | ||
| 615 | hsreq.req.complete = NULL; | ||
| 616 | s3c_hsudc_write_fifo(hsep0, &hsreq); | ||
| 617 | } | ||
| 618 | |||
| 619 | /** | ||
| 620 | * s3c_hsudc_process_setup - Process control request received on endpoint 0. | ||
| 621 | * @hsudc: Device controller on which control request has been received. | ||
| 622 | * | ||
| 623 | * Read the control request received on endpoint 0, decode it and handle | ||
| 624 | * the request. | ||
| 625 | */ | ||
| 626 | static void s3c_hsudc_process_setup(struct s3c_hsudc *hsudc) | ||
| 627 | { | ||
| 628 | struct s3c_hsudc_ep *hsep = &hsudc->ep[0]; | ||
| 629 | struct usb_ctrlrequest ctrl = {0}; | ||
| 630 | int ret; | ||
| 631 | |||
| 632 | s3c_hsudc_nuke_ep(hsep, -EPROTO); | ||
| 633 | s3c_hsudc_read_setup_pkt(hsudc, (u16 *)&ctrl); | ||
| 634 | |||
| 635 | if (ctrl.bRequestType & USB_DIR_IN) { | ||
| 636 | hsep->bEndpointAddress |= USB_DIR_IN; | ||
| 637 | hsudc->ep0state = DATA_STATE_XMIT; | ||
| 638 | } else { | ||
| 639 | hsep->bEndpointAddress &= ~USB_DIR_IN; | ||
| 640 | hsudc->ep0state = DATA_STATE_RECV; | ||
| 641 | } | ||
| 642 | |||
| 643 | switch (ctrl.bRequest) { | ||
| 644 | case USB_REQ_SET_ADDRESS: | ||
| 645 | if (ctrl.bRequestType != (USB_TYPE_STANDARD | USB_RECIP_DEVICE)) | ||
| 646 | break; | ||
| 647 | hsudc->ep0state = WAIT_FOR_SETUP; | ||
| 648 | return; | ||
| 649 | |||
| 650 | case USB_REQ_GET_STATUS: | ||
| 651 | if ((ctrl.bRequestType & USB_TYPE_MASK) != USB_TYPE_STANDARD) | ||
| 652 | break; | ||
| 653 | s3c_hsudc_process_req_status(hsudc, &ctrl); | ||
| 654 | return; | ||
| 655 | |||
| 656 | case USB_REQ_SET_FEATURE: | ||
| 657 | case USB_REQ_CLEAR_FEATURE: | ||
| 658 | if ((ctrl.bRequestType & USB_TYPE_MASK) != USB_TYPE_STANDARD) | ||
| 659 | break; | ||
| 660 | s3c_hsudc_handle_reqfeat(hsudc, &ctrl); | ||
| 661 | hsudc->ep0state = WAIT_FOR_SETUP; | ||
| 662 | return; | ||
| 663 | } | ||
| 664 | |||
| 665 | if (hsudc->driver) { | ||
| 666 | spin_unlock(&hsudc->lock); | ||
| 667 | ret = hsudc->driver->setup(&hsudc->gadget, &ctrl); | ||
| 668 | spin_lock(&hsudc->lock); | ||
| 669 | |||
| 670 | if (ctrl.bRequest == USB_REQ_SET_CONFIGURATION) { | ||
| 671 | hsep->bEndpointAddress &= ~USB_DIR_IN; | ||
| 672 | hsudc->ep0state = WAIT_FOR_SETUP; | ||
| 673 | } | ||
| 674 | |||
| 675 | if (ret < 0) { | ||
| 676 | dev_err(hsudc->dev, "setup failed, returned %d\n", | ||
| 677 | ret); | ||
| 678 | s3c_hsudc_set_halt(&hsep->ep, 1); | ||
| 679 | hsudc->ep0state = WAIT_FOR_SETUP; | ||
| 680 | hsep->bEndpointAddress &= ~USB_DIR_IN; | ||
| 681 | } | ||
| 682 | } | ||
| 683 | } | ||
| 684 | |||
| 685 | /** s3c_hsudc_handle_ep0_intr - Handle endpoint 0 interrupt. | ||
| 686 | * @hsudc: Device controller on which endpoint 0 interrupt has occured. | ||
| 687 | * | ||
| 688 | * Handle endpoint 0 interrupt when it occurs. EP0 interrupt could occur | ||
| 689 | * when a stall handshake is sent to host or data is sent/received on | ||
| 690 | * endpoint 0. | ||
| 691 | */ | ||
| 692 | static void s3c_hsudc_handle_ep0_intr(struct s3c_hsudc *hsudc) | ||
| 693 | { | ||
| 694 | struct s3c_hsudc_ep *hsep = &hsudc->ep[0]; | ||
| 695 | struct s3c_hsudc_req *hsreq; | ||
| 696 | u32 csr = readl(hsudc->regs + S3C_EP0SR); | ||
| 697 | u32 ecr; | ||
| 698 | |||
| 699 | if (csr & S3C_EP0SR_STALL) { | ||
| 700 | ecr = readl(hsudc->regs + S3C_EP0CR); | ||
| 701 | ecr &= ~(S3C_ECR_STALL | S3C_ECR_FLUSH); | ||
| 702 | writel(ecr, hsudc->regs + S3C_EP0CR); | ||
| 703 | |||
| 704 | writel(S3C_EP0SR_STALL, hsudc->regs + S3C_EP0SR); | ||
| 705 | hsep->stopped = 0; | ||
| 706 | |||
| 707 | s3c_hsudc_nuke_ep(hsep, -ECONNABORTED); | ||
| 708 | hsudc->ep0state = WAIT_FOR_SETUP; | ||
| 709 | hsep->bEndpointAddress &= ~USB_DIR_IN; | ||
| 710 | return; | ||
| 711 | } | ||
| 712 | |||
| 713 | if (csr & S3C_EP0SR_TX_SUCCESS) { | ||
| 714 | writel(S3C_EP0SR_TX_SUCCESS, hsudc->regs + S3C_EP0SR); | ||
| 715 | if (ep_is_in(hsep)) { | ||
| 716 | if (list_empty(&hsep->queue)) | ||
| 717 | return; | ||
| 718 | |||
| 719 | hsreq = list_entry(hsep->queue.next, | ||
| 720 | struct s3c_hsudc_req, queue); | ||
| 721 | s3c_hsudc_write_fifo(hsep, hsreq); | ||
| 722 | } | ||
| 723 | } | ||
| 724 | |||
| 725 | if (csr & S3C_EP0SR_RX_SUCCESS) { | ||
| 726 | if (hsudc->ep0state == WAIT_FOR_SETUP) | ||
| 727 | s3c_hsudc_process_setup(hsudc); | ||
| 728 | else { | ||
| 729 | if (!ep_is_in(hsep)) { | ||
| 730 | if (list_empty(&hsep->queue)) | ||
| 731 | return; | ||
| 732 | hsreq = list_entry(hsep->queue.next, | ||
| 733 | struct s3c_hsudc_req, queue); | ||
| 734 | s3c_hsudc_read_fifo(hsep, hsreq); | ||
| 735 | } | ||
| 736 | } | ||
| 737 | } | ||
| 738 | } | ||
| 739 | |||
| 740 | /** | ||
| 741 | * s3c_hsudc_ep_enable - Enable a endpoint. | ||
| 742 | * @_ep: The endpoint to be enabled. | ||
| 743 | * @desc: Endpoint descriptor. | ||
| 744 | * | ||
| 745 | * Enables a endpoint when called from the gadget driver. Endpoint stall if | ||
| 746 | * any is cleared, transfer type is configured and endpoint interrupt is | ||
| 747 | * enabled. | ||
| 748 | */ | ||
| 749 | static int s3c_hsudc_ep_enable(struct usb_ep *_ep, | ||
| 750 | const struct usb_endpoint_descriptor *desc) | ||
| 751 | { | ||
| 752 | struct s3c_hsudc_ep *hsep; | ||
| 753 | struct s3c_hsudc *hsudc; | ||
| 754 | unsigned long flags; | ||
| 755 | u32 ecr = 0; | ||
| 756 | |||
| 757 | hsep = container_of(_ep, struct s3c_hsudc_ep, ep); | ||
| 758 | if (!_ep || !desc || hsep->desc || _ep->name == ep0name | ||
| 759 | || desc->bDescriptorType != USB_DT_ENDPOINT | ||
| 760 | || hsep->bEndpointAddress != desc->bEndpointAddress | ||
| 761 | || ep_maxpacket(hsep) < le16_to_cpu(desc->wMaxPacketSize)) | ||
| 762 | return -EINVAL; | ||
| 763 | |||
| 764 | if ((desc->bmAttributes == USB_ENDPOINT_XFER_BULK | ||
| 765 | && le16_to_cpu(desc->wMaxPacketSize) != ep_maxpacket(hsep)) | ||
| 766 | || !desc->wMaxPacketSize) | ||
| 767 | return -ERANGE; | ||
| 768 | |||
| 769 | hsudc = hsep->dev; | ||
| 770 | if (!hsudc->driver || hsudc->gadget.speed == USB_SPEED_UNKNOWN) | ||
| 771 | return -ESHUTDOWN; | ||
| 772 | |||
| 773 | spin_lock_irqsave(&hsudc->lock, flags); | ||
| 774 | |||
| 775 | set_index(hsudc, hsep->bEndpointAddress); | ||
| 776 | ecr |= ((usb_endpoint_xfer_int(desc)) ? S3C_ECR_IEMS : S3C_ECR_DUEN); | ||
| 777 | writel(ecr, hsudc->regs + S3C_ECR); | ||
| 778 | |||
| 779 | hsep->stopped = hsep->wedge = 0; | ||
| 780 | hsep->desc = desc; | ||
| 781 | hsep->ep.maxpacket = le16_to_cpu(desc->wMaxPacketSize); | ||
| 782 | |||
| 783 | s3c_hsudc_set_halt(_ep, 0); | ||
| 784 | __set_bit(ep_index(hsep), hsudc->regs + S3C_EIER); | ||
| 785 | |||
| 786 | spin_unlock_irqrestore(&hsudc->lock, flags); | ||
| 787 | return 0; | ||
| 788 | } | ||
| 789 | |||
| 790 | /** | ||
| 791 | * s3c_hsudc_ep_disable - Disable a endpoint. | ||
| 792 | * @_ep: The endpoint to be disabled. | ||
| 793 | * @desc: Endpoint descriptor. | ||
| 794 | * | ||
| 795 | * Disables a endpoint when called from the gadget driver. | ||
| 796 | */ | ||
| 797 | static int s3c_hsudc_ep_disable(struct usb_ep *_ep) | ||
| 798 | { | ||
| 799 | struct s3c_hsudc_ep *hsep = our_ep(_ep); | ||
| 800 | struct s3c_hsudc *hsudc = hsep->dev; | ||
| 801 | unsigned long flags; | ||
| 802 | |||
| 803 | if (!_ep || !hsep->desc) | ||
| 804 | return -EINVAL; | ||
| 805 | |||
| 806 | spin_lock_irqsave(&hsudc->lock, flags); | ||
| 807 | |||
| 808 | set_index(hsudc, hsep->bEndpointAddress); | ||
| 809 | __clear_bit(ep_index(hsep), hsudc->regs + S3C_EIER); | ||
| 810 | |||
| 811 | s3c_hsudc_nuke_ep(hsep, -ESHUTDOWN); | ||
| 812 | |||
| 813 | hsep->desc = 0; | ||
| 814 | hsep->stopped = 1; | ||
| 815 | |||
| 816 | spin_unlock_irqrestore(&hsudc->lock, flags); | ||
| 817 | return 0; | ||
| 818 | } | ||
| 819 | |||
| 820 | /** | ||
| 821 | * s3c_hsudc_alloc_request - Allocate a new request. | ||
| 822 | * @_ep: Endpoint for which request is allocated (not used). | ||
| 823 | * @gfp_flags: Flags used for the allocation. | ||
| 824 | * | ||
| 825 | * Allocates a single transfer request structure when called from gadget driver. | ||
| 826 | */ | ||
| 827 | static struct usb_request *s3c_hsudc_alloc_request(struct usb_ep *_ep, | ||
| 828 | gfp_t gfp_flags) | ||
| 829 | { | ||
| 830 | struct s3c_hsudc_req *hsreq; | ||
| 831 | |||
| 832 | hsreq = kzalloc(sizeof *hsreq, gfp_flags); | ||
| 833 | if (!hsreq) | ||
| 834 | return 0; | ||
| 835 | |||
| 836 | INIT_LIST_HEAD(&hsreq->queue); | ||
| 837 | return &hsreq->req; | ||
| 838 | } | ||
| 839 | |||
| 840 | /** | ||
| 841 | * s3c_hsudc_free_request - Deallocate a request. | ||
| 842 | * @ep: Endpoint for which request is deallocated (not used). | ||
| 843 | * @_req: Request to be deallocated. | ||
| 844 | * | ||
| 845 | * Allocates a single transfer request structure when called from gadget driver. | ||
| 846 | */ | ||
| 847 | static void s3c_hsudc_free_request(struct usb_ep *ep, struct usb_request *_req) | ||
| 848 | { | ||
| 849 | struct s3c_hsudc_req *hsreq; | ||
| 850 | |||
| 851 | hsreq = container_of(_req, struct s3c_hsudc_req, req); | ||
| 852 | WARN_ON(!list_empty(&hsreq->queue)); | ||
| 853 | kfree(hsreq); | ||
| 854 | } | ||
| 855 | |||
| 856 | /** | ||
| 857 | * s3c_hsudc_queue - Queue a transfer request for the endpoint. | ||
| 858 | * @_ep: Endpoint for which the request is queued. | ||
| 859 | * @_req: Request to be queued. | ||
| 860 | * @gfp_flags: Not used. | ||
| 861 | * | ||
| 862 | * Start or enqueue a request for a endpoint when called from gadget driver. | ||
| 863 | */ | ||
| 864 | static int s3c_hsudc_queue(struct usb_ep *_ep, struct usb_request *_req, | ||
| 865 | gfp_t gfp_flags) | ||
| 866 | { | ||
| 867 | struct s3c_hsudc_req *hsreq; | ||
| 868 | struct s3c_hsudc_ep *hsep; | ||
| 869 | struct s3c_hsudc *hsudc; | ||
| 870 | unsigned long flags; | ||
| 871 | u32 offset; | ||
| 872 | u32 csr; | ||
| 873 | |||
| 874 | hsreq = container_of(_req, struct s3c_hsudc_req, req); | ||
| 875 | if ((!_req || !_req->complete || !_req->buf || | ||
| 876 | !list_empty(&hsreq->queue))) | ||
| 877 | return -EINVAL; | ||
| 878 | |||
| 879 | hsep = container_of(_ep, struct s3c_hsudc_ep, ep); | ||
| 880 | hsudc = hsep->dev; | ||
| 881 | if (!hsudc->driver || hsudc->gadget.speed == USB_SPEED_UNKNOWN) | ||
| 882 | return -ESHUTDOWN; | ||
| 883 | |||
| 884 | spin_lock_irqsave(&hsudc->lock, flags); | ||
| 885 | set_index(hsudc, hsep->bEndpointAddress); | ||
| 886 | |||
| 887 | _req->status = -EINPROGRESS; | ||
| 888 | _req->actual = 0; | ||
| 889 | |||
| 890 | if (!ep_index(hsep) && _req->length == 0) { | ||
| 891 | hsudc->ep0state = WAIT_FOR_SETUP; | ||
| 892 | s3c_hsudc_complete_request(hsep, hsreq, 0); | ||
| 893 | spin_unlock_irqrestore(&hsudc->lock, flags); | ||
| 894 | return 0; | ||
| 895 | } | ||
| 896 | |||
| 897 | if (list_empty(&hsep->queue) && !hsep->stopped) { | ||
| 898 | offset = (ep_index(hsep)) ? S3C_ESR : S3C_EP0SR; | ||
| 899 | if (ep_is_in(hsep)) { | ||
| 900 | csr = readl((u32)hsudc->regs + offset); | ||
| 901 | if (!(csr & S3C_ESR_TX_SUCCESS) && | ||
| 902 | (s3c_hsudc_write_fifo(hsep, hsreq) == 1)) | ||
| 903 | hsreq = 0; | ||
| 904 | } else { | ||
| 905 | csr = readl((u32)hsudc->regs + offset); | ||
| 906 | if ((csr & S3C_ESR_RX_SUCCESS) | ||
| 907 | && (s3c_hsudc_read_fifo(hsep, hsreq) == 1)) | ||
| 908 | hsreq = 0; | ||
| 909 | } | ||
| 910 | } | ||
| 911 | |||
| 912 | if (hsreq != 0) | ||
| 913 | list_add_tail(&hsreq->queue, &hsep->queue); | ||
| 914 | |||
| 915 | spin_unlock_irqrestore(&hsudc->lock, flags); | ||
| 916 | return 0; | ||
| 917 | } | ||
| 918 | |||
| 919 | /** | ||
| 920 | * s3c_hsudc_dequeue - Dequeue a transfer request from an endpoint. | ||
| 921 | * @_ep: Endpoint from which the request is dequeued. | ||
| 922 | * @_req: Request to be dequeued. | ||
| 923 | * | ||
| 924 | * Dequeue a request from a endpoint when called from gadget driver. | ||
| 925 | */ | ||
| 926 | static int s3c_hsudc_dequeue(struct usb_ep *_ep, struct usb_request *_req) | ||
| 927 | { | ||
| 928 | struct s3c_hsudc_ep *hsep = our_ep(_ep); | ||
| 929 | struct s3c_hsudc *hsudc = hsep->dev; | ||
| 930 | struct s3c_hsudc_req *hsreq; | ||
| 931 | unsigned long flags; | ||
| 932 | |||
| 933 | hsep = container_of(_ep, struct s3c_hsudc_ep, ep); | ||
| 934 | if (!_ep || hsep->ep.name == ep0name) | ||
| 935 | return -EINVAL; | ||
| 936 | |||
| 937 | spin_lock_irqsave(&hsudc->lock, flags); | ||
| 938 | |||
| 939 | list_for_each_entry(hsreq, &hsep->queue, queue) { | ||
| 940 | if (&hsreq->req == _req) | ||
| 941 | break; | ||
| 942 | } | ||
| 943 | if (&hsreq->req != _req) { | ||
| 944 | spin_unlock_irqrestore(&hsudc->lock, flags); | ||
| 945 | return -EINVAL; | ||
| 946 | } | ||
| 947 | |||
| 948 | set_index(hsudc, hsep->bEndpointAddress); | ||
| 949 | s3c_hsudc_complete_request(hsep, hsreq, -ECONNRESET); | ||
| 950 | |||
| 951 | spin_unlock_irqrestore(&hsudc->lock, flags); | ||
| 952 | return 0; | ||
| 953 | } | ||
| 954 | |||
| 955 | static struct usb_ep_ops s3c_hsudc_ep_ops = { | ||
| 956 | .enable = s3c_hsudc_ep_enable, | ||
| 957 | .disable = s3c_hsudc_ep_disable, | ||
| 958 | .alloc_request = s3c_hsudc_alloc_request, | ||
| 959 | .free_request = s3c_hsudc_free_request, | ||
| 960 | .queue = s3c_hsudc_queue, | ||
| 961 | .dequeue = s3c_hsudc_dequeue, | ||
| 962 | .set_halt = s3c_hsudc_set_halt, | ||
| 963 | .set_wedge = s3c_hsudc_set_wedge, | ||
| 964 | }; | ||
| 965 | |||
| 966 | /** | ||
| 967 | * s3c_hsudc_initep - Initialize a endpoint to default state. | ||
| 968 | * @hsudc - Reference to the device controller. | ||
| 969 | * @hsep - Endpoint to be initialized. | ||
| 970 | * @epnum - Address to be assigned to the endpoint. | ||
| 971 | * | ||
| 972 | * Initialize a endpoint with default configuration. | ||
| 973 | */ | ||
| 974 | static void s3c_hsudc_initep(struct s3c_hsudc *hsudc, | ||
| 975 | struct s3c_hsudc_ep *hsep, int epnum) | ||
| 976 | { | ||
| 977 | char *dir; | ||
| 978 | |||
| 979 | if ((epnum % 2) == 0) { | ||
| 980 | dir = "out"; | ||
| 981 | } else { | ||
| 982 | dir = "in"; | ||
| 983 | hsep->bEndpointAddress = USB_DIR_IN; | ||
| 984 | } | ||
| 985 | |||
| 986 | hsep->bEndpointAddress |= epnum; | ||
| 987 | if (epnum) | ||
| 988 | snprintf(hsep->name, sizeof(hsep->name), "ep%d%s", epnum, dir); | ||
| 989 | else | ||
| 990 | snprintf(hsep->name, sizeof(hsep->name), "%s", ep0name); | ||
| 991 | |||
| 992 | INIT_LIST_HEAD(&hsep->queue); | ||
| 993 | INIT_LIST_HEAD(&hsep->ep.ep_list); | ||
| 994 | if (epnum) | ||
| 995 | list_add_tail(&hsep->ep.ep_list, &hsudc->gadget.ep_list); | ||
| 996 | |||
| 997 | hsep->dev = hsudc; | ||
| 998 | hsep->ep.name = hsep->name; | ||
| 999 | hsep->ep.maxpacket = epnum ? 512 : 64; | ||
| 1000 | hsep->ep.ops = &s3c_hsudc_ep_ops; | ||
| 1001 | hsep->fifo = hsudc->regs + S3C_BR(epnum); | ||
| 1002 | hsep->desc = 0; | ||
| 1003 | hsep->stopped = 0; | ||
| 1004 | hsep->wedge = 0; | ||
| 1005 | |||
| 1006 | set_index(hsudc, epnum); | ||
| 1007 | writel(hsep->ep.maxpacket, hsudc->regs + S3C_MPR); | ||
| 1008 | } | ||
| 1009 | |||
| 1010 | /** | ||
| 1011 | * s3c_hsudc_setup_ep - Configure all endpoints to default state. | ||
| 1012 | * @hsudc: Reference to device controller. | ||
| 1013 | * | ||
| 1014 | * Configures all endpoints to default state. | ||
| 1015 | */ | ||
| 1016 | static void s3c_hsudc_setup_ep(struct s3c_hsudc *hsudc) | ||
| 1017 | { | ||
| 1018 | int epnum; | ||
| 1019 | |||
| 1020 | hsudc->ep0state = WAIT_FOR_SETUP; | ||
| 1021 | INIT_LIST_HEAD(&hsudc->gadget.ep_list); | ||
| 1022 | for (epnum = 0; epnum < hsudc->pd->epnum; epnum++) | ||
| 1023 | s3c_hsudc_initep(hsudc, &hsudc->ep[epnum], epnum); | ||
| 1024 | } | ||
| 1025 | |||
| 1026 | /** | ||
| 1027 | * s3c_hsudc_reconfig - Reconfigure the device controller to default state. | ||
| 1028 | * @hsudc: Reference to device controller. | ||
| 1029 | * | ||
| 1030 | * Reconfigures the device controller registers to a default state. | ||
| 1031 | */ | ||
| 1032 | static void s3c_hsudc_reconfig(struct s3c_hsudc *hsudc) | ||
| 1033 | { | ||
| 1034 | writel(0xAA, hsudc->regs + S3C_EDR); | ||
| 1035 | writel(1, hsudc->regs + S3C_EIER); | ||
| 1036 | writel(0, hsudc->regs + S3C_TR); | ||
| 1037 | writel(S3C_SCR_DTZIEN_EN | S3C_SCR_RRD_EN | S3C_SCR_SUS_EN | | ||
| 1038 | S3C_SCR_RST_EN, hsudc->regs + S3C_SCR); | ||
| 1039 | writel(0, hsudc->regs + S3C_EP0CR); | ||
| 1040 | |||
| 1041 | s3c_hsudc_setup_ep(hsudc); | ||
| 1042 | } | ||
| 1043 | |||
| 1044 | /** | ||
| 1045 | * s3c_hsudc_irq - Interrupt handler for device controller. | ||
| 1046 | * @irq: Not used. | ||
| 1047 | * @_dev: Reference to the device controller. | ||
| 1048 | * | ||
| 1049 | * Interrupt handler for the device controller. This handler handles controller | ||
| 1050 | * interrupts and endpoint interrupts. | ||
| 1051 | */ | ||
| 1052 | static irqreturn_t s3c_hsudc_irq(int irq, void *_dev) | ||
| 1053 | { | ||
| 1054 | struct s3c_hsudc *hsudc = _dev; | ||
| 1055 | struct s3c_hsudc_ep *hsep; | ||
| 1056 | u32 ep_intr; | ||
| 1057 | u32 sys_status; | ||
| 1058 | u32 ep_idx; | ||
| 1059 | |||
| 1060 | spin_lock(&hsudc->lock); | ||
| 1061 | |||
| 1062 | sys_status = readl(hsudc->regs + S3C_SSR); | ||
| 1063 | ep_intr = readl(hsudc->regs + S3C_EIR) & 0x3FF; | ||
| 1064 | |||
| 1065 | if (!ep_intr && !(sys_status & S3C_SSR_DTZIEN_EN)) { | ||
| 1066 | spin_unlock(&hsudc->lock); | ||
| 1067 | return IRQ_HANDLED; | ||
| 1068 | } | ||
| 1069 | |||
| 1070 | if (sys_status) { | ||
| 1071 | if (sys_status & S3C_SSR_VBUSON) | ||
| 1072 | writel(S3C_SSR_VBUSON, hsudc->regs + S3C_SSR); | ||
| 1073 | |||
| 1074 | if (sys_status & S3C_SSR_ERR) | ||
| 1075 | writel(S3C_SSR_ERR, hsudc->regs + S3C_SSR); | ||
| 1076 | |||
| 1077 | if (sys_status & S3C_SSR_SDE) { | ||
| 1078 | writel(S3C_SSR_SDE, hsudc->regs + S3C_SSR); | ||
| 1079 | hsudc->gadget.speed = (sys_status & S3C_SSR_HSP) ? | ||
| 1080 | USB_SPEED_HIGH : USB_SPEED_FULL; | ||
| 1081 | } | ||
| 1082 | |||
| 1083 | if (sys_status & S3C_SSR_SUSPEND) { | ||
| 1084 | writel(S3C_SSR_SUSPEND, hsudc->regs + S3C_SSR); | ||
| 1085 | if (hsudc->gadget.speed != USB_SPEED_UNKNOWN | ||
| 1086 | && hsudc->driver && hsudc->driver->suspend) | ||
| 1087 | hsudc->driver->suspend(&hsudc->gadget); | ||
| 1088 | } | ||
| 1089 | |||
| 1090 | if (sys_status & S3C_SSR_RESUME) { | ||
| 1091 | writel(S3C_SSR_RESUME, hsudc->regs + S3C_SSR); | ||
| 1092 | if (hsudc->gadget.speed != USB_SPEED_UNKNOWN | ||
| 1093 | && hsudc->driver && hsudc->driver->resume) | ||
| 1094 | hsudc->driver->resume(&hsudc->gadget); | ||
| 1095 | } | ||
| 1096 | |||
| 1097 | if (sys_status & S3C_SSR_RESET) { | ||
| 1098 | writel(S3C_SSR_RESET, hsudc->regs + S3C_SSR); | ||
| 1099 | for (ep_idx = 0; ep_idx < hsudc->pd->epnum; ep_idx++) { | ||
| 1100 | hsep = &hsudc->ep[ep_idx]; | ||
| 1101 | hsep->stopped = 1; | ||
| 1102 | s3c_hsudc_nuke_ep(hsep, -ECONNRESET); | ||
| 1103 | } | ||
| 1104 | s3c_hsudc_reconfig(hsudc); | ||
| 1105 | hsudc->ep0state = WAIT_FOR_SETUP; | ||
| 1106 | } | ||
| 1107 | } | ||
| 1108 | |||
| 1109 | if (ep_intr & S3C_EIR_EP0) { | ||
| 1110 | writel(S3C_EIR_EP0, hsudc->regs + S3C_EIR); | ||
| 1111 | set_index(hsudc, 0); | ||
| 1112 | s3c_hsudc_handle_ep0_intr(hsudc); | ||
| 1113 | } | ||
| 1114 | |||
| 1115 | ep_intr >>= 1; | ||
| 1116 | ep_idx = 1; | ||
| 1117 | while (ep_intr) { | ||
| 1118 | if (ep_intr & 1) { | ||
| 1119 | hsep = &hsudc->ep[ep_idx]; | ||
| 1120 | set_index(hsudc, ep_idx); | ||
| 1121 | writel(1 << ep_idx, hsudc->regs + S3C_EIR); | ||
| 1122 | if (ep_is_in(hsep)) | ||
| 1123 | s3c_hsudc_epin_intr(hsudc, ep_idx); | ||
| 1124 | else | ||
| 1125 | s3c_hsudc_epout_intr(hsudc, ep_idx); | ||
| 1126 | } | ||
| 1127 | ep_intr >>= 1; | ||
| 1128 | ep_idx++; | ||
| 1129 | } | ||
| 1130 | |||
| 1131 | spin_unlock(&hsudc->lock); | ||
| 1132 | return IRQ_HANDLED; | ||
| 1133 | } | ||
| 1134 | |||
| 1135 | int usb_gadget_probe_driver(struct usb_gadget_driver *driver, | ||
| 1136 | int (*bind)(struct usb_gadget *)) | ||
| 1137 | { | ||
| 1138 | struct s3c_hsudc *hsudc = the_controller; | ||
| 1139 | int ret; | ||
| 1140 | |||
| 1141 | if (!driver | ||
| 1142 | || (driver->speed != USB_SPEED_FULL && | ||
| 1143 | driver->speed != USB_SPEED_HIGH) | ||
| 1144 | || !bind | ||
| 1145 | || !driver->unbind || !driver->disconnect || !driver->setup) | ||
| 1146 | return -EINVAL; | ||
| 1147 | |||
| 1148 | if (!hsudc) | ||
| 1149 | return -ENODEV; | ||
| 1150 | |||
| 1151 | if (hsudc->driver) | ||
| 1152 | return -EBUSY; | ||
| 1153 | |||
| 1154 | hsudc->driver = driver; | ||
| 1155 | hsudc->gadget.dev.driver = &driver->driver; | ||
| 1156 | hsudc->gadget.speed = USB_SPEED_UNKNOWN; | ||
| 1157 | ret = device_add(&hsudc->gadget.dev); | ||
| 1158 | if (ret) { | ||
| 1159 | dev_err(hsudc->dev, "failed to probe gadget device"); | ||
| 1160 | return ret; | ||
| 1161 | } | ||
| 1162 | |||
| 1163 | ret = bind(&hsudc->gadget); | ||
| 1164 | if (ret) { | ||
| 1165 | dev_err(hsudc->dev, "%s: bind failed\n", hsudc->gadget.name); | ||
| 1166 | device_del(&hsudc->gadget.dev); | ||
| 1167 | |||
| 1168 | hsudc->driver = NULL; | ||
| 1169 | hsudc->gadget.dev.driver = NULL; | ||
| 1170 | return ret; | ||
| 1171 | } | ||
| 1172 | |||
| 1173 | enable_irq(hsudc->irq); | ||
| 1174 | dev_info(hsudc->dev, "bound driver %s\n", driver->driver.name); | ||
| 1175 | |||
| 1176 | s3c_hsudc_reconfig(hsudc); | ||
| 1177 | s3c_hsudc_init_phy(); | ||
| 1178 | if (hsudc->pd->gpio_init) | ||
| 1179 | hsudc->pd->gpio_init(); | ||
| 1180 | |||
| 1181 | return 0; | ||
| 1182 | } | ||
| 1183 | EXPORT_SYMBOL(usb_gadget_probe_driver); | ||
| 1184 | |||
| 1185 | int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) | ||
| 1186 | { | ||
| 1187 | struct s3c_hsudc *hsudc = the_controller; | ||
| 1188 | unsigned long flags; | ||
| 1189 | |||
| 1190 | if (!hsudc) | ||
| 1191 | return -ENODEV; | ||
| 1192 | |||
| 1193 | if (!driver || driver != hsudc->driver || !driver->unbind) | ||
| 1194 | return -EINVAL; | ||
| 1195 | |||
| 1196 | spin_lock_irqsave(&hsudc->lock, flags); | ||
| 1197 | hsudc->driver = 0; | ||
| 1198 | s3c_hsudc_uninit_phy(); | ||
| 1199 | if (hsudc->pd->gpio_uninit) | ||
| 1200 | hsudc->pd->gpio_uninit(); | ||
| 1201 | s3c_hsudc_stop_activity(hsudc, driver); | ||
| 1202 | spin_unlock_irqrestore(&hsudc->lock, flags); | ||
| 1203 | |||
| 1204 | driver->unbind(&hsudc->gadget); | ||
| 1205 | device_del(&hsudc->gadget.dev); | ||
| 1206 | disable_irq(hsudc->irq); | ||
| 1207 | |||
| 1208 | dev_info(hsudc->dev, "unregistered gadget driver '%s'\n", | ||
| 1209 | driver->driver.name); | ||
| 1210 | return 0; | ||
| 1211 | } | ||
| 1212 | EXPORT_SYMBOL(usb_gadget_unregister_driver); | ||
| 1213 | |||
| 1214 | static inline u32 s3c_hsudc_read_frameno(struct s3c_hsudc *hsudc) | ||
| 1215 | { | ||
| 1216 | return readl(hsudc->regs + S3C_FNR) & 0x3FF; | ||
| 1217 | } | ||
| 1218 | |||
| 1219 | static int s3c_hsudc_gadget_getframe(struct usb_gadget *gadget) | ||
| 1220 | { | ||
| 1221 | return s3c_hsudc_read_frameno(to_hsudc(gadget)); | ||
| 1222 | } | ||
| 1223 | |||
| 1224 | static struct usb_gadget_ops s3c_hsudc_gadget_ops = { | ||
| 1225 | .get_frame = s3c_hsudc_gadget_getframe, | ||
| 1226 | }; | ||
| 1227 | |||
| 1228 | static int s3c_hsudc_probe(struct platform_device *pdev) | ||
| 1229 | { | ||
| 1230 | struct device *dev = &pdev->dev; | ||
| 1231 | struct resource *res; | ||
| 1232 | struct s3c_hsudc *hsudc; | ||
| 1233 | struct s3c24xx_hsudc_platdata *pd = pdev->dev.platform_data; | ||
| 1234 | int ret; | ||
| 1235 | |||
| 1236 | hsudc = kzalloc(sizeof(struct s3c_hsudc) + | ||
| 1237 | sizeof(struct s3c_hsudc_ep) * pd->epnum, | ||
| 1238 | GFP_KERNEL); | ||
| 1239 | if (!hsudc) { | ||
| 1240 | dev_err(dev, "cannot allocate memory\n"); | ||
| 1241 | return -ENOMEM; | ||
| 1242 | } | ||
| 1243 | |||
| 1244 | the_controller = hsudc; | ||
| 1245 | platform_set_drvdata(pdev, dev); | ||
| 1246 | hsudc->dev = dev; | ||
| 1247 | hsudc->pd = pdev->dev.platform_data; | ||
| 1248 | |||
| 1249 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 1250 | if (!res) { | ||
| 1251 | dev_err(dev, "unable to obtain driver resource data\n"); | ||
| 1252 | ret = -ENODEV; | ||
| 1253 | goto err_res; | ||
| 1254 | } | ||
| 1255 | |||
| 1256 | hsudc->mem_rsrc = request_mem_region(res->start, resource_size(res), | ||
| 1257 | dev_name(&pdev->dev)); | ||
| 1258 | if (!hsudc->mem_rsrc) { | ||
| 1259 | dev_err(dev, "failed to reserve register area\n"); | ||
| 1260 | ret = -ENODEV; | ||
| 1261 | goto err_res; | ||
| 1262 | } | ||
| 1263 | |||
| 1264 | hsudc->regs = ioremap(res->start, resource_size(res)); | ||
| 1265 | if (!hsudc->regs) { | ||
| 1266 | dev_err(dev, "error mapping device register area\n"); | ||
| 1267 | ret = -EBUSY; | ||
| 1268 | goto err_remap; | ||
| 1269 | } | ||
| 1270 | |||
| 1271 | ret = platform_get_irq(pdev, 0); | ||
| 1272 | if (ret < 0) { | ||
| 1273 | dev_err(dev, "unable to obtain IRQ number\n"); | ||
| 1274 | goto err_irq; | ||
| 1275 | } | ||
| 1276 | hsudc->irq = ret; | ||
| 1277 | |||
| 1278 | ret = request_irq(hsudc->irq, s3c_hsudc_irq, 0, driver_name, hsudc); | ||
| 1279 | if (ret < 0) { | ||
| 1280 | dev_err(dev, "irq request failed\n"); | ||
| 1281 | goto err_irq; | ||
| 1282 | } | ||
| 1283 | |||
| 1284 | spin_lock_init(&hsudc->lock); | ||
| 1285 | |||
| 1286 | device_initialize(&hsudc->gadget.dev); | ||
| 1287 | dev_set_name(&hsudc->gadget.dev, "gadget"); | ||
| 1288 | |||
| 1289 | hsudc->gadget.is_dualspeed = 1; | ||
| 1290 | hsudc->gadget.ops = &s3c_hsudc_gadget_ops; | ||
| 1291 | hsudc->gadget.name = dev_name(dev); | ||
| 1292 | hsudc->gadget.dev.parent = dev; | ||
| 1293 | hsudc->gadget.dev.dma_mask = dev->dma_mask; | ||
| 1294 | hsudc->gadget.ep0 = &hsudc->ep[0].ep; | ||
| 1295 | |||
| 1296 | hsudc->gadget.is_otg = 0; | ||
| 1297 | hsudc->gadget.is_a_peripheral = 0; | ||
| 1298 | |||
| 1299 | s3c_hsudc_setup_ep(hsudc); | ||
| 1300 | |||
| 1301 | hsudc->uclk = clk_get(&pdev->dev, "usb-device"); | ||
| 1302 | if (IS_ERR(hsudc->uclk)) { | ||
| 1303 | dev_err(dev, "failed to find usb-device clock source\n"); | ||
| 1304 | return PTR_ERR(hsudc->uclk); | ||
| 1305 | } | ||
| 1306 | clk_enable(hsudc->uclk); | ||
| 1307 | |||
| 1308 | local_irq_disable(); | ||
| 1309 | |||
| 1310 | disable_irq(hsudc->irq); | ||
| 1311 | local_irq_enable(); | ||
| 1312 | return 0; | ||
| 1313 | |||
| 1314 | err_irq: | ||
| 1315 | iounmap(hsudc->regs); | ||
| 1316 | |||
| 1317 | err_remap: | ||
| 1318 | release_resource(hsudc->mem_rsrc); | ||
| 1319 | kfree(hsudc->mem_rsrc); | ||
| 1320 | |||
| 1321 | err_res: | ||
| 1322 | kfree(hsudc); | ||
| 1323 | return ret; | ||
| 1324 | } | ||
| 1325 | |||
| 1326 | static struct platform_driver s3c_hsudc_driver = { | ||
| 1327 | .driver = { | ||
| 1328 | .owner = THIS_MODULE, | ||
| 1329 | .name = "s3c-hsudc", | ||
| 1330 | }, | ||
| 1331 | .probe = s3c_hsudc_probe, | ||
| 1332 | }; | ||
| 1333 | |||
| 1334 | static int __init s3c_hsudc_modinit(void) | ||
| 1335 | { | ||
| 1336 | return platform_driver_register(&s3c_hsudc_driver); | ||
| 1337 | } | ||
| 1338 | |||
| 1339 | static void __exit s3c_hsudc_modexit(void) | ||
| 1340 | { | ||
| 1341 | platform_driver_unregister(&s3c_hsudc_driver); | ||
| 1342 | } | ||
| 1343 | |||
| 1344 | module_init(s3c_hsudc_modinit); | ||
| 1345 | module_exit(s3c_hsudc_modexit); | ||
| 1346 | |||
| 1347 | MODULE_DESCRIPTION("Samsung S3C24XX USB high-speed controller driver"); | ||
| 1348 | MODULE_AUTHOR("Thomas Abraham <thomas.ab@samsung.com>"); | ||
| 1349 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c index b015561fd60..1fa4f705b0b 100644 --- a/drivers/usb/gadget/storage_common.c +++ b/drivers/usb/gadget/storage_common.c | |||
| @@ -708,13 +708,14 @@ static ssize_t fsg_show_file(struct device *dev, struct device_attribute *attr, | |||
| 708 | static ssize_t fsg_store_ro(struct device *dev, struct device_attribute *attr, | 708 | static ssize_t fsg_store_ro(struct device *dev, struct device_attribute *attr, |
| 709 | const char *buf, size_t count) | 709 | const char *buf, size_t count) |
| 710 | { | 710 | { |
| 711 | ssize_t rc = count; | 711 | ssize_t rc; |
| 712 | struct fsg_lun *curlun = fsg_lun_from_dev(dev); | 712 | struct fsg_lun *curlun = fsg_lun_from_dev(dev); |
| 713 | struct rw_semaphore *filesem = dev_get_drvdata(dev); | 713 | struct rw_semaphore *filesem = dev_get_drvdata(dev); |
| 714 | unsigned long ro; | 714 | unsigned ro; |
| 715 | 715 | ||
| 716 | if (strict_strtoul(buf, 2, &ro)) | 716 | rc = kstrtouint(buf, 2, &ro); |
| 717 | return -EINVAL; | 717 | if (rc) |
| 718 | return rc; | ||
| 718 | 719 | ||
| 719 | /* | 720 | /* |
| 720 | * Allow the write-enable status to change only while the | 721 | * Allow the write-enable status to change only while the |
| @@ -728,6 +729,7 @@ static ssize_t fsg_store_ro(struct device *dev, struct device_attribute *attr, | |||
| 728 | curlun->ro = ro; | 729 | curlun->ro = ro; |
| 729 | curlun->initially_ro = ro; | 730 | curlun->initially_ro = ro; |
| 730 | LDBG(curlun, "read-only status set to %d\n", curlun->ro); | 731 | LDBG(curlun, "read-only status set to %d\n", curlun->ro); |
| 732 | rc = count; | ||
| 731 | } | 733 | } |
| 732 | up_read(filesem); | 734 | up_read(filesem); |
| 733 | return rc; | 735 | return rc; |
| @@ -738,10 +740,12 @@ static ssize_t fsg_store_nofua(struct device *dev, | |||
| 738 | const char *buf, size_t count) | 740 | const char *buf, size_t count) |
| 739 | { | 741 | { |
| 740 | struct fsg_lun *curlun = fsg_lun_from_dev(dev); | 742 | struct fsg_lun *curlun = fsg_lun_from_dev(dev); |
| 741 | unsigned long nofua; | 743 | unsigned nofua; |
| 744 | int ret; | ||
| 742 | 745 | ||
| 743 | if (strict_strtoul(buf, 2, &nofua)) | 746 | ret = kstrtouint(buf, 2, &nofua); |
| 744 | return -EINVAL; | 747 | if (ret) |
| 748 | return ret; | ||
| 745 | 749 | ||
| 746 | /* Sync data when switching from async mode to sync */ | 750 | /* Sync data when switching from async mode to sync */ |
| 747 | if (!nofua && curlun->nofua) | 751 | if (!nofua && curlun->nofua) |
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index e0e0787b724..ab085f12d57 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig | |||
| @@ -106,13 +106,13 @@ config USB_EHCI_BIG_ENDIAN_MMIO | |||
| 106 | depends on USB_EHCI_HCD && (PPC_CELLEB || PPC_PS3 || 440EPX || \ | 106 | depends on USB_EHCI_HCD && (PPC_CELLEB || PPC_PS3 || 440EPX || \ |
| 107 | ARCH_IXP4XX || XPS_USB_HCD_XILINX || \ | 107 | ARCH_IXP4XX || XPS_USB_HCD_XILINX || \ |
| 108 | PPC_MPC512x || CPU_CAVIUM_OCTEON || \ | 108 | PPC_MPC512x || CPU_CAVIUM_OCTEON || \ |
| 109 | PMC_MSP) | 109 | PMC_MSP || SPARC_LEON) |
| 110 | default y | 110 | default y |
| 111 | 111 | ||
| 112 | config USB_EHCI_BIG_ENDIAN_DESC | 112 | config USB_EHCI_BIG_ENDIAN_DESC |
| 113 | bool | 113 | bool |
| 114 | depends on USB_EHCI_HCD && (440EPX || ARCH_IXP4XX || XPS_USB_HCD_XILINX || \ | 114 | depends on USB_EHCI_HCD && (440EPX || ARCH_IXP4XX || XPS_USB_HCD_XILINX || \ |
| 115 | PPC_MPC512x || PMC_MSP) | 115 | PPC_MPC512x || PMC_MSP || SPARC_LEON) |
| 116 | default y | 116 | default y |
| 117 | 117 | ||
| 118 | config XPS_USB_HCD_XILINX | 118 | config XPS_USB_HCD_XILINX |
| @@ -188,6 +188,12 @@ config USB_EHCI_SH | |||
| 188 | Enables support for the on-chip EHCI controller on the SuperH. | 188 | Enables support for the on-chip EHCI controller on the SuperH. |
| 189 | If you use the PCI EHCI controller, this option is not necessary. | 189 | If you use the PCI EHCI controller, this option is not necessary. |
| 190 | 190 | ||
| 191 | config USB_EHCI_S5P | ||
| 192 | boolean "S5P EHCI support" | ||
| 193 | depends on USB_EHCI_HCD && PLAT_S5P | ||
| 194 | help | ||
| 195 | Enable support for the S5P SOC's on-chip EHCI controller. | ||
| 196 | |||
| 191 | config USB_W90X900_EHCI | 197 | config USB_W90X900_EHCI |
| 192 | bool "W90X900(W90P910) EHCI support" | 198 | bool "W90X900(W90P910) EHCI support" |
| 193 | depends on USB_EHCI_HCD && ARCH_W90X900 | 199 | depends on USB_EHCI_HCD && ARCH_W90X900 |
| @@ -202,6 +208,15 @@ config USB_CNS3XXX_EHCI | |||
| 202 | It is needed for high-speed (480Mbit/sec) USB 2.0 device | 208 | It is needed for high-speed (480Mbit/sec) USB 2.0 device |
| 203 | support. | 209 | support. |
| 204 | 210 | ||
| 211 | config USB_EHCI_ATH79 | ||
| 212 | bool "EHCI support for AR7XXX/AR9XXX SoCs" | ||
| 213 | depends on USB_EHCI_HCD && (SOC_AR71XX || SOC_AR724X || SOC_AR913X) | ||
| 214 | select USB_EHCI_ROOT_HUB_TT | ||
| 215 | default y | ||
| 216 | ---help--- | ||
| 217 | Enables support for the built-in EHCI controller present | ||
| 218 | on the Atheros AR7XXX/AR9XXX SoCs. | ||
| 219 | |||
| 205 | config USB_OXU210HP_HCD | 220 | config USB_OXU210HP_HCD |
| 206 | tristate "OXU210HP HCD support" | 221 | tristate "OXU210HP HCD support" |
| 207 | depends on USB | 222 | depends on USB |
| @@ -287,6 +302,14 @@ config USB_OHCI_HCD_OMAP3 | |||
| 287 | Enables support for the on-chip OHCI controller on | 302 | Enables support for the on-chip OHCI controller on |
| 288 | OMAP3 and later chips. | 303 | OMAP3 and later chips. |
| 289 | 304 | ||
| 305 | config USB_OHCI_ATH79 | ||
| 306 | bool "USB OHCI support for the Atheros AR71XX/AR7240 SoCs" | ||
| 307 | depends on USB_OHCI_HCD && (SOC_AR71XX || SOC_AR724X) | ||
| 308 | default y | ||
| 309 | help | ||
| 310 | Enables support for the built-in OHCI controller present on the | ||
| 311 | Atheros AR71XX/AR7240 SoCs. | ||
| 312 | |||
| 290 | config USB_OHCI_HCD_PPC_SOC | 313 | config USB_OHCI_HCD_PPC_SOC |
| 291 | bool "OHCI support for on-chip PPC USB controller" | 314 | bool "OHCI support for on-chip PPC USB controller" |
| 292 | depends on USB_OHCI_HCD && (STB03xxx || PPC_MPC52xx) | 315 | depends on USB_OHCI_HCD && (STB03xxx || PPC_MPC52xx) |
| @@ -373,7 +396,7 @@ config USB_OHCI_LITTLE_ENDIAN | |||
| 373 | 396 | ||
| 374 | config USB_UHCI_HCD | 397 | config USB_UHCI_HCD |
| 375 | tristate "UHCI HCD (most Intel and VIA) support" | 398 | tristate "UHCI HCD (most Intel and VIA) support" |
| 376 | depends on USB && PCI | 399 | depends on USB && (PCI || SPARC_LEON) |
| 377 | ---help--- | 400 | ---help--- |
| 378 | The Universal Host Controller Interface is a standard by Intel for | 401 | The Universal Host Controller Interface is a standard by Intel for |
| 379 | accessing the USB hardware in the PC (which is also called the USB | 402 | accessing the USB hardware in the PC (which is also called the USB |
| @@ -382,11 +405,27 @@ config USB_UHCI_HCD | |||
| 382 | with Intel PCI chipsets (like intel 430TX, 440FX, 440LX, 440BX, | 405 | with Intel PCI chipsets (like intel 430TX, 440FX, 440LX, 440BX, |
| 383 | i810, i820) conform to this standard. Also all VIA PCI chipsets | 406 | i810, i820) conform to this standard. Also all VIA PCI chipsets |
| 384 | (like VIA VP2, VP3, MVP3, Apollo Pro, Apollo Pro II or Apollo Pro | 407 | (like VIA VP2, VP3, MVP3, Apollo Pro, Apollo Pro II or Apollo Pro |
| 385 | 133). If unsure, say Y. | 408 | 133) and LEON/GRLIB SoCs with the GRUSBHC controller. |
| 409 | If unsure, say Y. | ||
| 386 | 410 | ||
| 387 | To compile this driver as a module, choose M here: the | 411 | To compile this driver as a module, choose M here: the |
| 388 | module will be called uhci-hcd. | 412 | module will be called uhci-hcd. |
| 389 | 413 | ||
| 414 | config USB_UHCI_SUPPORT_NON_PCI_HC | ||
| 415 | bool | ||
| 416 | depends on USB_UHCI_HCD | ||
| 417 | default y if SPARC_LEON | ||
| 418 | |||
| 419 | config USB_UHCI_BIG_ENDIAN_MMIO | ||
| 420 | bool | ||
| 421 | depends on USB_UHCI_SUPPORT_NON_PCI_HC && SPARC_LEON | ||
| 422 | default y | ||
| 423 | |||
| 424 | config USB_UHCI_BIG_ENDIAN_DESC | ||
| 425 | bool | ||
| 426 | depends on USB_UHCI_SUPPORT_NON_PCI_HC && SPARC_LEON | ||
| 427 | default y | ||
| 428 | |||
| 390 | config USB_FHCI_HCD | 429 | config USB_FHCI_HCD |
| 391 | tristate "Freescale QE USB Host Controller support" | 430 | tristate "Freescale QE USB Host Controller support" |
| 392 | depends on USB && OF_GPIO && QE_GPIO && QUICC_ENGINE | 431 | depends on USB && OF_GPIO && QE_GPIO && QUICC_ENGINE |
| @@ -444,6 +483,16 @@ config USB_SL811_HCD | |||
| 444 | To compile this driver as a module, choose M here: the | 483 | To compile this driver as a module, choose M here: the |
| 445 | module will be called sl811-hcd. | 484 | module will be called sl811-hcd. |
| 446 | 485 | ||
| 486 | config USB_SL811_HCD_ISO | ||
| 487 | bool "partial ISO support" | ||
| 488 | depends on USB_SL811_HCD | ||
| 489 | help | ||
| 490 | The driver doesn't support iso_frame_desc (yet), but for some simple | ||
| 491 | devices that just queue one ISO frame per URB, then ISO transfers | ||
| 492 | "should" work using the normal urb status fields. | ||
| 493 | |||
| 494 | If unsure, say N. | ||
| 495 | |||
| 447 | config USB_SL811_CS | 496 | config USB_SL811_CS |
| 448 | tristate "CF/PCMCIA support for SL811HS HCD" | 497 | tristate "CF/PCMCIA support for SL811HS HCD" |
| 449 | depends on USB_SL811_HCD && PCMCIA | 498 | depends on USB_SL811_HCD && PCMCIA |
diff --git a/drivers/usb/host/ehci-ath79.c b/drivers/usb/host/ehci-ath79.c new file mode 100644 index 00000000000..98cc8a13169 --- /dev/null +++ b/drivers/usb/host/ehci-ath79.c | |||
| @@ -0,0 +1,202 @@ | |||
| 1 | /* | ||
| 2 | * Bus Glue for Atheros AR7XXX/AR9XXX built-in EHCI controller. | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> | ||
| 5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
| 6 | * | ||
| 7 | * Parts of this file are based on Atheros' 2.6.15 BSP | ||
| 8 | * Copyright (C) 2007 Atheros Communications, Inc. | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify it | ||
| 11 | * under the terms of the GNU General Public License version 2 as published | ||
| 12 | * by the Free Software Foundation. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <linux/platform_device.h> | ||
| 16 | |||
| 17 | enum { | ||
| 18 | EHCI_ATH79_IP_V1 = 0, | ||
| 19 | EHCI_ATH79_IP_V2, | ||
| 20 | }; | ||
| 21 | |||
| 22 | static const struct platform_device_id ehci_ath79_id_table[] = { | ||
| 23 | { | ||
| 24 | .name = "ar71xx-ehci", | ||
| 25 | .driver_data = EHCI_ATH79_IP_V1, | ||
| 26 | }, | ||
| 27 | { | ||
| 28 | .name = "ar724x-ehci", | ||
| 29 | .driver_data = EHCI_ATH79_IP_V2, | ||
| 30 | }, | ||
| 31 | { | ||
| 32 | .name = "ar913x-ehci", | ||
| 33 | .driver_data = EHCI_ATH79_IP_V2, | ||
| 34 | }, | ||
| 35 | { | ||
| 36 | /* terminating entry */ | ||
| 37 | }, | ||
| 38 | }; | ||
| 39 | |||
| 40 | MODULE_DEVICE_TABLE(platform, ehci_ath79_id_table); | ||
| 41 | |||
| 42 | static int ehci_ath79_init(struct usb_hcd *hcd) | ||
| 43 | { | ||
| 44 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
| 45 | struct platform_device *pdev = to_platform_device(hcd->self.controller); | ||
| 46 | const struct platform_device_id *id; | ||
| 47 | int hclength; | ||
| 48 | int ret; | ||
| 49 | |||
| 50 | id = platform_get_device_id(pdev); | ||
| 51 | if (!id) { | ||
| 52 | dev_err(hcd->self.controller, "missing device id\n"); | ||
| 53 | return -EINVAL; | ||
| 54 | } | ||
| 55 | |||
| 56 | hclength = HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
| 57 | switch (id->driver_data) { | ||
| 58 | case EHCI_ATH79_IP_V1: | ||
| 59 | ehci->has_synopsys_hc_bug = 1; | ||
| 60 | |||
| 61 | ehci->caps = hcd->regs; | ||
| 62 | ehci->regs = hcd->regs + hclength; | ||
| 63 | break; | ||
| 64 | |||
| 65 | case EHCI_ATH79_IP_V2: | ||
| 66 | hcd->has_tt = 1; | ||
| 67 | |||
| 68 | ehci->caps = hcd->regs + 0x100; | ||
| 69 | ehci->regs = hcd->regs + 0x100 + hclength; | ||
| 70 | break; | ||
| 71 | |||
| 72 | default: | ||
| 73 | BUG(); | ||
| 74 | } | ||
| 75 | |||
| 76 | dbg_hcs_params(ehci, "reset"); | ||
| 77 | dbg_hcc_params(ehci, "reset"); | ||
| 78 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | ||
| 79 | ehci->sbrn = 0x20; | ||
| 80 | |||
| 81 | ehci_reset(ehci); | ||
| 82 | |||
| 83 | ret = ehci_init(hcd); | ||
| 84 | if (ret) | ||
| 85 | return ret; | ||
| 86 | |||
| 87 | ehci_port_power(ehci, 0); | ||
| 88 | |||
| 89 | return 0; | ||
| 90 | } | ||
| 91 | |||
| 92 | static const struct hc_driver ehci_ath79_hc_driver = { | ||
| 93 | .description = hcd_name, | ||
| 94 | .product_desc = "Atheros built-in EHCI controller", | ||
| 95 | .hcd_priv_size = sizeof(struct ehci_hcd), | ||
| 96 | .irq = ehci_irq, | ||
| 97 | .flags = HCD_MEMORY | HCD_USB2, | ||
| 98 | |||
| 99 | .reset = ehci_ath79_init, | ||
| 100 | .start = ehci_run, | ||
| 101 | .stop = ehci_stop, | ||
| 102 | .shutdown = ehci_shutdown, | ||
| 103 | |||
| 104 | .urb_enqueue = ehci_urb_enqueue, | ||
| 105 | .urb_dequeue = ehci_urb_dequeue, | ||
| 106 | .endpoint_disable = ehci_endpoint_disable, | ||
| 107 | .endpoint_reset = ehci_endpoint_reset, | ||
| 108 | |||
| 109 | .get_frame_number = ehci_get_frame, | ||
| 110 | |||
| 111 | .hub_status_data = ehci_hub_status_data, | ||
| 112 | .hub_control = ehci_hub_control, | ||
| 113 | |||
| 114 | .relinquish_port = ehci_relinquish_port, | ||
| 115 | .port_handed_over = ehci_port_handed_over, | ||
| 116 | |||
| 117 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
| 118 | }; | ||
| 119 | |||
| 120 | static int ehci_ath79_probe(struct platform_device *pdev) | ||
| 121 | { | ||
| 122 | struct usb_hcd *hcd; | ||
| 123 | struct resource *res; | ||
| 124 | int irq; | ||
| 125 | int ret; | ||
| 126 | |||
| 127 | if (usb_disabled()) | ||
| 128 | return -ENODEV; | ||
| 129 | |||
| 130 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
| 131 | if (!res) { | ||
| 132 | dev_dbg(&pdev->dev, "no IRQ specified\n"); | ||
| 133 | return -ENODEV; | ||
| 134 | } | ||
| 135 | irq = res->start; | ||
| 136 | |||
| 137 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 138 | if (!res) { | ||
| 139 | dev_dbg(&pdev->dev, "no base address specified\n"); | ||
| 140 | return -ENODEV; | ||
| 141 | } | ||
| 142 | |||
| 143 | hcd = usb_create_hcd(&ehci_ath79_hc_driver, &pdev->dev, | ||
| 144 | dev_name(&pdev->dev)); | ||
| 145 | if (!hcd) | ||
| 146 | return -ENOMEM; | ||
| 147 | |||
| 148 | hcd->rsrc_start = res->start; | ||
| 149 | hcd->rsrc_len = res->end - res->start + 1; | ||
| 150 | |||
| 151 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | ||
| 152 | dev_dbg(&pdev->dev, "controller already in use\n"); | ||
| 153 | ret = -EBUSY; | ||
| 154 | goto err_put_hcd; | ||
| 155 | } | ||
| 156 | |||
| 157 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | ||
| 158 | if (!hcd->regs) { | ||
| 159 | dev_dbg(&pdev->dev, "error mapping memory\n"); | ||
| 160 | ret = -EFAULT; | ||
| 161 | goto err_release_region; | ||
| 162 | } | ||
| 163 | |||
| 164 | ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); | ||
| 165 | if (ret) | ||
| 166 | goto err_iounmap; | ||
| 167 | |||
| 168 | return 0; | ||
| 169 | |||
| 170 | err_iounmap: | ||
| 171 | iounmap(hcd->regs); | ||
| 172 | |||
| 173 | err_release_region: | ||
| 174 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
| 175 | err_put_hcd: | ||
| 176 | usb_put_hcd(hcd); | ||
| 177 | return ret; | ||
| 178 | } | ||
| 179 | |||
| 180 | static int ehci_ath79_remove(struct platform_device *pdev) | ||
| 181 | { | ||
| 182 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
| 183 | |||
| 184 | usb_remove_hcd(hcd); | ||
| 185 | iounmap(hcd->regs); | ||
| 186 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
| 187 | usb_put_hcd(hcd); | ||
| 188 | |||
| 189 | return 0; | ||
| 190 | } | ||
| 191 | |||
| 192 | static struct platform_driver ehci_ath79_driver = { | ||
| 193 | .probe = ehci_ath79_probe, | ||
| 194 | .remove = ehci_ath79_remove, | ||
| 195 | .id_table = ehci_ath79_id_table, | ||
| 196 | .driver = { | ||
| 197 | .owner = THIS_MODULE, | ||
| 198 | .name = "ath79-ehci", | ||
| 199 | } | ||
| 200 | }; | ||
| 201 | |||
| 202 | MODULE_ALIAS(PLATFORM_MODULE_PREFIX "ath79-ehci"); | ||
diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c index b2ed55cb811..a5a3ef1f009 100644 --- a/drivers/usb/host/ehci-atmel.c +++ b/drivers/usb/host/ehci-atmel.c | |||
| @@ -56,7 +56,7 @@ static int ehci_atmel_setup(struct usb_hcd *hcd) | |||
| 56 | /* registers start at offset 0x0 */ | 56 | /* registers start at offset 0x0 */ |
| 57 | ehci->caps = hcd->regs; | 57 | ehci->caps = hcd->regs; |
| 58 | ehci->regs = hcd->regs + | 58 | ehci->regs = hcd->regs + |
| 59 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 59 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
| 60 | dbg_hcs_params(ehci, "reset"); | 60 | dbg_hcs_params(ehci, "reset"); |
| 61 | dbg_hcc_params(ehci, "reset"); | 61 | dbg_hcc_params(ehci, "reset"); |
| 62 | 62 | ||
diff --git a/drivers/usb/host/ehci-au1xxx.c b/drivers/usb/host/ehci-au1xxx.c index a869e3c103d..42ae5740990 100644 --- a/drivers/usb/host/ehci-au1xxx.c +++ b/drivers/usb/host/ehci-au1xxx.c | |||
| @@ -175,7 +175,8 @@ static int ehci_hcd_au1xxx_drv_probe(struct platform_device *pdev) | |||
| 175 | 175 | ||
| 176 | ehci = hcd_to_ehci(hcd); | 176 | ehci = hcd_to_ehci(hcd); |
| 177 | ehci->caps = hcd->regs; | 177 | ehci->caps = hcd->regs; |
| 178 | ehci->regs = hcd->regs + HC_LENGTH(readl(&ehci->caps->hc_capbase)); | 178 | ehci->regs = hcd->regs + |
| 179 | HC_LENGTH(ehci, readl(&ehci->caps->hc_capbase)); | ||
| 179 | /* cache this readonly data; minimize chip reads */ | 180 | /* cache this readonly data; minimize chip reads */ |
| 180 | ehci->hcs_params = readl(&ehci->caps->hcs_params); | 181 | ehci->hcs_params = readl(&ehci->caps->hcs_params); |
| 181 | 182 | ||
| @@ -215,10 +216,7 @@ static int ehci_hcd_au1xxx_drv_suspend(struct device *dev) | |||
| 215 | struct usb_hcd *hcd = dev_get_drvdata(dev); | 216 | struct usb_hcd *hcd = dev_get_drvdata(dev); |
| 216 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 217 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
| 217 | unsigned long flags; | 218 | unsigned long flags; |
| 218 | int rc; | 219 | int rc = 0; |
| 219 | |||
| 220 | return 0; | ||
| 221 | rc = 0; | ||
| 222 | 220 | ||
| 223 | if (time_before(jiffies, ehci->next_statechange)) | 221 | if (time_before(jiffies, ehci->next_statechange)) |
| 224 | msleep(10); | 222 | msleep(10); |
| @@ -233,13 +231,13 @@ static int ehci_hcd_au1xxx_drv_suspend(struct device *dev) | |||
| 233 | (void)ehci_readl(ehci, &ehci->regs->intr_enable); | 231 | (void)ehci_readl(ehci, &ehci->regs->intr_enable); |
| 234 | 232 | ||
| 235 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | 233 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); |
| 236 | |||
| 237 | au1xxx_stop_ehc(); | ||
| 238 | spin_unlock_irqrestore(&ehci->lock, flags); | 234 | spin_unlock_irqrestore(&ehci->lock, flags); |
| 239 | 235 | ||
| 240 | // could save FLADJ in case of Vaux power loss | 236 | // could save FLADJ in case of Vaux power loss |
| 241 | // ... we'd only use it to handle clock skew | 237 | // ... we'd only use it to handle clock skew |
| 242 | 238 | ||
| 239 | au1xxx_stop_ehc(); | ||
| 240 | |||
| 243 | return rc; | 241 | return rc; |
| 244 | } | 242 | } |
| 245 | 243 | ||
diff --git a/drivers/usb/host/ehci-cns3xxx.c b/drivers/usb/host/ehci-cns3xxx.c index 708a05b5d25..d41745c6f0c 100644 --- a/drivers/usb/host/ehci-cns3xxx.c +++ b/drivers/usb/host/ehci-cns3xxx.c | |||
| @@ -34,7 +34,7 @@ static int cns3xxx_ehci_init(struct usb_hcd *hcd) | |||
| 34 | 34 | ||
| 35 | ehci->caps = hcd->regs; | 35 | ehci->caps = hcd->regs; |
| 36 | ehci->regs = hcd->regs | 36 | ehci->regs = hcd->regs |
| 37 | + HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 37 | + HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
| 38 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | 38 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); |
| 39 | 39 | ||
| 40 | hcd->has_tt = 0; | 40 | hcd->has_tt = 0; |
diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c index 693c29b3052..40a844c1dbb 100644 --- a/drivers/usb/host/ehci-dbg.c +++ b/drivers/usb/host/ehci-dbg.c | |||
| @@ -726,7 +726,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) | |||
| 726 | } | 726 | } |
| 727 | 727 | ||
| 728 | /* Capability Registers */ | 728 | /* Capability Registers */ |
| 729 | i = HC_VERSION(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 729 | i = HC_VERSION(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
| 730 | temp = scnprintf (next, size, | 730 | temp = scnprintf (next, size, |
| 731 | "bus %s, device %s\n" | 731 | "bus %s, device %s\n" |
| 732 | "%s\n" | 732 | "%s\n" |
diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index 5c761df7fa8..f380bf97e5a 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c | |||
| @@ -117,6 +117,9 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver, | |||
| 117 | 117 | ||
| 118 | pdata->regs = hcd->regs; | 118 | pdata->regs = hcd->regs; |
| 119 | 119 | ||
| 120 | if (pdata->power_budget) | ||
| 121 | hcd->power_budget = pdata->power_budget; | ||
| 122 | |||
| 120 | /* | 123 | /* |
| 121 | * do platform specific init: check the clock, grab/config pins, etc. | 124 | * do platform specific init: check the clock, grab/config pins, etc. |
| 122 | */ | 125 | */ |
| @@ -134,6 +137,30 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver, | |||
| 134 | retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); | 137 | retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); |
| 135 | if (retval != 0) | 138 | if (retval != 0) |
| 136 | goto err4; | 139 | goto err4; |
| 140 | |||
| 141 | #ifdef CONFIG_USB_OTG | ||
| 142 | if (pdata->operating_mode == FSL_USB2_DR_OTG) { | ||
| 143 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
| 144 | |||
| 145 | ehci->transceiver = otg_get_transceiver(); | ||
| 146 | dev_dbg(&pdev->dev, "hcd=0x%p ehci=0x%p, transceiver=0x%p\n", | ||
| 147 | hcd, ehci, ehci->transceiver); | ||
| 148 | |||
| 149 | if (ehci->transceiver) { | ||
| 150 | retval = otg_set_host(ehci->transceiver, | ||
| 151 | &ehci_to_hcd(ehci)->self); | ||
| 152 | if (retval) { | ||
| 153 | if (ehci->transceiver) | ||
| 154 | put_device(ehci->transceiver->dev); | ||
| 155 | goto err4; | ||
| 156 | } | ||
| 157 | } else { | ||
| 158 | dev_err(&pdev->dev, "can't find transceiver\n"); | ||
| 159 | retval = -ENODEV; | ||
| 160 | goto err4; | ||
| 161 | } | ||
| 162 | } | ||
| 163 | #endif | ||
| 137 | return retval; | 164 | return retval; |
| 138 | 165 | ||
| 139 | err4: | 166 | err4: |
| @@ -164,6 +191,12 @@ static void usb_hcd_fsl_remove(struct usb_hcd *hcd, | |||
| 164 | struct platform_device *pdev) | 191 | struct platform_device *pdev) |
| 165 | { | 192 | { |
| 166 | struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; | 193 | struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; |
| 194 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
| 195 | |||
| 196 | if (ehci->transceiver) { | ||
| 197 | otg_set_host(ehci->transceiver, NULL); | ||
| 198 | put_device(ehci->transceiver->dev); | ||
| 199 | } | ||
| 167 | 200 | ||
| 168 | usb_remove_hcd(hcd); | 201 | usb_remove_hcd(hcd); |
| 169 | 202 | ||
| @@ -291,7 +324,7 @@ static int ehci_fsl_setup(struct usb_hcd *hcd) | |||
| 291 | /* EHCI registers start at offset 0x100 */ | 324 | /* EHCI registers start at offset 0x100 */ |
| 292 | ehci->caps = hcd->regs + 0x100; | 325 | ehci->caps = hcd->regs + 0x100; |
| 293 | ehci->regs = hcd->regs + 0x100 + | 326 | ehci->regs = hcd->regs + 0x100 + |
| 294 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 327 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
| 295 | dbg_hcs_params(ehci, "reset"); | 328 | dbg_hcs_params(ehci, "reset"); |
| 296 | dbg_hcc_params(ehci, "reset"); | 329 | dbg_hcc_params(ehci, "reset"); |
| 297 | 330 | ||
| @@ -328,6 +361,149 @@ struct ehci_fsl { | |||
| 328 | 361 | ||
| 329 | #ifdef CONFIG_PM | 362 | #ifdef CONFIG_PM |
| 330 | 363 | ||
| 364 | #ifdef CONFIG_PPC_MPC512x | ||
| 365 | static int ehci_fsl_mpc512x_drv_suspend(struct device *dev) | ||
| 366 | { | ||
| 367 | struct usb_hcd *hcd = dev_get_drvdata(dev); | ||
| 368 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
| 369 | struct fsl_usb2_platform_data *pdata = dev->platform_data; | ||
| 370 | u32 tmp; | ||
| 371 | |||
| 372 | #ifdef DEBUG | ||
| 373 | u32 mode = ehci_readl(ehci, hcd->regs + FSL_SOC_USB_USBMODE); | ||
| 374 | mode &= USBMODE_CM_MASK; | ||
| 375 | tmp = ehci_readl(ehci, hcd->regs + 0x140); /* usbcmd */ | ||
| 376 | |||
| 377 | dev_dbg(dev, "suspend=%d already_suspended=%d " | ||
| 378 | "mode=%d usbcmd %08x\n", pdata->suspended, | ||
| 379 | pdata->already_suspended, mode, tmp); | ||
| 380 | #endif | ||
| 381 | |||
| 382 | /* | ||
| 383 | * If the controller is already suspended, then this must be a | ||
| 384 | * PM suspend. Remember this fact, so that we will leave the | ||
| 385 | * controller suspended at PM resume time. | ||
| 386 | */ | ||
| 387 | if (pdata->suspended) { | ||
| 388 | dev_dbg(dev, "already suspended, leaving early\n"); | ||
| 389 | pdata->already_suspended = 1; | ||
| 390 | return 0; | ||
| 391 | } | ||
| 392 | |||
| 393 | dev_dbg(dev, "suspending...\n"); | ||
| 394 | |||
| 395 | hcd->state = HC_STATE_SUSPENDED; | ||
| 396 | dev->power.power_state = PMSG_SUSPEND; | ||
| 397 | |||
| 398 | /* ignore non-host interrupts */ | ||
| 399 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | ||
| 400 | |||
| 401 | /* stop the controller */ | ||
| 402 | tmp = ehci_readl(ehci, &ehci->regs->command); | ||
| 403 | tmp &= ~CMD_RUN; | ||
| 404 | ehci_writel(ehci, tmp, &ehci->regs->command); | ||
| 405 | |||
| 406 | /* save EHCI registers */ | ||
| 407 | pdata->pm_command = ehci_readl(ehci, &ehci->regs->command); | ||
| 408 | pdata->pm_command &= ~CMD_RUN; | ||
| 409 | pdata->pm_status = ehci_readl(ehci, &ehci->regs->status); | ||
| 410 | pdata->pm_intr_enable = ehci_readl(ehci, &ehci->regs->intr_enable); | ||
| 411 | pdata->pm_frame_index = ehci_readl(ehci, &ehci->regs->frame_index); | ||
| 412 | pdata->pm_segment = ehci_readl(ehci, &ehci->regs->segment); | ||
| 413 | pdata->pm_frame_list = ehci_readl(ehci, &ehci->regs->frame_list); | ||
| 414 | pdata->pm_async_next = ehci_readl(ehci, &ehci->regs->async_next); | ||
| 415 | pdata->pm_configured_flag = | ||
| 416 | ehci_readl(ehci, &ehci->regs->configured_flag); | ||
| 417 | pdata->pm_portsc = ehci_readl(ehci, &ehci->regs->port_status[0]); | ||
| 418 | pdata->pm_usbgenctrl = ehci_readl(ehci, | ||
| 419 | hcd->regs + FSL_SOC_USB_USBGENCTRL); | ||
| 420 | |||
| 421 | /* clear the W1C bits */ | ||
| 422 | pdata->pm_portsc &= cpu_to_hc32(ehci, ~PORT_RWC_BITS); | ||
| 423 | |||
| 424 | pdata->suspended = 1; | ||
| 425 | |||
| 426 | /* clear PP to cut power to the port */ | ||
| 427 | tmp = ehci_readl(ehci, &ehci->regs->port_status[0]); | ||
| 428 | tmp &= ~PORT_POWER; | ||
| 429 | ehci_writel(ehci, tmp, &ehci->regs->port_status[0]); | ||
| 430 | |||
| 431 | return 0; | ||
| 432 | } | ||
| 433 | |||
| 434 | static int ehci_fsl_mpc512x_drv_resume(struct device *dev) | ||
| 435 | { | ||
| 436 | struct usb_hcd *hcd = dev_get_drvdata(dev); | ||
| 437 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
| 438 | struct fsl_usb2_platform_data *pdata = dev->platform_data; | ||
| 439 | u32 tmp; | ||
| 440 | |||
| 441 | dev_dbg(dev, "suspend=%d already_suspended=%d\n", | ||
| 442 | pdata->suspended, pdata->already_suspended); | ||
| 443 | |||
| 444 | /* | ||
| 445 | * If the controller was already suspended at suspend time, | ||
| 446 | * then don't resume it now. | ||
| 447 | */ | ||
| 448 | if (pdata->already_suspended) { | ||
| 449 | dev_dbg(dev, "already suspended, leaving early\n"); | ||
| 450 | pdata->already_suspended = 0; | ||
| 451 | return 0; | ||
| 452 | } | ||
| 453 | |||
| 454 | if (!pdata->suspended) { | ||
| 455 | dev_dbg(dev, "not suspended, leaving early\n"); | ||
| 456 | return 0; | ||
| 457 | } | ||
| 458 | |||
| 459 | pdata->suspended = 0; | ||
| 460 | |||
| 461 | dev_dbg(dev, "resuming...\n"); | ||
| 462 | |||
| 463 | /* set host mode */ | ||
| 464 | tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0); | ||
| 465 | ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE); | ||
| 466 | |||
| 467 | ehci_writel(ehci, pdata->pm_usbgenctrl, | ||
| 468 | hcd->regs + FSL_SOC_USB_USBGENCTRL); | ||
| 469 | ehci_writel(ehci, ISIPHYCTRL_PXE | ISIPHYCTRL_PHYE, | ||
| 470 | hcd->regs + FSL_SOC_USB_ISIPHYCTRL); | ||
| 471 | |||
| 472 | /* restore EHCI registers */ | ||
| 473 | ehci_writel(ehci, pdata->pm_command, &ehci->regs->command); | ||
| 474 | ehci_writel(ehci, pdata->pm_intr_enable, &ehci->regs->intr_enable); | ||
| 475 | ehci_writel(ehci, pdata->pm_frame_index, &ehci->regs->frame_index); | ||
| 476 | ehci_writel(ehci, pdata->pm_segment, &ehci->regs->segment); | ||
| 477 | ehci_writel(ehci, pdata->pm_frame_list, &ehci->regs->frame_list); | ||
| 478 | ehci_writel(ehci, pdata->pm_async_next, &ehci->regs->async_next); | ||
| 479 | ehci_writel(ehci, pdata->pm_configured_flag, | ||
| 480 | &ehci->regs->configured_flag); | ||
| 481 | ehci_writel(ehci, pdata->pm_portsc, &ehci->regs->port_status[0]); | ||
| 482 | |||
| 483 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | ||
| 484 | hcd->state = HC_STATE_RUNNING; | ||
| 485 | dev->power.power_state = PMSG_ON; | ||
| 486 | |||
| 487 | tmp = ehci_readl(ehci, &ehci->regs->command); | ||
| 488 | tmp |= CMD_RUN; | ||
| 489 | ehci_writel(ehci, tmp, &ehci->regs->command); | ||
| 490 | |||
| 491 | usb_hcd_resume_root_hub(hcd); | ||
| 492 | |||
| 493 | return 0; | ||
| 494 | } | ||
| 495 | #else | ||
| 496 | static inline int ehci_fsl_mpc512x_drv_suspend(struct device *dev) | ||
| 497 | { | ||
| 498 | return 0; | ||
| 499 | } | ||
| 500 | |||
| 501 | static inline int ehci_fsl_mpc512x_drv_resume(struct device *dev) | ||
| 502 | { | ||
| 503 | return 0; | ||
| 504 | } | ||
| 505 | #endif /* CONFIG_PPC_MPC512x */ | ||
| 506 | |||
| 331 | static struct ehci_fsl *hcd_to_ehci_fsl(struct usb_hcd *hcd) | 507 | static struct ehci_fsl *hcd_to_ehci_fsl(struct usb_hcd *hcd) |
| 332 | { | 508 | { |
| 333 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 509 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
| @@ -341,6 +517,11 @@ static int ehci_fsl_drv_suspend(struct device *dev) | |||
| 341 | struct ehci_fsl *ehci_fsl = hcd_to_ehci_fsl(hcd); | 517 | struct ehci_fsl *ehci_fsl = hcd_to_ehci_fsl(hcd); |
| 342 | void __iomem *non_ehci = hcd->regs; | 518 | void __iomem *non_ehci = hcd->regs; |
| 343 | 519 | ||
| 520 | if (of_device_is_compatible(dev->parent->of_node, | ||
| 521 | "fsl,mpc5121-usb2-dr")) { | ||
| 522 | return ehci_fsl_mpc512x_drv_suspend(dev); | ||
| 523 | } | ||
| 524 | |||
| 344 | ehci_prepare_ports_for_controller_suspend(hcd_to_ehci(hcd), | 525 | ehci_prepare_ports_for_controller_suspend(hcd_to_ehci(hcd), |
| 345 | device_may_wakeup(dev)); | 526 | device_may_wakeup(dev)); |
| 346 | if (!fsl_deep_sleep()) | 527 | if (!fsl_deep_sleep()) |
| @@ -357,6 +538,11 @@ static int ehci_fsl_drv_resume(struct device *dev) | |||
| 357 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 538 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
| 358 | void __iomem *non_ehci = hcd->regs; | 539 | void __iomem *non_ehci = hcd->regs; |
| 359 | 540 | ||
| 541 | if (of_device_is_compatible(dev->parent->of_node, | ||
| 542 | "fsl,mpc5121-usb2-dr")) { | ||
| 543 | return ehci_fsl_mpc512x_drv_resume(dev); | ||
| 544 | } | ||
| 545 | |||
| 360 | ehci_prepare_ports_for_controller_resume(ehci); | 546 | ehci_prepare_ports_for_controller_resume(ehci); |
| 361 | if (!fsl_deep_sleep()) | 547 | if (!fsl_deep_sleep()) |
| 362 | return 0; | 548 | return 0; |
| @@ -391,6 +577,38 @@ static struct dev_pm_ops ehci_fsl_pm_ops = { | |||
| 391 | #define EHCI_FSL_PM_OPS NULL | 577 | #define EHCI_FSL_PM_OPS NULL |
| 392 | #endif /* CONFIG_PM */ | 578 | #endif /* CONFIG_PM */ |
| 393 | 579 | ||
| 580 | #ifdef CONFIG_USB_OTG | ||
| 581 | static int ehci_start_port_reset(struct usb_hcd *hcd, unsigned port) | ||
| 582 | { | ||
| 583 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
| 584 | u32 status; | ||
| 585 | |||
| 586 | if (!port) | ||
| 587 | return -EINVAL; | ||
| 588 | |||
| 589 | port--; | ||
| 590 | |||
| 591 | /* start port reset before HNP protocol time out */ | ||
| 592 | status = readl(&ehci->regs->port_status[port]); | ||
| 593 | if (!(status & PORT_CONNECT)) | ||
| 594 | return -ENODEV; | ||
| 595 | |||
| 596 | /* khubd will finish the reset later */ | ||
| 597 | if (ehci_is_TDI(ehci)) { | ||
| 598 | writel(PORT_RESET | | ||
| 599 | (status & ~(PORT_CSC | PORT_PEC | PORT_OCC)), | ||
| 600 | &ehci->regs->port_status[port]); | ||
| 601 | } else { | ||
| 602 | writel(PORT_RESET, &ehci->regs->port_status[port]); | ||
| 603 | } | ||
| 604 | |||
| 605 | return 0; | ||
| 606 | } | ||
| 607 | #else | ||
| 608 | #define ehci_start_port_reset NULL | ||
| 609 | #endif /* CONFIG_USB_OTG */ | ||
| 610 | |||
| 611 | |||
| 394 | static const struct hc_driver ehci_fsl_hc_driver = { | 612 | static const struct hc_driver ehci_fsl_hc_driver = { |
| 395 | .description = hcd_name, | 613 | .description = hcd_name, |
| 396 | .product_desc = "Freescale On-Chip EHCI Host Controller", | 614 | .product_desc = "Freescale On-Chip EHCI Host Controller", |
| @@ -430,6 +648,7 @@ static const struct hc_driver ehci_fsl_hc_driver = { | |||
| 430 | .hub_control = ehci_hub_control, | 648 | .hub_control = ehci_hub_control, |
| 431 | .bus_suspend = ehci_bus_suspend, | 649 | .bus_suspend = ehci_bus_suspend, |
| 432 | .bus_resume = ehci_bus_resume, | 650 | .bus_resume = ehci_bus_resume, |
| 651 | .start_port_reset = ehci_start_port_reset, | ||
| 433 | .relinquish_port = ehci_relinquish_port, | 652 | .relinquish_port = ehci_relinquish_port, |
| 434 | .port_handed_over = ehci_port_handed_over, | 653 | .port_handed_over = ehci_port_handed_over, |
| 435 | 654 | ||
diff --git a/drivers/usb/host/ehci-fsl.h b/drivers/usb/host/ehci-fsl.h index 3fabed33d94..49180622116 100644 --- a/drivers/usb/host/ehci-fsl.h +++ b/drivers/usb/host/ehci-fsl.h | |||
| @@ -27,6 +27,10 @@ | |||
| 27 | #define PORT_PTS_SERIAL (3<<30) | 27 | #define PORT_PTS_SERIAL (3<<30) |
| 28 | #define PORT_PTS_PTW (1<<28) | 28 | #define PORT_PTS_PTW (1<<28) |
| 29 | #define FSL_SOC_USB_PORTSC2 0x188 | 29 | #define FSL_SOC_USB_PORTSC2 0x188 |
| 30 | #define FSL_SOC_USB_USBMODE 0x1a8 | ||
| 31 | #define USBMODE_CM_MASK (3 << 0) /* controller mode mask */ | ||
| 32 | #define USBMODE_CM_HOST (3 << 0) /* controller mode: host */ | ||
| 33 | #define USBMODE_ES (1 << 2) /* (Big) Endian Select */ | ||
| 30 | 34 | ||
| 31 | #define FSL_SOC_USB_USBGENCTRL 0x200 | 35 | #define FSL_SOC_USB_USBGENCTRL 0x200 |
| 32 | #define USBGENCTRL_PPP (1 << 3) | 36 | #define USBGENCTRL_PPP (1 << 3) |
diff --git a/drivers/usb/host/ehci-grlib.c b/drivers/usb/host/ehci-grlib.c new file mode 100644 index 00000000000..93b230dc51a --- /dev/null +++ b/drivers/usb/host/ehci-grlib.c | |||
| @@ -0,0 +1,242 @@ | |||
| 1 | /* | ||
| 2 | * Driver for Aeroflex Gaisler GRLIB GRUSBHC EHCI host controller | ||
| 3 | * | ||
| 4 | * GRUSBHC is typically found on LEON/GRLIB SoCs | ||
| 5 | * | ||
| 6 | * (c) Jan Andersson <jan@gaisler.com> | ||
| 7 | * | ||
| 8 | * Based on ehci-ppc-of.c which is: | ||
| 9 | * (c) Valentine Barshak <vbarshak@ru.mvista.com> | ||
| 10 | * and in turn based on "ehci-ppc-soc.c" by Stefan Roese <sr@denx.de> | ||
| 11 | * and "ohci-ppc-of.c" by Sylvain Munaut <tnt@246tNt.com> | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify it | ||
| 14 | * under the terms of the GNU General Public License as published by the | ||
| 15 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 16 | * option) any later version. | ||
| 17 | * | ||
| 18 | * This program is distributed in the hope that it will be useful, but | ||
| 19 | * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | ||
| 20 | * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
| 21 | * for more details. | ||
| 22 | * | ||
| 23 | * You should have received a copy of the GNU General Public License | ||
| 24 | * along with this program; if not, write to the Free Software Foundation, | ||
| 25 | * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 26 | */ | ||
| 27 | |||
| 28 | |||
| 29 | #include <linux/signal.h> | ||
| 30 | |||
| 31 | #include <linux/of_irq.h> | ||
| 32 | #include <linux/of_address.h> | ||
| 33 | #include <linux/of_platform.h> | ||
| 34 | |||
| 35 | #define GRUSBHC_HCIVERSION 0x0100 /* Known value of cap. reg. HCIVERSION */ | ||
| 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_halt(ehci); | ||
| 44 | if (retval) | ||
| 45 | return retval; | ||
| 46 | |||
| 47 | retval = ehci_init(hcd); | ||
| 48 | if (retval) | ||
| 49 | return retval; | ||
| 50 | |||
| 51 | ehci->sbrn = 0x20; | ||
| 52 | ehci_port_power(ehci, 1); | ||
| 53 | |||
| 54 | return ehci_reset(ehci); | ||
| 55 | } | ||
| 56 | |||
| 57 | |||
| 58 | static const struct hc_driver ehci_grlib_hc_driver = { | ||
| 59 | .description = hcd_name, | ||
| 60 | .product_desc = "GRLIB GRUSBHC EHCI", | ||
| 61 | .hcd_priv_size = sizeof(struct ehci_hcd), | ||
| 62 | |||
| 63 | /* | ||
| 64 | * generic hardware linkage | ||
| 65 | */ | ||
| 66 | .irq = ehci_irq, | ||
| 67 | .flags = HCD_MEMORY | HCD_USB2, | ||
| 68 | |||
| 69 | /* | ||
| 70 | * basic lifecycle operations | ||
| 71 | */ | ||
| 72 | .reset = ehci_grlib_setup, | ||
| 73 | .start = ehci_run, | ||
| 74 | .stop = ehci_stop, | ||
| 75 | .shutdown = ehci_shutdown, | ||
| 76 | |||
| 77 | /* | ||
| 78 | * managing i/o requests and associated device resources | ||
| 79 | */ | ||
| 80 | .urb_enqueue = ehci_urb_enqueue, | ||
| 81 | .urb_dequeue = ehci_urb_dequeue, | ||
| 82 | .endpoint_disable = ehci_endpoint_disable, | ||
| 83 | .endpoint_reset = ehci_endpoint_reset, | ||
| 84 | |||
| 85 | /* | ||
| 86 | * scheduling support | ||
| 87 | */ | ||
| 88 | .get_frame_number = ehci_get_frame, | ||
| 89 | |||
| 90 | /* | ||
| 91 | * root hub support | ||
| 92 | */ | ||
| 93 | .hub_status_data = ehci_hub_status_data, | ||
| 94 | .hub_control = ehci_hub_control, | ||
| 95 | #ifdef CONFIG_PM | ||
| 96 | .bus_suspend = ehci_bus_suspend, | ||
| 97 | .bus_resume = ehci_bus_resume, | ||
| 98 | #endif | ||
| 99 | .relinquish_port = ehci_relinquish_port, | ||
| 100 | .port_handed_over = ehci_port_handed_over, | ||
| 101 | |||
| 102 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
| 103 | }; | ||
| 104 | |||
| 105 | |||
| 106 | static int __devinit ehci_hcd_grlib_probe(struct platform_device *op) | ||
| 107 | { | ||
| 108 | struct device_node *dn = op->dev.of_node; | ||
| 109 | struct usb_hcd *hcd; | ||
| 110 | struct ehci_hcd *ehci = NULL; | ||
| 111 | struct resource res; | ||
| 112 | u32 hc_capbase; | ||
| 113 | int irq; | ||
| 114 | int rv; | ||
| 115 | |||
| 116 | if (usb_disabled()) | ||
| 117 | return -ENODEV; | ||
| 118 | |||
| 119 | dev_dbg(&op->dev, "initializing GRUSBHC EHCI USB Controller\n"); | ||
| 120 | |||
| 121 | rv = of_address_to_resource(dn, 0, &res); | ||
| 122 | if (rv) | ||
| 123 | return rv; | ||
| 124 | |||
| 125 | /* usb_create_hcd requires dma_mask != NULL */ | ||
| 126 | op->dev.dma_mask = &op->dev.coherent_dma_mask; | ||
| 127 | hcd = usb_create_hcd(&ehci_grlib_hc_driver, &op->dev, | ||
| 128 | "GRUSBHC EHCI USB"); | ||
| 129 | if (!hcd) | ||
| 130 | return -ENOMEM; | ||
| 131 | |||
| 132 | hcd->rsrc_start = res.start; | ||
| 133 | hcd->rsrc_len = res.end - res.start + 1; | ||
| 134 | |||
| 135 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | ||
| 136 | printk(KERN_ERR "%s: request_mem_region failed\n", __FILE__); | ||
| 137 | rv = -EBUSY; | ||
| 138 | goto err_rmr; | ||
| 139 | } | ||
| 140 | |||
| 141 | irq = irq_of_parse_and_map(dn, 0); | ||
| 142 | if (irq == NO_IRQ) { | ||
| 143 | printk(KERN_ERR "%s: irq_of_parse_and_map failed\n", __FILE__); | ||
| 144 | rv = -EBUSY; | ||
| 145 | goto err_irq; | ||
| 146 | } | ||
| 147 | |||
| 148 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | ||
| 149 | if (!hcd->regs) { | ||
| 150 | printk(KERN_ERR "%s: ioremap failed\n", __FILE__); | ||
| 151 | rv = -ENOMEM; | ||
| 152 | goto err_ioremap; | ||
| 153 | } | ||
| 154 | |||
| 155 | ehci = hcd_to_ehci(hcd); | ||
| 156 | |||
| 157 | ehci->caps = hcd->regs; | ||
| 158 | |||
| 159 | /* determine endianness of this implementation */ | ||
| 160 | hc_capbase = ehci_readl(ehci, &ehci->caps->hc_capbase); | ||
| 161 | if (HC_VERSION(ehci, hc_capbase) != GRUSBHC_HCIVERSION) { | ||
| 162 | ehci->big_endian_mmio = 1; | ||
| 163 | ehci->big_endian_desc = 1; | ||
| 164 | ehci->big_endian_capbase = 1; | ||
| 165 | } | ||
| 166 | |||
| 167 | ehci->regs = hcd->regs + | ||
| 168 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
| 169 | |||
| 170 | /* cache this readonly data; minimize chip reads */ | ||
| 171 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | ||
| 172 | |||
| 173 | rv = usb_add_hcd(hcd, irq, 0); | ||
| 174 | if (rv) | ||
| 175 | goto err_ehci; | ||
| 176 | |||
| 177 | return 0; | ||
| 178 | |||
| 179 | err_ehci: | ||
| 180 | iounmap(hcd->regs); | ||
| 181 | err_ioremap: | ||
| 182 | irq_dispose_mapping(irq); | ||
| 183 | err_irq: | ||
| 184 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
| 185 | err_rmr: | ||
| 186 | usb_put_hcd(hcd); | ||
| 187 | |||
| 188 | return rv; | ||
| 189 | } | ||
| 190 | |||
| 191 | |||
| 192 | static int ehci_hcd_grlib_remove(struct platform_device *op) | ||
| 193 | { | ||
| 194 | struct usb_hcd *hcd = dev_get_drvdata(&op->dev); | ||
| 195 | |||
| 196 | dev_set_drvdata(&op->dev, NULL); | ||
| 197 | |||
| 198 | dev_dbg(&op->dev, "stopping GRLIB GRUSBHC EHCI USB Controller\n"); | ||
| 199 | |||
| 200 | usb_remove_hcd(hcd); | ||
| 201 | |||
| 202 | iounmap(hcd->regs); | ||
| 203 | irq_dispose_mapping(hcd->irq); | ||
| 204 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
| 205 | |||
| 206 | usb_put_hcd(hcd); | ||
| 207 | |||
| 208 | return 0; | ||
| 209 | } | ||
| 210 | |||
| 211 | |||
| 212 | static void ehci_hcd_grlib_shutdown(struct platform_device *op) | ||
| 213 | { | ||
| 214 | struct usb_hcd *hcd = dev_get_drvdata(&op->dev); | ||
| 215 | |||
| 216 | if (hcd->driver->shutdown) | ||
| 217 | hcd->driver->shutdown(hcd); | ||
| 218 | } | ||
| 219 | |||
| 220 | |||
| 221 | static const struct of_device_id ehci_hcd_grlib_of_match[] = { | ||
| 222 | { | ||
| 223 | .name = "GAISLER_EHCI", | ||
| 224 | }, | ||
| 225 | { | ||
| 226 | .name = "01_026", | ||
| 227 | }, | ||
| 228 | {}, | ||
| 229 | }; | ||
| 230 | MODULE_DEVICE_TABLE(of, ehci_hcd_grlib_of_match); | ||
| 231 | |||
| 232 | |||
| 233 | static struct platform_driver ehci_grlib_driver = { | ||
| 234 | .probe = ehci_hcd_grlib_probe, | ||
| 235 | .remove = ehci_hcd_grlib_remove, | ||
| 236 | .shutdown = ehci_hcd_grlib_shutdown, | ||
| 237 | .driver = { | ||
| 238 | .name = "grlib-ehci", | ||
| 239 | .owner = THIS_MODULE, | ||
| 240 | .of_match_table = ehci_hcd_grlib_of_match, | ||
| 241 | }, | ||
| 242 | }; | ||
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 78561d112c0..b435ed67dd5 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
| @@ -739,7 +739,7 @@ static int ehci_run (struct usb_hcd *hcd) | |||
| 739 | up_write(&ehci_cf_port_reset_rwsem); | 739 | up_write(&ehci_cf_port_reset_rwsem); |
| 740 | ehci->last_periodic_enable = ktime_get_real(); | 740 | ehci->last_periodic_enable = ktime_get_real(); |
| 741 | 741 | ||
| 742 | temp = HC_VERSION(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 742 | temp = HC_VERSION(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
| 743 | ehci_info (ehci, | 743 | ehci_info (ehci, |
| 744 | "USB %x.%x started, EHCI %x.%02x%s\n", | 744 | "USB %x.%x started, EHCI %x.%02x%s\n", |
| 745 | ((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f), | 745 | ((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f), |
| @@ -777,8 +777,9 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
| 777 | goto dead; | 777 | goto dead; |
| 778 | } | 778 | } |
| 779 | 779 | ||
| 780 | /* Shared IRQ? */ | ||
| 780 | masked_status = status & INTR_MASK; | 781 | masked_status = status & INTR_MASK; |
| 781 | if (!masked_status) { /* irq sharing? */ | 782 | if (!masked_status || unlikely(hcd->state == HC_STATE_HALT)) { |
| 782 | spin_unlock(&ehci->lock); | 783 | spin_unlock(&ehci->lock); |
| 783 | return IRQ_NONE; | 784 | return IRQ_NONE; |
| 784 | } | 785 | } |
| @@ -873,6 +874,7 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
| 873 | dead: | 874 | dead: |
| 874 | ehci_reset(ehci); | 875 | ehci_reset(ehci); |
| 875 | ehci_writel(ehci, 0, &ehci->regs->configured_flag); | 876 | ehci_writel(ehci, 0, &ehci->regs->configured_flag); |
| 877 | usb_hc_died(hcd); | ||
| 876 | /* generic layer kills/unlinks all urbs, then | 878 | /* generic layer kills/unlinks all urbs, then |
| 877 | * uses ehci_stop to clean up the rest | 879 | * uses ehci_stop to clean up the rest |
| 878 | */ | 880 | */ |
| @@ -1265,6 +1267,21 @@ MODULE_LICENSE ("GPL"); | |||
| 1265 | #define PLATFORM_DRIVER tegra_ehci_driver | 1267 | #define PLATFORM_DRIVER tegra_ehci_driver |
| 1266 | #endif | 1268 | #endif |
| 1267 | 1269 | ||
| 1270 | #ifdef CONFIG_USB_EHCI_S5P | ||
| 1271 | #include "ehci-s5p.c" | ||
| 1272 | #define PLATFORM_DRIVER s5p_ehci_driver | ||
| 1273 | #endif | ||
| 1274 | |||
| 1275 | #ifdef CONFIG_USB_EHCI_ATH79 | ||
| 1276 | #include "ehci-ath79.c" | ||
| 1277 | #define PLATFORM_DRIVER ehci_ath79_driver | ||
| 1278 | #endif | ||
| 1279 | |||
| 1280 | #ifdef CONFIG_SPARC_LEON | ||
| 1281 | #include "ehci-grlib.c" | ||
| 1282 | #define PLATFORM_DRIVER ehci_grlib_driver | ||
| 1283 | #endif | ||
| 1284 | |||
| 1268 | #if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \ | 1285 | #if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \ |
| 1269 | !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER) && \ | 1286 | !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER) && \ |
| 1270 | !defined(XILINX_OF_PLATFORM_DRIVER) | 1287 | !defined(XILINX_OF_PLATFORM_DRIVER) |
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index d05ea03cfb4..ea6184bf48d 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | */ | 27 | */ |
| 28 | 28 | ||
| 29 | /*-------------------------------------------------------------------------*/ | 29 | /*-------------------------------------------------------------------------*/ |
| 30 | #include <linux/usb/otg.h> | ||
| 30 | 31 | ||
| 31 | #define PORT_WAKE_BITS (PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E) | 32 | #define PORT_WAKE_BITS (PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E) |
| 32 | 33 | ||
| @@ -127,7 +128,7 @@ static int ehci_port_change(struct ehci_hcd *ehci) | |||
| 127 | return 0; | 128 | return 0; |
| 128 | } | 129 | } |
| 129 | 130 | ||
| 130 | static void ehci_adjust_port_wakeup_flags(struct ehci_hcd *ehci, | 131 | static __maybe_unused void ehci_adjust_port_wakeup_flags(struct ehci_hcd *ehci, |
| 131 | bool suspending, bool do_wakeup) | 132 | bool suspending, bool do_wakeup) |
| 132 | { | 133 | { |
| 133 | int port; | 134 | int port; |
| @@ -801,6 +802,13 @@ static int ehci_hub_control ( | |||
| 801 | goto error; | 802 | goto error; |
| 802 | if (ehci->no_selective_suspend) | 803 | if (ehci->no_selective_suspend) |
| 803 | break; | 804 | break; |
| 805 | #ifdef CONFIG_USB_OTG | ||
| 806 | if ((hcd->self.otg_port == (wIndex + 1)) | ||
| 807 | && hcd->self.b_hnp_enable) { | ||
| 808 | otg_start_hnp(ehci->transceiver); | ||
| 809 | break; | ||
| 810 | } | ||
| 811 | #endif | ||
| 804 | if (!(temp & PORT_SUSPEND)) | 812 | if (!(temp & PORT_SUSPEND)) |
| 805 | break; | 813 | break; |
| 806 | if ((temp & PORT_PE) == 0) | 814 | if ((temp & PORT_PE) == 0) |
diff --git a/drivers/usb/host/ehci-ixp4xx.c b/drivers/usb/host/ehci-ixp4xx.c index 89b7c70c6ed..50e600d26e2 100644 --- a/drivers/usb/host/ehci-ixp4xx.c +++ b/drivers/usb/host/ehci-ixp4xx.c | |||
| @@ -23,7 +23,7 @@ static int ixp4xx_ehci_init(struct usb_hcd *hcd) | |||
| 23 | 23 | ||
| 24 | ehci->caps = hcd->regs + 0x100; | 24 | ehci->caps = hcd->regs + 0x100; |
| 25 | ehci->regs = hcd->regs + 0x100 | 25 | ehci->regs = hcd->regs + 0x100 |
| 26 | + HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 26 | + HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
| 27 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | 27 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); |
| 28 | 28 | ||
| 29 | hcd->has_tt = 1; | 29 | hcd->has_tt = 1; |
diff --git a/drivers/usb/host/ehci-msm.c b/drivers/usb/host/ehci-msm.c index 9ce1b0bc186..b5a0bf649c9 100644 --- a/drivers/usb/host/ehci-msm.c +++ b/drivers/usb/host/ehci-msm.c | |||
| @@ -41,7 +41,7 @@ static int ehci_msm_reset(struct usb_hcd *hcd) | |||
| 41 | 41 | ||
| 42 | ehci->caps = USB_CAPLENGTH; | 42 | ehci->caps = USB_CAPLENGTH; |
| 43 | ehci->regs = USB_CAPLENGTH + | 43 | ehci->regs = USB_CAPLENGTH + |
| 44 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 44 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
| 45 | dbg_hcs_params(ehci, "reset"); | 45 | dbg_hcs_params(ehci, "reset"); |
| 46 | dbg_hcc_params(ehci, "reset"); | 46 | dbg_hcc_params(ehci, "reset"); |
| 47 | 47 | ||
diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c index 25c8c10bb68..0c058be35a3 100644 --- a/drivers/usb/host/ehci-mxc.c +++ b/drivers/usb/host/ehci-mxc.c | |||
| @@ -208,7 +208,7 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) | |||
| 208 | /* EHCI registers start at offset 0x100 */ | 208 | /* EHCI registers start at offset 0x100 */ |
| 209 | ehci->caps = hcd->regs + 0x100; | 209 | ehci->caps = hcd->regs + 0x100; |
| 210 | ehci->regs = hcd->regs + 0x100 + | 210 | ehci->regs = hcd->regs + 0x100 + |
| 211 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 211 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
| 212 | 212 | ||
| 213 | /* set up the PORTSCx register */ | 213 | /* set up the PORTSCx register */ |
| 214 | ehci_writel(ehci, pdata->portsc, &ehci->regs->port_status[0]); | 214 | ehci_writel(ehci, pdata->portsc, &ehci->regs->port_status[0]); |
diff --git a/drivers/usb/host/ehci-octeon.c b/drivers/usb/host/ehci-octeon.c index a31a031178a..ff55757ba7d 100644 --- a/drivers/usb/host/ehci-octeon.c +++ b/drivers/usb/host/ehci-octeon.c | |||
| @@ -151,7 +151,7 @@ static int ehci_octeon_drv_probe(struct platform_device *pdev) | |||
| 151 | 151 | ||
| 152 | ehci->caps = hcd->regs; | 152 | ehci->caps = hcd->regs; |
| 153 | ehci->regs = hcd->regs + | 153 | ehci->regs = hcd->regs + |
| 154 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 154 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
| 155 | /* cache this readonly data; minimize chip reads */ | 155 | /* cache this readonly data; minimize chip reads */ |
| 156 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | 156 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); |
| 157 | 157 | ||
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c index 627f3a67875..55a57c23dd0 100644 --- a/drivers/usb/host/ehci-omap.c +++ b/drivers/usb/host/ehci-omap.c | |||
| @@ -208,7 +208,7 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev) | |||
| 208 | /* we know this is the memory we want, no need to ioremap again */ | 208 | /* we know this is the memory we want, no need to ioremap again */ |
| 209 | omap_ehci->caps = hcd->regs; | 209 | omap_ehci->caps = hcd->regs; |
| 210 | omap_ehci->regs = hcd->regs | 210 | omap_ehci->regs = hcd->regs |
| 211 | + HC_LENGTH(readl(&omap_ehci->caps->hc_capbase)); | 211 | + HC_LENGTH(ehci, readl(&omap_ehci->caps->hc_capbase)); |
| 212 | 212 | ||
| 213 | dbg_hcs_params(omap_ehci, "reset"); | 213 | dbg_hcs_params(omap_ehci, "reset"); |
| 214 | dbg_hcc_params(omap_ehci, "reset"); | 214 | dbg_hcc_params(omap_ehci, "reset"); |
diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c index 281e094e1c1..395bdb0248d 100644 --- a/drivers/usb/host/ehci-orion.c +++ b/drivers/usb/host/ehci-orion.c | |||
| @@ -251,7 +251,7 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev) | |||
| 251 | ehci = hcd_to_ehci(hcd); | 251 | ehci = hcd_to_ehci(hcd); |
| 252 | ehci->caps = hcd->regs + 0x100; | 252 | ehci->caps = hcd->regs + 0x100; |
| 253 | ehci->regs = hcd->regs + 0x100 + | 253 | ehci->regs = hcd->regs + 0x100 + |
| 254 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 254 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
| 255 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | 255 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); |
| 256 | hcd->has_tt = 1; | 256 | hcd->has_tt = 1; |
| 257 | ehci->sbrn = 0x20; | 257 | ehci->sbrn = 0x20; |
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index d5eaea7caf8..660b80a75ca 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
| @@ -70,7 +70,7 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
| 70 | 70 | ||
| 71 | ehci->caps = hcd->regs; | 71 | ehci->caps = hcd->regs; |
| 72 | ehci->regs = hcd->regs + | 72 | ehci->regs = hcd->regs + |
| 73 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 73 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
| 74 | 74 | ||
| 75 | dbg_hcs_params(ehci, "reset"); | 75 | dbg_hcs_params(ehci, "reset"); |
| 76 | dbg_hcc_params(ehci, "reset"); | 76 | dbg_hcc_params(ehci, "reset"); |
diff --git a/drivers/usb/host/ehci-pmcmsp.c b/drivers/usb/host/ehci-pmcmsp.c index a2168642175..cd69099cda1 100644 --- a/drivers/usb/host/ehci-pmcmsp.c +++ b/drivers/usb/host/ehci-pmcmsp.c | |||
| @@ -83,7 +83,7 @@ static int ehci_msp_setup(struct usb_hcd *hcd) | |||
| 83 | 83 | ||
| 84 | ehci->caps = hcd->regs; | 84 | ehci->caps = hcd->regs; |
| 85 | ehci->regs = hcd->regs + | 85 | ehci->regs = hcd->regs + |
| 86 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 86 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
| 87 | dbg_hcs_params(ehci, "reset"); | 87 | dbg_hcs_params(ehci, "reset"); |
| 88 | dbg_hcc_params(ehci, "reset"); | 88 | dbg_hcc_params(ehci, "reset"); |
| 89 | 89 | ||
diff --git a/drivers/usb/host/ehci-ppc-of.c b/drivers/usb/host/ehci-ppc-of.c index 1f09f253697..8552db6c29c 100644 --- a/drivers/usb/host/ehci-ppc-of.c +++ b/drivers/usb/host/ehci-ppc-of.c | |||
| @@ -179,7 +179,7 @@ static int __devinit ehci_hcd_ppc_of_probe(struct platform_device *op) | |||
| 179 | 179 | ||
| 180 | ehci->caps = hcd->regs; | 180 | ehci->caps = hcd->regs; |
| 181 | ehci->regs = hcd->regs + | 181 | ehci->regs = hcd->regs + |
| 182 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 182 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
| 183 | 183 | ||
| 184 | /* cache this readonly data; minimize chip reads */ | 184 | /* cache this readonly data; minimize chip reads */ |
| 185 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | 185 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); |
diff --git a/drivers/usb/host/ehci-ps3.c b/drivers/usb/host/ehci-ps3.c index 1dee33b9139..64626a777d6 100644 --- a/drivers/usb/host/ehci-ps3.c +++ b/drivers/usb/host/ehci-ps3.c | |||
| @@ -29,7 +29,7 @@ static int ps3_ehci_hc_reset(struct usb_hcd *hcd) | |||
| 29 | ehci->big_endian_mmio = 1; | 29 | ehci->big_endian_mmio = 1; |
| 30 | 30 | ||
| 31 | ehci->caps = hcd->regs; | 31 | ehci->caps = hcd->regs; |
| 32 | ehci->regs = hcd->regs + HC_LENGTH(ehci_readl(ehci, | 32 | ehci->regs = hcd->regs + HC_LENGTH(ehci, ehci_readl(ehci, |
| 33 | &ehci->caps->hc_capbase)); | 33 | &ehci->caps->hc_capbase)); |
| 34 | 34 | ||
| 35 | dbg_hcs_params(ehci, "reset"); | 35 | dbg_hcs_params(ehci, "reset"); |
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 42abd0f603b..5d6bc624c96 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c | |||
| @@ -826,6 +826,7 @@ qh_make ( | |||
| 826 | is_input, 0, | 826 | is_input, 0, |
| 827 | hb_mult(maxp) * max_packet(maxp))); | 827 | hb_mult(maxp) * max_packet(maxp))); |
| 828 | qh->start = NO_FRAME; | 828 | qh->start = NO_FRAME; |
| 829 | qh->stamp = ehci->periodic_stamp; | ||
| 829 | 830 | ||
| 830 | if (urb->dev->speed == USB_SPEED_HIGH) { | 831 | if (urb->dev->speed == USB_SPEED_HIGH) { |
| 831 | qh->c_usecs = 0; | 832 | qh->c_usecs = 0; |
| @@ -1183,6 +1184,10 @@ static void end_unlink_async (struct ehci_hcd *ehci) | |||
| 1183 | ehci->reclaim = NULL; | 1184 | ehci->reclaim = NULL; |
| 1184 | start_unlink_async (ehci, next); | 1185 | start_unlink_async (ehci, next); |
| 1185 | } | 1186 | } |
| 1187 | |||
| 1188 | if (ehci->has_synopsys_hc_bug) | ||
| 1189 | ehci_writel(ehci, (u32) ehci->async->qh_dma, | ||
| 1190 | &ehci->regs->async_next); | ||
| 1186 | } | 1191 | } |
| 1187 | 1192 | ||
| 1188 | /* makes sure the async qh will become idle */ | 1193 | /* makes sure the async qh will become idle */ |
diff --git a/drivers/usb/host/ehci-s5p.c b/drivers/usb/host/ehci-s5p.c new file mode 100644 index 00000000000..e3374c8f7b3 --- /dev/null +++ b/drivers/usb/host/ehci-s5p.c | |||
| @@ -0,0 +1,202 @@ | |||
| 1 | /* | ||
| 2 | * SAMSUNG S5P USB HOST EHCI Controller | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Samsung Electronics Co.Ltd | ||
| 5 | * Author: Jingoo Han <jg1.han@samsung.com> | ||
| 6 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify it | ||
| 9 | * under the terms of the GNU General Public License as published by the | ||
| 10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 11 | * option) any later version. | ||
| 12 | * | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <linux/clk.h> | ||
| 16 | #include <linux/platform_device.h> | ||
| 17 | #include <mach/regs-pmu.h> | ||
| 18 | #include <plat/cpu.h> | ||
| 19 | #include <plat/ehci.h> | ||
| 20 | #include <plat/usb-phy.h> | ||
| 21 | |||
| 22 | struct s5p_ehci_hcd { | ||
| 23 | struct device *dev; | ||
| 24 | struct usb_hcd *hcd; | ||
| 25 | struct clk *clk; | ||
| 26 | }; | ||
| 27 | |||
| 28 | static const struct hc_driver s5p_ehci_hc_driver = { | ||
| 29 | .description = hcd_name, | ||
| 30 | .product_desc = "S5P EHCI Host Controller", | ||
| 31 | .hcd_priv_size = sizeof(struct ehci_hcd), | ||
| 32 | |||
| 33 | .irq = ehci_irq, | ||
| 34 | .flags = HCD_MEMORY | HCD_USB2, | ||
| 35 | |||
| 36 | .reset = ehci_init, | ||
| 37 | .start = ehci_run, | ||
| 38 | .stop = ehci_stop, | ||
| 39 | .shutdown = ehci_shutdown, | ||
| 40 | |||
| 41 | .get_frame_number = ehci_get_frame, | ||
| 42 | |||
| 43 | .urb_enqueue = ehci_urb_enqueue, | ||
| 44 | .urb_dequeue = ehci_urb_dequeue, | ||
| 45 | .endpoint_disable = ehci_endpoint_disable, | ||
| 46 | .endpoint_reset = ehci_endpoint_reset, | ||
| 47 | |||
| 48 | .hub_status_data = ehci_hub_status_data, | ||
| 49 | .hub_control = ehci_hub_control, | ||
| 50 | .bus_suspend = ehci_bus_suspend, | ||
| 51 | .bus_resume = ehci_bus_resume, | ||
| 52 | |||
| 53 | .relinquish_port = ehci_relinquish_port, | ||
| 54 | .port_handed_over = ehci_port_handed_over, | ||
| 55 | |||
| 56 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | ||
| 57 | }; | ||
| 58 | |||
| 59 | static int __devinit s5p_ehci_probe(struct platform_device *pdev) | ||
| 60 | { | ||
| 61 | struct s5p_ehci_platdata *pdata; | ||
| 62 | struct s5p_ehci_hcd *s5p_ehci; | ||
| 63 | struct usb_hcd *hcd; | ||
| 64 | struct ehci_hcd *ehci; | ||
| 65 | struct resource *res; | ||
| 66 | int irq; | ||
| 67 | int err; | ||
| 68 | |||
| 69 | pdata = pdev->dev.platform_data; | ||
| 70 | if (!pdata) { | ||
| 71 | dev_err(&pdev->dev, "No platform data defined\n"); | ||
| 72 | return -EINVAL; | ||
| 73 | } | ||
| 74 | |||
| 75 | s5p_ehci = kzalloc(sizeof(struct s5p_ehci_hcd), GFP_KERNEL); | ||
| 76 | if (!s5p_ehci) | ||
| 77 | return -ENOMEM; | ||
| 78 | |||
| 79 | s5p_ehci->dev = &pdev->dev; | ||
| 80 | |||
| 81 | hcd = usb_create_hcd(&s5p_ehci_hc_driver, &pdev->dev, | ||
| 82 | dev_name(&pdev->dev)); | ||
| 83 | if (!hcd) { | ||
| 84 | dev_err(&pdev->dev, "Unable to create HCD\n"); | ||
| 85 | err = -ENOMEM; | ||
| 86 | goto fail_hcd; | ||
| 87 | } | ||
| 88 | |||
| 89 | s5p_ehci->clk = clk_get(&pdev->dev, "usbhost"); | ||
| 90 | |||
| 91 | if (IS_ERR(s5p_ehci->clk)) { | ||
| 92 | dev_err(&pdev->dev, "Failed to get usbhost clock\n"); | ||
| 93 | err = PTR_ERR(s5p_ehci->clk); | ||
| 94 | goto fail_clk; | ||
| 95 | } | ||
| 96 | |||
| 97 | err = clk_enable(s5p_ehci->clk); | ||
| 98 | if (err) | ||
| 99 | goto fail_clken; | ||
| 100 | |||
| 101 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 102 | if (!res) { | ||
| 103 | dev_err(&pdev->dev, "Failed to get I/O memory\n"); | ||
| 104 | err = -ENXIO; | ||
| 105 | goto fail_io; | ||
| 106 | } | ||
| 107 | |||
| 108 | hcd->rsrc_start = res->start; | ||
| 109 | hcd->rsrc_len = resource_size(res); | ||
| 110 | hcd->regs = ioremap(res->start, resource_size(res)); | ||
| 111 | if (!hcd->regs) { | ||
| 112 | dev_err(&pdev->dev, "Failed to remap I/O memory\n"); | ||
| 113 | err = -ENOMEM; | ||
| 114 | goto fail_io; | ||
| 115 | } | ||
| 116 | |||
| 117 | irq = platform_get_irq(pdev, 0); | ||
| 118 | if (!irq) { | ||
| 119 | dev_err(&pdev->dev, "Failed to get IRQ\n"); | ||
| 120 | err = -ENODEV; | ||
| 121 | goto fail; | ||
| 122 | } | ||
| 123 | |||
| 124 | if (pdata->phy_init) | ||
| 125 | pdata->phy_init(pdev, S5P_USB_PHY_HOST); | ||
| 126 | |||
| 127 | ehci = hcd_to_ehci(hcd); | ||
| 128 | ehci->caps = hcd->regs; | ||
| 129 | ehci->regs = hcd->regs + | ||
| 130 | HC_LENGTH(ehci, readl(&ehci->caps->hc_capbase)); | ||
| 131 | |||
| 132 | dbg_hcs_params(ehci, "reset"); | ||
| 133 | dbg_hcc_params(ehci, "reset"); | ||
| 134 | |||
| 135 | /* cache this readonly data; minimize chip reads */ | ||
| 136 | ehci->hcs_params = readl(&ehci->caps->hcs_params); | ||
| 137 | |||
| 138 | err = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); | ||
| 139 | if (err) { | ||
| 140 | dev_err(&pdev->dev, "Failed to add USB HCD\n"); | ||
| 141 | goto fail; | ||
| 142 | } | ||
| 143 | |||
| 144 | platform_set_drvdata(pdev, s5p_ehci); | ||
| 145 | |||
| 146 | return 0; | ||
| 147 | |||
| 148 | fail: | ||
| 149 | iounmap(hcd->regs); | ||
| 150 | fail_io: | ||
| 151 | clk_disable(s5p_ehci->clk); | ||
| 152 | fail_clken: | ||
| 153 | clk_put(s5p_ehci->clk); | ||
| 154 | fail_clk: | ||
| 155 | usb_put_hcd(hcd); | ||
| 156 | fail_hcd: | ||
| 157 | kfree(s5p_ehci); | ||
| 158 | return err; | ||
| 159 | } | ||
| 160 | |||
| 161 | static int __devexit s5p_ehci_remove(struct platform_device *pdev) | ||
| 162 | { | ||
| 163 | struct s5p_ehci_platdata *pdata = pdev->dev.platform_data; | ||
| 164 | struct s5p_ehci_hcd *s5p_ehci = platform_get_drvdata(pdev); | ||
| 165 | struct usb_hcd *hcd = s5p_ehci->hcd; | ||
| 166 | |||
| 167 | usb_remove_hcd(hcd); | ||
| 168 | |||
| 169 | if (pdata && pdata->phy_exit) | ||
| 170 | pdata->phy_exit(pdev, S5P_USB_PHY_HOST); | ||
| 171 | |||
| 172 | iounmap(hcd->regs); | ||
| 173 | |||
| 174 | clk_disable(s5p_ehci->clk); | ||
| 175 | clk_put(s5p_ehci->clk); | ||
| 176 | |||
| 177 | usb_put_hcd(hcd); | ||
| 178 | kfree(s5p_ehci); | ||
| 179 | |||
| 180 | return 0; | ||
| 181 | } | ||
| 182 | |||
| 183 | static void s5p_ehci_shutdown(struct platform_device *pdev) | ||
| 184 | { | ||
| 185 | struct s5p_ehci_hcd *s5p_ehci = platform_get_drvdata(pdev); | ||
| 186 | struct usb_hcd *hcd = s5p_ehci->hcd; | ||
| 187 | |||
| 188 | if (hcd->driver->shutdown) | ||
| 189 | hcd->driver->shutdown(hcd); | ||
| 190 | } | ||
| 191 | |||
| 192 | static struct platform_driver s5p_ehci_driver = { | ||
| 193 | .probe = s5p_ehci_probe, | ||
| 194 | .remove = __devexit_p(s5p_ehci_remove), | ||
| 195 | .shutdown = s5p_ehci_shutdown, | ||
| 196 | .driver = { | ||
| 197 | .name = "s5p-ehci", | ||
| 198 | .owner = THIS_MODULE, | ||
| 199 | } | ||
| 200 | }; | ||
| 201 | |||
| 202 | MODULE_ALIAS("platform:s5p-ehci"); | ||
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index 1543c838b3d..6c9fbe352f7 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
| @@ -471,8 +471,10 @@ static int enable_periodic (struct ehci_hcd *ehci) | |||
| 471 | */ | 471 | */ |
| 472 | status = handshake_on_error_set_halt(ehci, &ehci->regs->status, | 472 | status = handshake_on_error_set_halt(ehci, &ehci->regs->status, |
| 473 | STS_PSS, 0, 9 * 125); | 473 | STS_PSS, 0, 9 * 125); |
| 474 | if (status) | 474 | if (status) { |
| 475 | usb_hc_died(ehci_to_hcd(ehci)); | ||
| 475 | return status; | 476 | return status; |
| 477 | } | ||
| 476 | 478 | ||
| 477 | cmd = ehci_readl(ehci, &ehci->regs->command) | CMD_PSE; | 479 | cmd = ehci_readl(ehci, &ehci->regs->command) | CMD_PSE; |
| 478 | ehci_writel(ehci, cmd, &ehci->regs->command); | 480 | ehci_writel(ehci, cmd, &ehci->regs->command); |
| @@ -510,8 +512,10 @@ static int disable_periodic (struct ehci_hcd *ehci) | |||
| 510 | */ | 512 | */ |
| 511 | status = handshake_on_error_set_halt(ehci, &ehci->regs->status, | 513 | status = handshake_on_error_set_halt(ehci, &ehci->regs->status, |
| 512 | STS_PSS, STS_PSS, 9 * 125); | 514 | STS_PSS, STS_PSS, 9 * 125); |
| 513 | if (status) | 515 | if (status) { |
| 516 | usb_hc_died(ehci_to_hcd(ehci)); | ||
| 514 | return status; | 517 | return status; |
| 518 | } | ||
| 515 | 519 | ||
| 516 | cmd = ehci_readl(ehci, &ehci->regs->command) & ~CMD_PSE; | 520 | cmd = ehci_readl(ehci, &ehci->regs->command) & ~CMD_PSE; |
| 517 | ehci_writel(ehci, cmd, &ehci->regs->command); | 521 | ehci_writel(ehci, cmd, &ehci->regs->command); |
| @@ -2287,6 +2291,7 @@ scan_periodic (struct ehci_hcd *ehci) | |||
| 2287 | } | 2291 | } |
| 2288 | clock &= mod - 1; | 2292 | clock &= mod - 1; |
| 2289 | clock_frame = clock >> 3; | 2293 | clock_frame = clock >> 3; |
| 2294 | ++ehci->periodic_stamp; | ||
| 2290 | 2295 | ||
| 2291 | for (;;) { | 2296 | for (;;) { |
| 2292 | union ehci_shadow q, *q_p; | 2297 | union ehci_shadow q, *q_p; |
| @@ -2315,10 +2320,14 @@ restart: | |||
| 2315 | temp.qh = qh_get (q.qh); | 2320 | temp.qh = qh_get (q.qh); |
| 2316 | type = Q_NEXT_TYPE(ehci, q.qh->hw->hw_next); | 2321 | type = Q_NEXT_TYPE(ehci, q.qh->hw->hw_next); |
| 2317 | q = q.qh->qh_next; | 2322 | q = q.qh->qh_next; |
| 2318 | modified = qh_completions (ehci, temp.qh); | 2323 | if (temp.qh->stamp != ehci->periodic_stamp) { |
| 2319 | if (unlikely(list_empty(&temp.qh->qtd_list) || | 2324 | modified = qh_completions(ehci, temp.qh); |
| 2320 | temp.qh->needs_rescan)) | 2325 | if (!modified) |
| 2321 | intr_deschedule (ehci, temp.qh); | 2326 | temp.qh->stamp = ehci->periodic_stamp; |
| 2327 | if (unlikely(list_empty(&temp.qh->qtd_list) || | ||
| 2328 | temp.qh->needs_rescan)) | ||
| 2329 | intr_deschedule(ehci, temp.qh); | ||
| 2330 | } | ||
| 2322 | qh_put (temp.qh); | 2331 | qh_put (temp.qh); |
| 2323 | break; | 2332 | break; |
| 2324 | case Q_TYPE_FSTN: | 2333 | case Q_TYPE_FSTN: |
| @@ -2460,6 +2469,7 @@ restart: | |||
| 2460 | if (ehci->clock_frame != clock_frame) { | 2469 | if (ehci->clock_frame != clock_frame) { |
| 2461 | free_cached_lists(ehci); | 2470 | free_cached_lists(ehci); |
| 2462 | ehci->clock_frame = clock_frame; | 2471 | ehci->clock_frame = clock_frame; |
| 2472 | ++ehci->periodic_stamp; | ||
| 2463 | } | 2473 | } |
| 2464 | } else { | 2474 | } else { |
| 2465 | now_uframe++; | 2475 | now_uframe++; |
diff --git a/drivers/usb/host/ehci-sh.c b/drivers/usb/host/ehci-sh.c index 595f70f42b5..86a95bb80a6 100644 --- a/drivers/usb/host/ehci-sh.c +++ b/drivers/usb/host/ehci-sh.c | |||
| @@ -23,7 +23,7 @@ static int ehci_sh_reset(struct usb_hcd *hcd) | |||
| 23 | int ret; | 23 | int ret; |
| 24 | 24 | ||
| 25 | ehci->caps = hcd->regs; | 25 | ehci->caps = hcd->regs; |
| 26 | ehci->regs = hcd->regs + HC_LENGTH(ehci_readl(ehci, | 26 | ehci->regs = hcd->regs + HC_LENGTH(ehci, ehci_readl(ehci, |
| 27 | &ehci->caps->hc_capbase)); | 27 | &ehci->caps->hc_capbase)); |
| 28 | 28 | ||
| 29 | dbg_hcs_params(ehci, "reset"); | 29 | dbg_hcs_params(ehci, "reset"); |
diff --git a/drivers/usb/host/ehci-spear.c b/drivers/usb/host/ehci-spear.c index 75c00873443..dbf1e4ef3c1 100644 --- a/drivers/usb/host/ehci-spear.c +++ b/drivers/usb/host/ehci-spear.c | |||
| @@ -38,7 +38,7 @@ static int ehci_spear_setup(struct usb_hcd *hcd) | |||
| 38 | 38 | ||
| 39 | /* registers start at offset 0x0 */ | 39 | /* registers start at offset 0x0 */ |
| 40 | ehci->caps = hcd->regs; | 40 | ehci->caps = hcd->regs; |
| 41 | ehci->regs = hcd->regs + HC_LENGTH(ehci_readl(ehci, | 41 | ehci->regs = hcd->regs + HC_LENGTH(ehci, ehci_readl(ehci, |
| 42 | &ehci->caps->hc_capbase)); | 42 | &ehci->caps->hc_capbase)); |
| 43 | /* cache this readonly data; minimize chip reads */ | 43 | /* cache this readonly data; minimize chip reads */ |
| 44 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | 44 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); |
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index a516af28c29..02b2bfd49a1 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c | |||
| @@ -58,6 +58,71 @@ static void tegra_ehci_power_down(struct usb_hcd *hcd) | |||
| 58 | clk_disable(tegra->emc_clk); | 58 | clk_disable(tegra->emc_clk); |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | static int tegra_ehci_internal_port_reset( | ||
| 62 | struct ehci_hcd *ehci, | ||
| 63 | u32 __iomem *portsc_reg | ||
| 64 | ) | ||
| 65 | { | ||
| 66 | u32 temp; | ||
| 67 | unsigned long flags; | ||
| 68 | int retval = 0; | ||
| 69 | int i, tries; | ||
| 70 | u32 saved_usbintr; | ||
| 71 | |||
| 72 | spin_lock_irqsave(&ehci->lock, flags); | ||
| 73 | saved_usbintr = ehci_readl(ehci, &ehci->regs->intr_enable); | ||
| 74 | /* disable USB interrupt */ | ||
| 75 | ehci_writel(ehci, 0, &ehci->regs->intr_enable); | ||
| 76 | spin_unlock_irqrestore(&ehci->lock, flags); | ||
| 77 | |||
| 78 | /* | ||
| 79 | * Here we have to do Port Reset at most twice for | ||
| 80 | * Port Enable bit to be set. | ||
| 81 | */ | ||
| 82 | for (i = 0; i < 2; i++) { | ||
| 83 | temp = ehci_readl(ehci, portsc_reg); | ||
| 84 | temp |= PORT_RESET; | ||
| 85 | ehci_writel(ehci, temp, portsc_reg); | ||
| 86 | mdelay(10); | ||
| 87 | temp &= ~PORT_RESET; | ||
| 88 | ehci_writel(ehci, temp, portsc_reg); | ||
| 89 | mdelay(1); | ||
| 90 | tries = 100; | ||
| 91 | do { | ||
| 92 | mdelay(1); | ||
| 93 | /* | ||
| 94 | * Up to this point, Port Enable bit is | ||
| 95 | * expected to be set after 2 ms waiting. | ||
| 96 | * USB1 usually takes extra 45 ms, for safety, | ||
| 97 | * we take 100 ms as timeout. | ||
| 98 | */ | ||
| 99 | temp = ehci_readl(ehci, portsc_reg); | ||
| 100 | } while (!(temp & PORT_PE) && tries--); | ||
| 101 | if (temp & PORT_PE) | ||
| 102 | break; | ||
| 103 | } | ||
| 104 | if (i == 2) | ||
| 105 | retval = -ETIMEDOUT; | ||
| 106 | |||
| 107 | /* | ||
| 108 | * Clear Connect Status Change bit if it's set. | ||
| 109 | * We can't clear PORT_PEC. It will also cause PORT_PE to be cleared. | ||
| 110 | */ | ||
| 111 | if (temp & PORT_CSC) | ||
| 112 | ehci_writel(ehci, PORT_CSC, portsc_reg); | ||
| 113 | |||
| 114 | /* | ||
| 115 | * Write to clear any interrupt status bits that might be set | ||
| 116 | * during port reset. | ||
| 117 | */ | ||
| 118 | temp = ehci_readl(ehci, &ehci->regs->status); | ||
| 119 | ehci_writel(ehci, temp, &ehci->regs->status); | ||
| 120 | |||
| 121 | /* restore original interrupt enable bits */ | ||
| 122 | ehci_writel(ehci, saved_usbintr, &ehci->regs->intr_enable); | ||
| 123 | return retval; | ||
| 124 | } | ||
| 125 | |||
| 61 | static int tegra_ehci_hub_control( | 126 | static int tegra_ehci_hub_control( |
| 62 | struct usb_hcd *hcd, | 127 | struct usb_hcd *hcd, |
| 63 | u16 typeReq, | 128 | u16 typeReq, |
| @@ -121,6 +186,13 @@ static int tegra_ehci_hub_control( | |||
| 121 | goto done; | 186 | goto done; |
| 122 | } | 187 | } |
| 123 | 188 | ||
| 189 | /* For USB1 port we need to issue Port Reset twice internally */ | ||
| 190 | if (tegra->phy->instance == 0 && | ||
| 191 | (typeReq == SetPortFeature && wValue == USB_PORT_FEAT_RESET)) { | ||
| 192 | spin_unlock_irqrestore(&ehci->lock, flags); | ||
| 193 | return tegra_ehci_internal_port_reset(ehci, status_reg); | ||
| 194 | } | ||
| 195 | |||
| 124 | /* | 196 | /* |
| 125 | * Tegra host controller will time the resume operation to clear the bit | 197 | * Tegra host controller will time the resume operation to clear the bit |
| 126 | * when the port control state switches to HS or FS Idle. This behavior | 198 | * when the port control state switches to HS or FS Idle. This behavior |
| @@ -328,7 +400,7 @@ static int tegra_ehci_setup(struct usb_hcd *hcd) | |||
| 328 | /* EHCI registers start at offset 0x100 */ | 400 | /* EHCI registers start at offset 0x100 */ |
| 329 | ehci->caps = hcd->regs + 0x100; | 401 | ehci->caps = hcd->regs + 0x100; |
| 330 | ehci->regs = hcd->regs + 0x100 + | 402 | ehci->regs = hcd->regs + 0x100 + |
| 331 | HC_LENGTH(readl(&ehci->caps->hc_capbase)); | 403 | HC_LENGTH(ehci, readl(&ehci->caps->hc_capbase)); |
| 332 | 404 | ||
| 333 | dbg_hcs_params(ehci, "reset"); | 405 | dbg_hcs_params(ehci, "reset"); |
| 334 | dbg_hcc_params(ehci, "reset"); | 406 | dbg_hcc_params(ehci, "reset"); |
diff --git a/drivers/usb/host/ehci-vt8500.c b/drivers/usb/host/ehci-vt8500.c index 20168062035..47d749631bc 100644 --- a/drivers/usb/host/ehci-vt8500.c +++ b/drivers/usb/host/ehci-vt8500.c | |||
| @@ -121,7 +121,8 @@ static int vt8500_ehci_drv_probe(struct platform_device *pdev) | |||
| 121 | 121 | ||
| 122 | ehci = hcd_to_ehci(hcd); | 122 | ehci = hcd_to_ehci(hcd); |
| 123 | ehci->caps = hcd->regs; | 123 | ehci->caps = hcd->regs; |
| 124 | ehci->regs = hcd->regs + HC_LENGTH(readl(&ehci->caps->hc_capbase)); | 124 | ehci->regs = hcd->regs + |
| 125 | HC_LENGTH(ehci, readl(&ehci->caps->hc_capbase)); | ||
| 125 | 126 | ||
| 126 | dbg_hcs_params(ehci, "reset"); | 127 | dbg_hcs_params(ehci, "reset"); |
| 127 | dbg_hcc_params(ehci, "reset"); | 128 | dbg_hcc_params(ehci, "reset"); |
diff --git a/drivers/usb/host/ehci-w90x900.c b/drivers/usb/host/ehci-w90x900.c index 6bc35809a5c..52a027aaa37 100644 --- a/drivers/usb/host/ehci-w90x900.c +++ b/drivers/usb/host/ehci-w90x900.c | |||
| @@ -57,7 +57,7 @@ static int __devinit usb_w90x900_probe(const struct hc_driver *driver, | |||
| 57 | ehci = hcd_to_ehci(hcd); | 57 | ehci = hcd_to_ehci(hcd); |
| 58 | ehci->caps = hcd->regs; | 58 | ehci->caps = hcd->regs; |
| 59 | ehci->regs = hcd->regs + | 59 | ehci->regs = hcd->regs + |
| 60 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 60 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
| 61 | 61 | ||
| 62 | /* enable PHY 0,1,the regs only apply to w90p910 | 62 | /* enable PHY 0,1,the regs only apply to w90p910 |
| 63 | * 0xA4,0xA8 were offsets of PHY0 and PHY1 controller of | 63 | * 0xA4,0xA8 were offsets of PHY0 and PHY1 controller of |
diff --git a/drivers/usb/host/ehci-xilinx-of.c b/drivers/usb/host/ehci-xilinx-of.c index effc58d7af8..a64d6d66d76 100644 --- a/drivers/usb/host/ehci-xilinx-of.c +++ b/drivers/usb/host/ehci-xilinx-of.c | |||
| @@ -220,7 +220,7 @@ static int __devinit ehci_hcd_xilinx_of_probe(struct platform_device *op) | |||
| 220 | */ | 220 | */ |
| 221 | ehci->caps = hcd->regs + 0x100; | 221 | ehci->caps = hcd->regs + 0x100; |
| 222 | ehci->regs = hcd->regs + 0x100 + | 222 | ehci->regs = hcd->regs + 0x100 + |
| 223 | HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 223 | HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); |
| 224 | 224 | ||
| 225 | /* cache this readonly data; minimize chip reads */ | 225 | /* cache this readonly data; minimize chip reads */ |
| 226 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); | 226 | ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); |
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index 333ddc15691..bd6ff489baf 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
| @@ -118,6 +118,7 @@ struct ehci_hcd { /* one per controller */ | |||
| 118 | struct timer_list watchdog; | 118 | struct timer_list watchdog; |
| 119 | unsigned long actions; | 119 | unsigned long actions; |
| 120 | unsigned stamp; | 120 | unsigned stamp; |
| 121 | unsigned periodic_stamp; | ||
| 121 | unsigned random_frame; | 122 | unsigned random_frame; |
| 122 | unsigned long next_statechange; | 123 | unsigned long next_statechange; |
| 123 | ktime_t last_periodic_enable; | 124 | ktime_t last_periodic_enable; |
| @@ -128,12 +129,14 @@ struct ehci_hcd { /* one per controller */ | |||
| 128 | unsigned has_fsl_port_bug:1; /* FreeScale */ | 129 | unsigned has_fsl_port_bug:1; /* FreeScale */ |
| 129 | unsigned big_endian_mmio:1; | 130 | unsigned big_endian_mmio:1; |
| 130 | unsigned big_endian_desc:1; | 131 | unsigned big_endian_desc:1; |
| 132 | unsigned big_endian_capbase:1; | ||
| 131 | unsigned has_amcc_usb23:1; | 133 | unsigned has_amcc_usb23:1; |
| 132 | unsigned need_io_watchdog:1; | 134 | unsigned need_io_watchdog:1; |
| 133 | unsigned broken_periodic:1; | 135 | unsigned broken_periodic:1; |
| 134 | unsigned amd_pll_fix:1; | 136 | unsigned amd_pll_fix:1; |
| 135 | unsigned fs_i_thresh:1; /* Intel iso scheduling */ | 137 | unsigned fs_i_thresh:1; /* Intel iso scheduling */ |
| 136 | unsigned use_dummy_qh:1; /* AMD Frame List table quirk*/ | 138 | unsigned use_dummy_qh:1; /* AMD Frame List table quirk*/ |
| 139 | unsigned has_synopsys_hc_bug:1; /* Synopsys HC */ | ||
| 137 | 140 | ||
| 138 | /* required for usb32 quirk */ | 141 | /* required for usb32 quirk */ |
| 139 | #define OHCI_CTRL_HCFS (3 << 6) | 142 | #define OHCI_CTRL_HCFS (3 << 6) |
| @@ -160,6 +163,10 @@ struct ehci_hcd { /* one per controller */ | |||
| 160 | #ifdef DEBUG | 163 | #ifdef DEBUG |
| 161 | struct dentry *debug_dir; | 164 | struct dentry *debug_dir; |
| 162 | #endif | 165 | #endif |
| 166 | /* | ||
| 167 | * OTG controllers and transceivers need software interaction | ||
| 168 | */ | ||
| 169 | struct otg_transceiver *transceiver; | ||
| 163 | }; | 170 | }; |
| 164 | 171 | ||
| 165 | /* convert between an HCD pointer and the corresponding EHCI_HCD */ | 172 | /* convert between an HCD pointer and the corresponding EHCI_HCD */ |
| @@ -600,12 +607,18 @@ ehci_port_speed(struct ehci_hcd *ehci, unsigned int portsc) | |||
| 600 | * This attempts to support either format at compile time without a | 607 | * This attempts to support either format at compile time without a |
| 601 | * runtime penalty, or both formats with the additional overhead | 608 | * runtime penalty, or both formats with the additional overhead |
| 602 | * of checking a flag bit. | 609 | * of checking a flag bit. |
| 610 | * | ||
| 611 | * ehci_big_endian_capbase is a special quirk for controllers that | ||
| 612 | * implement the HC capability registers as separate registers and not | ||
| 613 | * as fields of a 32-bit register. | ||
| 603 | */ | 614 | */ |
| 604 | 615 | ||
| 605 | #ifdef CONFIG_USB_EHCI_BIG_ENDIAN_MMIO | 616 | #ifdef CONFIG_USB_EHCI_BIG_ENDIAN_MMIO |
| 606 | #define ehci_big_endian_mmio(e) ((e)->big_endian_mmio) | 617 | #define ehci_big_endian_mmio(e) ((e)->big_endian_mmio) |
| 618 | #define ehci_big_endian_capbase(e) ((e)->big_endian_capbase) | ||
| 607 | #else | 619 | #else |
| 608 | #define ehci_big_endian_mmio(e) 0 | 620 | #define ehci_big_endian_mmio(e) 0 |
| 621 | #define ehci_big_endian_capbase(e) 0 | ||
| 609 | #endif | 622 | #endif |
| 610 | 623 | ||
| 611 | /* | 624 | /* |
diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c index c0e22f26da1..baae4ccd16a 100644 --- a/drivers/usb/host/isp116x-hcd.c +++ b/drivers/usb/host/isp116x-hcd.c | |||
| @@ -612,6 +612,7 @@ static irqreturn_t isp116x_irq(struct usb_hcd *hcd) | |||
| 612 | /* IRQ's are off, we do no DMA, | 612 | /* IRQ's are off, we do no DMA, |
| 613 | perfectly ready to die ... */ | 613 | perfectly ready to die ... */ |
| 614 | hcd->state = HC_STATE_HALT; | 614 | hcd->state = HC_STATE_HALT; |
| 615 | usb_hc_died(hcd); | ||
| 615 | ret = IRQ_HANDLED; | 616 | ret = IRQ_HANDLED; |
| 616 | goto done; | 617 | goto done; |
| 617 | } | 618 | } |
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index 7b2e69aa2e9..c9e6e454c62 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c | |||
| @@ -8,6 +8,8 @@ | |||
| 8 | * | 8 | * |
| 9 | * (c) 2007 Sebastian Siewior <bigeasy@linutronix.de> | 9 | * (c) 2007 Sebastian Siewior <bigeasy@linutronix.de> |
| 10 | * | 10 | * |
| 11 | * (c) 2011 Arvid Brodin <arvid.brodin@enea.com> | ||
| 12 | * | ||
| 11 | */ | 13 | */ |
| 12 | #include <linux/module.h> | 14 | #include <linux/module.h> |
| 13 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
| @@ -26,14 +28,18 @@ | |||
| 26 | 28 | ||
| 27 | static struct kmem_cache *qtd_cachep; | 29 | static struct kmem_cache *qtd_cachep; |
| 28 | static struct kmem_cache *qh_cachep; | 30 | static struct kmem_cache *qh_cachep; |
| 31 | static struct kmem_cache *urb_listitem_cachep; | ||
| 29 | 32 | ||
| 30 | struct isp1760_hcd { | 33 | struct isp1760_hcd { |
| 31 | u32 hcs_params; | 34 | u32 hcs_params; |
| 32 | spinlock_t lock; | 35 | spinlock_t lock; |
| 33 | struct inter_packet_info atl_ints[32]; | 36 | struct slotinfo atl_slots[32]; |
| 34 | struct inter_packet_info int_ints[32]; | 37 | int atl_done_map; |
| 38 | struct slotinfo int_slots[32]; | ||
| 39 | int int_done_map; | ||
| 35 | struct memory_chunk memory_pool[BLOCKS]; | 40 | struct memory_chunk memory_pool[BLOCKS]; |
| 36 | u32 atl_queued; | 41 | struct list_head controlqhs, bulkqhs, interruptqhs; |
| 42 | int active_ptds; | ||
| 37 | 43 | ||
| 38 | /* periodic schedule support */ | 44 | /* periodic schedule support */ |
| 39 | #define DEFAULT_I_TDPS 1024 | 45 | #define DEFAULT_I_TDPS 1024 |
| @@ -85,18 +91,34 @@ struct isp1760_qtd { | |||
| 85 | struct list_head qtd_list; | 91 | struct list_head qtd_list; |
| 86 | struct urb *urb; | 92 | struct urb *urb; |
| 87 | size_t length; | 93 | size_t length; |
| 88 | 94 | size_t actual_length; | |
| 89 | /* isp special*/ | 95 | |
| 96 | /* QTD_ENQUEUED: waiting for transfer (inactive) */ | ||
| 97 | /* QTD_PAYLOAD_ALLOC: chip mem has been allocated for payload */ | ||
| 98 | /* QTD_XFER_STARTED: valid ptd has been written to isp176x - only | ||
| 99 | interrupt handler may touch this qtd! */ | ||
| 100 | /* QTD_XFER_COMPLETE: payload has been transferred successfully */ | ||
| 101 | /* QTD_RETIRE: transfer error/abort qtd */ | ||
| 102 | #define QTD_ENQUEUED 0 | ||
| 103 | #define QTD_PAYLOAD_ALLOC 1 | ||
| 104 | #define QTD_XFER_STARTED 2 | ||
| 105 | #define QTD_XFER_COMPLETE 3 | ||
| 106 | #define QTD_RETIRE 4 | ||
| 90 | u32 status; | 107 | u32 status; |
| 91 | #define URB_ENQUEUED (1 << 1) | ||
| 92 | }; | 108 | }; |
| 93 | 109 | ||
| 110 | /* Queue head, one for each active endpoint */ | ||
| 94 | struct isp1760_qh { | 111 | struct isp1760_qh { |
| 95 | /* first part defined by EHCI spec */ | 112 | struct list_head qh_list; |
| 96 | struct list_head qtd_list; | 113 | struct list_head qtd_list; |
| 97 | |||
| 98 | u32 toggle; | 114 | u32 toggle; |
| 99 | u32 ping; | 115 | u32 ping; |
| 116 | int slot; | ||
| 117 | }; | ||
| 118 | |||
| 119 | struct urb_listitem { | ||
| 120 | struct list_head urb_list; | ||
| 121 | struct urb *urb; | ||
| 100 | }; | 122 | }; |
| 101 | 123 | ||
| 102 | /* | 124 | /* |
| @@ -272,7 +294,7 @@ static void init_memory(struct isp1760_hcd *priv) | |||
| 272 | payload_addr += priv->memory_pool[curr + i].size; | 294 | payload_addr += priv->memory_pool[curr + i].size; |
| 273 | } | 295 | } |
| 274 | 296 | ||
| 275 | BUG_ON(payload_addr - priv->memory_pool[0].start > PAYLOAD_AREA_SIZE); | 297 | WARN_ON(payload_addr - priv->memory_pool[0].start > PAYLOAD_AREA_SIZE); |
| 276 | } | 298 | } |
| 277 | 299 | ||
| 278 | static void alloc_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) | 300 | static void alloc_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) |
| @@ -280,7 +302,7 @@ static void alloc_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) | |||
| 280 | struct isp1760_hcd *priv = hcd_to_priv(hcd); | 302 | struct isp1760_hcd *priv = hcd_to_priv(hcd); |
| 281 | int i; | 303 | int i; |
| 282 | 304 | ||
| 283 | BUG_ON(qtd->payload_addr); | 305 | WARN_ON(qtd->payload_addr); |
| 284 | 306 | ||
| 285 | if (!qtd->length) | 307 | if (!qtd->length) |
| 286 | return; | 308 | return; |
| @@ -293,19 +315,6 @@ static void alloc_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) | |||
| 293 | return; | 315 | return; |
| 294 | } | 316 | } |
| 295 | } | 317 | } |
| 296 | |||
| 297 | dev_err(hcd->self.controller, | ||
| 298 | "%s: Cannot allocate %zu bytes of memory\n" | ||
| 299 | "Current memory map:\n", | ||
| 300 | __func__, qtd->length); | ||
| 301 | for (i = 0; i < BLOCKS; i++) { | ||
| 302 | dev_err(hcd->self.controller, "Pool %2d size %4d status: %d\n", | ||
| 303 | i, priv->memory_pool[i].size, | ||
| 304 | priv->memory_pool[i].free); | ||
| 305 | } | ||
| 306 | /* XXX maybe -ENOMEM could be possible */ | ||
| 307 | BUG(); | ||
| 308 | return; | ||
| 309 | } | 318 | } |
| 310 | 319 | ||
| 311 | static void free_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) | 320 | static void free_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) |
| @@ -318,7 +327,7 @@ static void free_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) | |||
| 318 | 327 | ||
| 319 | for (i = 0; i < BLOCKS; i++) { | 328 | for (i = 0; i < BLOCKS; i++) { |
| 320 | if (priv->memory_pool[i].start == qtd->payload_addr) { | 329 | if (priv->memory_pool[i].start == qtd->payload_addr) { |
| 321 | BUG_ON(priv->memory_pool[i].free); | 330 | WARN_ON(priv->memory_pool[i].free); |
| 322 | priv->memory_pool[i].free = 1; | 331 | priv->memory_pool[i].free = 1; |
| 323 | qtd->payload_addr = 0; | 332 | qtd->payload_addr = 0; |
| 324 | return; | 333 | return; |
| @@ -327,19 +336,8 @@ static void free_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd) | |||
| 327 | 336 | ||
| 328 | dev_err(hcd->self.controller, "%s: Invalid pointer: %08x\n", | 337 | dev_err(hcd->self.controller, "%s: Invalid pointer: %08x\n", |
| 329 | __func__, qtd->payload_addr); | 338 | __func__, qtd->payload_addr); |
| 330 | BUG(); | 339 | WARN_ON(1); |
| 331 | } | 340 | qtd->payload_addr = 0; |
| 332 | |||
| 333 | static void isp1760_init_regs(struct usb_hcd *hcd) | ||
| 334 | { | ||
| 335 | reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, 0); | ||
| 336 | reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); | ||
| 337 | reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); | ||
| 338 | reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); | ||
| 339 | |||
| 340 | reg_write32(hcd->regs, HC_ATL_PTD_DONEMAP_REG, ~NO_TRANSFER_ACTIVE); | ||
| 341 | reg_write32(hcd->regs, HC_INT_PTD_DONEMAP_REG, ~NO_TRANSFER_ACTIVE); | ||
| 342 | reg_write32(hcd->regs, HC_ISO_PTD_DONEMAP_REG, ~NO_TRANSFER_ACTIVE); | ||
| 343 | } | 341 | } |
| 344 | 342 | ||
| 345 | static int handshake(struct usb_hcd *hcd, u32 reg, | 343 | static int handshake(struct usb_hcd *hcd, u32 reg, |
| @@ -377,31 +375,27 @@ static int ehci_reset(struct usb_hcd *hcd) | |||
| 377 | return retval; | 375 | return retval; |
| 378 | } | 376 | } |
| 379 | 377 | ||
| 380 | static void qh_destroy(struct isp1760_qh *qh) | 378 | static struct isp1760_qh *qh_alloc(gfp_t flags) |
| 381 | { | ||
| 382 | BUG_ON(!list_empty(&qh->qtd_list)); | ||
| 383 | kmem_cache_free(qh_cachep, qh); | ||
| 384 | } | ||
| 385 | |||
| 386 | static struct isp1760_qh *isp1760_qh_alloc(gfp_t flags) | ||
| 387 | { | 379 | { |
| 388 | struct isp1760_qh *qh; | 380 | struct isp1760_qh *qh; |
| 389 | 381 | ||
| 390 | qh = kmem_cache_zalloc(qh_cachep, flags); | 382 | qh = kmem_cache_zalloc(qh_cachep, flags); |
| 391 | if (!qh) | 383 | if (!qh) |
| 392 | return qh; | 384 | return NULL; |
| 393 | 385 | ||
| 386 | INIT_LIST_HEAD(&qh->qh_list); | ||
| 394 | INIT_LIST_HEAD(&qh->qtd_list); | 387 | INIT_LIST_HEAD(&qh->qtd_list); |
| 388 | qh->slot = -1; | ||
| 389 | |||
| 395 | return qh; | 390 | return qh; |
| 396 | } | 391 | } |
| 397 | 392 | ||
| 398 | /* magic numbers that can affect system performance */ | 393 | static void qh_free(struct isp1760_qh *qh) |
| 399 | #define EHCI_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */ | 394 | { |
| 400 | #define EHCI_TUNE_RL_HS 4 /* nak throttle; see 4.9 */ | 395 | WARN_ON(!list_empty(&qh->qtd_list)); |
| 401 | #define EHCI_TUNE_RL_TT 0 | 396 | WARN_ON(qh->slot > -1); |
| 402 | #define EHCI_TUNE_MULT_HS 1 /* 1-3 transactions/uframe; 4.10.3 */ | 397 | kmem_cache_free(qh_cachep, qh); |
| 403 | #define EHCI_TUNE_MULT_TT 1 | 398 | } |
| 404 | #define EHCI_TUNE_FLS 2 /* (small) 256 frame schedule */ | ||
| 405 | 399 | ||
| 406 | /* one-time init, only for memory state */ | 400 | /* one-time init, only for memory state */ |
| 407 | static int priv_init(struct usb_hcd *hcd) | 401 | static int priv_init(struct usb_hcd *hcd) |
| @@ -411,6 +405,10 @@ static int priv_init(struct usb_hcd *hcd) | |||
| 411 | 405 | ||
| 412 | spin_lock_init(&priv->lock); | 406 | spin_lock_init(&priv->lock); |
| 413 | 407 | ||
| 408 | INIT_LIST_HEAD(&priv->interruptqhs); | ||
| 409 | INIT_LIST_HEAD(&priv->controlqhs); | ||
| 410 | INIT_LIST_HEAD(&priv->bulkqhs); | ||
| 411 | |||
| 414 | /* | 412 | /* |
| 415 | * hw default: 1K periodic list heads, one per frame. | 413 | * hw default: 1K periodic list heads, one per frame. |
| 416 | * periodic_size can shrink by USBCMD update if hcc_params allows. | 414 | * periodic_size can shrink by USBCMD update if hcc_params allows. |
| @@ -468,7 +466,10 @@ static int isp1760_hc_setup(struct usb_hcd *hcd) | |||
| 468 | } | 466 | } |
| 469 | 467 | ||
| 470 | /* pre reset */ | 468 | /* pre reset */ |
| 471 | isp1760_init_regs(hcd); | 469 | reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, 0); |
| 470 | reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); | ||
| 471 | reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); | ||
| 472 | reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE); | ||
| 472 | 473 | ||
| 473 | /* reset */ | 474 | /* reset */ |
| 474 | reg_write32(hcd->regs, HC_RESET_REG, SW_RESET_RESET_ALL); | 475 | reg_write32(hcd->regs, HC_RESET_REG, SW_RESET_RESET_ALL); |
| @@ -488,12 +489,15 @@ static int isp1760_hc_setup(struct usb_hcd *hcd) | |||
| 488 | 16 : 32, (priv->devflags & ISP1760_FLAG_ANALOG_OC) ? | 489 | 16 : 32, (priv->devflags & ISP1760_FLAG_ANALOG_OC) ? |
| 489 | "analog" : "digital"); | 490 | "analog" : "digital"); |
| 490 | 491 | ||
| 492 | /* This is weird: at the first plug-in of a device there seems to be | ||
| 493 | one packet queued that never gets returned? */ | ||
| 494 | priv->active_ptds = -1; | ||
| 495 | |||
| 491 | /* ATL reset */ | 496 | /* ATL reset */ |
| 492 | reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode | ALL_ATX_RESET); | 497 | reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode | ALL_ATX_RESET); |
| 493 | mdelay(10); | 498 | mdelay(10); |
| 494 | reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode); | 499 | reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode); |
| 495 | 500 | ||
| 496 | reg_write32(hcd->regs, HC_INTERRUPT_REG, INTERRUPT_ENABLE_MASK); | ||
| 497 | reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, INTERRUPT_ENABLE_MASK); | 501 | reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, INTERRUPT_ENABLE_MASK); |
| 498 | 502 | ||
| 499 | /* | 503 | /* |
| @@ -516,14 +520,21 @@ static void isp1760_init_maps(struct usb_hcd *hcd) | |||
| 516 | reg_write32(hcd->regs, HC_ATL_PTD_LASTPTD_REG, 0x80000000); | 520 | reg_write32(hcd->regs, HC_ATL_PTD_LASTPTD_REG, 0x80000000); |
| 517 | reg_write32(hcd->regs, HC_INT_PTD_LASTPTD_REG, 0x80000000); | 521 | reg_write32(hcd->regs, HC_INT_PTD_LASTPTD_REG, 0x80000000); |
| 518 | reg_write32(hcd->regs, HC_ISO_PTD_LASTPTD_REG, 0x00000001); | 522 | reg_write32(hcd->regs, HC_ISO_PTD_LASTPTD_REG, 0x00000001); |
| 523 | |||
| 524 | reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, 0xffffffff); | ||
| 525 | reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, 0xffffffff); | ||
| 526 | reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, 0xffffffff); | ||
| 527 | |||
| 528 | reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, | ||
| 529 | ATL_BUF_FILL | INT_BUF_FILL); | ||
| 519 | } | 530 | } |
| 520 | 531 | ||
| 521 | static void isp1760_enable_interrupts(struct usb_hcd *hcd) | 532 | static void isp1760_enable_interrupts(struct usb_hcd *hcd) |
| 522 | { | 533 | { |
| 523 | reg_write32(hcd->regs, HC_ATL_IRQ_MASK_AND_REG, 0); | 534 | reg_write32(hcd->regs, HC_ATL_IRQ_MASK_AND_REG, 0); |
| 524 | reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, 0); | 535 | reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, 0xffffffff); |
| 525 | reg_write32(hcd->regs, HC_INT_IRQ_MASK_AND_REG, 0); | 536 | reg_write32(hcd->regs, HC_INT_IRQ_MASK_AND_REG, 0); |
| 526 | reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, 0); | 537 | reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, 0xffffffff); |
| 527 | reg_write32(hcd->regs, HC_ISO_IRQ_MASK_AND_REG, 0); | 538 | reg_write32(hcd->regs, HC_ISO_IRQ_MASK_AND_REG, 0); |
| 528 | reg_write32(hcd->regs, HC_ISO_IRQ_MASK_OR_REG, 0xffffffff); | 539 | reg_write32(hcd->regs, HC_ISO_IRQ_MASK_OR_REG, 0xffffffff); |
| 529 | /* step 23 passed */ | 540 | /* step 23 passed */ |
| @@ -548,8 +559,7 @@ static int isp1760_run(struct usb_hcd *hcd) | |||
| 548 | command |= CMD_RUN; | 559 | command |= CMD_RUN; |
| 549 | reg_write32(hcd->regs, HC_USBCMD, command); | 560 | reg_write32(hcd->regs, HC_USBCMD, command); |
| 550 | 561 | ||
| 551 | retval = handshake(hcd, HC_USBCMD, CMD_RUN, CMD_RUN, | 562 | retval = handshake(hcd, HC_USBCMD, CMD_RUN, CMD_RUN, 250 * 1000); |
| 552 | 250 * 1000); | ||
| 553 | if (retval) | 563 | if (retval) |
| 554 | return retval; | 564 | return retval; |
| 555 | 565 | ||
| @@ -598,12 +608,19 @@ static int last_qtd_of_urb(struct isp1760_qtd *qtd, struct isp1760_qh *qh) | |||
| 598 | return (qtd->urb != urb); | 608 | return (qtd->urb != urb); |
| 599 | } | 609 | } |
| 600 | 610 | ||
| 601 | static void transform_into_atl(struct isp1760_qh *qh, | 611 | /* magic numbers that can affect system performance */ |
| 612 | #define EHCI_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */ | ||
| 613 | #define EHCI_TUNE_RL_HS 4 /* nak throttle; see 4.9 */ | ||
| 614 | #define EHCI_TUNE_RL_TT 0 | ||
| 615 | #define EHCI_TUNE_MULT_HS 1 /* 1-3 transactions/uframe; 4.10.3 */ | ||
| 616 | #define EHCI_TUNE_MULT_TT 1 | ||
| 617 | #define EHCI_TUNE_FLS 2 /* (small) 256 frame schedule */ | ||
| 618 | |||
| 619 | static void create_ptd_atl(struct isp1760_qh *qh, | ||
| 602 | struct isp1760_qtd *qtd, struct ptd *ptd) | 620 | struct isp1760_qtd *qtd, struct ptd *ptd) |
| 603 | { | 621 | { |
| 604 | u32 maxpacket; | 622 | u32 maxpacket; |
| 605 | u32 multi; | 623 | u32 multi; |
| 606 | u32 pid_code; | ||
| 607 | u32 rl = RL_COUNTER; | 624 | u32 rl = RL_COUNTER; |
| 608 | u32 nak = NAK_COUNTER; | 625 | u32 nak = NAK_COUNTER; |
| 609 | 626 | ||
| @@ -616,67 +633,62 @@ static void transform_into_atl(struct isp1760_qh *qh, | |||
| 616 | maxpacket &= 0x7ff; | 633 | maxpacket &= 0x7ff; |
| 617 | 634 | ||
| 618 | /* DW0 */ | 635 | /* DW0 */ |
| 619 | ptd->dw0 = PTD_VALID; | 636 | ptd->dw0 = DW0_VALID_BIT; |
| 620 | ptd->dw0 |= PTD_LENGTH(qtd->length); | 637 | ptd->dw0 |= TO_DW0_LENGTH(qtd->length); |
| 621 | ptd->dw0 |= PTD_MAXPACKET(maxpacket); | 638 | ptd->dw0 |= TO_DW0_MAXPACKET(maxpacket); |
| 622 | ptd->dw0 |= PTD_ENDPOINT(usb_pipeendpoint(qtd->urb->pipe)); | 639 | ptd->dw0 |= TO_DW0_ENDPOINT(usb_pipeendpoint(qtd->urb->pipe)); |
| 623 | 640 | ||
| 624 | /* DW1 */ | 641 | /* DW1 */ |
| 625 | ptd->dw1 = usb_pipeendpoint(qtd->urb->pipe) >> 1; | 642 | ptd->dw1 = usb_pipeendpoint(qtd->urb->pipe) >> 1; |
| 626 | ptd->dw1 |= PTD_DEVICE_ADDR(usb_pipedevice(qtd->urb->pipe)); | 643 | ptd->dw1 |= TO_DW1_DEVICE_ADDR(usb_pipedevice(qtd->urb->pipe)); |
| 627 | 644 | ptd->dw1 |= TO_DW1_PID_TOKEN(qtd->packet_type); | |
| 628 | pid_code = qtd->packet_type; | ||
| 629 | ptd->dw1 |= PTD_PID_TOKEN(pid_code); | ||
| 630 | 645 | ||
| 631 | if (usb_pipebulk(qtd->urb->pipe)) | 646 | if (usb_pipebulk(qtd->urb->pipe)) |
| 632 | ptd->dw1 |= PTD_TRANS_BULK; | 647 | ptd->dw1 |= DW1_TRANS_BULK; |
| 633 | else if (usb_pipeint(qtd->urb->pipe)) | 648 | else if (usb_pipeint(qtd->urb->pipe)) |
| 634 | ptd->dw1 |= PTD_TRANS_INT; | 649 | ptd->dw1 |= DW1_TRANS_INT; |
| 635 | 650 | ||
| 636 | if (qtd->urb->dev->speed != USB_SPEED_HIGH) { | 651 | if (qtd->urb->dev->speed != USB_SPEED_HIGH) { |
| 637 | /* split transaction */ | 652 | /* split transaction */ |
| 638 | 653 | ||
| 639 | ptd->dw1 |= PTD_TRANS_SPLIT; | 654 | ptd->dw1 |= DW1_TRANS_SPLIT; |
| 640 | if (qtd->urb->dev->speed == USB_SPEED_LOW) | 655 | if (qtd->urb->dev->speed == USB_SPEED_LOW) |
| 641 | ptd->dw1 |= PTD_SE_USB_LOSPEED; | 656 | ptd->dw1 |= DW1_SE_USB_LOSPEED; |
| 642 | 657 | ||
| 643 | ptd->dw1 |= PTD_PORT_NUM(qtd->urb->dev->ttport); | 658 | ptd->dw1 |= TO_DW1_PORT_NUM(qtd->urb->dev->ttport); |
| 644 | ptd->dw1 |= PTD_HUB_NUM(qtd->urb->dev->tt->hub->devnum); | 659 | ptd->dw1 |= TO_DW1_HUB_NUM(qtd->urb->dev->tt->hub->devnum); |
| 645 | 660 | ||
| 646 | /* SE bit for Split INT transfers */ | 661 | /* SE bit for Split INT transfers */ |
| 647 | if (usb_pipeint(qtd->urb->pipe) && | 662 | if (usb_pipeint(qtd->urb->pipe) && |
| 648 | (qtd->urb->dev->speed == USB_SPEED_LOW)) | 663 | (qtd->urb->dev->speed == USB_SPEED_LOW)) |
| 649 | ptd->dw1 |= 2 << 16; | 664 | ptd->dw1 |= 2 << 16; |
| 650 | 665 | ||
| 651 | ptd->dw3 = 0; | ||
| 652 | rl = 0; | 666 | rl = 0; |
| 653 | nak = 0; | 667 | nak = 0; |
| 654 | } else { | 668 | } else { |
| 655 | ptd->dw0 |= PTD_MULTI(multi); | 669 | ptd->dw0 |= TO_DW0_MULTI(multi); |
| 656 | if (usb_pipecontrol(qtd->urb->pipe) || | 670 | if (usb_pipecontrol(qtd->urb->pipe) || |
| 657 | usb_pipebulk(qtd->urb->pipe)) | 671 | usb_pipebulk(qtd->urb->pipe)) |
| 658 | ptd->dw3 = qh->ping; | 672 | ptd->dw3 |= TO_DW3_PING(qh->ping); |
| 659 | else | ||
| 660 | ptd->dw3 = 0; | ||
| 661 | } | 673 | } |
| 662 | /* DW2 */ | 674 | /* DW2 */ |
| 663 | ptd->dw2 = 0; | 675 | ptd->dw2 = 0; |
| 664 | ptd->dw2 |= PTD_DATA_START_ADDR(base_to_chip(qtd->payload_addr)); | 676 | ptd->dw2 |= TO_DW2_DATA_START_ADDR(base_to_chip(qtd->payload_addr)); |
| 665 | ptd->dw2 |= PTD_RL_CNT(rl); | 677 | ptd->dw2 |= TO_DW2_RL(rl); |
| 666 | ptd->dw3 |= PTD_NAC_CNT(nak); | ||
| 667 | 678 | ||
| 668 | /* DW3 */ | 679 | /* DW3 */ |
| 669 | ptd->dw3 |= qh->toggle; | 680 | ptd->dw3 |= TO_DW3_NAKCOUNT(nak); |
| 681 | ptd->dw3 |= TO_DW3_DATA_TOGGLE(qh->toggle); | ||
| 670 | if (usb_pipecontrol(qtd->urb->pipe)) { | 682 | if (usb_pipecontrol(qtd->urb->pipe)) { |
| 671 | if (qtd->data_buffer == qtd->urb->setup_packet) | 683 | if (qtd->data_buffer == qtd->urb->setup_packet) |
| 672 | ptd->dw3 &= ~PTD_DATA_TOGGLE(1); | 684 | ptd->dw3 &= ~TO_DW3_DATA_TOGGLE(1); |
| 673 | else if (last_qtd_of_urb(qtd, qh)) | 685 | else if (last_qtd_of_urb(qtd, qh)) |
| 674 | ptd->dw3 |= PTD_DATA_TOGGLE(1); | 686 | ptd->dw3 |= TO_DW3_DATA_TOGGLE(1); |
| 675 | } | 687 | } |
| 676 | 688 | ||
| 677 | ptd->dw3 |= PTD_ACTIVE; | 689 | ptd->dw3 |= DW3_ACTIVE_BIT; |
| 678 | /* Cerr */ | 690 | /* Cerr */ |
| 679 | ptd->dw3 |= PTD_CERR(ERR_COUNTER); | 691 | ptd->dw3 |= TO_DW3_CERR(ERR_COUNTER); |
| 680 | } | 692 | } |
| 681 | 693 | ||
| 682 | static void transform_add_int(struct isp1760_qh *qh, | 694 | static void transform_add_int(struct isp1760_qh *qh, |
| @@ -731,197 +743,13 @@ static void transform_add_int(struct isp1760_qh *qh, | |||
| 731 | ptd->dw4 = usof; | 743 | ptd->dw4 = usof; |
| 732 | } | 744 | } |
| 733 | 745 | ||
| 734 | static void transform_into_int(struct isp1760_qh *qh, | 746 | static void create_ptd_int(struct isp1760_qh *qh, |
| 735 | struct isp1760_qtd *qtd, struct ptd *ptd) | 747 | struct isp1760_qtd *qtd, struct ptd *ptd) |
| 736 | { | 748 | { |
| 737 | transform_into_atl(qh, qtd, ptd); | 749 | create_ptd_atl(qh, qtd, ptd); |
| 738 | transform_add_int(qh, qtd, ptd); | 750 | transform_add_int(qh, qtd, ptd); |
| 739 | } | 751 | } |
| 740 | 752 | ||
| 741 | static int qtd_fill(struct isp1760_qtd *qtd, void *databuffer, size_t len, | ||
| 742 | u32 token) | ||
| 743 | { | ||
| 744 | int count; | ||
| 745 | |||
| 746 | qtd->data_buffer = databuffer; | ||
| 747 | qtd->packet_type = GET_QTD_TOKEN_TYPE(token); | ||
| 748 | |||
| 749 | if (len > MAX_PAYLOAD_SIZE) | ||
| 750 | count = MAX_PAYLOAD_SIZE; | ||
| 751 | else | ||
| 752 | count = len; | ||
| 753 | |||
| 754 | qtd->length = count; | ||
| 755 | return count; | ||
| 756 | } | ||
| 757 | |||
| 758 | static int check_error(struct usb_hcd *hcd, struct ptd *ptd) | ||
| 759 | { | ||
| 760 | int error = 0; | ||
| 761 | |||
| 762 | if (ptd->dw3 & DW3_HALT_BIT) { | ||
| 763 | error = -EPIPE; | ||
| 764 | |||
| 765 | if (ptd->dw3 & DW3_ERROR_BIT) | ||
| 766 | pr_err("error bit is set in DW3\n"); | ||
| 767 | } | ||
| 768 | |||
| 769 | if (ptd->dw3 & DW3_QTD_ACTIVE) { | ||
| 770 | dev_err(hcd->self.controller, "Transfer active bit is set DW3\n" | ||
| 771 | "nak counter: %d, rl: %d\n", | ||
| 772 | (ptd->dw3 >> 19) & 0xf, (ptd->dw2 >> 25) & 0xf); | ||
| 773 | } | ||
| 774 | |||
| 775 | return error; | ||
| 776 | } | ||
| 777 | |||
| 778 | static void check_int_err_status(struct usb_hcd *hcd, u32 dw4) | ||
| 779 | { | ||
| 780 | u32 i; | ||
| 781 | |||
| 782 | dw4 >>= 8; | ||
| 783 | |||
| 784 | for (i = 0; i < 8; i++) { | ||
| 785 | switch (dw4 & 0x7) { | ||
| 786 | case INT_UNDERRUN: | ||
| 787 | dev_err(hcd->self.controller, "Underrun (%d)\n", i); | ||
| 788 | break; | ||
| 789 | |||
| 790 | case INT_EXACT: | ||
| 791 | dev_err(hcd->self.controller, | ||
| 792 | "Transaction error (%d)\n", i); | ||
| 793 | break; | ||
| 794 | |||
| 795 | case INT_BABBLE: | ||
| 796 | dev_err(hcd->self.controller, "Babble error (%d)\n", i); | ||
| 797 | break; | ||
| 798 | } | ||
| 799 | dw4 >>= 3; | ||
| 800 | } | ||
| 801 | } | ||
| 802 | |||
| 803 | static void enqueue_one_qtd(struct usb_hcd *hcd, struct isp1760_qtd *qtd) | ||
| 804 | { | ||
| 805 | if (qtd->length && (qtd->length <= MAX_PAYLOAD_SIZE)) { | ||
| 806 | switch (qtd->packet_type) { | ||
| 807 | case IN_PID: | ||
| 808 | break; | ||
| 809 | case OUT_PID: | ||
| 810 | case SETUP_PID: | ||
| 811 | mem_writes8(hcd->regs, qtd->payload_addr, | ||
| 812 | qtd->data_buffer, qtd->length); | ||
| 813 | } | ||
| 814 | } | ||
| 815 | } | ||
| 816 | |||
| 817 | static void enqueue_one_atl_qtd(struct usb_hcd *hcd, struct isp1760_qh *qh, | ||
| 818 | u32 slot, struct isp1760_qtd *qtd) | ||
| 819 | { | ||
| 820 | struct isp1760_hcd *priv = hcd_to_priv(hcd); | ||
| 821 | struct ptd ptd; | ||
| 822 | |||
| 823 | alloc_mem(hcd, qtd); | ||
| 824 | transform_into_atl(qh, qtd, &ptd); | ||
| 825 | ptd_write(hcd->regs, ATL_PTD_OFFSET, slot, &ptd); | ||
| 826 | enqueue_one_qtd(hcd, qtd); | ||
| 827 | |||
| 828 | priv->atl_ints[slot].qh = qh; | ||
| 829 | priv->atl_ints[slot].qtd = qtd; | ||
| 830 | qtd->status |= URB_ENQUEUED; | ||
| 831 | qtd->status |= slot << 16; | ||
| 832 | } | ||
| 833 | |||
| 834 | static void enqueue_one_int_qtd(struct usb_hcd *hcd, struct isp1760_qh *qh, | ||
| 835 | u32 slot, struct isp1760_qtd *qtd) | ||
| 836 | { | ||
| 837 | struct isp1760_hcd *priv = hcd_to_priv(hcd); | ||
| 838 | struct ptd ptd; | ||
| 839 | |||
| 840 | alloc_mem(hcd, qtd); | ||
| 841 | transform_into_int(qh, qtd, &ptd); | ||
| 842 | ptd_write(hcd->regs, INT_PTD_OFFSET, slot, &ptd); | ||
| 843 | enqueue_one_qtd(hcd, qtd); | ||
| 844 | |||
| 845 | priv->int_ints[slot].qh = qh; | ||
| 846 | priv->int_ints[slot].qtd = qtd; | ||
| 847 | qtd->status |= URB_ENQUEUED; | ||
| 848 | qtd->status |= slot << 16; | ||
| 849 | } | ||
| 850 | |||
| 851 | static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, | ||
| 852 | struct isp1760_qtd *qtd) | ||
| 853 | { | ||
| 854 | struct isp1760_hcd *priv = hcd_to_priv(hcd); | ||
| 855 | u32 skip_map, or_map; | ||
| 856 | u32 slot; | ||
| 857 | u32 buffstatus; | ||
| 858 | |||
| 859 | /* | ||
| 860 | * When this function is called from the interrupt handler to enqueue | ||
| 861 | * a follow-up packet, the SKIP register gets written and read back | ||
| 862 | * almost immediately. With ISP1761, this register requires a delay of | ||
| 863 | * 195ns between a write and subsequent read (see section 15.1.1.3). | ||
| 864 | */ | ||
| 865 | mmiowb(); | ||
| 866 | ndelay(195); | ||
| 867 | skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); | ||
| 868 | |||
| 869 | BUG_ON(!skip_map); | ||
| 870 | slot = __ffs(skip_map); | ||
| 871 | |||
| 872 | enqueue_one_atl_qtd(hcd, qh, slot, qtd); | ||
| 873 | |||
| 874 | or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG); | ||
| 875 | or_map |= (1 << slot); | ||
| 876 | reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map); | ||
| 877 | |||
| 878 | skip_map &= ~(1 << slot); | ||
| 879 | reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); | ||
| 880 | |||
| 881 | priv->atl_queued++; | ||
| 882 | if (priv->atl_queued == 2) | ||
| 883 | reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, | ||
| 884 | INTERRUPT_ENABLE_SOT_MASK); | ||
| 885 | |||
| 886 | buffstatus = reg_read32(hcd->regs, HC_BUFFER_STATUS_REG); | ||
| 887 | buffstatus |= ATL_BUFFER; | ||
| 888 | reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, buffstatus); | ||
| 889 | } | ||
| 890 | |||
| 891 | static void enqueue_an_INT_packet(struct usb_hcd *hcd, struct isp1760_qh *qh, | ||
| 892 | struct isp1760_qtd *qtd) | ||
| 893 | { | ||
| 894 | u32 skip_map, or_map; | ||
| 895 | u32 slot; | ||
| 896 | u32 buffstatus; | ||
| 897 | |||
| 898 | /* | ||
| 899 | * When this function is called from the interrupt handler to enqueue | ||
| 900 | * a follow-up packet, the SKIP register gets written and read back | ||
| 901 | * almost immediately. With ISP1761, this register requires a delay of | ||
| 902 | * 195ns between a write and subsequent read (see section 15.1.1.3). | ||
| 903 | */ | ||
| 904 | mmiowb(); | ||
| 905 | ndelay(195); | ||
| 906 | skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); | ||
| 907 | |||
| 908 | BUG_ON(!skip_map); | ||
| 909 | slot = __ffs(skip_map); | ||
| 910 | |||
| 911 | enqueue_one_int_qtd(hcd, qh, slot, qtd); | ||
| 912 | |||
| 913 | or_map = reg_read32(hcd->regs, HC_INT_IRQ_MASK_OR_REG); | ||
| 914 | or_map |= (1 << slot); | ||
| 915 | reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, or_map); | ||
| 916 | |||
| 917 | skip_map &= ~(1 << slot); | ||
| 918 | reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map); | ||
| 919 | |||
| 920 | buffstatus = reg_read32(hcd->regs, HC_BUFFER_STATUS_REG); | ||
| 921 | buffstatus |= INT_BUFFER; | ||
| 922 | reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, buffstatus); | ||
| 923 | } | ||
| 924 | |||
| 925 | static void isp1760_urb_done(struct usb_hcd *hcd, struct urb *urb) | 753 | static void isp1760_urb_done(struct usb_hcd *hcd, struct urb *urb) |
| 926 | __releases(priv->lock) | 754 | __releases(priv->lock) |
| 927 | __acquires(priv->lock) | 755 | __acquires(priv->lock) |
| @@ -948,557 +776,654 @@ __acquires(priv->lock) | |||
| 948 | spin_lock(&priv->lock); | 776 | spin_lock(&priv->lock); |
| 949 | } | 777 | } |
| 950 | 778 | ||
| 951 | static void isp1760_qtd_free(struct isp1760_qtd *qtd) | 779 | static struct isp1760_qtd *qtd_alloc(gfp_t flags, struct urb *urb, |
| 780 | u8 packet_type) | ||
| 952 | { | 781 | { |
| 953 | BUG_ON(qtd->payload_addr); | 782 | struct isp1760_qtd *qtd; |
| 954 | kmem_cache_free(qtd_cachep, qtd); | 783 | |
| 784 | qtd = kmem_cache_zalloc(qtd_cachep, flags); | ||
| 785 | if (!qtd) | ||
| 786 | return NULL; | ||
| 787 | |||
| 788 | INIT_LIST_HEAD(&qtd->qtd_list); | ||
| 789 | qtd->urb = urb; | ||
| 790 | qtd->packet_type = packet_type; | ||
| 791 | qtd->status = QTD_ENQUEUED; | ||
| 792 | qtd->actual_length = 0; | ||
| 793 | |||
| 794 | return qtd; | ||
| 955 | } | 795 | } |
| 956 | 796 | ||
| 957 | static struct isp1760_qtd *clean_this_qtd(struct isp1760_qtd *qtd, | 797 | static void qtd_free(struct isp1760_qtd *qtd) |
| 958 | struct isp1760_qh *qh) | ||
| 959 | { | 798 | { |
| 960 | struct isp1760_qtd *tmp_qtd; | 799 | WARN_ON(qtd->payload_addr); |
| 961 | 800 | kmem_cache_free(qtd_cachep, qtd); | |
| 962 | if (list_is_last(&qtd->qtd_list, &qh->qtd_list)) | ||
| 963 | tmp_qtd = NULL; | ||
| 964 | else | ||
| 965 | tmp_qtd = list_entry(qtd->qtd_list.next, struct isp1760_qtd, | ||
| 966 | qtd_list); | ||
| 967 | list_del(&qtd->qtd_list); | ||
| 968 | isp1760_qtd_free(qtd); | ||
| 969 | return tmp_qtd; | ||
| 970 | } | 801 | } |
| 971 | 802 | ||
| 972 | /* | 803 | static void start_bus_transfer(struct usb_hcd *hcd, u32 ptd_offset, int slot, |
| 973 | * Remove this QTD from the QH list and free its memory. If this QTD | 804 | struct slotinfo *slots, struct isp1760_qtd *qtd, |
| 974 | * isn't the last one than remove also his successor(s). | 805 | struct isp1760_qh *qh, struct ptd *ptd) |
| 975 | * Returns the QTD which is part of an new URB and should be enqueued. | ||
| 976 | */ | ||
| 977 | static struct isp1760_qtd *clean_up_qtdlist(struct isp1760_qtd *qtd, | ||
| 978 | struct isp1760_qh *qh) | ||
| 979 | { | 806 | { |
| 980 | struct urb *urb; | 807 | struct isp1760_hcd *priv = hcd_to_priv(hcd); |
| 808 | int skip_map; | ||
| 809 | |||
| 810 | WARN_ON((slot < 0) || (slot > 31)); | ||
| 811 | WARN_ON(qtd->length && !qtd->payload_addr); | ||
| 812 | WARN_ON(slots[slot].qtd); | ||
| 813 | WARN_ON(slots[slot].qh); | ||
| 814 | WARN_ON(qtd->status != QTD_PAYLOAD_ALLOC); | ||
| 815 | |||
| 816 | slots[slot].qtd = qtd; | ||
| 817 | slots[slot].qh = qh; | ||
| 818 | qh->slot = slot; | ||
| 819 | qtd->status = QTD_XFER_STARTED; /* Set this before writing ptd, since | ||
| 820 | interrupt routine may preempt and expects this value. */ | ||
| 821 | ptd_write(hcd->regs, ptd_offset, slot, ptd); | ||
| 822 | priv->active_ptds++; | ||
| 823 | |||
| 824 | /* Make sure done map has not triggered from some unlinked transfer */ | ||
| 825 | if (ptd_offset == ATL_PTD_OFFSET) { | ||
| 826 | priv->atl_done_map |= reg_read32(hcd->regs, | ||
| 827 | HC_ATL_PTD_DONEMAP_REG); | ||
| 828 | priv->atl_done_map &= ~(1 << qh->slot); | ||
| 981 | 829 | ||
| 982 | urb = qtd->urb; | 830 | skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); |
| 983 | do { | 831 | skip_map &= ~(1 << qh->slot); |
| 984 | qtd = clean_this_qtd(qtd, qh); | 832 | reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); |
| 985 | } while (qtd && (qtd->urb == urb)); | 833 | } else { |
| 834 | priv->int_done_map |= reg_read32(hcd->regs, | ||
| 835 | HC_INT_PTD_DONEMAP_REG); | ||
| 836 | priv->int_done_map &= ~(1 << qh->slot); | ||
| 986 | 837 | ||
| 987 | return qtd; | 838 | skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); |
| 839 | skip_map &= ~(1 << qh->slot); | ||
| 840 | reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map); | ||
| 841 | } | ||
| 988 | } | 842 | } |
| 989 | 843 | ||
| 990 | static void do_atl_int(struct usb_hcd *hcd) | 844 | static int is_short_bulk(struct isp1760_qtd *qtd) |
| 991 | { | 845 | { |
| 992 | struct isp1760_hcd *priv = hcd_to_priv(hcd); | 846 | return (usb_pipebulk(qtd->urb->pipe) && |
| 993 | u32 done_map, skip_map; | 847 | (qtd->actual_length < qtd->length)); |
| 994 | struct ptd ptd; | 848 | } |
| 995 | struct urb *urb; | ||
| 996 | u32 slot; | ||
| 997 | u32 length; | ||
| 998 | u32 or_map; | ||
| 999 | u32 status = -EINVAL; | ||
| 1000 | int error; | ||
| 1001 | struct isp1760_qtd *qtd; | ||
| 1002 | struct isp1760_qh *qh; | ||
| 1003 | u32 rl; | ||
| 1004 | u32 nakcount; | ||
| 1005 | 849 | ||
| 1006 | done_map = reg_read32(hcd->regs, HC_ATL_PTD_DONEMAP_REG); | 850 | static void collect_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh, |
| 1007 | skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); | 851 | struct list_head *urb_list) |
| 852 | { | ||
| 853 | int last_qtd; | ||
| 854 | struct isp1760_qtd *qtd, *qtd_next; | ||
| 855 | struct urb_listitem *urb_listitem; | ||
| 1008 | 856 | ||
| 1009 | or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG); | 857 | list_for_each_entry_safe(qtd, qtd_next, &qh->qtd_list, qtd_list) { |
| 1010 | or_map &= ~done_map; | 858 | if (qtd->status < QTD_XFER_COMPLETE) |
| 1011 | reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map); | 859 | break; |
| 1012 | 860 | ||
| 1013 | while (done_map) { | 861 | if (list_is_last(&qtd->qtd_list, &qh->qtd_list)) |
| 1014 | status = 0; | 862 | last_qtd = 1; |
| 1015 | priv->atl_queued--; | 863 | else |
| 864 | last_qtd = qtd->urb != qtd_next->urb; | ||
| 865 | |||
| 866 | if ((!last_qtd) && (qtd->status == QTD_RETIRE)) | ||
| 867 | qtd_next->status = QTD_RETIRE; | ||
| 868 | |||
| 869 | if (qtd->status == QTD_XFER_COMPLETE) { | ||
| 870 | if (qtd->actual_length) { | ||
| 871 | switch (qtd->packet_type) { | ||
| 872 | case IN_PID: | ||
| 873 | mem_reads8(hcd->regs, qtd->payload_addr, | ||
| 874 | qtd->data_buffer, | ||
| 875 | qtd->actual_length); | ||
| 876 | /* Fall through (?) */ | ||
| 877 | case OUT_PID: | ||
| 878 | qtd->urb->actual_length += | ||
| 879 | qtd->actual_length; | ||
| 880 | /* Fall through ... */ | ||
| 881 | case SETUP_PID: | ||
| 882 | break; | ||
| 883 | } | ||
| 884 | } | ||
| 1016 | 885 | ||
| 1017 | slot = __ffs(done_map); | 886 | if (is_short_bulk(qtd)) { |
| 1018 | done_map &= ~(1 << slot); | 887 | if (qtd->urb->transfer_flags & URB_SHORT_NOT_OK) |
| 1019 | skip_map |= (1 << slot); | 888 | qtd->urb->status = -EREMOTEIO; |
| 889 | if (!last_qtd) | ||
| 890 | qtd_next->status = QTD_RETIRE; | ||
| 891 | } | ||
| 892 | } | ||
| 1020 | 893 | ||
| 1021 | qtd = priv->atl_ints[slot].qtd; | 894 | if (qtd->payload_addr) |
| 1022 | qh = priv->atl_ints[slot].qh; | 895 | free_mem(hcd, qtd); |
| 1023 | 896 | ||
| 1024 | if (!qh) { | 897 | if (last_qtd) { |
| 1025 | dev_err(hcd->self.controller, "qh is 0\n"); | 898 | if ((qtd->status == QTD_RETIRE) && |
| 1026 | continue; | 899 | (qtd->urb->status == -EINPROGRESS)) |
| 900 | qtd->urb->status = -EPIPE; | ||
| 901 | /* Defer calling of urb_done() since it releases lock */ | ||
| 902 | urb_listitem = kmem_cache_zalloc(urb_listitem_cachep, | ||
| 903 | GFP_ATOMIC); | ||
| 904 | if (unlikely(!urb_listitem)) | ||
| 905 | break; | ||
| 906 | urb_listitem->urb = qtd->urb; | ||
| 907 | list_add_tail(&urb_listitem->urb_list, urb_list); | ||
| 1027 | } | 908 | } |
| 1028 | ptd_read(hcd->regs, ATL_PTD_OFFSET, slot, &ptd); | ||
| 1029 | 909 | ||
| 1030 | rl = (ptd.dw2 >> 25) & 0x0f; | 910 | list_del(&qtd->qtd_list); |
| 1031 | nakcount = (ptd.dw3 >> 19) & 0xf; | 911 | qtd_free(qtd); |
| 1032 | 912 | } | |
| 1033 | /* Transfer Error, *but* active and no HALT -> reload */ | 913 | } |
| 1034 | if ((ptd.dw3 & DW3_ERROR_BIT) && (ptd.dw3 & DW3_QTD_ACTIVE) && | ||
| 1035 | !(ptd.dw3 & DW3_HALT_BIT)) { | ||
| 1036 | |||
| 1037 | /* according to ppriv code, we have to | ||
| 1038 | * reload this one if trasfered bytes != requested bytes | ||
| 1039 | * else act like everything went smooth.. | ||
| 1040 | * XXX This just doesn't feel right and hasn't | ||
| 1041 | * triggered so far. | ||
| 1042 | */ | ||
| 1043 | 914 | ||
| 1044 | length = PTD_XFERRED_LENGTH(ptd.dw3); | 915 | #define ENQUEUE_DEPTH 2 |
| 1045 | dev_err(hcd->self.controller, | 916 | static void enqueue_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh) |
| 1046 | "Should reload now... transferred %d " | 917 | { |
| 1047 | "of %zu\n", length, qtd->length); | 918 | struct isp1760_hcd *priv = hcd_to_priv(hcd); |
| 1048 | BUG(); | 919 | int ptd_offset; |
| 1049 | } | 920 | struct slotinfo *slots; |
| 921 | int curr_slot, free_slot; | ||
| 922 | int n; | ||
| 923 | struct ptd ptd; | ||
| 924 | struct isp1760_qtd *qtd; | ||
| 1050 | 925 | ||
| 1051 | if (!nakcount && (ptd.dw3 & DW3_QTD_ACTIVE)) { | 926 | if (unlikely(list_empty(&qh->qtd_list))) { |
| 1052 | u32 buffstatus; | 927 | WARN_ON(1); |
| 928 | return; | ||
| 929 | } | ||
| 1053 | 930 | ||
| 1054 | /* | 931 | if (usb_pipeint(list_entry(qh->qtd_list.next, struct isp1760_qtd, |
| 1055 | * NAKs are handled in HW by the chip. Usually if the | 932 | qtd_list)->urb->pipe)) { |
| 1056 | * device is not able to send data fast enough. | 933 | ptd_offset = INT_PTD_OFFSET; |
| 1057 | * This happens mostly on slower hardware. | 934 | slots = priv->int_slots; |
| 1058 | */ | 935 | } else { |
| 936 | ptd_offset = ATL_PTD_OFFSET; | ||
| 937 | slots = priv->atl_slots; | ||
| 938 | } | ||
| 1059 | 939 | ||
| 1060 | /* RL counter = ERR counter */ | 940 | free_slot = -1; |
| 1061 | ptd.dw3 &= ~(0xf << 19); | 941 | for (curr_slot = 0; curr_slot < 32; curr_slot++) { |
| 1062 | ptd.dw3 |= rl << 19; | 942 | if ((free_slot == -1) && (slots[curr_slot].qtd == NULL)) |
| 1063 | ptd.dw3 &= ~(3 << (55 - 32)); | 943 | free_slot = curr_slot; |
| 1064 | ptd.dw3 |= ERR_COUNTER << (55 - 32); | 944 | if (slots[curr_slot].qh == qh) |
| 1065 | 945 | break; | |
| 1066 | /* | 946 | } |
| 1067 | * It is not needed to write skip map back because it | ||
| 1068 | * is unchanged. Just make sure that this entry is | ||
| 1069 | * unskipped once it gets written to the HW. | ||
| 1070 | */ | ||
| 1071 | skip_map &= ~(1 << slot); | ||
| 1072 | or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG); | ||
| 1073 | or_map |= 1 << slot; | ||
| 1074 | reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map); | ||
| 1075 | 947 | ||
| 1076 | ptd.dw0 |= PTD_VALID; | 948 | n = 0; |
| 1077 | ptd_write(hcd->regs, ATL_PTD_OFFSET, slot, &ptd); | 949 | list_for_each_entry(qtd, &qh->qtd_list, qtd_list) { |
| 950 | if (qtd->status == QTD_ENQUEUED) { | ||
| 951 | WARN_ON(qtd->payload_addr); | ||
| 952 | alloc_mem(hcd, qtd); | ||
| 953 | if ((qtd->length) && (!qtd->payload_addr)) | ||
| 954 | break; | ||
| 1078 | 955 | ||
| 1079 | priv->atl_queued++; | 956 | if ((qtd->length) && |
| 1080 | if (priv->atl_queued == 2) | 957 | ((qtd->packet_type == SETUP_PID) || |
| 1081 | reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, | 958 | (qtd->packet_type == OUT_PID))) { |
| 1082 | INTERRUPT_ENABLE_SOT_MASK); | 959 | mem_writes8(hcd->regs, qtd->payload_addr, |
| 960 | qtd->data_buffer, qtd->length); | ||
| 961 | } | ||
| 1083 | 962 | ||
| 1084 | buffstatus = reg_read32(hcd->regs, | 963 | qtd->status = QTD_PAYLOAD_ALLOC; |
| 1085 | HC_BUFFER_STATUS_REG); | ||
| 1086 | buffstatus |= ATL_BUFFER; | ||
| 1087 | reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, | ||
| 1088 | buffstatus); | ||
| 1089 | continue; | ||
| 1090 | } | 964 | } |
| 1091 | 965 | ||
| 1092 | error = check_error(hcd, &ptd); | 966 | if (qtd->status == QTD_PAYLOAD_ALLOC) { |
| 1093 | if (error) { | 967 | /* |
| 1094 | status = error; | 968 | if ((curr_slot > 31) && (free_slot == -1)) |
| 1095 | priv->atl_ints[slot].qh->toggle = 0; | 969 | dev_dbg(hcd->self.controller, "%s: No slot " |
| 1096 | priv->atl_ints[slot].qh->ping = 0; | 970 | "available for transfer\n", __func__); |
| 1097 | qtd->urb->status = -EPIPE; | 971 | */ |
| 1098 | 972 | /* Start xfer for this endpoint if not already done */ | |
| 1099 | #if 0 | 973 | if ((curr_slot > 31) && (free_slot > -1)) { |
| 1100 | printk(KERN_ERR "Error in %s().\n", __func__); | 974 | if (usb_pipeint(qtd->urb->pipe)) |
| 1101 | printk(KERN_ERR "IN dw0: %08x dw1: %08x dw2: %08x " | 975 | create_ptd_int(qh, qtd, &ptd); |
| 1102 | "dw3: %08x dw4: %08x dw5: %08x dw6: " | 976 | else |
| 1103 | "%08x dw7: %08x\n", | 977 | create_ptd_atl(qh, qtd, &ptd); |
| 1104 | ptd.dw0, ptd.dw1, ptd.dw2, ptd.dw3, | 978 | |
| 1105 | ptd.dw4, ptd.dw5, ptd.dw6, ptd.dw7); | 979 | start_bus_transfer(hcd, ptd_offset, free_slot, |
| 1106 | #endif | 980 | slots, qtd, qh, &ptd); |
| 1107 | } else { | 981 | curr_slot = free_slot; |
| 1108 | priv->atl_ints[slot].qh->toggle = ptd.dw3 & (1 << 25); | 982 | } |
| 1109 | priv->atl_ints[slot].qh->ping = ptd.dw3 & (1 << 26); | ||
| 1110 | } | ||
| 1111 | 983 | ||
| 1112 | length = PTD_XFERRED_LENGTH(ptd.dw3); | 984 | n++; |
| 1113 | if (length) { | 985 | if (n >= ENQUEUE_DEPTH) |
| 1114 | switch (DW1_GET_PID(ptd.dw1)) { | 986 | break; |
| 1115 | case IN_PID: | 987 | } |
| 1116 | mem_reads8(hcd->regs, qtd->payload_addr, | 988 | } |
| 1117 | qtd->data_buffer, length); | 989 | } |
| 1118 | 990 | ||
| 1119 | case OUT_PID: | 991 | void schedule_ptds(struct usb_hcd *hcd) |
| 992 | { | ||
| 993 | struct isp1760_hcd *priv; | ||
| 994 | struct isp1760_qh *qh, *qh_next; | ||
| 995 | struct list_head *ep_queue; | ||
| 996 | struct usb_host_endpoint *ep; | ||
| 997 | LIST_HEAD(urb_list); | ||
| 998 | struct urb_listitem *urb_listitem, *urb_listitem_next; | ||
| 999 | |||
| 1000 | if (!hcd) { | ||
| 1001 | WARN_ON(1); | ||
| 1002 | return; | ||
| 1003 | } | ||
| 1120 | 1004 | ||
| 1121 | qtd->urb->actual_length += length; | 1005 | priv = hcd_to_priv(hcd); |
| 1122 | 1006 | ||
| 1123 | case SETUP_PID: | 1007 | /* |
| 1124 | break; | 1008 | * check finished/retired xfers, transfer payloads, call urb_done() |
| 1009 | */ | ||
| 1010 | ep_queue = &priv->interruptqhs; | ||
| 1011 | while (ep_queue) { | ||
| 1012 | list_for_each_entry_safe(qh, qh_next, ep_queue, qh_list) { | ||
| 1013 | ep = list_entry(qh->qtd_list.next, struct isp1760_qtd, | ||
| 1014 | qtd_list)->urb->ep; | ||
| 1015 | collect_qtds(hcd, qh, &urb_list); | ||
| 1016 | if (list_empty(&qh->qtd_list)) { | ||
| 1017 | list_del(&qh->qh_list); | ||
| 1018 | if (ep->hcpriv == NULL) { | ||
| 1019 | /* Endpoint has been disabled, so we | ||
| 1020 | can free the associated queue head. */ | ||
| 1021 | qh_free(qh); | ||
| 1022 | } | ||
| 1125 | } | 1023 | } |
| 1126 | } | 1024 | } |
| 1127 | 1025 | ||
| 1128 | priv->atl_ints[slot].qtd = NULL; | 1026 | if (ep_queue == &priv->interruptqhs) |
| 1129 | priv->atl_ints[slot].qh = NULL; | 1027 | ep_queue = &priv->controlqhs; |
| 1130 | 1028 | else if (ep_queue == &priv->controlqhs) | |
| 1131 | free_mem(hcd, qtd); | 1029 | ep_queue = &priv->bulkqhs; |
| 1030 | else | ||
| 1031 | ep_queue = NULL; | ||
| 1032 | } | ||
| 1132 | 1033 | ||
| 1133 | reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); | 1034 | list_for_each_entry_safe(urb_listitem, urb_listitem_next, &urb_list, |
| 1035 | urb_list) { | ||
| 1036 | isp1760_urb_done(hcd, urb_listitem->urb); | ||
| 1037 | kmem_cache_free(urb_listitem_cachep, urb_listitem); | ||
| 1038 | } | ||
| 1134 | 1039 | ||
| 1135 | if (qtd->urb->status == -EPIPE) { | 1040 | /* |
| 1136 | /* HALT was received */ | 1041 | * Schedule packets for transfer. |
| 1042 | * | ||
| 1043 | * According to USB2.0 specification: | ||
| 1044 | * | ||
| 1045 | * 1st prio: interrupt xfers, up to 80 % of bandwidth | ||
| 1046 | * 2nd prio: control xfers | ||
| 1047 | * 3rd prio: bulk xfers | ||
| 1048 | * | ||
| 1049 | * ... but let's use a simpler scheme here (mostly because ISP1761 doc | ||
| 1050 | * is very unclear on how to prioritize traffic): | ||
| 1051 | * | ||
| 1052 | * 1) Enqueue any queued control transfers, as long as payload chip mem | ||
| 1053 | * and PTD ATL slots are available. | ||
| 1054 | * 2) Enqueue any queued INT transfers, as long as payload chip mem | ||
| 1055 | * and PTD INT slots are available. | ||
| 1056 | * 3) Enqueue any queued bulk transfers, as long as payload chip mem | ||
| 1057 | * and PTD ATL slots are available. | ||
| 1058 | * | ||
| 1059 | * Use double buffering (ENQUEUE_DEPTH==2) as a compromise between | ||
| 1060 | * conservation of chip mem and performance. | ||
| 1061 | * | ||
| 1062 | * I'm sure this scheme could be improved upon! | ||
| 1063 | */ | ||
| 1064 | ep_queue = &priv->controlqhs; | ||
| 1065 | while (ep_queue) { | ||
| 1066 | list_for_each_entry_safe(qh, qh_next, ep_queue, qh_list) | ||
| 1067 | enqueue_qtds(hcd, qh); | ||
| 1068 | |||
| 1069 | if (ep_queue == &priv->controlqhs) | ||
| 1070 | ep_queue = &priv->interruptqhs; | ||
| 1071 | else if (ep_queue == &priv->interruptqhs) | ||
| 1072 | ep_queue = &priv->bulkqhs; | ||
| 1073 | else | ||
| 1074 | ep_queue = NULL; | ||
| 1075 | } | ||
| 1076 | } | ||
| 1137 | 1077 | ||
| 1138 | urb = qtd->urb; | 1078 | #define PTD_STATE_QTD_DONE 1 |
| 1139 | qtd = clean_up_qtdlist(qtd, qh); | 1079 | #define PTD_STATE_QTD_RELOAD 2 |
| 1140 | isp1760_urb_done(hcd, urb); | 1080 | #define PTD_STATE_URB_RETIRE 3 |
| 1141 | 1081 | ||
| 1142 | } else if (usb_pipebulk(qtd->urb->pipe) && | 1082 | static int check_int_transfer(struct usb_hcd *hcd, struct ptd *ptd, |
| 1143 | (length < qtd->length)) { | 1083 | struct urb *urb) |
| 1144 | /* short BULK received */ | 1084 | { |
| 1085 | __dw dw4; | ||
| 1086 | int i; | ||
| 1145 | 1087 | ||
| 1146 | if (qtd->urb->transfer_flags & URB_SHORT_NOT_OK) { | 1088 | dw4 = ptd->dw4; |
| 1147 | qtd->urb->status = -EREMOTEIO; | 1089 | dw4 >>= 8; |
| 1148 | dev_dbg(hcd->self.controller, | ||
| 1149 | "short bulk, %d instead %zu " | ||
| 1150 | "with URB_SHORT_NOT_OK flag.\n", | ||
| 1151 | length, qtd->length); | ||
| 1152 | } | ||
| 1153 | 1090 | ||
| 1154 | if (qtd->urb->status == -EINPROGRESS) | 1091 | /* FIXME: ISP1761 datasheet does not say what to do with these. Do we |
| 1155 | qtd->urb->status = 0; | 1092 | need to handle these errors? Is it done in hardware? */ |
| 1156 | 1093 | ||
| 1157 | urb = qtd->urb; | 1094 | if (ptd->dw3 & DW3_HALT_BIT) { |
| 1158 | qtd = clean_up_qtdlist(qtd, qh); | ||
| 1159 | isp1760_urb_done(hcd, urb); | ||
| 1160 | 1095 | ||
| 1161 | } else if (last_qtd_of_urb(qtd, qh)) { | 1096 | urb->status = -EPROTO; /* Default unknown error */ |
| 1162 | /* that was the last qtd of that URB */ | ||
| 1163 | 1097 | ||
| 1164 | if (qtd->urb->status == -EINPROGRESS) | 1098 | for (i = 0; i < 8; i++) { |
| 1165 | qtd->urb->status = 0; | 1099 | switch (dw4 & 0x7) { |
| 1100 | case INT_UNDERRUN: | ||
| 1101 | dev_dbg(hcd->self.controller, "%s: underrun " | ||
| 1102 | "during uFrame %d\n", | ||
| 1103 | __func__, i); | ||
| 1104 | urb->status = -ECOMM; /* Could not write data */ | ||
| 1105 | break; | ||
| 1106 | case INT_EXACT: | ||
| 1107 | dev_dbg(hcd->self.controller, "%s: transaction " | ||
| 1108 | "error during uFrame %d\n", | ||
| 1109 | __func__, i); | ||
| 1110 | urb->status = -EPROTO; /* timeout, bad CRC, PID | ||
| 1111 | error etc. */ | ||
| 1112 | break; | ||
| 1113 | case INT_BABBLE: | ||
| 1114 | dev_dbg(hcd->self.controller, "%s: babble " | ||
| 1115 | "error during uFrame %d\n", | ||
| 1116 | __func__, i); | ||
| 1117 | urb->status = -EOVERFLOW; | ||
| 1118 | break; | ||
| 1119 | } | ||
| 1120 | dw4 >>= 3; | ||
| 1121 | } | ||
| 1166 | 1122 | ||
| 1167 | urb = qtd->urb; | 1123 | return PTD_STATE_URB_RETIRE; |
| 1168 | qtd = clean_up_qtdlist(qtd, qh); | 1124 | } |
| 1169 | isp1760_urb_done(hcd, urb); | ||
| 1170 | 1125 | ||
| 1171 | } else { | 1126 | return PTD_STATE_QTD_DONE; |
| 1172 | /* next QTD of this URB */ | 1127 | } |
| 1173 | 1128 | ||
| 1174 | qtd = clean_this_qtd(qtd, qh); | 1129 | static int check_atl_transfer(struct usb_hcd *hcd, struct ptd *ptd, |
| 1175 | BUG_ON(!qtd); | 1130 | struct urb *urb) |
| 1176 | } | 1131 | { |
| 1132 | WARN_ON(!ptd); | ||
| 1133 | if (ptd->dw3 & DW3_HALT_BIT) { | ||
| 1134 | if (ptd->dw3 & DW3_BABBLE_BIT) | ||
| 1135 | urb->status = -EOVERFLOW; | ||
| 1136 | else if (FROM_DW3_CERR(ptd->dw3)) | ||
| 1137 | urb->status = -EPIPE; /* Stall */ | ||
| 1138 | else if (ptd->dw3 & DW3_ERROR_BIT) | ||
| 1139 | urb->status = -EPROTO; /* XactErr */ | ||
| 1140 | else | ||
| 1141 | urb->status = -EPROTO; /* Unknown */ | ||
| 1142 | /* | ||
| 1143 | dev_dbg(hcd->self.controller, "%s: ptd error:\n" | ||
| 1144 | " dw0: %08x dw1: %08x dw2: %08x dw3: %08x\n" | ||
| 1145 | " dw4: %08x dw5: %08x dw6: %08x dw7: %08x\n", | ||
| 1146 | __func__, | ||
| 1147 | ptd->dw0, ptd->dw1, ptd->dw2, ptd->dw3, | ||
| 1148 | ptd->dw4, ptd->dw5, ptd->dw6, ptd->dw7); | ||
| 1149 | */ | ||
| 1150 | return PTD_STATE_URB_RETIRE; | ||
| 1151 | } | ||
| 1177 | 1152 | ||
| 1178 | if (qtd) | 1153 | if ((ptd->dw3 & DW3_ERROR_BIT) && (ptd->dw3 & DW3_ACTIVE_BIT)) { |
| 1179 | enqueue_an_ATL_packet(hcd, qh, qtd); | 1154 | /* Transfer Error, *but* active and no HALT -> reload */ |
| 1155 | dev_dbg(hcd->self.controller, "PID error; reloading ptd\n"); | ||
| 1156 | return PTD_STATE_QTD_RELOAD; | ||
| 1157 | } | ||
| 1180 | 1158 | ||
| 1181 | skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); | 1159 | if (!FROM_DW3_NAKCOUNT(ptd->dw3) && (ptd->dw3 & DW3_ACTIVE_BIT)) { |
| 1160 | /* | ||
| 1161 | * NAKs are handled in HW by the chip. Usually if the | ||
| 1162 | * device is not able to send data fast enough. | ||
| 1163 | * This happens mostly on slower hardware. | ||
| 1164 | */ | ||
| 1165 | return PTD_STATE_QTD_RELOAD; | ||
| 1182 | } | 1166 | } |
| 1183 | if (priv->atl_queued <= 1) | 1167 | |
| 1184 | reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, | 1168 | return PTD_STATE_QTD_DONE; |
| 1185 | INTERRUPT_ENABLE_MASK); | ||
| 1186 | } | 1169 | } |
| 1187 | 1170 | ||
| 1188 | static void do_intl_int(struct usb_hcd *hcd) | 1171 | static irqreturn_t isp1760_irq(struct usb_hcd *hcd) |
| 1189 | { | 1172 | { |
| 1190 | struct isp1760_hcd *priv = hcd_to_priv(hcd); | 1173 | struct isp1760_hcd *priv = hcd_to_priv(hcd); |
| 1191 | u32 done_map, skip_map; | 1174 | u32 imask; |
| 1175 | irqreturn_t irqret = IRQ_NONE; | ||
| 1192 | struct ptd ptd; | 1176 | struct ptd ptd; |
| 1193 | struct urb *urb; | ||
| 1194 | u32 length; | ||
| 1195 | u32 or_map; | ||
| 1196 | int error; | ||
| 1197 | u32 slot; | ||
| 1198 | struct isp1760_qtd *qtd; | ||
| 1199 | struct isp1760_qh *qh; | 1177 | struct isp1760_qh *qh; |
| 1178 | int slot; | ||
| 1179 | int state; | ||
| 1180 | struct slotinfo *slots; | ||
| 1181 | u32 ptd_offset; | ||
| 1182 | struct isp1760_qtd *qtd; | ||
| 1183 | int modified; | ||
| 1184 | static int last_active_ptds; | ||
| 1185 | int int_skip_map, atl_skip_map; | ||
| 1200 | 1186 | ||
| 1201 | done_map = reg_read32(hcd->regs, HC_INT_PTD_DONEMAP_REG); | 1187 | spin_lock(&priv->lock); |
| 1202 | skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); | ||
| 1203 | |||
| 1204 | or_map = reg_read32(hcd->regs, HC_INT_IRQ_MASK_OR_REG); | ||
| 1205 | or_map &= ~done_map; | ||
| 1206 | reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, or_map); | ||
| 1207 | |||
| 1208 | while (done_map) { | ||
| 1209 | slot = __ffs(done_map); | ||
| 1210 | done_map &= ~(1 << slot); | ||
| 1211 | skip_map |= (1 << slot); | ||
| 1212 | |||
| 1213 | qtd = priv->int_ints[slot].qtd; | ||
| 1214 | qh = priv->int_ints[slot].qh; | ||
| 1215 | |||
| 1216 | if (!qh) { | ||
| 1217 | dev_err(hcd->self.controller, "(INT) qh is 0\n"); | ||
| 1218 | continue; | ||
| 1219 | } | ||
| 1220 | 1188 | ||
| 1221 | ptd_read(hcd->regs, INT_PTD_OFFSET, slot, &ptd); | 1189 | if (!(hcd->state & HC_STATE_RUNNING)) |
| 1222 | check_int_err_status(hcd, ptd.dw4); | 1190 | goto leave; |
| 1223 | |||
| 1224 | error = check_error(hcd, &ptd); | ||
| 1225 | if (error) { | ||
| 1226 | #if 0 | ||
| 1227 | printk(KERN_ERR "Error in %s().\n", __func__); | ||
| 1228 | printk(KERN_ERR "IN dw0: %08x dw1: %08x dw2: %08x " | ||
| 1229 | "dw3: %08x dw4: %08x dw5: %08x dw6: " | ||
| 1230 | "%08x dw7: %08x\n", | ||
| 1231 | ptd.dw0, ptd.dw1, ptd.dw2, ptd.dw3, | ||
| 1232 | ptd.dw4, ptd.dw5, ptd.dw6, ptd.dw7); | ||
| 1233 | #endif | ||
| 1234 | qtd->urb->status = -EPIPE; | ||
| 1235 | priv->int_ints[slot].qh->toggle = 0; | ||
| 1236 | priv->int_ints[slot].qh->ping = 0; | ||
| 1237 | 1191 | ||
| 1192 | imask = reg_read32(hcd->regs, HC_INTERRUPT_REG); | ||
| 1193 | if (unlikely(!imask)) | ||
| 1194 | goto leave; | ||
| 1195 | reg_write32(hcd->regs, HC_INTERRUPT_REG, imask); /* Clear */ | ||
| 1196 | |||
| 1197 | int_skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); | ||
| 1198 | atl_skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); | ||
| 1199 | priv->int_done_map |= reg_read32(hcd->regs, HC_INT_PTD_DONEMAP_REG); | ||
| 1200 | priv->atl_done_map |= reg_read32(hcd->regs, HC_ATL_PTD_DONEMAP_REG); | ||
| 1201 | priv->int_done_map &= ~int_skip_map; | ||
| 1202 | priv->atl_done_map &= ~atl_skip_map; | ||
| 1203 | |||
| 1204 | modified = priv->int_done_map | priv->atl_done_map; | ||
| 1205 | |||
| 1206 | while (priv->int_done_map || priv->atl_done_map) { | ||
| 1207 | if (priv->int_done_map) { | ||
| 1208 | /* INT ptd */ | ||
| 1209 | slot = __ffs(priv->int_done_map); | ||
| 1210 | priv->int_done_map &= ~(1 << slot); | ||
| 1211 | slots = priv->int_slots; | ||
| 1212 | /* This should not trigger, and could be removed if | ||
| 1213 | noone have any problems with it triggering: */ | ||
| 1214 | if (!slots[slot].qh) { | ||
| 1215 | WARN_ON(1); | ||
| 1216 | continue; | ||
| 1217 | } | ||
| 1218 | ptd_offset = INT_PTD_OFFSET; | ||
| 1219 | ptd_read(hcd->regs, INT_PTD_OFFSET, slot, &ptd); | ||
| 1220 | state = check_int_transfer(hcd, &ptd, | ||
| 1221 | slots[slot].qtd->urb); | ||
| 1238 | } else { | 1222 | } else { |
| 1239 | priv->int_ints[slot].qh->toggle = ptd.dw3 & (1 << 25); | 1223 | /* ATL ptd */ |
| 1240 | priv->int_ints[slot].qh->ping = ptd.dw3 & (1 << 26); | 1224 | slot = __ffs(priv->atl_done_map); |
| 1241 | } | 1225 | priv->atl_done_map &= ~(1 << slot); |
| 1242 | 1226 | slots = priv->atl_slots; | |
| 1243 | if (qtd->urb->dev->speed != USB_SPEED_HIGH) | 1227 | /* This should not trigger, and could be removed if |
| 1244 | length = PTD_XFERRED_LENGTH_LO(ptd.dw3); | 1228 | noone have any problems with it triggering: */ |
| 1245 | else | 1229 | if (!slots[slot].qh) { |
| 1246 | length = PTD_XFERRED_LENGTH(ptd.dw3); | 1230 | WARN_ON(1); |
| 1247 | 1231 | continue; | |
| 1248 | if (length) { | ||
| 1249 | switch (DW1_GET_PID(ptd.dw1)) { | ||
| 1250 | case IN_PID: | ||
| 1251 | mem_reads8(hcd->regs, qtd->payload_addr, | ||
| 1252 | qtd->data_buffer, length); | ||
| 1253 | case OUT_PID: | ||
| 1254 | |||
| 1255 | qtd->urb->actual_length += length; | ||
| 1256 | |||
| 1257 | case SETUP_PID: | ||
| 1258 | break; | ||
| 1259 | } | 1232 | } |
| 1233 | ptd_offset = ATL_PTD_OFFSET; | ||
| 1234 | ptd_read(hcd->regs, ATL_PTD_OFFSET, slot, &ptd); | ||
| 1235 | state = check_atl_transfer(hcd, &ptd, | ||
| 1236 | slots[slot].qtd->urb); | ||
| 1260 | } | 1237 | } |
| 1261 | 1238 | ||
| 1262 | priv->int_ints[slot].qtd = NULL; | 1239 | qtd = slots[slot].qtd; |
| 1263 | priv->int_ints[slot].qh = NULL; | 1240 | slots[slot].qtd = NULL; |
| 1264 | 1241 | qh = slots[slot].qh; | |
| 1265 | reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map); | 1242 | slots[slot].qh = NULL; |
| 1266 | free_mem(hcd, qtd); | 1243 | priv->active_ptds--; |
| 1267 | 1244 | qh->slot = -1; | |
| 1268 | if (qtd->urb->status == -EPIPE) { | 1245 | |
| 1269 | /* HALT received */ | 1246 | WARN_ON(qtd->status != QTD_XFER_STARTED); |
| 1270 | 1247 | ||
| 1271 | urb = qtd->urb; | 1248 | switch (state) { |
| 1272 | qtd = clean_up_qtdlist(qtd, qh); | 1249 | case PTD_STATE_QTD_DONE: |
| 1273 | isp1760_urb_done(hcd, urb); | 1250 | if ((usb_pipeint(qtd->urb->pipe)) && |
| 1274 | 1251 | (qtd->urb->dev->speed != USB_SPEED_HIGH)) | |
| 1275 | } else if (last_qtd_of_urb(qtd, qh)) { | 1252 | qtd->actual_length = |
| 1276 | 1253 | FROM_DW3_SCS_NRBYTESTRANSFERRED(ptd.dw3); | |
| 1277 | if (qtd->urb->status == -EINPROGRESS) | 1254 | else |
| 1278 | qtd->urb->status = 0; | 1255 | qtd->actual_length = |
| 1256 | FROM_DW3_NRBYTESTRANSFERRED(ptd.dw3); | ||
| 1257 | |||
| 1258 | qtd->status = QTD_XFER_COMPLETE; | ||
| 1259 | if (list_is_last(&qtd->qtd_list, &qh->qtd_list) || | ||
| 1260 | is_short_bulk(qtd)) | ||
| 1261 | qtd = NULL; | ||
| 1262 | else | ||
| 1263 | qtd = list_entry(qtd->qtd_list.next, | ||
| 1264 | typeof(*qtd), qtd_list); | ||
| 1265 | |||
| 1266 | qh->toggle = FROM_DW3_DATA_TOGGLE(ptd.dw3); | ||
| 1267 | qh->ping = FROM_DW3_PING(ptd.dw3); | ||
| 1268 | break; | ||
| 1279 | 1269 | ||
| 1280 | urb = qtd->urb; | 1270 | case PTD_STATE_QTD_RELOAD: /* QTD_RETRY, for atls only */ |
| 1281 | qtd = clean_up_qtdlist(qtd, qh); | 1271 | qtd->status = QTD_PAYLOAD_ALLOC; |
| 1282 | isp1760_urb_done(hcd, urb); | 1272 | ptd.dw0 |= DW0_VALID_BIT; |
| 1273 | /* RL counter = ERR counter */ | ||
| 1274 | ptd.dw3 &= ~TO_DW3_NAKCOUNT(0xf); | ||
| 1275 | ptd.dw3 |= TO_DW3_NAKCOUNT(FROM_DW2_RL(ptd.dw2)); | ||
| 1276 | ptd.dw3 &= ~TO_DW3_CERR(3); | ||
| 1277 | ptd.dw3 |= TO_DW3_CERR(ERR_COUNTER); | ||
| 1278 | qh->toggle = FROM_DW3_DATA_TOGGLE(ptd.dw3); | ||
| 1279 | qh->ping = FROM_DW3_PING(ptd.dw3); | ||
| 1280 | break; | ||
| 1283 | 1281 | ||
| 1284 | } else { | 1282 | case PTD_STATE_URB_RETIRE: |
| 1285 | /* next QTD of this URB */ | 1283 | qtd->status = QTD_RETIRE; |
| 1284 | qtd = NULL; | ||
| 1285 | qh->toggle = 0; | ||
| 1286 | qh->ping = 0; | ||
| 1287 | break; | ||
| 1286 | 1288 | ||
| 1287 | qtd = clean_this_qtd(qtd, qh); | 1289 | default: |
| 1288 | BUG_ON(!qtd); | 1290 | WARN_ON(1); |
| 1291 | continue; | ||
| 1289 | } | 1292 | } |
| 1290 | 1293 | ||
| 1291 | if (qtd) | 1294 | if (qtd && (qtd->status == QTD_PAYLOAD_ALLOC)) { |
| 1292 | enqueue_an_INT_packet(hcd, qh, qtd); | 1295 | if (slots == priv->int_slots) { |
| 1296 | if (state == PTD_STATE_QTD_RELOAD) | ||
| 1297 | dev_err(hcd->self.controller, | ||
| 1298 | "%s: PTD_STATE_QTD_RELOAD on " | ||
| 1299 | "interrupt packet\n", __func__); | ||
| 1300 | if (state != PTD_STATE_QTD_RELOAD) | ||
| 1301 | create_ptd_int(qh, qtd, &ptd); | ||
| 1302 | } else { | ||
| 1303 | if (state != PTD_STATE_QTD_RELOAD) | ||
| 1304 | create_ptd_atl(qh, qtd, &ptd); | ||
| 1305 | } | ||
| 1293 | 1306 | ||
| 1294 | skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); | 1307 | start_bus_transfer(hcd, ptd_offset, slot, slots, qtd, |
| 1308 | qh, &ptd); | ||
| 1309 | } | ||
| 1295 | } | 1310 | } |
| 1296 | } | ||
| 1297 | 1311 | ||
| 1298 | static struct isp1760_qh *qh_make(struct usb_hcd *hcd, struct urb *urb, | 1312 | if (modified) |
| 1299 | gfp_t flags) | 1313 | schedule_ptds(hcd); |
| 1300 | { | ||
| 1301 | struct isp1760_qh *qh; | ||
| 1302 | int is_input, type; | ||
| 1303 | 1314 | ||
| 1304 | qh = isp1760_qh_alloc(flags); | 1315 | /* ISP1760 Errata 2 explains that interrupts may be missed (or not |
| 1305 | if (!qh) | 1316 | happen?) if two USB devices are running simultaneously. Perhaps |
| 1306 | return qh; | 1317 | this happens when a PTD is finished during interrupt handling; |
| 1307 | 1318 | enable SOF interrupts if PTDs are still scheduled when exiting this | |
| 1308 | /* | 1319 | interrupt handler, just to be safe. */ |
| 1309 | * init endpoint/device data for this QH | ||
| 1310 | */ | ||
| 1311 | is_input = usb_pipein(urb->pipe); | ||
| 1312 | type = usb_pipetype(urb->pipe); | ||
| 1313 | 1320 | ||
| 1314 | if (!usb_pipecontrol(urb->pipe)) | 1321 | if (priv->active_ptds != last_active_ptds) { |
| 1315 | usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), !is_input, | 1322 | if (priv->active_ptds > 0) |
| 1316 | 1); | 1323 | reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, |
| 1317 | return qh; | 1324 | INTERRUPT_ENABLE_SOT_MASK); |
| 1318 | } | 1325 | else |
| 1319 | 1326 | reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, | |
| 1320 | /* | 1327 | INTERRUPT_ENABLE_MASK); |
| 1321 | * For control/bulk/interrupt, return QH with these TDs appended. | 1328 | last_active_ptds = priv->active_ptds; |
| 1322 | * Allocates and initializes the QH if necessary. | ||
| 1323 | * Returns null if it can't allocate a QH it needs to. | ||
| 1324 | * If the QH has TDs (urbs) already, that's great. | ||
| 1325 | */ | ||
| 1326 | static struct isp1760_qh *qh_append_tds(struct usb_hcd *hcd, | ||
| 1327 | struct urb *urb, struct list_head *qtd_list, int epnum, | ||
| 1328 | void **ptr) | ||
| 1329 | { | ||
| 1330 | struct isp1760_qh *qh; | ||
| 1331 | |||
| 1332 | qh = (struct isp1760_qh *)*ptr; | ||
| 1333 | if (!qh) { | ||
| 1334 | /* can't sleep here, we have priv->lock... */ | ||
| 1335 | qh = qh_make(hcd, urb, GFP_ATOMIC); | ||
| 1336 | if (!qh) | ||
| 1337 | return qh; | ||
| 1338 | *ptr = qh; | ||
| 1339 | } | 1329 | } |
| 1340 | 1330 | ||
| 1341 | list_splice(qtd_list, qh->qtd_list.prev); | 1331 | irqret = IRQ_HANDLED; |
| 1332 | leave: | ||
| 1333 | spin_unlock(&priv->lock); | ||
| 1342 | 1334 | ||
| 1343 | return qh; | 1335 | return irqret; |
| 1344 | } | 1336 | } |
| 1345 | 1337 | ||
| 1346 | static void qtd_list_free(struct urb *urb, struct list_head *qtd_list) | 1338 | static int qtd_fill(struct isp1760_qtd *qtd, void *databuffer, size_t len) |
| 1347 | { | 1339 | { |
| 1348 | struct list_head *entry, *temp; | 1340 | qtd->data_buffer = databuffer; |
| 1349 | 1341 | ||
| 1350 | list_for_each_safe(entry, temp, qtd_list) { | 1342 | if (len > MAX_PAYLOAD_SIZE) |
| 1351 | struct isp1760_qtd *qtd; | 1343 | len = MAX_PAYLOAD_SIZE; |
| 1344 | qtd->length = len; | ||
| 1352 | 1345 | ||
| 1353 | qtd = list_entry(entry, struct isp1760_qtd, qtd_list); | 1346 | return qtd->length; |
| 1354 | list_del(&qtd->qtd_list); | ||
| 1355 | isp1760_qtd_free(qtd); | ||
| 1356 | } | ||
| 1357 | } | 1347 | } |
| 1358 | 1348 | ||
| 1359 | static int isp1760_prepare_enqueue(struct usb_hcd *hcd, struct urb *urb, | 1349 | static void qtd_list_free(struct list_head *qtd_list) |
| 1360 | struct list_head *qtd_list, gfp_t mem_flags, packet_enqueue *p) | ||
| 1361 | { | 1350 | { |
| 1362 | struct isp1760_hcd *priv = hcd_to_priv(hcd); | 1351 | struct isp1760_qtd *qtd, *qtd_next; |
| 1363 | struct isp1760_qtd *qtd; | ||
| 1364 | int epnum; | ||
| 1365 | unsigned long flags; | ||
| 1366 | struct isp1760_qh *qh = NULL; | ||
| 1367 | int rc; | ||
| 1368 | int qh_busy; | ||
| 1369 | |||
| 1370 | qtd = list_entry(qtd_list->next, struct isp1760_qtd, qtd_list); | ||
| 1371 | epnum = urb->ep->desc.bEndpointAddress; | ||
| 1372 | |||
| 1373 | spin_lock_irqsave(&priv->lock, flags); | ||
| 1374 | if (!HCD_HW_ACCESSIBLE(hcd)) { | ||
| 1375 | rc = -ESHUTDOWN; | ||
| 1376 | goto done; | ||
| 1377 | } | ||
| 1378 | rc = usb_hcd_link_urb_to_ep(hcd, urb); | ||
| 1379 | if (rc) | ||
| 1380 | goto done; | ||
| 1381 | |||
| 1382 | qh = urb->ep->hcpriv; | ||
| 1383 | if (qh) | ||
| 1384 | qh_busy = !list_empty(&qh->qtd_list); | ||
| 1385 | else | ||
| 1386 | qh_busy = 0; | ||
| 1387 | 1352 | ||
| 1388 | qh = qh_append_tds(hcd, urb, qtd_list, epnum, &urb->ep->hcpriv); | 1353 | list_for_each_entry_safe(qtd, qtd_next, qtd_list, qtd_list) { |
| 1389 | if (!qh) { | 1354 | list_del(&qtd->qtd_list); |
| 1390 | usb_hcd_unlink_urb_from_ep(hcd, urb); | 1355 | qtd_free(qtd); |
| 1391 | rc = -ENOMEM; | ||
| 1392 | goto done; | ||
| 1393 | } | 1356 | } |
| 1394 | |||
| 1395 | if (!qh_busy) | ||
| 1396 | p(hcd, qh, qtd); | ||
| 1397 | |||
| 1398 | done: | ||
| 1399 | spin_unlock_irqrestore(&priv->lock, flags); | ||
| 1400 | if (!qh) | ||
| 1401 | qtd_list_free(urb, qtd_list); | ||
| 1402 | return rc; | ||
| 1403 | } | ||
| 1404 | |||
| 1405 | static struct isp1760_qtd *isp1760_qtd_alloc(gfp_t flags) | ||
| 1406 | { | ||
| 1407 | struct isp1760_qtd *qtd; | ||
| 1408 | |||
| 1409 | qtd = kmem_cache_zalloc(qtd_cachep, flags); | ||
| 1410 | if (qtd) | ||
| 1411 | INIT_LIST_HEAD(&qtd->qtd_list); | ||
| 1412 | |||
| 1413 | return qtd; | ||
| 1414 | } | 1357 | } |
| 1415 | 1358 | ||
| 1416 | /* | 1359 | /* |
| 1417 | * create a list of filled qtds for this URB; won't link into qh. | 1360 | * Packetize urb->transfer_buffer into list of packets of size wMaxPacketSize. |
| 1361 | * Also calculate the PID type (SETUP/IN/OUT) for each packet. | ||
| 1418 | */ | 1362 | */ |
| 1419 | #define max_packet(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff) | 1363 | #define max_packet(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff) |
| 1420 | static struct list_head *qh_urb_transaction(struct usb_hcd *hcd, | 1364 | static void packetize_urb(struct usb_hcd *hcd, |
| 1421 | struct urb *urb, struct list_head *head, gfp_t flags) | 1365 | struct urb *urb, struct list_head *head, gfp_t flags) |
| 1422 | { | 1366 | { |
| 1423 | struct isp1760_qtd *qtd; | 1367 | struct isp1760_qtd *qtd; |
| 1424 | void *buf; | 1368 | void *buf; |
| 1425 | int len, maxpacket; | 1369 | int len, maxpacketsize; |
| 1426 | int is_input; | 1370 | u8 packet_type; |
| 1427 | u32 token; | ||
| 1428 | 1371 | ||
| 1429 | /* | 1372 | /* |
| 1430 | * URBs map to sequences of QTDs: one logical transaction | 1373 | * URBs map to sequences of QTDs: one logical transaction |
| 1431 | */ | 1374 | */ |
| 1432 | qtd = isp1760_qtd_alloc(flags); | ||
| 1433 | if (!qtd) | ||
| 1434 | return NULL; | ||
| 1435 | 1375 | ||
| 1436 | list_add_tail(&qtd->qtd_list, head); | 1376 | if (!urb->transfer_buffer && urb->transfer_buffer_length) { |
| 1437 | qtd->urb = urb; | 1377 | /* XXX This looks like usb storage / SCSI bug */ |
| 1438 | urb->status = -EINPROGRESS; | 1378 | dev_err(hcd->self.controller, |
| 1379 | "buf is null, dma is %08lx len is %d\n", | ||
| 1380 | (long unsigned)urb->transfer_dma, | ||
| 1381 | urb->transfer_buffer_length); | ||
| 1382 | WARN_ON(1); | ||
| 1383 | } | ||
| 1439 | 1384 | ||
| 1440 | token = 0; | 1385 | if (usb_pipein(urb->pipe)) |
| 1441 | /* for split transactions, SplitXState initialized to zero */ | 1386 | packet_type = IN_PID; |
| 1387 | else | ||
| 1388 | packet_type = OUT_PID; | ||
| 1442 | 1389 | ||
| 1443 | len = urb->transfer_buffer_length; | ||
| 1444 | is_input = usb_pipein(urb->pipe); | ||
| 1445 | if (usb_pipecontrol(urb->pipe)) { | 1390 | if (usb_pipecontrol(urb->pipe)) { |
| 1446 | /* SETUP pid */ | 1391 | qtd = qtd_alloc(flags, urb, SETUP_PID); |
| 1447 | qtd_fill(qtd, urb->setup_packet, | ||
| 1448 | sizeof(struct usb_ctrlrequest), | ||
| 1449 | token | SETUP_PID); | ||
| 1450 | |||
| 1451 | /* ... and always at least one more pid */ | ||
| 1452 | qtd = isp1760_qtd_alloc(flags); | ||
| 1453 | if (!qtd) | 1392 | if (!qtd) |
| 1454 | goto cleanup; | 1393 | goto cleanup; |
| 1455 | qtd->urb = urb; | 1394 | qtd_fill(qtd, urb->setup_packet, sizeof(struct usb_ctrlrequest)); |
| 1456 | list_add_tail(&qtd->qtd_list, head); | 1395 | list_add_tail(&qtd->qtd_list, head); |
| 1457 | 1396 | ||
| 1458 | /* for zero length DATA stages, STATUS is always IN */ | 1397 | /* for zero length DATA stages, STATUS is always IN */ |
| 1459 | if (len == 0) | 1398 | if (urb->transfer_buffer_length == 0) |
| 1460 | token |= IN_PID; | 1399 | packet_type = IN_PID; |
| 1461 | } | 1400 | } |
| 1462 | 1401 | ||
| 1463 | /* | 1402 | maxpacketsize = max_packet(usb_maxpacket(urb->dev, urb->pipe, |
| 1464 | * data transfer stage: buffer setup | 1403 | usb_pipeout(urb->pipe))); |
| 1465 | */ | ||
| 1466 | buf = urb->transfer_buffer; | ||
| 1467 | |||
| 1468 | if (is_input) | ||
| 1469 | token |= IN_PID; | ||
| 1470 | else | ||
| 1471 | token |= OUT_PID; | ||
| 1472 | |||
| 1473 | maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input)); | ||
| 1474 | 1404 | ||
| 1475 | /* | 1405 | /* |
| 1476 | * buffer gets wrapped in one or more qtds; | 1406 | * buffer gets wrapped in one or more qtds; |
| 1477 | * last one may be "short" (including zero len) | 1407 | * last one may be "short" (including zero len) |
| 1478 | * and may serve as a control status ack | 1408 | * and may serve as a control status ack |
| 1479 | */ | 1409 | */ |
| 1410 | buf = urb->transfer_buffer; | ||
| 1411 | len = urb->transfer_buffer_length; | ||
| 1412 | |||
| 1480 | for (;;) { | 1413 | for (;;) { |
| 1481 | int this_qtd_len; | 1414 | int this_qtd_len; |
| 1482 | 1415 | ||
| 1483 | if (!buf && len) { | 1416 | qtd = qtd_alloc(flags, urb, packet_type); |
| 1484 | /* XXX This looks like usb storage / SCSI bug */ | 1417 | if (!qtd) |
| 1485 | dev_err(hcd->self.controller, "buf is null, dma is %08lx len is %d\n", | 1418 | goto cleanup; |
| 1486 | (long unsigned)urb->transfer_dma, len); | 1419 | this_qtd_len = qtd_fill(qtd, buf, len); |
| 1487 | WARN_ON(1); | 1420 | list_add_tail(&qtd->qtd_list, head); |
| 1488 | } | ||
| 1489 | 1421 | ||
| 1490 | this_qtd_len = qtd_fill(qtd, buf, len, token); | ||
| 1491 | len -= this_qtd_len; | 1422 | len -= this_qtd_len; |
| 1492 | buf += this_qtd_len; | 1423 | buf += this_qtd_len; |
| 1493 | 1424 | ||
| 1494 | if (len <= 0) | 1425 | if (len <= 0) |
| 1495 | break; | 1426 | break; |
| 1496 | |||
| 1497 | qtd = isp1760_qtd_alloc(flags); | ||
| 1498 | if (!qtd) | ||
| 1499 | goto cleanup; | ||
| 1500 | qtd->urb = urb; | ||
| 1501 | list_add_tail(&qtd->qtd_list, head); | ||
| 1502 | } | 1427 | } |
| 1503 | 1428 | ||
| 1504 | /* | 1429 | /* |
| @@ -1510,184 +1435,204 @@ static struct list_head *qh_urb_transaction(struct usb_hcd *hcd, | |||
| 1510 | 1435 | ||
| 1511 | if (usb_pipecontrol(urb->pipe)) { | 1436 | if (usb_pipecontrol(urb->pipe)) { |
| 1512 | one_more = 1; | 1437 | one_more = 1; |
| 1513 | /* "in" <--> "out" */ | 1438 | if (packet_type == IN_PID) |
| 1514 | token ^= IN_PID; | 1439 | packet_type = OUT_PID; |
| 1440 | else | ||
| 1441 | packet_type = IN_PID; | ||
| 1515 | } else if (usb_pipebulk(urb->pipe) | 1442 | } else if (usb_pipebulk(urb->pipe) |
| 1516 | && (urb->transfer_flags & URB_ZERO_PACKET) | 1443 | && (urb->transfer_flags & URB_ZERO_PACKET) |
| 1517 | && !(urb->transfer_buffer_length % maxpacket)) { | 1444 | && !(urb->transfer_buffer_length % |
| 1445 | maxpacketsize)) { | ||
| 1518 | one_more = 1; | 1446 | one_more = 1; |
| 1519 | } | 1447 | } |
| 1520 | if (one_more) { | 1448 | if (one_more) { |
| 1521 | qtd = isp1760_qtd_alloc(flags); | 1449 | qtd = qtd_alloc(flags, urb, packet_type); |
| 1522 | if (!qtd) | 1450 | if (!qtd) |
| 1523 | goto cleanup; | 1451 | goto cleanup; |
| 1524 | qtd->urb = urb; | ||
| 1525 | list_add_tail(&qtd->qtd_list, head); | ||
| 1526 | 1452 | ||
| 1527 | /* never any data in such packets */ | 1453 | /* never any data in such packets */ |
| 1528 | qtd_fill(qtd, NULL, 0, token); | 1454 | qtd_fill(qtd, NULL, 0); |
| 1455 | list_add_tail(&qtd->qtd_list, head); | ||
| 1529 | } | 1456 | } |
| 1530 | } | 1457 | } |
| 1531 | 1458 | ||
| 1532 | qtd->status = 0; | 1459 | return; |
| 1533 | return head; | ||
| 1534 | 1460 | ||
| 1535 | cleanup: | 1461 | cleanup: |
| 1536 | qtd_list_free(urb, head); | 1462 | qtd_list_free(head); |
| 1537 | return NULL; | ||
| 1538 | } | 1463 | } |
| 1539 | 1464 | ||
| 1540 | static int isp1760_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, | 1465 | static int isp1760_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, |
| 1541 | gfp_t mem_flags) | 1466 | gfp_t mem_flags) |
| 1542 | { | 1467 | { |
| 1543 | struct list_head qtd_list; | 1468 | struct isp1760_hcd *priv = hcd_to_priv(hcd); |
| 1544 | packet_enqueue *pe; | 1469 | struct list_head *ep_queue; |
| 1545 | 1470 | struct isp1760_qh *qh, *qhit; | |
| 1546 | INIT_LIST_HEAD(&qtd_list); | 1471 | unsigned long spinflags; |
| 1472 | LIST_HEAD(new_qtds); | ||
| 1473 | int retval; | ||
| 1474 | int qh_in_queue; | ||
| 1547 | 1475 | ||
| 1548 | switch (usb_pipetype(urb->pipe)) { | 1476 | switch (usb_pipetype(urb->pipe)) { |
| 1549 | case PIPE_CONTROL: | 1477 | case PIPE_CONTROL: |
| 1478 | ep_queue = &priv->controlqhs; | ||
| 1479 | break; | ||
| 1550 | case PIPE_BULK: | 1480 | case PIPE_BULK: |
| 1551 | if (!qh_urb_transaction(hcd, urb, &qtd_list, mem_flags)) | 1481 | ep_queue = &priv->bulkqhs; |
| 1552 | return -ENOMEM; | ||
| 1553 | pe = enqueue_an_ATL_packet; | ||
| 1554 | break; | 1482 | break; |
| 1555 | |||
| 1556 | case PIPE_INTERRUPT: | 1483 | case PIPE_INTERRUPT: |
| 1557 | if (!qh_urb_transaction(hcd, urb, &qtd_list, mem_flags)) | 1484 | if (urb->interval < 0) |
| 1558 | return -ENOMEM; | 1485 | return -EINVAL; |
| 1559 | pe = enqueue_an_INT_packet; | 1486 | /* FIXME: Check bandwidth */ |
| 1487 | ep_queue = &priv->interruptqhs; | ||
| 1560 | break; | 1488 | break; |
| 1561 | |||
| 1562 | case PIPE_ISOCHRONOUS: | 1489 | case PIPE_ISOCHRONOUS: |
| 1563 | dev_err(hcd->self.controller, "PIPE_ISOCHRONOUS ain't supported\n"); | 1490 | dev_err(hcd->self.controller, "%s: isochronous USB packets " |
| 1491 | "not yet supported\n", | ||
| 1492 | __func__); | ||
| 1493 | return -EPIPE; | ||
| 1564 | default: | 1494 | default: |
| 1495 | dev_err(hcd->self.controller, "%s: unknown pipe type\n", | ||
| 1496 | __func__); | ||
| 1565 | return -EPIPE; | 1497 | return -EPIPE; |
| 1566 | } | 1498 | } |
| 1567 | 1499 | ||
| 1568 | return isp1760_prepare_enqueue(hcd, urb, &qtd_list, mem_flags, pe); | 1500 | if (usb_pipein(urb->pipe)) |
| 1569 | } | 1501 | urb->actual_length = 0; |
| 1570 | |||
| 1571 | static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | ||
| 1572 | { | ||
| 1573 | struct isp1760_hcd *priv = hcd_to_priv(hcd); | ||
| 1574 | struct inter_packet_info *ints; | ||
| 1575 | u32 i; | ||
| 1576 | u32 reg_base, or_reg, skip_reg; | ||
| 1577 | unsigned long flags; | ||
| 1578 | struct ptd ptd; | ||
| 1579 | packet_enqueue *pe; | ||
| 1580 | 1502 | ||
| 1581 | switch (usb_pipetype(urb->pipe)) { | 1503 | packetize_urb(hcd, urb, &new_qtds, mem_flags); |
| 1582 | case PIPE_ISOCHRONOUS: | 1504 | if (list_empty(&new_qtds)) |
| 1583 | return -EPIPE; | 1505 | return -ENOMEM; |
| 1584 | break; | 1506 | urb->hcpriv = NULL; /* Used to signal unlink to interrupt handler */ |
| 1585 | 1507 | ||
| 1586 | case PIPE_INTERRUPT: | 1508 | retval = 0; |
| 1587 | ints = priv->int_ints; | 1509 | spin_lock_irqsave(&priv->lock, spinflags); |
| 1588 | reg_base = INT_PTD_OFFSET; | ||
| 1589 | or_reg = HC_INT_IRQ_MASK_OR_REG; | ||
| 1590 | skip_reg = HC_INT_PTD_SKIPMAP_REG; | ||
| 1591 | pe = enqueue_an_INT_packet; | ||
| 1592 | break; | ||
| 1593 | 1510 | ||
| 1594 | default: | 1511 | if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { |
| 1595 | ints = priv->atl_ints; | 1512 | retval = -ESHUTDOWN; |
| 1596 | reg_base = ATL_PTD_OFFSET; | 1513 | goto out; |
| 1597 | or_reg = HC_ATL_IRQ_MASK_OR_REG; | ||
| 1598 | skip_reg = HC_ATL_PTD_SKIPMAP_REG; | ||
| 1599 | pe = enqueue_an_ATL_packet; | ||
| 1600 | break; | ||
| 1601 | } | 1514 | } |
| 1515 | retval = usb_hcd_link_urb_to_ep(hcd, urb); | ||
| 1516 | if (retval) | ||
| 1517 | goto out; | ||
| 1602 | 1518 | ||
| 1603 | memset(&ptd, 0, sizeof(ptd)); | 1519 | qh = urb->ep->hcpriv; |
| 1604 | spin_lock_irqsave(&priv->lock, flags); | 1520 | if (qh) { |
| 1605 | 1521 | qh_in_queue = 0; | |
| 1606 | for (i = 0; i < 32; i++) { | 1522 | list_for_each_entry(qhit, ep_queue, qh_list) { |
| 1607 | if (!ints[i].qh) | 1523 | if (qhit == qh) { |
| 1608 | continue; | 1524 | qh_in_queue = 1; |
| 1609 | BUG_ON(!ints[i].qtd); | 1525 | break; |
| 1526 | } | ||
| 1527 | } | ||
| 1528 | if (!qh_in_queue) | ||
| 1529 | list_add_tail(&qh->qh_list, ep_queue); | ||
| 1530 | } else { | ||
| 1531 | qh = qh_alloc(GFP_ATOMIC); | ||
| 1532 | if (!qh) { | ||
| 1533 | retval = -ENOMEM; | ||
| 1534 | goto out; | ||
| 1535 | } | ||
| 1536 | list_add_tail(&qh->qh_list, ep_queue); | ||
| 1537 | urb->ep->hcpriv = qh; | ||
| 1538 | } | ||
| 1610 | 1539 | ||
| 1611 | if (ints[i].qtd->urb == urb) { | 1540 | list_splice_tail(&new_qtds, &qh->qtd_list); |
| 1612 | u32 skip_map; | 1541 | schedule_ptds(hcd); |
| 1613 | u32 or_map; | ||
| 1614 | struct isp1760_qtd *qtd; | ||
| 1615 | struct isp1760_qh *qh; | ||
| 1616 | 1542 | ||
| 1617 | skip_map = reg_read32(hcd->regs, skip_reg); | 1543 | out: |
| 1618 | skip_map |= 1 << i; | 1544 | spin_unlock_irqrestore(&priv->lock, spinflags); |
| 1619 | reg_write32(hcd->regs, skip_reg, skip_map); | 1545 | return retval; |
| 1546 | } | ||
| 1620 | 1547 | ||
| 1621 | or_map = reg_read32(hcd->regs, or_reg); | 1548 | static void kill_transfer(struct usb_hcd *hcd, struct urb *urb, |
| 1622 | or_map &= ~(1 << i); | 1549 | struct isp1760_qh *qh) |
| 1623 | reg_write32(hcd->regs, or_reg, or_map); | 1550 | { |
| 1551 | struct isp1760_hcd *priv = hcd_to_priv(hcd); | ||
| 1552 | int skip_map; | ||
| 1624 | 1553 | ||
| 1625 | ptd_write(hcd->regs, reg_base, i, &ptd); | 1554 | WARN_ON(qh->slot == -1); |
| 1626 | 1555 | ||
| 1627 | qtd = ints[i].qtd; | 1556 | /* We need to forcefully reclaim the slot since some transfers never |
| 1628 | qh = ints[i].qh; | 1557 | return, e.g. interrupt transfers and NAKed bulk transfers. */ |
| 1558 | if (usb_pipebulk(urb->pipe)) { | ||
| 1559 | skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); | ||
| 1560 | skip_map |= (1 << qh->slot); | ||
| 1561 | reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); | ||
| 1562 | priv->atl_slots[qh->slot].qh = NULL; | ||
| 1563 | priv->atl_slots[qh->slot].qtd = NULL; | ||
| 1564 | } else { | ||
| 1565 | skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG); | ||
| 1566 | skip_map |= (1 << qh->slot); | ||
| 1567 | reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map); | ||
| 1568 | priv->int_slots[qh->slot].qh = NULL; | ||
| 1569 | priv->int_slots[qh->slot].qtd = NULL; | ||
| 1570 | } | ||
| 1629 | 1571 | ||
| 1630 | free_mem(hcd, qtd); | 1572 | qh->slot = -1; |
| 1631 | qtd = clean_up_qtdlist(qtd, qh); | 1573 | priv->active_ptds--; |
| 1574 | } | ||
| 1632 | 1575 | ||
| 1633 | ints[i].qh = NULL; | 1576 | static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, |
| 1634 | ints[i].qtd = NULL; | 1577 | int status) |
| 1578 | { | ||
| 1579 | struct isp1760_hcd *priv = hcd_to_priv(hcd); | ||
| 1580 | unsigned long spinflags; | ||
| 1581 | struct isp1760_qh *qh; | ||
| 1582 | struct isp1760_qtd *qtd; | ||
| 1583 | int retval = 0; | ||
| 1635 | 1584 | ||
| 1636 | urb->status = status; | 1585 | spin_lock_irqsave(&priv->lock, spinflags); |
| 1637 | isp1760_urb_done(hcd, urb); | ||
| 1638 | if (qtd) | ||
| 1639 | pe(hcd, qh, qtd); | ||
| 1640 | break; | ||
| 1641 | 1586 | ||
| 1642 | } else { | 1587 | qh = urb->ep->hcpriv; |
| 1643 | struct isp1760_qtd *qtd; | 1588 | if (!qh) { |
| 1644 | 1589 | retval = -EINVAL; | |
| 1645 | list_for_each_entry(qtd, &ints[i].qtd->qtd_list, | 1590 | goto out; |
| 1646 | qtd_list) { | 1591 | } |
| 1647 | if (qtd->urb == urb) { | ||
| 1648 | clean_up_qtdlist(qtd, ints[i].qh); | ||
| 1649 | isp1760_urb_done(hcd, urb); | ||
| 1650 | qtd = NULL; | ||
| 1651 | break; | ||
| 1652 | } | ||
| 1653 | } | ||
| 1654 | 1592 | ||
| 1655 | /* We found the urb before the last slot */ | 1593 | list_for_each_entry(qtd, &qh->qtd_list, qtd_list) |
| 1656 | if (!qtd) | 1594 | if (qtd->urb == urb) { |
| 1657 | break; | 1595 | if (qtd->status == QTD_XFER_STARTED) |
| 1596 | kill_transfer(hcd, urb, qh); | ||
| 1597 | qtd->status = QTD_RETIRE; | ||
| 1658 | } | 1598 | } |
| 1659 | } | ||
| 1660 | 1599 | ||
| 1661 | spin_unlock_irqrestore(&priv->lock, flags); | 1600 | urb->status = status; |
| 1662 | return 0; | 1601 | schedule_ptds(hcd); |
| 1602 | |||
| 1603 | out: | ||
| 1604 | spin_unlock_irqrestore(&priv->lock, spinflags); | ||
| 1605 | return retval; | ||
| 1663 | } | 1606 | } |
| 1664 | 1607 | ||
| 1665 | static irqreturn_t isp1760_irq(struct usb_hcd *hcd) | 1608 | static void isp1760_endpoint_disable(struct usb_hcd *hcd, |
| 1609 | struct usb_host_endpoint *ep) | ||
| 1666 | { | 1610 | { |
| 1667 | struct isp1760_hcd *priv = hcd_to_priv(hcd); | 1611 | struct isp1760_hcd *priv = hcd_to_priv(hcd); |
| 1668 | u32 imask; | 1612 | unsigned long spinflags; |
| 1669 | irqreturn_t irqret = IRQ_NONE; | 1613 | struct isp1760_qh *qh; |
| 1614 | struct isp1760_qtd *qtd; | ||
| 1670 | 1615 | ||
| 1671 | spin_lock(&priv->lock); | 1616 | spin_lock_irqsave(&priv->lock, spinflags); |
| 1672 | 1617 | ||
| 1673 | if (!(hcd->state & HC_STATE_RUNNING)) | 1618 | qh = ep->hcpriv; |
| 1674 | goto leave; | 1619 | if (!qh) |
| 1620 | goto out; | ||
| 1675 | 1621 | ||
| 1676 | imask = reg_read32(hcd->regs, HC_INTERRUPT_REG); | 1622 | list_for_each_entry(qtd, &qh->qtd_list, qtd_list) { |
| 1677 | if (unlikely(!imask)) | 1623 | if (qtd->status == QTD_XFER_STARTED) |
| 1678 | goto leave; | 1624 | kill_transfer(hcd, qtd->urb, qh); |
| 1625 | qtd->status = QTD_RETIRE; | ||
| 1626 | qtd->urb->status = -ECONNRESET; | ||
| 1627 | } | ||
| 1679 | 1628 | ||
| 1680 | reg_write32(hcd->regs, HC_INTERRUPT_REG, imask); | 1629 | ep->hcpriv = NULL; |
| 1681 | if (imask & (HC_ATL_INT | HC_SOT_INT)) | 1630 | /* Cannot free qh here since it will be parsed by schedule_ptds() */ |
| 1682 | do_atl_int(hcd); | ||
| 1683 | 1631 | ||
| 1684 | if (imask & HC_INTL_INT) | 1632 | schedule_ptds(hcd); |
| 1685 | do_intl_int(hcd); | ||
| 1686 | 1633 | ||
| 1687 | irqret = IRQ_HANDLED; | 1634 | out: |
| 1688 | leave: | 1635 | spin_unlock_irqrestore(&priv->lock, spinflags); |
| 1689 | spin_unlock(&priv->lock); | ||
| 1690 | return irqret; | ||
| 1691 | } | 1636 | } |
| 1692 | 1637 | ||
| 1693 | static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf) | 1638 | static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf) |
| @@ -1778,7 +1723,7 @@ static int check_reset_complete(struct usb_hcd *hcd, int index, | |||
| 1778 | /* if reset finished and it's still not enabled -- handoff */ | 1723 | /* if reset finished and it's still not enabled -- handoff */ |
| 1779 | if (!(port_status & PORT_PE)) { | 1724 | if (!(port_status & PORT_PE)) { |
| 1780 | 1725 | ||
| 1781 | dev_err(hcd->self.controller, | 1726 | dev_info(hcd->self.controller, |
| 1782 | "port %d full speed --> companion\n", | 1727 | "port %d full speed --> companion\n", |
| 1783 | index + 1); | 1728 | index + 1); |
| 1784 | 1729 | ||
| @@ -1787,7 +1732,7 @@ static int check_reset_complete(struct usb_hcd *hcd, int index, | |||
| 1787 | reg_write32(hcd->regs, HC_PORTSC1, port_status); | 1732 | reg_write32(hcd->regs, HC_PORTSC1, port_status); |
| 1788 | 1733 | ||
| 1789 | } else | 1734 | } else |
| 1790 | dev_err(hcd->self.controller, "port %d high speed\n", | 1735 | dev_info(hcd->self.controller, "port %d high speed\n", |
| 1791 | index + 1); | 1736 | index + 1); |
| 1792 | 1737 | ||
| 1793 | return port_status; | 1738 | return port_status; |
| @@ -2059,51 +2004,6 @@ error: | |||
| 2059 | return retval; | 2004 | return retval; |
| 2060 | } | 2005 | } |
| 2061 | 2006 | ||
| 2062 | static void isp1760_endpoint_disable(struct usb_hcd *hcd, | ||
| 2063 | struct usb_host_endpoint *ep) | ||
| 2064 | { | ||
| 2065 | struct isp1760_hcd *priv = hcd_to_priv(hcd); | ||
| 2066 | struct isp1760_qh *qh; | ||
| 2067 | struct isp1760_qtd *qtd; | ||
| 2068 | unsigned long flags; | ||
| 2069 | |||
| 2070 | spin_lock_irqsave(&priv->lock, flags); | ||
| 2071 | qh = ep->hcpriv; | ||
| 2072 | if (!qh) | ||
| 2073 | goto out; | ||
| 2074 | |||
| 2075 | ep->hcpriv = NULL; | ||
| 2076 | do { | ||
| 2077 | /* more than entry might get removed */ | ||
| 2078 | if (list_empty(&qh->qtd_list)) | ||
| 2079 | break; | ||
| 2080 | |||
| 2081 | qtd = list_first_entry(&qh->qtd_list, struct isp1760_qtd, | ||
| 2082 | qtd_list); | ||
| 2083 | |||
| 2084 | if (qtd->status & URB_ENQUEUED) { | ||
| 2085 | spin_unlock_irqrestore(&priv->lock, flags); | ||
| 2086 | isp1760_urb_dequeue(hcd, qtd->urb, -ECONNRESET); | ||
| 2087 | spin_lock_irqsave(&priv->lock, flags); | ||
| 2088 | } else { | ||
| 2089 | struct urb *urb; | ||
| 2090 | |||
| 2091 | urb = qtd->urb; | ||
| 2092 | clean_up_qtdlist(qtd, qh); | ||
| 2093 | urb->status = -ECONNRESET; | ||
| 2094 | isp1760_urb_done(hcd, urb); | ||
| 2095 | } | ||
| 2096 | } while (1); | ||
| 2097 | |||
| 2098 | qh_destroy(qh); | ||
| 2099 | /* remove requests and leak them. | ||
| 2100 | * ATL are pretty fast done, INT could take a while... | ||
| 2101 | * The latter shoule be removed | ||
| 2102 | */ | ||
| 2103 | out: | ||
| 2104 | spin_unlock_irqrestore(&priv->lock, flags); | ||
| 2105 | } | ||
| 2106 | |||
| 2107 | static int isp1760_get_frame(struct usb_hcd *hcd) | 2007 | static int isp1760_get_frame(struct usb_hcd *hcd) |
| 2108 | { | 2008 | { |
| 2109 | struct isp1760_hcd *priv = hcd_to_priv(hcd); | 2009 | struct isp1760_hcd *priv = hcd_to_priv(hcd); |
| @@ -2165,6 +2065,13 @@ static const struct hc_driver isp1760_hc_driver = { | |||
| 2165 | 2065 | ||
| 2166 | int __init init_kmem_once(void) | 2066 | int __init init_kmem_once(void) |
| 2167 | { | 2067 | { |
| 2068 | urb_listitem_cachep = kmem_cache_create("isp1760 urb_listitem", | ||
| 2069 | sizeof(struct urb_listitem), 0, SLAB_TEMPORARY | | ||
| 2070 | SLAB_MEM_SPREAD, NULL); | ||
| 2071 | |||
| 2072 | if (!urb_listitem_cachep) | ||
| 2073 | return -ENOMEM; | ||
| 2074 | |||
| 2168 | qtd_cachep = kmem_cache_create("isp1760_qtd", | 2075 | qtd_cachep = kmem_cache_create("isp1760_qtd", |
| 2169 | sizeof(struct isp1760_qtd), 0, SLAB_TEMPORARY | | 2076 | sizeof(struct isp1760_qtd), 0, SLAB_TEMPORARY | |
| 2170 | SLAB_MEM_SPREAD, NULL); | 2077 | SLAB_MEM_SPREAD, NULL); |
| @@ -2187,6 +2094,7 @@ void deinit_kmem_cache(void) | |||
| 2187 | { | 2094 | { |
| 2188 | kmem_cache_destroy(qtd_cachep); | 2095 | kmem_cache_destroy(qtd_cachep); |
| 2189 | kmem_cache_destroy(qh_cachep); | 2096 | kmem_cache_destroy(qh_cachep); |
| 2097 | kmem_cache_destroy(urb_listitem_cachep); | ||
| 2190 | } | 2098 | } |
| 2191 | 2099 | ||
| 2192 | struct usb_hcd *isp1760_register(phys_addr_t res_start, resource_size_t res_len, | 2100 | struct usb_hcd *isp1760_register(phys_addr_t res_start, resource_size_t res_len, |
diff --git a/drivers/usb/host/isp1760-hcd.h b/drivers/usb/host/isp1760-hcd.h index 87050769060..014a7dfadf9 100644 --- a/drivers/usb/host/isp1760-hcd.h +++ b/drivers/usb/host/isp1760-hcd.h | |||
| @@ -49,10 +49,9 @@ void deinit_kmem_cache(void); | |||
| 49 | #define SW_RESET_RESET_ALL (1 << 0) | 49 | #define SW_RESET_RESET_ALL (1 << 0) |
| 50 | 50 | ||
| 51 | #define HC_BUFFER_STATUS_REG 0x334 | 51 | #define HC_BUFFER_STATUS_REG 0x334 |
| 52 | #define ATL_BUFFER 0x1 | 52 | #define ISO_BUF_FILL (1 << 2) |
| 53 | #define INT_BUFFER 0x2 | 53 | #define INT_BUF_FILL (1 << 1) |
| 54 | #define ISO_BUFFER 0x4 | 54 | #define ATL_BUF_FILL (1 << 0) |
| 55 | #define BUFFER_MAP 0x7 | ||
| 56 | 55 | ||
| 57 | #define HC_MEMORY_REG 0x33c | 56 | #define HC_MEMORY_REG 0x33c |
| 58 | #define ISP_BANK(x) ((x) << 16) | 57 | #define ISP_BANK(x) ((x) << 16) |
| @@ -68,14 +67,13 @@ void deinit_kmem_cache(void); | |||
| 68 | #define HC_INTERRUPT_REG 0x310 | 67 | #define HC_INTERRUPT_REG 0x310 |
| 69 | 68 | ||
| 70 | #define HC_INTERRUPT_ENABLE 0x314 | 69 | #define HC_INTERRUPT_ENABLE 0x314 |
| 71 | #define INTERRUPT_ENABLE_MASK (HC_INTL_INT | HC_ATL_INT | HC_EOT_INT) | ||
| 72 | #define INTERRUPT_ENABLE_SOT_MASK (HC_INTL_INT | HC_SOT_INT | HC_EOT_INT) | ||
| 73 | |||
| 74 | #define HC_ISO_INT (1 << 9) | 70 | #define HC_ISO_INT (1 << 9) |
| 75 | #define HC_ATL_INT (1 << 8) | 71 | #define HC_ATL_INT (1 << 8) |
| 76 | #define HC_INTL_INT (1 << 7) | 72 | #define HC_INTL_INT (1 << 7) |
| 77 | #define HC_EOT_INT (1 << 3) | 73 | #define HC_EOT_INT (1 << 3) |
| 78 | #define HC_SOT_INT (1 << 1) | 74 | #define HC_SOT_INT (1 << 1) |
| 75 | #define INTERRUPT_ENABLE_MASK (HC_INTL_INT | HC_ATL_INT) | ||
| 76 | #define INTERRUPT_ENABLE_SOT_MASK (HC_SOT_INT) | ||
| 79 | 77 | ||
| 80 | #define HC_ISO_IRQ_MASK_OR_REG 0x318 | 78 | #define HC_ISO_IRQ_MASK_OR_REG 0x318 |
| 81 | #define HC_INT_IRQ_MASK_OR_REG 0x31C | 79 | #define HC_INT_IRQ_MASK_OR_REG 0x31C |
| @@ -106,7 +104,7 @@ struct ptd { | |||
| 106 | #define ATL_PTD_OFFSET 0x0c00 | 104 | #define ATL_PTD_OFFSET 0x0c00 |
| 107 | #define PAYLOAD_OFFSET 0x1000 | 105 | #define PAYLOAD_OFFSET 0x1000 |
| 108 | 106 | ||
| 109 | struct inter_packet_info { | 107 | struct slotinfo { |
| 110 | struct isp1760_qh *qh; | 108 | struct isp1760_qh *qh; |
| 111 | struct isp1760_qtd *qtd; | 109 | struct isp1760_qtd *qtd; |
| 112 | }; | 110 | }; |
| @@ -156,54 +154,52 @@ struct memory_chunk { | |||
| 156 | 154 | ||
| 157 | /* ATL */ | 155 | /* ATL */ |
| 158 | /* DW0 */ | 156 | /* DW0 */ |
| 159 | #define PTD_VALID 1 | 157 | #define DW0_VALID_BIT 1 |
| 160 | #define PTD_LENGTH(x) (((u32) x) << 3) | 158 | #define FROM_DW0_VALID(x) ((x) & 0x01) |
| 161 | #define PTD_MAXPACKET(x) (((u32) x) << 18) | 159 | #define TO_DW0_LENGTH(x) (((u32) x) << 3) |
| 162 | #define PTD_MULTI(x) (((u32) x) << 29) | 160 | #define TO_DW0_MAXPACKET(x) (((u32) x) << 18) |
| 163 | #define PTD_ENDPOINT(x) (((u32) x) << 31) | 161 | #define TO_DW0_MULTI(x) (((u32) x) << 29) |
| 162 | #define TO_DW0_ENDPOINT(x) (((u32) x) << 31) | ||
| 164 | /* DW1 */ | 163 | /* DW1 */ |
| 165 | #define PTD_DEVICE_ADDR(x) (((u32) x) << 3) | 164 | #define TO_DW1_DEVICE_ADDR(x) (((u32) x) << 3) |
| 166 | #define PTD_PID_TOKEN(x) (((u32) x) << 10) | 165 | #define TO_DW1_PID_TOKEN(x) (((u32) x) << 10) |
| 167 | #define PTD_TRANS_BULK ((u32) 2 << 12) | 166 | #define DW1_TRANS_BULK ((u32) 2 << 12) |
| 168 | #define PTD_TRANS_INT ((u32) 3 << 12) | 167 | #define DW1_TRANS_INT ((u32) 3 << 12) |
| 169 | #define PTD_TRANS_SPLIT ((u32) 1 << 14) | 168 | #define DW1_TRANS_SPLIT ((u32) 1 << 14) |
| 170 | #define PTD_SE_USB_LOSPEED ((u32) 2 << 16) | 169 | #define DW1_SE_USB_LOSPEED ((u32) 2 << 16) |
| 171 | #define PTD_PORT_NUM(x) (((u32) x) << 18) | 170 | #define TO_DW1_PORT_NUM(x) (((u32) x) << 18) |
| 172 | #define PTD_HUB_NUM(x) (((u32) x) << 25) | 171 | #define TO_DW1_HUB_NUM(x) (((u32) x) << 25) |
| 173 | #define PTD_PING(x) (((u32) x) << 26) | ||
| 174 | /* DW2 */ | 172 | /* DW2 */ |
| 175 | #define PTD_RL_CNT(x) (((u32) x) << 25) | 173 | #define TO_DW2_DATA_START_ADDR(x) (((u32) x) << 8) |
| 176 | #define PTD_DATA_START_ADDR(x) (((u32) x) << 8) | 174 | #define TO_DW2_RL(x) ((x) << 25) |
| 177 | #define BASE_ADDR 0x1000 | 175 | #define FROM_DW2_RL(x) (((x) >> 25) & 0xf) |
| 178 | /* DW3 */ | 176 | /* DW3 */ |
| 179 | #define PTD_CERR(x) (((u32) x) << 23) | 177 | #define FROM_DW3_NRBYTESTRANSFERRED(x) ((x) & 0x7fff) |
| 180 | #define PTD_NAC_CNT(x) (((u32) x) << 19) | 178 | #define FROM_DW3_SCS_NRBYTESTRANSFERRED(x) ((x) & 0x07ff) |
| 181 | #define PTD_ACTIVE ((u32) 1 << 31) | 179 | #define TO_DW3_NAKCOUNT(x) ((x) << 19) |
| 182 | #define PTD_DATA_TOGGLE(x) (((u32) x) << 25) | 180 | #define FROM_DW3_NAKCOUNT(x) (((x) >> 19) & 0xf) |
| 183 | 181 | #define TO_DW3_CERR(x) ((x) << 23) | |
| 184 | #define DW3_HALT_BIT (1 << 30) | 182 | #define FROM_DW3_CERR(x) (((x) >> 23) & 0x3) |
| 183 | #define TO_DW3_DATA_TOGGLE(x) ((x) << 25) | ||
| 184 | #define FROM_DW3_DATA_TOGGLE(x) (((x) >> 25) & 0x1) | ||
| 185 | #define TO_DW3_PING(x) ((x) << 26) | ||
| 186 | #define FROM_DW3_PING(x) (((x) >> 26) & 0x1) | ||
| 185 | #define DW3_ERROR_BIT (1 << 28) | 187 | #define DW3_ERROR_BIT (1 << 28) |
| 186 | #define DW3_QTD_ACTIVE (1 << 31) | 188 | #define DW3_BABBLE_BIT (1 << 29) |
| 189 | #define DW3_HALT_BIT (1 << 30) | ||
| 190 | #define DW3_ACTIVE_BIT (1 << 31) | ||
| 187 | 191 | ||
| 188 | #define INT_UNDERRUN (1 << 2) | 192 | #define INT_UNDERRUN (1 << 2) |
| 189 | #define INT_BABBLE (1 << 1) | 193 | #define INT_BABBLE (1 << 1) |
| 190 | #define INT_EXACT (1 << 0) | 194 | #define INT_EXACT (1 << 0) |
| 191 | 195 | ||
| 192 | #define DW1_GET_PID(x) (((x) >> 10) & 0x3) | ||
| 193 | #define PTD_XFERRED_LENGTH(x) ((x) & 0x7fff) | ||
| 194 | #define PTD_XFERRED_LENGTH_LO(x) ((x) & 0x7ff) | ||
| 195 | |||
| 196 | #define SETUP_PID (2) | 196 | #define SETUP_PID (2) |
| 197 | #define IN_PID (1) | 197 | #define IN_PID (1) |
| 198 | #define OUT_PID (0) | 198 | #define OUT_PID (0) |
| 199 | #define GET_QTD_TOKEN_TYPE(x) ((x) & 0x3) | ||
| 200 | |||
| 201 | #define DATA_TOGGLE (1 << 31) | ||
| 202 | #define GET_DATA_TOGGLE(x) ((x) >> 31) | ||
| 203 | 199 | ||
| 204 | /* Errata 1 */ | 200 | /* Errata 1 */ |
| 205 | #define RL_COUNTER (0) | 201 | #define RL_COUNTER (0) |
| 206 | #define NAK_COUNTER (0) | 202 | #define NAK_COUNTER (0) |
| 207 | #define ERR_COUNTER (2) | 203 | #define ERR_COUNTER (2) |
| 208 | 204 | ||
| 209 | #endif | 205 | #endif /* _ISP1760_HCD_H_ */ |
diff --git a/drivers/usb/host/octeon2-common.c b/drivers/usb/host/octeon2-common.c index 72d672cfcf3..d9df423f3d1 100644 --- a/drivers/usb/host/octeon2-common.c +++ b/drivers/usb/host/octeon2-common.c | |||
| @@ -3,18 +3,19 @@ | |||
| 3 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
| 4 | * for more details. | 4 | * for more details. |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2010 Cavium Networks | 6 | * Copyright (C) 2010, 2011 Cavium Networks |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #include <linux/module.h> | 9 | #include <linux/module.h> |
| 10 | #include <linux/mutex.h> | ||
| 10 | #include <linux/delay.h> | 11 | #include <linux/delay.h> |
| 11 | 12 | ||
| 12 | #include <asm/atomic.h> | ||
| 13 | |||
| 14 | #include <asm/octeon/octeon.h> | 13 | #include <asm/octeon/octeon.h> |
| 15 | #include <asm/octeon/cvmx-uctlx-defs.h> | 14 | #include <asm/octeon/cvmx-uctlx-defs.h> |
| 16 | 15 | ||
| 17 | static atomic_t octeon2_usb_clock_start_cnt = ATOMIC_INIT(0); | 16 | static DEFINE_MUTEX(octeon2_usb_clocks_mutex); |
| 17 | |||
| 18 | static int octeon2_usb_clock_start_cnt; | ||
| 18 | 19 | ||
| 19 | void octeon2_usb_clocks_start(void) | 20 | void octeon2_usb_clocks_start(void) |
| 20 | { | 21 | { |
| @@ -26,8 +27,12 @@ void octeon2_usb_clocks_start(void) | |||
| 26 | int i; | 27 | int i; |
| 27 | unsigned long io_clk_64_to_ns; | 28 | unsigned long io_clk_64_to_ns; |
| 28 | 29 | ||
| 29 | if (atomic_inc_return(&octeon2_usb_clock_start_cnt) != 1) | 30 | |
| 30 | return; | 31 | mutex_lock(&octeon2_usb_clocks_mutex); |
| 32 | |||
| 33 | octeon2_usb_clock_start_cnt++; | ||
| 34 | if (octeon2_usb_clock_start_cnt != 1) | ||
| 35 | goto exit; | ||
| 31 | 36 | ||
| 32 | io_clk_64_to_ns = 64000000000ull / octeon_get_io_clock_rate(); | 37 | io_clk_64_to_ns = 64000000000ull / octeon_get_io_clock_rate(); |
| 33 | 38 | ||
| @@ -43,6 +48,13 @@ void octeon2_usb_clocks_start(void) | |||
| 43 | 48 | ||
| 44 | /* Step 3: Configure the reference clock, PHY, and HCLK */ | 49 | /* Step 3: Configure the reference clock, PHY, and HCLK */ |
| 45 | clk_rst_ctl.u64 = cvmx_read_csr(CVMX_UCTLX_CLK_RST_CTL(0)); | 50 | clk_rst_ctl.u64 = cvmx_read_csr(CVMX_UCTLX_CLK_RST_CTL(0)); |
| 51 | |||
| 52 | /* | ||
| 53 | * If the UCTL looks like it has already been started, skip | ||
| 54 | * the initialization, otherwise bus errors are obtained. | ||
| 55 | */ | ||
| 56 | if (clk_rst_ctl.s.hrst) | ||
| 57 | goto end_clock; | ||
| 46 | /* 3a */ | 58 | /* 3a */ |
| 47 | clk_rst_ctl.s.p_por = 1; | 59 | clk_rst_ctl.s.p_por = 1; |
| 48 | clk_rst_ctl.s.hrst = 0; | 60 | clk_rst_ctl.s.hrst = 0; |
| @@ -158,28 +170,31 @@ void octeon2_usb_clocks_start(void) | |||
| 158 | clk_rst_ctl.s.hrst = 1; | 170 | clk_rst_ctl.s.hrst = 1; |
| 159 | cvmx_write_csr(CVMX_UCTLX_CLK_RST_CTL(0), clk_rst_ctl.u64); | 171 | cvmx_write_csr(CVMX_UCTLX_CLK_RST_CTL(0), clk_rst_ctl.u64); |
| 160 | 172 | ||
| 173 | end_clock: | ||
| 161 | /* Now we can set some other registers. */ | 174 | /* Now we can set some other registers. */ |
| 162 | 175 | ||
| 163 | for (i = 0; i <= 1; i++) { | 176 | for (i = 0; i <= 1; i++) { |
| 164 | port_ctl_status.u64 = | 177 | port_ctl_status.u64 = |
| 165 | cvmx_read_csr(CVMX_UCTLX_UPHY_PORTX_CTL_STATUS(i, 0)); | 178 | cvmx_read_csr(CVMX_UCTLX_UPHY_PORTX_CTL_STATUS(i, 0)); |
| 166 | /* Set txvreftune to 15 to obtain complient 'eye' diagram. */ | 179 | /* Set txvreftune to 15 to obtain compliant 'eye' diagram. */ |
| 167 | port_ctl_status.s.txvreftune = 15; | 180 | port_ctl_status.s.txvreftune = 15; |
| 181 | port_ctl_status.s.txrisetune = 1; | ||
| 182 | port_ctl_status.s.txpreemphasistune = 1; | ||
| 168 | cvmx_write_csr(CVMX_UCTLX_UPHY_PORTX_CTL_STATUS(i, 0), | 183 | cvmx_write_csr(CVMX_UCTLX_UPHY_PORTX_CTL_STATUS(i, 0), |
| 169 | port_ctl_status.u64); | 184 | port_ctl_status.u64); |
| 170 | } | 185 | } |
| 186 | |||
| 187 | /* Set uSOF cycle period to 60,000 bits. */ | ||
| 188 | cvmx_write_csr(CVMX_UCTLX_EHCI_FLA(0), 0x20ull); | ||
| 189 | exit: | ||
| 190 | mutex_unlock(&octeon2_usb_clocks_mutex); | ||
| 171 | } | 191 | } |
| 172 | EXPORT_SYMBOL(octeon2_usb_clocks_start); | 192 | EXPORT_SYMBOL(octeon2_usb_clocks_start); |
| 173 | 193 | ||
| 174 | void octeon2_usb_clocks_stop(void) | 194 | void octeon2_usb_clocks_stop(void) |
| 175 | { | 195 | { |
| 176 | union cvmx_uctlx_if_ena if_ena; | 196 | mutex_lock(&octeon2_usb_clocks_mutex); |
| 177 | 197 | octeon2_usb_clock_start_cnt--; | |
| 178 | if (atomic_dec_return(&octeon2_usb_clock_start_cnt) != 0) | 198 | mutex_unlock(&octeon2_usb_clocks_mutex); |
| 179 | return; | ||
| 180 | |||
| 181 | if_ena.u64 = 0; | ||
| 182 | if_ena.s.en = 0; | ||
| 183 | cvmx_write_csr(CVMX_UCTLX_IF_ENA(0), if_ena.u64); | ||
| 184 | } | 199 | } |
| 185 | EXPORT_SYMBOL(octeon2_usb_clocks_stop); | 200 | EXPORT_SYMBOL(octeon2_usb_clocks_stop); |
diff --git a/drivers/usb/host/ohci-ath79.c b/drivers/usb/host/ohci-ath79.c new file mode 100644 index 00000000000..ffea3e7cb0a --- /dev/null +++ b/drivers/usb/host/ohci-ath79.c | |||
| @@ -0,0 +1,151 @@ | |||
| 1 | /* | ||
| 2 | * OHCI HCD (Host Controller Driver) for USB. | ||
| 3 | * | ||
| 4 | * Bus Glue for Atheros AR71XX/AR724X built-in OHCI controller. | ||
| 5 | * | ||
| 6 | * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org> | ||
| 7 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
| 8 | * | ||
| 9 | * Parts of this file are based on Atheros' 2.6.15 BSP | ||
| 10 | * Copyright (C) 2007 Atheros Communications, Inc. | ||
| 11 | * | ||
| 12 | * This program is free software; you can redistribute it and/or modify it | ||
| 13 | * under the terms of the GNU General Public License version 2 as published | ||
| 14 | * by the Free Software Foundation. | ||
| 15 | */ | ||
| 16 | |||
| 17 | #include <linux/platform_device.h> | ||
| 18 | |||
| 19 | static int __devinit ohci_ath79_start(struct usb_hcd *hcd) | ||
| 20 | { | ||
| 21 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
| 22 | int ret; | ||
| 23 | |||
| 24 | ret = ohci_init(ohci); | ||
| 25 | if (ret < 0) | ||
| 26 | return ret; | ||
| 27 | |||
| 28 | ret = ohci_run(ohci); | ||
| 29 | if (ret < 0) | ||
| 30 | goto err; | ||
| 31 | |||
| 32 | return 0; | ||
| 33 | |||
| 34 | err: | ||
| 35 | ohci_stop(hcd); | ||
| 36 | return ret; | ||
| 37 | } | ||
| 38 | |||
| 39 | static const struct hc_driver ohci_ath79_hc_driver = { | ||
| 40 | .description = hcd_name, | ||
| 41 | .product_desc = "Atheros built-in OHCI controller", | ||
| 42 | .hcd_priv_size = sizeof(struct ohci_hcd), | ||
| 43 | |||
| 44 | .irq = ohci_irq, | ||
| 45 | .flags = HCD_USB11 | HCD_MEMORY, | ||
| 46 | |||
| 47 | .start = ohci_ath79_start, | ||
| 48 | .stop = ohci_stop, | ||
| 49 | .shutdown = ohci_shutdown, | ||
| 50 | |||
| 51 | .urb_enqueue = ohci_urb_enqueue, | ||
| 52 | .urb_dequeue = ohci_urb_dequeue, | ||
| 53 | .endpoint_disable = ohci_endpoint_disable, | ||
| 54 | |||
| 55 | /* | ||
| 56 | * scheduling support | ||
| 57 | */ | ||
| 58 | .get_frame_number = ohci_get_frame, | ||
| 59 | |||
| 60 | /* | ||
| 61 | * root hub support | ||
| 62 | */ | ||
| 63 | .hub_status_data = ohci_hub_status_data, | ||
| 64 | .hub_control = ohci_hub_control, | ||
| 65 | .start_port_reset = ohci_start_port_reset, | ||
| 66 | }; | ||
| 67 | |||
| 68 | static int ohci_ath79_probe(struct platform_device *pdev) | ||
| 69 | { | ||
| 70 | struct usb_hcd *hcd; | ||
| 71 | struct resource *res; | ||
| 72 | int irq; | ||
| 73 | int ret; | ||
| 74 | |||
| 75 | if (usb_disabled()) | ||
| 76 | return -ENODEV; | ||
| 77 | |||
| 78 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
| 79 | if (!res) { | ||
| 80 | dev_dbg(&pdev->dev, "no IRQ specified\n"); | ||
| 81 | return -ENODEV; | ||
| 82 | } | ||
| 83 | irq = res->start; | ||
| 84 | |||
| 85 | hcd = usb_create_hcd(&ohci_ath79_hc_driver, &pdev->dev, | ||
| 86 | dev_name(&pdev->dev)); | ||
| 87 | if (!hcd) | ||
| 88 | return -ENOMEM; | ||
| 89 | |||
| 90 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 91 | if (!res) { | ||
| 92 | dev_dbg(&pdev->dev, "no base address specified\n"); | ||
| 93 | ret = -ENODEV; | ||
| 94 | goto err_put_hcd; | ||
| 95 | } | ||
| 96 | hcd->rsrc_start = res->start; | ||
| 97 | hcd->rsrc_len = res->end - res->start + 1; | ||
| 98 | |||
| 99 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | ||
| 100 | dev_dbg(&pdev->dev, "controller already in use\n"); | ||
| 101 | ret = -EBUSY; | ||
| 102 | goto err_put_hcd; | ||
| 103 | } | ||
| 104 | |||
| 105 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | ||
| 106 | if (!hcd->regs) { | ||
| 107 | dev_dbg(&pdev->dev, "error mapping memory\n"); | ||
| 108 | ret = -EFAULT; | ||
| 109 | goto err_release_region; | ||
| 110 | } | ||
| 111 | |||
| 112 | ohci_hcd_init(hcd_to_ohci(hcd)); | ||
| 113 | |||
| 114 | ret = usb_add_hcd(hcd, irq, IRQF_DISABLED); | ||
| 115 | if (ret) | ||
| 116 | goto err_stop_hcd; | ||
| 117 | |||
| 118 | return 0; | ||
| 119 | |||
| 120 | err_stop_hcd: | ||
| 121 | iounmap(hcd->regs); | ||
| 122 | err_release_region: | ||
| 123 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
| 124 | err_put_hcd: | ||
| 125 | usb_put_hcd(hcd); | ||
| 126 | return ret; | ||
| 127 | } | ||
| 128 | |||
| 129 | static int ohci_ath79_remove(struct platform_device *pdev) | ||
| 130 | { | ||
| 131 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
| 132 | |||
| 133 | usb_remove_hcd(hcd); | ||
| 134 | iounmap(hcd->regs); | ||
| 135 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
| 136 | usb_put_hcd(hcd); | ||
| 137 | |||
| 138 | return 0; | ||
| 139 | } | ||
| 140 | |||
| 141 | static struct platform_driver ohci_hcd_ath79_driver = { | ||
| 142 | .probe = ohci_ath79_probe, | ||
| 143 | .remove = ohci_ath79_remove, | ||
| 144 | .shutdown = usb_hcd_platform_shutdown, | ||
| 145 | .driver = { | ||
| 146 | .name = "ath79-ohci", | ||
| 147 | .owner = THIS_MODULE, | ||
| 148 | }, | ||
| 149 | }; | ||
| 150 | |||
| 151 | MODULE_ALIAS(PLATFORM_MODULE_PREFIX "ath79-ohci"); | ||
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index d5572351486..9aa10bdf391 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
| @@ -764,6 +764,7 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) | |||
| 764 | if (ints == ~(u32)0) { | 764 | if (ints == ~(u32)0) { |
| 765 | disable (ohci); | 765 | disable (ohci); |
| 766 | ohci_dbg (ohci, "device removed!\n"); | 766 | ohci_dbg (ohci, "device removed!\n"); |
| 767 | usb_hc_died(hcd); | ||
| 767 | return IRQ_HANDLED; | 768 | return IRQ_HANDLED; |
| 768 | } | 769 | } |
| 769 | 770 | ||
| @@ -771,7 +772,7 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) | |||
| 771 | ints &= ohci_readl(ohci, ®s->intrenable); | 772 | ints &= ohci_readl(ohci, ®s->intrenable); |
| 772 | 773 | ||
| 773 | /* interrupt for some other device? */ | 774 | /* interrupt for some other device? */ |
| 774 | if (ints == 0) | 775 | if (ints == 0 || unlikely(hcd->state == HC_STATE_HALT)) |
| 775 | return IRQ_NOTMINE; | 776 | return IRQ_NOTMINE; |
| 776 | 777 | ||
| 777 | if (ints & OHCI_INTR_UE) { | 778 | if (ints & OHCI_INTR_UE) { |
| @@ -788,6 +789,7 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) | |||
| 788 | } else { | 789 | } else { |
| 789 | disable (ohci); | 790 | disable (ohci); |
| 790 | ohci_err (ohci, "OHCI Unrecoverable Error, disabled\n"); | 791 | ohci_err (ohci, "OHCI Unrecoverable Error, disabled\n"); |
| 792 | usb_hc_died(hcd); | ||
| 791 | } | 793 | } |
| 792 | 794 | ||
| 793 | ohci_dump (ohci, 1); | 795 | ohci_dump (ohci, 1); |
| @@ -1105,6 +1107,11 @@ MODULE_LICENSE ("GPL"); | |||
| 1105 | #define PLATFORM_DRIVER ohci_hcd_cns3xxx_driver | 1107 | #define PLATFORM_DRIVER ohci_hcd_cns3xxx_driver |
| 1106 | #endif | 1108 | #endif |
| 1107 | 1109 | ||
| 1110 | #ifdef CONFIG_USB_OHCI_ATH79 | ||
| 1111 | #include "ohci-ath79.c" | ||
| 1112 | #define PLATFORM_DRIVER ohci_hcd_ath79_driver | ||
| 1113 | #endif | ||
| 1114 | |||
| 1108 | #if !defined(PCI_DRIVER) && \ | 1115 | #if !defined(PCI_DRIVER) && \ |
| 1109 | !defined(PLATFORM_DRIVER) && \ | 1116 | !defined(PLATFORM_DRIVER) && \ |
| 1110 | !defined(OMAP1_PLATFORM_DRIVER) && \ | 1117 | !defined(OMAP1_PLATFORM_DRIVER) && \ |
diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c index d84d6f0314f..ad8166c681e 100644 --- a/drivers/usb/host/ohci-pci.c +++ b/drivers/usb/host/ohci-pci.c | |||
| @@ -181,10 +181,18 @@ static int ohci_quirk_amd700(struct usb_hcd *hcd) | |||
| 181 | */ | 181 | */ |
| 182 | static int ohci_quirk_nvidia_shutdown(struct usb_hcd *hcd) | 182 | static int ohci_quirk_nvidia_shutdown(struct usb_hcd *hcd) |
| 183 | { | 183 | { |
| 184 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); | ||
| 184 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | 185 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
| 185 | 186 | ||
| 186 | ohci->flags |= OHCI_QUIRK_SHUTDOWN; | 187 | /* Evidently nVidia fixed their later hardware; this is a guess at |
| 187 | ohci_dbg(ohci, "enabled nVidia shutdown quirk\n"); | 188 | * the changeover point. |
| 189 | */ | ||
| 190 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_USB 0x026d | ||
| 191 | |||
| 192 | if (pdev->device < PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_USB) { | ||
| 193 | ohci->flags |= OHCI_QUIRK_SHUTDOWN; | ||
| 194 | ohci_dbg(ohci, "enabled nVidia shutdown quirk\n"); | ||
| 195 | } | ||
| 188 | 196 | ||
| 189 | return 0; | 197 | return 0; |
| 190 | } | 198 | } |
diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c index a68af2dd55c..7c9a4d55526 100644 --- a/drivers/usb/host/ohci-s3c2410.c +++ b/drivers/usb/host/ohci-s3c2410.c | |||
| @@ -56,9 +56,8 @@ static void s3c2410_start_hc(struct platform_device *dev, struct usb_hcd *hcd) | |||
| 56 | info->hcd = hcd; | 56 | info->hcd = hcd; |
| 57 | info->report_oc = s3c2410_hcd_oc; | 57 | info->report_oc = s3c2410_hcd_oc; |
| 58 | 58 | ||
| 59 | if (info->enable_oc != NULL) { | 59 | if (info->enable_oc != NULL) |
| 60 | (info->enable_oc)(info, 1); | 60 | (info->enable_oc)(info, 1); |
| 61 | } | ||
| 62 | } | 61 | } |
| 63 | } | 62 | } |
| 64 | 63 | ||
| @@ -72,9 +71,8 @@ static void s3c2410_stop_hc(struct platform_device *dev) | |||
| 72 | info->report_oc = NULL; | 71 | info->report_oc = NULL; |
| 73 | info->hcd = NULL; | 72 | info->hcd = NULL; |
| 74 | 73 | ||
| 75 | if (info->enable_oc != NULL) { | 74 | if (info->enable_oc != NULL) |
| 76 | (info->enable_oc)(info, 0); | 75 | (info->enable_oc)(info, 0); |
| 77 | } | ||
| 78 | } | 76 | } |
| 79 | 77 | ||
| 80 | clk_disable(clk); | 78 | clk_disable(clk); |
| @@ -88,14 +86,14 @@ static void s3c2410_stop_hc(struct platform_device *dev) | |||
| 88 | */ | 86 | */ |
| 89 | 87 | ||
| 90 | static int | 88 | static int |
| 91 | ohci_s3c2410_hub_status_data (struct usb_hcd *hcd, char *buf) | 89 | ohci_s3c2410_hub_status_data(struct usb_hcd *hcd, char *buf) |
| 92 | { | 90 | { |
| 93 | struct s3c2410_hcd_info *info = to_s3c2410_info(hcd); | 91 | struct s3c2410_hcd_info *info = to_s3c2410_info(hcd); |
| 94 | struct s3c2410_hcd_port *port; | 92 | struct s3c2410_hcd_port *port; |
| 95 | int orig; | 93 | int orig; |
| 96 | int portno; | 94 | int portno; |
| 97 | 95 | ||
| 98 | orig = ohci_hub_status_data (hcd, buf); | 96 | orig = ohci_hub_status_data(hcd, buf); |
| 99 | 97 | ||
| 100 | if (info == NULL) | 98 | if (info == NULL) |
| 101 | return orig; | 99 | return orig; |
| @@ -145,7 +143,7 @@ static void s3c2410_usb_set_power(struct s3c2410_hcd_info *info, | |||
| 145 | * request. | 143 | * request. |
| 146 | */ | 144 | */ |
| 147 | 145 | ||
| 148 | static int ohci_s3c2410_hub_control ( | 146 | static int ohci_s3c2410_hub_control( |
| 149 | struct usb_hcd *hcd, | 147 | struct usb_hcd *hcd, |
| 150 | u16 typeReq, | 148 | u16 typeReq, |
| 151 | u16 wValue, | 149 | u16 wValue, |
| @@ -199,9 +197,8 @@ static int ohci_s3c2410_hub_control ( | |||
| 199 | dev_dbg(hcd->self.controller, | 197 | dev_dbg(hcd->self.controller, |
| 200 | "ClearPortFeature: OVER_CURRENT\n"); | 198 | "ClearPortFeature: OVER_CURRENT\n"); |
| 201 | 199 | ||
| 202 | if (valid_port(wIndex)) { | 200 | if (valid_port(wIndex)) |
| 203 | info->port[wIndex-1].oc_status = 0; | 201 | info->port[wIndex-1].oc_status = 0; |
| 204 | } | ||
| 205 | 202 | ||
| 206 | goto out; | 203 | goto out; |
| 207 | 204 | ||
| @@ -242,8 +239,11 @@ static int ohci_s3c2410_hub_control ( | |||
| 242 | desc->wHubCharacteristics |= cpu_to_le16(0x0001); | 239 | desc->wHubCharacteristics |= cpu_to_le16(0x0001); |
| 243 | 240 | ||
| 244 | if (info->enable_oc) { | 241 | if (info->enable_oc) { |
| 245 | desc->wHubCharacteristics &= ~cpu_to_le16(HUB_CHAR_OCPM); | 242 | desc->wHubCharacteristics &= ~cpu_to_le16( |
| 246 | desc->wHubCharacteristics |= cpu_to_le16(0x0008|0x0001); | 243 | HUB_CHAR_OCPM); |
| 244 | desc->wHubCharacteristics |= cpu_to_le16( | ||
| 245 | 0x0008 | | ||
| 246 | 0x0001); | ||
| 247 | } | 247 | } |
| 248 | 248 | ||
| 249 | dev_dbg(hcd->self.controller, "wHubCharacteristics after 0x%04x\n", | 249 | dev_dbg(hcd->self.controller, "wHubCharacteristics after 0x%04x\n", |
| @@ -257,13 +257,11 @@ static int ohci_s3c2410_hub_control ( | |||
| 257 | dev_dbg(hcd->self.controller, "GetPortStatus(%d)\n", wIndex); | 257 | dev_dbg(hcd->self.controller, "GetPortStatus(%d)\n", wIndex); |
| 258 | 258 | ||
| 259 | if (valid_port(wIndex)) { | 259 | if (valid_port(wIndex)) { |
| 260 | if (info->port[wIndex-1].oc_changed) { | 260 | if (info->port[wIndex-1].oc_changed) |
| 261 | *data |= cpu_to_le32(RH_PS_OCIC); | 261 | *data |= cpu_to_le32(RH_PS_OCIC); |
| 262 | } | ||
| 263 | 262 | ||
| 264 | if (info->port[wIndex-1].oc_status) { | 263 | if (info->port[wIndex-1].oc_status) |
| 265 | *data |= cpu_to_le32(RH_PS_POCI); | 264 | *data |= cpu_to_le32(RH_PS_POCI); |
| 266 | } | ||
| 267 | } | 265 | } |
| 268 | } | 266 | } |
| 269 | 267 | ||
| @@ -321,7 +319,7 @@ static void s3c2410_hcd_oc(struct s3c2410_hcd_info *info, int port_oc) | |||
| 321 | */ | 319 | */ |
| 322 | 320 | ||
| 323 | static void | 321 | static void |
| 324 | usb_hcd_s3c2410_remove (struct usb_hcd *hcd, struct platform_device *dev) | 322 | usb_hcd_s3c2410_remove(struct usb_hcd *hcd, struct platform_device *dev) |
| 325 | { | 323 | { |
| 326 | usb_remove_hcd(hcd); | 324 | usb_remove_hcd(hcd); |
| 327 | s3c2410_stop_hc(dev); | 325 | s3c2410_stop_hc(dev); |
| @@ -339,7 +337,7 @@ usb_hcd_s3c2410_remove (struct usb_hcd *hcd, struct platform_device *dev) | |||
| 339 | * through the hotplug entry's driver_data. | 337 | * through the hotplug entry's driver_data. |
| 340 | * | 338 | * |
| 341 | */ | 339 | */ |
| 342 | static int usb_hcd_s3c2410_probe (const struct hc_driver *driver, | 340 | static int usb_hcd_s3c2410_probe(const struct hc_driver *driver, |
| 343 | struct platform_device *dev) | 341 | struct platform_device *dev) |
| 344 | { | 342 | { |
| 345 | struct usb_hcd *hcd = NULL; | 343 | struct usb_hcd *hcd = NULL; |
| @@ -353,7 +351,7 @@ static int usb_hcd_s3c2410_probe (const struct hc_driver *driver, | |||
| 353 | return -ENOMEM; | 351 | return -ENOMEM; |
| 354 | 352 | ||
| 355 | hcd->rsrc_start = dev->resource[0].start; | 353 | hcd->rsrc_start = dev->resource[0].start; |
| 356 | hcd->rsrc_len = dev->resource[0].end - dev->resource[0].start + 1; | 354 | hcd->rsrc_len = resource_size(&dev->resource[0]); |
| 357 | 355 | ||
| 358 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | 356 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { |
| 359 | dev_err(&dev->dev, "request_mem_region failed\n"); | 357 | dev_err(&dev->dev, "request_mem_region failed\n"); |
| @@ -364,14 +362,14 @@ static int usb_hcd_s3c2410_probe (const struct hc_driver *driver, | |||
| 364 | clk = clk_get(&dev->dev, "usb-host"); | 362 | clk = clk_get(&dev->dev, "usb-host"); |
| 365 | if (IS_ERR(clk)) { | 363 | if (IS_ERR(clk)) { |
| 366 | dev_err(&dev->dev, "cannot get usb-host clock\n"); | 364 | dev_err(&dev->dev, "cannot get usb-host clock\n"); |
| 367 | retval = -ENOENT; | 365 | retval = PTR_ERR(clk); |
| 368 | goto err_mem; | 366 | goto err_mem; |
| 369 | } | 367 | } |
| 370 | 368 | ||
| 371 | usb_clk = clk_get(&dev->dev, "usb-bus-host"); | 369 | usb_clk = clk_get(&dev->dev, "usb-bus-host"); |
| 372 | if (IS_ERR(usb_clk)) { | 370 | if (IS_ERR(usb_clk)) { |
| 373 | dev_err(&dev->dev, "cannot get usb-bus-host clock\n"); | 371 | dev_err(&dev->dev, "cannot get usb-bus-host clock\n"); |
| 374 | retval = -ENOENT; | 372 | retval = PTR_ERR(usb_clk); |
| 375 | goto err_clk; | 373 | goto err_clk; |
| 376 | } | 374 | } |
| 377 | 375 | ||
| @@ -411,17 +409,19 @@ static int usb_hcd_s3c2410_probe (const struct hc_driver *driver, | |||
| 411 | /*-------------------------------------------------------------------------*/ | 409 | /*-------------------------------------------------------------------------*/ |
| 412 | 410 | ||
| 413 | static int | 411 | static int |
| 414 | ohci_s3c2410_start (struct usb_hcd *hcd) | 412 | ohci_s3c2410_start(struct usb_hcd *hcd) |
| 415 | { | 413 | { |
| 416 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 414 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
| 417 | int ret; | 415 | int ret; |
| 418 | 416 | ||
| 419 | if ((ret = ohci_init(ohci)) < 0) | 417 | ret = ohci_init(ohci); |
| 418 | if (ret < 0) | ||
| 420 | return ret; | 419 | return ret; |
| 421 | 420 | ||
| 422 | if ((ret = ohci_run (ohci)) < 0) { | 421 | ret = ohci_run(ohci); |
| 423 | err ("can't start %s", hcd->self.bus_name); | 422 | if (ret < 0) { |
| 424 | ohci_stop (hcd); | 423 | err("can't start %s", hcd->self.bus_name); |
| 424 | ohci_stop(hcd); | ||
| 425 | return ret; | 425 | return ret; |
| 426 | } | 426 | } |
| 427 | 427 | ||
| @@ -473,12 +473,12 @@ static const struct hc_driver ohci_s3c2410_hc_driver = { | |||
| 473 | 473 | ||
| 474 | /* device driver */ | 474 | /* device driver */ |
| 475 | 475 | ||
| 476 | static int ohci_hcd_s3c2410_drv_probe(struct platform_device *pdev) | 476 | static int __devinit ohci_hcd_s3c2410_drv_probe(struct platform_device *pdev) |
| 477 | { | 477 | { |
| 478 | return usb_hcd_s3c2410_probe(&ohci_s3c2410_hc_driver, pdev); | 478 | return usb_hcd_s3c2410_probe(&ohci_s3c2410_hc_driver, pdev); |
| 479 | } | 479 | } |
| 480 | 480 | ||
| 481 | static int ohci_hcd_s3c2410_drv_remove(struct platform_device *pdev) | 481 | static int __devexit ohci_hcd_s3c2410_drv_remove(struct platform_device *pdev) |
| 482 | { | 482 | { |
| 483 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | 483 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
| 484 | 484 | ||
| @@ -488,7 +488,7 @@ static int ohci_hcd_s3c2410_drv_remove(struct platform_device *pdev) | |||
| 488 | 488 | ||
| 489 | static struct platform_driver ohci_hcd_s3c2410_driver = { | 489 | static struct platform_driver ohci_hcd_s3c2410_driver = { |
| 490 | .probe = ohci_hcd_s3c2410_drv_probe, | 490 | .probe = ohci_hcd_s3c2410_drv_probe, |
| 491 | .remove = ohci_hcd_s3c2410_drv_remove, | 491 | .remove = __devexit_p(ohci_hcd_s3c2410_drv_remove), |
| 492 | .shutdown = usb_hcd_platform_shutdown, | 492 | .shutdown = usb_hcd_platform_shutdown, |
| 493 | /*.suspend = ohci_hcd_s3c2410_drv_suspend, */ | 493 | /*.suspend = ohci_hcd_s3c2410_drv_suspend, */ |
| 494 | /*.resume = ohci_hcd_s3c2410_drv_resume, */ | 494 | /*.resume = ohci_hcd_s3c2410_drv_resume, */ |
diff --git a/drivers/usb/host/oxu210hp-hcd.c b/drivers/usb/host/oxu210hp-hcd.c index 4a771f6cc82..5fbe997dc6d 100644 --- a/drivers/usb/host/oxu210hp-hcd.c +++ b/drivers/usb/host/oxu210hp-hcd.c | |||
| @@ -1884,6 +1884,7 @@ static int enable_periodic(struct oxu_hcd *oxu) | |||
| 1884 | status = handshake(oxu, &oxu->regs->status, STS_PSS, 0, 9 * 125); | 1884 | status = handshake(oxu, &oxu->regs->status, STS_PSS, 0, 9 * 125); |
| 1885 | if (status != 0) { | 1885 | if (status != 0) { |
| 1886 | oxu_to_hcd(oxu)->state = HC_STATE_HALT; | 1886 | oxu_to_hcd(oxu)->state = HC_STATE_HALT; |
| 1887 | usb_hc_died(oxu_to_hcd(oxu)); | ||
| 1887 | return status; | 1888 | return status; |
| 1888 | } | 1889 | } |
| 1889 | 1890 | ||
| @@ -1909,6 +1910,7 @@ static int disable_periodic(struct oxu_hcd *oxu) | |||
| 1909 | status = handshake(oxu, &oxu->regs->status, STS_PSS, STS_PSS, 9 * 125); | 1910 | status = handshake(oxu, &oxu->regs->status, STS_PSS, STS_PSS, 9 * 125); |
| 1910 | if (status != 0) { | 1911 | if (status != 0) { |
| 1911 | oxu_to_hcd(oxu)->state = HC_STATE_HALT; | 1912 | oxu_to_hcd(oxu)->state = HC_STATE_HALT; |
| 1913 | usb_hc_died(oxu_to_hcd(oxu)); | ||
| 1912 | return status; | 1914 | return status; |
| 1913 | } | 1915 | } |
| 1914 | 1916 | ||
| @@ -2449,8 +2451,9 @@ static irqreturn_t oxu210_hcd_irq(struct usb_hcd *hcd) | |||
| 2449 | goto dead; | 2451 | goto dead; |
| 2450 | } | 2452 | } |
| 2451 | 2453 | ||
| 2454 | /* Shared IRQ? */ | ||
| 2452 | status &= INTR_MASK; | 2455 | status &= INTR_MASK; |
| 2453 | if (!status) { /* irq sharing? */ | 2456 | if (!status || unlikely(hcd->state == HC_STATE_HALT)) { |
| 2454 | spin_unlock(&oxu->lock); | 2457 | spin_unlock(&oxu->lock); |
| 2455 | return IRQ_NONE; | 2458 | return IRQ_NONE; |
| 2456 | } | 2459 | } |
| @@ -2516,6 +2519,7 @@ static irqreturn_t oxu210_hcd_irq(struct usb_hcd *hcd) | |||
| 2516 | dead: | 2519 | dead: |
| 2517 | ehci_reset(oxu); | 2520 | ehci_reset(oxu); |
| 2518 | writel(0, &oxu->regs->configured_flag); | 2521 | writel(0, &oxu->regs->configured_flag); |
| 2522 | usb_hc_died(hcd); | ||
| 2519 | /* generic layer kills/unlinks all urbs, then | 2523 | /* generic layer kills/unlinks all urbs, then |
| 2520 | * uses oxu_stop to clean up the rest | 2524 | * uses oxu_stop to clean up the rest |
| 2521 | */ | 2525 | */ |
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index 9b166d70ae9..f16c59d5f48 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
| 15 | #include <linux/delay.h> | 15 | #include <linux/delay.h> |
| 16 | #include <linux/acpi.h> | 16 | #include <linux/acpi.h> |
| 17 | #include <linux/dmi.h> | ||
| 17 | #include "pci-quirks.h" | 18 | #include "pci-quirks.h" |
| 18 | #include "xhci-ext-caps.h" | 19 | #include "xhci-ext-caps.h" |
| 19 | 20 | ||
| @@ -503,14 +504,84 @@ static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) | |||
| 503 | iounmap(base); | 504 | iounmap(base); |
| 504 | } | 505 | } |
| 505 | 506 | ||
| 507 | static void __devinit ehci_bios_handoff(struct pci_dev *pdev, | ||
| 508 | void __iomem *op_reg_base, | ||
| 509 | u32 cap, u8 offset) | ||
| 510 | { | ||
| 511 | int try_handoff = 1, tried_handoff = 0; | ||
| 512 | |||
| 513 | /* The Pegatron Lucid (ExoPC) tablet sporadically waits for 90 | ||
| 514 | * seconds trying the handoff on its unused controller. Skip | ||
| 515 | * it. */ | ||
| 516 | if (pdev->vendor == 0x8086 && pdev->device == 0x283a) { | ||
| 517 | const char *dmi_bn = dmi_get_system_info(DMI_BOARD_NAME); | ||
| 518 | const char *dmi_bv = dmi_get_system_info(DMI_BIOS_VERSION); | ||
| 519 | if (dmi_bn && !strcmp(dmi_bn, "EXOPG06411") && | ||
| 520 | dmi_bv && !strcmp(dmi_bv, "Lucid-CE-133")) | ||
| 521 | try_handoff = 0; | ||
| 522 | } | ||
| 523 | |||
| 524 | if (try_handoff && (cap & EHCI_USBLEGSUP_BIOS)) { | ||
| 525 | dev_dbg(&pdev->dev, "EHCI: BIOS handoff\n"); | ||
| 526 | |||
| 527 | #if 0 | ||
| 528 | /* aleksey_gorelov@phoenix.com reports that some systems need SMI forced on, | ||
| 529 | * but that seems dubious in general (the BIOS left it off intentionally) | ||
| 530 | * and is known to prevent some systems from booting. so we won't do this | ||
| 531 | * unless maybe we can determine when we're on a system that needs SMI forced. | ||
| 532 | */ | ||
| 533 | /* BIOS workaround (?): be sure the pre-Linux code | ||
| 534 | * receives the SMI | ||
| 535 | */ | ||
| 536 | pci_read_config_dword(pdev, offset + EHCI_USBLEGCTLSTS, &val); | ||
| 537 | pci_write_config_dword(pdev, offset + EHCI_USBLEGCTLSTS, | ||
| 538 | val | EHCI_USBLEGCTLSTS_SOOE); | ||
| 539 | #endif | ||
| 540 | |||
| 541 | /* some systems get upset if this semaphore is | ||
| 542 | * set for any other reason than forcing a BIOS | ||
| 543 | * handoff.. | ||
| 544 | */ | ||
| 545 | pci_write_config_byte(pdev, offset + 3, 1); | ||
| 546 | } | ||
| 547 | |||
| 548 | /* if boot firmware now owns EHCI, spin till it hands it over. */ | ||
| 549 | if (try_handoff) { | ||
| 550 | int msec = 1000; | ||
| 551 | while ((cap & EHCI_USBLEGSUP_BIOS) && (msec > 0)) { | ||
| 552 | tried_handoff = 1; | ||
| 553 | msleep(10); | ||
| 554 | msec -= 10; | ||
| 555 | pci_read_config_dword(pdev, offset, &cap); | ||
| 556 | } | ||
| 557 | } | ||
| 558 | |||
| 559 | if (cap & EHCI_USBLEGSUP_BIOS) { | ||
| 560 | /* well, possibly buggy BIOS... try to shut it down, | ||
| 561 | * and hope nothing goes too wrong | ||
| 562 | */ | ||
| 563 | if (try_handoff) | ||
| 564 | dev_warn(&pdev->dev, "EHCI: BIOS handoff failed" | ||
| 565 | " (BIOS bug?) %08x\n", cap); | ||
| 566 | pci_write_config_byte(pdev, offset + 2, 0); | ||
| 567 | } | ||
| 568 | |||
| 569 | /* just in case, always disable EHCI SMIs */ | ||
| 570 | pci_write_config_dword(pdev, offset + EHCI_USBLEGCTLSTS, 0); | ||
| 571 | |||
| 572 | /* If the BIOS ever owned the controller then we can't expect | ||
| 573 | * any power sessions to remain intact. | ||
| 574 | */ | ||
| 575 | if (tried_handoff) | ||
| 576 | writel(0, op_reg_base + EHCI_CONFIGFLAG); | ||
| 577 | } | ||
| 578 | |||
| 506 | static void __devinit quirk_usb_disable_ehci(struct pci_dev *pdev) | 579 | static void __devinit quirk_usb_disable_ehci(struct pci_dev *pdev) |
| 507 | { | 580 | { |
| 508 | int wait_time, delta; | ||
| 509 | void __iomem *base, *op_reg_base; | 581 | void __iomem *base, *op_reg_base; |
| 510 | u32 hcc_params, val; | 582 | u32 hcc_params, cap, val; |
| 511 | u8 offset, cap_length; | 583 | u8 offset, cap_length; |
| 512 | int count = 256/4; | 584 | int wait_time, delta, count = 256/4; |
| 513 | int tried_handoff = 0; | ||
| 514 | 585 | ||
| 515 | if (!mmio_resource_enabled(pdev, 0)) | 586 | if (!mmio_resource_enabled(pdev, 0)) |
| 516 | return; | 587 | return; |
| @@ -529,77 +600,17 @@ static void __devinit quirk_usb_disable_ehci(struct pci_dev *pdev) | |||
| 529 | hcc_params = readl(base + EHCI_HCC_PARAMS); | 600 | hcc_params = readl(base + EHCI_HCC_PARAMS); |
| 530 | offset = (hcc_params >> 8) & 0xff; | 601 | offset = (hcc_params >> 8) & 0xff; |
| 531 | while (offset && --count) { | 602 | while (offset && --count) { |
| 532 | u32 cap; | ||
| 533 | int msec; | ||
| 534 | |||
| 535 | pci_read_config_dword(pdev, offset, &cap); | 603 | pci_read_config_dword(pdev, offset, &cap); |
| 536 | switch (cap & 0xff) { | ||
| 537 | case 1: /* BIOS/SMM/... handoff support */ | ||
| 538 | if ((cap & EHCI_USBLEGSUP_BIOS)) { | ||
| 539 | dev_dbg(&pdev->dev, "EHCI: BIOS handoff\n"); | ||
| 540 | 604 | ||
| 541 | #if 0 | 605 | switch (cap & 0xff) { |
| 542 | /* aleksey_gorelov@phoenix.com reports that some systems need SMI forced on, | 606 | case 1: |
| 543 | * but that seems dubious in general (the BIOS left it off intentionally) | 607 | ehci_bios_handoff(pdev, op_reg_base, cap, offset); |
| 544 | * and is known to prevent some systems from booting. so we won't do this | ||
| 545 | * unless maybe we can determine when we're on a system that needs SMI forced. | ||
| 546 | */ | ||
| 547 | /* BIOS workaround (?): be sure the | ||
| 548 | * pre-Linux code receives the SMI | ||
| 549 | */ | ||
| 550 | pci_read_config_dword(pdev, | ||
| 551 | offset + EHCI_USBLEGCTLSTS, | ||
| 552 | &val); | ||
| 553 | pci_write_config_dword(pdev, | ||
| 554 | offset + EHCI_USBLEGCTLSTS, | ||
| 555 | val | EHCI_USBLEGCTLSTS_SOOE); | ||
| 556 | #endif | ||
| 557 | |||
| 558 | /* some systems get upset if this semaphore is | ||
| 559 | * set for any other reason than forcing a BIOS | ||
| 560 | * handoff.. | ||
| 561 | */ | ||
| 562 | pci_write_config_byte(pdev, offset + 3, 1); | ||
| 563 | } | ||
| 564 | |||
| 565 | /* if boot firmware now owns EHCI, spin till | ||
| 566 | * it hands it over. | ||
| 567 | */ | ||
| 568 | msec = 1000; | ||
| 569 | while ((cap & EHCI_USBLEGSUP_BIOS) && (msec > 0)) { | ||
| 570 | tried_handoff = 1; | ||
| 571 | msleep(10); | ||
| 572 | msec -= 10; | ||
| 573 | pci_read_config_dword(pdev, offset, &cap); | ||
| 574 | } | ||
| 575 | |||
| 576 | if (cap & EHCI_USBLEGSUP_BIOS) { | ||
| 577 | /* well, possibly buggy BIOS... try to shut | ||
| 578 | * it down, and hope nothing goes too wrong | ||
| 579 | */ | ||
| 580 | dev_warn(&pdev->dev, "EHCI: BIOS handoff failed" | ||
| 581 | " (BIOS bug?) %08x\n", cap); | ||
| 582 | pci_write_config_byte(pdev, offset + 2, 0); | ||
| 583 | } | ||
| 584 | |||
| 585 | /* just in case, always disable EHCI SMIs */ | ||
| 586 | pci_write_config_dword(pdev, | ||
| 587 | offset + EHCI_USBLEGCTLSTS, | ||
| 588 | 0); | ||
| 589 | |||
| 590 | /* If the BIOS ever owned the controller then we | ||
| 591 | * can't expect any power sessions to remain intact. | ||
| 592 | */ | ||
| 593 | if (tried_handoff) | ||
| 594 | writel(0, op_reg_base + EHCI_CONFIGFLAG); | ||
| 595 | break; | 608 | break; |
| 596 | case 0: /* illegal reserved capability */ | 609 | case 0: /* Illegal reserved cap, set cap=0 so we exit */ |
| 597 | cap = 0; | 610 | cap = 0; /* then fallthrough... */ |
| 598 | /* FALLTHROUGH */ | ||
| 599 | default: | 611 | default: |
| 600 | dev_warn(&pdev->dev, "EHCI: unrecognized capability " | 612 | dev_warn(&pdev->dev, "EHCI: unrecognized capability " |
| 601 | "%02x\n", cap & 0xff); | 613 | "%02x\n", cap & 0xff); |
| 602 | break; | ||
| 603 | } | 614 | } |
| 604 | offset = (cap >> 8) & 0xff; | 615 | offset = (cap >> 8) & 0xff; |
| 605 | } | 616 | } |
diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c index fafccc2fd33..1a996245ab9 100644 --- a/drivers/usb/host/sl811-hcd.c +++ b/drivers/usb/host/sl811-hcd.c | |||
| @@ -72,12 +72,6 @@ MODULE_ALIAS("platform:sl811-hcd"); | |||
| 72 | /* for now, use only one transfer register bank */ | 72 | /* for now, use only one transfer register bank */ |
| 73 | #undef USE_B | 73 | #undef USE_B |
| 74 | 74 | ||
| 75 | /* this doesn't understand urb->iso_frame_desc[], but if you had a driver | ||
| 76 | * that just queued one ISO frame per URB then iso transfers "should" work | ||
| 77 | * using the normal urb status fields. | ||
| 78 | */ | ||
| 79 | #define DISABLE_ISO | ||
| 80 | |||
| 81 | // #define QUIRK2 | 75 | // #define QUIRK2 |
| 82 | #define QUIRK3 | 76 | #define QUIRK3 |
| 83 | 77 | ||
| @@ -808,7 +802,7 @@ static int sl811h_urb_enqueue( | |||
| 808 | int retval; | 802 | int retval; |
| 809 | struct usb_host_endpoint *hep = urb->ep; | 803 | struct usb_host_endpoint *hep = urb->ep; |
| 810 | 804 | ||
| 811 | #ifdef DISABLE_ISO | 805 | #ifndef CONFIG_USB_SL811_HCD_ISO |
| 812 | if (type == PIPE_ISOCHRONOUS) | 806 | if (type == PIPE_ISOCHRONOUS) |
| 813 | return -ENOSPC; | 807 | return -ENOSPC; |
| 814 | #endif | 808 | #endif |
diff --git a/drivers/usb/host/u132-hcd.c b/drivers/usb/host/u132-hcd.c index b4785934e09..533d12cca37 100644 --- a/drivers/usb/host/u132-hcd.c +++ b/drivers/usb/host/u132-hcd.c | |||
| @@ -3230,8 +3230,7 @@ static int __init u132_hcd_init(void) | |||
| 3230 | mutex_init(&u132_module_lock); | 3230 | mutex_init(&u132_module_lock); |
| 3231 | if (usb_disabled()) | 3231 | if (usb_disabled()) |
| 3232 | return -ENODEV; | 3232 | return -ENODEV; |
| 3233 | printk(KERN_INFO "driver %s built at %s on %s\n", hcd_name, __TIME__, | 3233 | printk(KERN_INFO "driver %s\n", hcd_name); |
| 3234 | __DATE__); | ||
| 3235 | workqueue = create_singlethread_workqueue("u132"); | 3234 | workqueue = create_singlethread_workqueue("u132"); |
| 3236 | retval = platform_driver_register(&u132_platform_driver); | 3235 | retval = platform_driver_register(&u132_platform_driver); |
| 3237 | return retval; | 3236 | return retval; |
diff --git a/drivers/usb/host/uhci-debug.c b/drivers/usb/host/uhci-debug.c index ee60cd3ea64..fc0b0daac93 100644 --- a/drivers/usb/host/uhci-debug.c +++ b/drivers/usb/host/uhci-debug.c | |||
| @@ -37,7 +37,8 @@ static void lprintk(char *buf) | |||
| 37 | } | 37 | } |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | static int uhci_show_td(struct uhci_td *td, char *buf, int len, int space) | 40 | static int uhci_show_td(struct uhci_hcd *uhci, struct uhci_td *td, char *buf, |
| 41 | int len, int space) | ||
| 41 | { | 42 | { |
| 42 | char *out = buf; | 43 | char *out = buf; |
| 43 | char *spid; | 44 | char *spid; |
| @@ -47,8 +48,9 @@ static int uhci_show_td(struct uhci_td *td, char *buf, int len, int space) | |||
| 47 | if (len < 160) | 48 | if (len < 160) |
| 48 | return 0; | 49 | return 0; |
| 49 | 50 | ||
| 50 | status = td_status(td); | 51 | status = td_status(uhci, td); |
| 51 | out += sprintf(out, "%*s[%p] link (%08x) ", space, "", td, le32_to_cpu(td->link)); | 52 | out += sprintf(out, "%*s[%p] link (%08x) ", space, "", td, |
| 53 | hc32_to_cpu(uhci, td->link)); | ||
| 52 | out += sprintf(out, "e%d %s%s%s%s%s%s%s%s%s%sLength=%x ", | 54 | out += sprintf(out, "e%d %s%s%s%s%s%s%s%s%s%sLength=%x ", |
| 53 | ((status >> 27) & 3), | 55 | ((status >> 27) & 3), |
| 54 | (status & TD_CTRL_SPD) ? "SPD " : "", | 56 | (status & TD_CTRL_SPD) ? "SPD " : "", |
| @@ -63,7 +65,7 @@ static int uhci_show_td(struct uhci_td *td, char *buf, int len, int space) | |||
| 63 | (status & TD_CTRL_BITSTUFF) ? "BitStuff " : "", | 65 | (status & TD_CTRL_BITSTUFF) ? "BitStuff " : "", |
| 64 | status & 0x7ff); | 66 | status & 0x7ff); |
| 65 | 67 | ||
| 66 | token = td_token(td); | 68 | token = td_token(uhci, td); |
| 67 | switch (uhci_packetid(token)) { | 69 | switch (uhci_packetid(token)) { |
| 68 | case USB_PID_SETUP: | 70 | case USB_PID_SETUP: |
| 69 | spid = "SETUP"; | 71 | spid = "SETUP"; |
| @@ -86,12 +88,13 @@ static int uhci_show_td(struct uhci_td *td, char *buf, int len, int space) | |||
| 86 | (token >> 8) & 127, | 88 | (token >> 8) & 127, |
| 87 | (token & 0xff), | 89 | (token & 0xff), |
| 88 | spid); | 90 | spid); |
| 89 | out += sprintf(out, "(buf=%08x)\n", le32_to_cpu(td->buffer)); | 91 | out += sprintf(out, "(buf=%08x)\n", hc32_to_cpu(uhci, td->buffer)); |
| 90 | 92 | ||
| 91 | return out - buf; | 93 | return out - buf; |
| 92 | } | 94 | } |
| 93 | 95 | ||
| 94 | static int uhci_show_urbp(struct urb_priv *urbp, char *buf, int len, int space) | 96 | static int uhci_show_urbp(struct uhci_hcd *uhci, struct urb_priv *urbp, |
| 97 | char *buf, int len, int space) | ||
| 95 | { | 98 | { |
| 96 | char *out = buf; | 99 | char *out = buf; |
| 97 | struct uhci_td *td; | 100 | struct uhci_td *td; |
| @@ -130,9 +133,10 @@ static int uhci_show_urbp(struct urb_priv *urbp, char *buf, int len, int space) | |||
| 130 | if (urbp->qh->type != USB_ENDPOINT_XFER_ISOC && | 133 | if (urbp->qh->type != USB_ENDPOINT_XFER_ISOC && |
| 131 | (++i <= 10 || debug > 2)) { | 134 | (++i <= 10 || debug > 2)) { |
| 132 | out += sprintf(out, "%*s%d: ", space + 2, "", i); | 135 | out += sprintf(out, "%*s%d: ", space + 2, "", i); |
| 133 | out += uhci_show_td(td, out, len - (out - buf), 0); | 136 | out += uhci_show_td(uhci, td, out, |
| 137 | len - (out - buf), 0); | ||
| 134 | } else { | 138 | } else { |
| 135 | if (td_status(td) & TD_CTRL_ACTIVE) | 139 | if (td_status(uhci, td) & TD_CTRL_ACTIVE) |
| 136 | ++nactive; | 140 | ++nactive; |
| 137 | else | 141 | else |
| 138 | ++ninactive; | 142 | ++ninactive; |
| @@ -151,7 +155,7 @@ static int uhci_show_qh(struct uhci_hcd *uhci, | |||
| 151 | { | 155 | { |
| 152 | char *out = buf; | 156 | char *out = buf; |
| 153 | int i, nurbs; | 157 | int i, nurbs; |
| 154 | __le32 element = qh_element(qh); | 158 | __hc32 element = qh_element(qh); |
| 155 | char *qtype; | 159 | char *qtype; |
| 156 | 160 | ||
| 157 | /* Try to make sure there's enough memory */ | 161 | /* Try to make sure there's enough memory */ |
| @@ -168,7 +172,8 @@ static int uhci_show_qh(struct uhci_hcd *uhci, | |||
| 168 | 172 | ||
| 169 | out += sprintf(out, "%*s[%p] %s QH link (%08x) element (%08x)\n", | 173 | out += sprintf(out, "%*s[%p] %s QH link (%08x) element (%08x)\n", |
| 170 | space, "", qh, qtype, | 174 | space, "", qh, qtype, |
| 171 | le32_to_cpu(qh->link), le32_to_cpu(element)); | 175 | hc32_to_cpu(uhci, qh->link), |
| 176 | hc32_to_cpu(uhci, element)); | ||
| 172 | if (qh->type == USB_ENDPOINT_XFER_ISOC) | 177 | if (qh->type == USB_ENDPOINT_XFER_ISOC) |
| 173 | out += sprintf(out, "%*s period %d phase %d load %d us, " | 178 | out += sprintf(out, "%*s period %d phase %d load %d us, " |
| 174 | "frame %x desc [%p]\n", | 179 | "frame %x desc [%p]\n", |
| @@ -178,22 +183,22 @@ static int uhci_show_qh(struct uhci_hcd *uhci, | |||
| 178 | out += sprintf(out, "%*s period %d phase %d load %d us\n", | 183 | out += sprintf(out, "%*s period %d phase %d load %d us\n", |
| 179 | space, "", qh->period, qh->phase, qh->load); | 184 | space, "", qh->period, qh->phase, qh->load); |
| 180 | 185 | ||
| 181 | if (element & UHCI_PTR_QH) | 186 | if (element & UHCI_PTR_QH(uhci)) |
| 182 | out += sprintf(out, "%*s Element points to QH (bug?)\n", space, ""); | 187 | out += sprintf(out, "%*s Element points to QH (bug?)\n", space, ""); |
| 183 | 188 | ||
| 184 | if (element & UHCI_PTR_DEPTH) | 189 | if (element & UHCI_PTR_DEPTH(uhci)) |
| 185 | out += sprintf(out, "%*s Depth traverse\n", space, ""); | 190 | out += sprintf(out, "%*s Depth traverse\n", space, ""); |
| 186 | 191 | ||
| 187 | if (element & cpu_to_le32(8)) | 192 | if (element & cpu_to_hc32(uhci, 8)) |
| 188 | out += sprintf(out, "%*s Bit 3 set (bug?)\n", space, ""); | 193 | out += sprintf(out, "%*s Bit 3 set (bug?)\n", space, ""); |
| 189 | 194 | ||
| 190 | if (!(element & ~(UHCI_PTR_QH | UHCI_PTR_DEPTH))) | 195 | if (!(element & ~(UHCI_PTR_QH(uhci) | UHCI_PTR_DEPTH(uhci)))) |
| 191 | out += sprintf(out, "%*s Element is NULL (bug?)\n", space, ""); | 196 | out += sprintf(out, "%*s Element is NULL (bug?)\n", space, ""); |
| 192 | 197 | ||
| 193 | if (list_empty(&qh->queue)) { | 198 | if (list_empty(&qh->queue)) { |
| 194 | out += sprintf(out, "%*s queue is empty\n", space, ""); | 199 | out += sprintf(out, "%*s queue is empty\n", space, ""); |
| 195 | if (qh == uhci->skel_async_qh) | 200 | if (qh == uhci->skel_async_qh) |
| 196 | out += uhci_show_td(uhci->term_td, out, | 201 | out += uhci_show_td(uhci, uhci->term_td, out, |
| 197 | len - (out - buf), 0); | 202 | len - (out - buf), 0); |
| 198 | } else { | 203 | } else { |
| 199 | struct urb_priv *urbp = list_entry(qh->queue.next, | 204 | struct urb_priv *urbp = list_entry(qh->queue.next, |
| @@ -201,13 +206,13 @@ static int uhci_show_qh(struct uhci_hcd *uhci, | |||
| 201 | struct uhci_td *td = list_entry(urbp->td_list.next, | 206 | struct uhci_td *td = list_entry(urbp->td_list.next, |
| 202 | struct uhci_td, list); | 207 | struct uhci_td, list); |
| 203 | 208 | ||
| 204 | if (element != LINK_TO_TD(td)) | 209 | if (element != LINK_TO_TD(uhci, td)) |
| 205 | out += sprintf(out, "%*s Element != First TD\n", | 210 | out += sprintf(out, "%*s Element != First TD\n", |
| 206 | space, ""); | 211 | space, ""); |
| 207 | i = nurbs = 0; | 212 | i = nurbs = 0; |
| 208 | list_for_each_entry(urbp, &qh->queue, node) { | 213 | list_for_each_entry(urbp, &qh->queue, node) { |
| 209 | if (++i <= 10) | 214 | if (++i <= 10) |
| 210 | out += uhci_show_urbp(urbp, out, | 215 | out += uhci_show_urbp(uhci, urbp, out, |
| 211 | len - (out - buf), space + 2); | 216 | len - (out - buf), space + 2); |
| 212 | else | 217 | else |
| 213 | ++nurbs; | 218 | ++nurbs; |
| @@ -219,7 +224,8 @@ static int uhci_show_qh(struct uhci_hcd *uhci, | |||
| 219 | 224 | ||
| 220 | if (qh->dummy_td) { | 225 | if (qh->dummy_td) { |
| 221 | out += sprintf(out, "%*s Dummy TD\n", space, ""); | 226 | out += sprintf(out, "%*s Dummy TD\n", space, ""); |
| 222 | out += uhci_show_td(qh->dummy_td, out, len - (out - buf), 0); | 227 | out += uhci_show_td(uhci, qh->dummy_td, out, |
| 228 | len - (out - buf), 0); | ||
| 223 | } | 229 | } |
| 224 | 230 | ||
| 225 | return out - buf; | 231 | return out - buf; |
| @@ -285,7 +291,6 @@ static int uhci_show_root_hub_state(struct uhci_hcd *uhci, char *buf, int len) | |||
| 285 | static int uhci_show_status(struct uhci_hcd *uhci, char *buf, int len) | 291 | static int uhci_show_status(struct uhci_hcd *uhci, char *buf, int len) |
| 286 | { | 292 | { |
| 287 | char *out = buf; | 293 | char *out = buf; |
| 288 | unsigned long io_addr = uhci->io_addr; | ||
| 289 | unsigned short usbcmd, usbstat, usbint, usbfrnum; | 294 | unsigned short usbcmd, usbstat, usbint, usbfrnum; |
| 290 | unsigned int flbaseadd; | 295 | unsigned int flbaseadd; |
| 291 | unsigned char sof; | 296 | unsigned char sof; |
| @@ -295,14 +300,14 @@ static int uhci_show_status(struct uhci_hcd *uhci, char *buf, int len) | |||
| 295 | if (len < 80 * 9) | 300 | if (len < 80 * 9) |
| 296 | return 0; | 301 | return 0; |
| 297 | 302 | ||
| 298 | usbcmd = inw(io_addr + 0); | 303 | usbcmd = uhci_readw(uhci, 0); |
| 299 | usbstat = inw(io_addr + 2); | 304 | usbstat = uhci_readw(uhci, 2); |
| 300 | usbint = inw(io_addr + 4); | 305 | usbint = uhci_readw(uhci, 4); |
| 301 | usbfrnum = inw(io_addr + 6); | 306 | usbfrnum = uhci_readw(uhci, 6); |
| 302 | flbaseadd = inl(io_addr + 8); | 307 | flbaseadd = uhci_readl(uhci, 8); |
| 303 | sof = inb(io_addr + 12); | 308 | sof = uhci_readb(uhci, 12); |
| 304 | portsc1 = inw(io_addr + 16); | 309 | portsc1 = uhci_readw(uhci, 16); |
| 305 | portsc2 = inw(io_addr + 18); | 310 | portsc2 = uhci_readw(uhci, 18); |
| 306 | 311 | ||
| 307 | out += sprintf(out, " usbcmd = %04x %s%s%s%s%s%s%s%s\n", | 312 | out += sprintf(out, " usbcmd = %04x %s%s%s%s%s%s%s%s\n", |
| 308 | usbcmd, | 313 | usbcmd, |
| @@ -347,8 +352,8 @@ static int uhci_sprint_schedule(struct uhci_hcd *uhci, char *buf, int len) | |||
| 347 | struct uhci_td *td; | 352 | struct uhci_td *td; |
| 348 | struct list_head *tmp, *head; | 353 | struct list_head *tmp, *head; |
| 349 | int nframes, nerrs; | 354 | int nframes, nerrs; |
| 350 | __le32 link; | 355 | __hc32 link; |
| 351 | __le32 fsbr_link; | 356 | __hc32 fsbr_link; |
| 352 | 357 | ||
| 353 | static const char * const qh_names[] = { | 358 | static const char * const qh_names[] = { |
| 354 | "unlink", "iso", "int128", "int64", "int32", "int16", | 359 | "unlink", "iso", "int128", "int64", "int32", "int16", |
| @@ -376,7 +381,7 @@ static int uhci_sprint_schedule(struct uhci_hcd *uhci, char *buf, int len) | |||
| 376 | nframes = 10; | 381 | nframes = 10; |
| 377 | nerrs = 0; | 382 | nerrs = 0; |
| 378 | for (i = 0; i < UHCI_NUMFRAMES; ++i) { | 383 | for (i = 0; i < UHCI_NUMFRAMES; ++i) { |
| 379 | __le32 qh_dma; | 384 | __hc32 qh_dma; |
| 380 | 385 | ||
| 381 | j = 0; | 386 | j = 0; |
| 382 | td = uhci->frame_cpu[i]; | 387 | td = uhci->frame_cpu[i]; |
| @@ -386,7 +391,7 @@ static int uhci_sprint_schedule(struct uhci_hcd *uhci, char *buf, int len) | |||
| 386 | 391 | ||
| 387 | if (nframes > 0) { | 392 | if (nframes > 0) { |
| 388 | out += sprintf(out, "- Frame %d -> (%08x)\n", | 393 | out += sprintf(out, "- Frame %d -> (%08x)\n", |
| 389 | i, le32_to_cpu(link)); | 394 | i, hc32_to_cpu(uhci, link)); |
| 390 | j = 1; | 395 | j = 1; |
| 391 | } | 396 | } |
| 392 | 397 | ||
| @@ -395,7 +400,7 @@ static int uhci_sprint_schedule(struct uhci_hcd *uhci, char *buf, int len) | |||
| 395 | do { | 400 | do { |
| 396 | td = list_entry(tmp, struct uhci_td, fl_list); | 401 | td = list_entry(tmp, struct uhci_td, fl_list); |
| 397 | tmp = tmp->next; | 402 | tmp = tmp->next; |
| 398 | if (link != LINK_TO_TD(td)) { | 403 | if (link != LINK_TO_TD(uhci, td)) { |
| 399 | if (nframes > 0) | 404 | if (nframes > 0) |
| 400 | out += sprintf(out, " link does " | 405 | out += sprintf(out, " link does " |
| 401 | "not match list entry!\n"); | 406 | "not match list entry!\n"); |
| @@ -403,7 +408,7 @@ static int uhci_sprint_schedule(struct uhci_hcd *uhci, char *buf, int len) | |||
| 403 | ++nerrs; | 408 | ++nerrs; |
| 404 | } | 409 | } |
| 405 | if (nframes > 0) | 410 | if (nframes > 0) |
| 406 | out += uhci_show_td(td, out, | 411 | out += uhci_show_td(uhci, td, out, |
| 407 | len - (out - buf), 4); | 412 | len - (out - buf), 4); |
| 408 | link = td->link; | 413 | link = td->link; |
| 409 | } while (tmp != head); | 414 | } while (tmp != head); |
| @@ -415,11 +420,12 @@ check_link: | |||
| 415 | if (!j) { | 420 | if (!j) { |
| 416 | out += sprintf(out, | 421 | out += sprintf(out, |
| 417 | "- Frame %d -> (%08x)\n", | 422 | "- Frame %d -> (%08x)\n", |
| 418 | i, le32_to_cpu(link)); | 423 | i, hc32_to_cpu(uhci, link)); |
| 419 | j = 1; | 424 | j = 1; |
| 420 | } | 425 | } |
| 421 | out += sprintf(out, " link does not match " | 426 | out += sprintf(out, " link does not match " |
| 422 | "QH (%08x)!\n", le32_to_cpu(qh_dma)); | 427 | "QH (%08x)!\n", |
| 428 | hc32_to_cpu(uhci, qh_dma)); | ||
| 423 | } else | 429 | } else |
| 424 | ++nerrs; | 430 | ++nerrs; |
| 425 | } | 431 | } |
| @@ -440,11 +446,11 @@ check_link: | |||
| 440 | 446 | ||
| 441 | /* Last QH is the Terminating QH, it's different */ | 447 | /* Last QH is the Terminating QH, it's different */ |
| 442 | if (i == SKEL_TERM) { | 448 | if (i == SKEL_TERM) { |
| 443 | if (qh_element(qh) != LINK_TO_TD(uhci->term_td)) | 449 | if (qh_element(qh) != LINK_TO_TD(uhci, uhci->term_td)) |
| 444 | out += sprintf(out, " skel_term_qh element is not set to term_td!\n"); | 450 | out += sprintf(out, " skel_term_qh element is not set to term_td!\n"); |
| 445 | link = fsbr_link; | 451 | link = fsbr_link; |
| 446 | if (!link) | 452 | if (!link) |
| 447 | link = LINK_TO_QH(uhci->skel_term_qh); | 453 | link = LINK_TO_QH(uhci, uhci->skel_term_qh); |
| 448 | goto check_qh_link; | 454 | goto check_qh_link; |
| 449 | } | 455 | } |
| 450 | 456 | ||
| @@ -458,20 +464,20 @@ check_link: | |||
| 458 | out += uhci_show_qh(uhci, qh, out, | 464 | out += uhci_show_qh(uhci, qh, out, |
| 459 | len - (out - buf), 4); | 465 | len - (out - buf), 4); |
| 460 | if (!fsbr_link && qh->skel >= SKEL_FSBR) | 466 | if (!fsbr_link && qh->skel >= SKEL_FSBR) |
| 461 | fsbr_link = LINK_TO_QH(qh); | 467 | fsbr_link = LINK_TO_QH(uhci, qh); |
| 462 | } | 468 | } |
| 463 | if ((cnt -= 10) > 0) | 469 | if ((cnt -= 10) > 0) |
| 464 | out += sprintf(out, " Skipped %d QHs\n", cnt); | 470 | out += sprintf(out, " Skipped %d QHs\n", cnt); |
| 465 | 471 | ||
| 466 | link = UHCI_PTR_TERM; | 472 | link = UHCI_PTR_TERM(uhci); |
| 467 | if (i <= SKEL_ISO) | 473 | if (i <= SKEL_ISO) |
| 468 | ; | 474 | ; |
| 469 | else if (i < SKEL_ASYNC) | 475 | else if (i < SKEL_ASYNC) |
| 470 | link = LINK_TO_QH(uhci->skel_async_qh); | 476 | link = LINK_TO_QH(uhci, uhci->skel_async_qh); |
| 471 | else if (!uhci->fsbr_is_on) | 477 | else if (!uhci->fsbr_is_on) |
| 472 | ; | 478 | ; |
| 473 | else | 479 | else |
| 474 | link = LINK_TO_QH(uhci->skel_term_qh); | 480 | link = LINK_TO_QH(uhci, uhci->skel_term_qh); |
| 475 | check_qh_link: | 481 | check_qh_link: |
| 476 | if (qh->link != link) | 482 | if (qh->link != link) |
| 477 | out += sprintf(out, " last QH not linked to next skeleton!\n"); | 483 | out += sprintf(out, " last QH not linked to next skeleton!\n"); |
diff --git a/drivers/usb/host/uhci-grlib.c b/drivers/usb/host/uhci-grlib.c new file mode 100644 index 00000000000..d01c1e22768 --- /dev/null +++ b/drivers/usb/host/uhci-grlib.c | |||
| @@ -0,0 +1,208 @@ | |||
| 1 | /* | ||
| 2 | * UHCI HCD (Host Controller Driver) for GRLIB GRUSBHC | ||
| 3 | * | ||
| 4 | * Copyright (c) 2011 Jan Andersson <jan@gaisler.com> | ||
| 5 | * | ||
| 6 | * This file is based on UHCI PCI HCD: | ||
| 7 | * (C) Copyright 1999 Linus Torvalds | ||
| 8 | * (C) Copyright 1999-2002 Johannes Erdfelt, johannes@erdfelt.com | ||
| 9 | * (C) Copyright 1999 Randy Dunlap | ||
| 10 | * (C) Copyright 1999 Georg Acher, acher@in.tum.de | ||
| 11 | * (C) Copyright 1999 Deti Fliegl, deti@fliegl.de | ||
| 12 | * (C) Copyright 1999 Thomas Sailer, sailer@ife.ee.ethz.ch | ||
| 13 | * (C) Copyright 1999 Roman Weissgaerber, weissg@vienna.at | ||
| 14 | * (C) Copyright 2000 Yggdrasil Computing, Inc. (port of new PCI interface | ||
| 15 | * support from usb-ohci.c by Adam Richter, adam@yggdrasil.com). | ||
| 16 | * (C) Copyright 1999 Gregory P. Smith (from usb-ohci.c) | ||
| 17 | * (C) Copyright 2004-2007 Alan Stern, stern@rowland.harvard.edu | ||
| 18 | */ | ||
| 19 | |||
| 20 | #include <linux/of_irq.h> | ||
| 21 | #include <linux/of_address.h> | ||
| 22 | #include <linux/of_platform.h> | ||
| 23 | |||
| 24 | static int uhci_grlib_init(struct usb_hcd *hcd) | ||
| 25 | { | ||
| 26 | struct uhci_hcd *uhci = hcd_to_uhci(hcd); | ||
| 27 | |||
| 28 | /* | ||
| 29 | * Probe to determine the endianness of the controller. | ||
| 30 | * We know that bit 7 of the PORTSC1 register is always set | ||
| 31 | * and bit 15 is always clear. If uhci_readw() yields a value | ||
| 32 | * with bit 7 (0x80) turned on then the current little-endian | ||
| 33 | * setting is correct. Otherwise we assume the value was | ||
| 34 | * byte-swapped; hence the register interface and presumably | ||
| 35 | * also the descriptors are big-endian. | ||
| 36 | */ | ||
| 37 | if (!(uhci_readw(uhci, USBPORTSC1) & 0x80)) { | ||
| 38 | uhci->big_endian_mmio = 1; | ||
| 39 | uhci->big_endian_desc = 1; | ||
| 40 | } | ||
| 41 | |||
| 42 | uhci->rh_numports = uhci_count_ports(hcd); | ||
| 43 | |||
| 44 | /* Set up pointers to to generic functions */ | ||
| 45 | uhci->reset_hc = uhci_generic_reset_hc; | ||
| 46 | uhci->check_and_reset_hc = uhci_generic_check_and_reset_hc; | ||
| 47 | /* No special actions need to be taken for the functions below */ | ||
| 48 | uhci->configure_hc = NULL; | ||
| 49 | uhci->resume_detect_interrupts_are_broken = NULL; | ||
| 50 | uhci->global_suspend_mode_is_broken = NULL; | ||
| 51 | |||
| 52 | /* Reset if the controller isn't already safely quiescent. */ | ||
| 53 | check_and_reset_hc(uhci); | ||
| 54 | return 0; | ||
| 55 | } | ||
| 56 | |||
| 57 | static const struct hc_driver uhci_grlib_hc_driver = { | ||
| 58 | .description = hcd_name, | ||
| 59 | .product_desc = "GRLIB GRUSBHC UHCI Host Controller", | ||
| 60 | .hcd_priv_size = sizeof(struct uhci_hcd), | ||
| 61 | |||
| 62 | /* Generic hardware linkage */ | ||
| 63 | .irq = uhci_irq, | ||
| 64 | .flags = HCD_MEMORY | HCD_USB11, | ||
| 65 | |||
| 66 | /* Basic lifecycle operations */ | ||
| 67 | .reset = uhci_grlib_init, | ||
| 68 | .start = uhci_start, | ||
| 69 | #ifdef CONFIG_PM | ||
| 70 | .pci_suspend = NULL, | ||
| 71 | .pci_resume = NULL, | ||
| 72 | .bus_suspend = uhci_rh_suspend, | ||
| 73 | .bus_resume = uhci_rh_resume, | ||
| 74 | #endif | ||
| 75 | .stop = uhci_stop, | ||
| 76 | |||
| 77 | .urb_enqueue = uhci_urb_enqueue, | ||
| 78 | .urb_dequeue = uhci_urb_dequeue, | ||
| 79 | |||
| 80 | .endpoint_disable = uhci_hcd_endpoint_disable, | ||
| 81 | .get_frame_number = uhci_hcd_get_frame_number, | ||
| 82 | |||
| 83 | .hub_status_data = uhci_hub_status_data, | ||
| 84 | .hub_control = uhci_hub_control, | ||
| 85 | }; | ||
| 86 | |||
| 87 | |||
| 88 | static int __devinit uhci_hcd_grlib_probe(struct platform_device *op) | ||
| 89 | { | ||
| 90 | struct device_node *dn = op->dev.of_node; | ||
| 91 | struct usb_hcd *hcd; | ||
| 92 | struct uhci_hcd *uhci = NULL; | ||
| 93 | struct resource res; | ||
| 94 | int irq; | ||
| 95 | int rv; | ||
| 96 | |||
| 97 | if (usb_disabled()) | ||
| 98 | return -ENODEV; | ||
| 99 | |||
| 100 | dev_dbg(&op->dev, "initializing GRUSBHC UHCI USB Controller\n"); | ||
| 101 | |||
| 102 | rv = of_address_to_resource(dn, 0, &res); | ||
| 103 | if (rv) | ||
| 104 | return rv; | ||
| 105 | |||
| 106 | /* usb_create_hcd requires dma_mask != NULL */ | ||
| 107 | op->dev.dma_mask = &op->dev.coherent_dma_mask; | ||
| 108 | hcd = usb_create_hcd(&uhci_grlib_hc_driver, &op->dev, | ||
| 109 | "GRUSBHC UHCI USB"); | ||
| 110 | if (!hcd) | ||
| 111 | return -ENOMEM; | ||
| 112 | |||
| 113 | hcd->rsrc_start = res.start; | ||
| 114 | hcd->rsrc_len = res.end - res.start + 1; | ||
| 115 | |||
| 116 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | ||
| 117 | printk(KERN_ERR "%s: request_mem_region failed\n", __FILE__); | ||
| 118 | rv = -EBUSY; | ||
| 119 | goto err_rmr; | ||
| 120 | } | ||
| 121 | |||
| 122 | irq = irq_of_parse_and_map(dn, 0); | ||
| 123 | if (irq == NO_IRQ) { | ||
| 124 | printk(KERN_ERR "%s: irq_of_parse_and_map failed\n", __FILE__); | ||
| 125 | rv = -EBUSY; | ||
| 126 | goto err_irq; | ||
| 127 | } | ||
| 128 | |||
| 129 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | ||
| 130 | if (!hcd->regs) { | ||
| 131 | printk(KERN_ERR "%s: ioremap failed\n", __FILE__); | ||
| 132 | rv = -ENOMEM; | ||
| 133 | goto err_ioremap; | ||
| 134 | } | ||
| 135 | |||
| 136 | uhci = hcd_to_uhci(hcd); | ||
| 137 | |||
| 138 | uhci->regs = hcd->regs; | ||
| 139 | |||
| 140 | rv = usb_add_hcd(hcd, irq, 0); | ||
| 141 | if (rv) | ||
| 142 | goto err_uhci; | ||
| 143 | |||
| 144 | return 0; | ||
| 145 | |||
| 146 | err_uhci: | ||
| 147 | iounmap(hcd->regs); | ||
| 148 | err_ioremap: | ||
| 149 | irq_dispose_mapping(irq); | ||
| 150 | err_irq: | ||
| 151 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
| 152 | err_rmr: | ||
| 153 | usb_put_hcd(hcd); | ||
| 154 | |||
| 155 | return rv; | ||
| 156 | } | ||
| 157 | |||
| 158 | static int uhci_hcd_grlib_remove(struct platform_device *op) | ||
| 159 | { | ||
| 160 | struct usb_hcd *hcd = dev_get_drvdata(&op->dev); | ||
| 161 | |||
| 162 | dev_set_drvdata(&op->dev, NULL); | ||
| 163 | |||
| 164 | dev_dbg(&op->dev, "stopping GRLIB GRUSBHC UHCI USB Controller\n"); | ||
| 165 | |||
| 166 | usb_remove_hcd(hcd); | ||
| 167 | |||
| 168 | iounmap(hcd->regs); | ||
| 169 | irq_dispose_mapping(hcd->irq); | ||
| 170 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
| 171 | |||
| 172 | usb_put_hcd(hcd); | ||
| 173 | |||
| 174 | return 0; | ||
| 175 | } | ||
| 176 | |||
| 177 | /* Make sure the controller is quiescent and that we're not using it | ||
| 178 | * any more. This is mainly for the benefit of programs which, like kexec, | ||
| 179 | * expect the hardware to be idle: not doing DMA or generating IRQs. | ||
| 180 | * | ||
| 181 | * This routine may be called in a damaged or failing kernel. Hence we | ||
| 182 | * do not acquire the spinlock before shutting down the controller. | ||
| 183 | */ | ||
| 184 | static void uhci_hcd_grlib_shutdown(struct platform_device *op) | ||
| 185 | { | ||
| 186 | struct usb_hcd *hcd = dev_get_drvdata(&op->dev); | ||
| 187 | |||
| 188 | uhci_hc_died(hcd_to_uhci(hcd)); | ||
| 189 | } | ||
| 190 | |||
| 191 | static const struct of_device_id uhci_hcd_grlib_of_match[] = { | ||
| 192 | { .name = "GAISLER_UHCI", }, | ||
| 193 | { .name = "01_027", }, | ||
| 194 | {}, | ||
| 195 | }; | ||
| 196 | MODULE_DEVICE_TABLE(of, uhci_hcd_grlib_of_match); | ||
| 197 | |||
| 198 | |||
| 199 | static struct platform_driver uhci_grlib_driver = { | ||
| 200 | .probe = uhci_hcd_grlib_probe, | ||
| 201 | .remove = uhci_hcd_grlib_remove, | ||
| 202 | .shutdown = uhci_hcd_grlib_shutdown, | ||
| 203 | .driver = { | ||
| 204 | .name = "grlib-uhci", | ||
| 205 | .owner = THIS_MODULE, | ||
| 206 | .of_match_table = uhci_hcd_grlib_of_match, | ||
| 207 | }, | ||
| 208 | }; | ||
diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index 448b9d1f0e7..fba99b12058 100644 --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c | |||
| @@ -48,7 +48,6 @@ | |||
| 48 | #include <asm/system.h> | 48 | #include <asm/system.h> |
| 49 | 49 | ||
| 50 | #include "uhci-hcd.h" | 50 | #include "uhci-hcd.h" |
| 51 | #include "pci-quirks.h" | ||
| 52 | 51 | ||
| 53 | /* | 52 | /* |
| 54 | * Version Information | 53 | * Version Information |
| @@ -94,7 +93,7 @@ static void uhci_get_current_frame_number(struct uhci_hcd *uhci); | |||
| 94 | /* | 93 | /* |
| 95 | * Calculate the link pointer DMA value for the first Skeleton QH in a frame. | 94 | * Calculate the link pointer DMA value for the first Skeleton QH in a frame. |
| 96 | */ | 95 | */ |
| 97 | static __le32 uhci_frame_skel_link(struct uhci_hcd *uhci, int frame) | 96 | static __hc32 uhci_frame_skel_link(struct uhci_hcd *uhci, int frame) |
| 98 | { | 97 | { |
| 99 | int skelnum; | 98 | int skelnum; |
| 100 | 99 | ||
| @@ -116,7 +115,7 @@ static __le32 uhci_frame_skel_link(struct uhci_hcd *uhci, int frame) | |||
| 116 | skelnum = 8 - (int) __ffs(frame | UHCI_NUMFRAMES); | 115 | skelnum = 8 - (int) __ffs(frame | UHCI_NUMFRAMES); |
| 117 | if (skelnum <= 1) | 116 | if (skelnum <= 1) |
| 118 | skelnum = 9; | 117 | skelnum = 9; |
| 119 | return LINK_TO_QH(uhci->skelqh[skelnum]); | 118 | return LINK_TO_QH(uhci, uhci->skelqh[skelnum]); |
| 120 | } | 119 | } |
| 121 | 120 | ||
| 122 | #include "uhci-debug.c" | 121 | #include "uhci-debug.c" |
| @@ -135,15 +134,12 @@ static void finish_reset(struct uhci_hcd *uhci) | |||
| 135 | * We have to clear them by hand. | 134 | * We have to clear them by hand. |
| 136 | */ | 135 | */ |
| 137 | for (port = 0; port < uhci->rh_numports; ++port) | 136 | for (port = 0; port < uhci->rh_numports; ++port) |
| 138 | outw(0, uhci->io_addr + USBPORTSC1 + (port * 2)); | 137 | uhci_writew(uhci, 0, USBPORTSC1 + (port * 2)); |
| 139 | 138 | ||
| 140 | uhci->port_c_suspend = uhci->resuming_ports = 0; | 139 | uhci->port_c_suspend = uhci->resuming_ports = 0; |
| 141 | uhci->rh_state = UHCI_RH_RESET; | 140 | uhci->rh_state = UHCI_RH_RESET; |
| 142 | uhci->is_stopped = UHCI_IS_STOPPED; | 141 | uhci->is_stopped = UHCI_IS_STOPPED; |
| 143 | uhci_to_hcd(uhci)->state = HC_STATE_HALT; | ||
| 144 | clear_bit(HCD_FLAG_POLL_RH, &uhci_to_hcd(uhci)->flags); | 142 | clear_bit(HCD_FLAG_POLL_RH, &uhci_to_hcd(uhci)->flags); |
| 145 | |||
| 146 | uhci->dead = 0; /* Full reset resurrects the controller */ | ||
| 147 | } | 143 | } |
| 148 | 144 | ||
| 149 | /* | 145 | /* |
| @@ -153,7 +149,7 @@ static void finish_reset(struct uhci_hcd *uhci) | |||
| 153 | static void uhci_hc_died(struct uhci_hcd *uhci) | 149 | static void uhci_hc_died(struct uhci_hcd *uhci) |
| 154 | { | 150 | { |
| 155 | uhci_get_current_frame_number(uhci); | 151 | uhci_get_current_frame_number(uhci); |
| 156 | uhci_reset_hc(to_pci_dev(uhci_dev(uhci)), uhci->io_addr); | 152 | uhci->reset_hc(uhci); |
| 157 | finish_reset(uhci); | 153 | finish_reset(uhci); |
| 158 | uhci->dead = 1; | 154 | uhci->dead = 1; |
| 159 | 155 | ||
| @@ -168,97 +164,118 @@ static void uhci_hc_died(struct uhci_hcd *uhci) | |||
| 168 | */ | 164 | */ |
| 169 | static void check_and_reset_hc(struct uhci_hcd *uhci) | 165 | static void check_and_reset_hc(struct uhci_hcd *uhci) |
| 170 | { | 166 | { |
| 171 | if (uhci_check_and_reset_hc(to_pci_dev(uhci_dev(uhci)), uhci->io_addr)) | 167 | if (uhci->check_and_reset_hc(uhci)) |
| 172 | finish_reset(uhci); | 168 | finish_reset(uhci); |
| 173 | } | 169 | } |
| 174 | 170 | ||
| 171 | #if defined(CONFIG_USB_UHCI_SUPPORT_NON_PCI_HC) | ||
| 172 | /* | ||
| 173 | * The two functions below are generic reset functions that are used on systems | ||
| 174 | * that do not have keyboard and mouse legacy support. We assume that we are | ||
| 175 | * running on such a system if CONFIG_USB_UHCI_SUPPORT_NON_PCI_HC is defined. | ||
| 176 | */ | ||
| 177 | |||
| 178 | /* | ||
| 179 | * Make sure the controller is completely inactive, unable to | ||
| 180 | * generate interrupts or do DMA. | ||
| 181 | */ | ||
| 182 | static void uhci_generic_reset_hc(struct uhci_hcd *uhci) | ||
| 183 | { | ||
| 184 | /* Reset the HC - this will force us to get a | ||
| 185 | * new notification of any already connected | ||
| 186 | * ports due to the virtual disconnect that it | ||
| 187 | * implies. | ||
| 188 | */ | ||
| 189 | uhci_writew(uhci, USBCMD_HCRESET, USBCMD); | ||
| 190 | mb(); | ||
| 191 | udelay(5); | ||
| 192 | if (uhci_readw(uhci, USBCMD) & USBCMD_HCRESET) | ||
| 193 | dev_warn(uhci_dev(uhci), "HCRESET not completed yet!\n"); | ||
| 194 | |||
| 195 | /* Just to be safe, disable interrupt requests and | ||
| 196 | * make sure the controller is stopped. | ||
| 197 | */ | ||
| 198 | uhci_writew(uhci, 0, USBINTR); | ||
| 199 | uhci_writew(uhci, 0, USBCMD); | ||
| 200 | } | ||
| 201 | |||
| 202 | /* | ||
| 203 | * Initialize a controller that was newly discovered or has just been | ||
| 204 | * resumed. In either case we can't be sure of its previous state. | ||
| 205 | * | ||
| 206 | * Returns: 1 if the controller was reset, 0 otherwise. | ||
| 207 | */ | ||
| 208 | static int uhci_generic_check_and_reset_hc(struct uhci_hcd *uhci) | ||
| 209 | { | ||
| 210 | unsigned int cmd, intr; | ||
| 211 | |||
| 212 | /* | ||
| 213 | * When restarting a suspended controller, we expect all the | ||
| 214 | * settings to be the same as we left them: | ||
| 215 | * | ||
| 216 | * Controller is stopped and configured with EGSM set; | ||
| 217 | * No interrupts enabled except possibly Resume Detect. | ||
| 218 | * | ||
| 219 | * If any of these conditions are violated we do a complete reset. | ||
| 220 | */ | ||
| 221 | |||
| 222 | cmd = uhci_readw(uhci, USBCMD); | ||
| 223 | if ((cmd & USBCMD_RS) || !(cmd & USBCMD_CF) || !(cmd & USBCMD_EGSM)) { | ||
| 224 | dev_dbg(uhci_dev(uhci), "%s: cmd = 0x%04x\n", | ||
| 225 | __func__, cmd); | ||
| 226 | goto reset_needed; | ||
| 227 | } | ||
| 228 | |||
| 229 | intr = uhci_readw(uhci, USBINTR); | ||
| 230 | if (intr & (~USBINTR_RESUME)) { | ||
| 231 | dev_dbg(uhci_dev(uhci), "%s: intr = 0x%04x\n", | ||
| 232 | __func__, intr); | ||
| 233 | goto reset_needed; | ||
| 234 | } | ||
| 235 | return 0; | ||
| 236 | |||
| 237 | reset_needed: | ||
| 238 | dev_dbg(uhci_dev(uhci), "Performing full reset\n"); | ||
| 239 | uhci_generic_reset_hc(uhci); | ||
| 240 | return 1; | ||
| 241 | } | ||
| 242 | #endif /* CONFIG_USB_UHCI_SUPPORT_NON_PCI_HC */ | ||
| 243 | |||
| 175 | /* | 244 | /* |
| 176 | * Store the basic register settings needed by the controller. | 245 | * Store the basic register settings needed by the controller. |
| 177 | */ | 246 | */ |
| 178 | static void configure_hc(struct uhci_hcd *uhci) | 247 | static void configure_hc(struct uhci_hcd *uhci) |
| 179 | { | 248 | { |
| 180 | struct pci_dev *pdev = to_pci_dev(uhci_dev(uhci)); | ||
| 181 | |||
| 182 | /* Set the frame length to the default: 1 ms exactly */ | 249 | /* Set the frame length to the default: 1 ms exactly */ |
| 183 | outb(USBSOF_DEFAULT, uhci->io_addr + USBSOF); | 250 | uhci_writeb(uhci, USBSOF_DEFAULT, USBSOF); |
| 184 | 251 | ||
| 185 | /* Store the frame list base address */ | 252 | /* Store the frame list base address */ |
| 186 | outl(uhci->frame_dma_handle, uhci->io_addr + USBFLBASEADD); | 253 | uhci_writel(uhci, uhci->frame_dma_handle, USBFLBASEADD); |
| 187 | 254 | ||
| 188 | /* Set the current frame number */ | 255 | /* Set the current frame number */ |
| 189 | outw(uhci->frame_number & UHCI_MAX_SOF_NUMBER, | 256 | uhci_writew(uhci, uhci->frame_number & UHCI_MAX_SOF_NUMBER, |
| 190 | uhci->io_addr + USBFRNUM); | 257 | USBFRNUM); |
| 191 | |||
| 192 | /* Mark controller as not halted before we enable interrupts */ | ||
| 193 | uhci_to_hcd(uhci)->state = HC_STATE_SUSPENDED; | ||
| 194 | mb(); | ||
| 195 | |||
| 196 | /* Enable PIRQ */ | ||
| 197 | pci_write_config_word(pdev, USBLEGSUP, USBLEGSUP_DEFAULT); | ||
| 198 | 258 | ||
| 199 | /* Disable platform-specific non-PME# wakeup */ | 259 | /* perform any arch/bus specific configuration */ |
| 200 | if (pdev->vendor == PCI_VENDOR_ID_INTEL) | 260 | if (uhci->configure_hc) |
| 201 | pci_write_config_byte(pdev, USBRES_INTEL, 0); | 261 | uhci->configure_hc(uhci); |
| 202 | } | 262 | } |
| 203 | 263 | ||
| 204 | |||
| 205 | static int resume_detect_interrupts_are_broken(struct uhci_hcd *uhci) | 264 | static int resume_detect_interrupts_are_broken(struct uhci_hcd *uhci) |
| 206 | { | 265 | { |
| 207 | int port; | ||
| 208 | |||
| 209 | /* If we have to ignore overcurrent events then almost by definition | 266 | /* If we have to ignore overcurrent events then almost by definition |
| 210 | * we can't depend on resume-detect interrupts. */ | 267 | * we can't depend on resume-detect interrupts. */ |
| 211 | if (ignore_oc) | 268 | if (ignore_oc) |
| 212 | return 1; | 269 | return 1; |
| 213 | 270 | ||
| 214 | switch (to_pci_dev(uhci_dev(uhci))->vendor) { | 271 | return uhci->resume_detect_interrupts_are_broken ? |
| 215 | default: | 272 | uhci->resume_detect_interrupts_are_broken(uhci) : 0; |
| 216 | break; | ||
| 217 | |||
| 218 | case PCI_VENDOR_ID_GENESYS: | ||
| 219 | /* Genesys Logic's GL880S controllers don't generate | ||
| 220 | * resume-detect interrupts. | ||
| 221 | */ | ||
| 222 | return 1; | ||
| 223 | |||
| 224 | case PCI_VENDOR_ID_INTEL: | ||
| 225 | /* Some of Intel's USB controllers have a bug that causes | ||
| 226 | * resume-detect interrupts if any port has an over-current | ||
| 227 | * condition. To make matters worse, some motherboards | ||
| 228 | * hardwire unused USB ports' over-current inputs active! | ||
| 229 | * To prevent problems, we will not enable resume-detect | ||
| 230 | * interrupts if any ports are OC. | ||
| 231 | */ | ||
| 232 | for (port = 0; port < uhci->rh_numports; ++port) { | ||
| 233 | if (inw(uhci->io_addr + USBPORTSC1 + port * 2) & | ||
| 234 | USBPORTSC_OC) | ||
| 235 | return 1; | ||
| 236 | } | ||
| 237 | break; | ||
| 238 | } | ||
| 239 | return 0; | ||
| 240 | } | 273 | } |
| 241 | 274 | ||
| 242 | static int global_suspend_mode_is_broken(struct uhci_hcd *uhci) | 275 | static int global_suspend_mode_is_broken(struct uhci_hcd *uhci) |
| 243 | { | 276 | { |
| 244 | int port; | 277 | return uhci->global_suspend_mode_is_broken ? |
| 245 | const char *sys_info; | 278 | uhci->global_suspend_mode_is_broken(uhci) : 0; |
| 246 | static char bad_Asus_board[] = "A7V8X"; | ||
| 247 | |||
| 248 | /* One of Asus's motherboards has a bug which causes it to | ||
| 249 | * wake up immediately from suspend-to-RAM if any of the ports | ||
| 250 | * are connected. In such cases we will not set EGSM. | ||
| 251 | */ | ||
| 252 | sys_info = dmi_get_system_info(DMI_BOARD_NAME); | ||
| 253 | if (sys_info && !strcmp(sys_info, bad_Asus_board)) { | ||
| 254 | for (port = 0; port < uhci->rh_numports; ++port) { | ||
| 255 | if (inw(uhci->io_addr + USBPORTSC1 + port * 2) & | ||
| 256 | USBPORTSC_CCS) | ||
| 257 | return 1; | ||
| 258 | } | ||
| 259 | } | ||
| 260 | |||
| 261 | return 0; | ||
| 262 | } | 279 | } |
| 263 | 280 | ||
| 264 | static void suspend_rh(struct uhci_hcd *uhci, enum uhci_rh_state new_state) | 281 | static void suspend_rh(struct uhci_hcd *uhci, enum uhci_rh_state new_state) |
| @@ -321,8 +338,8 @@ __acquires(uhci->lock) | |||
| 321 | !int_enable) | 338 | !int_enable) |
| 322 | uhci->RD_enable = int_enable = 0; | 339 | uhci->RD_enable = int_enable = 0; |
| 323 | 340 | ||
| 324 | outw(int_enable, uhci->io_addr + USBINTR); | 341 | uhci_writew(uhci, int_enable, USBINTR); |
| 325 | outw(egsm_enable | USBCMD_CF, uhci->io_addr + USBCMD); | 342 | uhci_writew(uhci, egsm_enable | USBCMD_CF, USBCMD); |
| 326 | mb(); | 343 | mb(); |
| 327 | udelay(5); | 344 | udelay(5); |
| 328 | 345 | ||
| @@ -331,7 +348,7 @@ __acquires(uhci->lock) | |||
| 331 | * controller should stop after a few microseconds. Otherwise | 348 | * controller should stop after a few microseconds. Otherwise |
| 332 | * we will give the controller one frame to stop. | 349 | * we will give the controller one frame to stop. |
| 333 | */ | 350 | */ |
| 334 | if (!auto_stop && !(inw(uhci->io_addr + USBSTS) & USBSTS_HCH)) { | 351 | if (!auto_stop && !(uhci_readw(uhci, USBSTS) & USBSTS_HCH)) { |
| 335 | uhci->rh_state = UHCI_RH_SUSPENDING; | 352 | uhci->rh_state = UHCI_RH_SUSPENDING; |
| 336 | spin_unlock_irq(&uhci->lock); | 353 | spin_unlock_irq(&uhci->lock); |
| 337 | msleep(1); | 354 | msleep(1); |
| @@ -339,7 +356,7 @@ __acquires(uhci->lock) | |||
| 339 | if (uhci->dead) | 356 | if (uhci->dead) |
| 340 | return; | 357 | return; |
| 341 | } | 358 | } |
| 342 | if (!(inw(uhci->io_addr + USBSTS) & USBSTS_HCH)) | 359 | if (!(uhci_readw(uhci, USBSTS) & USBSTS_HCH)) |
| 343 | dev_warn(uhci_dev(uhci), "Controller not stopped yet!\n"); | 360 | dev_warn(uhci_dev(uhci), "Controller not stopped yet!\n"); |
| 344 | 361 | ||
| 345 | uhci_get_current_frame_number(uhci); | 362 | uhci_get_current_frame_number(uhci); |
| @@ -361,15 +378,14 @@ __acquires(uhci->lock) | |||
| 361 | 378 | ||
| 362 | static void start_rh(struct uhci_hcd *uhci) | 379 | static void start_rh(struct uhci_hcd *uhci) |
| 363 | { | 380 | { |
| 364 | uhci_to_hcd(uhci)->state = HC_STATE_RUNNING; | ||
| 365 | uhci->is_stopped = 0; | 381 | uhci->is_stopped = 0; |
| 366 | 382 | ||
| 367 | /* Mark it configured and running with a 64-byte max packet. | 383 | /* Mark it configured and running with a 64-byte max packet. |
| 368 | * All interrupts are enabled, even though RESUME won't do anything. | 384 | * All interrupts are enabled, even though RESUME won't do anything. |
| 369 | */ | 385 | */ |
| 370 | outw(USBCMD_RS | USBCMD_CF | USBCMD_MAXP, uhci->io_addr + USBCMD); | 386 | uhci_writew(uhci, USBCMD_RS | USBCMD_CF | USBCMD_MAXP, USBCMD); |
| 371 | outw(USBINTR_TIMEOUT | USBINTR_RESUME | USBINTR_IOC | USBINTR_SP, | 387 | uhci_writew(uhci, USBINTR_TIMEOUT | USBINTR_RESUME | |
| 372 | uhci->io_addr + USBINTR); | 388 | USBINTR_IOC | USBINTR_SP, USBINTR); |
| 373 | mb(); | 389 | mb(); |
| 374 | uhci->rh_state = UHCI_RH_RUNNING; | 390 | uhci->rh_state = UHCI_RH_RUNNING; |
| 375 | set_bit(HCD_FLAG_POLL_RH, &uhci_to_hcd(uhci)->flags); | 391 | set_bit(HCD_FLAG_POLL_RH, &uhci_to_hcd(uhci)->flags); |
| @@ -392,9 +408,9 @@ __acquires(uhci->lock) | |||
| 392 | unsigned egsm; | 408 | unsigned egsm; |
| 393 | 409 | ||
| 394 | /* Keep EGSM on if it was set before */ | 410 | /* Keep EGSM on if it was set before */ |
| 395 | egsm = inw(uhci->io_addr + USBCMD) & USBCMD_EGSM; | 411 | egsm = uhci_readw(uhci, USBCMD) & USBCMD_EGSM; |
| 396 | uhci->rh_state = UHCI_RH_RESUMING; | 412 | uhci->rh_state = UHCI_RH_RESUMING; |
| 397 | outw(USBCMD_FGR | USBCMD_CF | egsm, uhci->io_addr + USBCMD); | 413 | uhci_writew(uhci, USBCMD_FGR | USBCMD_CF | egsm, USBCMD); |
| 398 | spin_unlock_irq(&uhci->lock); | 414 | spin_unlock_irq(&uhci->lock); |
| 399 | msleep(20); | 415 | msleep(20); |
| 400 | spin_lock_irq(&uhci->lock); | 416 | spin_lock_irq(&uhci->lock); |
| @@ -402,10 +418,10 @@ __acquires(uhci->lock) | |||
| 402 | return; | 418 | return; |
| 403 | 419 | ||
| 404 | /* End Global Resume and wait for EOP to be sent */ | 420 | /* End Global Resume and wait for EOP to be sent */ |
| 405 | outw(USBCMD_CF, uhci->io_addr + USBCMD); | 421 | uhci_writew(uhci, USBCMD_CF, USBCMD); |
| 406 | mb(); | 422 | mb(); |
| 407 | udelay(4); | 423 | udelay(4); |
| 408 | if (inw(uhci->io_addr + USBCMD) & USBCMD_FGR) | 424 | if (uhci_readw(uhci, USBCMD) & USBCMD_FGR) |
| 409 | dev_warn(uhci_dev(uhci), "FGR not stopped yet!\n"); | 425 | dev_warn(uhci_dev(uhci), "FGR not stopped yet!\n"); |
| 410 | } | 426 | } |
| 411 | 427 | ||
| @@ -425,10 +441,10 @@ static irqreturn_t uhci_irq(struct usb_hcd *hcd) | |||
| 425 | * interrupt cause. Contrary to the UHCI specification, the | 441 | * interrupt cause. Contrary to the UHCI specification, the |
| 426 | * "HC Halted" status bit is persistent: it is RO, not R/WC. | 442 | * "HC Halted" status bit is persistent: it is RO, not R/WC. |
| 427 | */ | 443 | */ |
| 428 | status = inw(uhci->io_addr + USBSTS); | 444 | status = uhci_readw(uhci, USBSTS); |
| 429 | if (!(status & ~USBSTS_HCH)) /* shared interrupt, not mine */ | 445 | if (!(status & ~USBSTS_HCH)) /* shared interrupt, not mine */ |
| 430 | return IRQ_NONE; | 446 | return IRQ_NONE; |
| 431 | outw(status, uhci->io_addr + USBSTS); /* Clear it */ | 447 | uhci_writew(uhci, status, USBSTS); /* Clear it */ |
| 432 | 448 | ||
| 433 | if (status & ~(USBSTS_USBINT | USBSTS_ERROR | USBSTS_RD)) { | 449 | if (status & ~(USBSTS_USBINT | USBSTS_ERROR | USBSTS_RD)) { |
| 434 | if (status & USBSTS_HSE) | 450 | if (status & USBSTS_HSE) |
| @@ -450,6 +466,7 @@ static irqreturn_t uhci_irq(struct usb_hcd *hcd) | |||
| 450 | lprintk(errbuf); | 466 | lprintk(errbuf); |
| 451 | } | 467 | } |
| 452 | uhci_hc_died(uhci); | 468 | uhci_hc_died(uhci); |
| 469 | usb_hc_died(hcd); | ||
| 453 | 470 | ||
| 454 | /* Force a callback in case there are | 471 | /* Force a callback in case there are |
| 455 | * pending unlinks */ | 472 | * pending unlinks */ |
| @@ -483,7 +500,7 @@ static void uhci_get_current_frame_number(struct uhci_hcd *uhci) | |||
| 483 | if (!uhci->is_stopped) { | 500 | if (!uhci->is_stopped) { |
| 484 | unsigned delta; | 501 | unsigned delta; |
| 485 | 502 | ||
| 486 | delta = (inw(uhci->io_addr + USBFRNUM) - uhci->frame_number) & | 503 | delta = (uhci_readw(uhci, USBFRNUM) - uhci->frame_number) & |
| 487 | (UHCI_NUMFRAMES - 1); | 504 | (UHCI_NUMFRAMES - 1); |
| 488 | uhci->frame_number += delta; | 505 | uhci->frame_number += delta; |
| 489 | } | 506 | } |
| @@ -520,61 +537,6 @@ static void release_uhci(struct uhci_hcd *uhci) | |||
| 520 | uhci->frame, uhci->frame_dma_handle); | 537 | uhci->frame, uhci->frame_dma_handle); |
| 521 | } | 538 | } |
| 522 | 539 | ||
| 523 | static int uhci_init(struct usb_hcd *hcd) | ||
| 524 | { | ||
| 525 | struct uhci_hcd *uhci = hcd_to_uhci(hcd); | ||
| 526 | unsigned io_size = (unsigned) hcd->rsrc_len; | ||
| 527 | int port; | ||
| 528 | |||
| 529 | uhci->io_addr = (unsigned long) hcd->rsrc_start; | ||
| 530 | |||
| 531 | /* The UHCI spec says devices must have 2 ports, and goes on to say | ||
| 532 | * they may have more but gives no way to determine how many there | ||
| 533 | * are. However according to the UHCI spec, Bit 7 of the port | ||
| 534 | * status and control register is always set to 1. So we try to | ||
| 535 | * use this to our advantage. Another common failure mode when | ||
| 536 | * a nonexistent register is addressed is to return all ones, so | ||
| 537 | * we test for that also. | ||
| 538 | */ | ||
| 539 | for (port = 0; port < (io_size - USBPORTSC1) / 2; port++) { | ||
| 540 | unsigned int portstatus; | ||
| 541 | |||
| 542 | portstatus = inw(uhci->io_addr + USBPORTSC1 + (port * 2)); | ||
| 543 | if (!(portstatus & 0x0080) || portstatus == 0xffff) | ||
| 544 | break; | ||
| 545 | } | ||
| 546 | if (debug) | ||
| 547 | dev_info(uhci_dev(uhci), "detected %d ports\n", port); | ||
| 548 | |||
| 549 | /* Anything greater than 7 is weird so we'll ignore it. */ | ||
| 550 | if (port > UHCI_RH_MAXCHILD) { | ||
| 551 | dev_info(uhci_dev(uhci), "port count misdetected? " | ||
| 552 | "forcing to 2 ports\n"); | ||
| 553 | port = 2; | ||
| 554 | } | ||
| 555 | uhci->rh_numports = port; | ||
| 556 | |||
| 557 | /* Kick BIOS off this hardware and reset if the controller | ||
| 558 | * isn't already safely quiescent. | ||
| 559 | */ | ||
| 560 | check_and_reset_hc(uhci); | ||
| 561 | return 0; | ||
| 562 | } | ||
| 563 | |||
| 564 | /* Make sure the controller is quiescent and that we're not using it | ||
| 565 | * any more. This is mainly for the benefit of programs which, like kexec, | ||
| 566 | * expect the hardware to be idle: not doing DMA or generating IRQs. | ||
| 567 | * | ||
| 568 | * This routine may be called in a damaged or failing kernel. Hence we | ||
| 569 | * do not acquire the spinlock before shutting down the controller. | ||
| 570 | */ | ||
| 571 | static void uhci_shutdown(struct pci_dev *pdev) | ||
| 572 | { | ||
| 573 | struct usb_hcd *hcd = pci_get_drvdata(pdev); | ||
| 574 | |||
| 575 | uhci_hc_died(hcd_to_uhci(hcd)); | ||
| 576 | } | ||
| 577 | |||
| 578 | /* | 540 | /* |
| 579 | * Allocate a frame list, and then setup the skeleton | 541 | * Allocate a frame list, and then setup the skeleton |
| 580 | * | 542 | * |
| @@ -669,16 +631,16 @@ static int uhci_start(struct usb_hcd *hcd) | |||
| 669 | * 8 Interrupt queues; link all higher int queues to int1 = async | 631 | * 8 Interrupt queues; link all higher int queues to int1 = async |
| 670 | */ | 632 | */ |
| 671 | for (i = SKEL_ISO + 1; i < SKEL_ASYNC; ++i) | 633 | for (i = SKEL_ISO + 1; i < SKEL_ASYNC; ++i) |
| 672 | uhci->skelqh[i]->link = LINK_TO_QH(uhci->skel_async_qh); | 634 | uhci->skelqh[i]->link = LINK_TO_QH(uhci, uhci->skel_async_qh); |
| 673 | uhci->skel_async_qh->link = UHCI_PTR_TERM; | 635 | uhci->skel_async_qh->link = UHCI_PTR_TERM(uhci); |
| 674 | uhci->skel_term_qh->link = LINK_TO_QH(uhci->skel_term_qh); | 636 | uhci->skel_term_qh->link = LINK_TO_QH(uhci, uhci->skel_term_qh); |
| 675 | 637 | ||
| 676 | /* This dummy TD is to work around a bug in Intel PIIX controllers */ | 638 | /* This dummy TD is to work around a bug in Intel PIIX controllers */ |
| 677 | uhci_fill_td(uhci->term_td, 0, uhci_explen(0) | | 639 | uhci_fill_td(uhci, uhci->term_td, 0, uhci_explen(0) | |
| 678 | (0x7f << TD_TOKEN_DEVADDR_SHIFT) | USB_PID_IN, 0); | 640 | (0x7f << TD_TOKEN_DEVADDR_SHIFT) | USB_PID_IN, 0); |
| 679 | uhci->term_td->link = UHCI_PTR_TERM; | 641 | uhci->term_td->link = UHCI_PTR_TERM(uhci); |
| 680 | uhci->skel_async_qh->element = uhci->skel_term_qh->element = | 642 | uhci->skel_async_qh->element = uhci->skel_term_qh->element = |
| 681 | LINK_TO_TD(uhci->term_td); | 643 | LINK_TO_TD(uhci, uhci->term_td); |
| 682 | 644 | ||
| 683 | /* | 645 | /* |
| 684 | * Fill the frame list: make all entries point to the proper | 646 | * Fill the frame list: make all entries point to the proper |
| @@ -791,86 +753,6 @@ static int uhci_rh_resume(struct usb_hcd *hcd) | |||
| 791 | return rc; | 753 | return rc; |
| 792 | } | 754 | } |
| 793 | 755 | ||
| 794 | static int uhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup) | ||
| 795 | { | ||
| 796 | struct uhci_hcd *uhci = hcd_to_uhci(hcd); | ||
| 797 | struct pci_dev *pdev = to_pci_dev(uhci_dev(uhci)); | ||
| 798 | int rc = 0; | ||
| 799 | |||
| 800 | dev_dbg(uhci_dev(uhci), "%s\n", __func__); | ||
| 801 | |||
| 802 | spin_lock_irq(&uhci->lock); | ||
| 803 | if (!HCD_HW_ACCESSIBLE(hcd) || uhci->dead) | ||
| 804 | goto done_okay; /* Already suspended or dead */ | ||
| 805 | |||
| 806 | if (uhci->rh_state > UHCI_RH_SUSPENDED) { | ||
| 807 | dev_warn(uhci_dev(uhci), "Root hub isn't suspended!\n"); | ||
| 808 | rc = -EBUSY; | ||
| 809 | goto done; | ||
| 810 | }; | ||
| 811 | |||
| 812 | /* All PCI host controllers are required to disable IRQ generation | ||
| 813 | * at the source, so we must turn off PIRQ. | ||
| 814 | */ | ||
| 815 | pci_write_config_word(pdev, USBLEGSUP, 0); | ||
| 816 | clear_bit(HCD_FLAG_POLL_RH, &hcd->flags); | ||
| 817 | |||
| 818 | /* Enable platform-specific non-PME# wakeup */ | ||
| 819 | if (do_wakeup) { | ||
| 820 | if (pdev->vendor == PCI_VENDOR_ID_INTEL) | ||
| 821 | pci_write_config_byte(pdev, USBRES_INTEL, | ||
| 822 | USBPORT1EN | USBPORT2EN); | ||
| 823 | } | ||
| 824 | |||
| 825 | done_okay: | ||
| 826 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | ||
| 827 | done: | ||
| 828 | spin_unlock_irq(&uhci->lock); | ||
| 829 | return rc; | ||
| 830 | } | ||
| 831 | |||
| 832 | static int uhci_pci_resume(struct usb_hcd *hcd, bool hibernated) | ||
| 833 | { | ||
| 834 | struct uhci_hcd *uhci = hcd_to_uhci(hcd); | ||
| 835 | |||
| 836 | dev_dbg(uhci_dev(uhci), "%s\n", __func__); | ||
| 837 | |||
| 838 | /* Since we aren't in D3 any more, it's safe to set this flag | ||
| 839 | * even if the controller was dead. | ||
| 840 | */ | ||
| 841 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | ||
| 842 | |||
| 843 | spin_lock_irq(&uhci->lock); | ||
| 844 | |||
| 845 | /* Make sure resume from hibernation re-enumerates everything */ | ||
| 846 | if (hibernated) | ||
| 847 | uhci_hc_died(uhci); | ||
| 848 | |||
| 849 | /* The firmware or a boot kernel may have changed the controller | ||
| 850 | * settings during a system wakeup. Check it and reconfigure | ||
| 851 | * to avoid problems. | ||
| 852 | */ | ||
| 853 | check_and_reset_hc(uhci); | ||
| 854 | |||
| 855 | /* If the controller was dead before, it's back alive now */ | ||
| 856 | configure_hc(uhci); | ||
| 857 | |||
| 858 | /* Tell the core if the controller had to be reset */ | ||
| 859 | if (uhci->rh_state == UHCI_RH_RESET) | ||
| 860 | usb_root_hub_lost_power(hcd->self.root_hub); | ||
| 861 | |||
| 862 | spin_unlock_irq(&uhci->lock); | ||
| 863 | |||
| 864 | /* If interrupts don't work and remote wakeup is enabled then | ||
| 865 | * the suspended root hub needs to be polled. | ||
| 866 | */ | ||
| 867 | if (!uhci->RD_enable && hcd->self.root_hub->do_remote_wakeup) | ||
| 868 | set_bit(HCD_FLAG_POLL_RH, &hcd->flags); | ||
| 869 | |||
| 870 | /* Does the root hub have a port wakeup pending? */ | ||
| 871 | usb_hcd_poll_rh_status(hcd); | ||
| 872 | return 0; | ||
| 873 | } | ||
| 874 | #endif | 756 | #endif |
| 875 | 757 | ||
| 876 | /* Wait until a particular device/endpoint's QH is idle, and free it */ | 758 | /* Wait until a particular device/endpoint's QH is idle, and free it */ |
| @@ -908,67 +790,62 @@ static int uhci_hcd_get_frame_number(struct usb_hcd *hcd) | |||
| 908 | /* Minimize latency by avoiding the spinlock */ | 790 | /* Minimize latency by avoiding the spinlock */ |
| 909 | frame_number = uhci->frame_number; | 791 | frame_number = uhci->frame_number; |
| 910 | barrier(); | 792 | barrier(); |
| 911 | delta = (inw(uhci->io_addr + USBFRNUM) - frame_number) & | 793 | delta = (uhci_readw(uhci, USBFRNUM) - frame_number) & |
| 912 | (UHCI_NUMFRAMES - 1); | 794 | (UHCI_NUMFRAMES - 1); |
| 913 | return frame_number + delta; | 795 | return frame_number + delta; |
| 914 | } | 796 | } |
| 915 | 797 | ||
| 916 | static const char hcd_name[] = "uhci_hcd"; | 798 | /* Determines number of ports on controller */ |
| 917 | 799 | static int uhci_count_ports(struct usb_hcd *hcd) | |
| 918 | static const struct hc_driver uhci_driver = { | 800 | { |
| 919 | .description = hcd_name, | 801 | struct uhci_hcd *uhci = hcd_to_uhci(hcd); |
| 920 | .product_desc = "UHCI Host Controller", | 802 | unsigned io_size = (unsigned) hcd->rsrc_len; |
| 921 | .hcd_priv_size = sizeof(struct uhci_hcd), | 803 | int port; |
| 922 | |||
| 923 | /* Generic hardware linkage */ | ||
| 924 | .irq = uhci_irq, | ||
| 925 | .flags = HCD_USB11, | ||
| 926 | |||
| 927 | /* Basic lifecycle operations */ | ||
| 928 | .reset = uhci_init, | ||
| 929 | .start = uhci_start, | ||
| 930 | #ifdef CONFIG_PM | ||
| 931 | .pci_suspend = uhci_pci_suspend, | ||
| 932 | .pci_resume = uhci_pci_resume, | ||
| 933 | .bus_suspend = uhci_rh_suspend, | ||
| 934 | .bus_resume = uhci_rh_resume, | ||
| 935 | #endif | ||
| 936 | .stop = uhci_stop, | ||
| 937 | 804 | ||
| 938 | .urb_enqueue = uhci_urb_enqueue, | 805 | /* The UHCI spec says devices must have 2 ports, and goes on to say |
| 939 | .urb_dequeue = uhci_urb_dequeue, | 806 | * they may have more but gives no way to determine how many there |
| 807 | * are. However according to the UHCI spec, Bit 7 of the port | ||
| 808 | * status and control register is always set to 1. So we try to | ||
| 809 | * use this to our advantage. Another common failure mode when | ||
| 810 | * a nonexistent register is addressed is to return all ones, so | ||
| 811 | * we test for that also. | ||
| 812 | */ | ||
| 813 | for (port = 0; port < (io_size - USBPORTSC1) / 2; port++) { | ||
| 814 | unsigned int portstatus; | ||
| 940 | 815 | ||
| 941 | .endpoint_disable = uhci_hcd_endpoint_disable, | 816 | portstatus = uhci_readw(uhci, USBPORTSC1 + (port * 2)); |
| 942 | .get_frame_number = uhci_hcd_get_frame_number, | 817 | if (!(portstatus & 0x0080) || portstatus == 0xffff) |
| 818 | break; | ||
| 819 | } | ||
| 820 | if (debug) | ||
| 821 | dev_info(uhci_dev(uhci), "detected %d ports\n", port); | ||
| 943 | 822 | ||
| 944 | .hub_status_data = uhci_hub_status_data, | 823 | /* Anything greater than 7 is weird so we'll ignore it. */ |
| 945 | .hub_control = uhci_hub_control, | 824 | if (port > UHCI_RH_MAXCHILD) { |
| 946 | }; | 825 | dev_info(uhci_dev(uhci), "port count misdetected? " |
| 826 | "forcing to 2 ports\n"); | ||
| 827 | port = 2; | ||
| 828 | } | ||
| 947 | 829 | ||
| 948 | static const struct pci_device_id uhci_pci_ids[] = { { | 830 | return port; |
| 949 | /* handle any USB UHCI controller */ | 831 | } |
| 950 | PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_UHCI, ~0), | ||
| 951 | .driver_data = (unsigned long) &uhci_driver, | ||
| 952 | }, { /* end: all zeroes */ } | ||
| 953 | }; | ||
| 954 | 832 | ||
| 955 | MODULE_DEVICE_TABLE(pci, uhci_pci_ids); | 833 | static const char hcd_name[] = "uhci_hcd"; |
| 956 | 834 | ||
| 957 | static struct pci_driver uhci_pci_driver = { | 835 | #ifdef CONFIG_PCI |
| 958 | .name = (char *)hcd_name, | 836 | #include "uhci-pci.c" |
| 959 | .id_table = uhci_pci_ids, | 837 | #define PCI_DRIVER uhci_pci_driver |
| 838 | #endif | ||
| 960 | 839 | ||
| 961 | .probe = usb_hcd_pci_probe, | 840 | #ifdef CONFIG_SPARC_LEON |
| 962 | .remove = usb_hcd_pci_remove, | 841 | #include "uhci-grlib.c" |
| 963 | .shutdown = uhci_shutdown, | 842 | #define PLATFORM_DRIVER uhci_grlib_driver |
| 843 | #endif | ||
| 964 | 844 | ||
| 965 | #ifdef CONFIG_PM_SLEEP | 845 | #if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) |
| 966 | .driver = { | 846 | #error "missing bus glue for uhci-hcd" |
| 967 | .pm = &usb_hcd_pci_pm_ops | ||
| 968 | }, | ||
| 969 | #endif | 847 | #endif |
| 970 | }; | 848 | |
| 971 | |||
| 972 | static int __init uhci_hcd_init(void) | 849 | static int __init uhci_hcd_init(void) |
| 973 | { | 850 | { |
| 974 | int retval = -ENOMEM; | 851 | int retval = -ENOMEM; |
| @@ -994,13 +871,27 @@ static int __init uhci_hcd_init(void) | |||
| 994 | if (!uhci_up_cachep) | 871 | if (!uhci_up_cachep) |
| 995 | goto up_failed; | 872 | goto up_failed; |
| 996 | 873 | ||
| 997 | retval = pci_register_driver(&uhci_pci_driver); | 874 | #ifdef PLATFORM_DRIVER |
| 998 | if (retval) | 875 | retval = platform_driver_register(&PLATFORM_DRIVER); |
| 999 | goto init_failed; | 876 | if (retval < 0) |
| 877 | goto clean0; | ||
| 878 | #endif | ||
| 879 | |||
| 880 | #ifdef PCI_DRIVER | ||
| 881 | retval = pci_register_driver(&PCI_DRIVER); | ||
| 882 | if (retval < 0) | ||
| 883 | goto clean1; | ||
| 884 | #endif | ||
| 1000 | 885 | ||
| 1001 | return 0; | 886 | return 0; |
| 1002 | 887 | ||
| 1003 | init_failed: | 888 | #ifdef PCI_DRIVER |
| 889 | clean1: | ||
| 890 | #endif | ||
| 891 | #ifdef PLATFORM_DRIVER | ||
| 892 | platform_driver_unregister(&PLATFORM_DRIVER); | ||
| 893 | clean0: | ||
| 894 | #endif | ||
| 1004 | kmem_cache_destroy(uhci_up_cachep); | 895 | kmem_cache_destroy(uhci_up_cachep); |
| 1005 | 896 | ||
| 1006 | up_failed: | 897 | up_failed: |
| @@ -1017,7 +908,12 @@ errbuf_failed: | |||
| 1017 | 908 | ||
| 1018 | static void __exit uhci_hcd_cleanup(void) | 909 | static void __exit uhci_hcd_cleanup(void) |
| 1019 | { | 910 | { |
| 1020 | pci_unregister_driver(&uhci_pci_driver); | 911 | #ifdef PLATFORM_DRIVER |
| 912 | platform_driver_unregister(&PLATFORM_DRIVER); | ||
| 913 | #endif | ||
| 914 | #ifdef PCI_DRIVER | ||
| 915 | pci_unregister_driver(&PCI_DRIVER); | ||
| 916 | #endif | ||
| 1021 | kmem_cache_destroy(uhci_up_cachep); | 917 | kmem_cache_destroy(uhci_up_cachep); |
| 1022 | debugfs_remove(uhci_debugfs_root); | 918 | debugfs_remove(uhci_debugfs_root); |
| 1023 | kfree(errbuf); | 919 | kfree(errbuf); |
diff --git a/drivers/usb/host/uhci-hcd.h b/drivers/usb/host/uhci-hcd.h index 49bf2790f9c..7af2b705204 100644 --- a/drivers/usb/host/uhci-hcd.h +++ b/drivers/usb/host/uhci-hcd.h | |||
| @@ -78,11 +78,11 @@ | |||
| 78 | #define USBPORT1EN 0x01 | 78 | #define USBPORT1EN 0x01 |
| 79 | #define USBPORT2EN 0x02 | 79 | #define USBPORT2EN 0x02 |
| 80 | 80 | ||
| 81 | #define UHCI_PTR_BITS cpu_to_le32(0x000F) | 81 | #define UHCI_PTR_BITS(uhci) cpu_to_hc32((uhci), 0x000F) |
| 82 | #define UHCI_PTR_TERM cpu_to_le32(0x0001) | 82 | #define UHCI_PTR_TERM(uhci) cpu_to_hc32((uhci), 0x0001) |
| 83 | #define UHCI_PTR_QH cpu_to_le32(0x0002) | 83 | #define UHCI_PTR_QH(uhci) cpu_to_hc32((uhci), 0x0002) |
| 84 | #define UHCI_PTR_DEPTH cpu_to_le32(0x0004) | 84 | #define UHCI_PTR_DEPTH(uhci) cpu_to_hc32((uhci), 0x0004) |
| 85 | #define UHCI_PTR_BREADTH cpu_to_le32(0x0000) | 85 | #define UHCI_PTR_BREADTH(uhci) cpu_to_hc32((uhci), 0x0000) |
| 86 | 86 | ||
| 87 | #define UHCI_NUMFRAMES 1024 /* in the frame list [array] */ | 87 | #define UHCI_NUMFRAMES 1024 /* in the frame list [array] */ |
| 88 | #define UHCI_MAX_SOF_NUMBER 2047 /* in an SOF packet */ | 88 | #define UHCI_MAX_SOF_NUMBER 2047 /* in an SOF packet */ |
| @@ -99,6 +99,22 @@ | |||
| 99 | 99 | ||
| 100 | 100 | ||
| 101 | /* | 101 | /* |
| 102 | * __hc32 and __hc16 are "Host Controller" types, they may be equivalent to | ||
| 103 | * __leXX (normally) or __beXX (given UHCI_BIG_ENDIAN_DESC), depending on | ||
| 104 | * the host controller implementation. | ||
| 105 | * | ||
| 106 | * To facilitate the strongest possible byte-order checking from "sparse" | ||
| 107 | * and so on, we use __leXX unless that's not practical. | ||
| 108 | */ | ||
| 109 | #ifdef CONFIG_USB_UHCI_BIG_ENDIAN_DESC | ||
| 110 | typedef __u32 __bitwise __hc32; | ||
| 111 | typedef __u16 __bitwise __hc16; | ||
| 112 | #else | ||
| 113 | #define __hc32 __le32 | ||
| 114 | #define __hc16 __le16 | ||
| 115 | #endif | ||
| 116 | |||
| 117 | /* | ||
| 102 | * Queue Headers | 118 | * Queue Headers |
| 103 | */ | 119 | */ |
| 104 | 120 | ||
| @@ -130,8 +146,8 @@ | |||
| 130 | 146 | ||
| 131 | struct uhci_qh { | 147 | struct uhci_qh { |
| 132 | /* Hardware fields */ | 148 | /* Hardware fields */ |
| 133 | __le32 link; /* Next QH in the schedule */ | 149 | __hc32 link; /* Next QH in the schedule */ |
| 134 | __le32 element; /* Queue element (TD) pointer */ | 150 | __hc32 element; /* Queue element (TD) pointer */ |
| 135 | 151 | ||
| 136 | /* Software fields */ | 152 | /* Software fields */ |
| 137 | dma_addr_t dma_handle; | 153 | dma_addr_t dma_handle; |
| @@ -168,14 +184,10 @@ struct uhci_qh { | |||
| 168 | * We need a special accessor for the element pointer because it is | 184 | * We need a special accessor for the element pointer because it is |
| 169 | * subject to asynchronous updates by the controller. | 185 | * subject to asynchronous updates by the controller. |
| 170 | */ | 186 | */ |
| 171 | static inline __le32 qh_element(struct uhci_qh *qh) { | 187 | #define qh_element(qh) ACCESS_ONCE((qh)->element) |
| 172 | __le32 element = qh->element; | ||
| 173 | 188 | ||
| 174 | barrier(); | 189 | #define LINK_TO_QH(uhci, qh) (UHCI_PTR_QH((uhci)) | \ |
| 175 | return element; | 190 | cpu_to_hc32((uhci), (qh)->dma_handle)) |
| 176 | } | ||
| 177 | |||
| 178 | #define LINK_TO_QH(qh) (UHCI_PTR_QH | cpu_to_le32((qh)->dma_handle)) | ||
| 179 | 191 | ||
| 180 | 192 | ||
| 181 | /* | 193 | /* |
| @@ -212,7 +224,7 @@ static inline __le32 qh_element(struct uhci_qh *qh) { | |||
| 212 | /* | 224 | /* |
| 213 | * for TD <info>: (a.k.a. Token) | 225 | * for TD <info>: (a.k.a. Token) |
| 214 | */ | 226 | */ |
| 215 | #define td_token(td) le32_to_cpu((td)->token) | 227 | #define td_token(uhci, td) hc32_to_cpu((uhci), (td)->token) |
| 216 | #define TD_TOKEN_DEVADDR_SHIFT 8 | 228 | #define TD_TOKEN_DEVADDR_SHIFT 8 |
| 217 | #define TD_TOKEN_TOGGLE_SHIFT 19 | 229 | #define TD_TOKEN_TOGGLE_SHIFT 19 |
| 218 | #define TD_TOKEN_TOGGLE (1 << 19) | 230 | #define TD_TOKEN_TOGGLE (1 << 19) |
| @@ -245,10 +257,10 @@ static inline __le32 qh_element(struct uhci_qh *qh) { | |||
| 245 | */ | 257 | */ |
| 246 | struct uhci_td { | 258 | struct uhci_td { |
| 247 | /* Hardware fields */ | 259 | /* Hardware fields */ |
| 248 | __le32 link; | 260 | __hc32 link; |
| 249 | __le32 status; | 261 | __hc32 status; |
| 250 | __le32 token; | 262 | __hc32 token; |
| 251 | __le32 buffer; | 263 | __hc32 buffer; |
| 252 | 264 | ||
| 253 | /* Software fields */ | 265 | /* Software fields */ |
| 254 | dma_addr_t dma_handle; | 266 | dma_addr_t dma_handle; |
| @@ -263,14 +275,10 @@ struct uhci_td { | |||
| 263 | * We need a special accessor for the control/status word because it is | 275 | * We need a special accessor for the control/status word because it is |
| 264 | * subject to asynchronous updates by the controller. | 276 | * subject to asynchronous updates by the controller. |
| 265 | */ | 277 | */ |
| 266 | static inline u32 td_status(struct uhci_td *td) { | 278 | #define td_status(uhci, td) hc32_to_cpu((uhci), \ |
| 267 | __le32 status = td->status; | 279 | ACCESS_ONCE((td)->status)) |
| 268 | 280 | ||
| 269 | barrier(); | 281 | #define LINK_TO_TD(uhci, td) (cpu_to_hc32((uhci), (td)->dma_handle)) |
| 270 | return le32_to_cpu(status); | ||
| 271 | } | ||
| 272 | |||
| 273 | #define LINK_TO_TD(td) (cpu_to_le32((td)->dma_handle)) | ||
| 274 | 282 | ||
| 275 | 283 | ||
| 276 | /* | 284 | /* |
| @@ -380,6 +388,9 @@ struct uhci_hcd { | |||
| 380 | /* Grabbed from PCI */ | 388 | /* Grabbed from PCI */ |
| 381 | unsigned long io_addr; | 389 | unsigned long io_addr; |
| 382 | 390 | ||
| 391 | /* Used when registers are memory mapped */ | ||
| 392 | void __iomem *regs; | ||
| 393 | |||
| 383 | struct dma_pool *qh_pool; | 394 | struct dma_pool *qh_pool; |
| 384 | struct dma_pool *td_pool; | 395 | struct dma_pool *td_pool; |
| 385 | 396 | ||
| @@ -390,7 +401,7 @@ struct uhci_hcd { | |||
| 390 | spinlock_t lock; | 401 | spinlock_t lock; |
| 391 | 402 | ||
| 392 | dma_addr_t frame_dma_handle; /* Hardware frame list */ | 403 | dma_addr_t frame_dma_handle; /* Hardware frame list */ |
| 393 | __le32 *frame; | 404 | __hc32 *frame; |
| 394 | void **frame_cpu; /* CPU's frame list */ | 405 | void **frame_cpu; /* CPU's frame list */ |
| 395 | 406 | ||
| 396 | enum uhci_rh_state rh_state; | 407 | enum uhci_rh_state rh_state; |
| @@ -415,6 +426,12 @@ struct uhci_hcd { | |||
| 415 | 426 | ||
| 416 | struct timer_list fsbr_timer; /* For turning off FBSR */ | 427 | struct timer_list fsbr_timer; /* For turning off FBSR */ |
| 417 | 428 | ||
| 429 | /* Silicon quirks */ | ||
| 430 | unsigned int oc_low:1; /* OverCurrent bit active low */ | ||
| 431 | unsigned int wait_for_hp:1; /* Wait for HP port reset */ | ||
| 432 | unsigned int big_endian_mmio:1; /* Big endian registers */ | ||
| 433 | unsigned int big_endian_desc:1; /* Big endian descriptors */ | ||
| 434 | |||
| 418 | /* Support for port suspend/resume/reset */ | 435 | /* Support for port suspend/resume/reset */ |
| 419 | unsigned long port_c_suspend; /* Bit-arrays of ports */ | 436 | unsigned long port_c_suspend; /* Bit-arrays of ports */ |
| 420 | unsigned long resuming_ports; | 437 | unsigned long resuming_ports; |
| @@ -429,6 +446,16 @@ struct uhci_hcd { | |||
| 429 | 446 | ||
| 430 | int total_load; /* Sum of array values */ | 447 | int total_load; /* Sum of array values */ |
| 431 | short load[MAX_PHASE]; /* Periodic allocations */ | 448 | short load[MAX_PHASE]; /* Periodic allocations */ |
| 449 | |||
| 450 | /* Reset host controller */ | ||
| 451 | void (*reset_hc) (struct uhci_hcd *uhci); | ||
| 452 | int (*check_and_reset_hc) (struct uhci_hcd *uhci); | ||
| 453 | /* configure_hc should perform arch specific settings, if needed */ | ||
| 454 | void (*configure_hc) (struct uhci_hcd *uhci); | ||
| 455 | /* Check for broken resume detect interrupts */ | ||
| 456 | int (*resume_detect_interrupts_are_broken) (struct uhci_hcd *uhci); | ||
| 457 | /* Check for broken global suspend */ | ||
| 458 | int (*global_suspend_mode_is_broken) (struct uhci_hcd *uhci); | ||
| 432 | }; | 459 | }; |
| 433 | 460 | ||
| 434 | /* Convert between a usb_hcd pointer and the corresponding uhci_hcd */ | 461 | /* Convert between a usb_hcd pointer and the corresponding uhci_hcd */ |
| @@ -467,4 +494,171 @@ struct urb_priv { | |||
| 467 | #define PCI_VENDOR_ID_GENESYS 0x17a0 | 494 | #define PCI_VENDOR_ID_GENESYS 0x17a0 |
| 468 | #define PCI_DEVICE_ID_GL880S_UHCI 0x8083 | 495 | #define PCI_DEVICE_ID_GL880S_UHCI 0x8083 |
| 469 | 496 | ||
| 497 | /* | ||
| 498 | * Functions used to access controller registers. The UCHI spec says that host | ||
| 499 | * controller I/O registers are mapped into PCI I/O space. For non-PCI hosts | ||
| 500 | * we use memory mapped registers. | ||
| 501 | */ | ||
| 502 | |||
| 503 | #ifndef CONFIG_USB_UHCI_SUPPORT_NON_PCI_HC | ||
| 504 | /* Support PCI only */ | ||
| 505 | static inline u32 uhci_readl(const struct uhci_hcd *uhci, int reg) | ||
| 506 | { | ||
| 507 | return inl(uhci->io_addr + reg); | ||
| 508 | } | ||
| 509 | |||
| 510 | static inline void uhci_writel(const struct uhci_hcd *uhci, u32 val, int reg) | ||
| 511 | { | ||
| 512 | outl(val, uhci->io_addr + reg); | ||
| 513 | } | ||
| 514 | |||
| 515 | static inline u16 uhci_readw(const struct uhci_hcd *uhci, int reg) | ||
| 516 | { | ||
| 517 | return inw(uhci->io_addr + reg); | ||
| 518 | } | ||
| 519 | |||
| 520 | static inline void uhci_writew(const struct uhci_hcd *uhci, u16 val, int reg) | ||
| 521 | { | ||
| 522 | outw(val, uhci->io_addr + reg); | ||
| 523 | } | ||
| 524 | |||
| 525 | static inline u8 uhci_readb(const struct uhci_hcd *uhci, int reg) | ||
| 526 | { | ||
| 527 | return inb(uhci->io_addr + reg); | ||
| 528 | } | ||
| 529 | |||
| 530 | static inline void uhci_writeb(const struct uhci_hcd *uhci, u8 val, int reg) | ||
| 531 | { | ||
| 532 | outb(val, uhci->io_addr + reg); | ||
| 533 | } | ||
| 534 | |||
| 535 | #else | ||
| 536 | /* Support non-PCI host controllers */ | ||
| 537 | #ifdef CONFIG_PCI | ||
| 538 | /* Support PCI and non-PCI host controllers */ | ||
| 539 | #define uhci_has_pci_registers(u) ((u)->io_addr != 0) | ||
| 540 | #else | ||
| 541 | /* Support non-PCI host controllers only */ | ||
| 542 | #define uhci_has_pci_registers(u) 0 | ||
| 543 | #endif | ||
| 544 | |||
| 545 | #ifdef CONFIG_USB_UHCI_BIG_ENDIAN_MMIO | ||
| 546 | /* Support (non-PCI) big endian host controllers */ | ||
| 547 | #define uhci_big_endian_mmio(u) ((u)->big_endian_mmio) | ||
| 548 | #else | ||
| 549 | #define uhci_big_endian_mmio(u) 0 | ||
| 550 | #endif | ||
| 551 | |||
| 552 | static inline u32 uhci_readl(const struct uhci_hcd *uhci, int reg) | ||
| 553 | { | ||
| 554 | if (uhci_has_pci_registers(uhci)) | ||
| 555 | return inl(uhci->io_addr + reg); | ||
| 556 | #ifdef CONFIG_USB_UHCI_BIG_ENDIAN_MMIO | ||
| 557 | else if (uhci_big_endian_mmio(uhci)) | ||
| 558 | return readl_be(uhci->regs + reg); | ||
| 559 | #endif | ||
| 560 | else | ||
| 561 | return readl(uhci->regs + reg); | ||
| 562 | } | ||
| 563 | |||
| 564 | static inline void uhci_writel(const struct uhci_hcd *uhci, u32 val, int reg) | ||
| 565 | { | ||
| 566 | if (uhci_has_pci_registers(uhci)) | ||
| 567 | outl(val, uhci->io_addr + reg); | ||
| 568 | #ifdef CONFIG_USB_UHCI_BIG_ENDIAN_MMIO | ||
| 569 | else if (uhci_big_endian_mmio(uhci)) | ||
| 570 | writel_be(val, uhci->regs + reg); | ||
| 571 | #endif | ||
| 572 | else | ||
| 573 | writel(val, uhci->regs + reg); | ||
| 574 | } | ||
| 575 | |||
| 576 | static inline u16 uhci_readw(const struct uhci_hcd *uhci, int reg) | ||
| 577 | { | ||
| 578 | if (uhci_has_pci_registers(uhci)) | ||
| 579 | return inw(uhci->io_addr + reg); | ||
| 580 | #ifdef CONFIG_USB_UHCI_BIG_ENDIAN_MMIO | ||
| 581 | else if (uhci_big_endian_mmio(uhci)) | ||
| 582 | return readw_be(uhci->regs + reg); | ||
| 583 | #endif | ||
| 584 | else | ||
| 585 | return readw(uhci->regs + reg); | ||
| 586 | } | ||
| 587 | |||
| 588 | static inline void uhci_writew(const struct uhci_hcd *uhci, u16 val, int reg) | ||
| 589 | { | ||
| 590 | if (uhci_has_pci_registers(uhci)) | ||
| 591 | outw(val, uhci->io_addr + reg); | ||
| 592 | #ifdef CONFIG_USB_UHCI_BIG_ENDIAN_MMIO | ||
| 593 | else if (uhci_big_endian_mmio(uhci)) | ||
| 594 | writew_be(val, uhci->regs + reg); | ||
| 595 | #endif | ||
| 596 | else | ||
| 597 | writew(val, uhci->regs + reg); | ||
| 598 | } | ||
| 599 | |||
| 600 | static inline u8 uhci_readb(const struct uhci_hcd *uhci, int reg) | ||
| 601 | { | ||
| 602 | if (uhci_has_pci_registers(uhci)) | ||
| 603 | return inb(uhci->io_addr + reg); | ||
| 604 | #ifdef CONFIG_USB_UHCI_BIG_ENDIAN_MMIO | ||
| 605 | else if (uhci_big_endian_mmio(uhci)) | ||
| 606 | return readb_be(uhci->regs + reg); | ||
| 607 | #endif | ||
| 608 | else | ||
| 609 | return readb(uhci->regs + reg); | ||
| 610 | } | ||
| 611 | |||
| 612 | static inline void uhci_writeb(const struct uhci_hcd *uhci, u8 val, int reg) | ||
| 613 | { | ||
| 614 | if (uhci_has_pci_registers(uhci)) | ||
| 615 | outb(val, uhci->io_addr + reg); | ||
| 616 | #ifdef CONFIG_USB_UHCI_BIG_ENDIAN_MMIO | ||
| 617 | else if (uhci_big_endian_mmio(uhci)) | ||
| 618 | writeb_be(val, uhci->regs + reg); | ||
| 619 | #endif | ||
| 620 | else | ||
| 621 | writeb(val, uhci->regs + reg); | ||
| 622 | } | ||
| 623 | #endif /* CONFIG_USB_UHCI_SUPPORT_NON_PCI_HC */ | ||
| 624 | |||
| 625 | /* | ||
| 626 | * The GRLIB GRUSBHC controller can use big endian format for its descriptors. | ||
| 627 | * | ||
| 628 | * UHCI controllers accessed through PCI work normally (little-endian | ||
| 629 | * everywhere), so we don't bother supporting a BE-only mode. | ||
| 630 | */ | ||
| 631 | #ifdef CONFIG_USB_UHCI_BIG_ENDIAN_DESC | ||
| 632 | #define uhci_big_endian_desc(u) ((u)->big_endian_desc) | ||
| 633 | |||
| 634 | /* cpu to uhci */ | ||
| 635 | static inline __hc32 cpu_to_hc32(const struct uhci_hcd *uhci, const u32 x) | ||
| 636 | { | ||
| 637 | return uhci_big_endian_desc(uhci) | ||
| 638 | ? (__force __hc32)cpu_to_be32(x) | ||
| 639 | : (__force __hc32)cpu_to_le32(x); | ||
| 640 | } | ||
| 641 | |||
| 642 | /* uhci to cpu */ | ||
| 643 | static inline u32 hc32_to_cpu(const struct uhci_hcd *uhci, const __hc32 x) | ||
| 644 | { | ||
| 645 | return uhci_big_endian_desc(uhci) | ||
| 646 | ? be32_to_cpu((__force __be32)x) | ||
| 647 | : le32_to_cpu((__force __le32)x); | ||
| 648 | } | ||
| 649 | |||
| 650 | #else | ||
| 651 | /* cpu to uhci */ | ||
| 652 | static inline __hc32 cpu_to_hc32(const struct uhci_hcd *uhci, const u32 x) | ||
| 653 | { | ||
| 654 | return cpu_to_le32(x); | ||
| 655 | } | ||
| 656 | |||
| 657 | /* uhci to cpu */ | ||
| 658 | static inline u32 hc32_to_cpu(const struct uhci_hcd *uhci, const __hc32 x) | ||
| 659 | { | ||
| 660 | return le32_to_cpu(x); | ||
| 661 | } | ||
| 662 | #endif | ||
| 663 | |||
| 470 | #endif | 664 | #endif |
diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c index 6d59c0f77f2..045cde4cbc3 100644 --- a/drivers/usb/host/uhci-hub.c +++ b/drivers/usb/host/uhci-hub.c | |||
| @@ -44,7 +44,7 @@ static int any_ports_active(struct uhci_hcd *uhci) | |||
| 44 | int port; | 44 | int port; |
| 45 | 45 | ||
| 46 | for (port = 0; port < uhci->rh_numports; ++port) { | 46 | for (port = 0; port < uhci->rh_numports; ++port) { |
| 47 | if ((inw(uhci->io_addr + USBPORTSC1 + port * 2) & | 47 | if ((uhci_readw(uhci, USBPORTSC1 + port * 2) & |
| 48 | (USBPORTSC_CCS | RWC_BITS)) || | 48 | (USBPORTSC_CCS | RWC_BITS)) || |
| 49 | test_bit(port, &uhci->port_c_suspend)) | 49 | test_bit(port, &uhci->port_c_suspend)) |
| 50 | return 1; | 50 | return 1; |
| @@ -68,7 +68,7 @@ static inline int get_hub_status_data(struct uhci_hcd *uhci, char *buf) | |||
| 68 | 68 | ||
| 69 | *buf = 0; | 69 | *buf = 0; |
| 70 | for (port = 0; port < uhci->rh_numports; ++port) { | 70 | for (port = 0; port < uhci->rh_numports; ++port) { |
| 71 | if ((inw(uhci->io_addr + USBPORTSC1 + port * 2) & mask) || | 71 | if ((uhci_readw(uhci, USBPORTSC1 + port * 2) & mask) || |
| 72 | test_bit(port, &uhci->port_c_suspend)) | 72 | test_bit(port, &uhci->port_c_suspend)) |
| 73 | *buf |= (1 << (port + 1)); | 73 | *buf |= (1 << (port + 1)); |
| 74 | } | 74 | } |
| @@ -78,17 +78,17 @@ static inline int get_hub_status_data(struct uhci_hcd *uhci, char *buf) | |||
| 78 | #define OK(x) len = (x); break | 78 | #define OK(x) len = (x); break |
| 79 | 79 | ||
| 80 | #define CLR_RH_PORTSTAT(x) \ | 80 | #define CLR_RH_PORTSTAT(x) \ |
| 81 | status = inw(port_addr); \ | 81 | status = uhci_readw(uhci, port_addr); \ |
| 82 | status &= ~(RWC_BITS|WZ_BITS); \ | 82 | status &= ~(RWC_BITS|WZ_BITS); \ |
| 83 | status &= ~(x); \ | 83 | status &= ~(x); \ |
| 84 | status |= RWC_BITS & (x); \ | 84 | status |= RWC_BITS & (x); \ |
| 85 | outw(status, port_addr) | 85 | uhci_writew(uhci, status, port_addr) |
| 86 | 86 | ||
| 87 | #define SET_RH_PORTSTAT(x) \ | 87 | #define SET_RH_PORTSTAT(x) \ |
| 88 | status = inw(port_addr); \ | 88 | status = uhci_readw(uhci, port_addr); \ |
| 89 | status |= (x); \ | 89 | status |= (x); \ |
| 90 | status &= ~(RWC_BITS|WZ_BITS); \ | 90 | status &= ~(RWC_BITS|WZ_BITS); \ |
| 91 | outw(status, port_addr) | 91 | uhci_writew(uhci, status, port_addr) |
| 92 | 92 | ||
| 93 | /* UHCI controllers don't automatically stop resume signalling after 20 msec, | 93 | /* UHCI controllers don't automatically stop resume signalling after 20 msec, |
| 94 | * so we have to poll and check timeouts in order to take care of it. | 94 | * so we have to poll and check timeouts in order to take care of it. |
| @@ -99,7 +99,7 @@ static void uhci_finish_suspend(struct uhci_hcd *uhci, int port, | |||
| 99 | int status; | 99 | int status; |
| 100 | int i; | 100 | int i; |
| 101 | 101 | ||
| 102 | if (inw(port_addr) & SUSPEND_BITS) { | 102 | if (uhci_readw(uhci, port_addr) & SUSPEND_BITS) { |
| 103 | CLR_RH_PORTSTAT(SUSPEND_BITS); | 103 | CLR_RH_PORTSTAT(SUSPEND_BITS); |
| 104 | if (test_bit(port, &uhci->resuming_ports)) | 104 | if (test_bit(port, &uhci->resuming_ports)) |
| 105 | set_bit(port, &uhci->port_c_suspend); | 105 | set_bit(port, &uhci->port_c_suspend); |
| @@ -110,7 +110,7 @@ static void uhci_finish_suspend(struct uhci_hcd *uhci, int port, | |||
| 110 | * Experiments show that some controllers take longer, so | 110 | * Experiments show that some controllers take longer, so |
| 111 | * we'll poll for completion. */ | 111 | * we'll poll for completion. */ |
| 112 | for (i = 0; i < 10; ++i) { | 112 | for (i = 0; i < 10; ++i) { |
| 113 | if (!(inw(port_addr) & SUSPEND_BITS)) | 113 | if (!(uhci_readw(uhci, port_addr) & SUSPEND_BITS)) |
| 114 | break; | 114 | break; |
| 115 | udelay(1); | 115 | udelay(1); |
| 116 | } | 116 | } |
| @@ -121,12 +121,12 @@ static void uhci_finish_suspend(struct uhci_hcd *uhci, int port, | |||
| 121 | /* Wait for the UHCI controller in HP's iLO2 server management chip. | 121 | /* Wait for the UHCI controller in HP's iLO2 server management chip. |
| 122 | * It can take up to 250 us to finish a reset and set the CSC bit. | 122 | * It can take up to 250 us to finish a reset and set the CSC bit. |
| 123 | */ | 123 | */ |
| 124 | static void wait_for_HP(unsigned long port_addr) | 124 | static void wait_for_HP(struct uhci_hcd *uhci, unsigned long port_addr) |
| 125 | { | 125 | { |
| 126 | int i; | 126 | int i; |
| 127 | 127 | ||
| 128 | for (i = 10; i < 250; i += 10) { | 128 | for (i = 10; i < 250; i += 10) { |
| 129 | if (inw(port_addr) & USBPORTSC_CSC) | 129 | if (uhci_readw(uhci, port_addr) & USBPORTSC_CSC) |
| 130 | return; | 130 | return; |
| 131 | udelay(10); | 131 | udelay(10); |
| 132 | } | 132 | } |
| @@ -140,8 +140,8 @@ static void uhci_check_ports(struct uhci_hcd *uhci) | |||
| 140 | int status; | 140 | int status; |
| 141 | 141 | ||
| 142 | for (port = 0; port < uhci->rh_numports; ++port) { | 142 | for (port = 0; port < uhci->rh_numports; ++port) { |
| 143 | port_addr = uhci->io_addr + USBPORTSC1 + 2 * port; | 143 | port_addr = USBPORTSC1 + 2 * port; |
| 144 | status = inw(port_addr); | 144 | status = uhci_readw(uhci, port_addr); |
| 145 | if (unlikely(status & USBPORTSC_PR)) { | 145 | if (unlikely(status & USBPORTSC_PR)) { |
| 146 | if (time_after_eq(jiffies, uhci->ports_timeout)) { | 146 | if (time_after_eq(jiffies, uhci->ports_timeout)) { |
| 147 | CLR_RH_PORTSTAT(USBPORTSC_PR); | 147 | CLR_RH_PORTSTAT(USBPORTSC_PR); |
| @@ -149,9 +149,8 @@ static void uhci_check_ports(struct uhci_hcd *uhci) | |||
| 149 | 149 | ||
| 150 | /* HP's server management chip requires | 150 | /* HP's server management chip requires |
| 151 | * a longer delay. */ | 151 | * a longer delay. */ |
| 152 | if (to_pci_dev(uhci_dev(uhci))->vendor == | 152 | if (uhci->wait_for_hp) |
| 153 | PCI_VENDOR_ID_HP) | 153 | wait_for_HP(uhci, port_addr); |
| 154 | wait_for_HP(port_addr); | ||
| 155 | 154 | ||
| 156 | /* If the port was enabled before, turning | 155 | /* If the port was enabled before, turning |
| 157 | * reset on caused a port enable change. | 156 | * reset on caused a port enable change. |
| @@ -242,7 +241,7 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 242 | struct uhci_hcd *uhci = hcd_to_uhci(hcd); | 241 | struct uhci_hcd *uhci = hcd_to_uhci(hcd); |
| 243 | int status, lstatus, retval = 0, len = 0; | 242 | int status, lstatus, retval = 0, len = 0; |
| 244 | unsigned int port = wIndex - 1; | 243 | unsigned int port = wIndex - 1; |
| 245 | unsigned long port_addr = uhci->io_addr + USBPORTSC1 + 2 * port; | 244 | unsigned long port_addr = USBPORTSC1 + 2 * port; |
| 246 | u16 wPortChange, wPortStatus; | 245 | u16 wPortChange, wPortStatus; |
| 247 | unsigned long flags; | 246 | unsigned long flags; |
| 248 | 247 | ||
| @@ -260,14 +259,13 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 260 | goto err; | 259 | goto err; |
| 261 | 260 | ||
| 262 | uhci_check_ports(uhci); | 261 | uhci_check_ports(uhci); |
| 263 | status = inw(port_addr); | 262 | status = uhci_readw(uhci, port_addr); |
| 264 | 263 | ||
| 265 | /* Intel controllers report the OverCurrent bit active on. | 264 | /* Intel controllers report the OverCurrent bit active on. |
| 266 | * VIA controllers report it active off, so we'll adjust the | 265 | * VIA controllers report it active off, so we'll adjust the |
| 267 | * bit value. (It's not standardized in the UHCI spec.) | 266 | * bit value. (It's not standardized in the UHCI spec.) |
| 268 | */ | 267 | */ |
| 269 | if (to_pci_dev(hcd->self.controller)->vendor == | 268 | if (uhci->oc_low) |
| 270 | PCI_VENDOR_ID_VIA) | ||
| 271 | status ^= USBPORTSC_OC; | 269 | status ^= USBPORTSC_OC; |
| 272 | 270 | ||
| 273 | /* UHCI doesn't support C_RESET (always false) */ | 271 | /* UHCI doesn't support C_RESET (always false) */ |
| @@ -358,7 +356,7 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 358 | CLR_RH_PORTSTAT(USBPORTSC_PEC); | 356 | CLR_RH_PORTSTAT(USBPORTSC_PEC); |
| 359 | OK(0); | 357 | OK(0); |
| 360 | case USB_PORT_FEAT_SUSPEND: | 358 | case USB_PORT_FEAT_SUSPEND: |
| 361 | if (!(inw(port_addr) & USBPORTSC_SUSP)) { | 359 | if (!(uhci_readw(uhci, port_addr) & USBPORTSC_SUSP)) { |
| 362 | 360 | ||
| 363 | /* Make certain the port isn't suspended */ | 361 | /* Make certain the port isn't suspended */ |
| 364 | uhci_finish_suspend(uhci, port, port_addr); | 362 | uhci_finish_suspend(uhci, port, port_addr); |
| @@ -370,7 +368,8 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 370 | * if the port is disabled. When this happens | 368 | * if the port is disabled. When this happens |
| 371 | * just skip the Resume signalling. | 369 | * just skip the Resume signalling. |
| 372 | */ | 370 | */ |
| 373 | if (!(inw(port_addr) & USBPORTSC_RD)) | 371 | if (!(uhci_readw(uhci, port_addr) & |
| 372 | USBPORTSC_RD)) | ||
| 374 | uhci_finish_suspend(uhci, port, | 373 | uhci_finish_suspend(uhci, port, |
| 375 | port_addr); | 374 | port_addr); |
| 376 | else | 375 | else |
diff --git a/drivers/usb/host/uhci-pci.c b/drivers/usb/host/uhci-pci.c new file mode 100644 index 00000000000..c300bd2f7d1 --- /dev/null +++ b/drivers/usb/host/uhci-pci.c | |||
| @@ -0,0 +1,301 @@ | |||
| 1 | /* | ||
| 2 | * UHCI HCD (Host Controller Driver) PCI Bus Glue. | ||
| 3 | * | ||
| 4 | * Extracted from uhci-hcd.c: | ||
| 5 | * Maintainer: Alan Stern <stern@rowland.harvard.edu> | ||
| 6 | * | ||
| 7 | * (C) Copyright 1999 Linus Torvalds | ||
| 8 | * (C) Copyright 1999-2002 Johannes Erdfelt, johannes@erdfelt.com | ||
| 9 | * (C) Copyright 1999 Randy Dunlap | ||
| 10 | * (C) Copyright 1999 Georg Acher, acher@in.tum.de | ||
| 11 | * (C) Copyright 1999 Deti Fliegl, deti@fliegl.de | ||
| 12 | * (C) Copyright 1999 Thomas Sailer, sailer@ife.ee.ethz.ch | ||
| 13 | * (C) Copyright 1999 Roman Weissgaerber, weissg@vienna.at | ||
| 14 | * (C) Copyright 2000 Yggdrasil Computing, Inc. (port of new PCI interface | ||
| 15 | * support from usb-ohci.c by Adam Richter, adam@yggdrasil.com). | ||
| 16 | * (C) Copyright 1999 Gregory P. Smith (from usb-ohci.c) | ||
| 17 | * (C) Copyright 2004-2007 Alan Stern, stern@rowland.harvard.edu | ||
| 18 | */ | ||
| 19 | |||
| 20 | #include "pci-quirks.h" | ||
| 21 | |||
| 22 | /* | ||
| 23 | * Make sure the controller is completely inactive, unable to | ||
| 24 | * generate interrupts or do DMA. | ||
| 25 | */ | ||
| 26 | static void uhci_pci_reset_hc(struct uhci_hcd *uhci) | ||
| 27 | { | ||
| 28 | uhci_reset_hc(to_pci_dev(uhci_dev(uhci)), uhci->io_addr); | ||
| 29 | } | ||
| 30 | |||
| 31 | /* | ||
| 32 | * Initialize a controller that was newly discovered or has just been | ||
| 33 | * resumed. In either case we can't be sure of its previous state. | ||
| 34 | * | ||
| 35 | * Returns: 1 if the controller was reset, 0 otherwise. | ||
| 36 | */ | ||
| 37 | static int uhci_pci_check_and_reset_hc(struct uhci_hcd *uhci) | ||
| 38 | { | ||
| 39 | return uhci_check_and_reset_hc(to_pci_dev(uhci_dev(uhci)), | ||
| 40 | uhci->io_addr); | ||
| 41 | } | ||
| 42 | |||
| 43 | /* | ||
| 44 | * Store the basic register settings needed by the controller. | ||
| 45 | * This function is called at the end of configure_hc in uhci-hcd.c. | ||
| 46 | */ | ||
| 47 | static void uhci_pci_configure_hc(struct uhci_hcd *uhci) | ||
| 48 | { | ||
| 49 | struct pci_dev *pdev = to_pci_dev(uhci_dev(uhci)); | ||
| 50 | |||
| 51 | /* Enable PIRQ */ | ||
| 52 | pci_write_config_word(pdev, USBLEGSUP, USBLEGSUP_DEFAULT); | ||
| 53 | |||
| 54 | /* Disable platform-specific non-PME# wakeup */ | ||
| 55 | if (pdev->vendor == PCI_VENDOR_ID_INTEL) | ||
| 56 | pci_write_config_byte(pdev, USBRES_INTEL, 0); | ||
| 57 | } | ||
| 58 | |||
| 59 | static int uhci_pci_resume_detect_interrupts_are_broken(struct uhci_hcd *uhci) | ||
| 60 | { | ||
| 61 | int port; | ||
| 62 | |||
| 63 | switch (to_pci_dev(uhci_dev(uhci))->vendor) { | ||
| 64 | default: | ||
| 65 | break; | ||
| 66 | |||
| 67 | case PCI_VENDOR_ID_GENESYS: | ||
| 68 | /* Genesys Logic's GL880S controllers don't generate | ||
| 69 | * resume-detect interrupts. | ||
| 70 | */ | ||
| 71 | return 1; | ||
| 72 | |||
| 73 | case PCI_VENDOR_ID_INTEL: | ||
| 74 | /* Some of Intel's USB controllers have a bug that causes | ||
| 75 | * resume-detect interrupts if any port has an over-current | ||
| 76 | * condition. To make matters worse, some motherboards | ||
| 77 | * hardwire unused USB ports' over-current inputs active! | ||
| 78 | * To prevent problems, we will not enable resume-detect | ||
| 79 | * interrupts if any ports are OC. | ||
| 80 | */ | ||
| 81 | for (port = 0; port < uhci->rh_numports; ++port) { | ||
| 82 | if (inw(uhci->io_addr + USBPORTSC1 + port * 2) & | ||
| 83 | USBPORTSC_OC) | ||
| 84 | return 1; | ||
| 85 | } | ||
| 86 | break; | ||
| 87 | } | ||
| 88 | return 0; | ||
| 89 | } | ||
| 90 | |||
| 91 | static int uhci_pci_global_suspend_mode_is_broken(struct uhci_hcd *uhci) | ||
| 92 | { | ||
| 93 | int port; | ||
| 94 | const char *sys_info; | ||
| 95 | static const char bad_Asus_board[] = "A7V8X"; | ||
| 96 | |||
| 97 | /* One of Asus's motherboards has a bug which causes it to | ||
| 98 | * wake up immediately from suspend-to-RAM if any of the ports | ||
| 99 | * are connected. In such cases we will not set EGSM. | ||
| 100 | */ | ||
| 101 | sys_info = dmi_get_system_info(DMI_BOARD_NAME); | ||
| 102 | if (sys_info && !strcmp(sys_info, bad_Asus_board)) { | ||
| 103 | for (port = 0; port < uhci->rh_numports; ++port) { | ||
| 104 | if (inw(uhci->io_addr + USBPORTSC1 + port * 2) & | ||
| 105 | USBPORTSC_CCS) | ||
| 106 | return 1; | ||
| 107 | } | ||
| 108 | } | ||
| 109 | |||
| 110 | return 0; | ||
| 111 | } | ||
| 112 | |||
| 113 | static int uhci_pci_init(struct usb_hcd *hcd) | ||
| 114 | { | ||
| 115 | struct uhci_hcd *uhci = hcd_to_uhci(hcd); | ||
| 116 | |||
| 117 | uhci->io_addr = (unsigned long) hcd->rsrc_start; | ||
| 118 | |||
| 119 | uhci->rh_numports = uhci_count_ports(hcd); | ||
| 120 | |||
| 121 | /* Intel controllers report the OverCurrent bit active on. | ||
| 122 | * VIA controllers report it active off, so we'll adjust the | ||
| 123 | * bit value. (It's not standardized in the UHCI spec.) | ||
| 124 | */ | ||
| 125 | if (to_pci_dev(uhci_dev(uhci))->vendor == PCI_VENDOR_ID_VIA) | ||
| 126 | uhci->oc_low = 1; | ||
| 127 | |||
| 128 | /* HP's server management chip requires a longer port reset delay. */ | ||
| 129 | if (to_pci_dev(uhci_dev(uhci))->vendor == PCI_VENDOR_ID_HP) | ||
| 130 | uhci->wait_for_hp = 1; | ||
| 131 | |||
| 132 | /* Set up pointers to PCI-specific functions */ | ||
| 133 | uhci->reset_hc = uhci_pci_reset_hc; | ||
| 134 | uhci->check_and_reset_hc = uhci_pci_check_and_reset_hc; | ||
| 135 | uhci->configure_hc = uhci_pci_configure_hc; | ||
| 136 | uhci->resume_detect_interrupts_are_broken = | ||
| 137 | uhci_pci_resume_detect_interrupts_are_broken; | ||
| 138 | uhci->global_suspend_mode_is_broken = | ||
| 139 | uhci_pci_global_suspend_mode_is_broken; | ||
| 140 | |||
| 141 | |||
| 142 | /* Kick BIOS off this hardware and reset if the controller | ||
| 143 | * isn't already safely quiescent. | ||
| 144 | */ | ||
| 145 | check_and_reset_hc(uhci); | ||
| 146 | return 0; | ||
| 147 | } | ||
| 148 | |||
| 149 | /* Make sure the controller is quiescent and that we're not using it | ||
| 150 | * any more. This is mainly for the benefit of programs which, like kexec, | ||
| 151 | * expect the hardware to be idle: not doing DMA or generating IRQs. | ||
| 152 | * | ||
| 153 | * This routine may be called in a damaged or failing kernel. Hence we | ||
| 154 | * do not acquire the spinlock before shutting down the controller. | ||
| 155 | */ | ||
| 156 | static void uhci_shutdown(struct pci_dev *pdev) | ||
| 157 | { | ||
| 158 | struct usb_hcd *hcd = pci_get_drvdata(pdev); | ||
| 159 | |||
| 160 | uhci_hc_died(hcd_to_uhci(hcd)); | ||
| 161 | } | ||
| 162 | |||
| 163 | #ifdef CONFIG_PM | ||
| 164 | |||
| 165 | static int uhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup) | ||
| 166 | { | ||
| 167 | struct uhci_hcd *uhci = hcd_to_uhci(hcd); | ||
| 168 | struct pci_dev *pdev = to_pci_dev(uhci_dev(uhci)); | ||
| 169 | int rc = 0; | ||
| 170 | |||
| 171 | dev_dbg(uhci_dev(uhci), "%s\n", __func__); | ||
| 172 | |||
| 173 | spin_lock_irq(&uhci->lock); | ||
| 174 | if (!HCD_HW_ACCESSIBLE(hcd) || uhci->dead) | ||
| 175 | goto done_okay; /* Already suspended or dead */ | ||
| 176 | |||
| 177 | if (uhci->rh_state > UHCI_RH_SUSPENDED) { | ||
| 178 | dev_warn(uhci_dev(uhci), "Root hub isn't suspended!\n"); | ||
| 179 | rc = -EBUSY; | ||
| 180 | goto done; | ||
| 181 | }; | ||
| 182 | |||
| 183 | /* All PCI host controllers are required to disable IRQ generation | ||
| 184 | * at the source, so we must turn off PIRQ. | ||
| 185 | */ | ||
| 186 | pci_write_config_word(pdev, USBLEGSUP, 0); | ||
| 187 | clear_bit(HCD_FLAG_POLL_RH, &hcd->flags); | ||
| 188 | |||
| 189 | /* Enable platform-specific non-PME# wakeup */ | ||
| 190 | if (do_wakeup) { | ||
| 191 | if (pdev->vendor == PCI_VENDOR_ID_INTEL) | ||
| 192 | pci_write_config_byte(pdev, USBRES_INTEL, | ||
| 193 | USBPORT1EN | USBPORT2EN); | ||
| 194 | } | ||
| 195 | |||
| 196 | done_okay: | ||
| 197 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | ||
| 198 | done: | ||
| 199 | spin_unlock_irq(&uhci->lock); | ||
| 200 | return rc; | ||
| 201 | } | ||
| 202 | |||
| 203 | static int uhci_pci_resume(struct usb_hcd *hcd, bool hibernated) | ||
| 204 | { | ||
| 205 | struct uhci_hcd *uhci = hcd_to_uhci(hcd); | ||
| 206 | |||
| 207 | dev_dbg(uhci_dev(uhci), "%s\n", __func__); | ||
| 208 | |||
| 209 | /* Since we aren't in D3 any more, it's safe to set this flag | ||
| 210 | * even if the controller was dead. | ||
| 211 | */ | ||
| 212 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | ||
| 213 | |||
| 214 | spin_lock_irq(&uhci->lock); | ||
| 215 | |||
| 216 | /* Make sure resume from hibernation re-enumerates everything */ | ||
| 217 | if (hibernated) { | ||
| 218 | uhci->reset_hc(uhci); | ||
| 219 | finish_reset(uhci); | ||
| 220 | } | ||
| 221 | |||
| 222 | /* The firmware may have changed the controller settings during | ||
| 223 | * a system wakeup. Check it and reconfigure to avoid problems. | ||
| 224 | */ | ||
| 225 | else { | ||
| 226 | check_and_reset_hc(uhci); | ||
| 227 | } | ||
| 228 | configure_hc(uhci); | ||
| 229 | |||
| 230 | /* Tell the core if the controller had to be reset */ | ||
| 231 | if (uhci->rh_state == UHCI_RH_RESET) | ||
| 232 | usb_root_hub_lost_power(hcd->self.root_hub); | ||
| 233 | |||
| 234 | spin_unlock_irq(&uhci->lock); | ||
| 235 | |||
| 236 | /* If interrupts don't work and remote wakeup is enabled then | ||
| 237 | * the suspended root hub needs to be polled. | ||
| 238 | */ | ||
| 239 | if (!uhci->RD_enable && hcd->self.root_hub->do_remote_wakeup) | ||
| 240 | set_bit(HCD_FLAG_POLL_RH, &hcd->flags); | ||
| 241 | |||
| 242 | /* Does the root hub have a port wakeup pending? */ | ||
| 243 | usb_hcd_poll_rh_status(hcd); | ||
| 244 | return 0; | ||
| 245 | } | ||
| 246 | |||
| 247 | #endif | ||
| 248 | |||
| 249 | static const struct hc_driver uhci_driver = { | ||
| 250 | .description = hcd_name, | ||
| 251 | .product_desc = "UHCI Host Controller", | ||
| 252 | .hcd_priv_size = sizeof(struct uhci_hcd), | ||
| 253 | |||
| 254 | /* Generic hardware linkage */ | ||
| 255 | .irq = uhci_irq, | ||
| 256 | .flags = HCD_USB11, | ||
| 257 | |||
| 258 | /* Basic lifecycle operations */ | ||
| 259 | .reset = uhci_pci_init, | ||
| 260 | .start = uhci_start, | ||
| 261 | #ifdef CONFIG_PM | ||
| 262 | .pci_suspend = uhci_pci_suspend, | ||
| 263 | .pci_resume = uhci_pci_resume, | ||
| 264 | .bus_suspend = uhci_rh_suspend, | ||
| 265 | .bus_resume = uhci_rh_resume, | ||
| 266 | #endif | ||
| 267 | .stop = uhci_stop, | ||
| 268 | |||
| 269 | .urb_enqueue = uhci_urb_enqueue, | ||
| 270 | .urb_dequeue = uhci_urb_dequeue, | ||
| 271 | |||
| 272 | .endpoint_disable = uhci_hcd_endpoint_disable, | ||
| 273 | .get_frame_number = uhci_hcd_get_frame_number, | ||
| 274 | |||
| 275 | .hub_status_data = uhci_hub_status_data, | ||
| 276 | .hub_control = uhci_hub_control, | ||
| 277 | }; | ||
| 278 | |||
| 279 | static DEFINE_PCI_DEVICE_TABLE(uhci_pci_ids) = { { | ||
| 280 | /* handle any USB UHCI controller */ | ||
| 281 | PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_UHCI, ~0), | ||
| 282 | .driver_data = (unsigned long) &uhci_driver, | ||
| 283 | }, { /* end: all zeroes */ } | ||
| 284 | }; | ||
| 285 | |||
| 286 | MODULE_DEVICE_TABLE(pci, uhci_pci_ids); | ||
| 287 | |||
| 288 | static struct pci_driver uhci_pci_driver = { | ||
| 289 | .name = (char *)hcd_name, | ||
| 290 | .id_table = uhci_pci_ids, | ||
| 291 | |||
| 292 | .probe = usb_hcd_pci_probe, | ||
| 293 | .remove = usb_hcd_pci_remove, | ||
| 294 | .shutdown = uhci_shutdown, | ||
| 295 | |||
| 296 | #ifdef CONFIG_PM_SLEEP | ||
| 297 | .driver = { | ||
| 298 | .pm = &usb_hcd_pci_pm_ops | ||
| 299 | }, | ||
| 300 | #endif | ||
| 301 | }; | ||
diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c index af77abb5c68..84ed28b34f9 100644 --- a/drivers/usb/host/uhci-q.c +++ b/drivers/usb/host/uhci-q.c | |||
| @@ -29,12 +29,12 @@ static void uhci_set_next_interrupt(struct uhci_hcd *uhci) | |||
| 29 | { | 29 | { |
| 30 | if (uhci->is_stopped) | 30 | if (uhci->is_stopped) |
| 31 | mod_timer(&uhci_to_hcd(uhci)->rh_timer, jiffies); | 31 | mod_timer(&uhci_to_hcd(uhci)->rh_timer, jiffies); |
| 32 | uhci->term_td->status |= cpu_to_le32(TD_CTRL_IOC); | 32 | uhci->term_td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC); |
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | static inline void uhci_clear_next_interrupt(struct uhci_hcd *uhci) | 35 | static inline void uhci_clear_next_interrupt(struct uhci_hcd *uhci) |
| 36 | { | 36 | { |
| 37 | uhci->term_td->status &= ~cpu_to_le32(TD_CTRL_IOC); | 37 | uhci->term_td->status &= ~cpu_to_hc32(uhci, TD_CTRL_IOC); |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | 40 | ||
| @@ -53,7 +53,7 @@ static void uhci_fsbr_on(struct uhci_hcd *uhci) | |||
| 53 | uhci->fsbr_is_on = 1; | 53 | uhci->fsbr_is_on = 1; |
| 54 | lqh = list_entry(uhci->skel_async_qh->node.prev, | 54 | lqh = list_entry(uhci->skel_async_qh->node.prev, |
| 55 | struct uhci_qh, node); | 55 | struct uhci_qh, node); |
| 56 | lqh->link = LINK_TO_QH(uhci->skel_term_qh); | 56 | lqh->link = LINK_TO_QH(uhci, uhci->skel_term_qh); |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | static void uhci_fsbr_off(struct uhci_hcd *uhci) | 59 | static void uhci_fsbr_off(struct uhci_hcd *uhci) |
| @@ -65,7 +65,7 @@ static void uhci_fsbr_off(struct uhci_hcd *uhci) | |||
| 65 | uhci->fsbr_is_on = 0; | 65 | uhci->fsbr_is_on = 0; |
| 66 | lqh = list_entry(uhci->skel_async_qh->node.prev, | 66 | lqh = list_entry(uhci->skel_async_qh->node.prev, |
| 67 | struct uhci_qh, node); | 67 | struct uhci_qh, node); |
| 68 | lqh->link = UHCI_PTR_TERM; | 68 | lqh->link = UHCI_PTR_TERM(uhci); |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | static void uhci_add_fsbr(struct uhci_hcd *uhci, struct urb *urb) | 71 | static void uhci_add_fsbr(struct uhci_hcd *uhci, struct urb *urb) |
| @@ -131,12 +131,12 @@ static void uhci_free_td(struct uhci_hcd *uhci, struct uhci_td *td) | |||
| 131 | dma_pool_free(uhci->td_pool, td, td->dma_handle); | 131 | dma_pool_free(uhci->td_pool, td, td->dma_handle); |
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | static inline void uhci_fill_td(struct uhci_td *td, u32 status, | 134 | static inline void uhci_fill_td(struct uhci_hcd *uhci, struct uhci_td *td, |
| 135 | u32 token, u32 buffer) | 135 | u32 status, u32 token, u32 buffer) |
| 136 | { | 136 | { |
| 137 | td->status = cpu_to_le32(status); | 137 | td->status = cpu_to_hc32(uhci, status); |
| 138 | td->token = cpu_to_le32(token); | 138 | td->token = cpu_to_hc32(uhci, token); |
| 139 | td->buffer = cpu_to_le32(buffer); | 139 | td->buffer = cpu_to_hc32(uhci, buffer); |
| 140 | } | 140 | } |
| 141 | 141 | ||
| 142 | static void uhci_add_td_to_urbp(struct uhci_td *td, struct urb_priv *urbp) | 142 | static void uhci_add_td_to_urbp(struct uhci_td *td, struct urb_priv *urbp) |
| @@ -170,11 +170,11 @@ static inline void uhci_insert_td_in_frame_list(struct uhci_hcd *uhci, | |||
| 170 | 170 | ||
| 171 | td->link = ltd->link; | 171 | td->link = ltd->link; |
| 172 | wmb(); | 172 | wmb(); |
| 173 | ltd->link = LINK_TO_TD(td); | 173 | ltd->link = LINK_TO_TD(uhci, td); |
| 174 | } else { | 174 | } else { |
| 175 | td->link = uhci->frame[framenum]; | 175 | td->link = uhci->frame[framenum]; |
| 176 | wmb(); | 176 | wmb(); |
| 177 | uhci->frame[framenum] = LINK_TO_TD(td); | 177 | uhci->frame[framenum] = LINK_TO_TD(uhci, td); |
| 178 | uhci->frame_cpu[framenum] = td; | 178 | uhci->frame_cpu[framenum] = td; |
| 179 | } | 179 | } |
| 180 | } | 180 | } |
| @@ -198,7 +198,7 @@ static inline void uhci_remove_td_from_frame_list(struct uhci_hcd *uhci, | |||
| 198 | ntd = list_entry(td->fl_list.next, | 198 | ntd = list_entry(td->fl_list.next, |
| 199 | struct uhci_td, | 199 | struct uhci_td, |
| 200 | fl_list); | 200 | fl_list); |
| 201 | uhci->frame[td->frame] = LINK_TO_TD(ntd); | 201 | uhci->frame[td->frame] = LINK_TO_TD(uhci, ntd); |
| 202 | uhci->frame_cpu[td->frame] = ntd; | 202 | uhci->frame_cpu[td->frame] = ntd; |
| 203 | } | 203 | } |
| 204 | } else { | 204 | } else { |
| @@ -255,8 +255,8 @@ static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci, | |||
| 255 | memset(qh, 0, sizeof(*qh)); | 255 | memset(qh, 0, sizeof(*qh)); |
| 256 | qh->dma_handle = dma_handle; | 256 | qh->dma_handle = dma_handle; |
| 257 | 257 | ||
| 258 | qh->element = UHCI_PTR_TERM; | 258 | qh->element = UHCI_PTR_TERM(uhci); |
| 259 | qh->link = UHCI_PTR_TERM; | 259 | qh->link = UHCI_PTR_TERM(uhci); |
| 260 | 260 | ||
| 261 | INIT_LIST_HEAD(&qh->queue); | 261 | INIT_LIST_HEAD(&qh->queue); |
| 262 | INIT_LIST_HEAD(&qh->node); | 262 | INIT_LIST_HEAD(&qh->node); |
| @@ -348,9 +348,9 @@ static int uhci_cleanup_queue(struct uhci_hcd *uhci, struct uhci_qh *qh, | |||
| 348 | 348 | ||
| 349 | /* If the QH element pointer is UHCI_PTR_TERM then then currently | 349 | /* If the QH element pointer is UHCI_PTR_TERM then then currently |
| 350 | * executing URB has already been unlinked, so this one isn't it. */ | 350 | * executing URB has already been unlinked, so this one isn't it. */ |
| 351 | if (qh_element(qh) == UHCI_PTR_TERM) | 351 | if (qh_element(qh) == UHCI_PTR_TERM(uhci)) |
| 352 | goto done; | 352 | goto done; |
| 353 | qh->element = UHCI_PTR_TERM; | 353 | qh->element = UHCI_PTR_TERM(uhci); |
| 354 | 354 | ||
| 355 | /* Control pipes don't have to worry about toggles */ | 355 | /* Control pipes don't have to worry about toggles */ |
| 356 | if (qh->type == USB_ENDPOINT_XFER_CONTROL) | 356 | if (qh->type == USB_ENDPOINT_XFER_CONTROL) |
| @@ -360,7 +360,7 @@ static int uhci_cleanup_queue(struct uhci_hcd *uhci, struct uhci_qh *qh, | |||
| 360 | WARN_ON(list_empty(&urbp->td_list)); | 360 | WARN_ON(list_empty(&urbp->td_list)); |
| 361 | td = list_entry(urbp->td_list.next, struct uhci_td, list); | 361 | td = list_entry(urbp->td_list.next, struct uhci_td, list); |
| 362 | qh->needs_fixup = 1; | 362 | qh->needs_fixup = 1; |
| 363 | qh->initial_toggle = uhci_toggle(td_token(td)); | 363 | qh->initial_toggle = uhci_toggle(td_token(uhci, td)); |
| 364 | 364 | ||
| 365 | done: | 365 | done: |
| 366 | return ret; | 366 | return ret; |
| @@ -370,7 +370,8 @@ done: | |||
| 370 | * Fix up the data toggles for URBs in a queue, when one of them | 370 | * Fix up the data toggles for URBs in a queue, when one of them |
| 371 | * terminates early (short transfer, error, or dequeued). | 371 | * terminates early (short transfer, error, or dequeued). |
| 372 | */ | 372 | */ |
| 373 | static void uhci_fixup_toggles(struct uhci_qh *qh, int skip_first) | 373 | static void uhci_fixup_toggles(struct uhci_hcd *uhci, struct uhci_qh *qh, |
| 374 | int skip_first) | ||
| 374 | { | 375 | { |
| 375 | struct urb_priv *urbp = NULL; | 376 | struct urb_priv *urbp = NULL; |
| 376 | struct uhci_td *td; | 377 | struct uhci_td *td; |
| @@ -384,7 +385,7 @@ static void uhci_fixup_toggles(struct uhci_qh *qh, int skip_first) | |||
| 384 | 385 | ||
| 385 | /* When starting with the first URB, if the QH element pointer is | 386 | /* When starting with the first URB, if the QH element pointer is |
| 386 | * still valid then we know the URB's toggles are okay. */ | 387 | * still valid then we know the URB's toggles are okay. */ |
| 387 | else if (qh_element(qh) != UHCI_PTR_TERM) | 388 | else if (qh_element(qh) != UHCI_PTR_TERM(uhci)) |
| 388 | toggle = 2; | 389 | toggle = 2; |
| 389 | 390 | ||
| 390 | /* Fix up the toggle for the URBs in the queue. Normally this | 391 | /* Fix up the toggle for the URBs in the queue. Normally this |
| @@ -396,15 +397,15 @@ static void uhci_fixup_toggles(struct uhci_qh *qh, int skip_first) | |||
| 396 | /* If the first TD has the right toggle value, we don't | 397 | /* If the first TD has the right toggle value, we don't |
| 397 | * need to change any toggles in this URB */ | 398 | * need to change any toggles in this URB */ |
| 398 | td = list_entry(urbp->td_list.next, struct uhci_td, list); | 399 | td = list_entry(urbp->td_list.next, struct uhci_td, list); |
| 399 | if (toggle > 1 || uhci_toggle(td_token(td)) == toggle) { | 400 | if (toggle > 1 || uhci_toggle(td_token(uhci, td)) == toggle) { |
| 400 | td = list_entry(urbp->td_list.prev, struct uhci_td, | 401 | td = list_entry(urbp->td_list.prev, struct uhci_td, |
| 401 | list); | 402 | list); |
| 402 | toggle = uhci_toggle(td_token(td)) ^ 1; | 403 | toggle = uhci_toggle(td_token(uhci, td)) ^ 1; |
| 403 | 404 | ||
| 404 | /* Otherwise all the toggles in the URB have to be switched */ | 405 | /* Otherwise all the toggles in the URB have to be switched */ |
| 405 | } else { | 406 | } else { |
| 406 | list_for_each_entry(td, &urbp->td_list, list) { | 407 | list_for_each_entry(td, &urbp->td_list, list) { |
| 407 | td->token ^= cpu_to_le32( | 408 | td->token ^= cpu_to_hc32(uhci, |
| 408 | TD_TOKEN_TOGGLE); | 409 | TD_TOKEN_TOGGLE); |
| 409 | toggle ^= 1; | 410 | toggle ^= 1; |
| 410 | } | 411 | } |
| @@ -441,7 +442,7 @@ static void link_interrupt(struct uhci_hcd *uhci, struct uhci_qh *qh) | |||
| 441 | pqh = list_entry(qh->node.prev, struct uhci_qh, node); | 442 | pqh = list_entry(qh->node.prev, struct uhci_qh, node); |
| 442 | qh->link = pqh->link; | 443 | qh->link = pqh->link; |
| 443 | wmb(); | 444 | wmb(); |
| 444 | pqh->link = LINK_TO_QH(qh); | 445 | pqh->link = LINK_TO_QH(uhci, qh); |
| 445 | } | 446 | } |
| 446 | 447 | ||
| 447 | /* | 448 | /* |
| @@ -451,7 +452,7 @@ static void link_interrupt(struct uhci_hcd *uhci, struct uhci_qh *qh) | |||
| 451 | static void link_async(struct uhci_hcd *uhci, struct uhci_qh *qh) | 452 | static void link_async(struct uhci_hcd *uhci, struct uhci_qh *qh) |
| 452 | { | 453 | { |
| 453 | struct uhci_qh *pqh; | 454 | struct uhci_qh *pqh; |
| 454 | __le32 link_to_new_qh; | 455 | __hc32 link_to_new_qh; |
| 455 | 456 | ||
| 456 | /* Find the predecessor QH for our new one and insert it in the list. | 457 | /* Find the predecessor QH for our new one and insert it in the list. |
| 457 | * The list of QHs is expected to be short, so linear search won't | 458 | * The list of QHs is expected to be short, so linear search won't |
| @@ -465,7 +466,7 @@ static void link_async(struct uhci_hcd *uhci, struct uhci_qh *qh) | |||
| 465 | /* Link it into the schedule */ | 466 | /* Link it into the schedule */ |
| 466 | qh->link = pqh->link; | 467 | qh->link = pqh->link; |
| 467 | wmb(); | 468 | wmb(); |
| 468 | link_to_new_qh = LINK_TO_QH(qh); | 469 | link_to_new_qh = LINK_TO_QH(uhci, qh); |
| 469 | pqh->link = link_to_new_qh; | 470 | pqh->link = link_to_new_qh; |
| 470 | 471 | ||
| 471 | /* If this is now the first FSBR QH, link the terminating skeleton | 472 | /* If this is now the first FSBR QH, link the terminating skeleton |
| @@ -483,13 +484,13 @@ static void uhci_activate_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) | |||
| 483 | 484 | ||
| 484 | /* Set the element pointer if it isn't set already. | 485 | /* Set the element pointer if it isn't set already. |
| 485 | * This isn't needed for Isochronous queues, but it doesn't hurt. */ | 486 | * This isn't needed for Isochronous queues, but it doesn't hurt. */ |
| 486 | if (qh_element(qh) == UHCI_PTR_TERM) { | 487 | if (qh_element(qh) == UHCI_PTR_TERM(uhci)) { |
| 487 | struct urb_priv *urbp = list_entry(qh->queue.next, | 488 | struct urb_priv *urbp = list_entry(qh->queue.next, |
| 488 | struct urb_priv, node); | 489 | struct urb_priv, node); |
| 489 | struct uhci_td *td = list_entry(urbp->td_list.next, | 490 | struct uhci_td *td = list_entry(urbp->td_list.next, |
| 490 | struct uhci_td, list); | 491 | struct uhci_td, list); |
| 491 | 492 | ||
| 492 | qh->element = LINK_TO_TD(td); | 493 | qh->element = LINK_TO_TD(uhci, td); |
| 493 | } | 494 | } |
| 494 | 495 | ||
| 495 | /* Treat the queue as if it has just advanced */ | 496 | /* Treat the queue as if it has just advanced */ |
| @@ -533,7 +534,7 @@ static void unlink_interrupt(struct uhci_hcd *uhci, struct uhci_qh *qh) | |||
| 533 | static void unlink_async(struct uhci_hcd *uhci, struct uhci_qh *qh) | 534 | static void unlink_async(struct uhci_hcd *uhci, struct uhci_qh *qh) |
| 534 | { | 535 | { |
| 535 | struct uhci_qh *pqh; | 536 | struct uhci_qh *pqh; |
| 536 | __le32 link_to_next_qh = qh->link; | 537 | __hc32 link_to_next_qh = qh->link; |
| 537 | 538 | ||
| 538 | pqh = list_entry(qh->node.prev, struct uhci_qh, node); | 539 | pqh = list_entry(qh->node.prev, struct uhci_qh, node); |
| 539 | pqh->link = link_to_next_qh; | 540 | pqh->link = link_to_next_qh; |
| @@ -757,8 +758,8 @@ static void uhci_free_urb_priv(struct uhci_hcd *uhci, | |||
| 757 | /* | 758 | /* |
| 758 | * Map status to standard result codes | 759 | * Map status to standard result codes |
| 759 | * | 760 | * |
| 760 | * <status> is (td_status(td) & 0xF60000), a.k.a. | 761 | * <status> is (td_status(uhci, td) & 0xF60000), a.k.a. |
| 761 | * uhci_status_bits(td_status(td)). | 762 | * uhci_status_bits(td_status(uhci, td)). |
| 762 | * Note: <status> does not include the TD_CTRL_NAK bit. | 763 | * Note: <status> does not include the TD_CTRL_NAK bit. |
| 763 | * <dir_out> is True for output TDs and False for input TDs. | 764 | * <dir_out> is True for output TDs and False for input TDs. |
| 764 | */ | 765 | */ |
| @@ -794,7 +795,7 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, | |||
| 794 | int maxsze = le16_to_cpu(qh->hep->desc.wMaxPacketSize); | 795 | int maxsze = le16_to_cpu(qh->hep->desc.wMaxPacketSize); |
| 795 | int len = urb->transfer_buffer_length; | 796 | int len = urb->transfer_buffer_length; |
| 796 | dma_addr_t data = urb->transfer_dma; | 797 | dma_addr_t data = urb->transfer_dma; |
| 797 | __le32 *plink; | 798 | __hc32 *plink; |
| 798 | struct urb_priv *urbp = urb->hcpriv; | 799 | struct urb_priv *urbp = urb->hcpriv; |
| 799 | int skel; | 800 | int skel; |
| 800 | 801 | ||
| @@ -811,7 +812,7 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, | |||
| 811 | */ | 812 | */ |
| 812 | td = qh->dummy_td; | 813 | td = qh->dummy_td; |
| 813 | uhci_add_td_to_urbp(td, urbp); | 814 | uhci_add_td_to_urbp(td, urbp); |
| 814 | uhci_fill_td(td, status, destination | uhci_explen(8), | 815 | uhci_fill_td(uhci, td, status, destination | uhci_explen(8), |
| 815 | urb->setup_dma); | 816 | urb->setup_dma); |
| 816 | plink = &td->link; | 817 | plink = &td->link; |
| 817 | status |= TD_CTRL_ACTIVE; | 818 | status |= TD_CTRL_ACTIVE; |
| @@ -844,14 +845,14 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, | |||
| 844 | td = uhci_alloc_td(uhci); | 845 | td = uhci_alloc_td(uhci); |
| 845 | if (!td) | 846 | if (!td) |
| 846 | goto nomem; | 847 | goto nomem; |
| 847 | *plink = LINK_TO_TD(td); | 848 | *plink = LINK_TO_TD(uhci, td); |
| 848 | 849 | ||
| 849 | /* Alternate Data0/1 (start with Data1) */ | 850 | /* Alternate Data0/1 (start with Data1) */ |
| 850 | destination ^= TD_TOKEN_TOGGLE; | 851 | destination ^= TD_TOKEN_TOGGLE; |
| 851 | 852 | ||
| 852 | uhci_add_td_to_urbp(td, urbp); | 853 | uhci_add_td_to_urbp(td, urbp); |
| 853 | uhci_fill_td(td, status, destination | uhci_explen(pktsze), | 854 | uhci_fill_td(uhci, td, status, |
| 854 | data); | 855 | destination | uhci_explen(pktsze), data); |
| 855 | plink = &td->link; | 856 | plink = &td->link; |
| 856 | 857 | ||
| 857 | data += pktsze; | 858 | data += pktsze; |
| @@ -864,14 +865,14 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, | |||
| 864 | td = uhci_alloc_td(uhci); | 865 | td = uhci_alloc_td(uhci); |
| 865 | if (!td) | 866 | if (!td) |
| 866 | goto nomem; | 867 | goto nomem; |
| 867 | *plink = LINK_TO_TD(td); | 868 | *plink = LINK_TO_TD(uhci, td); |
| 868 | 869 | ||
| 869 | /* Change direction for the status transaction */ | 870 | /* Change direction for the status transaction */ |
| 870 | destination ^= (USB_PID_IN ^ USB_PID_OUT); | 871 | destination ^= (USB_PID_IN ^ USB_PID_OUT); |
| 871 | destination |= TD_TOKEN_TOGGLE; /* End in Data1 */ | 872 | destination |= TD_TOKEN_TOGGLE; /* End in Data1 */ |
| 872 | 873 | ||
| 873 | uhci_add_td_to_urbp(td, urbp); | 874 | uhci_add_td_to_urbp(td, urbp); |
| 874 | uhci_fill_td(td, status | TD_CTRL_IOC, | 875 | uhci_fill_td(uhci, td, status | TD_CTRL_IOC, |
| 875 | destination | uhci_explen(0), 0); | 876 | destination | uhci_explen(0), 0); |
| 876 | plink = &td->link; | 877 | plink = &td->link; |
| 877 | 878 | ||
| @@ -881,11 +882,11 @@ static int uhci_submit_control(struct uhci_hcd *uhci, struct urb *urb, | |||
| 881 | td = uhci_alloc_td(uhci); | 882 | td = uhci_alloc_td(uhci); |
| 882 | if (!td) | 883 | if (!td) |
| 883 | goto nomem; | 884 | goto nomem; |
| 884 | *plink = LINK_TO_TD(td); | 885 | *plink = LINK_TO_TD(uhci, td); |
| 885 | 886 | ||
| 886 | uhci_fill_td(td, 0, USB_PID_OUT | uhci_explen(0), 0); | 887 | uhci_fill_td(uhci, td, 0, USB_PID_OUT | uhci_explen(0), 0); |
| 887 | wmb(); | 888 | wmb(); |
| 888 | qh->dummy_td->status |= cpu_to_le32(TD_CTRL_ACTIVE); | 889 | qh->dummy_td->status |= cpu_to_hc32(uhci, TD_CTRL_ACTIVE); |
| 889 | qh->dummy_td = td; | 890 | qh->dummy_td = td; |
| 890 | 891 | ||
| 891 | /* Low-speed transfers get a different queue, and won't hog the bus. | 892 | /* Low-speed transfers get a different queue, and won't hog the bus. |
| @@ -921,7 +922,7 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, | |||
| 921 | int len = urb->transfer_buffer_length; | 922 | int len = urb->transfer_buffer_length; |
| 922 | int this_sg_len; | 923 | int this_sg_len; |
| 923 | dma_addr_t data; | 924 | dma_addr_t data; |
| 924 | __le32 *plink; | 925 | __hc32 *plink; |
| 925 | struct urb_priv *urbp = urb->hcpriv; | 926 | struct urb_priv *urbp = urb->hcpriv; |
| 926 | unsigned int toggle; | 927 | unsigned int toggle; |
| 927 | struct scatterlist *sg; | 928 | struct scatterlist *sg; |
| @@ -974,10 +975,10 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, | |||
| 974 | td = uhci_alloc_td(uhci); | 975 | td = uhci_alloc_td(uhci); |
| 975 | if (!td) | 976 | if (!td) |
| 976 | goto nomem; | 977 | goto nomem; |
| 977 | *plink = LINK_TO_TD(td); | 978 | *plink = LINK_TO_TD(uhci, td); |
| 978 | } | 979 | } |
| 979 | uhci_add_td_to_urbp(td, urbp); | 980 | uhci_add_td_to_urbp(td, urbp); |
| 980 | uhci_fill_td(td, status, | 981 | uhci_fill_td(uhci, td, status, |
| 981 | destination | uhci_explen(pktsze) | | 982 | destination | uhci_explen(pktsze) | |
| 982 | (toggle << TD_TOKEN_TOGGLE_SHIFT), | 983 | (toggle << TD_TOKEN_TOGGLE_SHIFT), |
| 983 | data); | 984 | data); |
| @@ -1010,10 +1011,10 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, | |||
| 1010 | td = uhci_alloc_td(uhci); | 1011 | td = uhci_alloc_td(uhci); |
| 1011 | if (!td) | 1012 | if (!td) |
| 1012 | goto nomem; | 1013 | goto nomem; |
| 1013 | *plink = LINK_TO_TD(td); | 1014 | *plink = LINK_TO_TD(uhci, td); |
| 1014 | 1015 | ||
| 1015 | uhci_add_td_to_urbp(td, urbp); | 1016 | uhci_add_td_to_urbp(td, urbp); |
| 1016 | uhci_fill_td(td, status, | 1017 | uhci_fill_td(uhci, td, status, |
| 1017 | destination | uhci_explen(0) | | 1018 | destination | uhci_explen(0) | |
| 1018 | (toggle << TD_TOKEN_TOGGLE_SHIFT), | 1019 | (toggle << TD_TOKEN_TOGGLE_SHIFT), |
| 1019 | data); | 1020 | data); |
| @@ -1028,7 +1029,7 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, | |||
| 1028 | * fast side but not enough to justify delaying an interrupt | 1029 | * fast side but not enough to justify delaying an interrupt |
| 1029 | * more than 2 or 3 URBs, so we will ignore the URB_NO_INTERRUPT | 1030 | * more than 2 or 3 URBs, so we will ignore the URB_NO_INTERRUPT |
| 1030 | * flag setting. */ | 1031 | * flag setting. */ |
| 1031 | td->status |= cpu_to_le32(TD_CTRL_IOC); | 1032 | td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC); |
| 1032 | 1033 | ||
| 1033 | /* | 1034 | /* |
| 1034 | * Build the new dummy TD and activate the old one | 1035 | * Build the new dummy TD and activate the old one |
| @@ -1036,11 +1037,11 @@ static int uhci_submit_common(struct uhci_hcd *uhci, struct urb *urb, | |||
| 1036 | td = uhci_alloc_td(uhci); | 1037 | td = uhci_alloc_td(uhci); |
| 1037 | if (!td) | 1038 | if (!td) |
| 1038 | goto nomem; | 1039 | goto nomem; |
| 1039 | *plink = LINK_TO_TD(td); | 1040 | *plink = LINK_TO_TD(uhci, td); |
| 1040 | 1041 | ||
| 1041 | uhci_fill_td(td, 0, USB_PID_OUT | uhci_explen(0), 0); | 1042 | uhci_fill_td(uhci, td, 0, USB_PID_OUT | uhci_explen(0), 0); |
| 1042 | wmb(); | 1043 | wmb(); |
| 1043 | qh->dummy_td->status |= cpu_to_le32(TD_CTRL_ACTIVE); | 1044 | qh->dummy_td->status |= cpu_to_hc32(uhci, TD_CTRL_ACTIVE); |
| 1044 | qh->dummy_td = td; | 1045 | qh->dummy_td = td; |
| 1045 | 1046 | ||
| 1046 | usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), | 1047 | usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), |
| @@ -1133,7 +1134,7 @@ static int uhci_fixup_short_transfer(struct uhci_hcd *uhci, | |||
| 1133 | * the queue at the status stage transaction, which is | 1134 | * the queue at the status stage transaction, which is |
| 1134 | * the last TD. */ | 1135 | * the last TD. */ |
| 1135 | WARN_ON(list_empty(&urbp->td_list)); | 1136 | WARN_ON(list_empty(&urbp->td_list)); |
| 1136 | qh->element = LINK_TO_TD(td); | 1137 | qh->element = LINK_TO_TD(uhci, td); |
| 1137 | tmp = td->list.prev; | 1138 | tmp = td->list.prev; |
| 1138 | ret = -EINPROGRESS; | 1139 | ret = -EINPROGRESS; |
| 1139 | 1140 | ||
| @@ -1142,8 +1143,9 @@ static int uhci_fixup_short_transfer(struct uhci_hcd *uhci, | |||
| 1142 | /* When a bulk/interrupt transfer is short, we have to | 1143 | /* When a bulk/interrupt transfer is short, we have to |
| 1143 | * fix up the toggles of the following URBs on the queue | 1144 | * fix up the toggles of the following URBs on the queue |
| 1144 | * before restarting the queue at the next URB. */ | 1145 | * before restarting the queue at the next URB. */ |
| 1145 | qh->initial_toggle = uhci_toggle(td_token(qh->post_td)) ^ 1; | 1146 | qh->initial_toggle = |
| 1146 | uhci_fixup_toggles(qh, 1); | 1147 | uhci_toggle(td_token(uhci, qh->post_td)) ^ 1; |
| 1148 | uhci_fixup_toggles(uhci, qh, 1); | ||
| 1147 | 1149 | ||
| 1148 | if (list_empty(&urbp->td_list)) | 1150 | if (list_empty(&urbp->td_list)) |
| 1149 | td = qh->post_td; | 1151 | td = qh->post_td; |
| @@ -1178,7 +1180,7 @@ static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb) | |||
| 1178 | unsigned int ctrlstat; | 1180 | unsigned int ctrlstat; |
| 1179 | int len; | 1181 | int len; |
| 1180 | 1182 | ||
| 1181 | ctrlstat = td_status(td); | 1183 | ctrlstat = td_status(uhci, td); |
| 1182 | status = uhci_status_bits(ctrlstat); | 1184 | status = uhci_status_bits(ctrlstat); |
| 1183 | if (status & TD_CTRL_ACTIVE) | 1185 | if (status & TD_CTRL_ACTIVE) |
| 1184 | return -EINPROGRESS; | 1186 | return -EINPROGRESS; |
| @@ -1188,7 +1190,7 @@ static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb) | |||
| 1188 | 1190 | ||
| 1189 | if (status) { | 1191 | if (status) { |
| 1190 | ret = uhci_map_status(status, | 1192 | ret = uhci_map_status(status, |
| 1191 | uhci_packetout(td_token(td))); | 1193 | uhci_packetout(td_token(uhci, td))); |
| 1192 | if ((debug == 1 && ret != -EPIPE) || debug > 1) { | 1194 | if ((debug == 1 && ret != -EPIPE) || debug > 1) { |
| 1193 | /* Some debugging code */ | 1195 | /* Some debugging code */ |
| 1194 | dev_dbg(&urb->dev->dev, | 1196 | dev_dbg(&urb->dev->dev, |
| @@ -1204,7 +1206,7 @@ static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb) | |||
| 1204 | } | 1206 | } |
| 1205 | 1207 | ||
| 1206 | /* Did we receive a short packet? */ | 1208 | /* Did we receive a short packet? */ |
| 1207 | } else if (len < uhci_expected_length(td_token(td))) { | 1209 | } else if (len < uhci_expected_length(td_token(uhci, td))) { |
| 1208 | 1210 | ||
| 1209 | /* For control transfers, go to the status TD if | 1211 | /* For control transfers, go to the status TD if |
| 1210 | * this isn't already the last data TD */ | 1212 | * this isn't already the last data TD */ |
| @@ -1236,10 +1238,10 @@ err: | |||
| 1236 | if (ret < 0) { | 1238 | if (ret < 0) { |
| 1237 | /* Note that the queue has stopped and save | 1239 | /* Note that the queue has stopped and save |
| 1238 | * the next toggle value */ | 1240 | * the next toggle value */ |
| 1239 | qh->element = UHCI_PTR_TERM; | 1241 | qh->element = UHCI_PTR_TERM(uhci); |
| 1240 | qh->is_stopped = 1; | 1242 | qh->is_stopped = 1; |
| 1241 | qh->needs_fixup = (qh->type != USB_ENDPOINT_XFER_CONTROL); | 1243 | qh->needs_fixup = (qh->type != USB_ENDPOINT_XFER_CONTROL); |
| 1242 | qh->initial_toggle = uhci_toggle(td_token(td)) ^ | 1244 | qh->initial_toggle = uhci_toggle(td_token(uhci, td)) ^ |
| 1243 | (ret == -EREMOTEIO); | 1245 | (ret == -EREMOTEIO); |
| 1244 | 1246 | ||
| 1245 | } else /* Short packet received */ | 1247 | } else /* Short packet received */ |
| @@ -1335,14 +1337,14 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb, | |||
| 1335 | return -ENOMEM; | 1337 | return -ENOMEM; |
| 1336 | 1338 | ||
| 1337 | uhci_add_td_to_urbp(td, urbp); | 1339 | uhci_add_td_to_urbp(td, urbp); |
| 1338 | uhci_fill_td(td, status, destination | | 1340 | uhci_fill_td(uhci, td, status, destination | |
| 1339 | uhci_explen(urb->iso_frame_desc[i].length), | 1341 | uhci_explen(urb->iso_frame_desc[i].length), |
| 1340 | urb->transfer_dma + | 1342 | urb->transfer_dma + |
| 1341 | urb->iso_frame_desc[i].offset); | 1343 | urb->iso_frame_desc[i].offset); |
| 1342 | } | 1344 | } |
| 1343 | 1345 | ||
| 1344 | /* Set the interrupt-on-completion flag on the last packet. */ | 1346 | /* Set the interrupt-on-completion flag on the last packet. */ |
| 1345 | td->status |= cpu_to_le32(TD_CTRL_IOC); | 1347 | td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC); |
| 1346 | 1348 | ||
| 1347 | /* Add the TDs to the frame list */ | 1349 | /* Add the TDs to the frame list */ |
| 1348 | frame = urb->start_frame; | 1350 | frame = urb->start_frame; |
| @@ -1378,7 +1380,7 @@ static int uhci_result_isochronous(struct uhci_hcd *uhci, struct urb *urb) | |||
| 1378 | 1380 | ||
| 1379 | uhci_remove_tds_from_frame(uhci, qh->iso_frame); | 1381 | uhci_remove_tds_from_frame(uhci, qh->iso_frame); |
| 1380 | 1382 | ||
| 1381 | ctrlstat = td_status(td); | 1383 | ctrlstat = td_status(uhci, td); |
| 1382 | if (ctrlstat & TD_CTRL_ACTIVE) { | 1384 | if (ctrlstat & TD_CTRL_ACTIVE) { |
| 1383 | status = -EXDEV; /* TD was added too late? */ | 1385 | status = -EXDEV; /* TD was added too late? */ |
| 1384 | } else { | 1386 | } else { |
| @@ -1629,7 +1631,7 @@ restart: | |||
| 1629 | * queue, the QH can now be re-activated. */ | 1631 | * queue, the QH can now be re-activated. */ |
| 1630 | if (!list_empty(&qh->queue)) { | 1632 | if (!list_empty(&qh->queue)) { |
| 1631 | if (qh->needs_fixup) | 1633 | if (qh->needs_fixup) |
| 1632 | uhci_fixup_toggles(qh, 0); | 1634 | uhci_fixup_toggles(uhci, qh, 0); |
| 1633 | 1635 | ||
| 1634 | /* If the first URB on the queue wants FSBR but its time | 1636 | /* If the first URB on the queue wants FSBR but its time |
| 1635 | * limit has expired, set the next TD to interrupt on | 1637 | * limit has expired, set the next TD to interrupt on |
| @@ -1639,7 +1641,7 @@ restart: | |||
| 1639 | struct uhci_td *td = list_entry(urbp->td_list.next, | 1641 | struct uhci_td *td = list_entry(urbp->td_list.next, |
| 1640 | struct uhci_td, list); | 1642 | struct uhci_td, list); |
| 1641 | 1643 | ||
| 1642 | td->status |= __cpu_to_le32(TD_CTRL_IOC); | 1644 | td->status |= cpu_to_hc32(uhci, TD_CTRL_IOC); |
| 1643 | } | 1645 | } |
| 1644 | 1646 | ||
| 1645 | uhci_activate_qh(uhci, qh); | 1647 | uhci_activate_qh(uhci, qh); |
| @@ -1686,7 +1688,7 @@ static int uhci_advance_check(struct uhci_hcd *uhci, struct uhci_qh *qh) | |||
| 1686 | } else { | 1688 | } else { |
| 1687 | urbp = list_entry(qh->queue.next, struct urb_priv, node); | 1689 | urbp = list_entry(qh->queue.next, struct urb_priv, node); |
| 1688 | td = list_entry(urbp->td_list.next, struct uhci_td, list); | 1690 | td = list_entry(urbp->td_list.next, struct uhci_td, list); |
| 1689 | status = td_status(td); | 1691 | status = td_status(uhci, td); |
| 1690 | if (!(status & TD_CTRL_ACTIVE)) { | 1692 | if (!(status & TD_CTRL_ACTIVE)) { |
| 1691 | 1693 | ||
| 1692 | /* We're okay, the queue has advanced */ | 1694 | /* We're okay, the queue has advanced */ |
| @@ -1704,7 +1706,8 @@ static int uhci_advance_check(struct uhci_hcd *uhci, struct uhci_qh *qh) | |||
| 1704 | if (time_after(jiffies, qh->advance_jiffies + QH_WAIT_TIMEOUT)) { | 1706 | if (time_after(jiffies, qh->advance_jiffies + QH_WAIT_TIMEOUT)) { |
| 1705 | 1707 | ||
| 1706 | /* Detect the Intel bug and work around it */ | 1708 | /* Detect the Intel bug and work around it */ |
| 1707 | if (qh->post_td && qh_element(qh) == LINK_TO_TD(qh->post_td)) { | 1709 | if (qh->post_td && qh_element(qh) == |
| 1710 | LINK_TO_TD(uhci, qh->post_td)) { | ||
| 1708 | qh->element = qh->post_td->link; | 1711 | qh->element = qh->post_td->link; |
| 1709 | qh->advance_jiffies = jiffies; | 1712 | qh->advance_jiffies = jiffies; |
| 1710 | ret = 1; | 1713 | ret = 1; |
diff --git a/drivers/usb/host/xhci-dbg.c b/drivers/usb/host/xhci-dbg.c index 0231814a97a..2e0486178db 100644 --- a/drivers/usb/host/xhci-dbg.c +++ b/drivers/usb/host/xhci-dbg.c | |||
| @@ -147,7 +147,7 @@ static void xhci_print_op_regs(struct xhci_hcd *xhci) | |||
| 147 | 147 | ||
| 148 | static void xhci_print_ports(struct xhci_hcd *xhci) | 148 | static void xhci_print_ports(struct xhci_hcd *xhci) |
| 149 | { | 149 | { |
| 150 | u32 __iomem *addr; | 150 | __le32 __iomem *addr; |
| 151 | int i, j; | 151 | int i, j; |
| 152 | int ports; | 152 | int ports; |
| 153 | char *names[NUM_PORT_REGS] = { | 153 | char *names[NUM_PORT_REGS] = { |
| @@ -253,27 +253,27 @@ void xhci_print_trb_offsets(struct xhci_hcd *xhci, union xhci_trb *trb) | |||
| 253 | void xhci_debug_trb(struct xhci_hcd *xhci, union xhci_trb *trb) | 253 | void xhci_debug_trb(struct xhci_hcd *xhci, union xhci_trb *trb) |
| 254 | { | 254 | { |
| 255 | u64 address; | 255 | u64 address; |
| 256 | u32 type = xhci_readl(xhci, &trb->link.control) & TRB_TYPE_BITMASK; | 256 | u32 type = le32_to_cpu(trb->link.control) & TRB_TYPE_BITMASK; |
| 257 | 257 | ||
| 258 | switch (type) { | 258 | switch (type) { |
| 259 | case TRB_TYPE(TRB_LINK): | 259 | case TRB_TYPE(TRB_LINK): |
| 260 | xhci_dbg(xhci, "Link TRB:\n"); | 260 | xhci_dbg(xhci, "Link TRB:\n"); |
| 261 | xhci_print_trb_offsets(xhci, trb); | 261 | xhci_print_trb_offsets(xhci, trb); |
| 262 | 262 | ||
| 263 | address = trb->link.segment_ptr; | 263 | address = le64_to_cpu(trb->link.segment_ptr); |
| 264 | xhci_dbg(xhci, "Next ring segment DMA address = 0x%llx\n", address); | 264 | xhci_dbg(xhci, "Next ring segment DMA address = 0x%llx\n", address); |
| 265 | 265 | ||
| 266 | xhci_dbg(xhci, "Interrupter target = 0x%x\n", | 266 | xhci_dbg(xhci, "Interrupter target = 0x%x\n", |
| 267 | GET_INTR_TARGET(trb->link.intr_target)); | 267 | GET_INTR_TARGET(le32_to_cpu(trb->link.intr_target))); |
| 268 | xhci_dbg(xhci, "Cycle bit = %u\n", | 268 | xhci_dbg(xhci, "Cycle bit = %u\n", |
| 269 | (unsigned int) (trb->link.control & TRB_CYCLE)); | 269 | (unsigned int) (le32_to_cpu(trb->link.control) & TRB_CYCLE)); |
| 270 | xhci_dbg(xhci, "Toggle cycle bit = %u\n", | 270 | xhci_dbg(xhci, "Toggle cycle bit = %u\n", |
| 271 | (unsigned int) (trb->link.control & LINK_TOGGLE)); | 271 | (unsigned int) (le32_to_cpu(trb->link.control) & LINK_TOGGLE)); |
| 272 | xhci_dbg(xhci, "No Snoop bit = %u\n", | 272 | xhci_dbg(xhci, "No Snoop bit = %u\n", |
| 273 | (unsigned int) (trb->link.control & TRB_NO_SNOOP)); | 273 | (unsigned int) (le32_to_cpu(trb->link.control) & TRB_NO_SNOOP)); |
| 274 | break; | 274 | break; |
| 275 | case TRB_TYPE(TRB_TRANSFER): | 275 | case TRB_TYPE(TRB_TRANSFER): |
| 276 | address = trb->trans_event.buffer; | 276 | address = le64_to_cpu(trb->trans_event.buffer); |
| 277 | /* | 277 | /* |
| 278 | * FIXME: look at flags to figure out if it's an address or if | 278 | * FIXME: look at flags to figure out if it's an address or if |
| 279 | * the data is directly in the buffer field. | 279 | * the data is directly in the buffer field. |
| @@ -281,11 +281,12 @@ void xhci_debug_trb(struct xhci_hcd *xhci, union xhci_trb *trb) | |||
| 281 | xhci_dbg(xhci, "DMA address or buffer contents= %llu\n", address); | 281 | xhci_dbg(xhci, "DMA address or buffer contents= %llu\n", address); |
| 282 | break; | 282 | break; |
| 283 | case TRB_TYPE(TRB_COMPLETION): | 283 | case TRB_TYPE(TRB_COMPLETION): |
| 284 | address = trb->event_cmd.cmd_trb; | 284 | address = le64_to_cpu(trb->event_cmd.cmd_trb); |
| 285 | xhci_dbg(xhci, "Command TRB pointer = %llu\n", address); | 285 | xhci_dbg(xhci, "Command TRB pointer = %llu\n", address); |
| 286 | xhci_dbg(xhci, "Completion status = %u\n", | 286 | xhci_dbg(xhci, "Completion status = %u\n", |
| 287 | (unsigned int) GET_COMP_CODE(trb->event_cmd.status)); | 287 | (unsigned int) GET_COMP_CODE(le32_to_cpu(trb->event_cmd.status))); |
| 288 | xhci_dbg(xhci, "Flags = 0x%x\n", (unsigned int) trb->event_cmd.flags); | 288 | xhci_dbg(xhci, "Flags = 0x%x\n", |
| 289 | (unsigned int) le32_to_cpu(trb->event_cmd.flags)); | ||
| 289 | break; | 290 | break; |
| 290 | default: | 291 | default: |
| 291 | xhci_dbg(xhci, "Unknown TRB with TRB type ID %u\n", | 292 | xhci_dbg(xhci, "Unknown TRB with TRB type ID %u\n", |
| @@ -311,16 +312,16 @@ void xhci_debug_trb(struct xhci_hcd *xhci, union xhci_trb *trb) | |||
| 311 | void xhci_debug_segment(struct xhci_hcd *xhci, struct xhci_segment *seg) | 312 | void xhci_debug_segment(struct xhci_hcd *xhci, struct xhci_segment *seg) |
| 312 | { | 313 | { |
| 313 | int i; | 314 | int i; |
| 314 | u32 addr = (u32) seg->dma; | 315 | u64 addr = seg->dma; |
| 315 | union xhci_trb *trb = seg->trbs; | 316 | union xhci_trb *trb = seg->trbs; |
| 316 | 317 | ||
| 317 | for (i = 0; i < TRBS_PER_SEGMENT; ++i) { | 318 | for (i = 0; i < TRBS_PER_SEGMENT; ++i) { |
| 318 | trb = &seg->trbs[i]; | 319 | trb = &seg->trbs[i]; |
| 319 | xhci_dbg(xhci, "@%08x %08x %08x %08x %08x\n", addr, | 320 | xhci_dbg(xhci, "@%016llx %08x %08x %08x %08x\n", addr, |
| 320 | lower_32_bits(trb->link.segment_ptr), | 321 | (u32)lower_32_bits(le64_to_cpu(trb->link.segment_ptr)), |
| 321 | upper_32_bits(trb->link.segment_ptr), | 322 | (u32)upper_32_bits(le64_to_cpu(trb->link.segment_ptr)), |
| 322 | (unsigned int) trb->link.intr_target, | 323 | (unsigned int) le32_to_cpu(trb->link.intr_target), |
| 323 | (unsigned int) trb->link.control); | 324 | (unsigned int) le32_to_cpu(trb->link.control)); |
| 324 | addr += sizeof(*trb); | 325 | addr += sizeof(*trb); |
| 325 | } | 326 | } |
| 326 | } | 327 | } |
| @@ -391,18 +392,18 @@ void xhci_dbg_ep_rings(struct xhci_hcd *xhci, | |||
| 391 | 392 | ||
| 392 | void xhci_dbg_erst(struct xhci_hcd *xhci, struct xhci_erst *erst) | 393 | void xhci_dbg_erst(struct xhci_hcd *xhci, struct xhci_erst *erst) |
| 393 | { | 394 | { |
| 394 | u32 addr = (u32) erst->erst_dma_addr; | 395 | u64 addr = erst->erst_dma_addr; |
| 395 | int i; | 396 | int i; |
| 396 | struct xhci_erst_entry *entry; | 397 | struct xhci_erst_entry *entry; |
| 397 | 398 | ||
| 398 | for (i = 0; i < erst->num_entries; ++i) { | 399 | for (i = 0; i < erst->num_entries; ++i) { |
| 399 | entry = &erst->entries[i]; | 400 | entry = &erst->entries[i]; |
| 400 | xhci_dbg(xhci, "@%08x %08x %08x %08x %08x\n", | 401 | xhci_dbg(xhci, "@%016llx %08x %08x %08x %08x\n", |
| 401 | (unsigned int) addr, | 402 | addr, |
| 402 | lower_32_bits(entry->seg_addr), | 403 | lower_32_bits(le64_to_cpu(entry->seg_addr)), |
| 403 | upper_32_bits(entry->seg_addr), | 404 | upper_32_bits(le64_to_cpu(entry->seg_addr)), |
| 404 | (unsigned int) entry->seg_size, | 405 | (unsigned int) le32_to_cpu(entry->seg_size), |
| 405 | (unsigned int) entry->rsvd); | 406 | (unsigned int) le32_to_cpu(entry->rsvd)); |
| 406 | addr += sizeof(*entry); | 407 | addr += sizeof(*entry); |
| 407 | } | 408 | } |
| 408 | } | 409 | } |
| @@ -436,7 +437,7 @@ char *xhci_get_slot_state(struct xhci_hcd *xhci, | |||
| 436 | { | 437 | { |
| 437 | struct xhci_slot_ctx *slot_ctx = xhci_get_slot_ctx(xhci, ctx); | 438 | struct xhci_slot_ctx *slot_ctx = xhci_get_slot_ctx(xhci, ctx); |
| 438 | 439 | ||
| 439 | switch (GET_SLOT_STATE(slot_ctx->dev_state)) { | 440 | switch (GET_SLOT_STATE(le32_to_cpu(slot_ctx->dev_state))) { |
| 440 | case 0: | 441 | case 0: |
| 441 | return "enabled/disabled"; | 442 | return "enabled/disabled"; |
| 442 | case 1: | 443 | case 1: |
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index 73f75d26436..0be788cc2fd 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c | |||
| @@ -50,7 +50,7 @@ static void xhci_common_hub_descriptor(struct xhci_hcd *xhci, | |||
| 50 | temp |= 0x0008; | 50 | temp |= 0x0008; |
| 51 | /* Bits 6:5 - no TTs in root ports */ | 51 | /* Bits 6:5 - no TTs in root ports */ |
| 52 | /* Bit 7 - no port indicators */ | 52 | /* Bit 7 - no port indicators */ |
| 53 | desc->wHubCharacteristics = (__force __u16) cpu_to_le16(temp); | 53 | desc->wHubCharacteristics = cpu_to_le16(temp); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | /* Fill in the USB 2.0 roothub descriptor */ | 56 | /* Fill in the USB 2.0 roothub descriptor */ |
| @@ -314,7 +314,7 @@ void xhci_ring_device(struct xhci_hcd *xhci, int slot_id) | |||
| 314 | } | 314 | } |
| 315 | 315 | ||
| 316 | static void xhci_disable_port(struct usb_hcd *hcd, struct xhci_hcd *xhci, | 316 | static void xhci_disable_port(struct usb_hcd *hcd, struct xhci_hcd *xhci, |
| 317 | u16 wIndex, u32 __iomem *addr, u32 port_status) | 317 | u16 wIndex, __le32 __iomem *addr, u32 port_status) |
| 318 | { | 318 | { |
| 319 | /* Don't allow the USB core to disable SuperSpeed ports. */ | 319 | /* Don't allow the USB core to disable SuperSpeed ports. */ |
| 320 | if (hcd->speed == HCD_USB3) { | 320 | if (hcd->speed == HCD_USB3) { |
| @@ -331,7 +331,7 @@ static void xhci_disable_port(struct usb_hcd *hcd, struct xhci_hcd *xhci, | |||
| 331 | } | 331 | } |
| 332 | 332 | ||
| 333 | static void xhci_clear_port_change_bit(struct xhci_hcd *xhci, u16 wValue, | 333 | static void xhci_clear_port_change_bit(struct xhci_hcd *xhci, u16 wValue, |
| 334 | u16 wIndex, u32 __iomem *addr, u32 port_status) | 334 | u16 wIndex, __le32 __iomem *addr, u32 port_status) |
| 335 | { | 335 | { |
| 336 | char *port_change_bit; | 336 | char *port_change_bit; |
| 337 | u32 status; | 337 | u32 status; |
| @@ -341,6 +341,10 @@ static void xhci_clear_port_change_bit(struct xhci_hcd *xhci, u16 wValue, | |||
| 341 | status = PORT_RC; | 341 | status = PORT_RC; |
| 342 | port_change_bit = "reset"; | 342 | port_change_bit = "reset"; |
| 343 | break; | 343 | break; |
| 344 | case USB_PORT_FEAT_C_BH_PORT_RESET: | ||
| 345 | status = PORT_WRC; | ||
| 346 | port_change_bit = "warm(BH) reset"; | ||
| 347 | break; | ||
| 344 | case USB_PORT_FEAT_C_CONNECTION: | 348 | case USB_PORT_FEAT_C_CONNECTION: |
| 345 | status = PORT_CSC; | 349 | status = PORT_CSC; |
| 346 | port_change_bit = "connect"; | 350 | port_change_bit = "connect"; |
| @@ -357,6 +361,10 @@ static void xhci_clear_port_change_bit(struct xhci_hcd *xhci, u16 wValue, | |||
| 357 | status = PORT_PLC; | 361 | status = PORT_PLC; |
| 358 | port_change_bit = "suspend/resume"; | 362 | port_change_bit = "suspend/resume"; |
| 359 | break; | 363 | break; |
| 364 | case USB_PORT_FEAT_C_PORT_LINK_STATE: | ||
| 365 | status = PORT_PLC; | ||
| 366 | port_change_bit = "link state"; | ||
| 367 | break; | ||
| 360 | default: | 368 | default: |
| 361 | /* Should never happen */ | 369 | /* Should never happen */ |
| 362 | return; | 370 | return; |
| @@ -368,25 +376,36 @@ static void xhci_clear_port_change_bit(struct xhci_hcd *xhci, u16 wValue, | |||
| 368 | port_change_bit, wIndex, port_status); | 376 | port_change_bit, wIndex, port_status); |
| 369 | } | 377 | } |
| 370 | 378 | ||
| 379 | static int xhci_get_ports(struct usb_hcd *hcd, __le32 __iomem ***port_array) | ||
| 380 | { | ||
| 381 | int max_ports; | ||
| 382 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | ||
| 383 | |||
| 384 | if (hcd->speed == HCD_USB3) { | ||
| 385 | max_ports = xhci->num_usb3_ports; | ||
| 386 | *port_array = xhci->usb3_ports; | ||
| 387 | } else { | ||
| 388 | max_ports = xhci->num_usb2_ports; | ||
| 389 | *port_array = xhci->usb2_ports; | ||
| 390 | } | ||
| 391 | |||
| 392 | return max_ports; | ||
| 393 | } | ||
| 394 | |||
| 371 | int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | 395 | int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, |
| 372 | u16 wIndex, char *buf, u16 wLength) | 396 | u16 wIndex, char *buf, u16 wLength) |
| 373 | { | 397 | { |
| 374 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 398 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
| 375 | int ports; | 399 | int max_ports; |
| 376 | unsigned long flags; | 400 | unsigned long flags; |
| 377 | u32 temp, temp1, status; | 401 | u32 temp, temp1, status; |
| 378 | int retval = 0; | 402 | int retval = 0; |
| 379 | u32 __iomem **port_array; | 403 | __le32 __iomem **port_array; |
| 380 | int slot_id; | 404 | int slot_id; |
| 381 | struct xhci_bus_state *bus_state; | 405 | struct xhci_bus_state *bus_state; |
| 406 | u16 link_state = 0; | ||
| 382 | 407 | ||
| 383 | if (hcd->speed == HCD_USB3) { | 408 | max_ports = xhci_get_ports(hcd, &port_array); |
| 384 | ports = xhci->num_usb3_ports; | ||
| 385 | port_array = xhci->usb3_ports; | ||
| 386 | } else { | ||
| 387 | ports = xhci->num_usb2_ports; | ||
| 388 | port_array = xhci->usb2_ports; | ||
| 389 | } | ||
| 390 | bus_state = &xhci->bus_state[hcd_index(hcd)]; | 409 | bus_state = &xhci->bus_state[hcd_index(hcd)]; |
| 391 | 410 | ||
| 392 | spin_lock_irqsave(&xhci->lock, flags); | 411 | spin_lock_irqsave(&xhci->lock, flags); |
| @@ -411,7 +430,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 411 | (struct usb_hub_descriptor *) buf); | 430 | (struct usb_hub_descriptor *) buf); |
| 412 | break; | 431 | break; |
| 413 | case GetPortStatus: | 432 | case GetPortStatus: |
| 414 | if (!wIndex || wIndex > ports) | 433 | if (!wIndex || wIndex > max_ports) |
| 415 | goto error; | 434 | goto error; |
| 416 | wIndex--; | 435 | wIndex--; |
| 417 | status = 0; | 436 | status = 0; |
| @@ -422,9 +441,6 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 422 | } | 441 | } |
| 423 | xhci_dbg(xhci, "get port status, actual port %d status = 0x%x\n", wIndex, temp); | 442 | xhci_dbg(xhci, "get port status, actual port %d status = 0x%x\n", wIndex, temp); |
| 424 | 443 | ||
| 425 | /* FIXME - should we return a port status value like the USB | ||
| 426 | * 3.0 external hubs do? | ||
| 427 | */ | ||
| 428 | /* wPortChange bits */ | 444 | /* wPortChange bits */ |
| 429 | if (temp & PORT_CSC) | 445 | if (temp & PORT_CSC) |
| 430 | status |= USB_PORT_STAT_C_CONNECTION << 16; | 446 | status |= USB_PORT_STAT_C_CONNECTION << 16; |
| @@ -432,13 +448,21 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 432 | status |= USB_PORT_STAT_C_ENABLE << 16; | 448 | status |= USB_PORT_STAT_C_ENABLE << 16; |
| 433 | if ((temp & PORT_OCC)) | 449 | if ((temp & PORT_OCC)) |
| 434 | status |= USB_PORT_STAT_C_OVERCURRENT << 16; | 450 | status |= USB_PORT_STAT_C_OVERCURRENT << 16; |
| 435 | /* | 451 | if ((temp & PORT_RC)) |
| 436 | * FIXME ignoring reset and USB 2.1/3.0 specific | 452 | status |= USB_PORT_STAT_C_RESET << 16; |
| 437 | * changes | 453 | /* USB3.0 only */ |
| 438 | */ | 454 | if (hcd->speed == HCD_USB3) { |
| 439 | if ((temp & PORT_PLS_MASK) == XDEV_U3 | 455 | if ((temp & PORT_PLC)) |
| 440 | && (temp & PORT_POWER)) | 456 | status |= USB_PORT_STAT_C_LINK_STATE << 16; |
| 441 | status |= 1 << USB_PORT_FEAT_SUSPEND; | 457 | if ((temp & PORT_WRC)) |
| 458 | status |= USB_PORT_STAT_C_BH_RESET << 16; | ||
| 459 | } | ||
| 460 | |||
| 461 | if (hcd->speed != HCD_USB3) { | ||
| 462 | if ((temp & PORT_PLS_MASK) == XDEV_U3 | ||
| 463 | && (temp & PORT_POWER)) | ||
| 464 | status |= USB_PORT_STAT_SUSPEND; | ||
| 465 | } | ||
| 442 | if ((temp & PORT_PLS_MASK) == XDEV_RESUME) { | 466 | if ((temp & PORT_PLS_MASK) == XDEV_RESUME) { |
| 443 | if ((temp & PORT_RESET) || !(temp & PORT_PE)) | 467 | if ((temp & PORT_RESET) || !(temp & PORT_PE)) |
| 444 | goto error; | 468 | goto error; |
| @@ -469,7 +493,8 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 469 | && (temp & PORT_POWER) | 493 | && (temp & PORT_POWER) |
| 470 | && (bus_state->suspended_ports & (1 << wIndex))) { | 494 | && (bus_state->suspended_ports & (1 << wIndex))) { |
| 471 | bus_state->suspended_ports &= ~(1 << wIndex); | 495 | bus_state->suspended_ports &= ~(1 << wIndex); |
| 472 | bus_state->port_c_suspend |= 1 << wIndex; | 496 | if (hcd->speed != HCD_USB3) |
| 497 | bus_state->port_c_suspend |= 1 << wIndex; | ||
| 473 | } | 498 | } |
| 474 | if (temp & PORT_CONNECT) { | 499 | if (temp & PORT_CONNECT) { |
| 475 | status |= USB_PORT_STAT_CONNECTION; | 500 | status |= USB_PORT_STAT_CONNECTION; |
| @@ -481,16 +506,30 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 481 | status |= USB_PORT_STAT_OVERCURRENT; | 506 | status |= USB_PORT_STAT_OVERCURRENT; |
| 482 | if (temp & PORT_RESET) | 507 | if (temp & PORT_RESET) |
| 483 | status |= USB_PORT_STAT_RESET; | 508 | status |= USB_PORT_STAT_RESET; |
| 484 | if (temp & PORT_POWER) | 509 | if (temp & PORT_POWER) { |
| 485 | status |= USB_PORT_STAT_POWER; | 510 | if (hcd->speed == HCD_USB3) |
| 511 | status |= USB_SS_PORT_STAT_POWER; | ||
| 512 | else | ||
| 513 | status |= USB_PORT_STAT_POWER; | ||
| 514 | } | ||
| 515 | /* Port Link State */ | ||
| 516 | if (hcd->speed == HCD_USB3) { | ||
| 517 | /* resume state is a xHCI internal state. | ||
| 518 | * Do not report it to usb core. | ||
| 519 | */ | ||
| 520 | if ((temp & PORT_PLS_MASK) != XDEV_RESUME) | ||
| 521 | status |= (temp & PORT_PLS_MASK); | ||
| 522 | } | ||
| 486 | if (bus_state->port_c_suspend & (1 << wIndex)) | 523 | if (bus_state->port_c_suspend & (1 << wIndex)) |
| 487 | status |= 1 << USB_PORT_FEAT_C_SUSPEND; | 524 | status |= 1 << USB_PORT_FEAT_C_SUSPEND; |
| 488 | xhci_dbg(xhci, "Get port status returned 0x%x\n", status); | 525 | xhci_dbg(xhci, "Get port status returned 0x%x\n", status); |
| 489 | put_unaligned(cpu_to_le32(status), (__le32 *) buf); | 526 | put_unaligned(cpu_to_le32(status), (__le32 *) buf); |
| 490 | break; | 527 | break; |
| 491 | case SetPortFeature: | 528 | case SetPortFeature: |
| 529 | if (wValue == USB_PORT_FEAT_LINK_STATE) | ||
| 530 | link_state = (wIndex & 0xff00) >> 3; | ||
| 492 | wIndex &= 0xff; | 531 | wIndex &= 0xff; |
| 493 | if (!wIndex || wIndex > ports) | 532 | if (!wIndex || wIndex > max_ports) |
| 494 | goto error; | 533 | goto error; |
| 495 | wIndex--; | 534 | wIndex--; |
| 496 | temp = xhci_readl(xhci, port_array[wIndex]); | 535 | temp = xhci_readl(xhci, port_array[wIndex]); |
| @@ -537,6 +576,44 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 537 | temp = xhci_readl(xhci, port_array[wIndex]); | 576 | temp = xhci_readl(xhci, port_array[wIndex]); |
| 538 | bus_state->suspended_ports |= 1 << wIndex; | 577 | bus_state->suspended_ports |= 1 << wIndex; |
| 539 | break; | 578 | break; |
| 579 | case USB_PORT_FEAT_LINK_STATE: | ||
| 580 | temp = xhci_readl(xhci, port_array[wIndex]); | ||
| 581 | /* Software should not attempt to set | ||
| 582 | * port link state above '5' (Rx.Detect) and the port | ||
| 583 | * must be enabled. | ||
| 584 | */ | ||
| 585 | if ((temp & PORT_PE) == 0 || | ||
| 586 | (link_state > USB_SS_PORT_LS_RX_DETECT)) { | ||
| 587 | xhci_warn(xhci, "Cannot set link state.\n"); | ||
| 588 | goto error; | ||
| 589 | } | ||
| 590 | |||
| 591 | if (link_state == USB_SS_PORT_LS_U3) { | ||
| 592 | slot_id = xhci_find_slot_id_by_port(hcd, xhci, | ||
| 593 | wIndex + 1); | ||
| 594 | if (slot_id) { | ||
| 595 | /* unlock to execute stop endpoint | ||
| 596 | * commands */ | ||
| 597 | spin_unlock_irqrestore(&xhci->lock, | ||
| 598 | flags); | ||
| 599 | xhci_stop_device(xhci, slot_id, 1); | ||
| 600 | spin_lock_irqsave(&xhci->lock, flags); | ||
| 601 | } | ||
| 602 | } | ||
| 603 | |||
| 604 | temp = xhci_port_state_to_neutral(temp); | ||
| 605 | temp &= ~PORT_PLS_MASK; | ||
| 606 | temp |= PORT_LINK_STROBE | link_state; | ||
| 607 | xhci_writel(xhci, temp, port_array[wIndex]); | ||
| 608 | |||
| 609 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 610 | msleep(20); /* wait device to enter */ | ||
| 611 | spin_lock_irqsave(&xhci->lock, flags); | ||
| 612 | |||
| 613 | temp = xhci_readl(xhci, port_array[wIndex]); | ||
| 614 | if (link_state == USB_SS_PORT_LS_U3) | ||
| 615 | bus_state->suspended_ports |= 1 << wIndex; | ||
| 616 | break; | ||
| 540 | case USB_PORT_FEAT_POWER: | 617 | case USB_PORT_FEAT_POWER: |
| 541 | /* | 618 | /* |
| 542 | * Turn on ports, even if there isn't per-port switching. | 619 | * Turn on ports, even if there isn't per-port switching. |
| @@ -557,6 +634,12 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 557 | temp = xhci_readl(xhci, port_array[wIndex]); | 634 | temp = xhci_readl(xhci, port_array[wIndex]); |
| 558 | xhci_dbg(xhci, "set port reset, actual port %d status = 0x%x\n", wIndex, temp); | 635 | xhci_dbg(xhci, "set port reset, actual port %d status = 0x%x\n", wIndex, temp); |
| 559 | break; | 636 | break; |
| 637 | case USB_PORT_FEAT_BH_PORT_RESET: | ||
| 638 | temp |= PORT_WR; | ||
| 639 | xhci_writel(xhci, temp, port_array[wIndex]); | ||
| 640 | |||
| 641 | temp = xhci_readl(xhci, port_array[wIndex]); | ||
| 642 | break; | ||
| 560 | default: | 643 | default: |
| 561 | goto error; | 644 | goto error; |
| 562 | } | 645 | } |
| @@ -564,7 +647,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 564 | temp = xhci_readl(xhci, port_array[wIndex]); | 647 | temp = xhci_readl(xhci, port_array[wIndex]); |
| 565 | break; | 648 | break; |
| 566 | case ClearPortFeature: | 649 | case ClearPortFeature: |
| 567 | if (!wIndex || wIndex > ports) | 650 | if (!wIndex || wIndex > max_ports) |
| 568 | goto error; | 651 | goto error; |
| 569 | wIndex--; | 652 | wIndex--; |
| 570 | temp = xhci_readl(xhci, port_array[wIndex]); | 653 | temp = xhci_readl(xhci, port_array[wIndex]); |
| @@ -584,35 +667,27 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 584 | if (temp & XDEV_U3) { | 667 | if (temp & XDEV_U3) { |
| 585 | if ((temp & PORT_PE) == 0) | 668 | if ((temp & PORT_PE) == 0) |
| 586 | goto error; | 669 | goto error; |
| 587 | if (DEV_SUPERSPEED(temp)) { | ||
| 588 | temp = xhci_port_state_to_neutral(temp); | ||
| 589 | temp &= ~PORT_PLS_MASK; | ||
| 590 | temp |= PORT_LINK_STROBE | XDEV_U0; | ||
| 591 | xhci_writel(xhci, temp, | ||
| 592 | port_array[wIndex]); | ||
| 593 | xhci_readl(xhci, port_array[wIndex]); | ||
| 594 | } else { | ||
| 595 | temp = xhci_port_state_to_neutral(temp); | ||
| 596 | temp &= ~PORT_PLS_MASK; | ||
| 597 | temp |= PORT_LINK_STROBE | XDEV_RESUME; | ||
| 598 | xhci_writel(xhci, temp, | ||
| 599 | port_array[wIndex]); | ||
| 600 | 670 | ||
| 601 | spin_unlock_irqrestore(&xhci->lock, | 671 | temp = xhci_port_state_to_neutral(temp); |
| 602 | flags); | 672 | temp &= ~PORT_PLS_MASK; |
| 603 | msleep(20); | 673 | temp |= PORT_LINK_STROBE | XDEV_RESUME; |
| 604 | spin_lock_irqsave(&xhci->lock, flags); | 674 | xhci_writel(xhci, temp, |
| 675 | port_array[wIndex]); | ||
| 605 | 676 | ||
| 606 | temp = xhci_readl(xhci, | 677 | spin_unlock_irqrestore(&xhci->lock, |
| 607 | port_array[wIndex]); | 678 | flags); |
| 608 | temp = xhci_port_state_to_neutral(temp); | 679 | msleep(20); |
| 609 | temp &= ~PORT_PLS_MASK; | 680 | spin_lock_irqsave(&xhci->lock, flags); |
| 610 | temp |= PORT_LINK_STROBE | XDEV_U0; | 681 | |
| 611 | xhci_writel(xhci, temp, | 682 | temp = xhci_readl(xhci, |
| 612 | port_array[wIndex]); | 683 | port_array[wIndex]); |
| 613 | } | 684 | temp = xhci_port_state_to_neutral(temp); |
| 614 | bus_state->port_c_suspend |= 1 << wIndex; | 685 | temp &= ~PORT_PLS_MASK; |
| 686 | temp |= PORT_LINK_STROBE | XDEV_U0; | ||
| 687 | xhci_writel(xhci, temp, | ||
| 688 | port_array[wIndex]); | ||
| 615 | } | 689 | } |
| 690 | bus_state->port_c_suspend |= 1 << wIndex; | ||
| 616 | 691 | ||
| 617 | slot_id = xhci_find_slot_id_by_port(hcd, xhci, | 692 | slot_id = xhci_find_slot_id_by_port(hcd, xhci, |
| 618 | wIndex + 1); | 693 | wIndex + 1); |
| @@ -625,9 +700,11 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 625 | case USB_PORT_FEAT_C_SUSPEND: | 700 | case USB_PORT_FEAT_C_SUSPEND: |
| 626 | bus_state->port_c_suspend &= ~(1 << wIndex); | 701 | bus_state->port_c_suspend &= ~(1 << wIndex); |
| 627 | case USB_PORT_FEAT_C_RESET: | 702 | case USB_PORT_FEAT_C_RESET: |
| 703 | case USB_PORT_FEAT_C_BH_PORT_RESET: | ||
| 628 | case USB_PORT_FEAT_C_CONNECTION: | 704 | case USB_PORT_FEAT_C_CONNECTION: |
| 629 | case USB_PORT_FEAT_C_OVER_CURRENT: | 705 | case USB_PORT_FEAT_C_OVER_CURRENT: |
| 630 | case USB_PORT_FEAT_C_ENABLE: | 706 | case USB_PORT_FEAT_C_ENABLE: |
| 707 | case USB_PORT_FEAT_C_PORT_LINK_STATE: | ||
| 631 | xhci_clear_port_change_bit(xhci, wValue, wIndex, | 708 | xhci_clear_port_change_bit(xhci, wValue, wIndex, |
| 632 | port_array[wIndex], temp); | 709 | port_array[wIndex], temp); |
| 633 | break; | 710 | break; |
| @@ -663,29 +740,23 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf) | |||
| 663 | u32 mask; | 740 | u32 mask; |
| 664 | int i, retval; | 741 | int i, retval; |
| 665 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 742 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
| 666 | int ports; | 743 | int max_ports; |
| 667 | u32 __iomem **port_array; | 744 | __le32 __iomem **port_array; |
| 668 | struct xhci_bus_state *bus_state; | 745 | struct xhci_bus_state *bus_state; |
| 669 | 746 | ||
| 670 | if (hcd->speed == HCD_USB3) { | 747 | max_ports = xhci_get_ports(hcd, &port_array); |
| 671 | ports = xhci->num_usb3_ports; | ||
| 672 | port_array = xhci->usb3_ports; | ||
| 673 | } else { | ||
| 674 | ports = xhci->num_usb2_ports; | ||
| 675 | port_array = xhci->usb2_ports; | ||
| 676 | } | ||
| 677 | bus_state = &xhci->bus_state[hcd_index(hcd)]; | 748 | bus_state = &xhci->bus_state[hcd_index(hcd)]; |
| 678 | 749 | ||
| 679 | /* Initial status is no changes */ | 750 | /* Initial status is no changes */ |
| 680 | retval = (ports + 8) / 8; | 751 | retval = (max_ports + 8) / 8; |
| 681 | memset(buf, 0, retval); | 752 | memset(buf, 0, retval); |
| 682 | status = 0; | 753 | status = 0; |
| 683 | 754 | ||
| 684 | mask = PORT_CSC | PORT_PEC | PORT_OCC; | 755 | mask = PORT_CSC | PORT_PEC | PORT_OCC | PORT_PLC; |
| 685 | 756 | ||
| 686 | spin_lock_irqsave(&xhci->lock, flags); | 757 | spin_lock_irqsave(&xhci->lock, flags); |
| 687 | /* For each port, did anything change? If so, set that bit in buf. */ | 758 | /* For each port, did anything change? If so, set that bit in buf. */ |
| 688 | for (i = 0; i < ports; i++) { | 759 | for (i = 0; i < max_ports; i++) { |
| 689 | temp = xhci_readl(xhci, port_array[i]); | 760 | temp = xhci_readl(xhci, port_array[i]); |
| 690 | if (temp == 0xffffffff) { | 761 | if (temp == 0xffffffff) { |
| 691 | retval = -ENODEV; | 762 | retval = -ENODEV; |
| @@ -709,19 +780,11 @@ int xhci_bus_suspend(struct usb_hcd *hcd) | |||
| 709 | { | 780 | { |
| 710 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 781 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
| 711 | int max_ports, port_index; | 782 | int max_ports, port_index; |
| 712 | u32 __iomem **port_array; | 783 | __le32 __iomem **port_array; |
| 713 | struct xhci_bus_state *bus_state; | 784 | struct xhci_bus_state *bus_state; |
| 714 | unsigned long flags; | 785 | unsigned long flags; |
| 715 | 786 | ||
| 716 | if (hcd->speed == HCD_USB3) { | 787 | max_ports = xhci_get_ports(hcd, &port_array); |
| 717 | max_ports = xhci->num_usb3_ports; | ||
| 718 | port_array = xhci->usb3_ports; | ||
| 719 | xhci_dbg(xhci, "suspend USB 3.0 root hub\n"); | ||
| 720 | } else { | ||
| 721 | max_ports = xhci->num_usb2_ports; | ||
| 722 | port_array = xhci->usb2_ports; | ||
| 723 | xhci_dbg(xhci, "suspend USB 2.0 root hub\n"); | ||
| 724 | } | ||
| 725 | bus_state = &xhci->bus_state[hcd_index(hcd)]; | 788 | bus_state = &xhci->bus_state[hcd_index(hcd)]; |
| 726 | 789 | ||
| 727 | spin_lock_irqsave(&xhci->lock, flags); | 790 | spin_lock_irqsave(&xhci->lock, flags); |
| @@ -779,7 +842,7 @@ int xhci_bus_suspend(struct usb_hcd *hcd) | |||
| 779 | 842 | ||
| 780 | if (hcd->speed != HCD_USB3) { | 843 | if (hcd->speed != HCD_USB3) { |
| 781 | /* enable remote wake up for USB 2.0 */ | 844 | /* enable remote wake up for USB 2.0 */ |
| 782 | u32 __iomem *addr; | 845 | __le32 __iomem *addr; |
| 783 | u32 tmp; | 846 | u32 tmp; |
| 784 | 847 | ||
| 785 | /* Add one to the port status register address to get | 848 | /* Add one to the port status register address to get |
| @@ -801,20 +864,12 @@ int xhci_bus_resume(struct usb_hcd *hcd) | |||
| 801 | { | 864 | { |
| 802 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 865 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
| 803 | int max_ports, port_index; | 866 | int max_ports, port_index; |
| 804 | u32 __iomem **port_array; | 867 | __le32 __iomem **port_array; |
| 805 | struct xhci_bus_state *bus_state; | 868 | struct xhci_bus_state *bus_state; |
| 806 | u32 temp; | 869 | u32 temp; |
| 807 | unsigned long flags; | 870 | unsigned long flags; |
| 808 | 871 | ||
| 809 | if (hcd->speed == HCD_USB3) { | 872 | max_ports = xhci_get_ports(hcd, &port_array); |
| 810 | max_ports = xhci->num_usb3_ports; | ||
| 811 | port_array = xhci->usb3_ports; | ||
| 812 | xhci_dbg(xhci, "resume USB 3.0 root hub\n"); | ||
| 813 | } else { | ||
| 814 | max_ports = xhci->num_usb2_ports; | ||
| 815 | port_array = xhci->usb2_ports; | ||
| 816 | xhci_dbg(xhci, "resume USB 2.0 root hub\n"); | ||
| 817 | } | ||
| 818 | bus_state = &xhci->bus_state[hcd_index(hcd)]; | 873 | bus_state = &xhci->bus_state[hcd_index(hcd)]; |
| 819 | 874 | ||
| 820 | if (time_before(jiffies, bus_state->next_statechange)) | 875 | if (time_before(jiffies, bus_state->next_statechange)) |
| @@ -890,7 +945,7 @@ int xhci_bus_resume(struct usb_hcd *hcd) | |||
| 890 | 945 | ||
| 891 | if (hcd->speed != HCD_USB3) { | 946 | if (hcd->speed != HCD_USB3) { |
| 892 | /* disable remote wake up for USB 2.0 */ | 947 | /* disable remote wake up for USB 2.0 */ |
| 893 | u32 __iomem *addr; | 948 | __le32 __iomem *addr; |
| 894 | u32 tmp; | 949 | u32 tmp; |
| 895 | 950 | ||
| 896 | /* Add one to the port status register address to get | 951 | /* Add one to the port status register address to get |
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 627f3438028..26caba4c195 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
| @@ -89,16 +89,17 @@ static void xhci_link_segments(struct xhci_hcd *xhci, struct xhci_segment *prev, | |||
| 89 | return; | 89 | return; |
| 90 | prev->next = next; | 90 | prev->next = next; |
| 91 | if (link_trbs) { | 91 | if (link_trbs) { |
| 92 | prev->trbs[TRBS_PER_SEGMENT-1].link.segment_ptr = next->dma; | 92 | prev->trbs[TRBS_PER_SEGMENT-1].link. |
| 93 | segment_ptr = cpu_to_le64(next->dma); | ||
| 93 | 94 | ||
| 94 | /* Set the last TRB in the segment to have a TRB type ID of Link TRB */ | 95 | /* Set the last TRB in the segment to have a TRB type ID of Link TRB */ |
| 95 | val = prev->trbs[TRBS_PER_SEGMENT-1].link.control; | 96 | val = le32_to_cpu(prev->trbs[TRBS_PER_SEGMENT-1].link.control); |
| 96 | val &= ~TRB_TYPE_BITMASK; | 97 | val &= ~TRB_TYPE_BITMASK; |
| 97 | val |= TRB_TYPE(TRB_LINK); | 98 | val |= TRB_TYPE(TRB_LINK); |
| 98 | /* Always set the chain bit with 0.95 hardware */ | 99 | /* Always set the chain bit with 0.95 hardware */ |
| 99 | if (xhci_link_trb_quirk(xhci)) | 100 | if (xhci_link_trb_quirk(xhci)) |
| 100 | val |= TRB_CHAIN; | 101 | val |= TRB_CHAIN; |
| 101 | prev->trbs[TRBS_PER_SEGMENT-1].link.control = val; | 102 | prev->trbs[TRBS_PER_SEGMENT-1].link.control = cpu_to_le32(val); |
| 102 | } | 103 | } |
| 103 | xhci_dbg(xhci, "Linking segment 0x%llx to segment 0x%llx (DMA)\n", | 104 | xhci_dbg(xhci, "Linking segment 0x%llx to segment 0x%llx (DMA)\n", |
| 104 | (unsigned long long)prev->dma, | 105 | (unsigned long long)prev->dma, |
| @@ -186,7 +187,8 @@ static struct xhci_ring *xhci_ring_alloc(struct xhci_hcd *xhci, | |||
| 186 | 187 | ||
| 187 | if (link_trbs) { | 188 | if (link_trbs) { |
| 188 | /* See section 4.9.2.1 and 6.4.4.1 */ | 189 | /* See section 4.9.2.1 and 6.4.4.1 */ |
| 189 | prev->trbs[TRBS_PER_SEGMENT-1].link.control |= (LINK_TOGGLE); | 190 | prev->trbs[TRBS_PER_SEGMENT-1].link. |
| 191 | control |= cpu_to_le32(LINK_TOGGLE); | ||
| 190 | xhci_dbg(xhci, "Wrote link toggle flag to" | 192 | xhci_dbg(xhci, "Wrote link toggle flag to" |
| 191 | " segment %p (virtual), 0x%llx (DMA)\n", | 193 | " segment %p (virtual), 0x%llx (DMA)\n", |
| 192 | prev, (unsigned long long)prev->dma); | 194 | prev, (unsigned long long)prev->dma); |
| @@ -207,14 +209,13 @@ void xhci_free_or_cache_endpoint_ring(struct xhci_hcd *xhci, | |||
| 207 | 209 | ||
| 208 | rings_cached = virt_dev->num_rings_cached; | 210 | rings_cached = virt_dev->num_rings_cached; |
| 209 | if (rings_cached < XHCI_MAX_RINGS_CACHED) { | 211 | if (rings_cached < XHCI_MAX_RINGS_CACHED) { |
| 210 | virt_dev->num_rings_cached++; | ||
| 211 | rings_cached = virt_dev->num_rings_cached; | ||
| 212 | virt_dev->ring_cache[rings_cached] = | 212 | virt_dev->ring_cache[rings_cached] = |
| 213 | virt_dev->eps[ep_index].ring; | 213 | virt_dev->eps[ep_index].ring; |
| 214 | virt_dev->num_rings_cached++; | ||
| 214 | xhci_dbg(xhci, "Cached old ring, " | 215 | xhci_dbg(xhci, "Cached old ring, " |
| 215 | "%d ring%s cached\n", | 216 | "%d ring%s cached\n", |
| 216 | rings_cached, | 217 | virt_dev->num_rings_cached, |
| 217 | (rings_cached > 1) ? "s" : ""); | 218 | (virt_dev->num_rings_cached > 1) ? "s" : ""); |
| 218 | } else { | 219 | } else { |
| 219 | xhci_ring_free(xhci, virt_dev->eps[ep_index].ring); | 220 | xhci_ring_free(xhci, virt_dev->eps[ep_index].ring); |
| 220 | xhci_dbg(xhci, "Ring cache full (%d rings), " | 221 | xhci_dbg(xhci, "Ring cache full (%d rings), " |
| @@ -548,7 +549,8 @@ struct xhci_stream_info *xhci_alloc_stream_info(struct xhci_hcd *xhci, | |||
| 548 | addr = cur_ring->first_seg->dma | | 549 | addr = cur_ring->first_seg->dma | |
| 549 | SCT_FOR_CTX(SCT_PRI_TR) | | 550 | SCT_FOR_CTX(SCT_PRI_TR) | |
| 550 | cur_ring->cycle_state; | 551 | cur_ring->cycle_state; |
| 551 | stream_info->stream_ctx_array[cur_stream].stream_ring = addr; | 552 | stream_info->stream_ctx_array[cur_stream]. |
| 553 | stream_ring = cpu_to_le64(addr); | ||
| 552 | xhci_dbg(xhci, "Setting stream %d ring ptr to 0x%08llx\n", | 554 | xhci_dbg(xhci, "Setting stream %d ring ptr to 0x%08llx\n", |
| 553 | cur_stream, (unsigned long long) addr); | 555 | cur_stream, (unsigned long long) addr); |
| 554 | 556 | ||
| @@ -614,10 +616,10 @@ void xhci_setup_streams_ep_input_ctx(struct xhci_hcd *xhci, | |||
| 614 | max_primary_streams = fls(stream_info->num_stream_ctxs) - 2; | 616 | max_primary_streams = fls(stream_info->num_stream_ctxs) - 2; |
| 615 | xhci_dbg(xhci, "Setting number of stream ctx array entries to %u\n", | 617 | xhci_dbg(xhci, "Setting number of stream ctx array entries to %u\n", |
| 616 | 1 << (max_primary_streams + 1)); | 618 | 1 << (max_primary_streams + 1)); |
| 617 | ep_ctx->ep_info &= ~EP_MAXPSTREAMS_MASK; | 619 | ep_ctx->ep_info &= cpu_to_le32(~EP_MAXPSTREAMS_MASK); |
| 618 | ep_ctx->ep_info |= EP_MAXPSTREAMS(max_primary_streams); | 620 | ep_ctx->ep_info |= cpu_to_le32(EP_MAXPSTREAMS(max_primary_streams) |
| 619 | ep_ctx->ep_info |= EP_HAS_LSA; | 621 | | EP_HAS_LSA); |
| 620 | ep_ctx->deq = stream_info->ctx_array_dma; | 622 | ep_ctx->deq = cpu_to_le64(stream_info->ctx_array_dma); |
| 621 | } | 623 | } |
| 622 | 624 | ||
| 623 | /* | 625 | /* |
| @@ -630,10 +632,9 @@ void xhci_setup_no_streams_ep_input_ctx(struct xhci_hcd *xhci, | |||
| 630 | struct xhci_virt_ep *ep) | 632 | struct xhci_virt_ep *ep) |
| 631 | { | 633 | { |
| 632 | dma_addr_t addr; | 634 | dma_addr_t addr; |
| 633 | ep_ctx->ep_info &= ~EP_MAXPSTREAMS_MASK; | 635 | ep_ctx->ep_info &= cpu_to_le32(~(EP_MAXPSTREAMS_MASK | EP_HAS_LSA)); |
| 634 | ep_ctx->ep_info &= ~EP_HAS_LSA; | ||
| 635 | addr = xhci_trb_virt_to_dma(ep->ring->deq_seg, ep->ring->dequeue); | 636 | addr = xhci_trb_virt_to_dma(ep->ring->deq_seg, ep->ring->dequeue); |
| 636 | ep_ctx->deq = addr | ep->ring->cycle_state; | 637 | ep_ctx->deq = cpu_to_le64(addr | ep->ring->cycle_state); |
| 637 | } | 638 | } |
| 638 | 639 | ||
| 639 | /* Frees all stream contexts associated with the endpoint, | 640 | /* Frees all stream contexts associated with the endpoint, |
| @@ -781,11 +782,11 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id, | |||
| 781 | dev->udev = udev; | 782 | dev->udev = udev; |
| 782 | 783 | ||
| 783 | /* Point to output device context in dcbaa. */ | 784 | /* Point to output device context in dcbaa. */ |
| 784 | xhci->dcbaa->dev_context_ptrs[slot_id] = dev->out_ctx->dma; | 785 | xhci->dcbaa->dev_context_ptrs[slot_id] = cpu_to_le64(dev->out_ctx->dma); |
| 785 | xhci_dbg(xhci, "Set slot id %d dcbaa entry %p to 0x%llx\n", | 786 | xhci_dbg(xhci, "Set slot id %d dcbaa entry %p to 0x%llx\n", |
| 786 | slot_id, | 787 | slot_id, |
| 787 | &xhci->dcbaa->dev_context_ptrs[slot_id], | 788 | &xhci->dcbaa->dev_context_ptrs[slot_id], |
| 788 | (unsigned long long) xhci->dcbaa->dev_context_ptrs[slot_id]); | 789 | (unsigned long long) le64_to_cpu(xhci->dcbaa->dev_context_ptrs[slot_id])); |
| 789 | 790 | ||
| 790 | return 1; | 791 | return 1; |
| 791 | fail: | 792 | fail: |
| @@ -810,8 +811,9 @@ void xhci_copy_ep0_dequeue_into_input_ctx(struct xhci_hcd *xhci, | |||
| 810 | * configured device has reset, so all control transfers should have | 811 | * configured device has reset, so all control transfers should have |
| 811 | * been completed or cancelled before the reset. | 812 | * been completed or cancelled before the reset. |
| 812 | */ | 813 | */ |
| 813 | ep0_ctx->deq = xhci_trb_virt_to_dma(ep_ring->enq_seg, ep_ring->enqueue); | 814 | ep0_ctx->deq = cpu_to_le64(xhci_trb_virt_to_dma(ep_ring->enq_seg, |
| 814 | ep0_ctx->deq |= ep_ring->cycle_state; | 815 | ep_ring->enqueue) |
| 816 | | ep_ring->cycle_state); | ||
| 815 | } | 817 | } |
| 816 | 818 | ||
| 817 | /* | 819 | /* |
| @@ -885,24 +887,22 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud | |||
| 885 | slot_ctx = xhci_get_slot_ctx(xhci, dev->in_ctx); | 887 | slot_ctx = xhci_get_slot_ctx(xhci, dev->in_ctx); |
| 886 | 888 | ||
| 887 | /* 2) New slot context and endpoint 0 context are valid*/ | 889 | /* 2) New slot context and endpoint 0 context are valid*/ |
| 888 | ctrl_ctx->add_flags = SLOT_FLAG | EP0_FLAG; | 890 | ctrl_ctx->add_flags = cpu_to_le32(SLOT_FLAG | EP0_FLAG); |
| 889 | 891 | ||
| 890 | /* 3) Only the control endpoint is valid - one endpoint context */ | 892 | /* 3) Only the control endpoint is valid - one endpoint context */ |
| 891 | slot_ctx->dev_info |= LAST_CTX(1); | 893 | slot_ctx->dev_info |= cpu_to_le32(LAST_CTX(1) | (u32) udev->route); |
| 892 | |||
| 893 | slot_ctx->dev_info |= (u32) udev->route; | ||
| 894 | switch (udev->speed) { | 894 | switch (udev->speed) { |
| 895 | case USB_SPEED_SUPER: | 895 | case USB_SPEED_SUPER: |
| 896 | slot_ctx->dev_info |= (u32) SLOT_SPEED_SS; | 896 | slot_ctx->dev_info |= cpu_to_le32((u32) SLOT_SPEED_SS); |
| 897 | break; | 897 | break; |
| 898 | case USB_SPEED_HIGH: | 898 | case USB_SPEED_HIGH: |
| 899 | slot_ctx->dev_info |= (u32) SLOT_SPEED_HS; | 899 | slot_ctx->dev_info |= cpu_to_le32((u32) SLOT_SPEED_HS); |
| 900 | break; | 900 | break; |
| 901 | case USB_SPEED_FULL: | 901 | case USB_SPEED_FULL: |
| 902 | slot_ctx->dev_info |= (u32) SLOT_SPEED_FS; | 902 | slot_ctx->dev_info |= cpu_to_le32((u32) SLOT_SPEED_FS); |
| 903 | break; | 903 | break; |
| 904 | case USB_SPEED_LOW: | 904 | case USB_SPEED_LOW: |
| 905 | slot_ctx->dev_info |= (u32) SLOT_SPEED_LS; | 905 | slot_ctx->dev_info |= cpu_to_le32((u32) SLOT_SPEED_LS); |
| 906 | break; | 906 | break; |
| 907 | case USB_SPEED_WIRELESS: | 907 | case USB_SPEED_WIRELESS: |
| 908 | xhci_dbg(xhci, "FIXME xHCI doesn't support wireless speeds\n"); | 908 | xhci_dbg(xhci, "FIXME xHCI doesn't support wireless speeds\n"); |
| @@ -916,7 +916,7 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud | |||
| 916 | port_num = xhci_find_real_port_number(xhci, udev); | 916 | port_num = xhci_find_real_port_number(xhci, udev); |
| 917 | if (!port_num) | 917 | if (!port_num) |
| 918 | return -EINVAL; | 918 | return -EINVAL; |
| 919 | slot_ctx->dev_info2 |= (u32) ROOT_HUB_PORT(port_num); | 919 | slot_ctx->dev_info2 |= cpu_to_le32((u32) ROOT_HUB_PORT(port_num)); |
| 920 | /* Set the port number in the virtual_device to the faked port number */ | 920 | /* Set the port number in the virtual_device to the faked port number */ |
| 921 | for (top_dev = udev; top_dev->parent && top_dev->parent->parent; | 921 | for (top_dev = udev; top_dev->parent && top_dev->parent->parent; |
| 922 | top_dev = top_dev->parent) | 922 | top_dev = top_dev->parent) |
| @@ -927,31 +927,31 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud | |||
| 927 | 927 | ||
| 928 | /* Is this a LS/FS device under an external HS hub? */ | 928 | /* Is this a LS/FS device under an external HS hub? */ |
| 929 | if (udev->tt && udev->tt->hub->parent) { | 929 | if (udev->tt && udev->tt->hub->parent) { |
| 930 | slot_ctx->tt_info = udev->tt->hub->slot_id; | 930 | slot_ctx->tt_info = cpu_to_le32(udev->tt->hub->slot_id | |
| 931 | slot_ctx->tt_info |= udev->ttport << 8; | 931 | (udev->ttport << 8)); |
| 932 | if (udev->tt->multi) | 932 | if (udev->tt->multi) |
| 933 | slot_ctx->dev_info |= DEV_MTT; | 933 | slot_ctx->dev_info |= cpu_to_le32(DEV_MTT); |
| 934 | } | 934 | } |
| 935 | xhci_dbg(xhci, "udev->tt = %p\n", udev->tt); | 935 | xhci_dbg(xhci, "udev->tt = %p\n", udev->tt); |
| 936 | xhci_dbg(xhci, "udev->ttport = 0x%x\n", udev->ttport); | 936 | xhci_dbg(xhci, "udev->ttport = 0x%x\n", udev->ttport); |
| 937 | 937 | ||
| 938 | /* Step 4 - ring already allocated */ | 938 | /* Step 4 - ring already allocated */ |
| 939 | /* Step 5 */ | 939 | /* Step 5 */ |
| 940 | ep0_ctx->ep_info2 = EP_TYPE(CTRL_EP); | 940 | ep0_ctx->ep_info2 = cpu_to_le32(EP_TYPE(CTRL_EP)); |
| 941 | /* | 941 | /* |
| 942 | * XXX: Not sure about wireless USB devices. | 942 | * XXX: Not sure about wireless USB devices. |
| 943 | */ | 943 | */ |
| 944 | switch (udev->speed) { | 944 | switch (udev->speed) { |
| 945 | case USB_SPEED_SUPER: | 945 | case USB_SPEED_SUPER: |
| 946 | ep0_ctx->ep_info2 |= MAX_PACKET(512); | 946 | ep0_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(512)); |
| 947 | break; | 947 | break; |
| 948 | case USB_SPEED_HIGH: | 948 | case USB_SPEED_HIGH: |
| 949 | /* USB core guesses at a 64-byte max packet first for FS devices */ | 949 | /* USB core guesses at a 64-byte max packet first for FS devices */ |
| 950 | case USB_SPEED_FULL: | 950 | case USB_SPEED_FULL: |
| 951 | ep0_ctx->ep_info2 |= MAX_PACKET(64); | 951 | ep0_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(64)); |
| 952 | break; | 952 | break; |
| 953 | case USB_SPEED_LOW: | 953 | case USB_SPEED_LOW: |
| 954 | ep0_ctx->ep_info2 |= MAX_PACKET(8); | 954 | ep0_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(8)); |
| 955 | break; | 955 | break; |
| 956 | case USB_SPEED_WIRELESS: | 956 | case USB_SPEED_WIRELESS: |
| 957 | xhci_dbg(xhci, "FIXME xHCI doesn't support wireless speeds\n"); | 957 | xhci_dbg(xhci, "FIXME xHCI doesn't support wireless speeds\n"); |
| @@ -962,12 +962,10 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud | |||
| 962 | BUG(); | 962 | BUG(); |
| 963 | } | 963 | } |
| 964 | /* EP 0 can handle "burst" sizes of 1, so Max Burst Size field is 0 */ | 964 | /* EP 0 can handle "burst" sizes of 1, so Max Burst Size field is 0 */ |
| 965 | ep0_ctx->ep_info2 |= MAX_BURST(0); | 965 | ep0_ctx->ep_info2 |= cpu_to_le32(MAX_BURST(0) | ERROR_COUNT(3)); |
| 966 | ep0_ctx->ep_info2 |= ERROR_COUNT(3); | ||
| 967 | 966 | ||
| 968 | ep0_ctx->deq = | 967 | ep0_ctx->deq = cpu_to_le64(dev->eps[0].ring->first_seg->dma | |
| 969 | dev->eps[0].ring->first_seg->dma; | 968 | dev->eps[0].ring->cycle_state); |
| 970 | ep0_ctx->deq |= dev->eps[0].ring->cycle_state; | ||
| 971 | 969 | ||
| 972 | /* Steps 7 and 8 were done in xhci_alloc_virt_device() */ | 970 | /* Steps 7 and 8 were done in xhci_alloc_virt_device() */ |
| 973 | 971 | ||
| @@ -1046,12 +1044,12 @@ static unsigned int xhci_get_endpoint_interval(struct usb_device *udev, | |||
| 1046 | break; | 1044 | break; |
| 1047 | 1045 | ||
| 1048 | case USB_SPEED_FULL: | 1046 | case USB_SPEED_FULL: |
| 1049 | if (usb_endpoint_xfer_int(&ep->desc)) { | 1047 | if (usb_endpoint_xfer_isoc(&ep->desc)) { |
| 1050 | interval = xhci_parse_exponent_interval(udev, ep); | 1048 | interval = xhci_parse_exponent_interval(udev, ep); |
| 1051 | break; | 1049 | break; |
| 1052 | } | 1050 | } |
| 1053 | /* | 1051 | /* |
| 1054 | * Fall through for isochronous endpoint interval decoding | 1052 | * Fall through for interrupt endpoint interval decoding |
| 1055 | * since it uses the same rules as low speed interrupt | 1053 | * since it uses the same rules as low speed interrupt |
| 1056 | * endpoints. | 1054 | * endpoints. |
| 1057 | */ | 1055 | */ |
| @@ -1131,10 +1129,10 @@ static u32 xhci_get_max_esit_payload(struct xhci_hcd *xhci, | |||
| 1131 | return 0; | 1129 | return 0; |
| 1132 | 1130 | ||
| 1133 | if (udev->speed == USB_SPEED_SUPER) | 1131 | if (udev->speed == USB_SPEED_SUPER) |
| 1134 | return ep->ss_ep_comp.wBytesPerInterval; | 1132 | return le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval); |
| 1135 | 1133 | ||
| 1136 | max_packet = GET_MAX_PACKET(ep->desc.wMaxPacketSize); | 1134 | max_packet = GET_MAX_PACKET(le16_to_cpu(ep->desc.wMaxPacketSize)); |
| 1137 | max_burst = (ep->desc.wMaxPacketSize & 0x1800) >> 11; | 1135 | max_burst = (le16_to_cpu(ep->desc.wMaxPacketSize) & 0x1800) >> 11; |
| 1138 | /* A 0 in max burst means 1 transfer per ESIT */ | 1136 | /* A 0 in max burst means 1 transfer per ESIT */ |
| 1139 | return max_packet * (max_burst + 1); | 1137 | return max_packet * (max_burst + 1); |
| 1140 | } | 1138 | } |
| @@ -1183,33 +1181,33 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, | |||
| 1183 | } | 1181 | } |
| 1184 | virt_dev->eps[ep_index].skip = false; | 1182 | virt_dev->eps[ep_index].skip = false; |
| 1185 | ep_ring = virt_dev->eps[ep_index].new_ring; | 1183 | ep_ring = virt_dev->eps[ep_index].new_ring; |
| 1186 | ep_ctx->deq = ep_ring->first_seg->dma | ep_ring->cycle_state; | 1184 | ep_ctx->deq = cpu_to_le64(ep_ring->first_seg->dma | ep_ring->cycle_state); |
| 1187 | 1185 | ||
| 1188 | ep_ctx->ep_info = xhci_get_endpoint_interval(udev, ep); | 1186 | ep_ctx->ep_info = cpu_to_le32(xhci_get_endpoint_interval(udev, ep) |
| 1189 | ep_ctx->ep_info |= EP_MULT(xhci_get_endpoint_mult(udev, ep)); | 1187 | | EP_MULT(xhci_get_endpoint_mult(udev, ep))); |
| 1190 | 1188 | ||
| 1191 | /* FIXME dig Mult and streams info out of ep companion desc */ | 1189 | /* FIXME dig Mult and streams info out of ep companion desc */ |
| 1192 | 1190 | ||
| 1193 | /* Allow 3 retries for everything but isoc; | 1191 | /* Allow 3 retries for everything but isoc; |
| 1194 | * error count = 0 means infinite retries. | 1192 | * CErr shall be set to 0 for Isoch endpoints. |
| 1195 | */ | 1193 | */ |
| 1196 | if (!usb_endpoint_xfer_isoc(&ep->desc)) | 1194 | if (!usb_endpoint_xfer_isoc(&ep->desc)) |
| 1197 | ep_ctx->ep_info2 = ERROR_COUNT(3); | 1195 | ep_ctx->ep_info2 = cpu_to_le32(ERROR_COUNT(3)); |
| 1198 | else | 1196 | else |
| 1199 | ep_ctx->ep_info2 = ERROR_COUNT(1); | 1197 | ep_ctx->ep_info2 = cpu_to_le32(ERROR_COUNT(0)); |
| 1200 | 1198 | ||
| 1201 | ep_ctx->ep_info2 |= xhci_get_endpoint_type(udev, ep); | 1199 | ep_ctx->ep_info2 |= cpu_to_le32(xhci_get_endpoint_type(udev, ep)); |
| 1202 | 1200 | ||
| 1203 | /* Set the max packet size and max burst */ | 1201 | /* Set the max packet size and max burst */ |
| 1204 | switch (udev->speed) { | 1202 | switch (udev->speed) { |
| 1205 | case USB_SPEED_SUPER: | 1203 | case USB_SPEED_SUPER: |
| 1206 | max_packet = ep->desc.wMaxPacketSize; | 1204 | max_packet = le16_to_cpu(ep->desc.wMaxPacketSize); |
| 1207 | ep_ctx->ep_info2 |= MAX_PACKET(max_packet); | 1205 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet)); |
| 1208 | /* dig out max burst from ep companion desc */ | 1206 | /* dig out max burst from ep companion desc */ |
| 1209 | max_packet = ep->ss_ep_comp.bMaxBurst; | 1207 | max_packet = ep->ss_ep_comp.bMaxBurst; |
| 1210 | if (!max_packet) | 1208 | if (!max_packet) |
| 1211 | xhci_warn(xhci, "WARN no SS endpoint bMaxBurst\n"); | 1209 | xhci_warn(xhci, "WARN no SS endpoint bMaxBurst\n"); |
| 1212 | ep_ctx->ep_info2 |= MAX_BURST(max_packet); | 1210 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_BURST(max_packet)); |
| 1213 | break; | 1211 | break; |
| 1214 | case USB_SPEED_HIGH: | 1212 | case USB_SPEED_HIGH: |
| 1215 | /* bits 11:12 specify the number of additional transaction | 1213 | /* bits 11:12 specify the number of additional transaction |
| @@ -1217,20 +1215,21 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, | |||
| 1217 | */ | 1215 | */ |
| 1218 | if (usb_endpoint_xfer_isoc(&ep->desc) || | 1216 | if (usb_endpoint_xfer_isoc(&ep->desc) || |
| 1219 | usb_endpoint_xfer_int(&ep->desc)) { | 1217 | usb_endpoint_xfer_int(&ep->desc)) { |
| 1220 | max_burst = (ep->desc.wMaxPacketSize & 0x1800) >> 11; | 1218 | max_burst = (le16_to_cpu(ep->desc.wMaxPacketSize) |
| 1221 | ep_ctx->ep_info2 |= MAX_BURST(max_burst); | 1219 | & 0x1800) >> 11; |
| 1220 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_BURST(max_burst)); | ||
| 1222 | } | 1221 | } |
| 1223 | /* Fall through */ | 1222 | /* Fall through */ |
| 1224 | case USB_SPEED_FULL: | 1223 | case USB_SPEED_FULL: |
| 1225 | case USB_SPEED_LOW: | 1224 | case USB_SPEED_LOW: |
| 1226 | max_packet = GET_MAX_PACKET(ep->desc.wMaxPacketSize); | 1225 | max_packet = GET_MAX_PACKET(le16_to_cpu(ep->desc.wMaxPacketSize)); |
| 1227 | ep_ctx->ep_info2 |= MAX_PACKET(max_packet); | 1226 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet)); |
| 1228 | break; | 1227 | break; |
| 1229 | default: | 1228 | default: |
| 1230 | BUG(); | 1229 | BUG(); |
| 1231 | } | 1230 | } |
| 1232 | max_esit_payload = xhci_get_max_esit_payload(xhci, udev, ep); | 1231 | max_esit_payload = xhci_get_max_esit_payload(xhci, udev, ep); |
| 1233 | ep_ctx->tx_info = MAX_ESIT_PAYLOAD_FOR_EP(max_esit_payload); | 1232 | ep_ctx->tx_info = cpu_to_le32(MAX_ESIT_PAYLOAD_FOR_EP(max_esit_payload)); |
| 1234 | 1233 | ||
| 1235 | /* | 1234 | /* |
| 1236 | * XXX no idea how to calculate the average TRB buffer length for bulk | 1235 | * XXX no idea how to calculate the average TRB buffer length for bulk |
| @@ -1246,8 +1245,15 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, | |||
| 1246 | * including link TRBs, No-op TRBs, and Event data TRBs. Since we don't | 1245 | * including link TRBs, No-op TRBs, and Event data TRBs. Since we don't |
| 1247 | * use Event Data TRBs, and we don't chain in a link TRB on short | 1246 | * use Event Data TRBs, and we don't chain in a link TRB on short |
| 1248 | * transfers, we're basically dividing by 1. | 1247 | * transfers, we're basically dividing by 1. |
| 1248 | * | ||
| 1249 | * xHCI 1.0 specification indicates that the Average TRB Length should | ||
| 1250 | * be set to 8 for control endpoints. | ||
| 1249 | */ | 1251 | */ |
| 1250 | ep_ctx->tx_info |= AVG_TRB_LENGTH_FOR_EP(max_esit_payload); | 1252 | if (usb_endpoint_xfer_control(&ep->desc) && xhci->hci_version == 0x100) |
| 1253 | ep_ctx->tx_info |= cpu_to_le32(AVG_TRB_LENGTH_FOR_EP(8)); | ||
| 1254 | else | ||
| 1255 | ep_ctx->tx_info |= | ||
| 1256 | cpu_to_le32(AVG_TRB_LENGTH_FOR_EP(max_esit_payload)); | ||
| 1251 | 1257 | ||
| 1252 | /* FIXME Debug endpoint context */ | 1258 | /* FIXME Debug endpoint context */ |
| 1253 | return 0; | 1259 | return 0; |
| @@ -1347,7 +1353,7 @@ static int scratchpad_alloc(struct xhci_hcd *xhci, gfp_t flags) | |||
| 1347 | if (!xhci->scratchpad->sp_dma_buffers) | 1353 | if (!xhci->scratchpad->sp_dma_buffers) |
| 1348 | goto fail_sp4; | 1354 | goto fail_sp4; |
| 1349 | 1355 | ||
| 1350 | xhci->dcbaa->dev_context_ptrs[0] = xhci->scratchpad->sp_dma; | 1356 | xhci->dcbaa->dev_context_ptrs[0] = cpu_to_le64(xhci->scratchpad->sp_dma); |
| 1351 | for (i = 0; i < num_sp; i++) { | 1357 | for (i = 0; i < num_sp; i++) { |
| 1352 | dma_addr_t dma; | 1358 | dma_addr_t dma; |
| 1353 | void *buf = pci_alloc_consistent(to_pci_dev(dev), | 1359 | void *buf = pci_alloc_consistent(to_pci_dev(dev), |
| @@ -1724,7 +1730,7 @@ static void xhci_set_hc_event_deq(struct xhci_hcd *xhci) | |||
| 1724 | } | 1730 | } |
| 1725 | 1731 | ||
| 1726 | static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, | 1732 | static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, |
| 1727 | u32 __iomem *addr, u8 major_revision) | 1733 | __le32 __iomem *addr, u8 major_revision) |
| 1728 | { | 1734 | { |
| 1729 | u32 temp, port_offset, port_count; | 1735 | u32 temp, port_offset, port_count; |
| 1730 | int i; | 1736 | int i; |
| @@ -1789,7 +1795,7 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, | |||
| 1789 | */ | 1795 | */ |
| 1790 | static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) | 1796 | static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) |
| 1791 | { | 1797 | { |
| 1792 | u32 __iomem *addr; | 1798 | __le32 __iomem *addr; |
| 1793 | u32 offset; | 1799 | u32 offset; |
| 1794 | unsigned int num_ports; | 1800 | unsigned int num_ports; |
| 1795 | int i, port_index; | 1801 | int i, port_index; |
| @@ -2042,8 +2048,8 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | |||
| 2042 | /* set ring base address and size for each segment table entry */ | 2048 | /* set ring base address and size for each segment table entry */ |
| 2043 | for (val = 0, seg = xhci->event_ring->first_seg; val < ERST_NUM_SEGS; val++) { | 2049 | for (val = 0, seg = xhci->event_ring->first_seg; val < ERST_NUM_SEGS; val++) { |
| 2044 | struct xhci_erst_entry *entry = &xhci->erst.entries[val]; | 2050 | struct xhci_erst_entry *entry = &xhci->erst.entries[val]; |
| 2045 | entry->seg_addr = seg->dma; | 2051 | entry->seg_addr = cpu_to_le64(seg->dma); |
| 2046 | entry->seg_size = TRBS_PER_SEGMENT; | 2052 | entry->seg_size = cpu_to_le32(TRBS_PER_SEGMENT); |
| 2047 | entry->rsvd = 0; | 2053 | entry->rsvd = 0; |
| 2048 | seg = seg->next; | 2054 | seg = seg->next; |
| 2049 | } | 2055 | } |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index a10494c2f3c..cbc4d491e62 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | */ | 21 | */ |
| 22 | 22 | ||
| 23 | #include <linux/pci.h> | 23 | #include <linux/pci.h> |
| 24 | #include <linux/slab.h> | ||
| 24 | 25 | ||
| 25 | #include "xhci.h" | 26 | #include "xhci.h" |
| 26 | 27 | ||
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 7437386a9a5..237a765f8d1 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
| @@ -100,7 +100,7 @@ static bool last_trb_on_last_seg(struct xhci_hcd *xhci, struct xhci_ring *ring, | |||
| 100 | return (trb == &seg->trbs[TRBS_PER_SEGMENT]) && | 100 | return (trb == &seg->trbs[TRBS_PER_SEGMENT]) && |
| 101 | (seg->next == xhci->event_ring->first_seg); | 101 | (seg->next == xhci->event_ring->first_seg); |
| 102 | else | 102 | else |
| 103 | return trb->link.control & LINK_TOGGLE; | 103 | return le32_to_cpu(trb->link.control) & LINK_TOGGLE; |
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | /* Is this TRB a link TRB or was the last TRB the last TRB in this event ring | 106 | /* Is this TRB a link TRB or was the last TRB the last TRB in this event ring |
| @@ -113,13 +113,15 @@ static int last_trb(struct xhci_hcd *xhci, struct xhci_ring *ring, | |||
| 113 | if (ring == xhci->event_ring) | 113 | if (ring == xhci->event_ring) |
| 114 | return trb == &seg->trbs[TRBS_PER_SEGMENT]; | 114 | return trb == &seg->trbs[TRBS_PER_SEGMENT]; |
| 115 | else | 115 | else |
| 116 | return (trb->link.control & TRB_TYPE_BITMASK) == TRB_TYPE(TRB_LINK); | 116 | return (le32_to_cpu(trb->link.control) & TRB_TYPE_BITMASK) |
| 117 | == TRB_TYPE(TRB_LINK); | ||
| 117 | } | 118 | } |
| 118 | 119 | ||
| 119 | static int enqueue_is_link_trb(struct xhci_ring *ring) | 120 | static int enqueue_is_link_trb(struct xhci_ring *ring) |
| 120 | { | 121 | { |
| 121 | struct xhci_link_trb *link = &ring->enqueue->link; | 122 | struct xhci_link_trb *link = &ring->enqueue->link; |
| 122 | return ((link->control & TRB_TYPE_BITMASK) == TRB_TYPE(TRB_LINK)); | 123 | return ((le32_to_cpu(link->control) & TRB_TYPE_BITMASK) == |
| 124 | TRB_TYPE(TRB_LINK)); | ||
| 123 | } | 125 | } |
| 124 | 126 | ||
| 125 | /* Updates trb to point to the next TRB in the ring, and updates seg if the next | 127 | /* Updates trb to point to the next TRB in the ring, and updates seg if the next |
| @@ -197,7 +199,7 @@ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, | |||
| 197 | union xhci_trb *next; | 199 | union xhci_trb *next; |
| 198 | unsigned long long addr; | 200 | unsigned long long addr; |
| 199 | 201 | ||
| 200 | chain = ring->enqueue->generic.field[3] & TRB_CHAIN; | 202 | chain = le32_to_cpu(ring->enqueue->generic.field[3]) & TRB_CHAIN; |
| 201 | next = ++(ring->enqueue); | 203 | next = ++(ring->enqueue); |
| 202 | 204 | ||
| 203 | ring->enq_updates++; | 205 | ring->enq_updates++; |
| @@ -223,12 +225,14 @@ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, | |||
| 223 | * (which may mean the chain bit is cleared). | 225 | * (which may mean the chain bit is cleared). |
| 224 | */ | 226 | */ |
| 225 | if (!xhci_link_trb_quirk(xhci)) { | 227 | if (!xhci_link_trb_quirk(xhci)) { |
| 226 | next->link.control &= ~TRB_CHAIN; | 228 | next->link.control &= |
| 227 | next->link.control |= chain; | 229 | cpu_to_le32(~TRB_CHAIN); |
| 230 | next->link.control |= | ||
| 231 | cpu_to_le32(chain); | ||
| 228 | } | 232 | } |
| 229 | /* Give this link TRB to the hardware */ | 233 | /* Give this link TRB to the hardware */ |
| 230 | wmb(); | 234 | wmb(); |
| 231 | next->link.control ^= TRB_CYCLE; | 235 | next->link.control ^= cpu_to_le32(TRB_CYCLE); |
| 232 | } | 236 | } |
| 233 | /* Toggle the cycle bit after the last ring segment. */ | 237 | /* Toggle the cycle bit after the last ring segment. */ |
| 234 | if (last_trb_on_last_seg(xhci, ring, ring->enq_seg, next)) { | 238 | if (last_trb_on_last_seg(xhci, ring, ring->enq_seg, next)) { |
| @@ -319,7 +323,7 @@ void xhci_ring_ep_doorbell(struct xhci_hcd *xhci, | |||
| 319 | unsigned int ep_index, | 323 | unsigned int ep_index, |
| 320 | unsigned int stream_id) | 324 | unsigned int stream_id) |
| 321 | { | 325 | { |
| 322 | __u32 __iomem *db_addr = &xhci->dba->doorbell[slot_id]; | 326 | __le32 __iomem *db_addr = &xhci->dba->doorbell[slot_id]; |
| 323 | struct xhci_virt_ep *ep = &xhci->devs[slot_id]->eps[ep_index]; | 327 | struct xhci_virt_ep *ep = &xhci->devs[slot_id]->eps[ep_index]; |
| 324 | unsigned int ep_state = ep->ep_state; | 328 | unsigned int ep_state = ep->ep_state; |
| 325 | 329 | ||
| @@ -380,7 +384,7 @@ static struct xhci_segment *find_trb_seg( | |||
| 380 | while (cur_seg->trbs > trb || | 384 | while (cur_seg->trbs > trb || |
| 381 | &cur_seg->trbs[TRBS_PER_SEGMENT - 1] < trb) { | 385 | &cur_seg->trbs[TRBS_PER_SEGMENT - 1] < trb) { |
| 382 | generic_trb = &cur_seg->trbs[TRBS_PER_SEGMENT - 1].generic; | 386 | generic_trb = &cur_seg->trbs[TRBS_PER_SEGMENT - 1].generic; |
| 383 | if (generic_trb->field[3] & LINK_TOGGLE) | 387 | if (le32_to_cpu(generic_trb->field[3]) & LINK_TOGGLE) |
| 384 | *cycle_state ^= 0x1; | 388 | *cycle_state ^= 0x1; |
| 385 | cur_seg = cur_seg->next; | 389 | cur_seg = cur_seg->next; |
| 386 | if (cur_seg == start_seg) | 390 | if (cur_seg == start_seg) |
| @@ -447,6 +451,10 @@ static struct xhci_ring *xhci_urb_to_transfer_ring(struct xhci_hcd *xhci, | |||
| 447 | * any link TRBs with the toggle cycle bit set. | 451 | * any link TRBs with the toggle cycle bit set. |
| 448 | * - Finally we move the dequeue state one TRB further, toggling the cycle bit | 452 | * - Finally we move the dequeue state one TRB further, toggling the cycle bit |
| 449 | * if we've moved it past a link TRB with the toggle cycle bit set. | 453 | * if we've moved it past a link TRB with the toggle cycle bit set. |
| 454 | * | ||
| 455 | * Some of the uses of xhci_generic_trb are grotty, but if they're done | ||
| 456 | * with correct __le32 accesses they should work fine. Only users of this are | ||
| 457 | * in here. | ||
| 450 | */ | 458 | */ |
| 451 | void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, | 459 | void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, |
| 452 | unsigned int slot_id, unsigned int ep_index, | 460 | unsigned int slot_id, unsigned int ep_index, |
| @@ -480,7 +488,7 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, | |||
| 480 | /* Dig out the cycle state saved by the xHC during the stop ep cmd */ | 488 | /* Dig out the cycle state saved by the xHC during the stop ep cmd */ |
| 481 | xhci_dbg(xhci, "Finding endpoint context\n"); | 489 | xhci_dbg(xhci, "Finding endpoint context\n"); |
| 482 | ep_ctx = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index); | 490 | ep_ctx = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index); |
| 483 | state->new_cycle_state = 0x1 & ep_ctx->deq; | 491 | state->new_cycle_state = 0x1 & le64_to_cpu(ep_ctx->deq); |
| 484 | 492 | ||
| 485 | state->new_deq_ptr = cur_td->last_trb; | 493 | state->new_deq_ptr = cur_td->last_trb; |
| 486 | xhci_dbg(xhci, "Finding segment containing last TRB in TD.\n"); | 494 | xhci_dbg(xhci, "Finding segment containing last TRB in TD.\n"); |
| @@ -493,8 +501,8 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, | |||
| 493 | } | 501 | } |
| 494 | 502 | ||
| 495 | trb = &state->new_deq_ptr->generic; | 503 | trb = &state->new_deq_ptr->generic; |
| 496 | if ((trb->field[3] & TRB_TYPE_BITMASK) == TRB_TYPE(TRB_LINK) && | 504 | if ((le32_to_cpu(trb->field[3]) & TRB_TYPE_BITMASK) == |
| 497 | (trb->field[3] & LINK_TOGGLE)) | 505 | TRB_TYPE(TRB_LINK) && (le32_to_cpu(trb->field[3]) & LINK_TOGGLE)) |
| 498 | state->new_cycle_state ^= 0x1; | 506 | state->new_cycle_state ^= 0x1; |
| 499 | next_trb(xhci, ep_ring, &state->new_deq_seg, &state->new_deq_ptr); | 507 | next_trb(xhci, ep_ring, &state->new_deq_seg, &state->new_deq_ptr); |
| 500 | 508 | ||
| @@ -529,12 +537,12 @@ static void td_to_noop(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, | |||
| 529 | for (cur_seg = cur_td->start_seg, cur_trb = cur_td->first_trb; | 537 | for (cur_seg = cur_td->start_seg, cur_trb = cur_td->first_trb; |
| 530 | true; | 538 | true; |
| 531 | next_trb(xhci, ep_ring, &cur_seg, &cur_trb)) { | 539 | next_trb(xhci, ep_ring, &cur_seg, &cur_trb)) { |
| 532 | if ((cur_trb->generic.field[3] & TRB_TYPE_BITMASK) == | 540 | if ((le32_to_cpu(cur_trb->generic.field[3]) & TRB_TYPE_BITMASK) |
| 533 | TRB_TYPE(TRB_LINK)) { | 541 | == TRB_TYPE(TRB_LINK)) { |
| 534 | /* Unchain any chained Link TRBs, but | 542 | /* Unchain any chained Link TRBs, but |
| 535 | * leave the pointers intact. | 543 | * leave the pointers intact. |
| 536 | */ | 544 | */ |
| 537 | cur_trb->generic.field[3] &= ~TRB_CHAIN; | 545 | cur_trb->generic.field[3] &= cpu_to_le32(~TRB_CHAIN); |
| 538 | xhci_dbg(xhci, "Cancel (unchain) link TRB\n"); | 546 | xhci_dbg(xhci, "Cancel (unchain) link TRB\n"); |
| 539 | xhci_dbg(xhci, "Address = %p (0x%llx dma); " | 547 | xhci_dbg(xhci, "Address = %p (0x%llx dma); " |
| 540 | "in seg %p (0x%llx dma)\n", | 548 | "in seg %p (0x%llx dma)\n", |
| @@ -547,8 +555,9 @@ static void td_to_noop(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, | |||
| 547 | cur_trb->generic.field[1] = 0; | 555 | cur_trb->generic.field[1] = 0; |
| 548 | cur_trb->generic.field[2] = 0; | 556 | cur_trb->generic.field[2] = 0; |
| 549 | /* Preserve only the cycle bit of this TRB */ | 557 | /* Preserve only the cycle bit of this TRB */ |
| 550 | cur_trb->generic.field[3] &= TRB_CYCLE; | 558 | cur_trb->generic.field[3] &= cpu_to_le32(TRB_CYCLE); |
| 551 | cur_trb->generic.field[3] |= TRB_TYPE(TRB_TR_NOOP); | 559 | cur_trb->generic.field[3] |= cpu_to_le32( |
| 560 | TRB_TYPE(TRB_TR_NOOP)); | ||
| 552 | xhci_dbg(xhci, "Cancel TRB %p (0x%llx dma) " | 561 | xhci_dbg(xhci, "Cancel TRB %p (0x%llx dma) " |
| 553 | "in seg %p (0x%llx dma)\n", | 562 | "in seg %p (0x%llx dma)\n", |
| 554 | cur_trb, | 563 | cur_trb, |
| @@ -662,9 +671,9 @@ static void handle_stopped_endpoint(struct xhci_hcd *xhci, | |||
| 662 | struct xhci_dequeue_state deq_state; | 671 | struct xhci_dequeue_state deq_state; |
| 663 | 672 | ||
| 664 | if (unlikely(TRB_TO_SUSPEND_PORT( | 673 | if (unlikely(TRB_TO_SUSPEND_PORT( |
| 665 | xhci->cmd_ring->dequeue->generic.field[3]))) { | 674 | le32_to_cpu(xhci->cmd_ring->dequeue->generic.field[3])))) { |
| 666 | slot_id = TRB_TO_SLOT_ID( | 675 | slot_id = TRB_TO_SLOT_ID( |
| 667 | xhci->cmd_ring->dequeue->generic.field[3]); | 676 | le32_to_cpu(xhci->cmd_ring->dequeue->generic.field[3])); |
| 668 | virt_dev = xhci->devs[slot_id]; | 677 | virt_dev = xhci->devs[slot_id]; |
| 669 | if (virt_dev) | 678 | if (virt_dev) |
| 670 | handle_cmd_in_cmd_wait_list(xhci, virt_dev, | 679 | handle_cmd_in_cmd_wait_list(xhci, virt_dev, |
| @@ -677,8 +686,8 @@ static void handle_stopped_endpoint(struct xhci_hcd *xhci, | |||
| 677 | } | 686 | } |
| 678 | 687 | ||
| 679 | memset(&deq_state, 0, sizeof(deq_state)); | 688 | memset(&deq_state, 0, sizeof(deq_state)); |
| 680 | slot_id = TRB_TO_SLOT_ID(trb->generic.field[3]); | 689 | slot_id = TRB_TO_SLOT_ID(le32_to_cpu(trb->generic.field[3])); |
| 681 | ep_index = TRB_TO_EP_INDEX(trb->generic.field[3]); | 690 | ep_index = TRB_TO_EP_INDEX(le32_to_cpu(trb->generic.field[3])); |
| 682 | ep = &xhci->devs[slot_id]->eps[ep_index]; | 691 | ep = &xhci->devs[slot_id]->eps[ep_index]; |
| 683 | 692 | ||
| 684 | if (list_empty(&ep->cancelled_td_list)) { | 693 | if (list_empty(&ep->cancelled_td_list)) { |
| @@ -910,9 +919,9 @@ static void handle_set_deq_completion(struct xhci_hcd *xhci, | |||
| 910 | struct xhci_ep_ctx *ep_ctx; | 919 | struct xhci_ep_ctx *ep_ctx; |
| 911 | struct xhci_slot_ctx *slot_ctx; | 920 | struct xhci_slot_ctx *slot_ctx; |
| 912 | 921 | ||
| 913 | slot_id = TRB_TO_SLOT_ID(trb->generic.field[3]); | 922 | slot_id = TRB_TO_SLOT_ID(le32_to_cpu(trb->generic.field[3])); |
| 914 | ep_index = TRB_TO_EP_INDEX(trb->generic.field[3]); | 923 | ep_index = TRB_TO_EP_INDEX(le32_to_cpu(trb->generic.field[3])); |
| 915 | stream_id = TRB_TO_STREAM_ID(trb->generic.field[2]); | 924 | stream_id = TRB_TO_STREAM_ID(le32_to_cpu(trb->generic.field[2])); |
| 916 | dev = xhci->devs[slot_id]; | 925 | dev = xhci->devs[slot_id]; |
| 917 | 926 | ||
| 918 | ep_ring = xhci_stream_id_to_ring(dev, ep_index, stream_id); | 927 | ep_ring = xhci_stream_id_to_ring(dev, ep_index, stream_id); |
| @@ -928,11 +937,11 @@ static void handle_set_deq_completion(struct xhci_hcd *xhci, | |||
| 928 | ep_ctx = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index); | 937 | ep_ctx = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index); |
| 929 | slot_ctx = xhci_get_slot_ctx(xhci, dev->out_ctx); | 938 | slot_ctx = xhci_get_slot_ctx(xhci, dev->out_ctx); |
| 930 | 939 | ||
| 931 | if (GET_COMP_CODE(event->status) != COMP_SUCCESS) { | 940 | if (GET_COMP_CODE(le32_to_cpu(event->status)) != COMP_SUCCESS) { |
| 932 | unsigned int ep_state; | 941 | unsigned int ep_state; |
| 933 | unsigned int slot_state; | 942 | unsigned int slot_state; |
| 934 | 943 | ||
| 935 | switch (GET_COMP_CODE(event->status)) { | 944 | switch (GET_COMP_CODE(le32_to_cpu(event->status))) { |
| 936 | case COMP_TRB_ERR: | 945 | case COMP_TRB_ERR: |
| 937 | xhci_warn(xhci, "WARN Set TR Deq Ptr cmd invalid because " | 946 | xhci_warn(xhci, "WARN Set TR Deq Ptr cmd invalid because " |
| 938 | "of stream ID configuration\n"); | 947 | "of stream ID configuration\n"); |
| @@ -940,9 +949,9 @@ static void handle_set_deq_completion(struct xhci_hcd *xhci, | |||
| 940 | case COMP_CTX_STATE: | 949 | case COMP_CTX_STATE: |
| 941 | xhci_warn(xhci, "WARN Set TR Deq Ptr cmd failed due " | 950 | xhci_warn(xhci, "WARN Set TR Deq Ptr cmd failed due " |
| 942 | "to incorrect slot or ep state.\n"); | 951 | "to incorrect slot or ep state.\n"); |
| 943 | ep_state = ep_ctx->ep_info; | 952 | ep_state = le32_to_cpu(ep_ctx->ep_info); |
| 944 | ep_state &= EP_STATE_MASK; | 953 | ep_state &= EP_STATE_MASK; |
| 945 | slot_state = slot_ctx->dev_state; | 954 | slot_state = le32_to_cpu(slot_ctx->dev_state); |
| 946 | slot_state = GET_SLOT_STATE(slot_state); | 955 | slot_state = GET_SLOT_STATE(slot_state); |
| 947 | xhci_dbg(xhci, "Slot state = %u, EP state = %u\n", | 956 | xhci_dbg(xhci, "Slot state = %u, EP state = %u\n", |
| 948 | slot_state, ep_state); | 957 | slot_state, ep_state); |
| @@ -954,7 +963,7 @@ static void handle_set_deq_completion(struct xhci_hcd *xhci, | |||
| 954 | default: | 963 | default: |
| 955 | xhci_warn(xhci, "WARN Set TR Deq Ptr cmd with unknown " | 964 | xhci_warn(xhci, "WARN Set TR Deq Ptr cmd with unknown " |
| 956 | "completion code of %u.\n", | 965 | "completion code of %u.\n", |
| 957 | GET_COMP_CODE(event->status)); | 966 | GET_COMP_CODE(le32_to_cpu(event->status))); |
| 958 | break; | 967 | break; |
| 959 | } | 968 | } |
| 960 | /* OK what do we do now? The endpoint state is hosed, and we | 969 | /* OK what do we do now? The endpoint state is hosed, and we |
| @@ -965,10 +974,10 @@ static void handle_set_deq_completion(struct xhci_hcd *xhci, | |||
| 965 | */ | 974 | */ |
| 966 | } else { | 975 | } else { |
| 967 | xhci_dbg(xhci, "Successful Set TR Deq Ptr cmd, deq = @%08llx\n", | 976 | xhci_dbg(xhci, "Successful Set TR Deq Ptr cmd, deq = @%08llx\n", |
| 968 | ep_ctx->deq); | 977 | le64_to_cpu(ep_ctx->deq)); |
| 969 | if (xhci_trb_virt_to_dma(dev->eps[ep_index].queued_deq_seg, | 978 | if (xhci_trb_virt_to_dma(dev->eps[ep_index].queued_deq_seg, |
| 970 | dev->eps[ep_index].queued_deq_ptr) == | 979 | dev->eps[ep_index].queued_deq_ptr) == |
| 971 | (ep_ctx->deq & ~(EP_CTX_CYCLE_MASK))) { | 980 | (le64_to_cpu(ep_ctx->deq) & ~(EP_CTX_CYCLE_MASK))) { |
| 972 | /* Update the ring's dequeue segment and dequeue pointer | 981 | /* Update the ring's dequeue segment and dequeue pointer |
| 973 | * to reflect the new position. | 982 | * to reflect the new position. |
| 974 | */ | 983 | */ |
| @@ -997,13 +1006,13 @@ static void handle_reset_ep_completion(struct xhci_hcd *xhci, | |||
| 997 | int slot_id; | 1006 | int slot_id; |
| 998 | unsigned int ep_index; | 1007 | unsigned int ep_index; |
| 999 | 1008 | ||
| 1000 | slot_id = TRB_TO_SLOT_ID(trb->generic.field[3]); | 1009 | slot_id = TRB_TO_SLOT_ID(le32_to_cpu(trb->generic.field[3])); |
| 1001 | ep_index = TRB_TO_EP_INDEX(trb->generic.field[3]); | 1010 | ep_index = TRB_TO_EP_INDEX(le32_to_cpu(trb->generic.field[3])); |
| 1002 | /* This command will only fail if the endpoint wasn't halted, | 1011 | /* This command will only fail if the endpoint wasn't halted, |
| 1003 | * but we don't care. | 1012 | * but we don't care. |
| 1004 | */ | 1013 | */ |
| 1005 | xhci_dbg(xhci, "Ignoring reset ep completion code of %u\n", | 1014 | xhci_dbg(xhci, "Ignoring reset ep completion code of %u\n", |
| 1006 | (unsigned int) GET_COMP_CODE(event->status)); | 1015 | (unsigned int) GET_COMP_CODE(le32_to_cpu(event->status))); |
| 1007 | 1016 | ||
| 1008 | /* HW with the reset endpoint quirk needs to have a configure endpoint | 1017 | /* HW with the reset endpoint quirk needs to have a configure endpoint |
| 1009 | * command complete before the endpoint can be used. Queue that here | 1018 | * command complete before the endpoint can be used. Queue that here |
| @@ -1040,8 +1049,7 @@ static int handle_cmd_in_cmd_wait_list(struct xhci_hcd *xhci, | |||
| 1040 | if (xhci->cmd_ring->dequeue != command->command_trb) | 1049 | if (xhci->cmd_ring->dequeue != command->command_trb) |
| 1041 | return 0; | 1050 | return 0; |
| 1042 | 1051 | ||
| 1043 | command->status = | 1052 | command->status = GET_COMP_CODE(le32_to_cpu(event->status)); |
| 1044 | GET_COMP_CODE(event->status); | ||
| 1045 | list_del(&command->cmd_list); | 1053 | list_del(&command->cmd_list); |
| 1046 | if (command->completion) | 1054 | if (command->completion) |
| 1047 | complete(command->completion); | 1055 | complete(command->completion); |
| @@ -1053,7 +1061,7 @@ static int handle_cmd_in_cmd_wait_list(struct xhci_hcd *xhci, | |||
| 1053 | static void handle_cmd_completion(struct xhci_hcd *xhci, | 1061 | static void handle_cmd_completion(struct xhci_hcd *xhci, |
| 1054 | struct xhci_event_cmd *event) | 1062 | struct xhci_event_cmd *event) |
| 1055 | { | 1063 | { |
| 1056 | int slot_id = TRB_TO_SLOT_ID(event->flags); | 1064 | int slot_id = TRB_TO_SLOT_ID(le32_to_cpu(event->flags)); |
| 1057 | u64 cmd_dma; | 1065 | u64 cmd_dma; |
| 1058 | dma_addr_t cmd_dequeue_dma; | 1066 | dma_addr_t cmd_dequeue_dma; |
| 1059 | struct xhci_input_control_ctx *ctrl_ctx; | 1067 | struct xhci_input_control_ctx *ctrl_ctx; |
| @@ -1062,7 +1070,7 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, | |||
| 1062 | struct xhci_ring *ep_ring; | 1070 | struct xhci_ring *ep_ring; |
| 1063 | unsigned int ep_state; | 1071 | unsigned int ep_state; |
| 1064 | 1072 | ||
| 1065 | cmd_dma = event->cmd_trb; | 1073 | cmd_dma = le64_to_cpu(event->cmd_trb); |
| 1066 | cmd_dequeue_dma = xhci_trb_virt_to_dma(xhci->cmd_ring->deq_seg, | 1074 | cmd_dequeue_dma = xhci_trb_virt_to_dma(xhci->cmd_ring->deq_seg, |
| 1067 | xhci->cmd_ring->dequeue); | 1075 | xhci->cmd_ring->dequeue); |
| 1068 | /* Is the command ring deq ptr out of sync with the deq seg ptr? */ | 1076 | /* Is the command ring deq ptr out of sync with the deq seg ptr? */ |
| @@ -1075,9 +1083,10 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, | |||
| 1075 | xhci->error_bitmask |= 1 << 5; | 1083 | xhci->error_bitmask |= 1 << 5; |
| 1076 | return; | 1084 | return; |
| 1077 | } | 1085 | } |
| 1078 | switch (xhci->cmd_ring->dequeue->generic.field[3] & TRB_TYPE_BITMASK) { | 1086 | switch (le32_to_cpu(xhci->cmd_ring->dequeue->generic.field[3]) |
| 1087 | & TRB_TYPE_BITMASK) { | ||
| 1079 | case TRB_TYPE(TRB_ENABLE_SLOT): | 1088 | case TRB_TYPE(TRB_ENABLE_SLOT): |
| 1080 | if (GET_COMP_CODE(event->status) == COMP_SUCCESS) | 1089 | if (GET_COMP_CODE(le32_to_cpu(event->status)) == COMP_SUCCESS) |
| 1081 | xhci->slot_id = slot_id; | 1090 | xhci->slot_id = slot_id; |
| 1082 | else | 1091 | else |
| 1083 | xhci->slot_id = 0; | 1092 | xhci->slot_id = 0; |
| @@ -1102,7 +1111,7 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, | |||
| 1102 | ctrl_ctx = xhci_get_input_control_ctx(xhci, | 1111 | ctrl_ctx = xhci_get_input_control_ctx(xhci, |
| 1103 | virt_dev->in_ctx); | 1112 | virt_dev->in_ctx); |
| 1104 | /* Input ctx add_flags are the endpoint index plus one */ | 1113 | /* Input ctx add_flags are the endpoint index plus one */ |
| 1105 | ep_index = xhci_last_valid_endpoint(ctrl_ctx->add_flags) - 1; | 1114 | ep_index = xhci_last_valid_endpoint(le32_to_cpu(ctrl_ctx->add_flags)) - 1; |
| 1106 | /* A usb_set_interface() call directly after clearing a halted | 1115 | /* A usb_set_interface() call directly after clearing a halted |
| 1107 | * condition may race on this quirky hardware. Not worth | 1116 | * condition may race on this quirky hardware. Not worth |
| 1108 | * worrying about, since this is prototype hardware. Not sure | 1117 | * worrying about, since this is prototype hardware. Not sure |
| @@ -1111,8 +1120,8 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, | |||
| 1111 | */ | 1120 | */ |
| 1112 | if (xhci->quirks & XHCI_RESET_EP_QUIRK && | 1121 | if (xhci->quirks & XHCI_RESET_EP_QUIRK && |
| 1113 | ep_index != (unsigned int) -1 && | 1122 | ep_index != (unsigned int) -1 && |
| 1114 | ctrl_ctx->add_flags - SLOT_FLAG == | 1123 | le32_to_cpu(ctrl_ctx->add_flags) - SLOT_FLAG == |
| 1115 | ctrl_ctx->drop_flags) { | 1124 | le32_to_cpu(ctrl_ctx->drop_flags)) { |
| 1116 | ep_ring = xhci->devs[slot_id]->eps[ep_index].ring; | 1125 | ep_ring = xhci->devs[slot_id]->eps[ep_index].ring; |
| 1117 | ep_state = xhci->devs[slot_id]->eps[ep_index].ep_state; | 1126 | ep_state = xhci->devs[slot_id]->eps[ep_index].ep_state; |
| 1118 | if (!(ep_state & EP_HALTED)) | 1127 | if (!(ep_state & EP_HALTED)) |
| @@ -1129,18 +1138,18 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, | |||
| 1129 | bandwidth_change: | 1138 | bandwidth_change: |
| 1130 | xhci_dbg(xhci, "Completed config ep cmd\n"); | 1139 | xhci_dbg(xhci, "Completed config ep cmd\n"); |
| 1131 | xhci->devs[slot_id]->cmd_status = | 1140 | xhci->devs[slot_id]->cmd_status = |
| 1132 | GET_COMP_CODE(event->status); | 1141 | GET_COMP_CODE(le32_to_cpu(event->status)); |
| 1133 | complete(&xhci->devs[slot_id]->cmd_completion); | 1142 | complete(&xhci->devs[slot_id]->cmd_completion); |
| 1134 | break; | 1143 | break; |
| 1135 | case TRB_TYPE(TRB_EVAL_CONTEXT): | 1144 | case TRB_TYPE(TRB_EVAL_CONTEXT): |
| 1136 | virt_dev = xhci->devs[slot_id]; | 1145 | virt_dev = xhci->devs[slot_id]; |
| 1137 | if (handle_cmd_in_cmd_wait_list(xhci, virt_dev, event)) | 1146 | if (handle_cmd_in_cmd_wait_list(xhci, virt_dev, event)) |
| 1138 | break; | 1147 | break; |
| 1139 | xhci->devs[slot_id]->cmd_status = GET_COMP_CODE(event->status); | 1148 | xhci->devs[slot_id]->cmd_status = GET_COMP_CODE(le32_to_cpu(event->status)); |
| 1140 | complete(&xhci->devs[slot_id]->cmd_completion); | 1149 | complete(&xhci->devs[slot_id]->cmd_completion); |
| 1141 | break; | 1150 | break; |
| 1142 | case TRB_TYPE(TRB_ADDR_DEV): | 1151 | case TRB_TYPE(TRB_ADDR_DEV): |
| 1143 | xhci->devs[slot_id]->cmd_status = GET_COMP_CODE(event->status); | 1152 | xhci->devs[slot_id]->cmd_status = GET_COMP_CODE(le32_to_cpu(event->status)); |
| 1144 | complete(&xhci->addr_dev); | 1153 | complete(&xhci->addr_dev); |
| 1145 | break; | 1154 | break; |
| 1146 | case TRB_TYPE(TRB_STOP_RING): | 1155 | case TRB_TYPE(TRB_STOP_RING): |
| @@ -1157,7 +1166,7 @@ bandwidth_change: | |||
| 1157 | case TRB_TYPE(TRB_RESET_DEV): | 1166 | case TRB_TYPE(TRB_RESET_DEV): |
| 1158 | xhci_dbg(xhci, "Completed reset device command.\n"); | 1167 | xhci_dbg(xhci, "Completed reset device command.\n"); |
| 1159 | slot_id = TRB_TO_SLOT_ID( | 1168 | slot_id = TRB_TO_SLOT_ID( |
| 1160 | xhci->cmd_ring->dequeue->generic.field[3]); | 1169 | le32_to_cpu(xhci->cmd_ring->dequeue->generic.field[3])); |
| 1161 | virt_dev = xhci->devs[slot_id]; | 1170 | virt_dev = xhci->devs[slot_id]; |
| 1162 | if (virt_dev) | 1171 | if (virt_dev) |
| 1163 | handle_cmd_in_cmd_wait_list(xhci, virt_dev, event); | 1172 | handle_cmd_in_cmd_wait_list(xhci, virt_dev, event); |
| @@ -1171,8 +1180,8 @@ bandwidth_change: | |||
| 1171 | break; | 1180 | break; |
| 1172 | } | 1181 | } |
| 1173 | xhci_dbg(xhci, "NEC firmware version %2x.%02x\n", | 1182 | xhci_dbg(xhci, "NEC firmware version %2x.%02x\n", |
| 1174 | NEC_FW_MAJOR(event->status), | 1183 | NEC_FW_MAJOR(le32_to_cpu(event->status)), |
| 1175 | NEC_FW_MINOR(event->status)); | 1184 | NEC_FW_MINOR(le32_to_cpu(event->status))); |
| 1176 | break; | 1185 | break; |
| 1177 | default: | 1186 | default: |
| 1178 | /* Skip over unknown commands on the event ring */ | 1187 | /* Skip over unknown commands on the event ring */ |
| @@ -1187,7 +1196,7 @@ static void handle_vendor_event(struct xhci_hcd *xhci, | |||
| 1187 | { | 1196 | { |
| 1188 | u32 trb_type; | 1197 | u32 trb_type; |
| 1189 | 1198 | ||
| 1190 | trb_type = TRB_FIELD_TO_TYPE(event->generic.field[3]); | 1199 | trb_type = TRB_FIELD_TO_TYPE(le32_to_cpu(event->generic.field[3])); |
| 1191 | xhci_dbg(xhci, "Vendor specific event TRB type = %u\n", trb_type); | 1200 | xhci_dbg(xhci, "Vendor specific event TRB type = %u\n", trb_type); |
| 1192 | if (trb_type == TRB_NEC_CMD_COMP && (xhci->quirks & XHCI_NEC_HOST)) | 1201 | if (trb_type == TRB_NEC_CMD_COMP && (xhci->quirks & XHCI_NEC_HOST)) |
| 1193 | handle_cmd_completion(xhci, &event->event_cmd); | 1202 | handle_cmd_completion(xhci, &event->event_cmd); |
| @@ -1241,15 +1250,15 @@ static void handle_port_status(struct xhci_hcd *xhci, | |||
| 1241 | unsigned int faked_port_index; | 1250 | unsigned int faked_port_index; |
| 1242 | u8 major_revision; | 1251 | u8 major_revision; |
| 1243 | struct xhci_bus_state *bus_state; | 1252 | struct xhci_bus_state *bus_state; |
| 1244 | u32 __iomem **port_array; | 1253 | __le32 __iomem **port_array; |
| 1245 | bool bogus_port_status = false; | 1254 | bool bogus_port_status = false; |
| 1246 | 1255 | ||
| 1247 | /* Port status change events always have a successful completion code */ | 1256 | /* Port status change events always have a successful completion code */ |
| 1248 | if (GET_COMP_CODE(event->generic.field[2]) != COMP_SUCCESS) { | 1257 | if (GET_COMP_CODE(le32_to_cpu(event->generic.field[2])) != COMP_SUCCESS) { |
| 1249 | xhci_warn(xhci, "WARN: xHC returned failed port status event\n"); | 1258 | xhci_warn(xhci, "WARN: xHC returned failed port status event\n"); |
| 1250 | xhci->error_bitmask |= 1 << 8; | 1259 | xhci->error_bitmask |= 1 << 8; |
| 1251 | } | 1260 | } |
| 1252 | port_id = GET_PORT_ID(event->generic.field[0]); | 1261 | port_id = GET_PORT_ID(le32_to_cpu(event->generic.field[0])); |
| 1253 | xhci_dbg(xhci, "Port Status Change Event for port %d\n", port_id); | 1262 | xhci_dbg(xhci, "Port Status Change Event for port %d\n", port_id); |
| 1254 | 1263 | ||
| 1255 | max_ports = HCS_MAX_PORTS(xhci->hcs_params1); | 1264 | max_ports = HCS_MAX_PORTS(xhci->hcs_params1); |
| @@ -1456,7 +1465,7 @@ static int xhci_requires_manual_halt_cleanup(struct xhci_hcd *xhci, | |||
| 1456 | * endpoint anyway. Check if a babble halted the | 1465 | * endpoint anyway. Check if a babble halted the |
| 1457 | * endpoint. | 1466 | * endpoint. |
| 1458 | */ | 1467 | */ |
| 1459 | if ((ep_ctx->ep_info & EP_STATE_MASK) == EP_STATE_HALTED) | 1468 | if ((le32_to_cpu(ep_ctx->ep_info) & EP_STATE_MASK) == EP_STATE_HALTED) |
| 1460 | return 1; | 1469 | return 1; |
| 1461 | 1470 | ||
| 1462 | return 0; | 1471 | return 0; |
| @@ -1494,12 +1503,12 @@ static int finish_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1494 | struct urb_priv *urb_priv; | 1503 | struct urb_priv *urb_priv; |
| 1495 | u32 trb_comp_code; | 1504 | u32 trb_comp_code; |
| 1496 | 1505 | ||
| 1497 | slot_id = TRB_TO_SLOT_ID(event->flags); | 1506 | slot_id = TRB_TO_SLOT_ID(le32_to_cpu(event->flags)); |
| 1498 | xdev = xhci->devs[slot_id]; | 1507 | xdev = xhci->devs[slot_id]; |
| 1499 | ep_index = TRB_TO_EP_ID(event->flags) - 1; | 1508 | ep_index = TRB_TO_EP_ID(le32_to_cpu(event->flags)) - 1; |
| 1500 | ep_ring = xhci_dma_to_transfer_ring(ep, event->buffer); | 1509 | ep_ring = xhci_dma_to_transfer_ring(ep, le64_to_cpu(event->buffer)); |
| 1501 | ep_ctx = xhci_get_ep_ctx(xhci, xdev->out_ctx, ep_index); | 1510 | ep_ctx = xhci_get_ep_ctx(xhci, xdev->out_ctx, ep_index); |
| 1502 | trb_comp_code = GET_COMP_CODE(event->transfer_len); | 1511 | trb_comp_code = GET_COMP_CODE(le32_to_cpu(event->transfer_len)); |
| 1503 | 1512 | ||
| 1504 | if (skip) | 1513 | if (skip) |
| 1505 | goto td_cleanup; | 1514 | goto td_cleanup; |
| @@ -1602,12 +1611,12 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1602 | struct xhci_ep_ctx *ep_ctx; | 1611 | struct xhci_ep_ctx *ep_ctx; |
| 1603 | u32 trb_comp_code; | 1612 | u32 trb_comp_code; |
| 1604 | 1613 | ||
| 1605 | slot_id = TRB_TO_SLOT_ID(event->flags); | 1614 | slot_id = TRB_TO_SLOT_ID(le32_to_cpu(event->flags)); |
| 1606 | xdev = xhci->devs[slot_id]; | 1615 | xdev = xhci->devs[slot_id]; |
| 1607 | ep_index = TRB_TO_EP_ID(event->flags) - 1; | 1616 | ep_index = TRB_TO_EP_ID(le32_to_cpu(event->flags)) - 1; |
| 1608 | ep_ring = xhci_dma_to_transfer_ring(ep, event->buffer); | 1617 | ep_ring = xhci_dma_to_transfer_ring(ep, le64_to_cpu(event->buffer)); |
| 1609 | ep_ctx = xhci_get_ep_ctx(xhci, xdev->out_ctx, ep_index); | 1618 | ep_ctx = xhci_get_ep_ctx(xhci, xdev->out_ctx, ep_index); |
| 1610 | trb_comp_code = GET_COMP_CODE(event->transfer_len); | 1619 | trb_comp_code = GET_COMP_CODE(le32_to_cpu(event->transfer_len)); |
| 1611 | 1620 | ||
| 1612 | xhci_debug_trb(xhci, xhci->event_ring->dequeue); | 1621 | xhci_debug_trb(xhci, xhci->event_ring->dequeue); |
| 1613 | switch (trb_comp_code) { | 1622 | switch (trb_comp_code) { |
| @@ -1632,6 +1641,9 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1632 | else | 1641 | else |
| 1633 | *status = 0; | 1642 | *status = 0; |
| 1634 | break; | 1643 | break; |
| 1644 | case COMP_STOP_INVAL: | ||
| 1645 | case COMP_STOP: | ||
| 1646 | return finish_td(xhci, td, event_trb, event, ep, status, false); | ||
| 1635 | default: | 1647 | default: |
| 1636 | if (!xhci_requires_manual_halt_cleanup(xhci, | 1648 | if (!xhci_requires_manual_halt_cleanup(xhci, |
| 1637 | ep_ctx, trb_comp_code)) | 1649 | ep_ctx, trb_comp_code)) |
| @@ -1646,7 +1658,7 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1646 | event_trb != td->last_trb) | 1658 | event_trb != td->last_trb) |
| 1647 | td->urb->actual_length = | 1659 | td->urb->actual_length = |
| 1648 | td->urb->transfer_buffer_length | 1660 | td->urb->transfer_buffer_length |
| 1649 | - TRB_LEN(event->transfer_len); | 1661 | - TRB_LEN(le32_to_cpu(event->transfer_len)); |
| 1650 | else | 1662 | else |
| 1651 | td->urb->actual_length = 0; | 1663 | td->urb->actual_length = 0; |
| 1652 | 1664 | ||
| @@ -1676,15 +1688,12 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1676 | } | 1688 | } |
| 1677 | } else { | 1689 | } else { |
| 1678 | /* Maybe the event was for the data stage? */ | 1690 | /* Maybe the event was for the data stage? */ |
| 1679 | if (trb_comp_code != COMP_STOP_INVAL) { | 1691 | td->urb->actual_length = |
| 1680 | /* We didn't stop on a link TRB in the middle */ | 1692 | td->urb->transfer_buffer_length - |
| 1681 | td->urb->actual_length = | 1693 | TRB_LEN(le32_to_cpu(event->transfer_len)); |
| 1682 | td->urb->transfer_buffer_length - | 1694 | xhci_dbg(xhci, "Waiting for status " |
| 1683 | TRB_LEN(event->transfer_len); | 1695 | "stage event\n"); |
| 1684 | xhci_dbg(xhci, "Waiting for status " | 1696 | return 0; |
| 1685 | "stage event\n"); | ||
| 1686 | return 0; | ||
| 1687 | } | ||
| 1688 | } | 1697 | } |
| 1689 | } | 1698 | } |
| 1690 | 1699 | ||
| @@ -1708,8 +1717,8 @@ static int process_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1708 | u32 trb_comp_code; | 1717 | u32 trb_comp_code; |
| 1709 | bool skip_td = false; | 1718 | bool skip_td = false; |
| 1710 | 1719 | ||
| 1711 | ep_ring = xhci_dma_to_transfer_ring(ep, event->buffer); | 1720 | ep_ring = xhci_dma_to_transfer_ring(ep, le64_to_cpu(event->buffer)); |
| 1712 | trb_comp_code = GET_COMP_CODE(event->transfer_len); | 1721 | trb_comp_code = GET_COMP_CODE(le32_to_cpu(event->transfer_len)); |
| 1713 | urb_priv = td->urb->hcpriv; | 1722 | urb_priv = td->urb->hcpriv; |
| 1714 | idx = urb_priv->td_cnt; | 1723 | idx = urb_priv->td_cnt; |
| 1715 | frame = &td->urb->iso_frame_desc[idx]; | 1724 | frame = &td->urb->iso_frame_desc[idx]; |
| @@ -1752,15 +1761,14 @@ static int process_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1752 | for (cur_trb = ep_ring->dequeue, | 1761 | for (cur_trb = ep_ring->dequeue, |
| 1753 | cur_seg = ep_ring->deq_seg; cur_trb != event_trb; | 1762 | cur_seg = ep_ring->deq_seg; cur_trb != event_trb; |
| 1754 | next_trb(xhci, ep_ring, &cur_seg, &cur_trb)) { | 1763 | next_trb(xhci, ep_ring, &cur_seg, &cur_trb)) { |
| 1755 | if ((cur_trb->generic.field[3] & | 1764 | if ((le32_to_cpu(cur_trb->generic.field[3]) & |
| 1756 | TRB_TYPE_BITMASK) != TRB_TYPE(TRB_TR_NOOP) && | 1765 | TRB_TYPE_BITMASK) != TRB_TYPE(TRB_TR_NOOP) && |
| 1757 | (cur_trb->generic.field[3] & | 1766 | (le32_to_cpu(cur_trb->generic.field[3]) & |
| 1758 | TRB_TYPE_BITMASK) != TRB_TYPE(TRB_LINK)) | 1767 | TRB_TYPE_BITMASK) != TRB_TYPE(TRB_LINK)) |
| 1759 | len += | 1768 | len += TRB_LEN(le32_to_cpu(cur_trb->generic.field[2])); |
| 1760 | TRB_LEN(cur_trb->generic.field[2]); | ||
| 1761 | } | 1769 | } |
| 1762 | len += TRB_LEN(cur_trb->generic.field[2]) - | 1770 | len += TRB_LEN(le32_to_cpu(cur_trb->generic.field[2])) - |
| 1763 | TRB_LEN(event->transfer_len); | 1771 | TRB_LEN(le32_to_cpu(event->transfer_len)); |
| 1764 | 1772 | ||
| 1765 | if (trb_comp_code != COMP_STOP_INVAL) { | 1773 | if (trb_comp_code != COMP_STOP_INVAL) { |
| 1766 | frame->actual_length = len; | 1774 | frame->actual_length = len; |
| @@ -1815,8 +1823,8 @@ static int process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1815 | struct xhci_segment *cur_seg; | 1823 | struct xhci_segment *cur_seg; |
| 1816 | u32 trb_comp_code; | 1824 | u32 trb_comp_code; |
| 1817 | 1825 | ||
| 1818 | ep_ring = xhci_dma_to_transfer_ring(ep, event->buffer); | 1826 | ep_ring = xhci_dma_to_transfer_ring(ep, le64_to_cpu(event->buffer)); |
| 1819 | trb_comp_code = GET_COMP_CODE(event->transfer_len); | 1827 | trb_comp_code = GET_COMP_CODE(le32_to_cpu(event->transfer_len)); |
| 1820 | 1828 | ||
| 1821 | switch (trb_comp_code) { | 1829 | switch (trb_comp_code) { |
| 1822 | case COMP_SUCCESS: | 1830 | case COMP_SUCCESS: |
| @@ -1852,18 +1860,18 @@ static int process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1852 | "%d bytes untransferred\n", | 1860 | "%d bytes untransferred\n", |
| 1853 | td->urb->ep->desc.bEndpointAddress, | 1861 | td->urb->ep->desc.bEndpointAddress, |
| 1854 | td->urb->transfer_buffer_length, | 1862 | td->urb->transfer_buffer_length, |
| 1855 | TRB_LEN(event->transfer_len)); | 1863 | TRB_LEN(le32_to_cpu(event->transfer_len))); |
| 1856 | /* Fast path - was this the last TRB in the TD for this URB? */ | 1864 | /* Fast path - was this the last TRB in the TD for this URB? */ |
| 1857 | if (event_trb == td->last_trb) { | 1865 | if (event_trb == td->last_trb) { |
| 1858 | if (TRB_LEN(event->transfer_len) != 0) { | 1866 | if (TRB_LEN(le32_to_cpu(event->transfer_len)) != 0) { |
| 1859 | td->urb->actual_length = | 1867 | td->urb->actual_length = |
| 1860 | td->urb->transfer_buffer_length - | 1868 | td->urb->transfer_buffer_length - |
| 1861 | TRB_LEN(event->transfer_len); | 1869 | TRB_LEN(le32_to_cpu(event->transfer_len)); |
| 1862 | if (td->urb->transfer_buffer_length < | 1870 | if (td->urb->transfer_buffer_length < |
| 1863 | td->urb->actual_length) { | 1871 | td->urb->actual_length) { |
| 1864 | xhci_warn(xhci, "HC gave bad length " | 1872 | xhci_warn(xhci, "HC gave bad length " |
| 1865 | "of %d bytes left\n", | 1873 | "of %d bytes left\n", |
| 1866 | TRB_LEN(event->transfer_len)); | 1874 | TRB_LEN(le32_to_cpu(event->transfer_len))); |
| 1867 | td->urb->actual_length = 0; | 1875 | td->urb->actual_length = 0; |
| 1868 | if (td->urb->transfer_flags & URB_SHORT_NOT_OK) | 1876 | if (td->urb->transfer_flags & URB_SHORT_NOT_OK) |
| 1869 | *status = -EREMOTEIO; | 1877 | *status = -EREMOTEIO; |
| @@ -1894,20 +1902,20 @@ static int process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1894 | for (cur_trb = ep_ring->dequeue, cur_seg = ep_ring->deq_seg; | 1902 | for (cur_trb = ep_ring->dequeue, cur_seg = ep_ring->deq_seg; |
| 1895 | cur_trb != event_trb; | 1903 | cur_trb != event_trb; |
| 1896 | next_trb(xhci, ep_ring, &cur_seg, &cur_trb)) { | 1904 | next_trb(xhci, ep_ring, &cur_seg, &cur_trb)) { |
| 1897 | if ((cur_trb->generic.field[3] & | 1905 | if ((le32_to_cpu(cur_trb->generic.field[3]) & |
| 1898 | TRB_TYPE_BITMASK) != TRB_TYPE(TRB_TR_NOOP) && | 1906 | TRB_TYPE_BITMASK) != TRB_TYPE(TRB_TR_NOOP) && |
| 1899 | (cur_trb->generic.field[3] & | 1907 | (le32_to_cpu(cur_trb->generic.field[3]) & |
| 1900 | TRB_TYPE_BITMASK) != TRB_TYPE(TRB_LINK)) | 1908 | TRB_TYPE_BITMASK) != TRB_TYPE(TRB_LINK)) |
| 1901 | td->urb->actual_length += | 1909 | td->urb->actual_length += |
| 1902 | TRB_LEN(cur_trb->generic.field[2]); | 1910 | TRB_LEN(le32_to_cpu(cur_trb->generic.field[2])); |
| 1903 | } | 1911 | } |
| 1904 | /* If the ring didn't stop on a Link or No-op TRB, add | 1912 | /* If the ring didn't stop on a Link or No-op TRB, add |
| 1905 | * in the actual bytes transferred from the Normal TRB | 1913 | * in the actual bytes transferred from the Normal TRB |
| 1906 | */ | 1914 | */ |
| 1907 | if (trb_comp_code != COMP_STOP_INVAL) | 1915 | if (trb_comp_code != COMP_STOP_INVAL) |
| 1908 | td->urb->actual_length += | 1916 | td->urb->actual_length += |
| 1909 | TRB_LEN(cur_trb->generic.field[2]) - | 1917 | TRB_LEN(le32_to_cpu(cur_trb->generic.field[2])) - |
| 1910 | TRB_LEN(event->transfer_len); | 1918 | TRB_LEN(le32_to_cpu(event->transfer_len)); |
| 1911 | } | 1919 | } |
| 1912 | 1920 | ||
| 1913 | return finish_td(xhci, td, event_trb, event, ep, status, false); | 1921 | return finish_td(xhci, td, event_trb, event, ep, status, false); |
| @@ -1937,7 +1945,7 @@ static int handle_tx_event(struct xhci_hcd *xhci, | |||
| 1937 | u32 trb_comp_code; | 1945 | u32 trb_comp_code; |
| 1938 | int ret = 0; | 1946 | int ret = 0; |
| 1939 | 1947 | ||
| 1940 | slot_id = TRB_TO_SLOT_ID(event->flags); | 1948 | slot_id = TRB_TO_SLOT_ID(le32_to_cpu(event->flags)); |
| 1941 | xdev = xhci->devs[slot_id]; | 1949 | xdev = xhci->devs[slot_id]; |
| 1942 | if (!xdev) { | 1950 | if (!xdev) { |
| 1943 | xhci_err(xhci, "ERROR Transfer event pointed to bad slot\n"); | 1951 | xhci_err(xhci, "ERROR Transfer event pointed to bad slot\n"); |
| @@ -1945,20 +1953,21 @@ static int handle_tx_event(struct xhci_hcd *xhci, | |||
| 1945 | } | 1953 | } |
| 1946 | 1954 | ||
| 1947 | /* Endpoint ID is 1 based, our index is zero based */ | 1955 | /* Endpoint ID is 1 based, our index is zero based */ |
| 1948 | ep_index = TRB_TO_EP_ID(event->flags) - 1; | 1956 | ep_index = TRB_TO_EP_ID(le32_to_cpu(event->flags)) - 1; |
| 1949 | xhci_dbg(xhci, "%s - ep index = %d\n", __func__, ep_index); | 1957 | xhci_dbg(xhci, "%s - ep index = %d\n", __func__, ep_index); |
| 1950 | ep = &xdev->eps[ep_index]; | 1958 | ep = &xdev->eps[ep_index]; |
| 1951 | ep_ring = xhci_dma_to_transfer_ring(ep, event->buffer); | 1959 | ep_ring = xhci_dma_to_transfer_ring(ep, le64_to_cpu(event->buffer)); |
| 1952 | ep_ctx = xhci_get_ep_ctx(xhci, xdev->out_ctx, ep_index); | 1960 | ep_ctx = xhci_get_ep_ctx(xhci, xdev->out_ctx, ep_index); |
| 1953 | if (!ep_ring || | 1961 | if (!ep_ring || |
| 1954 | (ep_ctx->ep_info & EP_STATE_MASK) == EP_STATE_DISABLED) { | 1962 | (le32_to_cpu(ep_ctx->ep_info) & EP_STATE_MASK) == |
| 1963 | EP_STATE_DISABLED) { | ||
| 1955 | xhci_err(xhci, "ERROR Transfer event for disabled endpoint " | 1964 | xhci_err(xhci, "ERROR Transfer event for disabled endpoint " |
| 1956 | "or incorrect stream ring\n"); | 1965 | "or incorrect stream ring\n"); |
| 1957 | return -ENODEV; | 1966 | return -ENODEV; |
| 1958 | } | 1967 | } |
| 1959 | 1968 | ||
| 1960 | event_dma = event->buffer; | 1969 | event_dma = le64_to_cpu(event->buffer); |
| 1961 | trb_comp_code = GET_COMP_CODE(event->transfer_len); | 1970 | trb_comp_code = GET_COMP_CODE(le32_to_cpu(event->transfer_len)); |
| 1962 | /* Look for common error cases */ | 1971 | /* Look for common error cases */ |
| 1963 | switch (trb_comp_code) { | 1972 | switch (trb_comp_code) { |
| 1964 | /* Skip codes that require special handling depending on | 1973 | /* Skip codes that require special handling depending on |
| @@ -2011,14 +2020,16 @@ static int handle_tx_event(struct xhci_hcd *xhci, | |||
| 2011 | if (!list_empty(&ep_ring->td_list)) | 2020 | if (!list_empty(&ep_ring->td_list)) |
| 2012 | xhci_dbg(xhci, "Underrun Event for slot %d ep %d " | 2021 | xhci_dbg(xhci, "Underrun Event for slot %d ep %d " |
| 2013 | "still with TDs queued?\n", | 2022 | "still with TDs queued?\n", |
| 2014 | TRB_TO_SLOT_ID(event->flags), ep_index); | 2023 | TRB_TO_SLOT_ID(le32_to_cpu(event->flags)), |
| 2024 | ep_index); | ||
| 2015 | goto cleanup; | 2025 | goto cleanup; |
| 2016 | case COMP_OVERRUN: | 2026 | case COMP_OVERRUN: |
| 2017 | xhci_dbg(xhci, "overrun event on endpoint\n"); | 2027 | xhci_dbg(xhci, "overrun event on endpoint\n"); |
| 2018 | if (!list_empty(&ep_ring->td_list)) | 2028 | if (!list_empty(&ep_ring->td_list)) |
| 2019 | xhci_dbg(xhci, "Overrun Event for slot %d ep %d " | 2029 | xhci_dbg(xhci, "Overrun Event for slot %d ep %d " |
| 2020 | "still with TDs queued?\n", | 2030 | "still with TDs queued?\n", |
| 2021 | TRB_TO_SLOT_ID(event->flags), ep_index); | 2031 | TRB_TO_SLOT_ID(le32_to_cpu(event->flags)), |
| 2032 | ep_index); | ||
| 2022 | goto cleanup; | 2033 | goto cleanup; |
| 2023 | case COMP_MISSED_INT: | 2034 | case COMP_MISSED_INT: |
| 2024 | /* | 2035 | /* |
| @@ -2047,9 +2058,11 @@ static int handle_tx_event(struct xhci_hcd *xhci, | |||
| 2047 | if (list_empty(&ep_ring->td_list)) { | 2058 | if (list_empty(&ep_ring->td_list)) { |
| 2048 | xhci_warn(xhci, "WARN Event TRB for slot %d ep %d " | 2059 | xhci_warn(xhci, "WARN Event TRB for slot %d ep %d " |
| 2049 | "with no TDs queued?\n", | 2060 | "with no TDs queued?\n", |
| 2050 | TRB_TO_SLOT_ID(event->flags), ep_index); | 2061 | TRB_TO_SLOT_ID(le32_to_cpu(event->flags)), |
| 2062 | ep_index); | ||
| 2051 | xhci_dbg(xhci, "Event TRB with TRB type ID %u\n", | 2063 | xhci_dbg(xhci, "Event TRB with TRB type ID %u\n", |
| 2052 | (unsigned int) (event->flags & TRB_TYPE_BITMASK)>>10); | 2064 | (unsigned int) (le32_to_cpu(event->flags) |
| 2065 | & TRB_TYPE_BITMASK)>>10); | ||
| 2053 | xhci_print_trb_offsets(xhci, (union xhci_trb *) event); | 2066 | xhci_print_trb_offsets(xhci, (union xhci_trb *) event); |
| 2054 | if (ep->skip) { | 2067 | if (ep->skip) { |
| 2055 | ep->skip = false; | 2068 | ep->skip = false; |
| @@ -2092,7 +2105,8 @@ static int handle_tx_event(struct xhci_hcd *xhci, | |||
| 2092 | * corresponding TD has been cancelled. Just ignore | 2105 | * corresponding TD has been cancelled. Just ignore |
| 2093 | * the TD. | 2106 | * the TD. |
| 2094 | */ | 2107 | */ |
| 2095 | if ((event_trb->generic.field[3] & TRB_TYPE_BITMASK) | 2108 | if ((le32_to_cpu(event_trb->generic.field[3]) |
| 2109 | & TRB_TYPE_BITMASK) | ||
| 2096 | == TRB_TYPE(TRB_TR_NOOP)) { | 2110 | == TRB_TYPE(TRB_TR_NOOP)) { |
| 2097 | xhci_dbg(xhci, | 2111 | xhci_dbg(xhci, |
| 2098 | "event_trb is a no-op TRB. Skip it\n"); | 2112 | "event_trb is a no-op TRB. Skip it\n"); |
| @@ -2157,8 +2171,10 @@ cleanup: | |||
| 2157 | /* | 2171 | /* |
| 2158 | * This function handles all OS-owned events on the event ring. It may drop | 2172 | * This function handles all OS-owned events on the event ring. It may drop |
| 2159 | * xhci->lock between event processing (e.g. to pass up port status changes). | 2173 | * xhci->lock between event processing (e.g. to pass up port status changes). |
| 2174 | * Returns >0 for "possibly more events to process" (caller should call again), | ||
| 2175 | * otherwise 0 if done. In future, <0 returns should indicate error code. | ||
| 2160 | */ | 2176 | */ |
| 2161 | static void xhci_handle_event(struct xhci_hcd *xhci) | 2177 | static int xhci_handle_event(struct xhci_hcd *xhci) |
| 2162 | { | 2178 | { |
| 2163 | union xhci_trb *event; | 2179 | union xhci_trb *event; |
| 2164 | int update_ptrs = 1; | 2180 | int update_ptrs = 1; |
| @@ -2167,20 +2183,25 @@ static void xhci_handle_event(struct xhci_hcd *xhci) | |||
| 2167 | xhci_dbg(xhci, "In %s\n", __func__); | 2183 | xhci_dbg(xhci, "In %s\n", __func__); |
| 2168 | if (!xhci->event_ring || !xhci->event_ring->dequeue) { | 2184 | if (!xhci->event_ring || !xhci->event_ring->dequeue) { |
| 2169 | xhci->error_bitmask |= 1 << 1; | 2185 | xhci->error_bitmask |= 1 << 1; |
| 2170 | return; | 2186 | return 0; |
| 2171 | } | 2187 | } |
| 2172 | 2188 | ||
| 2173 | event = xhci->event_ring->dequeue; | 2189 | event = xhci->event_ring->dequeue; |
| 2174 | /* Does the HC or OS own the TRB? */ | 2190 | /* Does the HC or OS own the TRB? */ |
| 2175 | if ((event->event_cmd.flags & TRB_CYCLE) != | 2191 | if ((le32_to_cpu(event->event_cmd.flags) & TRB_CYCLE) != |
| 2176 | xhci->event_ring->cycle_state) { | 2192 | xhci->event_ring->cycle_state) { |
| 2177 | xhci->error_bitmask |= 1 << 2; | 2193 | xhci->error_bitmask |= 1 << 2; |
| 2178 | return; | 2194 | return 0; |
| 2179 | } | 2195 | } |
| 2180 | xhci_dbg(xhci, "%s - OS owns TRB\n", __func__); | 2196 | xhci_dbg(xhci, "%s - OS owns TRB\n", __func__); |
| 2181 | 2197 | ||
| 2198 | /* | ||
| 2199 | * Barrier between reading the TRB_CYCLE (valid) flag above and any | ||
| 2200 | * speculative reads of the event's flags/data below. | ||
| 2201 | */ | ||
| 2202 | rmb(); | ||
| 2182 | /* FIXME: Handle more event types. */ | 2203 | /* FIXME: Handle more event types. */ |
| 2183 | switch ((event->event_cmd.flags & TRB_TYPE_BITMASK)) { | 2204 | switch ((le32_to_cpu(event->event_cmd.flags) & TRB_TYPE_BITMASK)) { |
| 2184 | case TRB_TYPE(TRB_COMPLETION): | 2205 | case TRB_TYPE(TRB_COMPLETION): |
| 2185 | xhci_dbg(xhci, "%s - calling handle_cmd_completion\n", __func__); | 2206 | xhci_dbg(xhci, "%s - calling handle_cmd_completion\n", __func__); |
| 2186 | handle_cmd_completion(xhci, &event->event_cmd); | 2207 | handle_cmd_completion(xhci, &event->event_cmd); |
| @@ -2202,7 +2223,8 @@ static void xhci_handle_event(struct xhci_hcd *xhci) | |||
| 2202 | update_ptrs = 0; | 2223 | update_ptrs = 0; |
| 2203 | break; | 2224 | break; |
| 2204 | default: | 2225 | default: |
| 2205 | if ((event->event_cmd.flags & TRB_TYPE_BITMASK) >= TRB_TYPE(48)) | 2226 | if ((le32_to_cpu(event->event_cmd.flags) & TRB_TYPE_BITMASK) >= |
| 2227 | TRB_TYPE(48)) | ||
| 2206 | handle_vendor_event(xhci, event); | 2228 | handle_vendor_event(xhci, event); |
| 2207 | else | 2229 | else |
| 2208 | xhci->error_bitmask |= 1 << 3; | 2230 | xhci->error_bitmask |= 1 << 3; |
| @@ -2213,15 +2235,17 @@ static void xhci_handle_event(struct xhci_hcd *xhci) | |||
| 2213 | if (xhci->xhc_state & XHCI_STATE_DYING) { | 2235 | if (xhci->xhc_state & XHCI_STATE_DYING) { |
| 2214 | xhci_dbg(xhci, "xHCI host dying, returning from " | 2236 | xhci_dbg(xhci, "xHCI host dying, returning from " |
| 2215 | "event handler.\n"); | 2237 | "event handler.\n"); |
| 2216 | return; | 2238 | return 0; |
| 2217 | } | 2239 | } |
| 2218 | 2240 | ||
| 2219 | if (update_ptrs) | 2241 | if (update_ptrs) |
| 2220 | /* Update SW event ring dequeue pointer */ | 2242 | /* Update SW event ring dequeue pointer */ |
| 2221 | inc_deq(xhci, xhci->event_ring, true); | 2243 | inc_deq(xhci, xhci->event_ring, true); |
| 2222 | 2244 | ||
| 2223 | /* Are there more items on the event ring? */ | 2245 | /* Are there more items on the event ring? Caller will call us again to |
| 2224 | xhci_handle_event(xhci); | 2246 | * check. |
| 2247 | */ | ||
| 2248 | return 1; | ||
| 2225 | } | 2249 | } |
| 2226 | 2250 | ||
| 2227 | /* | 2251 | /* |
| @@ -2252,12 +2276,12 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd) | |||
| 2252 | xhci_dbg(xhci, "op reg status = %08x\n", status); | 2276 | xhci_dbg(xhci, "op reg status = %08x\n", status); |
| 2253 | xhci_dbg(xhci, "Event ring dequeue ptr:\n"); | 2277 | xhci_dbg(xhci, "Event ring dequeue ptr:\n"); |
| 2254 | xhci_dbg(xhci, "@%llx %08x %08x %08x %08x\n", | 2278 | xhci_dbg(xhci, "@%llx %08x %08x %08x %08x\n", |
| 2255 | (unsigned long long) | 2279 | (unsigned long long) |
| 2256 | xhci_trb_virt_to_dma(xhci->event_ring->deq_seg, trb), | 2280 | xhci_trb_virt_to_dma(xhci->event_ring->deq_seg, trb), |
| 2257 | lower_32_bits(trb->link.segment_ptr), | 2281 | lower_32_bits(le64_to_cpu(trb->link.segment_ptr)), |
| 2258 | upper_32_bits(trb->link.segment_ptr), | 2282 | upper_32_bits(le64_to_cpu(trb->link.segment_ptr)), |
| 2259 | (unsigned int) trb->link.intr_target, | 2283 | (unsigned int) le32_to_cpu(trb->link.intr_target), |
| 2260 | (unsigned int) trb->link.control); | 2284 | (unsigned int) le32_to_cpu(trb->link.control)); |
| 2261 | 2285 | ||
| 2262 | if (status & STS_FATAL) { | 2286 | if (status & STS_FATAL) { |
| 2263 | xhci_warn(xhci, "WARNING: Host System Error\n"); | 2287 | xhci_warn(xhci, "WARNING: Host System Error\n"); |
| @@ -2303,7 +2327,7 @@ hw_died: | |||
| 2303 | /* FIXME this should be a delayed service routine | 2327 | /* FIXME this should be a delayed service routine |
| 2304 | * that clears the EHB. | 2328 | * that clears the EHB. |
| 2305 | */ | 2329 | */ |
| 2306 | xhci_handle_event(xhci); | 2330 | while (xhci_handle_event(xhci) > 0) {} |
| 2307 | 2331 | ||
| 2308 | temp_64 = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); | 2332 | temp_64 = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); |
| 2309 | /* If necessary, update the HW's version of the event ring deq ptr. */ | 2333 | /* If necessary, update the HW's version of the event ring deq ptr. */ |
| @@ -2358,10 +2382,10 @@ static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring, | |||
| 2358 | struct xhci_generic_trb *trb; | 2382 | struct xhci_generic_trb *trb; |
| 2359 | 2383 | ||
| 2360 | trb = &ring->enqueue->generic; | 2384 | trb = &ring->enqueue->generic; |
| 2361 | trb->field[0] = field1; | 2385 | trb->field[0] = cpu_to_le32(field1); |
| 2362 | trb->field[1] = field2; | 2386 | trb->field[1] = cpu_to_le32(field2); |
| 2363 | trb->field[2] = field3; | 2387 | trb->field[2] = cpu_to_le32(field3); |
| 2364 | trb->field[3] = field4; | 2388 | trb->field[3] = cpu_to_le32(field4); |
| 2365 | inc_enq(xhci, ring, consumer, more_trbs_coming); | 2389 | inc_enq(xhci, ring, consumer, more_trbs_coming); |
| 2366 | } | 2390 | } |
| 2367 | 2391 | ||
| @@ -2414,17 +2438,16 @@ static int prepare_ring(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, | |||
| 2414 | next = ring->enqueue; | 2438 | next = ring->enqueue; |
| 2415 | 2439 | ||
| 2416 | while (last_trb(xhci, ring, ring->enq_seg, next)) { | 2440 | while (last_trb(xhci, ring, ring->enq_seg, next)) { |
| 2417 | |||
| 2418 | /* If we're not dealing with 0.95 hardware, | 2441 | /* If we're not dealing with 0.95 hardware, |
| 2419 | * clear the chain bit. | 2442 | * clear the chain bit. |
| 2420 | */ | 2443 | */ |
| 2421 | if (!xhci_link_trb_quirk(xhci)) | 2444 | if (!xhci_link_trb_quirk(xhci)) |
| 2422 | next->link.control &= ~TRB_CHAIN; | 2445 | next->link.control &= cpu_to_le32(~TRB_CHAIN); |
| 2423 | else | 2446 | else |
| 2424 | next->link.control |= TRB_CHAIN; | 2447 | next->link.control |= cpu_to_le32(TRB_CHAIN); |
| 2425 | 2448 | ||
| 2426 | wmb(); | 2449 | wmb(); |
| 2427 | next->link.control ^= (u32) TRB_CYCLE; | 2450 | next->link.control ^= cpu_to_le32((u32) TRB_CYCLE); |
| 2428 | 2451 | ||
| 2429 | /* Toggle the cycle bit after the last ring segment. */ | 2452 | /* Toggle the cycle bit after the last ring segment. */ |
| 2430 | if (last_trb_on_last_seg(xhci, ring, ring->enq_seg, next)) { | 2453 | if (last_trb_on_last_seg(xhci, ring, ring->enq_seg, next)) { |
| @@ -2467,8 +2490,8 @@ static int prepare_transfer(struct xhci_hcd *xhci, | |||
| 2467 | } | 2490 | } |
| 2468 | 2491 | ||
| 2469 | ret = prepare_ring(xhci, ep_ring, | 2492 | ret = prepare_ring(xhci, ep_ring, |
| 2470 | ep_ctx->ep_info & EP_STATE_MASK, | 2493 | le32_to_cpu(ep_ctx->ep_info) & EP_STATE_MASK, |
| 2471 | num_trbs, mem_flags); | 2494 | num_trbs, mem_flags); |
| 2472 | if (ret) | 2495 | if (ret) |
| 2473 | return ret; | 2496 | return ret; |
| 2474 | 2497 | ||
| @@ -2570,9 +2593,9 @@ static void giveback_first_trb(struct xhci_hcd *xhci, int slot_id, | |||
| 2570 | */ | 2593 | */ |
| 2571 | wmb(); | 2594 | wmb(); |
| 2572 | if (start_cycle) | 2595 | if (start_cycle) |
| 2573 | start_trb->field[3] |= start_cycle; | 2596 | start_trb->field[3] |= cpu_to_le32(start_cycle); |
| 2574 | else | 2597 | else |
| 2575 | start_trb->field[3] &= ~0x1; | 2598 | start_trb->field[3] &= cpu_to_le32(~TRB_CYCLE); |
| 2576 | xhci_ring_ep_doorbell(xhci, slot_id, ep_index, stream_id); | 2599 | xhci_ring_ep_doorbell(xhci, slot_id, ep_index, stream_id); |
| 2577 | } | 2600 | } |
| 2578 | 2601 | ||
| @@ -2590,7 +2613,7 @@ int xhci_queue_intr_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2590 | int xhci_interval; | 2613 | int xhci_interval; |
| 2591 | int ep_interval; | 2614 | int ep_interval; |
| 2592 | 2615 | ||
| 2593 | xhci_interval = EP_INTERVAL_TO_UFRAMES(ep_ctx->ep_info); | 2616 | xhci_interval = EP_INTERVAL_TO_UFRAMES(le32_to_cpu(ep_ctx->ep_info)); |
| 2594 | ep_interval = urb->interval; | 2617 | ep_interval = urb->interval; |
| 2595 | /* Convert to microframes */ | 2618 | /* Convert to microframes */ |
| 2596 | if (urb->dev->speed == USB_SPEED_LOW || | 2619 | if (urb->dev->speed == USB_SPEED_LOW || |
| @@ -2632,6 +2655,35 @@ static u32 xhci_td_remainder(unsigned int remainder) | |||
| 2632 | return (remainder >> 10) << 17; | 2655 | return (remainder >> 10) << 17; |
| 2633 | } | 2656 | } |
| 2634 | 2657 | ||
| 2658 | /* | ||
| 2659 | * For xHCI 1.0 host controllers, TD size is the number of packets remaining in | ||
| 2660 | * the TD (*not* including this TRB). | ||
| 2661 | * | ||
| 2662 | * Total TD packet count = total_packet_count = | ||
| 2663 | * roundup(TD size in bytes / wMaxPacketSize) | ||
| 2664 | * | ||
| 2665 | * Packets transferred up to and including this TRB = packets_transferred = | ||
| 2666 | * rounddown(total bytes transferred including this TRB / wMaxPacketSize) | ||
| 2667 | * | ||
| 2668 | * TD size = total_packet_count - packets_transferred | ||
| 2669 | * | ||
| 2670 | * It must fit in bits 21:17, so it can't be bigger than 31. | ||
| 2671 | */ | ||
| 2672 | |||
| 2673 | static u32 xhci_v1_0_td_remainder(int running_total, int trb_buff_len, | ||
| 2674 | unsigned int total_packet_count, struct urb *urb) | ||
| 2675 | { | ||
| 2676 | int packets_transferred; | ||
| 2677 | |||
| 2678 | /* All the TRB queueing functions don't count the current TRB in | ||
| 2679 | * running_total. | ||
| 2680 | */ | ||
| 2681 | packets_transferred = (running_total + trb_buff_len) / | ||
| 2682 | le16_to_cpu(urb->ep->desc.wMaxPacketSize); | ||
| 2683 | |||
| 2684 | return xhci_td_remainder(total_packet_count - packets_transferred); | ||
| 2685 | } | ||
| 2686 | |||
| 2635 | static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | 2687 | static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
| 2636 | struct urb *urb, int slot_id, unsigned int ep_index) | 2688 | struct urb *urb, int slot_id, unsigned int ep_index) |
| 2637 | { | 2689 | { |
| @@ -2642,6 +2694,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2642 | struct scatterlist *sg; | 2694 | struct scatterlist *sg; |
| 2643 | int num_sgs; | 2695 | int num_sgs; |
| 2644 | int trb_buff_len, this_sg_len, running_total; | 2696 | int trb_buff_len, this_sg_len, running_total; |
| 2697 | unsigned int total_packet_count; | ||
| 2645 | bool first_trb; | 2698 | bool first_trb; |
| 2646 | u64 addr; | 2699 | u64 addr; |
| 2647 | bool more_trbs_coming; | 2700 | bool more_trbs_coming; |
| @@ -2655,6 +2708,8 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2655 | 2708 | ||
| 2656 | num_trbs = count_sg_trbs_needed(xhci, urb); | 2709 | num_trbs = count_sg_trbs_needed(xhci, urb); |
| 2657 | num_sgs = urb->num_sgs; | 2710 | num_sgs = urb->num_sgs; |
| 2711 | total_packet_count = roundup(urb->transfer_buffer_length, | ||
| 2712 | le16_to_cpu(urb->ep->desc.wMaxPacketSize)); | ||
| 2658 | 2713 | ||
| 2659 | trb_buff_len = prepare_transfer(xhci, xhci->devs[slot_id], | 2714 | trb_buff_len = prepare_transfer(xhci, xhci->devs[slot_id], |
| 2660 | ep_index, urb->stream_id, | 2715 | ep_index, urb->stream_id, |
| @@ -2718,6 +2773,11 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2718 | td->last_trb = ep_ring->enqueue; | 2773 | td->last_trb = ep_ring->enqueue; |
| 2719 | field |= TRB_IOC; | 2774 | field |= TRB_IOC; |
| 2720 | } | 2775 | } |
| 2776 | |||
| 2777 | /* Only set interrupt on short packet for IN endpoints */ | ||
| 2778 | if (usb_urb_dir_in(urb)) | ||
| 2779 | field |= TRB_ISP; | ||
| 2780 | |||
| 2721 | xhci_dbg(xhci, " sg entry: dma = %#x, len = %#x (%d), " | 2781 | xhci_dbg(xhci, " sg entry: dma = %#x, len = %#x (%d), " |
| 2722 | "64KB boundary at %#x, end dma = %#x\n", | 2782 | "64KB boundary at %#x, end dma = %#x\n", |
| 2723 | (unsigned int) addr, trb_buff_len, trb_buff_len, | 2783 | (unsigned int) addr, trb_buff_len, trb_buff_len, |
| @@ -2730,11 +2790,20 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2730 | (unsigned int) (addr + TRB_MAX_BUFF_SIZE) & ~(TRB_MAX_BUFF_SIZE - 1), | 2790 | (unsigned int) (addr + TRB_MAX_BUFF_SIZE) & ~(TRB_MAX_BUFF_SIZE - 1), |
| 2731 | (unsigned int) addr + trb_buff_len); | 2791 | (unsigned int) addr + trb_buff_len); |
| 2732 | } | 2792 | } |
| 2733 | remainder = xhci_td_remainder(urb->transfer_buffer_length - | 2793 | |
| 2734 | running_total) ; | 2794 | /* Set the TRB length, TD size, and interrupter fields. */ |
| 2795 | if (xhci->hci_version < 0x100) { | ||
| 2796 | remainder = xhci_td_remainder( | ||
| 2797 | urb->transfer_buffer_length - | ||
| 2798 | running_total); | ||
| 2799 | } else { | ||
| 2800 | remainder = xhci_v1_0_td_remainder(running_total, | ||
| 2801 | trb_buff_len, total_packet_count, urb); | ||
| 2802 | } | ||
| 2735 | length_field = TRB_LEN(trb_buff_len) | | 2803 | length_field = TRB_LEN(trb_buff_len) | |
| 2736 | remainder | | 2804 | remainder | |
| 2737 | TRB_INTR_TARGET(0); | 2805 | TRB_INTR_TARGET(0); |
| 2806 | |||
| 2738 | if (num_trbs > 1) | 2807 | if (num_trbs > 1) |
| 2739 | more_trbs_coming = true; | 2808 | more_trbs_coming = true; |
| 2740 | else | 2809 | else |
| @@ -2743,12 +2812,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2743 | lower_32_bits(addr), | 2812 | lower_32_bits(addr), |
| 2744 | upper_32_bits(addr), | 2813 | upper_32_bits(addr), |
| 2745 | length_field, | 2814 | length_field, |
| 2746 | /* We always want to know if the TRB was short, | 2815 | field | TRB_TYPE(TRB_NORMAL)); |
| 2747 | * or we won't get an event when it completes. | ||
| 2748 | * (Unless we use event data TRBs, which are a | ||
| 2749 | * waste of space and HC resources.) | ||
| 2750 | */ | ||
| 2751 | field | TRB_ISP | TRB_TYPE(TRB_NORMAL)); | ||
| 2752 | --num_trbs; | 2816 | --num_trbs; |
| 2753 | running_total += trb_buff_len; | 2817 | running_total += trb_buff_len; |
| 2754 | 2818 | ||
| @@ -2796,6 +2860,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2796 | u32 field, length_field; | 2860 | u32 field, length_field; |
| 2797 | 2861 | ||
| 2798 | int running_total, trb_buff_len, ret; | 2862 | int running_total, trb_buff_len, ret; |
| 2863 | unsigned int total_packet_count; | ||
| 2799 | u64 addr; | 2864 | u64 addr; |
| 2800 | 2865 | ||
| 2801 | if (urb->num_sgs) | 2866 | if (urb->num_sgs) |
| @@ -2850,6 +2915,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2850 | start_cycle = ep_ring->cycle_state; | 2915 | start_cycle = ep_ring->cycle_state; |
| 2851 | 2916 | ||
| 2852 | running_total = 0; | 2917 | running_total = 0; |
| 2918 | total_packet_count = roundup(urb->transfer_buffer_length, | ||
| 2919 | le16_to_cpu(urb->ep->desc.wMaxPacketSize)); | ||
| 2853 | /* How much data is in the first TRB? */ | 2920 | /* How much data is in the first TRB? */ |
| 2854 | addr = (u64) urb->transfer_dma; | 2921 | addr = (u64) urb->transfer_dma; |
| 2855 | trb_buff_len = TRB_MAX_BUFF_SIZE - | 2922 | trb_buff_len = TRB_MAX_BUFF_SIZE - |
| @@ -2882,11 +2949,24 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2882 | td->last_trb = ep_ring->enqueue; | 2949 | td->last_trb = ep_ring->enqueue; |
| 2883 | field |= TRB_IOC; | 2950 | field |= TRB_IOC; |
| 2884 | } | 2951 | } |
| 2885 | remainder = xhci_td_remainder(urb->transfer_buffer_length - | 2952 | |
| 2886 | running_total); | 2953 | /* Only set interrupt on short packet for IN endpoints */ |
| 2954 | if (usb_urb_dir_in(urb)) | ||
| 2955 | field |= TRB_ISP; | ||
| 2956 | |||
| 2957 | /* Set the TRB length, TD size, and interrupter fields. */ | ||
| 2958 | if (xhci->hci_version < 0x100) { | ||
| 2959 | remainder = xhci_td_remainder( | ||
| 2960 | urb->transfer_buffer_length - | ||
| 2961 | running_total); | ||
| 2962 | } else { | ||
| 2963 | remainder = xhci_v1_0_td_remainder(running_total, | ||
| 2964 | trb_buff_len, total_packet_count, urb); | ||
| 2965 | } | ||
| 2887 | length_field = TRB_LEN(trb_buff_len) | | 2966 | length_field = TRB_LEN(trb_buff_len) | |
| 2888 | remainder | | 2967 | remainder | |
| 2889 | TRB_INTR_TARGET(0); | 2968 | TRB_INTR_TARGET(0); |
| 2969 | |||
| 2890 | if (num_trbs > 1) | 2970 | if (num_trbs > 1) |
| 2891 | more_trbs_coming = true; | 2971 | more_trbs_coming = true; |
| 2892 | else | 2972 | else |
| @@ -2895,12 +2975,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2895 | lower_32_bits(addr), | 2975 | lower_32_bits(addr), |
| 2896 | upper_32_bits(addr), | 2976 | upper_32_bits(addr), |
| 2897 | length_field, | 2977 | length_field, |
| 2898 | /* We always want to know if the TRB was short, | 2978 | field | TRB_TYPE(TRB_NORMAL)); |
| 2899 | * or we won't get an event when it completes. | ||
| 2900 | * (Unless we use event data TRBs, which are a | ||
| 2901 | * waste of space and HC resources.) | ||
| 2902 | */ | ||
| 2903 | field | TRB_ISP | TRB_TYPE(TRB_NORMAL)); | ||
| 2904 | --num_trbs; | 2979 | --num_trbs; |
| 2905 | running_total += trb_buff_len; | 2980 | running_total += trb_buff_len; |
| 2906 | 2981 | ||
| @@ -2978,16 +3053,31 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2978 | field |= TRB_IDT | TRB_TYPE(TRB_SETUP); | 3053 | field |= TRB_IDT | TRB_TYPE(TRB_SETUP); |
| 2979 | if (start_cycle == 0) | 3054 | if (start_cycle == 0) |
| 2980 | field |= 0x1; | 3055 | field |= 0x1; |
| 3056 | |||
| 3057 | /* xHCI 1.0 6.4.1.2.1: Transfer Type field */ | ||
| 3058 | if (xhci->hci_version == 0x100) { | ||
| 3059 | if (urb->transfer_buffer_length > 0) { | ||
| 3060 | if (setup->bRequestType & USB_DIR_IN) | ||
| 3061 | field |= TRB_TX_TYPE(TRB_DATA_IN); | ||
| 3062 | else | ||
| 3063 | field |= TRB_TX_TYPE(TRB_DATA_OUT); | ||
| 3064 | } | ||
| 3065 | } | ||
| 3066 | |||
| 2981 | queue_trb(xhci, ep_ring, false, true, | 3067 | queue_trb(xhci, ep_ring, false, true, |
| 2982 | /* FIXME endianness is probably going to bite my ass here. */ | 3068 | setup->bRequestType | setup->bRequest << 8 | le16_to_cpu(setup->wValue) << 16, |
| 2983 | setup->bRequestType | setup->bRequest << 8 | setup->wValue << 16, | 3069 | le16_to_cpu(setup->wIndex) | le16_to_cpu(setup->wLength) << 16, |
| 2984 | setup->wIndex | setup->wLength << 16, | 3070 | TRB_LEN(8) | TRB_INTR_TARGET(0), |
| 2985 | TRB_LEN(8) | TRB_INTR_TARGET(0), | 3071 | /* Immediate data in pointer */ |
| 2986 | /* Immediate data in pointer */ | 3072 | field); |
| 2987 | field); | ||
| 2988 | 3073 | ||
| 2989 | /* If there's data, queue data TRBs */ | 3074 | /* If there's data, queue data TRBs */ |
| 2990 | field = 0; | 3075 | /* Only set interrupt on short packet for IN endpoints */ |
| 3076 | if (usb_urb_dir_in(urb)) | ||
| 3077 | field = TRB_ISP | TRB_TYPE(TRB_DATA); | ||
| 3078 | else | ||
| 3079 | field = TRB_TYPE(TRB_DATA); | ||
| 3080 | |||
| 2991 | length_field = TRB_LEN(urb->transfer_buffer_length) | | 3081 | length_field = TRB_LEN(urb->transfer_buffer_length) | |
| 2992 | xhci_td_remainder(urb->transfer_buffer_length) | | 3082 | xhci_td_remainder(urb->transfer_buffer_length) | |
| 2993 | TRB_INTR_TARGET(0); | 3083 | TRB_INTR_TARGET(0); |
| @@ -2998,8 +3088,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 2998 | lower_32_bits(urb->transfer_dma), | 3088 | lower_32_bits(urb->transfer_dma), |
| 2999 | upper_32_bits(urb->transfer_dma), | 3089 | upper_32_bits(urb->transfer_dma), |
| 3000 | length_field, | 3090 | length_field, |
| 3001 | /* Event on short tx */ | 3091 | field | ep_ring->cycle_state); |
| 3002 | field | TRB_ISP | TRB_TYPE(TRB_DATA) | ep_ring->cycle_state); | ||
| 3003 | } | 3092 | } |
| 3004 | 3093 | ||
| 3005 | /* Save the DMA address of the last TRB in the TD */ | 3094 | /* Save the DMA address of the last TRB in the TD */ |
| @@ -3045,6 +3134,63 @@ static int count_isoc_trbs_needed(struct xhci_hcd *xhci, | |||
| 3045 | return num_trbs; | 3134 | return num_trbs; |
| 3046 | } | 3135 | } |
| 3047 | 3136 | ||
| 3137 | /* | ||
| 3138 | * The transfer burst count field of the isochronous TRB defines the number of | ||
| 3139 | * bursts that are required to move all packets in this TD. Only SuperSpeed | ||
| 3140 | * devices can burst up to bMaxBurst number of packets per service interval. | ||
| 3141 | * This field is zero based, meaning a value of zero in the field means one | ||
| 3142 | * burst. Basically, for everything but SuperSpeed devices, this field will be | ||
| 3143 | * zero. Only xHCI 1.0 host controllers support this field. | ||
| 3144 | */ | ||
| 3145 | static unsigned int xhci_get_burst_count(struct xhci_hcd *xhci, | ||
| 3146 | struct usb_device *udev, | ||
| 3147 | struct urb *urb, unsigned int total_packet_count) | ||
| 3148 | { | ||
| 3149 | unsigned int max_burst; | ||
| 3150 | |||
| 3151 | if (xhci->hci_version < 0x100 || udev->speed != USB_SPEED_SUPER) | ||
| 3152 | return 0; | ||
| 3153 | |||
| 3154 | max_burst = urb->ep->ss_ep_comp.bMaxBurst; | ||
| 3155 | return roundup(total_packet_count, max_burst + 1) - 1; | ||
| 3156 | } | ||
| 3157 | |||
| 3158 | /* | ||
| 3159 | * Returns the number of packets in the last "burst" of packets. This field is | ||
| 3160 | * valid for all speeds of devices. USB 2.0 devices can only do one "burst", so | ||
| 3161 | * the last burst packet count is equal to the total number of packets in the | ||
| 3162 | * TD. SuperSpeed endpoints can have up to 3 bursts. All but the last burst | ||
| 3163 | * must contain (bMaxBurst + 1) number of packets, but the last burst can | ||
| 3164 | * contain 1 to (bMaxBurst + 1) packets. | ||
| 3165 | */ | ||
| 3166 | static unsigned int xhci_get_last_burst_packet_count(struct xhci_hcd *xhci, | ||
| 3167 | struct usb_device *udev, | ||
| 3168 | struct urb *urb, unsigned int total_packet_count) | ||
| 3169 | { | ||
| 3170 | unsigned int max_burst; | ||
| 3171 | unsigned int residue; | ||
| 3172 | |||
| 3173 | if (xhci->hci_version < 0x100) | ||
| 3174 | return 0; | ||
| 3175 | |||
| 3176 | switch (udev->speed) { | ||
| 3177 | case USB_SPEED_SUPER: | ||
| 3178 | /* bMaxBurst is zero based: 0 means 1 packet per burst */ | ||
| 3179 | max_burst = urb->ep->ss_ep_comp.bMaxBurst; | ||
| 3180 | residue = total_packet_count % (max_burst + 1); | ||
| 3181 | /* If residue is zero, the last burst contains (max_burst + 1) | ||
| 3182 | * number of packets, but the TLBPC field is zero-based. | ||
| 3183 | */ | ||
| 3184 | if (residue == 0) | ||
| 3185 | return max_burst; | ||
| 3186 | return residue - 1; | ||
| 3187 | default: | ||
| 3188 | if (total_packet_count == 0) | ||
| 3189 | return 0; | ||
| 3190 | return total_packet_count - 1; | ||
| 3191 | } | ||
| 3192 | } | ||
| 3193 | |||
| 3048 | /* This is for isoc transfer */ | 3194 | /* This is for isoc transfer */ |
| 3049 | static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | 3195 | static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
| 3050 | struct urb *urb, int slot_id, unsigned int ep_index) | 3196 | struct urb *urb, int slot_id, unsigned int ep_index) |
| @@ -3085,12 +3231,22 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 3085 | 3231 | ||
| 3086 | /* Queue the first TRB, even if it's zero-length */ | 3232 | /* Queue the first TRB, even if it's zero-length */ |
| 3087 | for (i = 0; i < num_tds; i++) { | 3233 | for (i = 0; i < num_tds; i++) { |
| 3088 | first_trb = true; | 3234 | unsigned int total_packet_count; |
| 3235 | unsigned int burst_count; | ||
| 3236 | unsigned int residue; | ||
| 3089 | 3237 | ||
| 3238 | first_trb = true; | ||
| 3090 | running_total = 0; | 3239 | running_total = 0; |
| 3091 | addr = start_addr + urb->iso_frame_desc[i].offset; | 3240 | addr = start_addr + urb->iso_frame_desc[i].offset; |
| 3092 | td_len = urb->iso_frame_desc[i].length; | 3241 | td_len = urb->iso_frame_desc[i].length; |
| 3093 | td_remain_len = td_len; | 3242 | td_remain_len = td_len; |
| 3243 | /* FIXME: Ignoring zero-length packets, can those happen? */ | ||
| 3244 | total_packet_count = roundup(td_len, | ||
| 3245 | le16_to_cpu(urb->ep->desc.wMaxPacketSize)); | ||
| 3246 | burst_count = xhci_get_burst_count(xhci, urb->dev, urb, | ||
| 3247 | total_packet_count); | ||
| 3248 | residue = xhci_get_last_burst_packet_count(xhci, | ||
| 3249 | urb->dev, urb, total_packet_count); | ||
| 3094 | 3250 | ||
| 3095 | trbs_per_td = count_isoc_trbs_needed(xhci, urb, i); | 3251 | trbs_per_td = count_isoc_trbs_needed(xhci, urb, i); |
| 3096 | 3252 | ||
| @@ -3104,7 +3260,7 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 3104 | 3260 | ||
| 3105 | for (j = 0; j < trbs_per_td; j++) { | 3261 | for (j = 0; j < trbs_per_td; j++) { |
| 3106 | u32 remainder = 0; | 3262 | u32 remainder = 0; |
| 3107 | field = 0; | 3263 | field = TRB_TBC(burst_count) | TRB_TLBPC(residue); |
| 3108 | 3264 | ||
| 3109 | if (first_trb) { | 3265 | if (first_trb) { |
| 3110 | /* Queue the isoc TRB */ | 3266 | /* Queue the isoc TRB */ |
| @@ -3123,6 +3279,10 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 3123 | field |= ep_ring->cycle_state; | 3279 | field |= ep_ring->cycle_state; |
| 3124 | } | 3280 | } |
| 3125 | 3281 | ||
| 3282 | /* Only set interrupt on short packet for IN EPs */ | ||
| 3283 | if (usb_urb_dir_in(urb)) | ||
| 3284 | field |= TRB_ISP; | ||
| 3285 | |||
| 3126 | /* Chain all the TRBs together; clear the chain bit in | 3286 | /* Chain all the TRBs together; clear the chain bit in |
| 3127 | * the last TRB to indicate it's the last TRB in the | 3287 | * the last TRB to indicate it's the last TRB in the |
| 3128 | * chain. | 3288 | * chain. |
| @@ -3133,6 +3293,11 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 3133 | } else { | 3293 | } else { |
| 3134 | td->last_trb = ep_ring->enqueue; | 3294 | td->last_trb = ep_ring->enqueue; |
| 3135 | field |= TRB_IOC; | 3295 | field |= TRB_IOC; |
| 3296 | if (xhci->hci_version == 0x100) { | ||
| 3297 | /* Set BEI bit except for the last td */ | ||
| 3298 | if (i < num_tds - 1) | ||
| 3299 | field |= TRB_BEI; | ||
| 3300 | } | ||
| 3136 | more_trbs_coming = false; | 3301 | more_trbs_coming = false; |
| 3137 | } | 3302 | } |
| 3138 | 3303 | ||
| @@ -3142,20 +3307,24 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 3142 | if (trb_buff_len > td_remain_len) | 3307 | if (trb_buff_len > td_remain_len) |
| 3143 | trb_buff_len = td_remain_len; | 3308 | trb_buff_len = td_remain_len; |
| 3144 | 3309 | ||
| 3145 | remainder = xhci_td_remainder(td_len - running_total); | 3310 | /* Set the TRB length, TD size, & interrupter fields. */ |
| 3311 | if (xhci->hci_version < 0x100) { | ||
| 3312 | remainder = xhci_td_remainder( | ||
| 3313 | td_len - running_total); | ||
| 3314 | } else { | ||
| 3315 | remainder = xhci_v1_0_td_remainder( | ||
| 3316 | running_total, trb_buff_len, | ||
| 3317 | total_packet_count, urb); | ||
| 3318 | } | ||
| 3146 | length_field = TRB_LEN(trb_buff_len) | | 3319 | length_field = TRB_LEN(trb_buff_len) | |
| 3147 | remainder | | 3320 | remainder | |
| 3148 | TRB_INTR_TARGET(0); | 3321 | TRB_INTR_TARGET(0); |
| 3322 | |||
| 3149 | queue_trb(xhci, ep_ring, false, more_trbs_coming, | 3323 | queue_trb(xhci, ep_ring, false, more_trbs_coming, |
| 3150 | lower_32_bits(addr), | 3324 | lower_32_bits(addr), |
| 3151 | upper_32_bits(addr), | 3325 | upper_32_bits(addr), |
| 3152 | length_field, | 3326 | length_field, |
| 3153 | /* We always want to know if the TRB was short, | 3327 | field); |
| 3154 | * or we won't get an event when it completes. | ||
| 3155 | * (Unless we use event data TRBs, which are a | ||
| 3156 | * waste of space and HC resources.) | ||
| 3157 | */ | ||
| 3158 | field | TRB_ISP); | ||
| 3159 | running_total += trb_buff_len; | 3328 | running_total += trb_buff_len; |
| 3160 | 3329 | ||
| 3161 | addr += trb_buff_len; | 3330 | addr += trb_buff_len; |
| @@ -3211,8 +3380,8 @@ int xhci_queue_isoc_tx_prepare(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 3211 | /* Check the ring to guarantee there is enough room for the whole urb. | 3380 | /* Check the ring to guarantee there is enough room for the whole urb. |
| 3212 | * Do not insert any td of the urb to the ring if the check failed. | 3381 | * Do not insert any td of the urb to the ring if the check failed. |
| 3213 | */ | 3382 | */ |
| 3214 | ret = prepare_ring(xhci, ep_ring, ep_ctx->ep_info & EP_STATE_MASK, | 3383 | ret = prepare_ring(xhci, ep_ring, le32_to_cpu(ep_ctx->ep_info) & EP_STATE_MASK, |
| 3215 | num_trbs, mem_flags); | 3384 | num_trbs, mem_flags); |
| 3216 | if (ret) | 3385 | if (ret) |
| 3217 | return ret; | 3386 | return ret; |
| 3218 | 3387 | ||
| @@ -3224,7 +3393,7 @@ int xhci_queue_isoc_tx_prepare(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 3224 | urb->dev->speed == USB_SPEED_FULL) | 3393 | urb->dev->speed == USB_SPEED_FULL) |
| 3225 | urb->start_frame >>= 3; | 3394 | urb->start_frame >>= 3; |
| 3226 | 3395 | ||
| 3227 | xhci_interval = EP_INTERVAL_TO_UFRAMES(ep_ctx->ep_info); | 3396 | xhci_interval = EP_INTERVAL_TO_UFRAMES(le32_to_cpu(ep_ctx->ep_info)); |
| 3228 | ep_interval = urb->interval; | 3397 | ep_interval = urb->interval; |
| 3229 | /* Convert to microframes */ | 3398 | /* Convert to microframes */ |
| 3230 | if (urb->dev->speed == USB_SPEED_LOW || | 3399 | if (urb->dev->speed == USB_SPEED_LOW || |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 81b976e4588..8f2a56ece44 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -973,8 +973,8 @@ static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id, | |||
| 973 | 973 | ||
| 974 | out_ctx = xhci->devs[slot_id]->out_ctx; | 974 | out_ctx = xhci->devs[slot_id]->out_ctx; |
| 975 | ep_ctx = xhci_get_ep_ctx(xhci, out_ctx, ep_index); | 975 | ep_ctx = xhci_get_ep_ctx(xhci, out_ctx, ep_index); |
| 976 | hw_max_packet_size = MAX_PACKET_DECODED(ep_ctx->ep_info2); | 976 | hw_max_packet_size = MAX_PACKET_DECODED(le32_to_cpu(ep_ctx->ep_info2)); |
| 977 | max_packet_size = urb->dev->ep0.desc.wMaxPacketSize; | 977 | max_packet_size = le16_to_cpu(urb->dev->ep0.desc.wMaxPacketSize); |
| 978 | if (hw_max_packet_size != max_packet_size) { | 978 | if (hw_max_packet_size != max_packet_size) { |
| 979 | xhci_dbg(xhci, "Max Packet Size for ep 0 changed.\n"); | 979 | xhci_dbg(xhci, "Max Packet Size for ep 0 changed.\n"); |
| 980 | xhci_dbg(xhci, "Max packet size in usb_device = %d\n", | 980 | xhci_dbg(xhci, "Max packet size in usb_device = %d\n", |
| @@ -988,15 +988,15 @@ static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id, | |||
| 988 | xhci->devs[slot_id]->out_ctx, ep_index); | 988 | xhci->devs[slot_id]->out_ctx, ep_index); |
| 989 | in_ctx = xhci->devs[slot_id]->in_ctx; | 989 | in_ctx = xhci->devs[slot_id]->in_ctx; |
| 990 | ep_ctx = xhci_get_ep_ctx(xhci, in_ctx, ep_index); | 990 | ep_ctx = xhci_get_ep_ctx(xhci, in_ctx, ep_index); |
| 991 | ep_ctx->ep_info2 &= ~MAX_PACKET_MASK; | 991 | ep_ctx->ep_info2 &= cpu_to_le32(~MAX_PACKET_MASK); |
| 992 | ep_ctx->ep_info2 |= MAX_PACKET(max_packet_size); | 992 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet_size)); |
| 993 | 993 | ||
| 994 | /* Set up the input context flags for the command */ | 994 | /* Set up the input context flags for the command */ |
| 995 | /* FIXME: This won't work if a non-default control endpoint | 995 | /* FIXME: This won't work if a non-default control endpoint |
| 996 | * changes max packet sizes. | 996 | * changes max packet sizes. |
| 997 | */ | 997 | */ |
| 998 | ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); | 998 | ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); |
| 999 | ctrl_ctx->add_flags = EP0_FLAG; | 999 | ctrl_ctx->add_flags = cpu_to_le32(EP0_FLAG); |
| 1000 | ctrl_ctx->drop_flags = 0; | 1000 | ctrl_ctx->drop_flags = 0; |
| 1001 | 1001 | ||
| 1002 | xhci_dbg(xhci, "Slot %d input context\n", slot_id); | 1002 | xhci_dbg(xhci, "Slot %d input context\n", slot_id); |
| @@ -1010,7 +1010,7 @@ static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id, | |||
| 1010 | /* Clean up the input context for later use by bandwidth | 1010 | /* Clean up the input context for later use by bandwidth |
| 1011 | * functions. | 1011 | * functions. |
| 1012 | */ | 1012 | */ |
| 1013 | ctrl_ctx->add_flags = SLOT_FLAG; | 1013 | ctrl_ctx->add_flags = cpu_to_le32(SLOT_FLAG); |
| 1014 | } | 1014 | } |
| 1015 | return ret; | 1015 | return ret; |
| 1016 | } | 1016 | } |
| @@ -1331,27 +1331,30 @@ int xhci_drop_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 1331 | /* If the HC already knows the endpoint is disabled, | 1331 | /* If the HC already knows the endpoint is disabled, |
| 1332 | * or the HCD has noted it is disabled, ignore this request | 1332 | * or the HCD has noted it is disabled, ignore this request |
| 1333 | */ | 1333 | */ |
| 1334 | if ((ep_ctx->ep_info & EP_STATE_MASK) == EP_STATE_DISABLED || | 1334 | if ((le32_to_cpu(ep_ctx->ep_info) & EP_STATE_MASK) == |
| 1335 | ctrl_ctx->drop_flags & xhci_get_endpoint_flag(&ep->desc)) { | 1335 | EP_STATE_DISABLED || |
| 1336 | le32_to_cpu(ctrl_ctx->drop_flags) & | ||
| 1337 | xhci_get_endpoint_flag(&ep->desc)) { | ||
| 1336 | xhci_warn(xhci, "xHCI %s called with disabled ep %p\n", | 1338 | xhci_warn(xhci, "xHCI %s called with disabled ep %p\n", |
| 1337 | __func__, ep); | 1339 | __func__, ep); |
| 1338 | return 0; | 1340 | return 0; |
| 1339 | } | 1341 | } |
| 1340 | 1342 | ||
| 1341 | ctrl_ctx->drop_flags |= drop_flag; | 1343 | ctrl_ctx->drop_flags |= cpu_to_le32(drop_flag); |
| 1342 | new_drop_flags = ctrl_ctx->drop_flags; | 1344 | new_drop_flags = le32_to_cpu(ctrl_ctx->drop_flags); |
| 1343 | 1345 | ||
| 1344 | ctrl_ctx->add_flags &= ~drop_flag; | 1346 | ctrl_ctx->add_flags &= cpu_to_le32(~drop_flag); |
| 1345 | new_add_flags = ctrl_ctx->add_flags; | 1347 | new_add_flags = le32_to_cpu(ctrl_ctx->add_flags); |
| 1346 | 1348 | ||
| 1347 | last_ctx = xhci_last_valid_endpoint(ctrl_ctx->add_flags); | 1349 | last_ctx = xhci_last_valid_endpoint(le32_to_cpu(ctrl_ctx->add_flags)); |
| 1348 | slot_ctx = xhci_get_slot_ctx(xhci, in_ctx); | 1350 | slot_ctx = xhci_get_slot_ctx(xhci, in_ctx); |
| 1349 | /* Update the last valid endpoint context, if we deleted the last one */ | 1351 | /* Update the last valid endpoint context, if we deleted the last one */ |
| 1350 | if ((slot_ctx->dev_info & LAST_CTX_MASK) > LAST_CTX(last_ctx)) { | 1352 | if ((le32_to_cpu(slot_ctx->dev_info) & LAST_CTX_MASK) > |
| 1351 | slot_ctx->dev_info &= ~LAST_CTX_MASK; | 1353 | LAST_CTX(last_ctx)) { |
| 1352 | slot_ctx->dev_info |= LAST_CTX(last_ctx); | 1354 | slot_ctx->dev_info &= cpu_to_le32(~LAST_CTX_MASK); |
| 1355 | slot_ctx->dev_info |= cpu_to_le32(LAST_CTX(last_ctx)); | ||
| 1353 | } | 1356 | } |
| 1354 | new_slot_info = slot_ctx->dev_info; | 1357 | new_slot_info = le32_to_cpu(slot_ctx->dev_info); |
| 1355 | 1358 | ||
| 1356 | xhci_endpoint_zero(xhci, xhci->devs[udev->slot_id], ep); | 1359 | xhci_endpoint_zero(xhci, xhci->devs[udev->slot_id], ep); |
| 1357 | 1360 | ||
| @@ -1419,7 +1422,8 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 1419 | /* If the HCD has already noted the endpoint is enabled, | 1422 | /* If the HCD has already noted the endpoint is enabled, |
| 1420 | * ignore this request. | 1423 | * ignore this request. |
| 1421 | */ | 1424 | */ |
| 1422 | if (ctrl_ctx->add_flags & xhci_get_endpoint_flag(&ep->desc)) { | 1425 | if (le32_to_cpu(ctrl_ctx->add_flags) & |
| 1426 | xhci_get_endpoint_flag(&ep->desc)) { | ||
| 1423 | xhci_warn(xhci, "xHCI %s called with enabled ep %p\n", | 1427 | xhci_warn(xhci, "xHCI %s called with enabled ep %p\n", |
| 1424 | __func__, ep); | 1428 | __func__, ep); |
| 1425 | return 0; | 1429 | return 0; |
| @@ -1437,8 +1441,8 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 1437 | return -ENOMEM; | 1441 | return -ENOMEM; |
| 1438 | } | 1442 | } |
| 1439 | 1443 | ||
| 1440 | ctrl_ctx->add_flags |= added_ctxs; | 1444 | ctrl_ctx->add_flags |= cpu_to_le32(added_ctxs); |
| 1441 | new_add_flags = ctrl_ctx->add_flags; | 1445 | new_add_flags = le32_to_cpu(ctrl_ctx->add_flags); |
| 1442 | 1446 | ||
| 1443 | /* If xhci_endpoint_disable() was called for this endpoint, but the | 1447 | /* If xhci_endpoint_disable() was called for this endpoint, but the |
| 1444 | * xHC hasn't been notified yet through the check_bandwidth() call, | 1448 | * xHC hasn't been notified yet through the check_bandwidth() call, |
| @@ -1446,15 +1450,16 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 1446 | * descriptors. We must drop and re-add this endpoint, so we leave the | 1450 | * descriptors. We must drop and re-add this endpoint, so we leave the |
| 1447 | * drop flags alone. | 1451 | * drop flags alone. |
| 1448 | */ | 1452 | */ |
| 1449 | new_drop_flags = ctrl_ctx->drop_flags; | 1453 | new_drop_flags = le32_to_cpu(ctrl_ctx->drop_flags); |
| 1450 | 1454 | ||
| 1451 | slot_ctx = xhci_get_slot_ctx(xhci, in_ctx); | 1455 | slot_ctx = xhci_get_slot_ctx(xhci, in_ctx); |
| 1452 | /* Update the last valid endpoint context, if we just added one past */ | 1456 | /* Update the last valid endpoint context, if we just added one past */ |
| 1453 | if ((slot_ctx->dev_info & LAST_CTX_MASK) < LAST_CTX(last_ctx)) { | 1457 | if ((le32_to_cpu(slot_ctx->dev_info) & LAST_CTX_MASK) < |
| 1454 | slot_ctx->dev_info &= ~LAST_CTX_MASK; | 1458 | LAST_CTX(last_ctx)) { |
| 1455 | slot_ctx->dev_info |= LAST_CTX(last_ctx); | 1459 | slot_ctx->dev_info &= cpu_to_le32(~LAST_CTX_MASK); |
| 1460 | slot_ctx->dev_info |= cpu_to_le32(LAST_CTX(last_ctx)); | ||
| 1456 | } | 1461 | } |
| 1457 | new_slot_info = slot_ctx->dev_info; | 1462 | new_slot_info = le32_to_cpu(slot_ctx->dev_info); |
| 1458 | 1463 | ||
| 1459 | /* Store the usb_device pointer for later use */ | 1464 | /* Store the usb_device pointer for later use */ |
| 1460 | ep->hcpriv = udev; | 1465 | ep->hcpriv = udev; |
| @@ -1484,9 +1489,9 @@ static void xhci_zero_in_ctx(struct xhci_hcd *xhci, struct xhci_virt_device *vir | |||
| 1484 | ctrl_ctx->drop_flags = 0; | 1489 | ctrl_ctx->drop_flags = 0; |
| 1485 | ctrl_ctx->add_flags = 0; | 1490 | ctrl_ctx->add_flags = 0; |
| 1486 | slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->in_ctx); | 1491 | slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->in_ctx); |
| 1487 | slot_ctx->dev_info &= ~LAST_CTX_MASK; | 1492 | slot_ctx->dev_info &= cpu_to_le32(~LAST_CTX_MASK); |
| 1488 | /* Endpoint 0 is always valid */ | 1493 | /* Endpoint 0 is always valid */ |
| 1489 | slot_ctx->dev_info |= LAST_CTX(1); | 1494 | slot_ctx->dev_info |= cpu_to_le32(LAST_CTX(1)); |
| 1490 | for (i = 1; i < 31; ++i) { | 1495 | for (i = 1; i < 31; ++i) { |
| 1491 | ep_ctx = xhci_get_ep_ctx(xhci, virt_dev->in_ctx, i); | 1496 | ep_ctx = xhci_get_ep_ctx(xhci, virt_dev->in_ctx, i); |
| 1492 | ep_ctx->ep_info = 0; | 1497 | ep_ctx->ep_info = 0; |
| @@ -1497,7 +1502,7 @@ static void xhci_zero_in_ctx(struct xhci_hcd *xhci, struct xhci_virt_device *vir | |||
| 1497 | } | 1502 | } |
| 1498 | 1503 | ||
| 1499 | static int xhci_configure_endpoint_result(struct xhci_hcd *xhci, | 1504 | static int xhci_configure_endpoint_result(struct xhci_hcd *xhci, |
| 1500 | struct usb_device *udev, int *cmd_status) | 1505 | struct usb_device *udev, u32 *cmd_status) |
| 1501 | { | 1506 | { |
| 1502 | int ret; | 1507 | int ret; |
| 1503 | 1508 | ||
| @@ -1535,7 +1540,7 @@ static int xhci_configure_endpoint_result(struct xhci_hcd *xhci, | |||
| 1535 | } | 1540 | } |
| 1536 | 1541 | ||
| 1537 | static int xhci_evaluate_context_result(struct xhci_hcd *xhci, | 1542 | static int xhci_evaluate_context_result(struct xhci_hcd *xhci, |
| 1538 | struct usb_device *udev, int *cmd_status) | 1543 | struct usb_device *udev, u32 *cmd_status) |
| 1539 | { | 1544 | { |
| 1540 | int ret; | 1545 | int ret; |
| 1541 | struct xhci_virt_device *virt_dev = xhci->devs[udev->slot_id]; | 1546 | struct xhci_virt_device *virt_dev = xhci->devs[udev->slot_id]; |
| @@ -1555,6 +1560,11 @@ static int xhci_evaluate_context_result(struct xhci_hcd *xhci, | |||
| 1555 | xhci_dbg_ctx(xhci, virt_dev->out_ctx, 1); | 1560 | xhci_dbg_ctx(xhci, virt_dev->out_ctx, 1); |
| 1556 | ret = -EINVAL; | 1561 | ret = -EINVAL; |
| 1557 | break; | 1562 | break; |
| 1563 | case COMP_MEL_ERR: | ||
| 1564 | /* Max Exit Latency too large error */ | ||
| 1565 | dev_warn(&udev->dev, "WARN: Max Exit Latency too large\n"); | ||
| 1566 | ret = -EINVAL; | ||
| 1567 | break; | ||
| 1558 | case COMP_SUCCESS: | 1568 | case COMP_SUCCESS: |
| 1559 | dev_dbg(&udev->dev, "Successful evaluate context command\n"); | 1569 | dev_dbg(&udev->dev, "Successful evaluate context command\n"); |
| 1560 | ret = 0; | 1570 | ret = 0; |
| @@ -1581,7 +1591,7 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci, | |||
| 1581 | unsigned long flags; | 1591 | unsigned long flags; |
| 1582 | struct xhci_container_ctx *in_ctx; | 1592 | struct xhci_container_ctx *in_ctx; |
| 1583 | struct completion *cmd_completion; | 1593 | struct completion *cmd_completion; |
| 1584 | int *cmd_status; | 1594 | u32 *cmd_status; |
| 1585 | struct xhci_virt_device *virt_dev; | 1595 | struct xhci_virt_device *virt_dev; |
| 1586 | 1596 | ||
| 1587 | spin_lock_irqsave(&xhci->lock, flags); | 1597 | spin_lock_irqsave(&xhci->lock, flags); |
| @@ -1595,8 +1605,8 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci, | |||
| 1595 | /* Enqueue pointer can be left pointing to the link TRB, | 1605 | /* Enqueue pointer can be left pointing to the link TRB, |
| 1596 | * we must handle that | 1606 | * we must handle that |
| 1597 | */ | 1607 | */ |
| 1598 | if ((command->command_trb->link.control & TRB_TYPE_BITMASK) | 1608 | if ((le32_to_cpu(command->command_trb->link.control) |
| 1599 | == TRB_TYPE(TRB_LINK)) | 1609 | & TRB_TYPE_BITMASK) == TRB_TYPE(TRB_LINK)) |
| 1600 | command->command_trb = | 1610 | command->command_trb = |
| 1601 | xhci->cmd_ring->enq_seg->next->trbs; | 1611 | xhci->cmd_ring->enq_seg->next->trbs; |
| 1602 | 1612 | ||
| @@ -1672,14 +1682,13 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 1672 | 1682 | ||
| 1673 | /* See section 4.6.6 - A0 = 1; A1 = D0 = D1 = 0 */ | 1683 | /* See section 4.6.6 - A0 = 1; A1 = D0 = D1 = 0 */ |
| 1674 | ctrl_ctx = xhci_get_input_control_ctx(xhci, virt_dev->in_ctx); | 1684 | ctrl_ctx = xhci_get_input_control_ctx(xhci, virt_dev->in_ctx); |
| 1675 | ctrl_ctx->add_flags |= SLOT_FLAG; | 1685 | ctrl_ctx->add_flags |= cpu_to_le32(SLOT_FLAG); |
| 1676 | ctrl_ctx->add_flags &= ~EP0_FLAG; | 1686 | ctrl_ctx->add_flags &= cpu_to_le32(~EP0_FLAG); |
| 1677 | ctrl_ctx->drop_flags &= ~SLOT_FLAG; | 1687 | ctrl_ctx->drop_flags &= cpu_to_le32(~(SLOT_FLAG | EP0_FLAG)); |
| 1678 | ctrl_ctx->drop_flags &= ~EP0_FLAG; | ||
| 1679 | xhci_dbg(xhci, "New Input Control Context:\n"); | 1688 | xhci_dbg(xhci, "New Input Control Context:\n"); |
| 1680 | slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->in_ctx); | 1689 | slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->in_ctx); |
| 1681 | xhci_dbg_ctx(xhci, virt_dev->in_ctx, | 1690 | xhci_dbg_ctx(xhci, virt_dev->in_ctx, |
| 1682 | LAST_CTX_TO_EP_NUM(slot_ctx->dev_info)); | 1691 | LAST_CTX_TO_EP_NUM(le32_to_cpu(slot_ctx->dev_info))); |
| 1683 | 1692 | ||
| 1684 | ret = xhci_configure_endpoint(xhci, udev, NULL, | 1693 | ret = xhci_configure_endpoint(xhci, udev, NULL, |
| 1685 | false, false); | 1694 | false, false); |
| @@ -1690,10 +1699,19 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 1690 | 1699 | ||
| 1691 | xhci_dbg(xhci, "Output context after successful config ep cmd:\n"); | 1700 | xhci_dbg(xhci, "Output context after successful config ep cmd:\n"); |
| 1692 | xhci_dbg_ctx(xhci, virt_dev->out_ctx, | 1701 | xhci_dbg_ctx(xhci, virt_dev->out_ctx, |
| 1693 | LAST_CTX_TO_EP_NUM(slot_ctx->dev_info)); | 1702 | LAST_CTX_TO_EP_NUM(le32_to_cpu(slot_ctx->dev_info))); |
| 1694 | 1703 | ||
| 1704 | /* Free any rings that were dropped, but not changed. */ | ||
| 1705 | for (i = 1; i < 31; ++i) { | ||
| 1706 | if ((ctrl_ctx->drop_flags & (1 << (i + 1))) && | ||
| 1707 | !(ctrl_ctx->add_flags & (1 << (i + 1)))) | ||
| 1708 | xhci_free_or_cache_endpoint_ring(xhci, virt_dev, i); | ||
| 1709 | } | ||
| 1695 | xhci_zero_in_ctx(xhci, virt_dev); | 1710 | xhci_zero_in_ctx(xhci, virt_dev); |
| 1696 | /* Install new rings and free or cache any old rings */ | 1711 | /* |
| 1712 | * Install any rings for completely new endpoints or changed endpoints, | ||
| 1713 | * and free or cache any old rings from changed endpoints. | ||
| 1714 | */ | ||
| 1697 | for (i = 1; i < 31; ++i) { | 1715 | for (i = 1; i < 31; ++i) { |
| 1698 | if (!virt_dev->eps[i].new_ring) | 1716 | if (!virt_dev->eps[i].new_ring) |
| 1699 | continue; | 1717 | continue; |
| @@ -1740,10 +1758,10 @@ static void xhci_setup_input_ctx_for_config_ep(struct xhci_hcd *xhci, | |||
| 1740 | { | 1758 | { |
| 1741 | struct xhci_input_control_ctx *ctrl_ctx; | 1759 | struct xhci_input_control_ctx *ctrl_ctx; |
| 1742 | ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); | 1760 | ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); |
| 1743 | ctrl_ctx->add_flags = add_flags; | 1761 | ctrl_ctx->add_flags = cpu_to_le32(add_flags); |
| 1744 | ctrl_ctx->drop_flags = drop_flags; | 1762 | ctrl_ctx->drop_flags = cpu_to_le32(drop_flags); |
| 1745 | xhci_slot_copy(xhci, in_ctx, out_ctx); | 1763 | xhci_slot_copy(xhci, in_ctx, out_ctx); |
| 1746 | ctrl_ctx->add_flags |= SLOT_FLAG; | 1764 | ctrl_ctx->add_flags |= cpu_to_le32(SLOT_FLAG); |
| 1747 | 1765 | ||
| 1748 | xhci_dbg(xhci, "Input Context:\n"); | 1766 | xhci_dbg(xhci, "Input Context:\n"); |
| 1749 | xhci_dbg_ctx(xhci, in_ctx, xhci_last_valid_endpoint(add_flags)); | 1767 | xhci_dbg_ctx(xhci, in_ctx, xhci_last_valid_endpoint(add_flags)); |
| @@ -1772,7 +1790,7 @@ static void xhci_setup_input_ctx_for_quirk(struct xhci_hcd *xhci, | |||
| 1772 | deq_state->new_deq_ptr); | 1790 | deq_state->new_deq_ptr); |
| 1773 | return; | 1791 | return; |
| 1774 | } | 1792 | } |
| 1775 | ep_ctx->deq = addr | deq_state->new_cycle_state; | 1793 | ep_ctx->deq = cpu_to_le64(addr | deq_state->new_cycle_state); |
| 1776 | 1794 | ||
| 1777 | added_ctxs = xhci_get_endpoint_flag_from_index(ep_index); | 1795 | added_ctxs = xhci_get_endpoint_flag_from_index(ep_index); |
| 1778 | xhci_setup_input_ctx_for_config_ep(xhci, xhci->devs[slot_id]->in_ctx, | 1796 | xhci_setup_input_ctx_for_config_ep(xhci, xhci->devs[slot_id]->in_ctx, |
| @@ -2327,8 +2345,8 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 2327 | /* Enqueue pointer can be left pointing to the link TRB, | 2345 | /* Enqueue pointer can be left pointing to the link TRB, |
| 2328 | * we must handle that | 2346 | * we must handle that |
| 2329 | */ | 2347 | */ |
| 2330 | if ((reset_device_cmd->command_trb->link.control & TRB_TYPE_BITMASK) | 2348 | if ((le32_to_cpu(reset_device_cmd->command_trb->link.control) |
| 2331 | == TRB_TYPE(TRB_LINK)) | 2349 | & TRB_TYPE_BITMASK) == TRB_TYPE(TRB_LINK)) |
| 2332 | reset_device_cmd->command_trb = | 2350 | reset_device_cmd->command_trb = |
| 2333 | xhci->cmd_ring->enq_seg->next->trbs; | 2351 | xhci->cmd_ring->enq_seg->next->trbs; |
| 2334 | 2352 | ||
| @@ -2542,6 +2560,17 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 2542 | 2560 | ||
| 2543 | virt_dev = xhci->devs[udev->slot_id]; | 2561 | virt_dev = xhci->devs[udev->slot_id]; |
| 2544 | 2562 | ||
| 2563 | if (WARN_ON(!virt_dev)) { | ||
| 2564 | /* | ||
| 2565 | * In plug/unplug torture test with an NEC controller, | ||
| 2566 | * a zero-dereference was observed once due to virt_dev = 0. | ||
| 2567 | * Print useful debug rather than crash if it is observed again! | ||
| 2568 | */ | ||
| 2569 | xhci_warn(xhci, "Virt dev invalid for slot_id 0x%x!\n", | ||
| 2570 | udev->slot_id); | ||
| 2571 | return -EINVAL; | ||
| 2572 | } | ||
| 2573 | |||
| 2545 | slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->in_ctx); | 2574 | slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->in_ctx); |
| 2546 | /* | 2575 | /* |
| 2547 | * If this is the first Set Address since device plug-in or | 2576 | * If this is the first Set Address since device plug-in or |
| @@ -2609,10 +2638,10 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 2609 | temp_64 = xhci_read_64(xhci, &xhci->op_regs->dcbaa_ptr); | 2638 | temp_64 = xhci_read_64(xhci, &xhci->op_regs->dcbaa_ptr); |
| 2610 | xhci_dbg(xhci, "Op regs DCBAA ptr = %#016llx\n", temp_64); | 2639 | xhci_dbg(xhci, "Op regs DCBAA ptr = %#016llx\n", temp_64); |
| 2611 | xhci_dbg(xhci, "Slot ID %d dcbaa entry @%p = %#016llx\n", | 2640 | xhci_dbg(xhci, "Slot ID %d dcbaa entry @%p = %#016llx\n", |
| 2612 | udev->slot_id, | 2641 | udev->slot_id, |
| 2613 | &xhci->dcbaa->dev_context_ptrs[udev->slot_id], | 2642 | &xhci->dcbaa->dev_context_ptrs[udev->slot_id], |
| 2614 | (unsigned long long) | 2643 | (unsigned long long) |
| 2615 | xhci->dcbaa->dev_context_ptrs[udev->slot_id]); | 2644 | le64_to_cpu(xhci->dcbaa->dev_context_ptrs[udev->slot_id])); |
| 2616 | xhci_dbg(xhci, "Output Context DMA address = %#08llx\n", | 2645 | xhci_dbg(xhci, "Output Context DMA address = %#08llx\n", |
| 2617 | (unsigned long long)virt_dev->out_ctx->dma); | 2646 | (unsigned long long)virt_dev->out_ctx->dma); |
| 2618 | xhci_dbg(xhci, "Slot ID %d Input Context:\n", udev->slot_id); | 2647 | xhci_dbg(xhci, "Slot ID %d Input Context:\n", udev->slot_id); |
| @@ -2626,7 +2655,8 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 2626 | slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->out_ctx); | 2655 | slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->out_ctx); |
| 2627 | /* Use kernel assigned address for devices; store xHC assigned | 2656 | /* Use kernel assigned address for devices; store xHC assigned |
| 2628 | * address locally. */ | 2657 | * address locally. */ |
| 2629 | virt_dev->address = (slot_ctx->dev_state & DEV_ADDR_MASK) + 1; | 2658 | virt_dev->address = (le32_to_cpu(slot_ctx->dev_state) & DEV_ADDR_MASK) |
| 2659 | + 1; | ||
| 2630 | /* Zero the input context control for later use */ | 2660 | /* Zero the input context control for later use */ |
| 2631 | ctrl_ctx = xhci_get_input_control_ctx(xhci, virt_dev->in_ctx); | 2661 | ctrl_ctx = xhci_get_input_control_ctx(xhci, virt_dev->in_ctx); |
| 2632 | ctrl_ctx->add_flags = 0; | 2662 | ctrl_ctx->add_flags = 0; |
| @@ -2670,24 +2700,29 @@ int xhci_update_hub_device(struct usb_hcd *hcd, struct usb_device *hdev, | |||
| 2670 | spin_lock_irqsave(&xhci->lock, flags); | 2700 | spin_lock_irqsave(&xhci->lock, flags); |
| 2671 | xhci_slot_copy(xhci, config_cmd->in_ctx, vdev->out_ctx); | 2701 | xhci_slot_copy(xhci, config_cmd->in_ctx, vdev->out_ctx); |
| 2672 | ctrl_ctx = xhci_get_input_control_ctx(xhci, config_cmd->in_ctx); | 2702 | ctrl_ctx = xhci_get_input_control_ctx(xhci, config_cmd->in_ctx); |
| 2673 | ctrl_ctx->add_flags |= SLOT_FLAG; | 2703 | ctrl_ctx->add_flags |= cpu_to_le32(SLOT_FLAG); |
| 2674 | slot_ctx = xhci_get_slot_ctx(xhci, config_cmd->in_ctx); | 2704 | slot_ctx = xhci_get_slot_ctx(xhci, config_cmd->in_ctx); |
| 2675 | slot_ctx->dev_info |= DEV_HUB; | 2705 | slot_ctx->dev_info |= cpu_to_le32(DEV_HUB); |
| 2676 | if (tt->multi) | 2706 | if (tt->multi) |
| 2677 | slot_ctx->dev_info |= DEV_MTT; | 2707 | slot_ctx->dev_info |= cpu_to_le32(DEV_MTT); |
| 2678 | if (xhci->hci_version > 0x95) { | 2708 | if (xhci->hci_version > 0x95) { |
| 2679 | xhci_dbg(xhci, "xHCI version %x needs hub " | 2709 | xhci_dbg(xhci, "xHCI version %x needs hub " |
| 2680 | "TT think time and number of ports\n", | 2710 | "TT think time and number of ports\n", |
| 2681 | (unsigned int) xhci->hci_version); | 2711 | (unsigned int) xhci->hci_version); |
| 2682 | slot_ctx->dev_info2 |= XHCI_MAX_PORTS(hdev->maxchild); | 2712 | slot_ctx->dev_info2 |= cpu_to_le32(XHCI_MAX_PORTS(hdev->maxchild)); |
| 2683 | /* Set TT think time - convert from ns to FS bit times. | 2713 | /* Set TT think time - convert from ns to FS bit times. |
| 2684 | * 0 = 8 FS bit times, 1 = 16 FS bit times, | 2714 | * 0 = 8 FS bit times, 1 = 16 FS bit times, |
| 2685 | * 2 = 24 FS bit times, 3 = 32 FS bit times. | 2715 | * 2 = 24 FS bit times, 3 = 32 FS bit times. |
| 2716 | * | ||
| 2717 | * xHCI 1.0: this field shall be 0 if the device is not a | ||
| 2718 | * High-spped hub. | ||
| 2686 | */ | 2719 | */ |
| 2687 | think_time = tt->think_time; | 2720 | think_time = tt->think_time; |
| 2688 | if (think_time != 0) | 2721 | if (think_time != 0) |
| 2689 | think_time = (think_time / 666) - 1; | 2722 | think_time = (think_time / 666) - 1; |
| 2690 | slot_ctx->tt_info |= TT_THINK_TIME(think_time); | 2723 | if (xhci->hci_version < 0x100 || hdev->speed == USB_SPEED_HIGH) |
| 2724 | slot_ctx->tt_info |= | ||
| 2725 | cpu_to_le32(TT_THINK_TIME(think_time)); | ||
| 2691 | } else { | 2726 | } else { |
| 2692 | xhci_dbg(xhci, "xHCI version %x doesn't need hub " | 2727 | xhci_dbg(xhci, "xHCI version %x doesn't need hub " |
| 2693 | "TT think time or number of ports\n", | 2728 | "TT think time or number of ports\n", |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index ba1be6b7cc6..e12db7cfb9b 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
| @@ -57,13 +57,13 @@ | |||
| 57 | * @run_regs_off: RTSOFF - Runtime register space offset | 57 | * @run_regs_off: RTSOFF - Runtime register space offset |
| 58 | */ | 58 | */ |
| 59 | struct xhci_cap_regs { | 59 | struct xhci_cap_regs { |
| 60 | u32 hc_capbase; | 60 | __le32 hc_capbase; |
| 61 | u32 hcs_params1; | 61 | __le32 hcs_params1; |
| 62 | u32 hcs_params2; | 62 | __le32 hcs_params2; |
| 63 | u32 hcs_params3; | 63 | __le32 hcs_params3; |
| 64 | u32 hcc_params; | 64 | __le32 hcc_params; |
| 65 | u32 db_off; | 65 | __le32 db_off; |
| 66 | u32 run_regs_off; | 66 | __le32 run_regs_off; |
| 67 | /* Reserved up to (CAPLENGTH - 0x1C) */ | 67 | /* Reserved up to (CAPLENGTH - 0x1C) */ |
| 68 | }; | 68 | }; |
| 69 | 69 | ||
| @@ -155,26 +155,26 @@ struct xhci_cap_regs { | |||
| 155 | * devices. | 155 | * devices. |
| 156 | */ | 156 | */ |
| 157 | struct xhci_op_regs { | 157 | struct xhci_op_regs { |
| 158 | u32 command; | 158 | __le32 command; |
| 159 | u32 status; | 159 | __le32 status; |
| 160 | u32 page_size; | 160 | __le32 page_size; |
| 161 | u32 reserved1; | 161 | __le32 reserved1; |
| 162 | u32 reserved2; | 162 | __le32 reserved2; |
| 163 | u32 dev_notification; | 163 | __le32 dev_notification; |
| 164 | u64 cmd_ring; | 164 | __le64 cmd_ring; |
| 165 | /* rsvd: offset 0x20-2F */ | 165 | /* rsvd: offset 0x20-2F */ |
| 166 | u32 reserved3[4]; | 166 | __le32 reserved3[4]; |
| 167 | u64 dcbaa_ptr; | 167 | __le64 dcbaa_ptr; |
| 168 | u32 config_reg; | 168 | __le32 config_reg; |
| 169 | /* rsvd: offset 0x3C-3FF */ | 169 | /* rsvd: offset 0x3C-3FF */ |
| 170 | u32 reserved4[241]; | 170 | __le32 reserved4[241]; |
| 171 | /* port 1 registers, which serve as a base address for other ports */ | 171 | /* port 1 registers, which serve as a base address for other ports */ |
| 172 | u32 port_status_base; | 172 | __le32 port_status_base; |
| 173 | u32 port_power_base; | 173 | __le32 port_power_base; |
| 174 | u32 port_link_base; | 174 | __le32 port_link_base; |
| 175 | u32 reserved5; | 175 | __le32 reserved5; |
| 176 | /* registers for ports 2-255 */ | 176 | /* registers for ports 2-255 */ |
| 177 | u32 reserved6[NUM_PORT_REGS*254]; | 177 | __le32 reserved6[NUM_PORT_REGS*254]; |
| 178 | }; | 178 | }; |
| 179 | 179 | ||
| 180 | /* USBCMD - USB command - command bitmasks */ | 180 | /* USBCMD - USB command - command bitmasks */ |
| @@ -382,12 +382,12 @@ struct xhci_op_regs { | |||
| 382 | * updates the dequeue pointer. | 382 | * updates the dequeue pointer. |
| 383 | */ | 383 | */ |
| 384 | struct xhci_intr_reg { | 384 | struct xhci_intr_reg { |
| 385 | u32 irq_pending; | 385 | __le32 irq_pending; |
| 386 | u32 irq_control; | 386 | __le32 irq_control; |
| 387 | u32 erst_size; | 387 | __le32 erst_size; |
| 388 | u32 rsvd; | 388 | __le32 rsvd; |
| 389 | u64 erst_base; | 389 | __le64 erst_base; |
| 390 | u64 erst_dequeue; | 390 | __le64 erst_dequeue; |
| 391 | }; | 391 | }; |
| 392 | 392 | ||
| 393 | /* irq_pending bitmasks */ | 393 | /* irq_pending bitmasks */ |
| @@ -432,8 +432,8 @@ struct xhci_intr_reg { | |||
| 432 | * or larger accesses" | 432 | * or larger accesses" |
| 433 | */ | 433 | */ |
| 434 | struct xhci_run_regs { | 434 | struct xhci_run_regs { |
| 435 | u32 microframe_index; | 435 | __le32 microframe_index; |
| 436 | u32 rsvd[7]; | 436 | __le32 rsvd[7]; |
| 437 | struct xhci_intr_reg ir_set[128]; | 437 | struct xhci_intr_reg ir_set[128]; |
| 438 | }; | 438 | }; |
| 439 | 439 | ||
| @@ -447,7 +447,7 @@ struct xhci_run_regs { | |||
| 447 | * Section 5.6 | 447 | * Section 5.6 |
| 448 | */ | 448 | */ |
| 449 | struct xhci_doorbell_array { | 449 | struct xhci_doorbell_array { |
| 450 | u32 doorbell[256]; | 450 | __le32 doorbell[256]; |
| 451 | }; | 451 | }; |
| 452 | 452 | ||
| 453 | #define DB_VALUE(ep, stream) ((((ep) + 1) & 0xff) | ((stream) << 16)) | 453 | #define DB_VALUE(ep, stream) ((((ep) + 1) & 0xff) | ((stream) << 16)) |
| @@ -504,12 +504,12 @@ struct xhci_container_ctx { | |||
| 504 | * reserved at the end of the slot context for HC internal use. | 504 | * reserved at the end of the slot context for HC internal use. |
| 505 | */ | 505 | */ |
| 506 | struct xhci_slot_ctx { | 506 | struct xhci_slot_ctx { |
| 507 | u32 dev_info; | 507 | __le32 dev_info; |
| 508 | u32 dev_info2; | 508 | __le32 dev_info2; |
| 509 | u32 tt_info; | 509 | __le32 tt_info; |
| 510 | u32 dev_state; | 510 | __le32 dev_state; |
| 511 | /* offset 0x10 to 0x1f reserved for HC internal use */ | 511 | /* offset 0x10 to 0x1f reserved for HC internal use */ |
| 512 | u32 reserved[4]; | 512 | __le32 reserved[4]; |
| 513 | }; | 513 | }; |
| 514 | 514 | ||
| 515 | /* dev_info bitmasks */ | 515 | /* dev_info bitmasks */ |
| @@ -580,12 +580,12 @@ struct xhci_slot_ctx { | |||
| 580 | * reserved at the end of the endpoint context for HC internal use. | 580 | * reserved at the end of the endpoint context for HC internal use. |
| 581 | */ | 581 | */ |
| 582 | struct xhci_ep_ctx { | 582 | struct xhci_ep_ctx { |
| 583 | u32 ep_info; | 583 | __le32 ep_info; |
| 584 | u32 ep_info2; | 584 | __le32 ep_info2; |
| 585 | u64 deq; | 585 | __le64 deq; |
| 586 | u32 tx_info; | 586 | __le32 tx_info; |
| 587 | /* offset 0x14 - 0x1f reserved for HC internal use */ | 587 | /* offset 0x14 - 0x1f reserved for HC internal use */ |
| 588 | u32 reserved[3]; | 588 | __le32 reserved[3]; |
| 589 | }; | 589 | }; |
| 590 | 590 | ||
| 591 | /* ep_info bitmasks */ | 591 | /* ep_info bitmasks */ |
| @@ -660,9 +660,9 @@ struct xhci_ep_ctx { | |||
| 660 | * @add_context: set the bit of the endpoint context you want to enable | 660 | * @add_context: set the bit of the endpoint context you want to enable |
| 661 | */ | 661 | */ |
| 662 | struct xhci_input_control_ctx { | 662 | struct xhci_input_control_ctx { |
| 663 | u32 drop_flags; | 663 | __le32 drop_flags; |
| 664 | u32 add_flags; | 664 | __le32 add_flags; |
| 665 | u32 rsvd2[6]; | 665 | __le32 rsvd2[6]; |
| 666 | }; | 666 | }; |
| 667 | 667 | ||
| 668 | /* Represents everything that is needed to issue a command on the command ring. | 668 | /* Represents everything that is needed to issue a command on the command ring. |
| @@ -688,9 +688,9 @@ struct xhci_command { | |||
| 688 | 688 | ||
| 689 | struct xhci_stream_ctx { | 689 | struct xhci_stream_ctx { |
| 690 | /* 64-bit stream ring address, cycle state, and stream type */ | 690 | /* 64-bit stream ring address, cycle state, and stream type */ |
| 691 | u64 stream_ring; | 691 | __le64 stream_ring; |
| 692 | /* offset 0x14 - 0x1f reserved for HC internal use */ | 692 | /* offset 0x14 - 0x1f reserved for HC internal use */ |
| 693 | u32 reserved[2]; | 693 | __le32 reserved[2]; |
| 694 | }; | 694 | }; |
| 695 | 695 | ||
| 696 | /* Stream Context Types (section 6.4.1) - bits 3:1 of stream ctx deq ptr */ | 696 | /* Stream Context Types (section 6.4.1) - bits 3:1 of stream ctx deq ptr */ |
| @@ -803,7 +803,7 @@ struct xhci_virt_device { | |||
| 803 | */ | 803 | */ |
| 804 | struct xhci_device_context_array { | 804 | struct xhci_device_context_array { |
| 805 | /* 64-bit device addresses; we only write 32-bit addresses */ | 805 | /* 64-bit device addresses; we only write 32-bit addresses */ |
| 806 | u64 dev_context_ptrs[MAX_HC_SLOTS]; | 806 | __le64 dev_context_ptrs[MAX_HC_SLOTS]; |
| 807 | /* private xHCD pointers */ | 807 | /* private xHCD pointers */ |
| 808 | dma_addr_t dma; | 808 | dma_addr_t dma; |
| 809 | }; | 809 | }; |
| @@ -816,10 +816,10 @@ struct xhci_device_context_array { | |||
| 816 | 816 | ||
| 817 | struct xhci_transfer_event { | 817 | struct xhci_transfer_event { |
| 818 | /* 64-bit buffer address, or immediate data */ | 818 | /* 64-bit buffer address, or immediate data */ |
| 819 | u64 buffer; | 819 | __le64 buffer; |
| 820 | u32 transfer_len; | 820 | __le32 transfer_len; |
| 821 | /* This field is interpreted differently based on the type of TRB */ | 821 | /* This field is interpreted differently based on the type of TRB */ |
| 822 | u32 flags; | 822 | __le32 flags; |
| 823 | }; | 823 | }; |
| 824 | 824 | ||
| 825 | /** Transfer Event bit fields **/ | 825 | /** Transfer Event bit fields **/ |
| @@ -881,7 +881,9 @@ struct xhci_transfer_event { | |||
| 881 | #define COMP_STOP_INVAL 27 | 881 | #define COMP_STOP_INVAL 27 |
| 882 | /* Control Abort Error - Debug Capability - control pipe aborted */ | 882 | /* Control Abort Error - Debug Capability - control pipe aborted */ |
| 883 | #define COMP_DBG_ABORT 28 | 883 | #define COMP_DBG_ABORT 28 |
| 884 | /* TRB type 29 and 30 reserved */ | 884 | /* Max Exit Latency Too Large Error */ |
| 885 | #define COMP_MEL_ERR 29 | ||
| 886 | /* TRB type 30 reserved */ | ||
| 885 | /* Isoc Buffer Overrun - an isoc IN ep sent more data than could fit in TD */ | 887 | /* Isoc Buffer Overrun - an isoc IN ep sent more data than could fit in TD */ |
| 886 | #define COMP_BUFF_OVER 31 | 888 | #define COMP_BUFF_OVER 31 |
| 887 | /* Event Lost Error - xHC has an "internal event overrun condition" */ | 889 | /* Event Lost Error - xHC has an "internal event overrun condition" */ |
| @@ -898,9 +900,9 @@ struct xhci_transfer_event { | |||
| 898 | 900 | ||
| 899 | struct xhci_link_trb { | 901 | struct xhci_link_trb { |
| 900 | /* 64-bit segment pointer*/ | 902 | /* 64-bit segment pointer*/ |
| 901 | u64 segment_ptr; | 903 | __le64 segment_ptr; |
| 902 | u32 intr_target; | 904 | __le32 intr_target; |
| 903 | u32 control; | 905 | __le32 control; |
| 904 | }; | 906 | }; |
| 905 | 907 | ||
| 906 | /* control bitfields */ | 908 | /* control bitfields */ |
| @@ -909,9 +911,9 @@ struct xhci_link_trb { | |||
| 909 | /* Command completion event TRB */ | 911 | /* Command completion event TRB */ |
| 910 | struct xhci_event_cmd { | 912 | struct xhci_event_cmd { |
| 911 | /* Pointer to command TRB, or the value passed by the event data trb */ | 913 | /* Pointer to command TRB, or the value passed by the event data trb */ |
| 912 | u64 cmd_trb; | 914 | __le64 cmd_trb; |
| 913 | u32 status; | 915 | __le32 status; |
| 914 | u32 flags; | 916 | __le32 flags; |
| 915 | }; | 917 | }; |
| 916 | 918 | ||
| 917 | /* flags bitmasks */ | 919 | /* flags bitmasks */ |
| @@ -943,6 +945,8 @@ struct xhci_event_cmd { | |||
| 943 | /* Interrupter Target - which MSI-X vector to target the completion event at */ | 945 | /* Interrupter Target - which MSI-X vector to target the completion event at */ |
| 944 | #define TRB_INTR_TARGET(p) (((p) & 0x3ff) << 22) | 946 | #define TRB_INTR_TARGET(p) (((p) & 0x3ff) << 22) |
| 945 | #define GET_INTR_TARGET(p) (((p) >> 22) & 0x3ff) | 947 | #define GET_INTR_TARGET(p) (((p) >> 22) & 0x3ff) |
| 948 | #define TRB_TBC(p) (((p) & 0x3) << 7) | ||
| 949 | #define TRB_TLBPC(p) (((p) & 0xf) << 16) | ||
| 946 | 950 | ||
| 947 | /* Cycle bit - indicates TRB ownership by HC or HCD */ | 951 | /* Cycle bit - indicates TRB ownership by HC or HCD */ |
| 948 | #define TRB_CYCLE (1<<0) | 952 | #define TRB_CYCLE (1<<0) |
| @@ -962,15 +966,20 @@ struct xhci_event_cmd { | |||
| 962 | /* The buffer pointer contains immediate data */ | 966 | /* The buffer pointer contains immediate data */ |
| 963 | #define TRB_IDT (1<<6) | 967 | #define TRB_IDT (1<<6) |
| 964 | 968 | ||
| 969 | /* Block Event Interrupt */ | ||
| 970 | #define TRB_BEI (1<<9) | ||
| 965 | 971 | ||
| 966 | /* Control transfer TRB specific fields */ | 972 | /* Control transfer TRB specific fields */ |
| 967 | #define TRB_DIR_IN (1<<16) | 973 | #define TRB_DIR_IN (1<<16) |
| 974 | #define TRB_TX_TYPE(p) ((p) << 16) | ||
| 975 | #define TRB_DATA_OUT 2 | ||
| 976 | #define TRB_DATA_IN 3 | ||
| 968 | 977 | ||
| 969 | /* Isochronous TRB specific fields */ | 978 | /* Isochronous TRB specific fields */ |
| 970 | #define TRB_SIA (1<<31) | 979 | #define TRB_SIA (1<<31) |
| 971 | 980 | ||
| 972 | struct xhci_generic_trb { | 981 | struct xhci_generic_trb { |
| 973 | u32 field[4]; | 982 | __le32 field[4]; |
| 974 | }; | 983 | }; |
| 975 | 984 | ||
| 976 | union xhci_trb { | 985 | union xhci_trb { |
| @@ -1118,10 +1127,10 @@ struct xhci_ring { | |||
| 1118 | 1127 | ||
| 1119 | struct xhci_erst_entry { | 1128 | struct xhci_erst_entry { |
| 1120 | /* 64-bit event ring segment address */ | 1129 | /* 64-bit event ring segment address */ |
| 1121 | u64 seg_addr; | 1130 | __le64 seg_addr; |
| 1122 | u32 seg_size; | 1131 | __le32 seg_size; |
| 1123 | /* Set to zero */ | 1132 | /* Set to zero */ |
| 1124 | u32 rsvd; | 1133 | __le32 rsvd; |
| 1125 | }; | 1134 | }; |
| 1126 | 1135 | ||
| 1127 | struct xhci_erst { | 1136 | struct xhci_erst { |
| @@ -1286,10 +1295,10 @@ struct xhci_hcd { | |||
| 1286 | /* Is each xHCI roothub port a USB 3.0, USB 2.0, or USB 1.1 port? */ | 1295 | /* Is each xHCI roothub port a USB 3.0, USB 2.0, or USB 1.1 port? */ |
| 1287 | u8 *port_array; | 1296 | u8 *port_array; |
| 1288 | /* Array of pointers to USB 3.0 PORTSC registers */ | 1297 | /* Array of pointers to USB 3.0 PORTSC registers */ |
| 1289 | u32 __iomem **usb3_ports; | 1298 | __le32 __iomem **usb3_ports; |
| 1290 | unsigned int num_usb3_ports; | 1299 | unsigned int num_usb3_ports; |
| 1291 | /* Array of pointers to USB 2.0 PORTSC registers */ | 1300 | /* Array of pointers to USB 2.0 PORTSC registers */ |
| 1292 | u32 __iomem **usb2_ports; | 1301 | __le32 __iomem **usb2_ports; |
| 1293 | unsigned int num_usb2_ports; | 1302 | unsigned int num_usb2_ports; |
| 1294 | }; | 1303 | }; |
| 1295 | 1304 | ||
| @@ -1322,12 +1331,12 @@ static inline struct usb_hcd *xhci_to_hcd(struct xhci_hcd *xhci) | |||
| 1322 | /* TODO: copied from ehci.h - can be refactored? */ | 1331 | /* TODO: copied from ehci.h - can be refactored? */ |
| 1323 | /* xHCI spec says all registers are little endian */ | 1332 | /* xHCI spec says all registers are little endian */ |
| 1324 | static inline unsigned int xhci_readl(const struct xhci_hcd *xhci, | 1333 | static inline unsigned int xhci_readl(const struct xhci_hcd *xhci, |
| 1325 | __u32 __iomem *regs) | 1334 | __le32 __iomem *regs) |
| 1326 | { | 1335 | { |
| 1327 | return readl(regs); | 1336 | return readl(regs); |
| 1328 | } | 1337 | } |
| 1329 | static inline void xhci_writel(struct xhci_hcd *xhci, | 1338 | static inline void xhci_writel(struct xhci_hcd *xhci, |
| 1330 | const unsigned int val, __u32 __iomem *regs) | 1339 | const unsigned int val, __le32 __iomem *regs) |
| 1331 | { | 1340 | { |
| 1332 | xhci_dbg(xhci, | 1341 | xhci_dbg(xhci, |
| 1333 | "`MEM_WRITE_DWORD(3'b000, 32'h%p, 32'h%0x, 4'hf);\n", | 1342 | "`MEM_WRITE_DWORD(3'b000, 32'h%p, 32'h%0x, 4'hf);\n", |
| @@ -1345,7 +1354,7 @@ static inline void xhci_writel(struct xhci_hcd *xhci, | |||
| 1345 | * the high dword, and write order is irrelevant. | 1354 | * the high dword, and write order is irrelevant. |
| 1346 | */ | 1355 | */ |
| 1347 | static inline u64 xhci_read_64(const struct xhci_hcd *xhci, | 1356 | static inline u64 xhci_read_64(const struct xhci_hcd *xhci, |
| 1348 | __u64 __iomem *regs) | 1357 | __le64 __iomem *regs) |
| 1349 | { | 1358 | { |
| 1350 | __u32 __iomem *ptr = (__u32 __iomem *) regs; | 1359 | __u32 __iomem *ptr = (__u32 __iomem *) regs; |
| 1351 | u64 val_lo = readl(ptr); | 1360 | u64 val_lo = readl(ptr); |
| @@ -1353,7 +1362,7 @@ static inline u64 xhci_read_64(const struct xhci_hcd *xhci, | |||
| 1353 | return val_lo + (val_hi << 32); | 1362 | return val_lo + (val_hi << 32); |
| 1354 | } | 1363 | } |
| 1355 | static inline void xhci_write_64(struct xhci_hcd *xhci, | 1364 | static inline void xhci_write_64(struct xhci_hcd *xhci, |
| 1356 | const u64 val, __u64 __iomem *regs) | 1365 | const u64 val, __le64 __iomem *regs) |
| 1357 | { | 1366 | { |
| 1358 | __u32 __iomem *ptr = (__u32 __iomem *) regs; | 1367 | __u32 __iomem *ptr = (__u32 __iomem *) regs; |
| 1359 | u32 val_lo = lower_32_bits(val); | 1368 | u32 val_lo = lower_32_bits(val); |
diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c index 7839c98fa74..b16bd3ce391 100644 --- a/drivers/usb/misc/ftdi-elan.c +++ b/drivers/usb/misc/ftdi-elan.c | |||
| @@ -2889,8 +2889,7 @@ static struct usb_driver ftdi_elan_driver = { | |||
| 2889 | static int __init ftdi_elan_init(void) | 2889 | static int __init ftdi_elan_init(void) |
| 2890 | { | 2890 | { |
| 2891 | int result; | 2891 | int result; |
| 2892 | printk(KERN_INFO "driver %s built at %s on %s\n", ftdi_elan_driver.name, | 2892 | printk(KERN_INFO "driver %s\n", ftdi_elan_driver.name); |
| 2893 | __TIME__, __DATE__); | ||
| 2894 | mutex_init(&ftdi_module_lock); | 2893 | mutex_init(&ftdi_module_lock); |
| 2895 | INIT_LIST_HEAD(&ftdi_static_list); | 2894 | INIT_LIST_HEAD(&ftdi_static_list); |
| 2896 | status_queue = create_singlethread_workqueue("ftdi-status-control"); | 2895 | status_queue = create_singlethread_workqueue("ftdi-status-control"); |
diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c index eefb8275bb7..cb4096201e2 100644 --- a/drivers/usb/misc/ldusb.c +++ b/drivers/usb/misc/ldusb.c | |||
| @@ -20,11 +20,6 @@ | |||
| 20 | * Derived from Lego USB Tower driver | 20 | * Derived from Lego USB Tower driver |
| 21 | * Copyright (C) 2003 David Glance <advidgsf@sourceforge.net> | 21 | * Copyright (C) 2003 David Glance <advidgsf@sourceforge.net> |
| 22 | * 2001-2004 Juergen Stuber <starblue@users.sourceforge.net> | 22 | * 2001-2004 Juergen Stuber <starblue@users.sourceforge.net> |
| 23 | * | ||
| 24 | * V0.1 (mh) Initial version | ||
| 25 | * V0.11 (mh) Added raw support for HID 1.0 devices (no interrupt out endpoint) | ||
| 26 | * V0.12 (mh) Added kmalloc check for string buffer | ||
| 27 | * V0.13 (mh) Added support for LD X-Ray and Machine Test System | ||
| 28 | */ | 23 | */ |
| 29 | 24 | ||
| 30 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
| @@ -41,20 +36,39 @@ | |||
| 41 | 36 | ||
| 42 | /* Define these values to match your devices */ | 37 | /* Define these values to match your devices */ |
| 43 | #define USB_VENDOR_ID_LD 0x0f11 /* USB Vendor ID of LD Didactic GmbH */ | 38 | #define USB_VENDOR_ID_LD 0x0f11 /* USB Vendor ID of LD Didactic GmbH */ |
| 44 | #define USB_DEVICE_ID_LD_CASSY 0x1000 /* USB Product ID of CASSY-S */ | 39 | #define USB_DEVICE_ID_LD_CASSY 0x1000 /* USB Product ID of CASSY-S modules with 8 bytes endpoint size */ |
| 40 | #define USB_DEVICE_ID_LD_CASSY2 0x1001 /* USB Product ID of CASSY-S modules with 64 bytes endpoint size */ | ||
| 45 | #define USB_DEVICE_ID_LD_POCKETCASSY 0x1010 /* USB Product ID of Pocket-CASSY */ | 41 | #define USB_DEVICE_ID_LD_POCKETCASSY 0x1010 /* USB Product ID of Pocket-CASSY */ |
| 42 | #define USB_DEVICE_ID_LD_POCKETCASSY2 0x1011 /* USB Product ID of Pocket-CASSY 2 (reserved) */ | ||
| 46 | #define USB_DEVICE_ID_LD_MOBILECASSY 0x1020 /* USB Product ID of Mobile-CASSY */ | 43 | #define USB_DEVICE_ID_LD_MOBILECASSY 0x1020 /* USB Product ID of Mobile-CASSY */ |
| 44 | #define USB_DEVICE_ID_LD_MOBILECASSY2 0x1021 /* USB Product ID of Mobile-CASSY 2 (reserved) */ | ||
| 45 | #define USB_DEVICE_ID_LD_MICROCASSYVOLTAGE 0x1031 /* USB Product ID of Micro-CASSY Voltage */ | ||
| 46 | #define USB_DEVICE_ID_LD_MICROCASSYCURRENT 0x1032 /* USB Product ID of Micro-CASSY Current */ | ||
| 47 | #define USB_DEVICE_ID_LD_MICROCASSYTIME 0x1033 /* USB Product ID of Micro-CASSY Time (reserved) */ | ||
| 48 | #define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE 0x1035 /* USB Product ID of Micro-CASSY Temperature */ | ||
| 49 | #define USB_DEVICE_ID_LD_MICROCASSYPH 0x1038 /* USB Product ID of Micro-CASSY pH */ | ||
| 47 | #define USB_DEVICE_ID_LD_JWM 0x1080 /* USB Product ID of Joule and Wattmeter */ | 50 | #define USB_DEVICE_ID_LD_JWM 0x1080 /* USB Product ID of Joule and Wattmeter */ |
| 48 | #define USB_DEVICE_ID_LD_DMMP 0x1081 /* USB Product ID of Digital Multimeter P (reserved) */ | 51 | #define USB_DEVICE_ID_LD_DMMP 0x1081 /* USB Product ID of Digital Multimeter P (reserved) */ |
| 49 | #define USB_DEVICE_ID_LD_UMIP 0x1090 /* USB Product ID of UMI P */ | 52 | #define USB_DEVICE_ID_LD_UMIP 0x1090 /* USB Product ID of UMI P */ |
| 50 | #define USB_DEVICE_ID_LD_XRAY1 0x1100 /* USB Product ID of X-Ray Apparatus */ | 53 | #define USB_DEVICE_ID_LD_UMIC 0x10A0 /* USB Product ID of UMI C */ |
| 51 | #define USB_DEVICE_ID_LD_XRAY2 0x1101 /* USB Product ID of X-Ray Apparatus */ | 54 | #define USB_DEVICE_ID_LD_UMIB 0x10B0 /* USB Product ID of UMI B */ |
| 55 | #define USB_DEVICE_ID_LD_XRAY 0x1100 /* USB Product ID of X-Ray Apparatus 55481 */ | ||
| 56 | #define USB_DEVICE_ID_LD_XRAY2 0x1101 /* USB Product ID of X-Ray Apparatus 554800 */ | ||
| 57 | #define USB_DEVICE_ID_LD_XRAYCT 0x1110 /* USB Product ID of X-Ray Apparatus CT 554821*/ | ||
| 52 | #define USB_DEVICE_ID_LD_VIDEOCOM 0x1200 /* USB Product ID of VideoCom */ | 58 | #define USB_DEVICE_ID_LD_VIDEOCOM 0x1200 /* USB Product ID of VideoCom */ |
| 59 | #define USB_DEVICE_ID_LD_MOTOR 0x1210 /* USB Product ID of Motor (reserved) */ | ||
| 53 | #define USB_DEVICE_ID_LD_COM3LAB 0x2000 /* USB Product ID of COM3LAB */ | 60 | #define USB_DEVICE_ID_LD_COM3LAB 0x2000 /* USB Product ID of COM3LAB */ |
| 54 | #define USB_DEVICE_ID_LD_TELEPORT 0x2010 /* USB Product ID of Terminal Adapter */ | 61 | #define USB_DEVICE_ID_LD_TELEPORT 0x2010 /* USB Product ID of Terminal Adapter */ |
| 55 | #define USB_DEVICE_ID_LD_NETWORKANALYSER 0x2020 /* USB Product ID of Network Analyser */ | 62 | #define USB_DEVICE_ID_LD_NETWORKANALYSER 0x2020 /* USB Product ID of Network Analyser */ |
| 56 | #define USB_DEVICE_ID_LD_POWERCONTROL 0x2030 /* USB Product ID of Converter Control Unit */ | 63 | #define USB_DEVICE_ID_LD_POWERCONTROL 0x2030 /* USB Product ID of Converter Control Unit */ |
| 57 | #define USB_DEVICE_ID_LD_MACHINETEST 0x2040 /* USB Product ID of Machine Test System */ | 64 | #define USB_DEVICE_ID_LD_MACHINETEST 0x2040 /* USB Product ID of Machine Test System */ |
| 65 | #define USB_DEVICE_ID_LD_MOSTANALYSER 0x2050 /* USB Product ID of MOST Protocol Analyser */ | ||
| 66 | #define USB_DEVICE_ID_LD_MOSTANALYSER2 0x2051 /* USB Product ID of MOST Protocol Analyser 2 */ | ||
| 67 | #define USB_DEVICE_ID_LD_ABSESP 0x2060 /* USB Product ID of ABS ESP */ | ||
| 68 | #define USB_DEVICE_ID_LD_AUTODATABUS 0x2070 /* USB Product ID of Automotive Data Buses */ | ||
| 69 | #define USB_DEVICE_ID_LD_MCT 0x2080 /* USB Product ID of Microcontroller technique */ | ||
| 70 | #define USB_DEVICE_ID_LD_HYBRID 0x2090 /* USB Product ID of Automotive Hybrid */ | ||
| 71 | #define USB_DEVICE_ID_LD_HEATCONTROL 0x20A0 /* USB Product ID of Heat control */ | ||
| 58 | 72 | ||
| 59 | #define USB_VENDOR_ID_VERNIER 0x08f7 | 73 | #define USB_VENDOR_ID_VERNIER 0x08f7 |
| 60 | #define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002 | 74 | #define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002 |
| @@ -71,19 +85,37 @@ | |||
| 71 | /* table of devices that work with this driver */ | 85 | /* table of devices that work with this driver */ |
| 72 | static const struct usb_device_id ld_usb_table[] = { | 86 | static const struct usb_device_id ld_usb_table[] = { |
| 73 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) }, | 87 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) }, |
| 88 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY2) }, | ||
| 74 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) }, | 89 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) }, |
| 90 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY2) }, | ||
| 75 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY) }, | 91 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY) }, |
| 92 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY2) }, | ||
| 93 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYVOLTAGE) }, | ||
| 94 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYCURRENT) }, | ||
| 95 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) }, | ||
| 96 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) }, | ||
| 97 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) }, | ||
| 76 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) }, | 98 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) }, |
| 77 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) }, | 99 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) }, |
| 78 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) }, | 100 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) }, |
| 79 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY1) }, | 101 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIC) }, |
| 102 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIB) }, | ||
| 103 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY) }, | ||
| 80 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY2) }, | 104 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY2) }, |
| 81 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_VIDEOCOM) }, | 105 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_VIDEOCOM) }, |
| 106 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOTOR) }, | ||
| 82 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_COM3LAB) }, | 107 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_COM3LAB) }, |
| 83 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_TELEPORT) }, | 108 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_TELEPORT) }, |
| 84 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_NETWORKANALYSER) }, | 109 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_NETWORKANALYSER) }, |
| 85 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERCONTROL) }, | 110 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERCONTROL) }, |
| 86 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETEST) }, | 111 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETEST) }, |
| 112 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOSTANALYSER) }, | ||
| 113 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOSTANALYSER2) }, | ||
| 114 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_ABSESP) }, | ||
| 115 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_AUTODATABUS) }, | ||
| 116 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MCT) }, | ||
| 117 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HYBRID) }, | ||
| 118 | { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HEATCONTROL) }, | ||
| 87 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) }, | 119 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) }, |
| 88 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) }, | 120 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) }, |
| 89 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) }, | 121 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) }, |
| @@ -91,7 +123,7 @@ static const struct usb_device_id ld_usb_table[] = { | |||
| 91 | { } /* Terminating entry */ | 123 | { } /* Terminating entry */ |
| 92 | }; | 124 | }; |
| 93 | MODULE_DEVICE_TABLE(usb, ld_usb_table); | 125 | MODULE_DEVICE_TABLE(usb, ld_usb_table); |
| 94 | MODULE_VERSION("V0.13"); | 126 | MODULE_VERSION("V0.14"); |
| 95 | MODULE_AUTHOR("Michael Hund <mhund@ld-didactic.de>"); | 127 | MODULE_AUTHOR("Michael Hund <mhund@ld-didactic.de>"); |
| 96 | MODULE_DESCRIPTION("LD USB Driver"); | 128 | MODULE_DESCRIPTION("LD USB Driver"); |
| 97 | MODULE_LICENSE("GPL"); | 129 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index ff9a01f8d40..bb10846affc 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c | |||
| @@ -268,9 +268,9 @@ static inline void simple_fill_buf(struct urb *urb) | |||
| 268 | } | 268 | } |
| 269 | } | 269 | } |
| 270 | 270 | ||
| 271 | static inline unsigned buffer_offset(void *buf) | 271 | static inline unsigned long buffer_offset(void *buf) |
| 272 | { | 272 | { |
| 273 | return (unsigned)buf & (ARCH_KMALLOC_MINALIGN - 1); | 273 | return (unsigned long)buf & (ARCH_KMALLOC_MINALIGN - 1); |
| 274 | } | 274 | } |
| 275 | 275 | ||
| 276 | static int check_guard_bytes(struct usbtest_dev *tdev, struct urb *urb) | 276 | static int check_guard_bytes(struct usbtest_dev *tdev, struct urb *urb) |
| @@ -329,7 +329,7 @@ static int simple_check_buf(struct usbtest_dev *tdev, struct urb *urb) | |||
| 329 | 329 | ||
| 330 | static void simple_free_urb(struct urb *urb) | 330 | static void simple_free_urb(struct urb *urb) |
| 331 | { | 331 | { |
| 332 | unsigned offset = buffer_offset(urb->transfer_buffer); | 332 | unsigned long offset = buffer_offset(urb->transfer_buffer); |
| 333 | 333 | ||
| 334 | if (urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP) | 334 | if (urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP) |
| 335 | usb_free_coherent( | 335 | usb_free_coherent( |
| @@ -1030,6 +1030,8 @@ test_ctrl_queue(struct usbtest_dev *dev, struct usbtest_param *param) | |||
| 1030 | req.wValue = cpu_to_le16((USB_DT_DEVICE << 8) | 0); | 1030 | req.wValue = cpu_to_le16((USB_DT_DEVICE << 8) | 0); |
| 1031 | /* device descriptor size == 18 bytes */ | 1031 | /* device descriptor size == 18 bytes */ |
| 1032 | len = udev->descriptor.bMaxPacketSize0; | 1032 | len = udev->descriptor.bMaxPacketSize0; |
| 1033 | if (udev->speed == USB_SPEED_SUPER) | ||
| 1034 | len = 512; | ||
| 1033 | switch (len) { | 1035 | switch (len) { |
| 1034 | case 8: | 1036 | case 8: |
| 1035 | len = 24; | 1037 | len = 24; |
| @@ -1195,6 +1197,104 @@ static int unlink_simple(struct usbtest_dev *dev, int pipe, int len) | |||
| 1195 | 1197 | ||
| 1196 | /*-------------------------------------------------------------------------*/ | 1198 | /*-------------------------------------------------------------------------*/ |
| 1197 | 1199 | ||
| 1200 | struct queued_ctx { | ||
| 1201 | struct completion complete; | ||
| 1202 | atomic_t pending; | ||
| 1203 | unsigned num; | ||
| 1204 | int status; | ||
| 1205 | struct urb **urbs; | ||
| 1206 | }; | ||
| 1207 | |||
| 1208 | static void unlink_queued_callback(struct urb *urb) | ||
| 1209 | { | ||
| 1210 | int status = urb->status; | ||
| 1211 | struct queued_ctx *ctx = urb->context; | ||
| 1212 | |||
| 1213 | if (ctx->status) | ||
| 1214 | goto done; | ||
| 1215 | if (urb == ctx->urbs[ctx->num - 4] || urb == ctx->urbs[ctx->num - 2]) { | ||
| 1216 | if (status == -ECONNRESET) | ||
| 1217 | goto done; | ||
| 1218 | /* What error should we report if the URB completed normally? */ | ||
| 1219 | } | ||
| 1220 | if (status != 0) | ||
| 1221 | ctx->status = status; | ||
| 1222 | |||
| 1223 | done: | ||
| 1224 | if (atomic_dec_and_test(&ctx->pending)) | ||
| 1225 | complete(&ctx->complete); | ||
| 1226 | } | ||
| 1227 | |||
| 1228 | static int unlink_queued(struct usbtest_dev *dev, int pipe, unsigned num, | ||
| 1229 | unsigned size) | ||
| 1230 | { | ||
| 1231 | struct queued_ctx ctx; | ||
| 1232 | struct usb_device *udev = testdev_to_usbdev(dev); | ||
| 1233 | void *buf; | ||
| 1234 | dma_addr_t buf_dma; | ||
| 1235 | int i; | ||
| 1236 | int retval = -ENOMEM; | ||
| 1237 | |||
| 1238 | init_completion(&ctx.complete); | ||
| 1239 | atomic_set(&ctx.pending, 1); /* One more than the actual value */ | ||
| 1240 | ctx.num = num; | ||
| 1241 | ctx.status = 0; | ||
| 1242 | |||
| 1243 | buf = usb_alloc_coherent(udev, size, GFP_KERNEL, &buf_dma); | ||
| 1244 | if (!buf) | ||
| 1245 | return retval; | ||
| 1246 | memset(buf, 0, size); | ||
| 1247 | |||
| 1248 | /* Allocate and init the urbs we'll queue */ | ||
| 1249 | ctx.urbs = kcalloc(num, sizeof(struct urb *), GFP_KERNEL); | ||
| 1250 | if (!ctx.urbs) | ||
| 1251 | goto free_buf; | ||
| 1252 | for (i = 0; i < num; i++) { | ||
| 1253 | ctx.urbs[i] = usb_alloc_urb(0, GFP_KERNEL); | ||
| 1254 | if (!ctx.urbs[i]) | ||
| 1255 | goto free_urbs; | ||
| 1256 | usb_fill_bulk_urb(ctx.urbs[i], udev, pipe, buf, size, | ||
| 1257 | unlink_queued_callback, &ctx); | ||
| 1258 | ctx.urbs[i]->transfer_dma = buf_dma; | ||
| 1259 | ctx.urbs[i]->transfer_flags = URB_NO_TRANSFER_DMA_MAP; | ||
| 1260 | } | ||
| 1261 | |||
| 1262 | /* Submit all the URBs and then unlink URBs num - 4 and num - 2. */ | ||
| 1263 | for (i = 0; i < num; i++) { | ||
| 1264 | atomic_inc(&ctx.pending); | ||
| 1265 | retval = usb_submit_urb(ctx.urbs[i], GFP_KERNEL); | ||
| 1266 | if (retval != 0) { | ||
| 1267 | dev_err(&dev->intf->dev, "submit urbs[%d] fail %d\n", | ||
| 1268 | i, retval); | ||
| 1269 | atomic_dec(&ctx.pending); | ||
| 1270 | ctx.status = retval; | ||
| 1271 | break; | ||
| 1272 | } | ||
| 1273 | } | ||
| 1274 | if (i == num) { | ||
| 1275 | usb_unlink_urb(ctx.urbs[num - 4]); | ||
| 1276 | usb_unlink_urb(ctx.urbs[num - 2]); | ||
| 1277 | } else { | ||
| 1278 | while (--i >= 0) | ||
| 1279 | usb_unlink_urb(ctx.urbs[i]); | ||
| 1280 | } | ||
| 1281 | |||
| 1282 | if (atomic_dec_and_test(&ctx.pending)) /* The extra count */ | ||
| 1283 | complete(&ctx.complete); | ||
| 1284 | wait_for_completion(&ctx.complete); | ||
| 1285 | retval = ctx.status; | ||
| 1286 | |||
| 1287 | free_urbs: | ||
| 1288 | for (i = 0; i < num; i++) | ||
| 1289 | usb_free_urb(ctx.urbs[i]); | ||
| 1290 | kfree(ctx.urbs); | ||
| 1291 | free_buf: | ||
| 1292 | usb_free_coherent(udev, size, buf, buf_dma); | ||
| 1293 | return retval; | ||
| 1294 | } | ||
| 1295 | |||
| 1296 | /*-------------------------------------------------------------------------*/ | ||
| 1297 | |||
| 1198 | static int verify_not_halted(struct usbtest_dev *tdev, int ep, struct urb *urb) | 1298 | static int verify_not_halted(struct usbtest_dev *tdev, int ep, struct urb *urb) |
| 1199 | { | 1299 | { |
| 1200 | int retval; | 1300 | int retval; |
| @@ -1970,8 +2070,6 @@ usbtest_ioctl(struct usb_interface *intf, unsigned int code, void *buf) | |||
| 1970 | dev->in_iso_pipe, dev->iso_in, 0); | 2070 | dev->in_iso_pipe, dev->iso_in, 0); |
| 1971 | break; | 2071 | break; |
| 1972 | 2072 | ||
| 1973 | /* FIXME unlink from queue (ring with N urbs) */ | ||
| 1974 | |||
| 1975 | /* FIXME scatterlist cancel (needs helper thread) */ | 2073 | /* FIXME scatterlist cancel (needs helper thread) */ |
| 1976 | 2074 | ||
| 1977 | /* Tests for bulk I/O using DMA mapping by core and odd address */ | 2075 | /* Tests for bulk I/O using DMA mapping by core and odd address */ |
| @@ -2064,6 +2162,26 @@ usbtest_ioctl(struct usb_interface *intf, unsigned int code, void *buf) | |||
| 2064 | dev->in_iso_pipe, dev->iso_in, 1); | 2162 | dev->in_iso_pipe, dev->iso_in, 1); |
| 2065 | break; | 2163 | break; |
| 2066 | 2164 | ||
| 2165 | /* unlink URBs from a bulk-OUT queue */ | ||
| 2166 | case 24: | ||
| 2167 | if (dev->out_pipe == 0 || !param->length || param->sglen < 4) | ||
| 2168 | break; | ||
| 2169 | retval = 0; | ||
| 2170 | dev_info(&intf->dev, "TEST 17: unlink from %d queues of " | ||
| 2171 | "%d %d-byte writes\n", | ||
| 2172 | param->iterations, param->sglen, param->length); | ||
| 2173 | for (i = param->iterations; retval == 0 && i > 0; --i) { | ||
| 2174 | retval = unlink_queued(dev, dev->out_pipe, | ||
| 2175 | param->sglen, param->length); | ||
| 2176 | if (retval) { | ||
| 2177 | dev_err(&intf->dev, | ||
| 2178 | "unlink queued writes failed %d, " | ||
| 2179 | "iterations left %d\n", retval, i); | ||
| 2180 | break; | ||
| 2181 | } | ||
| 2182 | } | ||
| 2183 | break; | ||
| 2184 | |||
| 2067 | } | 2185 | } |
| 2068 | do_gettimeofday(¶m->duration); | 2186 | do_gettimeofday(¶m->duration); |
| 2069 | param->duration.tv_sec -= start.tv_sec; | 2187 | param->duration.tv_sec -= start.tv_sec; |
| @@ -2192,6 +2310,9 @@ usbtest_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
| 2192 | case USB_SPEED_HIGH: | 2310 | case USB_SPEED_HIGH: |
| 2193 | tmp = "high"; | 2311 | tmp = "high"; |
| 2194 | break; | 2312 | break; |
| 2313 | case USB_SPEED_SUPER: | ||
| 2314 | tmp = "super"; | ||
| 2315 | break; | ||
| 2195 | default: | 2316 | default: |
| 2196 | tmp = "unknown"; | 2317 | tmp = "unknown"; |
| 2197 | break; | 2318 | break; |
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig index 74073b363c3..13093481f91 100644 --- a/drivers/usb/musb/Kconfig +++ b/drivers/usb/musb/Kconfig | |||
| @@ -14,7 +14,7 @@ config USB_MUSB_HDRC | |||
| 14 | select TWL4030_USB if MACH_OMAP_3430SDP | 14 | select TWL4030_USB if MACH_OMAP_3430SDP |
| 15 | select TWL6030_USB if MACH_OMAP_4430SDP || MACH_OMAP4_PANDA | 15 | select TWL6030_USB if MACH_OMAP_4430SDP || MACH_OMAP4_PANDA |
| 16 | select USB_OTG_UTILS | 16 | select USB_OTG_UTILS |
| 17 | bool 'Inventra Highspeed Dual Role Controller (TI, ADI, ...)' | 17 | tristate 'Inventra Highspeed Dual Role Controller (TI, ADI, ...)' |
| 18 | help | 18 | help |
| 19 | Say Y here if your system has a dual role high speed USB | 19 | Say Y here if your system has a dual role high speed USB |
| 20 | controller based on the Mentor Graphics silicon IP. Then | 20 | controller based on the Mentor Graphics silicon IP. Then |
| @@ -30,39 +30,39 @@ config USB_MUSB_HDRC | |||
| 30 | 30 | ||
| 31 | If you do not know what this is, please say N. | 31 | If you do not know what this is, please say N. |
| 32 | 32 | ||
| 33 | # To compile this driver as a module, choose M here; the | 33 | To compile this driver as a module, choose M here; the |
| 34 | # module will be called "musb-hdrc". | 34 | module will be called "musb-hdrc". |
| 35 | 35 | ||
| 36 | choice | 36 | choice |
| 37 | prompt "Platform Glue Layer" | 37 | prompt "Platform Glue Layer" |
| 38 | depends on USB_MUSB_HDRC | 38 | depends on USB_MUSB_HDRC |
| 39 | 39 | ||
| 40 | config USB_MUSB_DAVINCI | 40 | config USB_MUSB_DAVINCI |
| 41 | bool "DaVinci" | 41 | tristate "DaVinci" |
| 42 | depends on ARCH_DAVINCI_DMx | 42 | depends on ARCH_DAVINCI_DMx |
| 43 | 43 | ||
| 44 | config USB_MUSB_DA8XX | 44 | config USB_MUSB_DA8XX |
| 45 | bool "DA8xx/OMAP-L1x" | 45 | tristate "DA8xx/OMAP-L1x" |
| 46 | depends on ARCH_DAVINCI_DA8XX | 46 | depends on ARCH_DAVINCI_DA8XX |
| 47 | 47 | ||
| 48 | config USB_MUSB_TUSB6010 | 48 | config USB_MUSB_TUSB6010 |
| 49 | bool "TUSB6010" | 49 | tristate "TUSB6010" |
| 50 | depends on ARCH_OMAP | 50 | depends on ARCH_OMAP |
| 51 | 51 | ||
| 52 | config USB_MUSB_OMAP2PLUS | 52 | config USB_MUSB_OMAP2PLUS |
| 53 | bool "OMAP2430 and onwards" | 53 | tristate "OMAP2430 and onwards" |
| 54 | depends on ARCH_OMAP2PLUS | 54 | depends on ARCH_OMAP2PLUS |
| 55 | 55 | ||
| 56 | config USB_MUSB_AM35X | 56 | config USB_MUSB_AM35X |
| 57 | bool "AM35x" | 57 | tristate "AM35x" |
| 58 | depends on ARCH_OMAP | 58 | depends on ARCH_OMAP |
| 59 | 59 | ||
| 60 | config USB_MUSB_BLACKFIN | 60 | config USB_MUSB_BLACKFIN |
| 61 | bool "Blackfin" | 61 | tristate "Blackfin" |
| 62 | depends on (BF54x && !BF544) || (BF52x && ! BF522 && !BF523) | 62 | depends on (BF54x && !BF544) || (BF52x && ! BF522 && !BF523) |
| 63 | 63 | ||
| 64 | config USB_MUSB_UX500 | 64 | config USB_MUSB_UX500 |
| 65 | bool "U8500 and U5500" | 65 | tristate "U8500 and U5500" |
| 66 | depends on (ARCH_U8500 && AB8500_USB) || (ARCH_U5500) | 66 | depends on (ARCH_U8500 && AB8500_USB) || (ARCH_U5500) |
| 67 | 67 | ||
| 68 | endchoice | 68 | endchoice |
| @@ -153,6 +153,13 @@ config MUSB_PIO_ONLY | |||
| 153 | you can still disable it at run time using the "use_dma=n" module | 153 | you can still disable it at run time using the "use_dma=n" module |
| 154 | parameter. | 154 | parameter. |
| 155 | 155 | ||
| 156 | config USB_UX500_DMA | ||
| 157 | bool | ||
| 158 | depends on USB_MUSB_HDRC && !MUSB_PIO_ONLY | ||
| 159 | default USB_MUSB_UX500 | ||
| 160 | help | ||
| 161 | Enable DMA transfers on UX500 platforms. | ||
| 162 | |||
| 156 | config USB_INVENTRA_DMA | 163 | config USB_INVENTRA_DMA |
| 157 | bool | 164 | bool |
| 158 | depends on USB_MUSB_HDRC && !MUSB_PIO_ONLY | 165 | depends on USB_MUSB_HDRC && !MUSB_PIO_ONLY |
| @@ -176,11 +183,3 @@ config USB_TUSB_OMAP_DMA | |||
| 176 | help | 183 | help |
| 177 | Enable DMA transfers on TUSB 6010 when OMAP DMA is available. | 184 | Enable DMA transfers on TUSB 6010 when OMAP DMA is available. |
| 178 | 185 | ||
| 179 | config USB_MUSB_DEBUG | ||
| 180 | depends on USB_MUSB_HDRC | ||
| 181 | bool "Enable debugging messages" | ||
| 182 | default n | ||
| 183 | help | ||
| 184 | This enables musb debugging. To set the logging level use the debug | ||
| 185 | module parameter. Starting at level 3, per-transfer (urb, usb_request, | ||
| 186 | packet, or dma transfer) tracing may kick in. | ||
diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile index 74df5284894..c4d228b6ef8 100644 --- a/drivers/usb/musb/Makefile +++ b/drivers/usb/musb/Makefile | |||
| @@ -2,8 +2,6 @@ | |||
| 2 | # for USB OTG silicon based on Mentor Graphics INVENTRA designs | 2 | # for USB OTG silicon based on Mentor Graphics INVENTRA designs |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | ccflags-$(CONFIG_USB_MUSB_DEBUG) := -DDEBUG | ||
| 6 | |||
| 7 | obj-$(CONFIG_USB_MUSB_HDRC) += musb_hdrc.o | 5 | obj-$(CONFIG_USB_MUSB_HDRC) += musb_hdrc.o |
| 8 | 6 | ||
| 9 | musb_hdrc-y := musb_core.o | 7 | musb_hdrc-y := musb_core.o |
| @@ -39,6 +37,11 @@ ifneq ($(CONFIG_MUSB_PIO_ONLY),y) | |||
| 39 | ifeq ($(CONFIG_USB_TUSB_OMAP_DMA),y) | 37 | ifeq ($(CONFIG_USB_TUSB_OMAP_DMA),y) |
| 40 | musb_hdrc-y += tusb6010_omap.o | 38 | musb_hdrc-y += tusb6010_omap.o |
| 41 | 39 | ||
| 40 | else | ||
| 41 | ifeq ($(CONFIG_USB_UX500_DMA),y) | ||
| 42 | musb_hdrc-y += ux500_dma.o | ||
| 43 | |||
| 44 | endif | ||
| 42 | endif | 45 | endif |
| 43 | endif | 46 | endif |
| 44 | endif | 47 | endif |
diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c index d5a3da37c90..23ac28f98d9 100644 --- a/drivers/usb/musb/am35x.c +++ b/drivers/usb/musb/am35x.c | |||
| @@ -151,7 +151,8 @@ static void otg_timer(unsigned long _musb) | |||
| 151 | * status change events (from the transceiver) otherwise. | 151 | * status change events (from the transceiver) otherwise. |
| 152 | */ | 152 | */ |
| 153 | devctl = musb_readb(mregs, MUSB_DEVCTL); | 153 | devctl = musb_readb(mregs, MUSB_DEVCTL); |
| 154 | DBG(7, "Poll devctl %02x (%s)\n", devctl, otg_state_string(musb)); | 154 | dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl, |
| 155 | otg_state_string(musb->xceiv->state)); | ||
| 155 | 156 | ||
| 156 | spin_lock_irqsave(&musb->lock, flags); | 157 | spin_lock_irqsave(&musb->lock, flags); |
| 157 | switch (musb->xceiv->state) { | 158 | switch (musb->xceiv->state) { |
| @@ -202,20 +203,22 @@ static void am35x_musb_try_idle(struct musb *musb, unsigned long timeout) | |||
| 202 | /* Never idle if active, or when VBUS timeout is not set as host */ | 203 | /* Never idle if active, or when VBUS timeout is not set as host */ |
| 203 | if (musb->is_active || (musb->a_wait_bcon == 0 && | 204 | if (musb->is_active || (musb->a_wait_bcon == 0 && |
| 204 | musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) { | 205 | musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) { |
| 205 | DBG(4, "%s active, deleting timer\n", otg_state_string(musb)); | 206 | dev_dbg(musb->controller, "%s active, deleting timer\n", |
| 207 | otg_state_string(musb->xceiv->state)); | ||
| 206 | del_timer(&otg_workaround); | 208 | del_timer(&otg_workaround); |
| 207 | last_timer = jiffies; | 209 | last_timer = jiffies; |
| 208 | return; | 210 | return; |
| 209 | } | 211 | } |
| 210 | 212 | ||
| 211 | if (time_after(last_timer, timeout) && timer_pending(&otg_workaround)) { | 213 | if (time_after(last_timer, timeout) && timer_pending(&otg_workaround)) { |
| 212 | DBG(4, "Longer idle timer already pending, ignoring...\n"); | 214 | dev_dbg(musb->controller, "Longer idle timer already pending, ignoring...\n"); |
| 213 | return; | 215 | return; |
| 214 | } | 216 | } |
| 215 | last_timer = timeout; | 217 | last_timer = timeout; |
| 216 | 218 | ||
| 217 | DBG(4, "%s inactive, starting idle timer for %u ms\n", | 219 | dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n", |
| 218 | otg_state_string(musb), jiffies_to_msecs(timeout - jiffies)); | 220 | otg_state_string(musb->xceiv->state), |
| 221 | jiffies_to_msecs(timeout - jiffies)); | ||
| 219 | mod_timer(&otg_workaround, timeout); | 222 | mod_timer(&otg_workaround, timeout); |
| 220 | } | 223 | } |
| 221 | 224 | ||
| @@ -302,9 +305,9 @@ static irqreturn_t am35x_musb_interrupt(int irq, void *hci) | |||
| 302 | } | 305 | } |
| 303 | 306 | ||
| 304 | /* NOTE: this must complete power-on within 100 ms. */ | 307 | /* NOTE: this must complete power-on within 100 ms. */ |
| 305 | DBG(2, "VBUS %s (%s)%s, devctl %02x\n", | 308 | dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n", |
| 306 | drvvbus ? "on" : "off", | 309 | drvvbus ? "on" : "off", |
| 307 | otg_state_string(musb), | 310 | otg_state_string(musb->xceiv->state), |
| 308 | err ? " ERROR" : "", | 311 | err ? " ERROR" : "", |
| 309 | devctl); | 312 | devctl); |
| 310 | ret = IRQ_HANDLED; | 313 | ret = IRQ_HANDLED; |
diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c index 8e2a1ff8a35..ae8c3961774 100644 --- a/drivers/usb/musb/blackfin.c +++ b/drivers/usb/musb/blackfin.c | |||
| @@ -35,6 +35,7 @@ struct bfin_glue { | |||
| 35 | */ | 35 | */ |
| 36 | void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src) | 36 | void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src) |
| 37 | { | 37 | { |
| 38 | struct musb *musb = hw_ep->musb; | ||
| 38 | void __iomem *fifo = hw_ep->fifo; | 39 | void __iomem *fifo = hw_ep->fifo; |
| 39 | void __iomem *epio = hw_ep->regs; | 40 | void __iomem *epio = hw_ep->regs; |
| 40 | u8 epnum = hw_ep->epnum; | 41 | u8 epnum = hw_ep->epnum; |
| @@ -43,7 +44,7 @@ void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src) | |||
| 43 | 44 | ||
| 44 | musb_writew(epio, MUSB_TXCOUNT, len); | 45 | musb_writew(epio, MUSB_TXCOUNT, len); |
| 45 | 46 | ||
| 46 | DBG(4, "TX ep%d fifo %p count %d buf %p, epio %p\n", | 47 | dev_dbg(musb->controller, "TX ep%d fifo %p count %d buf %p, epio %p\n", |
| 47 | hw_ep->epnum, fifo, len, src, epio); | 48 | hw_ep->epnum, fifo, len, src, epio); |
| 48 | 49 | ||
| 49 | dump_fifo_data(src, len); | 50 | dump_fifo_data(src, len); |
| @@ -98,6 +99,7 @@ void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src) | |||
| 98 | */ | 99 | */ |
| 99 | void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst) | 100 | void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst) |
| 100 | { | 101 | { |
| 102 | struct musb *musb = hw_ep->musb; | ||
| 101 | void __iomem *fifo = hw_ep->fifo; | 103 | void __iomem *fifo = hw_ep->fifo; |
| 102 | u8 epnum = hw_ep->epnum; | 104 | u8 epnum = hw_ep->epnum; |
| 103 | 105 | ||
| @@ -154,7 +156,7 @@ void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst) | |||
| 154 | *(dst + len - 1) = (u8)inw((unsigned long)fifo + 4); | 156 | *(dst + len - 1) = (u8)inw((unsigned long)fifo + 4); |
| 155 | } | 157 | } |
| 156 | } | 158 | } |
| 157 | DBG(4, "%cX ep%d fifo %p count %d buf %p\n", | 159 | dev_dbg(musb->controller, "%cX ep%d fifo %p count %d buf %p\n", |
| 158 | 'R', hw_ep->epnum, fifo, len, dst); | 160 | 'R', hw_ep->epnum, fifo, len, dst); |
| 159 | 161 | ||
| 160 | dump_fifo_data(dst, len); | 162 | dump_fifo_data(dst, len); |
| @@ -279,12 +281,14 @@ static void musb_conn_timer_handler(unsigned long _musb) | |||
| 279 | } | 281 | } |
| 280 | break; | 282 | break; |
| 281 | default: | 283 | default: |
| 282 | DBG(1, "%s state not handled\n", otg_state_string(musb)); | 284 | dev_dbg(musb->controller, "%s state not handled\n", |
| 285 | otg_state_string(musb->xceiv->state)); | ||
| 283 | break; | 286 | break; |
| 284 | } | 287 | } |
| 285 | spin_unlock_irqrestore(&musb->lock, flags); | 288 | spin_unlock_irqrestore(&musb->lock, flags); |
| 286 | 289 | ||
| 287 | DBG(4, "state is %s\n", otg_state_string(musb)); | 290 | dev_dbg(musb->controller, "state is %s\n", |
| 291 | otg_state_string(musb->xceiv->state)); | ||
| 288 | } | 292 | } |
| 289 | 293 | ||
| 290 | static void bfin_musb_enable(struct musb *musb) | 294 | static void bfin_musb_enable(struct musb *musb) |
| @@ -306,9 +310,9 @@ static void bfin_musb_set_vbus(struct musb *musb, int is_on) | |||
| 306 | value = !value; | 310 | value = !value; |
| 307 | gpio_set_value(musb->config->gpio_vrsel, value); | 311 | gpio_set_value(musb->config->gpio_vrsel, value); |
| 308 | 312 | ||
| 309 | DBG(1, "VBUS %s, devctl %02x " | 313 | dev_dbg(musb->controller, "VBUS %s, devctl %02x " |
| 310 | /* otg %3x conf %08x prcm %08x */ "\n", | 314 | /* otg %3x conf %08x prcm %08x */ "\n", |
| 311 | otg_state_string(musb), | 315 | otg_state_string(musb->xceiv->state), |
| 312 | musb_readb(musb->mregs, MUSB_DEVCTL)); | 316 | musb_readb(musb->mregs, MUSB_DEVCTL)); |
| 313 | } | 317 | } |
| 314 | 318 | ||
diff --git a/drivers/usb/musb/cppi_dma.c b/drivers/usb/musb/cppi_dma.c index ab434fbd8c3..149f3f310a0 100644 --- a/drivers/usb/musb/cppi_dma.c +++ b/drivers/usb/musb/cppi_dma.c | |||
| @@ -236,7 +236,7 @@ static int cppi_controller_stop(struct dma_controller *c) | |||
| 236 | musb_writel(tibase, DAVINCI_RXCPPI_INTCLR_REG, | 236 | musb_writel(tibase, DAVINCI_RXCPPI_INTCLR_REG, |
| 237 | DAVINCI_DMA_ALL_CHANNELS_ENABLE); | 237 | DAVINCI_DMA_ALL_CHANNELS_ENABLE); |
| 238 | 238 | ||
| 239 | DBG(1, "Tearing down RX and TX Channels\n"); | 239 | dev_dbg(musb->controller, "Tearing down RX and TX Channels\n"); |
| 240 | for (i = 0; i < ARRAY_SIZE(controller->tx); i++) { | 240 | for (i = 0; i < ARRAY_SIZE(controller->tx); i++) { |
| 241 | /* FIXME restructure of txdma to use bds like rxdma */ | 241 | /* FIXME restructure of txdma to use bds like rxdma */ |
| 242 | controller->tx[i].last_processed = NULL; | 242 | controller->tx[i].last_processed = NULL; |
| @@ -301,13 +301,13 @@ cppi_channel_allocate(struct dma_controller *c, | |||
| 301 | */ | 301 | */ |
| 302 | if (transmit) { | 302 | if (transmit) { |
| 303 | if (index >= ARRAY_SIZE(controller->tx)) { | 303 | if (index >= ARRAY_SIZE(controller->tx)) { |
| 304 | DBG(1, "no %cX%d CPPI channel\n", 'T', index); | 304 | dev_dbg(musb->controller, "no %cX%d CPPI channel\n", 'T', index); |
| 305 | return NULL; | 305 | return NULL; |
| 306 | } | 306 | } |
| 307 | cppi_ch = controller->tx + index; | 307 | cppi_ch = controller->tx + index; |
| 308 | } else { | 308 | } else { |
| 309 | if (index >= ARRAY_SIZE(controller->rx)) { | 309 | if (index >= ARRAY_SIZE(controller->rx)) { |
| 310 | DBG(1, "no %cX%d CPPI channel\n", 'R', index); | 310 | dev_dbg(musb->controller, "no %cX%d CPPI channel\n", 'R', index); |
| 311 | return NULL; | 311 | return NULL; |
| 312 | } | 312 | } |
| 313 | cppi_ch = controller->rx + index; | 313 | cppi_ch = controller->rx + index; |
| @@ -318,13 +318,13 @@ cppi_channel_allocate(struct dma_controller *c, | |||
| 318 | * with the other DMA engine too | 318 | * with the other DMA engine too |
| 319 | */ | 319 | */ |
| 320 | if (cppi_ch->hw_ep) | 320 | if (cppi_ch->hw_ep) |
| 321 | DBG(1, "re-allocating DMA%d %cX channel %p\n", | 321 | dev_dbg(musb->controller, "re-allocating DMA%d %cX channel %p\n", |
| 322 | index, transmit ? 'T' : 'R', cppi_ch); | 322 | index, transmit ? 'T' : 'R', cppi_ch); |
| 323 | cppi_ch->hw_ep = ep; | 323 | cppi_ch->hw_ep = ep; |
| 324 | cppi_ch->channel.status = MUSB_DMA_STATUS_FREE; | 324 | cppi_ch->channel.status = MUSB_DMA_STATUS_FREE; |
| 325 | cppi_ch->channel.max_len = 0x7fffffff; | 325 | cppi_ch->channel.max_len = 0x7fffffff; |
| 326 | 326 | ||
| 327 | DBG(4, "Allocate CPPI%d %cX\n", index, transmit ? 'T' : 'R'); | 327 | dev_dbg(musb->controller, "Allocate CPPI%d %cX\n", index, transmit ? 'T' : 'R'); |
| 328 | return &cppi_ch->channel; | 328 | return &cppi_ch->channel; |
| 329 | } | 329 | } |
| 330 | 330 | ||
| @@ -339,7 +339,7 @@ static void cppi_channel_release(struct dma_channel *channel) | |||
| 339 | c = container_of(channel, struct cppi_channel, channel); | 339 | c = container_of(channel, struct cppi_channel, channel); |
| 340 | tibase = c->controller->tibase; | 340 | tibase = c->controller->tibase; |
| 341 | if (!c->hw_ep) | 341 | if (!c->hw_ep) |
| 342 | DBG(1, "releasing idle DMA channel %p\n", c); | 342 | dev_dbg(musb->controller, "releasing idle DMA channel %p\n", c); |
| 343 | else if (!c->transmit) | 343 | else if (!c->transmit) |
| 344 | core_rxirq_enable(tibase, c->index + 1); | 344 | core_rxirq_enable(tibase, c->index + 1); |
| 345 | 345 | ||
| @@ -597,7 +597,7 @@ cppi_next_tx_segment(struct musb *musb, struct cppi_channel *tx) | |||
| 597 | length = min(n_bds * maxpacket, length); | 597 | length = min(n_bds * maxpacket, length); |
| 598 | } | 598 | } |
| 599 | 599 | ||
| 600 | DBG(4, "TX DMA%d, pktSz %d %s bds %d dma 0x%llx len %u\n", | 600 | dev_dbg(musb->controller, "TX DMA%d, pktSz %d %s bds %d dma 0x%llx len %u\n", |
| 601 | tx->index, | 601 | tx->index, |
| 602 | maxpacket, | 602 | maxpacket, |
| 603 | rndis ? "rndis" : "transparent", | 603 | rndis ? "rndis" : "transparent", |
| @@ -654,7 +654,7 @@ cppi_next_tx_segment(struct musb *musb, struct cppi_channel *tx) | |||
| 654 | bd->hw_options |= CPPI_ZERO_SET; | 654 | bd->hw_options |= CPPI_ZERO_SET; |
| 655 | } | 655 | } |
| 656 | 656 | ||
| 657 | DBG(5, "TXBD %p: nxt %08x buf %08x len %04x opt %08x\n", | 657 | dev_dbg(musb->controller, "TXBD %p: nxt %08x buf %08x len %04x opt %08x\n", |
| 658 | bd, bd->hw_next, bd->hw_bufp, | 658 | bd, bd->hw_next, bd->hw_bufp, |
| 659 | bd->hw_off_len, bd->hw_options); | 659 | bd->hw_off_len, bd->hw_options); |
| 660 | 660 | ||
| @@ -819,7 +819,7 @@ cppi_next_rx_segment(struct musb *musb, struct cppi_channel *rx, int onepacket) | |||
| 819 | 819 | ||
| 820 | length = min(n_bds * maxpacket, length); | 820 | length = min(n_bds * maxpacket, length); |
| 821 | 821 | ||
| 822 | DBG(4, "RX DMA%d seg, maxp %d %s bds %d (cnt %d) " | 822 | dev_dbg(musb->controller, "RX DMA%d seg, maxp %d %s bds %d (cnt %d) " |
| 823 | "dma 0x%llx len %u %u/%u\n", | 823 | "dma 0x%llx len %u %u/%u\n", |
| 824 | rx->index, maxpacket, | 824 | rx->index, maxpacket, |
| 825 | onepacket | 825 | onepacket |
| @@ -936,7 +936,7 @@ cppi_next_rx_segment(struct musb *musb, struct cppi_channel *rx, int onepacket) | |||
| 936 | DAVINCI_RXCPPI_BUFCNT0_REG + (rx->index * 4)) | 936 | DAVINCI_RXCPPI_BUFCNT0_REG + (rx->index * 4)) |
| 937 | & 0xffff; | 937 | & 0xffff; |
| 938 | if (i < (2 + n_bds)) { | 938 | if (i < (2 + n_bds)) { |
| 939 | DBG(2, "bufcnt%d underrun - %d (for %d)\n", | 939 | dev_dbg(musb->controller, "bufcnt%d underrun - %d (for %d)\n", |
| 940 | rx->index, i, n_bds); | 940 | rx->index, i, n_bds); |
| 941 | musb_writel(tibase, | 941 | musb_writel(tibase, |
| 942 | DAVINCI_RXCPPI_BUFCNT0_REG + (rx->index * 4), | 942 | DAVINCI_RXCPPI_BUFCNT0_REG + (rx->index * 4), |
| @@ -985,7 +985,7 @@ static int cppi_channel_program(struct dma_channel *ch, | |||
| 985 | /* WARN_ON(1); */ | 985 | /* WARN_ON(1); */ |
| 986 | break; | 986 | break; |
| 987 | case MUSB_DMA_STATUS_UNKNOWN: | 987 | case MUSB_DMA_STATUS_UNKNOWN: |
| 988 | DBG(1, "%cX DMA%d not allocated!\n", | 988 | dev_dbg(musb->controller, "%cX DMA%d not allocated!\n", |
| 989 | cppi_ch->transmit ? 'T' : 'R', | 989 | cppi_ch->transmit ? 'T' : 'R', |
| 990 | cppi_ch->index); | 990 | cppi_ch->index); |
| 991 | /* FALLTHROUGH */ | 991 | /* FALLTHROUGH */ |
| @@ -1040,7 +1040,7 @@ static bool cppi_rx_scan(struct cppi *cppi, unsigned ch) | |||
| 1040 | if (!completed && (bd->hw_options & CPPI_OWN_SET)) | 1040 | if (!completed && (bd->hw_options & CPPI_OWN_SET)) |
| 1041 | break; | 1041 | break; |
| 1042 | 1042 | ||
| 1043 | DBG(5, "C/RXBD %llx: nxt %08x buf %08x " | 1043 | dev_dbg(musb->controller, "C/RXBD %llx: nxt %08x buf %08x " |
| 1044 | "off.len %08x opt.len %08x (%d)\n", | 1044 | "off.len %08x opt.len %08x (%d)\n", |
| 1045 | (unsigned long long)bd->dma, bd->hw_next, bd->hw_bufp, | 1045 | (unsigned long long)bd->dma, bd->hw_next, bd->hw_bufp, |
| 1046 | bd->hw_off_len, bd->hw_options, | 1046 | bd->hw_off_len, bd->hw_options, |
| @@ -1062,7 +1062,7 @@ static bool cppi_rx_scan(struct cppi *cppi, unsigned ch) | |||
| 1062 | * CPPI ignores those BDs even though OWN is still set. | 1062 | * CPPI ignores those BDs even though OWN is still set. |
| 1063 | */ | 1063 | */ |
| 1064 | completed = true; | 1064 | completed = true; |
| 1065 | DBG(3, "rx short %d/%d (%d)\n", | 1065 | dev_dbg(musb->controller, "rx short %d/%d (%d)\n", |
| 1066 | len, bd->buflen, | 1066 | len, bd->buflen, |
| 1067 | rx->channel.actual_len); | 1067 | rx->channel.actual_len); |
| 1068 | } | 1068 | } |
| @@ -1112,7 +1112,7 @@ static bool cppi_rx_scan(struct cppi *cppi, unsigned ch) | |||
| 1112 | musb_ep_select(cppi->mregs, rx->index + 1); | 1112 | musb_ep_select(cppi->mregs, rx->index + 1); |
| 1113 | csr = musb_readw(regs, MUSB_RXCSR); | 1113 | csr = musb_readw(regs, MUSB_RXCSR); |
| 1114 | if (csr & MUSB_RXCSR_DMAENAB) { | 1114 | if (csr & MUSB_RXCSR_DMAENAB) { |
| 1115 | DBG(4, "list%d %p/%p, last %llx%s, csr %04x\n", | 1115 | dev_dbg(musb->controller, "list%d %p/%p, last %llx%s, csr %04x\n", |
| 1116 | rx->index, | 1116 | rx->index, |
| 1117 | rx->head, rx->tail, | 1117 | rx->head, rx->tail, |
| 1118 | rx->last_processed | 1118 | rx->last_processed |
| @@ -1175,7 +1175,7 @@ irqreturn_t cppi_interrupt(int irq, void *dev_id) | |||
| 1175 | return IRQ_NONE; | 1175 | return IRQ_NONE; |
| 1176 | } | 1176 | } |
| 1177 | 1177 | ||
| 1178 | DBG(4, "CPPI IRQ Tx%x Rx%x\n", tx, rx); | 1178 | dev_dbg(musb->controller, "CPPI IRQ Tx%x Rx%x\n", tx, rx); |
| 1179 | 1179 | ||
| 1180 | /* process TX channels */ | 1180 | /* process TX channels */ |
| 1181 | for (index = 0; tx; tx = tx >> 1, index++) { | 1181 | for (index = 0; tx; tx = tx >> 1, index++) { |
| @@ -1203,7 +1203,7 @@ irqreturn_t cppi_interrupt(int irq, void *dev_id) | |||
| 1203 | * that needs to be acknowledged. | 1203 | * that needs to be acknowledged. |
| 1204 | */ | 1204 | */ |
| 1205 | if (NULL == bd) { | 1205 | if (NULL == bd) { |
| 1206 | DBG(1, "null BD\n"); | 1206 | dev_dbg(musb->controller, "null BD\n"); |
| 1207 | musb_writel(&tx_ram->tx_complete, 0, 0); | 1207 | musb_writel(&tx_ram->tx_complete, 0, 0); |
| 1208 | continue; | 1208 | continue; |
| 1209 | } | 1209 | } |
| @@ -1218,7 +1218,7 @@ irqreturn_t cppi_interrupt(int irq, void *dev_id) | |||
| 1218 | if (bd->hw_options & CPPI_OWN_SET) | 1218 | if (bd->hw_options & CPPI_OWN_SET) |
| 1219 | break; | 1219 | break; |
| 1220 | 1220 | ||
| 1221 | DBG(5, "C/TXBD %p n %x b %x off %x opt %x\n", | 1221 | dev_dbg(musb->controller, "C/TXBD %p n %x b %x off %x opt %x\n", |
| 1222 | bd, bd->hw_next, bd->hw_bufp, | 1222 | bd, bd->hw_next, bd->hw_bufp, |
| 1223 | bd->hw_off_len, bd->hw_options); | 1223 | bd->hw_off_len, bd->hw_options); |
| 1224 | 1224 | ||
diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c index 69a0da3c8f0..662ed34980b 100644 --- a/drivers/usb/musb/da8xx.c +++ b/drivers/usb/musb/da8xx.c | |||
| @@ -199,7 +199,8 @@ static void otg_timer(unsigned long _musb) | |||
| 199 | * status change events (from the transceiver) otherwise. | 199 | * status change events (from the transceiver) otherwise. |
| 200 | */ | 200 | */ |
| 201 | devctl = musb_readb(mregs, MUSB_DEVCTL); | 201 | devctl = musb_readb(mregs, MUSB_DEVCTL); |
| 202 | DBG(7, "Poll devctl %02x (%s)\n", devctl, otg_state_string(musb)); | 202 | dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl, |
| 203 | otg_state_string(musb->xceiv->state)); | ||
| 203 | 204 | ||
| 204 | spin_lock_irqsave(&musb->lock, flags); | 205 | spin_lock_irqsave(&musb->lock, flags); |
| 205 | switch (musb->xceiv->state) { | 206 | switch (musb->xceiv->state) { |
| @@ -273,20 +274,22 @@ static void da8xx_musb_try_idle(struct musb *musb, unsigned long timeout) | |||
| 273 | /* Never idle if active, or when VBUS timeout is not set as host */ | 274 | /* Never idle if active, or when VBUS timeout is not set as host */ |
| 274 | if (musb->is_active || (musb->a_wait_bcon == 0 && | 275 | if (musb->is_active || (musb->a_wait_bcon == 0 && |
| 275 | musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) { | 276 | musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) { |
| 276 | DBG(4, "%s active, deleting timer\n", otg_state_string(musb)); | 277 | dev_dbg(musb->controller, "%s active, deleting timer\n", |
| 278 | otg_state_string(musb->xceiv->state)); | ||
| 277 | del_timer(&otg_workaround); | 279 | del_timer(&otg_workaround); |
| 278 | last_timer = jiffies; | 280 | last_timer = jiffies; |
| 279 | return; | 281 | return; |
| 280 | } | 282 | } |
| 281 | 283 | ||
| 282 | if (time_after(last_timer, timeout) && timer_pending(&otg_workaround)) { | 284 | if (time_after(last_timer, timeout) && timer_pending(&otg_workaround)) { |
| 283 | DBG(4, "Longer idle timer already pending, ignoring...\n"); | 285 | dev_dbg(musb->controller, "Longer idle timer already pending, ignoring...\n"); |
| 284 | return; | 286 | return; |
| 285 | } | 287 | } |
| 286 | last_timer = timeout; | 288 | last_timer = timeout; |
| 287 | 289 | ||
| 288 | DBG(4, "%s inactive, starting idle timer for %u ms\n", | 290 | dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n", |
| 289 | otg_state_string(musb), jiffies_to_msecs(timeout - jiffies)); | 291 | otg_state_string(musb->xceiv->state), |
| 292 | jiffies_to_msecs(timeout - jiffies)); | ||
| 290 | mod_timer(&otg_workaround, timeout); | 293 | mod_timer(&otg_workaround, timeout); |
| 291 | } | 294 | } |
| 292 | 295 | ||
| @@ -311,7 +314,7 @@ static irqreturn_t da8xx_musb_interrupt(int irq, void *hci) | |||
| 311 | goto eoi; | 314 | goto eoi; |
| 312 | 315 | ||
| 313 | musb_writel(reg_base, DA8XX_USB_INTR_SRC_CLEAR_REG, status); | 316 | musb_writel(reg_base, DA8XX_USB_INTR_SRC_CLEAR_REG, status); |
| 314 | DBG(4, "USB IRQ %08x\n", status); | 317 | dev_dbg(musb->controller, "USB IRQ %08x\n", status); |
| 315 | 318 | ||
| 316 | musb->int_rx = (status & DA8XX_INTR_RX_MASK) >> DA8XX_INTR_RX_SHIFT; | 319 | musb->int_rx = (status & DA8XX_INTR_RX_MASK) >> DA8XX_INTR_RX_SHIFT; |
| 317 | musb->int_tx = (status & DA8XX_INTR_TX_MASK) >> DA8XX_INTR_TX_SHIFT; | 320 | musb->int_tx = (status & DA8XX_INTR_TX_MASK) >> DA8XX_INTR_TX_SHIFT; |
| @@ -363,9 +366,9 @@ static irqreturn_t da8xx_musb_interrupt(int irq, void *hci) | |||
| 363 | portstate(musb->port1_status &= ~USB_PORT_STAT_POWER); | 366 | portstate(musb->port1_status &= ~USB_PORT_STAT_POWER); |
| 364 | } | 367 | } |
| 365 | 368 | ||
| 366 | DBG(2, "VBUS %s (%s)%s, devctl %02x\n", | 369 | dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n", |
| 367 | drvvbus ? "on" : "off", | 370 | drvvbus ? "on" : "off", |
| 368 | otg_state_string(musb), | 371 | otg_state_string(musb->xceiv->state), |
| 369 | err ? " ERROR" : "", | 372 | err ? " ERROR" : "", |
| 370 | devctl); | 373 | devctl); |
| 371 | ret = IRQ_HANDLED; | 374 | ret = IRQ_HANDLED; |
| @@ -410,7 +413,7 @@ static int da8xx_musb_set_mode(struct musb *musb, u8 musb_mode) | |||
| 410 | break; | 413 | break; |
| 411 | #endif | 414 | #endif |
| 412 | default: | 415 | default: |
| 413 | DBG(2, "Trying to set unsupported mode %u\n", musb_mode); | 416 | dev_dbg(musb->controller, "Trying to set unsupported mode %u\n", musb_mode); |
| 414 | } | 417 | } |
| 415 | 418 | ||
| 416 | __raw_writel(cfgchip2, CFGCHIP2); | 419 | __raw_writel(cfgchip2, CFGCHIP2); |
diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c index e6de097fb7e..2a2adf6492c 100644 --- a/drivers/usb/musb/davinci.c +++ b/drivers/usb/musb/davinci.c | |||
| @@ -220,7 +220,8 @@ static void otg_timer(unsigned long _musb) | |||
| 220 | * status change events (from the transceiver) otherwise. | 220 | * status change events (from the transceiver) otherwise. |
| 221 | */ | 221 | */ |
| 222 | devctl = musb_readb(mregs, MUSB_DEVCTL); | 222 | devctl = musb_readb(mregs, MUSB_DEVCTL); |
| 223 | DBG(7, "poll devctl %02x (%s)\n", devctl, otg_state_string(musb)); | 223 | dev_dbg(musb->controller, "poll devctl %02x (%s)\n", devctl, |
| 224 | otg_state_string(musb->xceiv->state)); | ||
| 224 | 225 | ||
| 225 | spin_lock_irqsave(&musb->lock, flags); | 226 | spin_lock_irqsave(&musb->lock, flags); |
| 226 | switch (musb->xceiv->state) { | 227 | switch (musb->xceiv->state) { |
| @@ -297,7 +298,7 @@ static irqreturn_t davinci_musb_interrupt(int irq, void *__hci) | |||
| 297 | /* ack and handle non-CPPI interrupts */ | 298 | /* ack and handle non-CPPI interrupts */ |
| 298 | tmp = musb_readl(tibase, DAVINCI_USB_INT_SRC_MASKED_REG); | 299 | tmp = musb_readl(tibase, DAVINCI_USB_INT_SRC_MASKED_REG); |
| 299 | musb_writel(tibase, DAVINCI_USB_INT_SRC_CLR_REG, tmp); | 300 | musb_writel(tibase, DAVINCI_USB_INT_SRC_CLR_REG, tmp); |
| 300 | DBG(4, "IRQ %08x\n", tmp); | 301 | dev_dbg(musb->controller, "IRQ %08x\n", tmp); |
| 301 | 302 | ||
| 302 | musb->int_rx = (tmp & DAVINCI_USB_RXINT_MASK) | 303 | musb->int_rx = (tmp & DAVINCI_USB_RXINT_MASK) |
| 303 | >> DAVINCI_USB_RXINT_SHIFT; | 304 | >> DAVINCI_USB_RXINT_SHIFT; |
| @@ -354,9 +355,9 @@ static irqreturn_t davinci_musb_interrupt(int irq, void *__hci) | |||
| 354 | * (OTG_TIME_A_WAIT_VRISE) but we don't check for that. | 355 | * (OTG_TIME_A_WAIT_VRISE) but we don't check for that. |
| 355 | */ | 356 | */ |
| 356 | davinci_musb_source_power(musb, drvvbus, 0); | 357 | davinci_musb_source_power(musb, drvvbus, 0); |
| 357 | DBG(2, "VBUS %s (%s)%s, devctl %02x\n", | 358 | dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n", |
| 358 | drvvbus ? "on" : "off", | 359 | drvvbus ? "on" : "off", |
| 359 | otg_state_string(musb), | 360 | otg_state_string(musb->xceiv->state), |
| 360 | err ? " ERROR" : "", | 361 | err ? " ERROR" : "", |
| 361 | devctl); | 362 | devctl); |
| 362 | retval = IRQ_HANDLED; | 363 | retval = IRQ_HANDLED; |
| @@ -484,7 +485,7 @@ static int davinci_musb_exit(struct musb *musb) | |||
| 484 | break; | 485 | break; |
| 485 | if ((devctl & MUSB_DEVCTL_VBUS) != warn) { | 486 | if ((devctl & MUSB_DEVCTL_VBUS) != warn) { |
| 486 | warn = devctl & MUSB_DEVCTL_VBUS; | 487 | warn = devctl & MUSB_DEVCTL_VBUS; |
| 487 | DBG(1, "VBUS %d\n", | 488 | dev_dbg(musb->controller, "VBUS %d\n", |
| 488 | warn >> MUSB_DEVCTL_VBUS_SHIFT); | 489 | warn >> MUSB_DEVCTL_VBUS_SHIFT); |
| 489 | } | 490 | } |
| 490 | msleep(1000); | 491 | msleep(1000); |
| @@ -493,7 +494,7 @@ static int davinci_musb_exit(struct musb *musb) | |||
| 493 | 494 | ||
| 494 | /* in OTG mode, another host might be connected */ | 495 | /* in OTG mode, another host might be connected */ |
| 495 | if (devctl & MUSB_DEVCTL_VBUS) | 496 | if (devctl & MUSB_DEVCTL_VBUS) |
| 496 | DBG(1, "VBUS off timeout (devctl %02x)\n", devctl); | 497 | dev_dbg(musb->controller, "VBUS off timeout (devctl %02x)\n", devctl); |
| 497 | } | 498 | } |
| 498 | 499 | ||
| 499 | phy_off(); | 500 | phy_off(); |
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index f10ff00ca09..ab8e1001e5e 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
| @@ -104,10 +104,6 @@ | |||
| 104 | #define TA_WAIT_BCON(m) max_t(int, (m)->a_wait_bcon, OTG_TIME_A_WAIT_BCON) | 104 | #define TA_WAIT_BCON(m) max_t(int, (m)->a_wait_bcon, OTG_TIME_A_WAIT_BCON) |
| 105 | 105 | ||
| 106 | 106 | ||
| 107 | unsigned musb_debug; | ||
| 108 | module_param_named(debug, musb_debug, uint, S_IRUGO | S_IWUSR); | ||
| 109 | MODULE_PARM_DESC(debug, "Debug message level. Default = 0"); | ||
| 110 | |||
| 111 | #define DRIVER_AUTHOR "Mentor Graphics, Texas Instruments, Nokia" | 107 | #define DRIVER_AUTHOR "Mentor Graphics, Texas Instruments, Nokia" |
| 112 | #define DRIVER_DESC "Inventra Dual-Role USB Controller Driver" | 108 | #define DRIVER_DESC "Inventra Dual-Role USB Controller Driver" |
| 113 | 109 | ||
| @@ -157,10 +153,8 @@ static int musb_ulpi_read(struct otg_transceiver *otg, u32 offset) | |||
| 157 | while (!(musb_readb(addr, MUSB_ULPI_REG_CONTROL) | 153 | while (!(musb_readb(addr, MUSB_ULPI_REG_CONTROL) |
| 158 | & MUSB_ULPI_REG_CMPLT)) { | 154 | & MUSB_ULPI_REG_CMPLT)) { |
| 159 | i++; | 155 | i++; |
| 160 | if (i == 10000) { | 156 | if (i == 10000) |
| 161 | DBG(3, "ULPI read timed out\n"); | ||
| 162 | return -ETIMEDOUT; | 157 | return -ETIMEDOUT; |
| 163 | } | ||
| 164 | 158 | ||
| 165 | } | 159 | } |
| 166 | r = musb_readb(addr, MUSB_ULPI_REG_CONTROL); | 160 | r = musb_readb(addr, MUSB_ULPI_REG_CONTROL); |
| @@ -190,10 +184,8 @@ static int musb_ulpi_write(struct otg_transceiver *otg, | |||
| 190 | while (!(musb_readb(addr, MUSB_ULPI_REG_CONTROL) | 184 | while (!(musb_readb(addr, MUSB_ULPI_REG_CONTROL) |
| 191 | & MUSB_ULPI_REG_CMPLT)) { | 185 | & MUSB_ULPI_REG_CMPLT)) { |
| 192 | i++; | 186 | i++; |
| 193 | if (i == 10000) { | 187 | if (i == 10000) |
| 194 | DBG(3, "ULPI write timed out\n"); | ||
| 195 | return -ETIMEDOUT; | 188 | return -ETIMEDOUT; |
| 196 | } | ||
| 197 | } | 189 | } |
| 198 | 190 | ||
| 199 | r = musb_readb(addr, MUSB_ULPI_REG_CONTROL); | 191 | r = musb_readb(addr, MUSB_ULPI_REG_CONTROL); |
| @@ -221,11 +213,12 @@ static struct otg_io_access_ops musb_ulpi_access = { | |||
| 221 | */ | 213 | */ |
| 222 | void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src) | 214 | void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src) |
| 223 | { | 215 | { |
| 216 | struct musb *musb = hw_ep->musb; | ||
| 224 | void __iomem *fifo = hw_ep->fifo; | 217 | void __iomem *fifo = hw_ep->fifo; |
| 225 | 218 | ||
| 226 | prefetch((u8 *)src); | 219 | prefetch((u8 *)src); |
| 227 | 220 | ||
| 228 | DBG(4, "%cX ep%d fifo %p count %d buf %p\n", | 221 | dev_dbg(musb->controller, "%cX ep%d fifo %p count %d buf %p\n", |
| 229 | 'T', hw_ep->epnum, fifo, len, src); | 222 | 'T', hw_ep->epnum, fifo, len, src); |
| 230 | 223 | ||
| 231 | /* we can't assume unaligned reads work */ | 224 | /* we can't assume unaligned reads work */ |
| @@ -262,9 +255,10 @@ void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src) | |||
| 262 | */ | 255 | */ |
| 263 | void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst) | 256 | void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst) |
| 264 | { | 257 | { |
| 258 | struct musb *musb = hw_ep->musb; | ||
| 265 | void __iomem *fifo = hw_ep->fifo; | 259 | void __iomem *fifo = hw_ep->fifo; |
| 266 | 260 | ||
| 267 | DBG(4, "%cX ep%d fifo %p count %d buf %p\n", | 261 | dev_dbg(musb->controller, "%cX ep%d fifo %p count %d buf %p\n", |
| 268 | 'R', hw_ep->epnum, fifo, len, dst); | 262 | 'R', hw_ep->epnum, fifo, len, dst); |
| 269 | 263 | ||
| 270 | /* we can't assume unaligned writes work */ | 264 | /* we can't assume unaligned writes work */ |
| @@ -333,26 +327,6 @@ void musb_load_testpacket(struct musb *musb) | |||
| 333 | 327 | ||
| 334 | /*-------------------------------------------------------------------------*/ | 328 | /*-------------------------------------------------------------------------*/ |
| 335 | 329 | ||
| 336 | const char *otg_state_string(struct musb *musb) | ||
| 337 | { | ||
| 338 | switch (musb->xceiv->state) { | ||
| 339 | case OTG_STATE_A_IDLE: return "a_idle"; | ||
| 340 | case OTG_STATE_A_WAIT_VRISE: return "a_wait_vrise"; | ||
| 341 | case OTG_STATE_A_WAIT_BCON: return "a_wait_bcon"; | ||
| 342 | case OTG_STATE_A_HOST: return "a_host"; | ||
| 343 | case OTG_STATE_A_SUSPEND: return "a_suspend"; | ||
| 344 | case OTG_STATE_A_PERIPHERAL: return "a_peripheral"; | ||
| 345 | case OTG_STATE_A_WAIT_VFALL: return "a_wait_vfall"; | ||
| 346 | case OTG_STATE_A_VBUS_ERR: return "a_vbus_err"; | ||
| 347 | case OTG_STATE_B_IDLE: return "b_idle"; | ||
| 348 | case OTG_STATE_B_SRP_INIT: return "b_srp_init"; | ||
| 349 | case OTG_STATE_B_PERIPHERAL: return "b_peripheral"; | ||
| 350 | case OTG_STATE_B_WAIT_ACON: return "b_wait_acon"; | ||
| 351 | case OTG_STATE_B_HOST: return "b_host"; | ||
| 352 | default: return "UNDEFINED"; | ||
| 353 | } | ||
| 354 | } | ||
| 355 | |||
| 356 | #ifdef CONFIG_USB_MUSB_OTG | 330 | #ifdef CONFIG_USB_MUSB_OTG |
| 357 | 331 | ||
| 358 | /* | 332 | /* |
| @@ -366,19 +340,21 @@ void musb_otg_timer_func(unsigned long data) | |||
| 366 | spin_lock_irqsave(&musb->lock, flags); | 340 | spin_lock_irqsave(&musb->lock, flags); |
| 367 | switch (musb->xceiv->state) { | 341 | switch (musb->xceiv->state) { |
| 368 | case OTG_STATE_B_WAIT_ACON: | 342 | case OTG_STATE_B_WAIT_ACON: |
| 369 | DBG(1, "HNP: b_wait_acon timeout; back to b_peripheral\n"); | 343 | dev_dbg(musb->controller, "HNP: b_wait_acon timeout; back to b_peripheral\n"); |
| 370 | musb_g_disconnect(musb); | 344 | musb_g_disconnect(musb); |
| 371 | musb->xceiv->state = OTG_STATE_B_PERIPHERAL; | 345 | musb->xceiv->state = OTG_STATE_B_PERIPHERAL; |
| 372 | musb->is_active = 0; | 346 | musb->is_active = 0; |
| 373 | break; | 347 | break; |
| 374 | case OTG_STATE_A_SUSPEND: | 348 | case OTG_STATE_A_SUSPEND: |
| 375 | case OTG_STATE_A_WAIT_BCON: | 349 | case OTG_STATE_A_WAIT_BCON: |
| 376 | DBG(1, "HNP: %s timeout\n", otg_state_string(musb)); | 350 | dev_dbg(musb->controller, "HNP: %s timeout\n", |
| 351 | otg_state_string(musb->xceiv->state)); | ||
| 377 | musb_platform_set_vbus(musb, 0); | 352 | musb_platform_set_vbus(musb, 0); |
| 378 | musb->xceiv->state = OTG_STATE_A_WAIT_VFALL; | 353 | musb->xceiv->state = OTG_STATE_A_WAIT_VFALL; |
| 379 | break; | 354 | break; |
| 380 | default: | 355 | default: |
| 381 | DBG(1, "HNP: Unhandled mode %s\n", otg_state_string(musb)); | 356 | dev_dbg(musb->controller, "HNP: Unhandled mode %s\n", |
| 357 | otg_state_string(musb->xceiv->state)); | ||
| 382 | } | 358 | } |
| 383 | musb->ignore_disconnect = 0; | 359 | musb->ignore_disconnect = 0; |
| 384 | spin_unlock_irqrestore(&musb->lock, flags); | 360 | spin_unlock_irqrestore(&musb->lock, flags); |
| @@ -393,15 +369,16 @@ void musb_hnp_stop(struct musb *musb) | |||
| 393 | void __iomem *mbase = musb->mregs; | 369 | void __iomem *mbase = musb->mregs; |
| 394 | u8 reg; | 370 | u8 reg; |
| 395 | 371 | ||
| 396 | DBG(1, "HNP: stop from %s\n", otg_state_string(musb)); | 372 | dev_dbg(musb->controller, "HNP: stop from %s\n", otg_state_string(musb->xceiv->state)); |
| 397 | 373 | ||
| 398 | switch (musb->xceiv->state) { | 374 | switch (musb->xceiv->state) { |
| 399 | case OTG_STATE_A_PERIPHERAL: | 375 | case OTG_STATE_A_PERIPHERAL: |
| 400 | musb_g_disconnect(musb); | 376 | musb_g_disconnect(musb); |
| 401 | DBG(1, "HNP: back to %s\n", otg_state_string(musb)); | 377 | dev_dbg(musb->controller, "HNP: back to %s\n", |
| 378 | otg_state_string(musb->xceiv->state)); | ||
| 402 | break; | 379 | break; |
| 403 | case OTG_STATE_B_HOST: | 380 | case OTG_STATE_B_HOST: |
| 404 | DBG(1, "HNP: Disabling HR\n"); | 381 | dev_dbg(musb->controller, "HNP: Disabling HR\n"); |
| 405 | hcd->self.is_b_host = 0; | 382 | hcd->self.is_b_host = 0; |
| 406 | musb->xceiv->state = OTG_STATE_B_PERIPHERAL; | 383 | musb->xceiv->state = OTG_STATE_B_PERIPHERAL; |
| 407 | MUSB_DEV_MODE(musb); | 384 | MUSB_DEV_MODE(musb); |
| @@ -411,8 +388,8 @@ void musb_hnp_stop(struct musb *musb) | |||
| 411 | /* REVISIT: Start SESSION_REQUEST here? */ | 388 | /* REVISIT: Start SESSION_REQUEST here? */ |
| 412 | break; | 389 | break; |
| 413 | default: | 390 | default: |
| 414 | DBG(1, "HNP: Stopping in unknown state %s\n", | 391 | dev_dbg(musb->controller, "HNP: Stopping in unknown state %s\n", |
| 415 | otg_state_string(musb)); | 392 | otg_state_string(musb->xceiv->state)); |
| 416 | } | 393 | } |
| 417 | 394 | ||
| 418 | /* | 395 | /* |
| @@ -442,7 +419,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
| 442 | { | 419 | { |
| 443 | irqreturn_t handled = IRQ_NONE; | 420 | irqreturn_t handled = IRQ_NONE; |
| 444 | 421 | ||
| 445 | DBG(3, "<== Power=%02x, DevCtl=%02x, int_usb=0x%x\n", power, devctl, | 422 | dev_dbg(musb->controller, "<== Power=%02x, DevCtl=%02x, int_usb=0x%x\n", power, devctl, |
| 446 | int_usb); | 423 | int_usb); |
| 447 | 424 | ||
| 448 | /* in host mode, the peripheral may issue remote wakeup. | 425 | /* in host mode, the peripheral may issue remote wakeup. |
| @@ -451,7 +428,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
| 451 | */ | 428 | */ |
| 452 | if (int_usb & MUSB_INTR_RESUME) { | 429 | if (int_usb & MUSB_INTR_RESUME) { |
| 453 | handled = IRQ_HANDLED; | 430 | handled = IRQ_HANDLED; |
| 454 | DBG(3, "RESUME (%s)\n", otg_state_string(musb)); | 431 | dev_dbg(musb->controller, "RESUME (%s)\n", otg_state_string(musb->xceiv->state)); |
| 455 | 432 | ||
| 456 | if (devctl & MUSB_DEVCTL_HM) { | 433 | if (devctl & MUSB_DEVCTL_HM) { |
| 457 | #ifdef CONFIG_USB_MUSB_HDRC_HCD | 434 | #ifdef CONFIG_USB_MUSB_HDRC_HCD |
| @@ -466,7 +443,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
| 466 | if (power & MUSB_POWER_SUSPENDM) { | 443 | if (power & MUSB_POWER_SUSPENDM) { |
| 467 | /* spurious */ | 444 | /* spurious */ |
| 468 | musb->int_usb &= ~MUSB_INTR_SUSPEND; | 445 | musb->int_usb &= ~MUSB_INTR_SUSPEND; |
| 469 | DBG(2, "Spurious SUSPENDM\n"); | 446 | dev_dbg(musb->controller, "Spurious SUSPENDM\n"); |
| 470 | break; | 447 | break; |
| 471 | } | 448 | } |
| 472 | 449 | ||
| @@ -492,7 +469,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
| 492 | default: | 469 | default: |
| 493 | WARNING("bogus %s RESUME (%s)\n", | 470 | WARNING("bogus %s RESUME (%s)\n", |
| 494 | "host", | 471 | "host", |
| 495 | otg_state_string(musb)); | 472 | otg_state_string(musb->xceiv->state)); |
| 496 | } | 473 | } |
| 497 | #endif | 474 | #endif |
| 498 | } else { | 475 | } else { |
| @@ -526,7 +503,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
| 526 | default: | 503 | default: |
| 527 | WARNING("bogus %s RESUME (%s)\n", | 504 | WARNING("bogus %s RESUME (%s)\n", |
| 528 | "peripheral", | 505 | "peripheral", |
| 529 | otg_state_string(musb)); | 506 | otg_state_string(musb->xceiv->state)); |
| 530 | } | 507 | } |
| 531 | } | 508 | } |
| 532 | } | 509 | } |
| @@ -538,11 +515,12 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
| 538 | 515 | ||
| 539 | if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS | 516 | if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS |
| 540 | && (devctl & MUSB_DEVCTL_BDEVICE)) { | 517 | && (devctl & MUSB_DEVCTL_BDEVICE)) { |
| 541 | DBG(3, "SessReq while on B state\n"); | 518 | dev_dbg(musb->controller, "SessReq while on B state\n"); |
| 542 | return IRQ_HANDLED; | 519 | return IRQ_HANDLED; |
| 543 | } | 520 | } |
| 544 | 521 | ||
| 545 | DBG(1, "SESSION_REQUEST (%s)\n", otg_state_string(musb)); | 522 | dev_dbg(musb->controller, "SESSION_REQUEST (%s)\n", |
| 523 | otg_state_string(musb->xceiv->state)); | ||
| 546 | 524 | ||
| 547 | /* IRQ arrives from ID pin sense or (later, if VBUS power | 525 | /* IRQ arrives from ID pin sense or (later, if VBUS power |
| 548 | * is removed) SRP. responses are time critical: | 526 | * is removed) SRP. responses are time critical: |
| @@ -606,8 +584,8 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
| 606 | break; | 584 | break; |
| 607 | } | 585 | } |
| 608 | 586 | ||
| 609 | DBG(1, "VBUS_ERROR in %s (%02x, %s), retry #%d, port1 %08x\n", | 587 | dev_dbg(musb->controller, "VBUS_ERROR in %s (%02x, %s), retry #%d, port1 %08x\n", |
| 610 | otg_state_string(musb), | 588 | otg_state_string(musb->xceiv->state), |
| 611 | devctl, | 589 | devctl, |
| 612 | ({ char *s; | 590 | ({ char *s; |
| 613 | switch (devctl & MUSB_DEVCTL_VBUS) { | 591 | switch (devctl & MUSB_DEVCTL_VBUS) { |
| @@ -632,8 +610,8 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
| 632 | 610 | ||
| 633 | #endif | 611 | #endif |
| 634 | if (int_usb & MUSB_INTR_SUSPEND) { | 612 | if (int_usb & MUSB_INTR_SUSPEND) { |
| 635 | DBG(1, "SUSPEND (%s) devctl %02x power %02x\n", | 613 | dev_dbg(musb->controller, "SUSPEND (%s) devctl %02x power %02x\n", |
| 636 | otg_state_string(musb), devctl, power); | 614 | otg_state_string(musb->xceiv->state), devctl, power); |
| 637 | handled = IRQ_HANDLED; | 615 | handled = IRQ_HANDLED; |
| 638 | 616 | ||
| 639 | switch (musb->xceiv->state) { | 617 | switch (musb->xceiv->state) { |
| @@ -665,7 +643,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
| 665 | if (musb->is_active) { | 643 | if (musb->is_active) { |
| 666 | #ifdef CONFIG_USB_MUSB_OTG | 644 | #ifdef CONFIG_USB_MUSB_OTG |
| 667 | musb->xceiv->state = OTG_STATE_B_WAIT_ACON; | 645 | musb->xceiv->state = OTG_STATE_B_WAIT_ACON; |
| 668 | DBG(1, "HNP: Setting timer for b_ase0_brst\n"); | 646 | dev_dbg(musb->controller, "HNP: Setting timer for b_ase0_brst\n"); |
| 669 | mod_timer(&musb->otg_timer, jiffies | 647 | mod_timer(&musb->otg_timer, jiffies |
| 670 | + msecs_to_jiffies( | 648 | + msecs_to_jiffies( |
| 671 | OTG_TIME_B_ASE0_BRST)); | 649 | OTG_TIME_B_ASE0_BRST)); |
| @@ -684,7 +662,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
| 684 | break; | 662 | break; |
| 685 | case OTG_STATE_B_HOST: | 663 | case OTG_STATE_B_HOST: |
| 686 | /* Transition to B_PERIPHERAL, see 6.8.2.6 p 44 */ | 664 | /* Transition to B_PERIPHERAL, see 6.8.2.6 p 44 */ |
| 687 | DBG(1, "REVISIT: SUSPEND as B_HOST\n"); | 665 | dev_dbg(musb->controller, "REVISIT: SUSPEND as B_HOST\n"); |
| 688 | break; | 666 | break; |
| 689 | default: | 667 | default: |
| 690 | /* "should not happen" */ | 668 | /* "should not happen" */ |
| @@ -727,14 +705,14 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | |||
| 727 | switch (musb->xceiv->state) { | 705 | switch (musb->xceiv->state) { |
| 728 | case OTG_STATE_B_PERIPHERAL: | 706 | case OTG_STATE_B_PERIPHERAL: |
| 729 | if (int_usb & MUSB_INTR_SUSPEND) { | 707 | if (int_usb & MUSB_INTR_SUSPEND) { |
| 730 | DBG(1, "HNP: SUSPEND+CONNECT, now b_host\n"); | 708 | dev_dbg(musb->controller, "HNP: SUSPEND+CONNECT, now b_host\n"); |
| 731 | int_usb &= ~MUSB_INTR_SUSPEND; | 709 | int_usb &= ~MUSB_INTR_SUSPEND; |
| 732 | goto b_host; | 710 | goto b_host; |
| 733 | } else | 711 | } else |
| 734 | DBG(1, "CONNECT as b_peripheral???\n"); | 712 | dev_dbg(musb->controller, "CONNECT as b_peripheral???\n"); |
| 735 | break; | 713 | break; |
| 736 | case OTG_STATE_B_WAIT_ACON: | 714 | case OTG_STATE_B_WAIT_ACON: |
| 737 | DBG(1, "HNP: CONNECT, now b_host\n"); | 715 | dev_dbg(musb->controller, "HNP: CONNECT, now b_host\n"); |
| 738 | b_host: | 716 | b_host: |
| 739 | musb->xceiv->state = OTG_STATE_B_HOST; | 717 | musb->xceiv->state = OTG_STATE_B_HOST; |
| 740 | hcd->self.is_b_host = 1; | 718 | hcd->self.is_b_host = 1; |
| @@ -757,14 +735,14 @@ b_host: | |||
| 757 | else | 735 | else |
| 758 | usb_hcd_resume_root_hub(hcd); | 736 | usb_hcd_resume_root_hub(hcd); |
| 759 | 737 | ||
| 760 | DBG(1, "CONNECT (%s) devctl %02x\n", | 738 | dev_dbg(musb->controller, "CONNECT (%s) devctl %02x\n", |
| 761 | otg_state_string(musb), devctl); | 739 | otg_state_string(musb->xceiv->state), devctl); |
| 762 | } | 740 | } |
| 763 | #endif /* CONFIG_USB_MUSB_HDRC_HCD */ | 741 | #endif /* CONFIG_USB_MUSB_HDRC_HCD */ |
| 764 | 742 | ||
| 765 | if ((int_usb & MUSB_INTR_DISCONNECT) && !musb->ignore_disconnect) { | 743 | if ((int_usb & MUSB_INTR_DISCONNECT) && !musb->ignore_disconnect) { |
| 766 | DBG(1, "DISCONNECT (%s) as %s, devctl %02x\n", | 744 | dev_dbg(musb->controller, "DISCONNECT (%s) as %s, devctl %02x\n", |
| 767 | otg_state_string(musb), | 745 | otg_state_string(musb->xceiv->state), |
| 768 | MUSB_MODE(musb), devctl); | 746 | MUSB_MODE(musb), devctl); |
| 769 | handled = IRQ_HANDLED; | 747 | handled = IRQ_HANDLED; |
| 770 | 748 | ||
| @@ -807,7 +785,7 @@ b_host: | |||
| 807 | #endif /* GADGET */ | 785 | #endif /* GADGET */ |
| 808 | default: | 786 | default: |
| 809 | WARNING("unhandled DISCONNECT transition (%s)\n", | 787 | WARNING("unhandled DISCONNECT transition (%s)\n", |
| 810 | otg_state_string(musb)); | 788 | otg_state_string(musb->xceiv->state)); |
| 811 | break; | 789 | break; |
| 812 | } | 790 | } |
| 813 | } | 791 | } |
| @@ -826,13 +804,14 @@ b_host: | |||
| 826 | * stop the session. | 804 | * stop the session. |
| 827 | */ | 805 | */ |
| 828 | if (devctl & (MUSB_DEVCTL_FSDEV | MUSB_DEVCTL_LSDEV)) | 806 | if (devctl & (MUSB_DEVCTL_FSDEV | MUSB_DEVCTL_LSDEV)) |
| 829 | DBG(1, "BABBLE devctl: %02x\n", devctl); | 807 | dev_dbg(musb->controller, "BABBLE devctl: %02x\n", devctl); |
| 830 | else { | 808 | else { |
| 831 | ERR("Stopping host session -- babble\n"); | 809 | ERR("Stopping host session -- babble\n"); |
| 832 | musb_writeb(musb->mregs, MUSB_DEVCTL, 0); | 810 | musb_writeb(musb->mregs, MUSB_DEVCTL, 0); |
| 833 | } | 811 | } |
| 834 | } else if (is_peripheral_capable()) { | 812 | } else if (is_peripheral_capable()) { |
| 835 | DBG(1, "BUS RESET as %s\n", otg_state_string(musb)); | 813 | dev_dbg(musb->controller, "BUS RESET as %s\n", |
| 814 | otg_state_string(musb->xceiv->state)); | ||
| 836 | switch (musb->xceiv->state) { | 815 | switch (musb->xceiv->state) { |
| 837 | #ifdef CONFIG_USB_OTG | 816 | #ifdef CONFIG_USB_OTG |
| 838 | case OTG_STATE_A_SUSPEND: | 817 | case OTG_STATE_A_SUSPEND: |
| @@ -845,9 +824,9 @@ b_host: | |||
| 845 | /* FALLTHROUGH */ | 824 | /* FALLTHROUGH */ |
| 846 | case OTG_STATE_A_WAIT_BCON: /* OPT TD.4.7-900ms */ | 825 | case OTG_STATE_A_WAIT_BCON: /* OPT TD.4.7-900ms */ |
| 847 | /* never use invalid T(a_wait_bcon) */ | 826 | /* never use invalid T(a_wait_bcon) */ |
| 848 | DBG(1, "HNP: in %s, %d msec timeout\n", | 827 | dev_dbg(musb->controller, "HNP: in %s, %d msec timeout\n", |
| 849 | otg_state_string(musb), | 828 | otg_state_string(musb->xceiv->state), |
| 850 | TA_WAIT_BCON(musb)); | 829 | TA_WAIT_BCON(musb)); |
| 851 | mod_timer(&musb->otg_timer, jiffies | 830 | mod_timer(&musb->otg_timer, jiffies |
| 852 | + msecs_to_jiffies(TA_WAIT_BCON(musb))); | 831 | + msecs_to_jiffies(TA_WAIT_BCON(musb))); |
| 853 | break; | 832 | break; |
| @@ -857,8 +836,8 @@ b_host: | |||
| 857 | musb_g_reset(musb); | 836 | musb_g_reset(musb); |
| 858 | break; | 837 | break; |
| 859 | case OTG_STATE_B_WAIT_ACON: | 838 | case OTG_STATE_B_WAIT_ACON: |
| 860 | DBG(1, "HNP: RESET (%s), to b_peripheral\n", | 839 | dev_dbg(musb->controller, "HNP: RESET (%s), to b_peripheral\n", |
| 861 | otg_state_string(musb)); | 840 | otg_state_string(musb->xceiv->state)); |
| 862 | musb->xceiv->state = OTG_STATE_B_PERIPHERAL; | 841 | musb->xceiv->state = OTG_STATE_B_PERIPHERAL; |
| 863 | musb_g_reset(musb); | 842 | musb_g_reset(musb); |
| 864 | break; | 843 | break; |
| @@ -870,8 +849,8 @@ b_host: | |||
| 870 | musb_g_reset(musb); | 849 | musb_g_reset(musb); |
| 871 | break; | 850 | break; |
| 872 | default: | 851 | default: |
| 873 | DBG(1, "Unhandled BUS RESET as %s\n", | 852 | dev_dbg(musb->controller, "Unhandled BUS RESET as %s\n", |
| 874 | otg_state_string(musb)); | 853 | otg_state_string(musb->xceiv->state)); |
| 875 | } | 854 | } |
| 876 | } | 855 | } |
| 877 | } | 856 | } |
| @@ -894,7 +873,7 @@ b_host: | |||
| 894 | u8 epnum; | 873 | u8 epnum; |
| 895 | u16 frame; | 874 | u16 frame; |
| 896 | 875 | ||
| 897 | DBG(6, "START_OF_FRAME\n"); | 876 | dev_dbg(musb->controller, "START_OF_FRAME\n"); |
| 898 | handled = IRQ_HANDLED; | 877 | handled = IRQ_HANDLED; |
| 899 | 878 | ||
| 900 | /* start any periodic Tx transfers waiting for current frame */ | 879 | /* start any periodic Tx transfers waiting for current frame */ |
| @@ -936,7 +915,7 @@ void musb_start(struct musb *musb) | |||
| 936 | void __iomem *regs = musb->mregs; | 915 | void __iomem *regs = musb->mregs; |
| 937 | u8 devctl = musb_readb(regs, MUSB_DEVCTL); | 916 | u8 devctl = musb_readb(regs, MUSB_DEVCTL); |
| 938 | 917 | ||
| 939 | DBG(2, "<== devctl %02x\n", devctl); | 918 | dev_dbg(musb->controller, "<== devctl %02x\n", devctl); |
| 940 | 919 | ||
| 941 | /* Set INT enable registers, enable interrupts */ | 920 | /* Set INT enable registers, enable interrupts */ |
| 942 | musb_writew(regs, MUSB_INTRTXE, musb->epmask); | 921 | musb_writew(regs, MUSB_INTRTXE, musb->epmask); |
| @@ -1013,7 +992,7 @@ void musb_stop(struct musb *musb) | |||
| 1013 | /* stop IRQs, timers, ... */ | 992 | /* stop IRQs, timers, ... */ |
| 1014 | musb_platform_disable(musb); | 993 | musb_platform_disable(musb); |
| 1015 | musb_generic_disable(musb); | 994 | musb_generic_disable(musb); |
| 1016 | DBG(3, "HDRC disabled\n"); | 995 | dev_dbg(musb->controller, "HDRC disabled\n"); |
| 1017 | 996 | ||
| 1018 | /* FIXME | 997 | /* FIXME |
| 1019 | * - mark host and/or peripheral drivers unusable/inactive | 998 | * - mark host and/or peripheral drivers unusable/inactive |
| @@ -1359,7 +1338,7 @@ static int __init ep_config_from_hw(struct musb *musb) | |||
| 1359 | void *mbase = musb->mregs; | 1338 | void *mbase = musb->mregs; |
| 1360 | int ret = 0; | 1339 | int ret = 0; |
| 1361 | 1340 | ||
| 1362 | DBG(2, "<== static silicon ep config\n"); | 1341 | dev_dbg(musb->controller, "<== static silicon ep config\n"); |
| 1363 | 1342 | ||
| 1364 | /* FIXME pick up ep0 maxpacket size */ | 1343 | /* FIXME pick up ep0 maxpacket size */ |
| 1365 | 1344 | ||
| @@ -1506,7 +1485,7 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb) | |||
| 1506 | #endif | 1485 | #endif |
| 1507 | 1486 | ||
| 1508 | if (hw_ep->max_packet_sz_tx) { | 1487 | if (hw_ep->max_packet_sz_tx) { |
| 1509 | DBG(1, | 1488 | dev_dbg(musb->controller, |
| 1510 | "%s: hw_ep %d%s, %smax %d\n", | 1489 | "%s: hw_ep %d%s, %smax %d\n", |
| 1511 | musb_driver_name, i, | 1490 | musb_driver_name, i, |
| 1512 | hw_ep->is_shared_fifo ? "shared" : "tx", | 1491 | hw_ep->is_shared_fifo ? "shared" : "tx", |
| @@ -1515,7 +1494,7 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb) | |||
| 1515 | hw_ep->max_packet_sz_tx); | 1494 | hw_ep->max_packet_sz_tx); |
| 1516 | } | 1495 | } |
| 1517 | if (hw_ep->max_packet_sz_rx && !hw_ep->is_shared_fifo) { | 1496 | if (hw_ep->max_packet_sz_rx && !hw_ep->is_shared_fifo) { |
| 1518 | DBG(1, | 1497 | dev_dbg(musb->controller, |
| 1519 | "%s: hw_ep %d%s, %smax %d\n", | 1498 | "%s: hw_ep %d%s, %smax %d\n", |
| 1520 | musb_driver_name, i, | 1499 | musb_driver_name, i, |
| 1521 | "rx", | 1500 | "rx", |
| @@ -1524,7 +1503,7 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb) | |||
| 1524 | hw_ep->max_packet_sz_rx); | 1503 | hw_ep->max_packet_sz_rx); |
| 1525 | } | 1504 | } |
| 1526 | if (!(hw_ep->max_packet_sz_tx || hw_ep->max_packet_sz_rx)) | 1505 | if (!(hw_ep->max_packet_sz_tx || hw_ep->max_packet_sz_rx)) |
| 1527 | DBG(1, "hw_ep %d not configured\n", i); | 1506 | dev_dbg(musb->controller, "hw_ep %d not configured\n", i); |
| 1528 | } | 1507 | } |
| 1529 | 1508 | ||
| 1530 | return 0; | 1509 | return 0; |
| @@ -1577,14 +1556,14 @@ irqreturn_t musb_interrupt(struct musb *musb) | |||
| 1577 | devctl = musb_readb(musb->mregs, MUSB_DEVCTL); | 1556 | devctl = musb_readb(musb->mregs, MUSB_DEVCTL); |
| 1578 | power = musb_readb(musb->mregs, MUSB_POWER); | 1557 | power = musb_readb(musb->mregs, MUSB_POWER); |
| 1579 | 1558 | ||
| 1580 | DBG(4, "** IRQ %s usb%04x tx%04x rx%04x\n", | 1559 | dev_dbg(musb->controller, "** IRQ %s usb%04x tx%04x rx%04x\n", |
| 1581 | (devctl & MUSB_DEVCTL_HM) ? "host" : "peripheral", | 1560 | (devctl & MUSB_DEVCTL_HM) ? "host" : "peripheral", |
| 1582 | musb->int_usb, musb->int_tx, musb->int_rx); | 1561 | musb->int_usb, musb->int_tx, musb->int_rx); |
| 1583 | 1562 | ||
| 1584 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC | 1563 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC |
| 1585 | if (is_otg_enabled(musb) || is_peripheral_enabled(musb)) | 1564 | if (is_otg_enabled(musb) || is_peripheral_enabled(musb)) |
| 1586 | if (!musb->gadget_driver) { | 1565 | if (!musb->gadget_driver) { |
| 1587 | DBG(5, "No gadget driver loaded\n"); | 1566 | dev_dbg(musb->controller, "No gadget driver loaded\n"); |
| 1588 | return IRQ_HANDLED; | 1567 | return IRQ_HANDLED; |
| 1589 | } | 1568 | } |
| 1590 | #endif | 1569 | #endif |
| @@ -1649,7 +1628,7 @@ irqreturn_t musb_interrupt(struct musb *musb) | |||
| 1649 | 1628 | ||
| 1650 | return retval; | 1629 | return retval; |
| 1651 | } | 1630 | } |
| 1652 | 1631 | EXPORT_SYMBOL_GPL(musb_interrupt); | |
| 1653 | 1632 | ||
| 1654 | #ifndef CONFIG_MUSB_PIO_ONLY | 1633 | #ifndef CONFIG_MUSB_PIO_ONLY |
| 1655 | static int __initdata use_dma = 1; | 1634 | static int __initdata use_dma = 1; |
| @@ -1713,7 +1692,7 @@ musb_mode_show(struct device *dev, struct device_attribute *attr, char *buf) | |||
| 1713 | int ret = -EINVAL; | 1692 | int ret = -EINVAL; |
| 1714 | 1693 | ||
| 1715 | spin_lock_irqsave(&musb->lock, flags); | 1694 | spin_lock_irqsave(&musb->lock, flags); |
| 1716 | ret = sprintf(buf, "%s\n", otg_state_string(musb)); | 1695 | ret = sprintf(buf, "%s\n", otg_state_string(musb->xceiv->state)); |
| 1717 | spin_unlock_irqrestore(&musb->lock, flags); | 1696 | spin_unlock_irqrestore(&musb->lock, flags); |
| 1718 | 1697 | ||
| 1719 | return ret; | 1698 | return ret; |
| @@ -2075,7 +2054,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) | |||
| 2075 | status = usb_add_hcd(musb_to_hcd(musb), -1, 0); | 2054 | status = usb_add_hcd(musb_to_hcd(musb), -1, 0); |
| 2076 | 2055 | ||
| 2077 | hcd->self.uses_pio_for_control = 1; | 2056 | hcd->self.uses_pio_for_control = 1; |
| 2078 | DBG(1, "%s mode, status %d, devctl %02x %c\n", | 2057 | dev_dbg(musb->controller, "%s mode, status %d, devctl %02x %c\n", |
| 2079 | "HOST", status, | 2058 | "HOST", status, |
| 2080 | musb_readb(musb->mregs, MUSB_DEVCTL), | 2059 | musb_readb(musb->mregs, MUSB_DEVCTL), |
| 2081 | (musb_readb(musb->mregs, MUSB_DEVCTL) | 2060 | (musb_readb(musb->mregs, MUSB_DEVCTL) |
| @@ -2089,7 +2068,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) | |||
| 2089 | 2068 | ||
| 2090 | status = musb_gadget_setup(musb); | 2069 | status = musb_gadget_setup(musb); |
| 2091 | 2070 | ||
| 2092 | DBG(1, "%s mode, status %d, dev%02x\n", | 2071 | dev_dbg(musb->controller, "%s mode, status %d, dev%02x\n", |
| 2093 | is_otg_enabled(musb) ? "OTG" : "PERIPHERAL", | 2072 | is_otg_enabled(musb) ? "OTG" : "PERIPHERAL", |
| 2094 | status, | 2073 | status, |
| 2095 | musb_readb(musb->mregs, MUSB_DEVCTL)); | 2074 | musb_readb(musb->mregs, MUSB_DEVCTL)); |
| @@ -2460,6 +2439,8 @@ static int __init musb_init(void) | |||
| 2460 | "musb-dma" | 2439 | "musb-dma" |
| 2461 | #elif defined(CONFIG_USB_TUSB_OMAP_DMA) | 2440 | #elif defined(CONFIG_USB_TUSB_OMAP_DMA) |
| 2462 | "tusb-omap-dma" | 2441 | "tusb-omap-dma" |
| 2442 | #elif defined(CONFIG_USB_UX500_DMA) | ||
| 2443 | "ux500-dma" | ||
| 2463 | #else | 2444 | #else |
| 2464 | "?dma?" | 2445 | "?dma?" |
| 2465 | #endif | 2446 | #endif |
| @@ -2471,8 +2452,8 @@ static int __init musb_init(void) | |||
| 2471 | #elif defined(CONFIG_USB_MUSB_HDRC_HCD) | 2452 | #elif defined(CONFIG_USB_MUSB_HDRC_HCD) |
| 2472 | "host" | 2453 | "host" |
| 2473 | #endif | 2454 | #endif |
| 2474 | ", debug=%d\n", | 2455 | , |
| 2475 | musb_driver_name, musb_debug); | 2456 | musb_driver_name); |
| 2476 | return platform_driver_probe(&musb_driver, musb_probe); | 2457 | return platform_driver_probe(&musb_driver, musb_probe); |
| 2477 | } | 2458 | } |
| 2478 | 2459 | ||
diff --git a/drivers/usb/musb/musb_debug.h b/drivers/usb/musb/musb_debug.h index 94f6973cf8f..742eada5002 100644 --- a/drivers/usb/musb/musb_debug.h +++ b/drivers/usb/musb/musb_debug.h | |||
| @@ -42,20 +42,6 @@ | |||
| 42 | #define INFO(fmt, args...) yprintk(KERN_INFO, fmt, ## args) | 42 | #define INFO(fmt, args...) yprintk(KERN_INFO, fmt, ## args) |
| 43 | #define ERR(fmt, args...) yprintk(KERN_ERR, fmt, ## args) | 43 | #define ERR(fmt, args...) yprintk(KERN_ERR, fmt, ## args) |
| 44 | 44 | ||
| 45 | #define DBG(level, format, args...) do { \ | ||
| 46 | if (_dbg_level(level)) \ | ||
| 47 | pr_debug("%s %d: " format, __func__, __LINE__, ## args); \ | ||
| 48 | } while (0) | ||
| 49 | |||
| 50 | extern unsigned musb_debug; | ||
| 51 | |||
| 52 | static inline int _dbg_level(unsigned l) | ||
| 53 | { | ||
| 54 | return musb_debug >= l; | ||
| 55 | } | ||
| 56 | |||
| 57 | extern const char *otg_state_string(struct musb *); | ||
| 58 | |||
| 59 | #ifdef CONFIG_DEBUG_FS | 45 | #ifdef CONFIG_DEBUG_FS |
| 60 | extern int musb_init_debugfs(struct musb *musb); | 46 | extern int musb_init_debugfs(struct musb *musb); |
| 61 | extern void musb_exit_debugfs(struct musb *musb); | 47 | extern void musb_exit_debugfs(struct musb *musb); |
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index f47c20197c6..0a50a35e185 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
| @@ -147,7 +147,8 @@ static inline void unmap_dma_buffer(struct musb_request *request, | |||
| 147 | return; | 147 | return; |
| 148 | 148 | ||
| 149 | if (request->request.dma == DMA_ADDR_INVALID) { | 149 | if (request->request.dma == DMA_ADDR_INVALID) { |
| 150 | DBG(20, "not unmapping a never mapped buffer\n"); | 150 | dev_vdbg(musb->controller, |
| 151 | "not unmapping a never mapped buffer\n"); | ||
| 151 | return; | 152 | return; |
| 152 | } | 153 | } |
| 153 | if (request->map_state == MUSB_MAPPED) { | 154 | if (request->map_state == MUSB_MAPPED) { |
| @@ -198,11 +199,11 @@ __acquires(ep->musb->lock) | |||
| 198 | spin_unlock(&musb->lock); | 199 | spin_unlock(&musb->lock); |
| 199 | unmap_dma_buffer(req, musb); | 200 | unmap_dma_buffer(req, musb); |
| 200 | if (request->status == 0) | 201 | if (request->status == 0) |
| 201 | DBG(5, "%s done request %p, %d/%d\n", | 202 | dev_dbg(musb->controller, "%s done request %p, %d/%d\n", |
| 202 | ep->end_point.name, request, | 203 | ep->end_point.name, request, |
| 203 | req->request.actual, req->request.length); | 204 | req->request.actual, req->request.length); |
| 204 | else | 205 | else |
| 205 | DBG(2, "%s request %p, %d/%d fault %d\n", | 206 | dev_dbg(musb->controller, "%s request %p, %d/%d fault %d\n", |
| 206 | ep->end_point.name, request, | 207 | ep->end_point.name, request, |
| 207 | req->request.actual, req->request.length, | 208 | req->request.actual, req->request.length, |
| 208 | request->status); | 209 | request->status); |
| @@ -219,6 +220,7 @@ __acquires(ep->musb->lock) | |||
| 219 | */ | 220 | */ |
| 220 | static void nuke(struct musb_ep *ep, const int status) | 221 | static void nuke(struct musb_ep *ep, const int status) |
| 221 | { | 222 | { |
| 223 | struct musb *musb = ep->musb; | ||
| 222 | struct musb_request *req = NULL; | 224 | struct musb_request *req = NULL; |
| 223 | void __iomem *epio = ep->musb->endpoints[ep->current_epnum].regs; | 225 | void __iomem *epio = ep->musb->endpoints[ep->current_epnum].regs; |
| 224 | 226 | ||
| @@ -246,7 +248,8 @@ static void nuke(struct musb_ep *ep, const int status) | |||
| 246 | } | 248 | } |
| 247 | 249 | ||
| 248 | value = c->channel_abort(ep->dma); | 250 | value = c->channel_abort(ep->dma); |
| 249 | DBG(value ? 1 : 6, "%s: abort DMA --> %d\n", ep->name, value); | 251 | dev_dbg(musb->controller, "%s: abort DMA --> %d\n", |
| 252 | ep->name, value); | ||
| 250 | c->channel_release(ep->dma); | 253 | c->channel_release(ep->dma); |
| 251 | ep->dma = NULL; | 254 | ep->dma = NULL; |
| 252 | } | 255 | } |
| @@ -329,7 +332,7 @@ static void txstate(struct musb *musb, struct musb_request *req) | |||
| 329 | 332 | ||
| 330 | /* we shouldn't get here while DMA is active ... but we do ... */ | 333 | /* we shouldn't get here while DMA is active ... but we do ... */ |
| 331 | if (dma_channel_status(musb_ep->dma) == MUSB_DMA_STATUS_BUSY) { | 334 | if (dma_channel_status(musb_ep->dma) == MUSB_DMA_STATUS_BUSY) { |
| 332 | DBG(4, "dma pending...\n"); | 335 | dev_dbg(musb->controller, "dma pending...\n"); |
| 333 | return; | 336 | return; |
| 334 | } | 337 | } |
| 335 | 338 | ||
| @@ -341,18 +344,18 @@ static void txstate(struct musb *musb, struct musb_request *req) | |||
| 341 | (int)(request->length - request->actual)); | 344 | (int)(request->length - request->actual)); |
| 342 | 345 | ||
| 343 | if (csr & MUSB_TXCSR_TXPKTRDY) { | 346 | if (csr & MUSB_TXCSR_TXPKTRDY) { |
| 344 | DBG(5, "%s old packet still ready , txcsr %03x\n", | 347 | dev_dbg(musb->controller, "%s old packet still ready , txcsr %03x\n", |
| 345 | musb_ep->end_point.name, csr); | 348 | musb_ep->end_point.name, csr); |
| 346 | return; | 349 | return; |
| 347 | } | 350 | } |
| 348 | 351 | ||
| 349 | if (csr & MUSB_TXCSR_P_SENDSTALL) { | 352 | if (csr & MUSB_TXCSR_P_SENDSTALL) { |
| 350 | DBG(5, "%s stalling, txcsr %03x\n", | 353 | dev_dbg(musb->controller, "%s stalling, txcsr %03x\n", |
| 351 | musb_ep->end_point.name, csr); | 354 | musb_ep->end_point.name, csr); |
| 352 | return; | 355 | return; |
| 353 | } | 356 | } |
| 354 | 357 | ||
| 355 | DBG(4, "hw_ep%d, maxpacket %d, fifo count %d, txcsr %03x\n", | 358 | dev_dbg(musb->controller, "hw_ep%d, maxpacket %d, fifo count %d, txcsr %03x\n", |
| 356 | epnum, musb_ep->packet_sz, fifo_count, | 359 | epnum, musb_ep->packet_sz, fifo_count, |
| 357 | csr); | 360 | csr); |
| 358 | 361 | ||
| @@ -369,7 +372,7 @@ static void txstate(struct musb *musb, struct musb_request *req) | |||
| 369 | 372 | ||
| 370 | /* MUSB_TXCSR_P_ISO is still set correctly */ | 373 | /* MUSB_TXCSR_P_ISO is still set correctly */ |
| 371 | 374 | ||
| 372 | #ifdef CONFIG_USB_INVENTRA_DMA | 375 | #if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_UX500_DMA) |
| 373 | { | 376 | { |
| 374 | if (request_size < musb_ep->packet_sz) | 377 | if (request_size < musb_ep->packet_sz) |
| 375 | musb_ep->dma->desired_mode = 0; | 378 | musb_ep->dma->desired_mode = 0; |
| @@ -469,7 +472,7 @@ static void txstate(struct musb *musb, struct musb_request *req) | |||
| 469 | } | 472 | } |
| 470 | 473 | ||
| 471 | /* host may already have the data when this message shows... */ | 474 | /* host may already have the data when this message shows... */ |
| 472 | DBG(3, "%s TX/IN %s len %d/%d, txcsr %04x, fifo %d/%d\n", | 475 | dev_dbg(musb->controller, "%s TX/IN %s len %d/%d, txcsr %04x, fifo %d/%d\n", |
| 473 | musb_ep->end_point.name, use_dma ? "dma" : "pio", | 476 | musb_ep->end_point.name, use_dma ? "dma" : "pio", |
| 474 | request->actual, request->length, | 477 | request->actual, request->length, |
| 475 | musb_readw(epio, MUSB_TXCSR), | 478 | musb_readw(epio, MUSB_TXCSR), |
| @@ -496,7 +499,7 @@ void musb_g_tx(struct musb *musb, u8 epnum) | |||
| 496 | request = &req->request; | 499 | request = &req->request; |
| 497 | 500 | ||
| 498 | csr = musb_readw(epio, MUSB_TXCSR); | 501 | csr = musb_readw(epio, MUSB_TXCSR); |
| 499 | DBG(4, "<== %s, txcsr %04x\n", musb_ep->end_point.name, csr); | 502 | dev_dbg(musb->controller, "<== %s, txcsr %04x\n", musb_ep->end_point.name, csr); |
| 500 | 503 | ||
| 501 | dma = is_dma_capable() ? musb_ep->dma : NULL; | 504 | dma = is_dma_capable() ? musb_ep->dma : NULL; |
| 502 | 505 | ||
| @@ -516,7 +519,8 @@ void musb_g_tx(struct musb *musb, u8 epnum) | |||
| 516 | csr |= MUSB_TXCSR_P_WZC_BITS; | 519 | csr |= MUSB_TXCSR_P_WZC_BITS; |
| 517 | csr &= ~(MUSB_TXCSR_P_UNDERRUN | MUSB_TXCSR_TXPKTRDY); | 520 | csr &= ~(MUSB_TXCSR_P_UNDERRUN | MUSB_TXCSR_TXPKTRDY); |
| 518 | musb_writew(epio, MUSB_TXCSR, csr); | 521 | musb_writew(epio, MUSB_TXCSR, csr); |
| 519 | DBG(20, "underrun on ep%d, req %p\n", epnum, request); | 522 | dev_vdbg(musb->controller, "underrun on ep%d, req %p\n", |
| 523 | epnum, request); | ||
| 520 | } | 524 | } |
| 521 | 525 | ||
| 522 | if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) { | 526 | if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) { |
| @@ -524,7 +528,7 @@ void musb_g_tx(struct musb *musb, u8 epnum) | |||
| 524 | * SHOULD NOT HAPPEN... has with CPPI though, after | 528 | * SHOULD NOT HAPPEN... has with CPPI though, after |
| 525 | * changing SENDSTALL (and other cases); harmless? | 529 | * changing SENDSTALL (and other cases); harmless? |
| 526 | */ | 530 | */ |
| 527 | DBG(5, "%s dma still busy?\n", musb_ep->end_point.name); | 531 | dev_dbg(musb->controller, "%s dma still busy?\n", musb_ep->end_point.name); |
| 528 | return; | 532 | return; |
| 529 | } | 533 | } |
| 530 | 534 | ||
| @@ -540,7 +544,7 @@ void musb_g_tx(struct musb *musb, u8 epnum) | |||
| 540 | /* Ensure writebuffer is empty. */ | 544 | /* Ensure writebuffer is empty. */ |
| 541 | csr = musb_readw(epio, MUSB_TXCSR); | 545 | csr = musb_readw(epio, MUSB_TXCSR); |
| 542 | request->actual += musb_ep->dma->actual_len; | 546 | request->actual += musb_ep->dma->actual_len; |
| 543 | DBG(4, "TXCSR%d %04x, DMA off, len %zu, req %p\n", | 547 | dev_dbg(musb->controller, "TXCSR%d %04x, DMA off, len %zu, req %p\n", |
| 544 | epnum, csr, musb_ep->dma->actual_len, request); | 548 | epnum, csr, musb_ep->dma->actual_len, request); |
| 545 | } | 549 | } |
| 546 | 550 | ||
| @@ -551,7 +555,7 @@ void musb_g_tx(struct musb *musb, u8 epnum) | |||
| 551 | if ((request->zero && request->length | 555 | if ((request->zero && request->length |
| 552 | && (request->length % musb_ep->packet_sz == 0) | 556 | && (request->length % musb_ep->packet_sz == 0) |
| 553 | && (request->actual == request->length)) | 557 | && (request->actual == request->length)) |
| 554 | #ifdef CONFIG_USB_INVENTRA_DMA | 558 | #if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_UX500_DMA) |
| 555 | || (is_dma && (!dma->desired_mode || | 559 | || (is_dma && (!dma->desired_mode || |
| 556 | (request->actual & | 560 | (request->actual & |
| 557 | (musb_ep->packet_sz - 1)))) | 561 | (musb_ep->packet_sz - 1)))) |
| @@ -564,7 +568,7 @@ void musb_g_tx(struct musb *musb, u8 epnum) | |||
| 564 | if (csr & MUSB_TXCSR_TXPKTRDY) | 568 | if (csr & MUSB_TXCSR_TXPKTRDY) |
| 565 | return; | 569 | return; |
| 566 | 570 | ||
| 567 | DBG(4, "sending zero pkt\n"); | 571 | dev_dbg(musb->controller, "sending zero pkt\n"); |
| 568 | musb_writew(epio, MUSB_TXCSR, MUSB_TXCSR_MODE | 572 | musb_writew(epio, MUSB_TXCSR, MUSB_TXCSR_MODE |
| 569 | | MUSB_TXCSR_TXPKTRDY); | 573 | | MUSB_TXCSR_TXPKTRDY); |
| 570 | request->zero = 0; | 574 | request->zero = 0; |
| @@ -574,7 +578,7 @@ void musb_g_tx(struct musb *musb, u8 epnum) | |||
| 574 | musb_g_giveback(musb_ep, request, 0); | 578 | musb_g_giveback(musb_ep, request, 0); |
| 575 | req = musb_ep->desc ? next_request(musb_ep) : NULL; | 579 | req = musb_ep->desc ? next_request(musb_ep) : NULL; |
| 576 | if (!req) { | 580 | if (!req) { |
| 577 | DBG(4, "%s idle now\n", | 581 | dev_dbg(musb->controller, "%s idle now\n", |
| 578 | musb_ep->end_point.name); | 582 | musb_ep->end_point.name); |
| 579 | return; | 583 | return; |
| 580 | } | 584 | } |
| @@ -640,12 +644,12 @@ static void rxstate(struct musb *musb, struct musb_request *req) | |||
| 640 | 644 | ||
| 641 | /* We shouldn't get here while DMA is active, but we do... */ | 645 | /* We shouldn't get here while DMA is active, but we do... */ |
| 642 | if (dma_channel_status(musb_ep->dma) == MUSB_DMA_STATUS_BUSY) { | 646 | if (dma_channel_status(musb_ep->dma) == MUSB_DMA_STATUS_BUSY) { |
| 643 | DBG(4, "DMA pending...\n"); | 647 | dev_dbg(musb->controller, "DMA pending...\n"); |
| 644 | return; | 648 | return; |
| 645 | } | 649 | } |
| 646 | 650 | ||
| 647 | if (csr & MUSB_RXCSR_P_SENDSTALL) { | 651 | if (csr & MUSB_RXCSR_P_SENDSTALL) { |
| 648 | DBG(5, "%s stalling, RXCSR %04x\n", | 652 | dev_dbg(musb->controller, "%s stalling, RXCSR %04x\n", |
| 649 | musb_ep->end_point.name, csr); | 653 | musb_ep->end_point.name, csr); |
| 650 | return; | 654 | return; |
| 651 | } | 655 | } |
| @@ -754,10 +758,57 @@ static void rxstate(struct musb *musb, struct musb_request *req) | |||
| 754 | if (use_dma) | 758 | if (use_dma) |
| 755 | return; | 759 | return; |
| 756 | } | 760 | } |
| 761 | #elif defined(CONFIG_USB_UX500_DMA) | ||
| 762 | if ((is_buffer_mapped(req)) && | ||
| 763 | (request->actual < request->length)) { | ||
| 764 | |||
| 765 | struct dma_controller *c; | ||
| 766 | struct dma_channel *channel; | ||
| 767 | int transfer_size = 0; | ||
| 768 | |||
| 769 | c = musb->dma_controller; | ||
| 770 | channel = musb_ep->dma; | ||
| 771 | |||
| 772 | /* In case first packet is short */ | ||
| 773 | if (len < musb_ep->packet_sz) | ||
| 774 | transfer_size = len; | ||
| 775 | else if (request->short_not_ok) | ||
| 776 | transfer_size = min(request->length - | ||
| 777 | request->actual, | ||
| 778 | channel->max_len); | ||
| 779 | else | ||
| 780 | transfer_size = min(request->length - | ||
| 781 | request->actual, | ||
| 782 | (unsigned)len); | ||
| 783 | |||
| 784 | csr &= ~MUSB_RXCSR_DMAMODE; | ||
| 785 | csr |= (MUSB_RXCSR_DMAENAB | | ||
| 786 | MUSB_RXCSR_AUTOCLEAR); | ||
| 787 | |||
| 788 | musb_writew(epio, MUSB_RXCSR, csr); | ||
| 789 | |||
| 790 | if (transfer_size <= musb_ep->packet_sz) { | ||
| 791 | musb_ep->dma->desired_mode = 0; | ||
| 792 | } else { | ||
| 793 | musb_ep->dma->desired_mode = 1; | ||
| 794 | /* Mode must be set after DMAENAB */ | ||
| 795 | csr |= MUSB_RXCSR_DMAMODE; | ||
| 796 | musb_writew(epio, MUSB_RXCSR, csr); | ||
| 797 | } | ||
| 798 | |||
| 799 | if (c->channel_program(channel, | ||
| 800 | musb_ep->packet_sz, | ||
| 801 | channel->desired_mode, | ||
| 802 | request->dma | ||
| 803 | + request->actual, | ||
| 804 | transfer_size)) | ||
| 805 | |||
| 806 | return; | ||
| 807 | } | ||
| 757 | #endif /* Mentor's DMA */ | 808 | #endif /* Mentor's DMA */ |
| 758 | 809 | ||
| 759 | fifo_count = request->length - request->actual; | 810 | fifo_count = request->length - request->actual; |
| 760 | DBG(3, "%s OUT/RX pio fifo %d/%d, maxpacket %d\n", | 811 | dev_dbg(musb->controller, "%s OUT/RX pio fifo %d/%d, maxpacket %d\n", |
| 761 | musb_ep->end_point.name, | 812 | musb_ep->end_point.name, |
| 762 | len, fifo_count, | 813 | len, fifo_count, |
| 763 | musb_ep->packet_sz); | 814 | musb_ep->packet_sz); |
| @@ -846,7 +897,7 @@ void musb_g_rx(struct musb *musb, u8 epnum) | |||
| 846 | csr = musb_readw(epio, MUSB_RXCSR); | 897 | csr = musb_readw(epio, MUSB_RXCSR); |
| 847 | dma = is_dma_capable() ? musb_ep->dma : NULL; | 898 | dma = is_dma_capable() ? musb_ep->dma : NULL; |
| 848 | 899 | ||
| 849 | DBG(4, "<== %s, rxcsr %04x%s %p\n", musb_ep->end_point.name, | 900 | dev_dbg(musb->controller, "<== %s, rxcsr %04x%s %p\n", musb_ep->end_point.name, |
| 850 | csr, dma ? " (dma)" : "", request); | 901 | csr, dma ? " (dma)" : "", request); |
| 851 | 902 | ||
| 852 | if (csr & MUSB_RXCSR_P_SENTSTALL) { | 903 | if (csr & MUSB_RXCSR_P_SENTSTALL) { |
| @@ -861,19 +912,18 @@ void musb_g_rx(struct musb *musb, u8 epnum) | |||
| 861 | csr &= ~MUSB_RXCSR_P_OVERRUN; | 912 | csr &= ~MUSB_RXCSR_P_OVERRUN; |
| 862 | musb_writew(epio, MUSB_RXCSR, csr); | 913 | musb_writew(epio, MUSB_RXCSR, csr); |
| 863 | 914 | ||
| 864 | DBG(3, "%s iso overrun on %p\n", musb_ep->name, request); | 915 | dev_dbg(musb->controller, "%s iso overrun on %p\n", musb_ep->name, request); |
| 865 | if (request->status == -EINPROGRESS) | 916 | if (request->status == -EINPROGRESS) |
| 866 | request->status = -EOVERFLOW; | 917 | request->status = -EOVERFLOW; |
| 867 | } | 918 | } |
| 868 | if (csr & MUSB_RXCSR_INCOMPRX) { | 919 | if (csr & MUSB_RXCSR_INCOMPRX) { |
| 869 | /* REVISIT not necessarily an error */ | 920 | /* REVISIT not necessarily an error */ |
| 870 | DBG(4, "%s, incomprx\n", musb_ep->end_point.name); | 921 | dev_dbg(musb->controller, "%s, incomprx\n", musb_ep->end_point.name); |
| 871 | } | 922 | } |
| 872 | 923 | ||
| 873 | if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) { | 924 | if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) { |
| 874 | /* "should not happen"; likely RXPKTRDY pending for DMA */ | 925 | /* "should not happen"; likely RXPKTRDY pending for DMA */ |
| 875 | DBG((csr & MUSB_RXCSR_DMAENAB) ? 4 : 1, | 926 | dev_dbg(musb->controller, "%s busy, csr %04x\n", |
| 876 | "%s busy, csr %04x\n", | ||
| 877 | musb_ep->end_point.name, csr); | 927 | musb_ep->end_point.name, csr); |
| 878 | return; | 928 | return; |
| 879 | } | 929 | } |
| @@ -887,12 +937,13 @@ void musb_g_rx(struct musb *musb, u8 epnum) | |||
| 887 | 937 | ||
| 888 | request->actual += musb_ep->dma->actual_len; | 938 | request->actual += musb_ep->dma->actual_len; |
| 889 | 939 | ||
| 890 | DBG(4, "RXCSR%d %04x, dma off, %04x, len %zu, req %p\n", | 940 | dev_dbg(musb->controller, "RXCSR%d %04x, dma off, %04x, len %zu, req %p\n", |
| 891 | epnum, csr, | 941 | epnum, csr, |
| 892 | musb_readw(epio, MUSB_RXCSR), | 942 | musb_readw(epio, MUSB_RXCSR), |
| 893 | musb_ep->dma->actual_len, request); | 943 | musb_ep->dma->actual_len, request); |
| 894 | 944 | ||
| 895 | #if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_TUSB_OMAP_DMA) | 945 | #if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_TUSB_OMAP_DMA) || \ |
| 946 | defined(CONFIG_USB_UX500_DMA) | ||
| 896 | /* Autoclear doesn't clear RxPktRdy for short packets */ | 947 | /* Autoclear doesn't clear RxPktRdy for short packets */ |
| 897 | if ((dma->desired_mode == 0 && !hw_ep->rx_double_buffered) | 948 | if ((dma->desired_mode == 0 && !hw_ep->rx_double_buffered) |
| 898 | || (dma->actual_len | 949 | || (dma->actual_len |
| @@ -922,7 +973,8 @@ void musb_g_rx(struct musb *musb, u8 epnum) | |||
| 922 | if (!req) | 973 | if (!req) |
| 923 | return; | 974 | return; |
| 924 | } | 975 | } |
| 925 | #if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_TUSB_OMAP_DMA) | 976 | #if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_TUSB_OMAP_DMA) || \ |
| 977 | defined(CONFIG_USB_UX500_DMA) | ||
| 926 | exit: | 978 | exit: |
| 927 | #endif | 979 | #endif |
| 928 | /* Analyze request */ | 980 | /* Analyze request */ |
| @@ -978,7 +1030,7 @@ static int musb_gadget_enable(struct usb_ep *ep, | |||
| 978 | ok = musb->hb_iso_rx; | 1030 | ok = musb->hb_iso_rx; |
| 979 | 1031 | ||
| 980 | if (!ok) { | 1032 | if (!ok) { |
| 981 | DBG(4, "no support for high bandwidth ISO\n"); | 1033 | dev_dbg(musb->controller, "no support for high bandwidth ISO\n"); |
| 982 | goto fail; | 1034 | goto fail; |
| 983 | } | 1035 | } |
| 984 | musb_ep->hb_mult = (tmp >> 11) & 3; | 1036 | musb_ep->hb_mult = (tmp >> 11) & 3; |
| @@ -1002,7 +1054,7 @@ static int musb_gadget_enable(struct usb_ep *ep, | |||
| 1002 | goto fail; | 1054 | goto fail; |
| 1003 | 1055 | ||
| 1004 | if (tmp > hw_ep->max_packet_sz_tx) { | 1056 | if (tmp > hw_ep->max_packet_sz_tx) { |
| 1005 | DBG(4, "packet size beyond hardware FIFO size\n"); | 1057 | dev_dbg(musb->controller, "packet size beyond hardware FIFO size\n"); |
| 1006 | goto fail; | 1058 | goto fail; |
| 1007 | } | 1059 | } |
| 1008 | 1060 | ||
| @@ -1042,7 +1094,7 @@ static int musb_gadget_enable(struct usb_ep *ep, | |||
| 1042 | goto fail; | 1094 | goto fail; |
| 1043 | 1095 | ||
| 1044 | if (tmp > hw_ep->max_packet_sz_rx) { | 1096 | if (tmp > hw_ep->max_packet_sz_rx) { |
| 1045 | DBG(4, "packet size beyond hardware FIFO size\n"); | 1097 | dev_dbg(musb->controller, "packet size beyond hardware FIFO size\n"); |
| 1046 | goto fail; | 1098 | goto fail; |
| 1047 | } | 1099 | } |
| 1048 | 1100 | ||
| @@ -1155,7 +1207,7 @@ static int musb_gadget_disable(struct usb_ep *ep) | |||
| 1155 | 1207 | ||
| 1156 | spin_unlock_irqrestore(&(musb->lock), flags); | 1208 | spin_unlock_irqrestore(&(musb->lock), flags); |
| 1157 | 1209 | ||
| 1158 | DBG(2, "%s\n", musb_ep->end_point.name); | 1210 | dev_dbg(musb->controller, "%s\n", musb_ep->end_point.name); |
| 1159 | 1211 | ||
| 1160 | return status; | 1212 | return status; |
| 1161 | } | 1213 | } |
| @@ -1167,11 +1219,12 @@ static int musb_gadget_disable(struct usb_ep *ep) | |||
| 1167 | struct usb_request *musb_alloc_request(struct usb_ep *ep, gfp_t gfp_flags) | 1219 | struct usb_request *musb_alloc_request(struct usb_ep *ep, gfp_t gfp_flags) |
| 1168 | { | 1220 | { |
| 1169 | struct musb_ep *musb_ep = to_musb_ep(ep); | 1221 | struct musb_ep *musb_ep = to_musb_ep(ep); |
| 1222 | struct musb *musb = musb_ep->musb; | ||
| 1170 | struct musb_request *request = NULL; | 1223 | struct musb_request *request = NULL; |
| 1171 | 1224 | ||
| 1172 | request = kzalloc(sizeof *request, gfp_flags); | 1225 | request = kzalloc(sizeof *request, gfp_flags); |
| 1173 | if (!request) { | 1226 | if (!request) { |
| 1174 | DBG(4, "not enough memory\n"); | 1227 | dev_dbg(musb->controller, "not enough memory\n"); |
| 1175 | return NULL; | 1228 | return NULL; |
| 1176 | } | 1229 | } |
| 1177 | 1230 | ||
| @@ -1205,7 +1258,7 @@ struct free_record { | |||
| 1205 | */ | 1258 | */ |
| 1206 | void musb_ep_restart(struct musb *musb, struct musb_request *req) | 1259 | void musb_ep_restart(struct musb *musb, struct musb_request *req) |
| 1207 | { | 1260 | { |
| 1208 | DBG(3, "<== %s request %p len %u on hw_ep%d\n", | 1261 | dev_dbg(musb->controller, "<== %s request %p len %u on hw_ep%d\n", |
| 1209 | req->tx ? "TX/IN" : "RX/OUT", | 1262 | req->tx ? "TX/IN" : "RX/OUT", |
| 1210 | &req->request, req->request.length, req->epnum); | 1263 | &req->request, req->request.length, req->epnum); |
| 1211 | 1264 | ||
| @@ -1239,7 +1292,7 @@ static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req, | |||
| 1239 | if (request->ep != musb_ep) | 1292 | if (request->ep != musb_ep) |
| 1240 | return -EINVAL; | 1293 | return -EINVAL; |
| 1241 | 1294 | ||
| 1242 | DBG(4, "<== to %s request=%p\n", ep->name, req); | 1295 | dev_dbg(musb->controller, "<== to %s request=%p\n", ep->name, req); |
| 1243 | 1296 | ||
| 1244 | /* request is mine now... */ | 1297 | /* request is mine now... */ |
| 1245 | request->request.actual = 0; | 1298 | request->request.actual = 0; |
| @@ -1253,7 +1306,7 @@ static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req, | |||
| 1253 | 1306 | ||
| 1254 | /* don't queue if the ep is down */ | 1307 | /* don't queue if the ep is down */ |
| 1255 | if (!musb_ep->desc) { | 1308 | if (!musb_ep->desc) { |
| 1256 | DBG(4, "req %p queued to %s while ep %s\n", | 1309 | dev_dbg(musb->controller, "req %p queued to %s while ep %s\n", |
| 1257 | req, ep->name, "disabled"); | 1310 | req, ep->name, "disabled"); |
| 1258 | status = -ESHUTDOWN; | 1311 | status = -ESHUTDOWN; |
| 1259 | goto cleanup; | 1312 | goto cleanup; |
| @@ -1290,7 +1343,7 @@ static int musb_gadget_dequeue(struct usb_ep *ep, struct usb_request *request) | |||
| 1290 | break; | 1343 | break; |
| 1291 | } | 1344 | } |
| 1292 | if (r != req) { | 1345 | if (r != req) { |
| 1293 | DBG(3, "request %p not queued to %s\n", request, ep->name); | 1346 | dev_dbg(musb->controller, "request %p not queued to %s\n", request, ep->name); |
| 1294 | status = -EINVAL; | 1347 | status = -EINVAL; |
| 1295 | goto done; | 1348 | goto done; |
| 1296 | } | 1349 | } |
| @@ -1356,7 +1409,7 @@ static int musb_gadget_set_halt(struct usb_ep *ep, int value) | |||
| 1356 | request = next_request(musb_ep); | 1409 | request = next_request(musb_ep); |
| 1357 | if (value) { | 1410 | if (value) { |
| 1358 | if (request) { | 1411 | if (request) { |
| 1359 | DBG(3, "request in progress, cannot halt %s\n", | 1412 | dev_dbg(musb->controller, "request in progress, cannot halt %s\n", |
| 1360 | ep->name); | 1413 | ep->name); |
| 1361 | status = -EAGAIN; | 1414 | status = -EAGAIN; |
| 1362 | goto done; | 1415 | goto done; |
| @@ -1365,7 +1418,7 @@ static int musb_gadget_set_halt(struct usb_ep *ep, int value) | |||
| 1365 | if (musb_ep->is_in) { | 1418 | if (musb_ep->is_in) { |
| 1366 | csr = musb_readw(epio, MUSB_TXCSR); | 1419 | csr = musb_readw(epio, MUSB_TXCSR); |
| 1367 | if (csr & MUSB_TXCSR_FIFONOTEMPTY) { | 1420 | if (csr & MUSB_TXCSR_FIFONOTEMPTY) { |
| 1368 | DBG(3, "FIFO busy, cannot halt %s\n", ep->name); | 1421 | dev_dbg(musb->controller, "FIFO busy, cannot halt %s\n", ep->name); |
| 1369 | status = -EAGAIN; | 1422 | status = -EAGAIN; |
| 1370 | goto done; | 1423 | goto done; |
| 1371 | } | 1424 | } |
| @@ -1374,7 +1427,7 @@ static int musb_gadget_set_halt(struct usb_ep *ep, int value) | |||
| 1374 | musb_ep->wedged = 0; | 1427 | musb_ep->wedged = 0; |
| 1375 | 1428 | ||
| 1376 | /* set/clear the stall and toggle bits */ | 1429 | /* set/clear the stall and toggle bits */ |
| 1377 | DBG(2, "%s: %s stall\n", ep->name, value ? "set" : "clear"); | 1430 | dev_dbg(musb->controller, "%s: %s stall\n", ep->name, value ? "set" : "clear"); |
| 1378 | if (musb_ep->is_in) { | 1431 | if (musb_ep->is_in) { |
| 1379 | csr = musb_readw(epio, MUSB_TXCSR); | 1432 | csr = musb_readw(epio, MUSB_TXCSR); |
| 1380 | csr |= MUSB_TXCSR_P_WZC_BITS | 1433 | csr |= MUSB_TXCSR_P_WZC_BITS |
| @@ -1401,7 +1454,7 @@ static int musb_gadget_set_halt(struct usb_ep *ep, int value) | |||
| 1401 | 1454 | ||
| 1402 | /* maybe start the first request in the queue */ | 1455 | /* maybe start the first request in the queue */ |
| 1403 | if (!musb_ep->busy && !value && request) { | 1456 | if (!musb_ep->busy && !value && request) { |
| 1404 | DBG(3, "restarting the request\n"); | 1457 | dev_dbg(musb->controller, "restarting the request\n"); |
| 1405 | musb_ep_restart(musb, request); | 1458 | musb_ep_restart(musb, request); |
| 1406 | } | 1459 | } |
| 1407 | 1460 | ||
| @@ -1532,7 +1585,7 @@ static int musb_gadget_wakeup(struct usb_gadget *gadget) | |||
| 1532 | case OTG_STATE_B_IDLE: | 1585 | case OTG_STATE_B_IDLE: |
| 1533 | /* Start SRP ... OTG not required. */ | 1586 | /* Start SRP ... OTG not required. */ |
| 1534 | devctl = musb_readb(mregs, MUSB_DEVCTL); | 1587 | devctl = musb_readb(mregs, MUSB_DEVCTL); |
| 1535 | DBG(2, "Sending SRP: devctl: %02x\n", devctl); | 1588 | dev_dbg(musb->controller, "Sending SRP: devctl: %02x\n", devctl); |
| 1536 | devctl |= MUSB_DEVCTL_SESSION; | 1589 | devctl |= MUSB_DEVCTL_SESSION; |
| 1537 | musb_writeb(mregs, MUSB_DEVCTL, devctl); | 1590 | musb_writeb(mregs, MUSB_DEVCTL, devctl); |
| 1538 | devctl = musb_readb(mregs, MUSB_DEVCTL); | 1591 | devctl = musb_readb(mregs, MUSB_DEVCTL); |
| @@ -1549,6 +1602,10 @@ static int musb_gadget_wakeup(struct usb_gadget *gadget) | |||
| 1549 | break; | 1602 | break; |
| 1550 | } | 1603 | } |
| 1551 | 1604 | ||
| 1605 | spin_unlock_irqrestore(&musb->lock, flags); | ||
| 1606 | otg_start_srp(musb->xceiv); | ||
| 1607 | spin_lock_irqsave(&musb->lock, flags); | ||
| 1608 | |||
| 1552 | /* Block idling for at least 1s */ | 1609 | /* Block idling for at least 1s */ |
| 1553 | musb_platform_try_idle(musb, | 1610 | musb_platform_try_idle(musb, |
| 1554 | jiffies + msecs_to_jiffies(1 * HZ)); | 1611 | jiffies + msecs_to_jiffies(1 * HZ)); |
| @@ -1556,7 +1613,8 @@ static int musb_gadget_wakeup(struct usb_gadget *gadget) | |||
| 1556 | status = 0; | 1613 | status = 0; |
| 1557 | goto done; | 1614 | goto done; |
| 1558 | default: | 1615 | default: |
| 1559 | DBG(2, "Unhandled wake: %s\n", otg_state_string(musb)); | 1616 | dev_dbg(musb->controller, "Unhandled wake: %s\n", |
| 1617 | otg_state_string(musb->xceiv->state)); | ||
| 1560 | goto done; | 1618 | goto done; |
| 1561 | } | 1619 | } |
| 1562 | 1620 | ||
| @@ -1565,7 +1623,7 @@ static int musb_gadget_wakeup(struct usb_gadget *gadget) | |||
| 1565 | power = musb_readb(mregs, MUSB_POWER); | 1623 | power = musb_readb(mregs, MUSB_POWER); |
| 1566 | power |= MUSB_POWER_RESUME; | 1624 | power |= MUSB_POWER_RESUME; |
| 1567 | musb_writeb(mregs, MUSB_POWER, power); | 1625 | musb_writeb(mregs, MUSB_POWER, power); |
| 1568 | DBG(2, "issue wakeup\n"); | 1626 | dev_dbg(musb->controller, "issue wakeup\n"); |
| 1569 | 1627 | ||
| 1570 | /* FIXME do this next chunk in a timer callback, no udelay */ | 1628 | /* FIXME do this next chunk in a timer callback, no udelay */ |
| 1571 | mdelay(2); | 1629 | mdelay(2); |
| @@ -1599,7 +1657,7 @@ static void musb_pullup(struct musb *musb, int is_on) | |||
| 1599 | 1657 | ||
| 1600 | /* FIXME if on, HdrcStart; if off, HdrcStop */ | 1658 | /* FIXME if on, HdrcStart; if off, HdrcStop */ |
| 1601 | 1659 | ||
| 1602 | DBG(3, "gadget %s D+ pullup %s\n", | 1660 | dev_dbg(musb->controller, "gadget %s D+ pullup %s\n", |
| 1603 | musb->gadget_driver->function, is_on ? "on" : "off"); | 1661 | musb->gadget_driver->function, is_on ? "on" : "off"); |
| 1604 | musb_writeb(musb->mregs, MUSB_POWER, power); | 1662 | musb_writeb(musb->mregs, MUSB_POWER, power); |
| 1605 | } | 1663 | } |
| @@ -1607,7 +1665,7 @@ static void musb_pullup(struct musb *musb, int is_on) | |||
| 1607 | #if 0 | 1665 | #if 0 |
| 1608 | static int musb_gadget_vbus_session(struct usb_gadget *gadget, int is_active) | 1666 | static int musb_gadget_vbus_session(struct usb_gadget *gadget, int is_active) |
| 1609 | { | 1667 | { |
| 1610 | DBG(2, "<= %s =>\n", __func__); | 1668 | dev_dbg(musb->controller, "<= %s =>\n", __func__); |
| 1611 | 1669 | ||
| 1612 | /* | 1670 | /* |
| 1613 | * FIXME iff driver's softconnect flag is set (as it is during probe, | 1671 | * FIXME iff driver's softconnect flag is set (as it is during probe, |
| @@ -1816,17 +1874,17 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver, | |||
| 1816 | 1874 | ||
| 1817 | /* driver must be initialized to support peripheral mode */ | 1875 | /* driver must be initialized to support peripheral mode */ |
| 1818 | if (!musb) { | 1876 | if (!musb) { |
| 1819 | DBG(1, "no dev??\n"); | 1877 | dev_dbg(musb->controller, "no dev??\n"); |
| 1820 | retval = -ENODEV; | 1878 | retval = -ENODEV; |
| 1821 | goto err0; | 1879 | goto err0; |
| 1822 | } | 1880 | } |
| 1823 | 1881 | ||
| 1824 | pm_runtime_get_sync(musb->controller); | 1882 | pm_runtime_get_sync(musb->controller); |
| 1825 | 1883 | ||
| 1826 | DBG(3, "registering driver %s\n", driver->function); | 1884 | dev_dbg(musb->controller, "registering driver %s\n", driver->function); |
| 1827 | 1885 | ||
| 1828 | if (musb->gadget_driver) { | 1886 | if (musb->gadget_driver) { |
| 1829 | DBG(1, "%s is already bound to %s\n", | 1887 | dev_dbg(musb->controller, "%s is already bound to %s\n", |
| 1830 | musb_driver_name, | 1888 | musb_driver_name, |
| 1831 | musb->gadget_driver->driver.name); | 1889 | musb->gadget_driver->driver.name); |
| 1832 | retval = -EBUSY; | 1890 | retval = -EBUSY; |
| @@ -1842,7 +1900,7 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver, | |||
| 1842 | 1900 | ||
| 1843 | retval = bind(&musb->g); | 1901 | retval = bind(&musb->g); |
| 1844 | if (retval) { | 1902 | if (retval) { |
| 1845 | DBG(3, "bind to driver %s failed --> %d\n", | 1903 | dev_dbg(musb->controller, "bind to driver %s failed --> %d\n", |
| 1846 | driver->driver.name, retval); | 1904 | driver->driver.name, retval); |
| 1847 | goto err1; | 1905 | goto err1; |
| 1848 | } | 1906 | } |
| @@ -1870,7 +1928,7 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver, | |||
| 1870 | if (is_otg_enabled(musb)) { | 1928 | if (is_otg_enabled(musb)) { |
| 1871 | struct usb_hcd *hcd = musb_to_hcd(musb); | 1929 | struct usb_hcd *hcd = musb_to_hcd(musb); |
| 1872 | 1930 | ||
| 1873 | DBG(3, "OTG startup...\n"); | 1931 | dev_dbg(musb->controller, "OTG startup...\n"); |
| 1874 | 1932 | ||
| 1875 | /* REVISIT: funcall to other code, which also | 1933 | /* REVISIT: funcall to other code, which also |
| 1876 | * handles power budgeting ... this way also | 1934 | * handles power budgeting ... this way also |
| @@ -1878,7 +1936,7 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver, | |||
| 1878 | */ | 1936 | */ |
| 1879 | retval = usb_add_hcd(musb_to_hcd(musb), -1, 0); | 1937 | retval = usb_add_hcd(musb_to_hcd(musb), -1, 0); |
| 1880 | if (retval < 0) { | 1938 | if (retval < 0) { |
| 1881 | DBG(1, "add_hcd failed, %d\n", retval); | 1939 | dev_dbg(musb->controller, "add_hcd failed, %d\n", retval); |
| 1882 | goto err2; | 1940 | goto err2; |
| 1883 | } | 1941 | } |
| 1884 | 1942 | ||
| @@ -1985,7 +2043,7 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) | |||
| 1985 | stop_activity(musb, driver); | 2043 | stop_activity(musb, driver); |
| 1986 | otg_set_peripheral(musb->xceiv, NULL); | 2044 | otg_set_peripheral(musb->xceiv, NULL); |
| 1987 | 2045 | ||
| 1988 | DBG(3, "unregistering driver %s\n", driver->function); | 2046 | dev_dbg(musb->controller, "unregistering driver %s\n", driver->function); |
| 1989 | 2047 | ||
| 1990 | spin_unlock_irqrestore(&musb->lock, flags); | 2048 | spin_unlock_irqrestore(&musb->lock, flags); |
| 1991 | driver->unbind(&musb->g); | 2049 | driver->unbind(&musb->g); |
| @@ -2037,7 +2095,7 @@ void musb_g_resume(struct musb *musb) | |||
| 2037 | break; | 2095 | break; |
| 2038 | default: | 2096 | default: |
| 2039 | WARNING("unhandled RESUME transition (%s)\n", | 2097 | WARNING("unhandled RESUME transition (%s)\n", |
| 2040 | otg_state_string(musb)); | 2098 | otg_state_string(musb->xceiv->state)); |
| 2041 | } | 2099 | } |
| 2042 | } | 2100 | } |
| 2043 | 2101 | ||
| @@ -2047,7 +2105,7 @@ void musb_g_suspend(struct musb *musb) | |||
| 2047 | u8 devctl; | 2105 | u8 devctl; |
| 2048 | 2106 | ||
| 2049 | devctl = musb_readb(musb->mregs, MUSB_DEVCTL); | 2107 | devctl = musb_readb(musb->mregs, MUSB_DEVCTL); |
| 2050 | DBG(3, "devctl %02x\n", devctl); | 2108 | dev_dbg(musb->controller, "devctl %02x\n", devctl); |
| 2051 | 2109 | ||
| 2052 | switch (musb->xceiv->state) { | 2110 | switch (musb->xceiv->state) { |
| 2053 | case OTG_STATE_B_IDLE: | 2111 | case OTG_STATE_B_IDLE: |
| @@ -2067,7 +2125,7 @@ void musb_g_suspend(struct musb *musb) | |||
| 2067 | * A_PERIPHERAL may need care too | 2125 | * A_PERIPHERAL may need care too |
| 2068 | */ | 2126 | */ |
| 2069 | WARNING("unhandled SUSPEND transition (%s)\n", | 2127 | WARNING("unhandled SUSPEND transition (%s)\n", |
| 2070 | otg_state_string(musb)); | 2128 | otg_state_string(musb->xceiv->state)); |
| 2071 | } | 2129 | } |
| 2072 | } | 2130 | } |
| 2073 | 2131 | ||
| @@ -2083,7 +2141,7 @@ void musb_g_disconnect(struct musb *musb) | |||
| 2083 | void __iomem *mregs = musb->mregs; | 2141 | void __iomem *mregs = musb->mregs; |
| 2084 | u8 devctl = musb_readb(mregs, MUSB_DEVCTL); | 2142 | u8 devctl = musb_readb(mregs, MUSB_DEVCTL); |
| 2085 | 2143 | ||
| 2086 | DBG(3, "devctl %02x\n", devctl); | 2144 | dev_dbg(musb->controller, "devctl %02x\n", devctl); |
| 2087 | 2145 | ||
| 2088 | /* clear HR */ | 2146 | /* clear HR */ |
| 2089 | musb_writeb(mregs, MUSB_DEVCTL, devctl & MUSB_DEVCTL_SESSION); | 2147 | musb_writeb(mregs, MUSB_DEVCTL, devctl & MUSB_DEVCTL_SESSION); |
| @@ -2101,8 +2159,8 @@ void musb_g_disconnect(struct musb *musb) | |||
| 2101 | switch (musb->xceiv->state) { | 2159 | switch (musb->xceiv->state) { |
| 2102 | default: | 2160 | default: |
| 2103 | #ifdef CONFIG_USB_MUSB_OTG | 2161 | #ifdef CONFIG_USB_MUSB_OTG |
| 2104 | DBG(2, "Unhandled disconnect %s, setting a_idle\n", | 2162 | dev_dbg(musb->controller, "Unhandled disconnect %s, setting a_idle\n", |
| 2105 | otg_state_string(musb)); | 2163 | otg_state_string(musb->xceiv->state)); |
| 2106 | musb->xceiv->state = OTG_STATE_A_IDLE; | 2164 | musb->xceiv->state = OTG_STATE_A_IDLE; |
| 2107 | MUSB_HST_MODE(musb); | 2165 | MUSB_HST_MODE(musb); |
| 2108 | break; | 2166 | break; |
| @@ -2132,7 +2190,7 @@ __acquires(musb->lock) | |||
| 2132 | u8 devctl = musb_readb(mbase, MUSB_DEVCTL); | 2190 | u8 devctl = musb_readb(mbase, MUSB_DEVCTL); |
| 2133 | u8 power; | 2191 | u8 power; |
| 2134 | 2192 | ||
| 2135 | DBG(3, "<== %s addr=%x driver '%s'\n", | 2193 | dev_dbg(musb->controller, "<== %s addr=%x driver '%s'\n", |
| 2136 | (devctl & MUSB_DEVCTL_BDEVICE) | 2194 | (devctl & MUSB_DEVCTL_BDEVICE) |
| 2137 | ? "B-Device" : "A-Device", | 2195 | ? "B-Device" : "A-Device", |
| 2138 | musb_readb(mbase, MUSB_FADDR), | 2196 | musb_readb(mbase, MUSB_FADDR), |
diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c index 75a542e42fd..b2faff23550 100644 --- a/drivers/usb/musb/musb_gadget_ep0.c +++ b/drivers/usb/musb/musb_gadget_ep0.c | |||
| @@ -209,7 +209,7 @@ static inline void musb_try_b_hnp_enable(struct musb *musb) | |||
| 209 | void __iomem *mbase = musb->mregs; | 209 | void __iomem *mbase = musb->mregs; |
| 210 | u8 devctl; | 210 | u8 devctl; |
| 211 | 211 | ||
| 212 | DBG(1, "HNP: Setting HR\n"); | 212 | dev_dbg(musb->controller, "HNP: Setting HR\n"); |
| 213 | devctl = musb_readb(mbase, MUSB_DEVCTL); | 213 | devctl = musb_readb(mbase, MUSB_DEVCTL); |
| 214 | musb_writeb(mbase, MUSB_DEVCTL, devctl | MUSB_DEVCTL_HR); | 214 | musb_writeb(mbase, MUSB_DEVCTL, devctl | MUSB_DEVCTL_HR); |
| 215 | } | 215 | } |
| @@ -306,7 +306,7 @@ __acquires(musb->lock) | |||
| 306 | /* Maybe start the first request in the queue */ | 306 | /* Maybe start the first request in the queue */ |
| 307 | request = next_request(musb_ep); | 307 | request = next_request(musb_ep); |
| 308 | if (!musb_ep->busy && request) { | 308 | if (!musb_ep->busy && request) { |
| 309 | DBG(3, "restarting the request\n"); | 309 | dev_dbg(musb->controller, "restarting the request\n"); |
| 310 | musb_ep_restart(musb, request); | 310 | musb_ep_restart(musb, request); |
| 311 | } | 311 | } |
| 312 | 312 | ||
| @@ -553,7 +553,7 @@ static void ep0_txstate(struct musb *musb) | |||
| 553 | 553 | ||
| 554 | if (!req) { | 554 | if (!req) { |
| 555 | /* WARN_ON(1); */ | 555 | /* WARN_ON(1); */ |
| 556 | DBG(2, "odd; csr0 %04x\n", musb_readw(regs, MUSB_CSR0)); | 556 | dev_dbg(musb->controller, "odd; csr0 %04x\n", musb_readw(regs, MUSB_CSR0)); |
| 557 | return; | 557 | return; |
| 558 | } | 558 | } |
| 559 | 559 | ||
| @@ -610,7 +610,7 @@ musb_read_setup(struct musb *musb, struct usb_ctrlrequest *req) | |||
| 610 | /* NOTE: earlier 2.6 versions changed setup packets to host | 610 | /* NOTE: earlier 2.6 versions changed setup packets to host |
| 611 | * order, but now USB packets always stay in USB byte order. | 611 | * order, but now USB packets always stay in USB byte order. |
| 612 | */ | 612 | */ |
| 613 | DBG(3, "SETUP req%02x.%02x v%04x i%04x l%d\n", | 613 | dev_dbg(musb->controller, "SETUP req%02x.%02x v%04x i%04x l%d\n", |
| 614 | req->bRequestType, | 614 | req->bRequestType, |
| 615 | req->bRequest, | 615 | req->bRequest, |
| 616 | le16_to_cpu(req->wValue), | 616 | le16_to_cpu(req->wValue), |
| @@ -678,7 +678,7 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb) | |||
| 678 | csr = musb_readw(regs, MUSB_CSR0); | 678 | csr = musb_readw(regs, MUSB_CSR0); |
| 679 | len = musb_readb(regs, MUSB_COUNT0); | 679 | len = musb_readb(regs, MUSB_COUNT0); |
| 680 | 680 | ||
| 681 | DBG(4, "csr %04x, count %d, myaddr %d, ep0stage %s\n", | 681 | dev_dbg(musb->controller, "csr %04x, count %d, myaddr %d, ep0stage %s\n", |
| 682 | csr, len, | 682 | csr, len, |
| 683 | musb_readb(mbase, MUSB_FADDR), | 683 | musb_readb(mbase, MUSB_FADDR), |
| 684 | decode_ep0stage(musb->ep0_state)); | 684 | decode_ep0stage(musb->ep0_state)); |
| @@ -749,7 +749,7 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb) | |||
| 749 | 749 | ||
| 750 | /* enter test mode if needed (exit by reset) */ | 750 | /* enter test mode if needed (exit by reset) */ |
| 751 | else if (musb->test_mode) { | 751 | else if (musb->test_mode) { |
| 752 | DBG(1, "entering TESTMODE\n"); | 752 | dev_dbg(musb->controller, "entering TESTMODE\n"); |
| 753 | 753 | ||
| 754 | if (MUSB_TEST_PACKET == musb->test_mode_nr) | 754 | if (MUSB_TEST_PACKET == musb->test_mode_nr) |
| 755 | musb_load_testpacket(musb); | 755 | musb_load_testpacket(musb); |
| @@ -861,7 +861,7 @@ setup: | |||
| 861 | break; | 861 | break; |
| 862 | } | 862 | } |
| 863 | 863 | ||
| 864 | DBG(3, "handled %d, csr %04x, ep0stage %s\n", | 864 | dev_dbg(musb->controller, "handled %d, csr %04x, ep0stage %s\n", |
| 865 | handled, csr, | 865 | handled, csr, |
| 866 | decode_ep0stage(musb->ep0_state)); | 866 | decode_ep0stage(musb->ep0_state)); |
| 867 | 867 | ||
| @@ -878,7 +878,7 @@ setup: | |||
| 878 | if (handled < 0) { | 878 | if (handled < 0) { |
| 879 | musb_ep_select(mbase, 0); | 879 | musb_ep_select(mbase, 0); |
| 880 | stall: | 880 | stall: |
| 881 | DBG(3, "stall (%d)\n", handled); | 881 | dev_dbg(musb->controller, "stall (%d)\n", handled); |
| 882 | musb->ackpend |= MUSB_CSR0_P_SENDSTALL; | 882 | musb->ackpend |= MUSB_CSR0_P_SENDSTALL; |
| 883 | musb->ep0_state = MUSB_EP0_STAGE_IDLE; | 883 | musb->ep0_state = MUSB_EP0_STAGE_IDLE; |
| 884 | finish: | 884 | finish: |
| @@ -958,7 +958,7 @@ musb_g_ep0_queue(struct usb_ep *e, struct usb_request *r, gfp_t gfp_flags) | |||
| 958 | status = 0; | 958 | status = 0; |
| 959 | break; | 959 | break; |
| 960 | default: | 960 | default: |
| 961 | DBG(1, "ep0 request queued in state %d\n", | 961 | dev_dbg(musb->controller, "ep0 request queued in state %d\n", |
| 962 | musb->ep0_state); | 962 | musb->ep0_state); |
| 963 | status = -EINVAL; | 963 | status = -EINVAL; |
| 964 | goto cleanup; | 964 | goto cleanup; |
| @@ -967,7 +967,7 @@ musb_g_ep0_queue(struct usb_ep *e, struct usb_request *r, gfp_t gfp_flags) | |||
| 967 | /* add request to the list */ | 967 | /* add request to the list */ |
| 968 | list_add_tail(&req->list, &ep->req_list); | 968 | list_add_tail(&req->list, &ep->req_list); |
| 969 | 969 | ||
| 970 | DBG(3, "queue to %s (%s), length=%d\n", | 970 | dev_dbg(musb->controller, "queue to %s (%s), length=%d\n", |
| 971 | ep->name, ep->is_in ? "IN/TX" : "OUT/RX", | 971 | ep->name, ep->is_in ? "IN/TX" : "OUT/RX", |
| 972 | req->request.length); | 972 | req->request.length); |
| 973 | 973 | ||
| @@ -1060,7 +1060,7 @@ static int musb_g_ep0_halt(struct usb_ep *e, int value) | |||
| 1060 | musb->ackpend = 0; | 1060 | musb->ackpend = 0; |
| 1061 | break; | 1061 | break; |
| 1062 | default: | 1062 | default: |
| 1063 | DBG(1, "ep0 can't halt in state %d\n", musb->ep0_state); | 1063 | dev_dbg(musb->controller, "ep0 can't halt in state %d\n", musb->ep0_state); |
| 1064 | status = -EINVAL; | 1064 | status = -EINVAL; |
| 1065 | } | 1065 | } |
| 1066 | 1066 | ||
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 5eef4a8847d..7295e316bdf 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
| @@ -106,6 +106,7 @@ static void musb_ep_program(struct musb *musb, u8 epnum, | |||
| 106 | */ | 106 | */ |
| 107 | static void musb_h_tx_flush_fifo(struct musb_hw_ep *ep) | 107 | static void musb_h_tx_flush_fifo(struct musb_hw_ep *ep) |
| 108 | { | 108 | { |
| 109 | struct musb *musb = ep->musb; | ||
| 109 | void __iomem *epio = ep->regs; | 110 | void __iomem *epio = ep->regs; |
| 110 | u16 csr; | 111 | u16 csr; |
| 111 | u16 lastcsr = 0; | 112 | u16 lastcsr = 0; |
| @@ -114,7 +115,7 @@ static void musb_h_tx_flush_fifo(struct musb_hw_ep *ep) | |||
| 114 | csr = musb_readw(epio, MUSB_TXCSR); | 115 | csr = musb_readw(epio, MUSB_TXCSR); |
| 115 | while (csr & MUSB_TXCSR_FIFONOTEMPTY) { | 116 | while (csr & MUSB_TXCSR_FIFONOTEMPTY) { |
| 116 | if (csr != lastcsr) | 117 | if (csr != lastcsr) |
| 117 | DBG(3, "Host TX FIFONOTEMPTY csr: %02x\n", csr); | 118 | dev_dbg(musb->controller, "Host TX FIFONOTEMPTY csr: %02x\n", csr); |
| 118 | lastcsr = csr; | 119 | lastcsr = csr; |
| 119 | csr |= MUSB_TXCSR_FLUSHFIFO; | 120 | csr |= MUSB_TXCSR_FLUSHFIFO; |
| 120 | musb_writew(epio, MUSB_TXCSR, csr); | 121 | musb_writew(epio, MUSB_TXCSR, csr); |
| @@ -240,7 +241,7 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh) | |||
| 240 | len = urb->transfer_buffer_length - urb->actual_length; | 241 | len = urb->transfer_buffer_length - urb->actual_length; |
| 241 | } | 242 | } |
| 242 | 243 | ||
| 243 | DBG(4, "qh %p urb %p dev%d ep%d%s%s, hw_ep %d, %p/%d\n", | 244 | dev_dbg(musb->controller, "qh %p urb %p dev%d ep%d%s%s, hw_ep %d, %p/%d\n", |
| 244 | qh, urb, address, qh->epnum, | 245 | qh, urb, address, qh->epnum, |
| 245 | is_in ? "in" : "out", | 246 | is_in ? "in" : "out", |
| 246 | ({char *s; switch (qh->type) { | 247 | ({char *s; switch (qh->type) { |
| @@ -263,7 +264,7 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh) | |||
| 263 | switch (qh->type) { | 264 | switch (qh->type) { |
| 264 | case USB_ENDPOINT_XFER_ISOC: | 265 | case USB_ENDPOINT_XFER_ISOC: |
| 265 | case USB_ENDPOINT_XFER_INT: | 266 | case USB_ENDPOINT_XFER_INT: |
| 266 | DBG(3, "check whether there's still time for periodic Tx\n"); | 267 | dev_dbg(musb->controller, "check whether there's still time for periodic Tx\n"); |
| 267 | frame = musb_readw(mbase, MUSB_FRAME); | 268 | frame = musb_readw(mbase, MUSB_FRAME); |
| 268 | /* FIXME this doesn't implement that scheduling policy ... | 269 | /* FIXME this doesn't implement that scheduling policy ... |
| 269 | * or handle framecounter wrapping | 270 | * or handle framecounter wrapping |
| @@ -278,7 +279,7 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh) | |||
| 278 | } else { | 279 | } else { |
| 279 | qh->frame = urb->start_frame; | 280 | qh->frame = urb->start_frame; |
| 280 | /* enable SOF interrupt so we can count down */ | 281 | /* enable SOF interrupt so we can count down */ |
| 281 | DBG(1, "SOF for %d\n", epnum); | 282 | dev_dbg(musb->controller, "SOF for %d\n", epnum); |
| 282 | #if 1 /* ifndef CONFIG_ARCH_DAVINCI */ | 283 | #if 1 /* ifndef CONFIG_ARCH_DAVINCI */ |
| 283 | musb_writeb(mbase, MUSB_INTRUSBE, 0xff); | 284 | musb_writeb(mbase, MUSB_INTRUSBE, 0xff); |
| 284 | #endif | 285 | #endif |
| @@ -286,7 +287,7 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh) | |||
| 286 | break; | 287 | break; |
| 287 | default: | 288 | default: |
| 288 | start: | 289 | start: |
| 289 | DBG(4, "Start TX%d %s\n", epnum, | 290 | dev_dbg(musb->controller, "Start TX%d %s\n", epnum, |
| 290 | hw_ep->tx_channel ? "dma" : "pio"); | 291 | hw_ep->tx_channel ? "dma" : "pio"); |
| 291 | 292 | ||
| 292 | if (!hw_ep->tx_channel) | 293 | if (!hw_ep->tx_channel) |
| @@ -301,21 +302,7 @@ static void musb_giveback(struct musb *musb, struct urb *urb, int status) | |||
| 301 | __releases(musb->lock) | 302 | __releases(musb->lock) |
| 302 | __acquires(musb->lock) | 303 | __acquires(musb->lock) |
| 303 | { | 304 | { |
| 304 | DBG(({ int level; switch (status) { | 305 | dev_dbg(musb->controller, |
| 305 | case 0: | ||
| 306 | level = 4; | ||
| 307 | break; | ||
| 308 | /* common/boring faults */ | ||
| 309 | case -EREMOTEIO: | ||
| 310 | case -ESHUTDOWN: | ||
| 311 | case -ECONNRESET: | ||
| 312 | case -EPIPE: | ||
| 313 | level = 3; | ||
| 314 | break; | ||
| 315 | default: | ||
| 316 | level = 2; | ||
| 317 | break; | ||
| 318 | }; level; }), | ||
| 319 | "complete %p %pF (%d), dev%d ep%d%s, %d/%d\n", | 306 | "complete %p %pF (%d), dev%d ep%d%s, %d/%d\n", |
| 320 | urb, urb->complete, status, | 307 | urb, urb->complete, status, |
| 321 | usb_pipedevice(urb->pipe), | 308 | usb_pipedevice(urb->pipe), |
| @@ -426,7 +413,7 @@ static void musb_advance_schedule(struct musb *musb, struct urb *urb, | |||
| 426 | } | 413 | } |
| 427 | 414 | ||
| 428 | if (qh != NULL && qh->is_ready) { | 415 | if (qh != NULL && qh->is_ready) { |
| 429 | DBG(4, "... next ep%d %cX urb %p\n", | 416 | dev_dbg(musb->controller, "... next ep%d %cX urb %p\n", |
| 430 | hw_ep->epnum, is_in ? 'R' : 'T', next_urb(qh)); | 417 | hw_ep->epnum, is_in ? 'R' : 'T', next_urb(qh)); |
| 431 | musb_start_urb(musb, is_in, qh); | 418 | musb_start_urb(musb, is_in, qh); |
| 432 | } | 419 | } |
| @@ -471,7 +458,7 @@ musb_host_packet_rx(struct musb *musb, struct urb *urb, u8 epnum, u8 iso_err) | |||
| 471 | 458 | ||
| 472 | /* musb_ep_select(mbase, epnum); */ | 459 | /* musb_ep_select(mbase, epnum); */ |
| 473 | rx_count = musb_readw(epio, MUSB_RXCOUNT); | 460 | rx_count = musb_readw(epio, MUSB_RXCOUNT); |
| 474 | DBG(3, "RX%d count %d, buffer %p len %d/%d\n", epnum, rx_count, | 461 | dev_dbg(musb->controller, "RX%d count %d, buffer %p len %d/%d\n", epnum, rx_count, |
| 475 | urb->transfer_buffer, qh->offset, | 462 | urb->transfer_buffer, qh->offset, |
| 476 | urb->transfer_buffer_length); | 463 | urb->transfer_buffer_length); |
| 477 | 464 | ||
| @@ -493,7 +480,7 @@ musb_host_packet_rx(struct musb *musb, struct urb *urb, u8 epnum, u8 iso_err) | |||
| 493 | status = -EOVERFLOW; | 480 | status = -EOVERFLOW; |
| 494 | urb->error_count++; | 481 | urb->error_count++; |
| 495 | } | 482 | } |
| 496 | DBG(2, "** OVERFLOW %d into %d\n", rx_count, length); | 483 | dev_dbg(musb->controller, "** OVERFLOW %d into %d\n", rx_count, length); |
| 497 | do_flush = 1; | 484 | do_flush = 1; |
| 498 | } else | 485 | } else |
| 499 | length = rx_count; | 486 | length = rx_count; |
| @@ -511,7 +498,7 @@ musb_host_packet_rx(struct musb *musb, struct urb *urb, u8 epnum, u8 iso_err) | |||
| 511 | if (rx_count > length) { | 498 | if (rx_count > length) { |
| 512 | if (urb->status == -EINPROGRESS) | 499 | if (urb->status == -EINPROGRESS) |
| 513 | urb->status = -EOVERFLOW; | 500 | urb->status = -EOVERFLOW; |
| 514 | DBG(2, "** OVERFLOW %d into %d\n", rx_count, length); | 501 | dev_dbg(musb->controller, "** OVERFLOW %d into %d\n", rx_count, length); |
| 515 | do_flush = 1; | 502 | do_flush = 1; |
| 516 | } else | 503 | } else |
| 517 | length = rx_count; | 504 | length = rx_count; |
| @@ -697,7 +684,7 @@ static void musb_ep_program(struct musb *musb, u8 epnum, | |||
| 697 | struct musb_qh *qh = musb_ep_get_qh(hw_ep, !is_out); | 684 | struct musb_qh *qh = musb_ep_get_qh(hw_ep, !is_out); |
| 698 | u16 packet_sz = qh->maxpacket; | 685 | u16 packet_sz = qh->maxpacket; |
| 699 | 686 | ||
| 700 | DBG(3, "%s hw%d urb %p spd%d dev%d ep%d%s " | 687 | dev_dbg(musb->controller, "%s hw%d urb %p spd%d dev%d ep%d%s " |
| 701 | "h_addr%02x h_port%02x bytes %d\n", | 688 | "h_addr%02x h_port%02x bytes %d\n", |
| 702 | is_out ? "-->" : "<--", | 689 | is_out ? "-->" : "<--", |
| 703 | epnum, urb, urb->dev->speed, | 690 | epnum, urb, urb->dev->speed, |
| @@ -850,37 +837,32 @@ static void musb_ep_program(struct musb *musb, u8 epnum, | |||
| 850 | /* kick things off */ | 837 | /* kick things off */ |
| 851 | 838 | ||
| 852 | if ((is_cppi_enabled() || tusb_dma_omap()) && dma_channel) { | 839 | if ((is_cppi_enabled() || tusb_dma_omap()) && dma_channel) { |
| 853 | /* candidate for DMA */ | 840 | /* Candidate for DMA */ |
| 854 | if (dma_channel) { | 841 | dma_channel->actual_len = 0L; |
| 855 | dma_channel->actual_len = 0L; | 842 | qh->segsize = len; |
| 856 | qh->segsize = len; | 843 | |
| 857 | 844 | /* AUTOREQ is in a DMA register */ | |
| 858 | /* AUTOREQ is in a DMA register */ | 845 | musb_writew(hw_ep->regs, MUSB_RXCSR, csr); |
| 859 | musb_writew(hw_ep->regs, MUSB_RXCSR, csr); | 846 | csr = musb_readw(hw_ep->regs, MUSB_RXCSR); |
| 860 | csr = musb_readw(hw_ep->regs, | 847 | |
| 861 | MUSB_RXCSR); | 848 | /* |
| 862 | 849 | * Unless caller treats short RX transfers as | |
| 863 | /* unless caller treats short rx transfers as | 850 | * errors, we dare not queue multiple transfers. |
| 864 | * errors, we dare not queue multiple transfers. | 851 | */ |
| 865 | */ | 852 | dma_ok = dma_controller->channel_program(dma_channel, |
| 866 | dma_ok = dma_controller->channel_program( | 853 | packet_sz, !(urb->transfer_flags & |
| 867 | dma_channel, packet_sz, | 854 | URB_SHORT_NOT_OK), |
| 868 | !(urb->transfer_flags | 855 | urb->transfer_dma + offset, |
| 869 | & URB_SHORT_NOT_OK), | 856 | qh->segsize); |
| 870 | urb->transfer_dma + offset, | 857 | if (!dma_ok) { |
| 871 | qh->segsize); | 858 | dma_controller->channel_release(dma_channel); |
| 872 | if (!dma_ok) { | 859 | hw_ep->rx_channel = dma_channel = NULL; |
| 873 | dma_controller->channel_release( | 860 | } else |
| 874 | dma_channel); | 861 | csr |= MUSB_RXCSR_DMAENAB; |
| 875 | hw_ep->rx_channel = NULL; | ||
| 876 | dma_channel = NULL; | ||
| 877 | } else | ||
| 878 | csr |= MUSB_RXCSR_DMAENAB; | ||
| 879 | } | ||
| 880 | } | 862 | } |
| 881 | 863 | ||
| 882 | csr |= MUSB_RXCSR_H_REQPKT; | 864 | csr |= MUSB_RXCSR_H_REQPKT; |
| 883 | DBG(7, "RXCSR%d := %04x\n", epnum, csr); | 865 | dev_dbg(musb->controller, "RXCSR%d := %04x\n", epnum, csr); |
| 884 | musb_writew(hw_ep->regs, MUSB_RXCSR, csr); | 866 | musb_writew(hw_ep->regs, MUSB_RXCSR, csr); |
| 885 | csr = musb_readw(hw_ep->regs, MUSB_RXCSR); | 867 | csr = musb_readw(hw_ep->regs, MUSB_RXCSR); |
| 886 | } | 868 | } |
| @@ -923,15 +905,15 @@ static bool musb_h_ep0_continue(struct musb *musb, u16 len, struct urb *urb) | |||
| 923 | request = (struct usb_ctrlrequest *) urb->setup_packet; | 905 | request = (struct usb_ctrlrequest *) urb->setup_packet; |
| 924 | 906 | ||
| 925 | if (!request->wLength) { | 907 | if (!request->wLength) { |
| 926 | DBG(4, "start no-DATA\n"); | 908 | dev_dbg(musb->controller, "start no-DATA\n"); |
| 927 | break; | 909 | break; |
| 928 | } else if (request->bRequestType & USB_DIR_IN) { | 910 | } else if (request->bRequestType & USB_DIR_IN) { |
| 929 | DBG(4, "start IN-DATA\n"); | 911 | dev_dbg(musb->controller, "start IN-DATA\n"); |
| 930 | musb->ep0_stage = MUSB_EP0_IN; | 912 | musb->ep0_stage = MUSB_EP0_IN; |
| 931 | more = true; | 913 | more = true; |
| 932 | break; | 914 | break; |
| 933 | } else { | 915 | } else { |
| 934 | DBG(4, "start OUT-DATA\n"); | 916 | dev_dbg(musb->controller, "start OUT-DATA\n"); |
| 935 | musb->ep0_stage = MUSB_EP0_OUT; | 917 | musb->ep0_stage = MUSB_EP0_OUT; |
| 936 | more = true; | 918 | more = true; |
| 937 | } | 919 | } |
| @@ -943,7 +925,7 @@ static bool musb_h_ep0_continue(struct musb *musb, u16 len, struct urb *urb) | |||
| 943 | if (fifo_count) { | 925 | if (fifo_count) { |
| 944 | fifo_dest = (u8 *) (urb->transfer_buffer | 926 | fifo_dest = (u8 *) (urb->transfer_buffer |
| 945 | + urb->actual_length); | 927 | + urb->actual_length); |
| 946 | DBG(3, "Sending %d byte%s to ep0 fifo %p\n", | 928 | dev_dbg(musb->controller, "Sending %d byte%s to ep0 fifo %p\n", |
| 947 | fifo_count, | 929 | fifo_count, |
| 948 | (fifo_count == 1) ? "" : "s", | 930 | (fifo_count == 1) ? "" : "s", |
| 949 | fifo_dest); | 931 | fifo_dest); |
| @@ -988,7 +970,7 @@ irqreturn_t musb_h_ep0_irq(struct musb *musb) | |||
| 988 | ? musb_readb(epio, MUSB_COUNT0) | 970 | ? musb_readb(epio, MUSB_COUNT0) |
| 989 | : 0; | 971 | : 0; |
| 990 | 972 | ||
| 991 | DBG(4, "<== csr0 %04x, qh %p, count %d, urb %p, stage %d\n", | 973 | dev_dbg(musb->controller, "<== csr0 %04x, qh %p, count %d, urb %p, stage %d\n", |
| 992 | csr, qh, len, urb, musb->ep0_stage); | 974 | csr, qh, len, urb, musb->ep0_stage); |
| 993 | 975 | ||
| 994 | /* if we just did status stage, we are done */ | 976 | /* if we just did status stage, we are done */ |
| @@ -999,15 +981,15 @@ irqreturn_t musb_h_ep0_irq(struct musb *musb) | |||
| 999 | 981 | ||
| 1000 | /* prepare status */ | 982 | /* prepare status */ |
| 1001 | if (csr & MUSB_CSR0_H_RXSTALL) { | 983 | if (csr & MUSB_CSR0_H_RXSTALL) { |
| 1002 | DBG(6, "STALLING ENDPOINT\n"); | 984 | dev_dbg(musb->controller, "STALLING ENDPOINT\n"); |
| 1003 | status = -EPIPE; | 985 | status = -EPIPE; |
| 1004 | 986 | ||
| 1005 | } else if (csr & MUSB_CSR0_H_ERROR) { | 987 | } else if (csr & MUSB_CSR0_H_ERROR) { |
| 1006 | DBG(2, "no response, csr0 %04x\n", csr); | 988 | dev_dbg(musb->controller, "no response, csr0 %04x\n", csr); |
| 1007 | status = -EPROTO; | 989 | status = -EPROTO; |
| 1008 | 990 | ||
| 1009 | } else if (csr & MUSB_CSR0_H_NAKTIMEOUT) { | 991 | } else if (csr & MUSB_CSR0_H_NAKTIMEOUT) { |
| 1010 | DBG(2, "control NAK timeout\n"); | 992 | dev_dbg(musb->controller, "control NAK timeout\n"); |
| 1011 | 993 | ||
| 1012 | /* NOTE: this code path would be a good place to PAUSE a | 994 | /* NOTE: this code path would be a good place to PAUSE a |
| 1013 | * control transfer, if another one is queued, so that | 995 | * control transfer, if another one is queued, so that |
| @@ -1022,7 +1004,7 @@ irqreturn_t musb_h_ep0_irq(struct musb *musb) | |||
| 1022 | } | 1004 | } |
| 1023 | 1005 | ||
| 1024 | if (status) { | 1006 | if (status) { |
| 1025 | DBG(6, "aborting\n"); | 1007 | dev_dbg(musb->controller, "aborting\n"); |
| 1026 | retval = IRQ_HANDLED; | 1008 | retval = IRQ_HANDLED; |
| 1027 | if (urb) | 1009 | if (urb) |
| 1028 | urb->status = status; | 1010 | urb->status = status; |
| @@ -1072,7 +1054,7 @@ irqreturn_t musb_h_ep0_irq(struct musb *musb) | |||
| 1072 | /* flag status stage */ | 1054 | /* flag status stage */ |
| 1073 | musb->ep0_stage = MUSB_EP0_STATUS; | 1055 | musb->ep0_stage = MUSB_EP0_STATUS; |
| 1074 | 1056 | ||
| 1075 | DBG(5, "ep0 STATUS, csr %04x\n", csr); | 1057 | dev_dbg(musb->controller, "ep0 STATUS, csr %04x\n", csr); |
| 1076 | 1058 | ||
| 1077 | } | 1059 | } |
| 1078 | musb_writew(epio, MUSB_CSR0, csr); | 1060 | musb_writew(epio, MUSB_CSR0, csr); |
| @@ -1126,31 +1108,31 @@ void musb_host_tx(struct musb *musb, u8 epnum) | |||
| 1126 | 1108 | ||
| 1127 | /* with CPPI, DMA sometimes triggers "extra" irqs */ | 1109 | /* with CPPI, DMA sometimes triggers "extra" irqs */ |
| 1128 | if (!urb) { | 1110 | if (!urb) { |
| 1129 | DBG(4, "extra TX%d ready, csr %04x\n", epnum, tx_csr); | 1111 | dev_dbg(musb->controller, "extra TX%d ready, csr %04x\n", epnum, tx_csr); |
| 1130 | return; | 1112 | return; |
| 1131 | } | 1113 | } |
| 1132 | 1114 | ||
| 1133 | pipe = urb->pipe; | 1115 | pipe = urb->pipe; |
| 1134 | dma = is_dma_capable() ? hw_ep->tx_channel : NULL; | 1116 | dma = is_dma_capable() ? hw_ep->tx_channel : NULL; |
| 1135 | DBG(4, "OUT/TX%d end, csr %04x%s\n", epnum, tx_csr, | 1117 | dev_dbg(musb->controller, "OUT/TX%d end, csr %04x%s\n", epnum, tx_csr, |
| 1136 | dma ? ", dma" : ""); | 1118 | dma ? ", dma" : ""); |
| 1137 | 1119 | ||
| 1138 | /* check for errors */ | 1120 | /* check for errors */ |
| 1139 | if (tx_csr & MUSB_TXCSR_H_RXSTALL) { | 1121 | if (tx_csr & MUSB_TXCSR_H_RXSTALL) { |
| 1140 | /* dma was disabled, fifo flushed */ | 1122 | /* dma was disabled, fifo flushed */ |
| 1141 | DBG(3, "TX end %d stall\n", epnum); | 1123 | dev_dbg(musb->controller, "TX end %d stall\n", epnum); |
| 1142 | 1124 | ||
| 1143 | /* stall; record URB status */ | 1125 | /* stall; record URB status */ |
| 1144 | status = -EPIPE; | 1126 | status = -EPIPE; |
| 1145 | 1127 | ||
| 1146 | } else if (tx_csr & MUSB_TXCSR_H_ERROR) { | 1128 | } else if (tx_csr & MUSB_TXCSR_H_ERROR) { |
| 1147 | /* (NON-ISO) dma was disabled, fifo flushed */ | 1129 | /* (NON-ISO) dma was disabled, fifo flushed */ |
| 1148 | DBG(3, "TX 3strikes on ep=%d\n", epnum); | 1130 | dev_dbg(musb->controller, "TX 3strikes on ep=%d\n", epnum); |
| 1149 | 1131 | ||
| 1150 | status = -ETIMEDOUT; | 1132 | status = -ETIMEDOUT; |
| 1151 | 1133 | ||
| 1152 | } else if (tx_csr & MUSB_TXCSR_H_NAKTIMEOUT) { | 1134 | } else if (tx_csr & MUSB_TXCSR_H_NAKTIMEOUT) { |
| 1153 | DBG(6, "TX end=%d device not responding\n", epnum); | 1135 | dev_dbg(musb->controller, "TX end=%d device not responding\n", epnum); |
| 1154 | 1136 | ||
| 1155 | /* NOTE: this code path would be a good place to PAUSE a | 1137 | /* NOTE: this code path would be a good place to PAUSE a |
| 1156 | * transfer, if there's some other (nonperiodic) tx urb | 1138 | * transfer, if there's some other (nonperiodic) tx urb |
| @@ -1195,7 +1177,7 @@ void musb_host_tx(struct musb *musb, u8 epnum) | |||
| 1195 | 1177 | ||
| 1196 | /* second cppi case */ | 1178 | /* second cppi case */ |
| 1197 | if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) { | 1179 | if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) { |
| 1198 | DBG(4, "extra TX%d ready, csr %04x\n", epnum, tx_csr); | 1180 | dev_dbg(musb->controller, "extra TX%d ready, csr %04x\n", epnum, tx_csr); |
| 1199 | return; | 1181 | return; |
| 1200 | } | 1182 | } |
| 1201 | 1183 | ||
| @@ -1254,7 +1236,7 @@ void musb_host_tx(struct musb *musb, u8 epnum) | |||
| 1254 | * FIFO mode too... | 1236 | * FIFO mode too... |
| 1255 | */ | 1237 | */ |
| 1256 | if (tx_csr & (MUSB_TXCSR_FIFONOTEMPTY | MUSB_TXCSR_TXPKTRDY)) { | 1238 | if (tx_csr & (MUSB_TXCSR_FIFONOTEMPTY | MUSB_TXCSR_TXPKTRDY)) { |
| 1257 | DBG(2, "DMA complete but packet still in FIFO, " | 1239 | dev_dbg(musb->controller, "DMA complete but packet still in FIFO, " |
| 1258 | "CSR %04x\n", tx_csr); | 1240 | "CSR %04x\n", tx_csr); |
| 1259 | return; | 1241 | return; |
| 1260 | } | 1242 | } |
| @@ -1321,7 +1303,7 @@ void musb_host_tx(struct musb *musb, u8 epnum) | |||
| 1321 | return; | 1303 | return; |
| 1322 | } | 1304 | } |
| 1323 | } else if (tx_csr & MUSB_TXCSR_DMAENAB) { | 1305 | } else if (tx_csr & MUSB_TXCSR_DMAENAB) { |
| 1324 | DBG(1, "not complete, but DMA enabled?\n"); | 1306 | dev_dbg(musb->controller, "not complete, but DMA enabled?\n"); |
| 1325 | return; | 1307 | return; |
| 1326 | } | 1308 | } |
| 1327 | 1309 | ||
| @@ -1462,7 +1444,7 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
| 1462 | * usbtest #11 (unlinks) triggers it regularly, sometimes | 1444 | * usbtest #11 (unlinks) triggers it regularly, sometimes |
| 1463 | * with fifo full. (Only with DMA??) | 1445 | * with fifo full. (Only with DMA??) |
| 1464 | */ | 1446 | */ |
| 1465 | DBG(3, "BOGUS RX%d ready, csr %04x, count %d\n", epnum, val, | 1447 | dev_dbg(musb->controller, "BOGUS RX%d ready, csr %04x, count %d\n", epnum, val, |
| 1466 | musb_readw(epio, MUSB_RXCOUNT)); | 1448 | musb_readw(epio, MUSB_RXCOUNT)); |
| 1467 | musb_h_flush_rxfifo(hw_ep, MUSB_RXCSR_CLRDATATOG); | 1449 | musb_h_flush_rxfifo(hw_ep, MUSB_RXCSR_CLRDATATOG); |
| 1468 | return; | 1450 | return; |
| @@ -1470,20 +1452,20 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
| 1470 | 1452 | ||
| 1471 | pipe = urb->pipe; | 1453 | pipe = urb->pipe; |
| 1472 | 1454 | ||
| 1473 | DBG(5, "<== hw %d rxcsr %04x, urb actual %d (+dma %zu)\n", | 1455 | dev_dbg(musb->controller, "<== hw %d rxcsr %04x, urb actual %d (+dma %zu)\n", |
| 1474 | epnum, rx_csr, urb->actual_length, | 1456 | epnum, rx_csr, urb->actual_length, |
| 1475 | dma ? dma->actual_len : 0); | 1457 | dma ? dma->actual_len : 0); |
| 1476 | 1458 | ||
| 1477 | /* check for errors, concurrent stall & unlink is not really | 1459 | /* check for errors, concurrent stall & unlink is not really |
| 1478 | * handled yet! */ | 1460 | * handled yet! */ |
| 1479 | if (rx_csr & MUSB_RXCSR_H_RXSTALL) { | 1461 | if (rx_csr & MUSB_RXCSR_H_RXSTALL) { |
| 1480 | DBG(3, "RX end %d STALL\n", epnum); | 1462 | dev_dbg(musb->controller, "RX end %d STALL\n", epnum); |
| 1481 | 1463 | ||
| 1482 | /* stall; record URB status */ | 1464 | /* stall; record URB status */ |
| 1483 | status = -EPIPE; | 1465 | status = -EPIPE; |
| 1484 | 1466 | ||
| 1485 | } else if (rx_csr & MUSB_RXCSR_H_ERROR) { | 1467 | } else if (rx_csr & MUSB_RXCSR_H_ERROR) { |
| 1486 | DBG(3, "end %d RX proto error\n", epnum); | 1468 | dev_dbg(musb->controller, "end %d RX proto error\n", epnum); |
| 1487 | 1469 | ||
| 1488 | status = -EPROTO; | 1470 | status = -EPROTO; |
| 1489 | musb_writeb(epio, MUSB_RXINTERVAL, 0); | 1471 | musb_writeb(epio, MUSB_RXINTERVAL, 0); |
| @@ -1491,7 +1473,7 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
| 1491 | } else if (rx_csr & MUSB_RXCSR_DATAERROR) { | 1473 | } else if (rx_csr & MUSB_RXCSR_DATAERROR) { |
| 1492 | 1474 | ||
| 1493 | if (USB_ENDPOINT_XFER_ISOC != qh->type) { | 1475 | if (USB_ENDPOINT_XFER_ISOC != qh->type) { |
| 1494 | DBG(6, "RX end %d NAK timeout\n", epnum); | 1476 | dev_dbg(musb->controller, "RX end %d NAK timeout\n", epnum); |
| 1495 | 1477 | ||
| 1496 | /* NOTE: NAKing is *NOT* an error, so we want to | 1478 | /* NOTE: NAKing is *NOT* an error, so we want to |
| 1497 | * continue. Except ... if there's a request for | 1479 | * continue. Except ... if there's a request for |
| @@ -1514,12 +1496,12 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
| 1514 | 1496 | ||
| 1515 | goto finish; | 1497 | goto finish; |
| 1516 | } else { | 1498 | } else { |
| 1517 | DBG(4, "RX end %d ISO data error\n", epnum); | 1499 | dev_dbg(musb->controller, "RX end %d ISO data error\n", epnum); |
| 1518 | /* packet error reported later */ | 1500 | /* packet error reported later */ |
| 1519 | iso_err = true; | 1501 | iso_err = true; |
| 1520 | } | 1502 | } |
| 1521 | } else if (rx_csr & MUSB_RXCSR_INCOMPRX) { | 1503 | } else if (rx_csr & MUSB_RXCSR_INCOMPRX) { |
| 1522 | DBG(3, "end %d high bandwidth incomplete ISO packet RX\n", | 1504 | dev_dbg(musb->controller, "end %d high bandwidth incomplete ISO packet RX\n", |
| 1523 | epnum); | 1505 | epnum); |
| 1524 | status = -EPROTO; | 1506 | status = -EPROTO; |
| 1525 | } | 1507 | } |
| @@ -1565,7 +1547,7 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
| 1565 | done = true; | 1547 | done = true; |
| 1566 | } | 1548 | } |
| 1567 | 1549 | ||
| 1568 | DBG(2, "RXCSR%d %04x, reqpkt, len %zu%s\n", epnum, rx_csr, | 1550 | dev_dbg(musb->controller, "RXCSR%d %04x, reqpkt, len %zu%s\n", epnum, rx_csr, |
| 1569 | xfer_len, dma ? ", dma" : ""); | 1551 | xfer_len, dma ? ", dma" : ""); |
| 1570 | rx_csr &= ~MUSB_RXCSR_H_REQPKT; | 1552 | rx_csr &= ~MUSB_RXCSR_H_REQPKT; |
| 1571 | 1553 | ||
| @@ -1615,7 +1597,7 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
| 1615 | MUSB_RXCSR_H_WZC_BITS | val); | 1597 | MUSB_RXCSR_H_WZC_BITS | val); |
| 1616 | } | 1598 | } |
| 1617 | 1599 | ||
| 1618 | DBG(4, "ep %d dma %s, rxcsr %04x, rxcount %d\n", epnum, | 1600 | dev_dbg(musb->controller, "ep %d dma %s, rxcsr %04x, rxcount %d\n", epnum, |
| 1619 | done ? "off" : "reset", | 1601 | done ? "off" : "reset", |
| 1620 | musb_readw(epio, MUSB_RXCSR), | 1602 | musb_readw(epio, MUSB_RXCSR), |
| 1621 | musb_readw(epio, MUSB_RXCOUNT)); | 1603 | musb_readw(epio, MUSB_RXCOUNT)); |
| @@ -1648,7 +1630,7 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
| 1648 | 1630 | ||
| 1649 | rx_count = musb_readw(epio, MUSB_RXCOUNT); | 1631 | rx_count = musb_readw(epio, MUSB_RXCOUNT); |
| 1650 | 1632 | ||
| 1651 | DBG(2, "RX%d count %d, buffer 0x%x len %d/%d\n", | 1633 | dev_dbg(musb->controller, "RX%d count %d, buffer 0x%x len %d/%d\n", |
| 1652 | epnum, rx_count, | 1634 | epnum, rx_count, |
| 1653 | urb->transfer_dma | 1635 | urb->transfer_dma |
| 1654 | + urb->actual_length, | 1636 | + urb->actual_length, |
| @@ -1672,7 +1654,7 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
| 1672 | d_status = -EOVERFLOW; | 1654 | d_status = -EOVERFLOW; |
| 1673 | urb->error_count++; | 1655 | urb->error_count++; |
| 1674 | } | 1656 | } |
| 1675 | DBG(2, "** OVERFLOW %d into %d\n",\ | 1657 | dev_dbg(musb->controller, "** OVERFLOW %d into %d\n",\ |
| 1676 | rx_count, d->length); | 1658 | rx_count, d->length); |
| 1677 | 1659 | ||
| 1678 | length = d->length; | 1660 | length = d->length; |
| @@ -1760,7 +1742,7 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
| 1760 | usb_hcd_unmap_urb_for_dma(musb_to_hcd(musb), urb); | 1742 | usb_hcd_unmap_urb_for_dma(musb_to_hcd(musb), urb); |
| 1761 | done = musb_host_packet_rx(musb, urb, | 1743 | done = musb_host_packet_rx(musb, urb, |
| 1762 | epnum, iso_err); | 1744 | epnum, iso_err); |
| 1763 | DBG(6, "read %spacket\n", done ? "last " : ""); | 1745 | dev_dbg(musb->controller, "read %spacket\n", done ? "last " : ""); |
| 1764 | } | 1746 | } |
| 1765 | } | 1747 | } |
| 1766 | 1748 | ||
| @@ -1881,7 +1863,7 @@ static int musb_schedule( | |||
| 1881 | idle = 1; | 1863 | idle = 1; |
| 1882 | qh->mux = 0; | 1864 | qh->mux = 0; |
| 1883 | hw_ep = musb->endpoints + best_end; | 1865 | hw_ep = musb->endpoints + best_end; |
| 1884 | DBG(4, "qh %p periodic slot %d\n", qh, best_end); | 1866 | dev_dbg(musb->controller, "qh %p periodic slot %d\n", qh, best_end); |
| 1885 | success: | 1867 | success: |
| 1886 | if (head) { | 1868 | if (head) { |
| 1887 | idle = list_empty(head); | 1869 | idle = list_empty(head); |
| @@ -2087,6 +2069,7 @@ done: | |||
| 2087 | static int musb_cleanup_urb(struct urb *urb, struct musb_qh *qh) | 2069 | static int musb_cleanup_urb(struct urb *urb, struct musb_qh *qh) |
| 2088 | { | 2070 | { |
| 2089 | struct musb_hw_ep *ep = qh->hw_ep; | 2071 | struct musb_hw_ep *ep = qh->hw_ep; |
| 2072 | struct musb *musb = ep->musb; | ||
| 2090 | void __iomem *epio = ep->regs; | 2073 | void __iomem *epio = ep->regs; |
| 2091 | unsigned hw_end = ep->epnum; | 2074 | unsigned hw_end = ep->epnum; |
| 2092 | void __iomem *regs = ep->musb->mregs; | 2075 | void __iomem *regs = ep->musb->mregs; |
| @@ -2102,7 +2085,7 @@ static int musb_cleanup_urb(struct urb *urb, struct musb_qh *qh) | |||
| 2102 | dma = is_in ? ep->rx_channel : ep->tx_channel; | 2085 | dma = is_in ? ep->rx_channel : ep->tx_channel; |
| 2103 | if (dma) { | 2086 | if (dma) { |
| 2104 | status = ep->musb->dma_controller->channel_abort(dma); | 2087 | status = ep->musb->dma_controller->channel_abort(dma); |
| 2105 | DBG(status ? 1 : 3, | 2088 | dev_dbg(musb->controller, |
| 2106 | "abort %cX%d DMA for urb %p --> %d\n", | 2089 | "abort %cX%d DMA for urb %p --> %d\n", |
| 2107 | is_in ? 'R' : 'T', ep->epnum, | 2090 | is_in ? 'R' : 'T', ep->epnum, |
| 2108 | urb, status); | 2091 | urb, status); |
| @@ -2149,7 +2132,7 @@ static int musb_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | |||
| 2149 | int is_in = usb_pipein(urb->pipe); | 2132 | int is_in = usb_pipein(urb->pipe); |
| 2150 | int ret; | 2133 | int ret; |
| 2151 | 2134 | ||
| 2152 | DBG(4, "urb=%p, dev%d ep%d%s\n", urb, | 2135 | dev_dbg(musb->controller, "urb=%p, dev%d ep%d%s\n", urb, |
| 2153 | usb_pipedevice(urb->pipe), | 2136 | usb_pipedevice(urb->pipe), |
| 2154 | usb_pipeendpoint(urb->pipe), | 2137 | usb_pipeendpoint(urb->pipe), |
| 2155 | is_in ? "in" : "out"); | 2138 | is_in ? "in" : "out"); |
| @@ -2304,7 +2287,7 @@ static int musb_bus_suspend(struct usb_hcd *hcd) | |||
| 2304 | 2287 | ||
| 2305 | if (musb->is_active) { | 2288 | if (musb->is_active) { |
| 2306 | WARNING("trying to suspend as %s while active\n", | 2289 | WARNING("trying to suspend as %s while active\n", |
| 2307 | otg_state_string(musb)); | 2290 | otg_state_string(musb->xceiv->state)); |
| 2308 | return -EBUSY; | 2291 | return -EBUSY; |
| 2309 | } else | 2292 | } else |
| 2310 | return 0; | 2293 | return 0; |
diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c index 489104a5ae1..2d80a575883 100644 --- a/drivers/usb/musb/musb_virthub.c +++ b/drivers/usb/musb/musb_virthub.c | |||
| @@ -74,7 +74,7 @@ static void musb_port_suspend(struct musb *musb, bool do_suspend) | |||
| 74 | break; | 74 | break; |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | DBG(3, "Root port suspended, power %02x\n", power); | 77 | dev_dbg(musb->controller, "Root port suspended, power %02x\n", power); |
| 78 | 78 | ||
| 79 | musb->port1_status |= USB_PORT_STAT_SUSPEND; | 79 | musb->port1_status |= USB_PORT_STAT_SUSPEND; |
| 80 | switch (musb->xceiv->state) { | 80 | switch (musb->xceiv->state) { |
| @@ -97,15 +97,15 @@ static void musb_port_suspend(struct musb *musb, bool do_suspend) | |||
| 97 | break; | 97 | break; |
| 98 | #endif | 98 | #endif |
| 99 | default: | 99 | default: |
| 100 | DBG(1, "bogus rh suspend? %s\n", | 100 | dev_dbg(musb->controller, "bogus rh suspend? %s\n", |
| 101 | otg_state_string(musb)); | 101 | otg_state_string(musb->xceiv->state)); |
| 102 | } | 102 | } |
| 103 | } else if (power & MUSB_POWER_SUSPENDM) { | 103 | } else if (power & MUSB_POWER_SUSPENDM) { |
| 104 | power &= ~MUSB_POWER_SUSPENDM; | 104 | power &= ~MUSB_POWER_SUSPENDM; |
| 105 | power |= MUSB_POWER_RESUME; | 105 | power |= MUSB_POWER_RESUME; |
| 106 | musb_writeb(mbase, MUSB_POWER, power); | 106 | musb_writeb(mbase, MUSB_POWER, power); |
| 107 | 107 | ||
| 108 | DBG(3, "Root port resuming, power %02x\n", power); | 108 | dev_dbg(musb->controller, "Root port resuming, power %02x\n", power); |
| 109 | 109 | ||
| 110 | /* later, GetPortStatus will stop RESUME signaling */ | 110 | /* later, GetPortStatus will stop RESUME signaling */ |
| 111 | musb->port1_status |= MUSB_PORT_STAT_RESUME; | 111 | musb->port1_status |= MUSB_PORT_STAT_RESUME; |
| @@ -120,7 +120,7 @@ static void musb_port_reset(struct musb *musb, bool do_reset) | |||
| 120 | 120 | ||
| 121 | #ifdef CONFIG_USB_MUSB_OTG | 121 | #ifdef CONFIG_USB_MUSB_OTG |
| 122 | if (musb->xceiv->state == OTG_STATE_B_IDLE) { | 122 | if (musb->xceiv->state == OTG_STATE_B_IDLE) { |
| 123 | DBG(2, "HNP: Returning from HNP; no hub reset from b_idle\n"); | 123 | dev_dbg(musb->controller, "HNP: Returning from HNP; no hub reset from b_idle\n"); |
| 124 | musb->port1_status &= ~USB_PORT_STAT_RESET; | 124 | musb->port1_status &= ~USB_PORT_STAT_RESET; |
| 125 | return; | 125 | return; |
| 126 | } | 126 | } |
| @@ -159,7 +159,7 @@ static void musb_port_reset(struct musb *musb, bool do_reset) | |||
| 159 | musb->port1_status &= ~USB_PORT_STAT_ENABLE; | 159 | musb->port1_status &= ~USB_PORT_STAT_ENABLE; |
| 160 | musb->rh_timer = jiffies + msecs_to_jiffies(50); | 160 | musb->rh_timer = jiffies + msecs_to_jiffies(50); |
| 161 | } else { | 161 | } else { |
| 162 | DBG(4, "root port reset stopped\n"); | 162 | dev_dbg(musb->controller, "root port reset stopped\n"); |
| 163 | musb_writeb(mbase, MUSB_POWER, | 163 | musb_writeb(mbase, MUSB_POWER, |
| 164 | power & ~MUSB_POWER_RESET); | 164 | power & ~MUSB_POWER_RESET); |
| 165 | 165 | ||
| @@ -167,7 +167,7 @@ static void musb_port_reset(struct musb *musb, bool do_reset) | |||
| 167 | 167 | ||
| 168 | power = musb_readb(mbase, MUSB_POWER); | 168 | power = musb_readb(mbase, MUSB_POWER); |
| 169 | if (power & MUSB_POWER_HSMODE) { | 169 | if (power & MUSB_POWER_HSMODE) { |
| 170 | DBG(4, "high-speed device connected\n"); | 170 | dev_dbg(musb->controller, "high-speed device connected\n"); |
| 171 | musb->port1_status |= USB_PORT_STAT_HIGH_SPEED; | 171 | musb->port1_status |= USB_PORT_STAT_HIGH_SPEED; |
| 172 | } | 172 | } |
| 173 | 173 | ||
| @@ -208,7 +208,8 @@ void musb_root_disconnect(struct musb *musb) | |||
| 208 | musb->xceiv->state = OTG_STATE_B_IDLE; | 208 | musb->xceiv->state = OTG_STATE_B_IDLE; |
| 209 | break; | 209 | break; |
| 210 | default: | 210 | default: |
| 211 | DBG(1, "host disconnect (%s)\n", otg_state_string(musb)); | 211 | dev_dbg(musb->controller, "host disconnect (%s)\n", |
| 212 | otg_state_string(musb->xceiv->state)); | ||
| 212 | } | 213 | } |
| 213 | } | 214 | } |
| 214 | 215 | ||
| @@ -287,7 +288,7 @@ int musb_hub_control( | |||
| 287 | default: | 288 | default: |
| 288 | goto error; | 289 | goto error; |
| 289 | } | 290 | } |
| 290 | DBG(5, "clear feature %d\n", wValue); | 291 | dev_dbg(musb->controller, "clear feature %d\n", wValue); |
| 291 | musb->port1_status &= ~(1 << wValue); | 292 | musb->port1_status &= ~(1 << wValue); |
| 292 | break; | 293 | break; |
| 293 | case GetHubDescriptor: | 294 | case GetHubDescriptor: |
| @@ -329,7 +330,7 @@ int musb_hub_control( | |||
| 329 | 330 | ||
| 330 | power = musb_readb(musb->mregs, MUSB_POWER); | 331 | power = musb_readb(musb->mregs, MUSB_POWER); |
| 331 | power &= ~MUSB_POWER_RESUME; | 332 | power &= ~MUSB_POWER_RESUME; |
| 332 | DBG(4, "root port resume stopped, power %02x\n", | 333 | dev_dbg(musb->controller, "root port resume stopped, power %02x\n", |
| 333 | power); | 334 | power); |
| 334 | musb_writeb(musb->mregs, MUSB_POWER, power); | 335 | musb_writeb(musb->mregs, MUSB_POWER, power); |
| 335 | 336 | ||
| @@ -352,7 +353,7 @@ int musb_hub_control( | |||
| 352 | (__le32 *) buf); | 353 | (__le32 *) buf); |
| 353 | 354 | ||
| 354 | /* port change status is more interesting */ | 355 | /* port change status is more interesting */ |
| 355 | DBG(get_unaligned((u16 *)(buf+2)) ? 2 : 5, "port status %08x\n", | 356 | dev_dbg(musb->controller, "port status %08x\n", |
| 356 | musb->port1_status); | 357 | musb->port1_status); |
| 357 | break; | 358 | break; |
| 358 | case SetPortFeature: | 359 | case SetPortFeature: |
| @@ -423,7 +424,7 @@ int musb_hub_control( | |||
| 423 | default: | 424 | default: |
| 424 | goto error; | 425 | goto error; |
| 425 | } | 426 | } |
| 426 | DBG(5, "set feature %d\n", wValue); | 427 | dev_dbg(musb->controller, "set feature %d\n", wValue); |
| 427 | musb->port1_status |= 1 << wValue; | 428 | musb->port1_status |= 1 << wValue; |
| 428 | break; | 429 | break; |
| 429 | 430 | ||
diff --git a/drivers/usb/musb/musbhsdma.c b/drivers/usb/musb/musbhsdma.c index d281792db05..f70c5a57773 100644 --- a/drivers/usb/musb/musbhsdma.c +++ b/drivers/usb/musb/musbhsdma.c | |||
| @@ -122,11 +122,12 @@ static void configure_channel(struct dma_channel *channel, | |||
| 122 | { | 122 | { |
| 123 | struct musb_dma_channel *musb_channel = channel->private_data; | 123 | struct musb_dma_channel *musb_channel = channel->private_data; |
| 124 | struct musb_dma_controller *controller = musb_channel->controller; | 124 | struct musb_dma_controller *controller = musb_channel->controller; |
| 125 | struct musb *musb = controller->private_data; | ||
| 125 | void __iomem *mbase = controller->base; | 126 | void __iomem *mbase = controller->base; |
| 126 | u8 bchannel = musb_channel->idx; | 127 | u8 bchannel = musb_channel->idx; |
| 127 | u16 csr = 0; | 128 | u16 csr = 0; |
| 128 | 129 | ||
| 129 | DBG(4, "%p, pkt_sz %d, addr 0x%x, len %d, mode %d\n", | 130 | dev_dbg(musb->controller, "%p, pkt_sz %d, addr 0x%x, len %d, mode %d\n", |
| 130 | channel, packet_sz, dma_addr, len, mode); | 131 | channel, packet_sz, dma_addr, len, mode); |
| 131 | 132 | ||
| 132 | if (mode) { | 133 | if (mode) { |
| @@ -161,7 +162,7 @@ static int dma_channel_program(struct dma_channel *channel, | |||
| 161 | struct musb_dma_controller *controller = musb_channel->controller; | 162 | struct musb_dma_controller *controller = musb_channel->controller; |
| 162 | struct musb *musb = controller->private_data; | 163 | struct musb *musb = controller->private_data; |
| 163 | 164 | ||
| 164 | DBG(2, "ep%d-%s pkt_sz %d, dma_addr 0x%x length %d, mode %d\n", | 165 | dev_dbg(musb->controller, "ep%d-%s pkt_sz %d, dma_addr 0x%x length %d, mode %d\n", |
| 165 | musb_channel->epnum, | 166 | musb_channel->epnum, |
| 166 | musb_channel->transmit ? "Tx" : "Rx", | 167 | musb_channel->transmit ? "Tx" : "Rx", |
| 167 | packet_sz, dma_addr, len, mode); | 168 | packet_sz, dma_addr, len, mode); |
| @@ -274,7 +275,7 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data) | |||
| 274 | #endif | 275 | #endif |
| 275 | 276 | ||
| 276 | if (!int_hsdma) { | 277 | if (!int_hsdma) { |
| 277 | DBG(2, "spurious DMA irq\n"); | 278 | dev_dbg(musb->controller, "spurious DMA irq\n"); |
| 278 | 279 | ||
| 279 | for (bchannel = 0; bchannel < MUSB_HSDMA_CHANNELS; bchannel++) { | 280 | for (bchannel = 0; bchannel < MUSB_HSDMA_CHANNELS; bchannel++) { |
| 280 | musb_channel = (struct musb_dma_channel *) | 281 | musb_channel = (struct musb_dma_channel *) |
| @@ -288,7 +289,7 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data) | |||
| 288 | } | 289 | } |
| 289 | } | 290 | } |
| 290 | 291 | ||
| 291 | DBG(2, "int_hsdma = 0x%x\n", int_hsdma); | 292 | dev_dbg(musb->controller, "int_hsdma = 0x%x\n", int_hsdma); |
| 292 | 293 | ||
| 293 | if (!int_hsdma) | 294 | if (!int_hsdma) |
| 294 | goto done; | 295 | goto done; |
| @@ -315,7 +316,7 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data) | |||
| 315 | channel->actual_len = addr | 316 | channel->actual_len = addr |
| 316 | - musb_channel->start_addr; | 317 | - musb_channel->start_addr; |
| 317 | 318 | ||
| 318 | DBG(2, "ch %p, 0x%x -> 0x%x (%zu / %d) %s\n", | 319 | dev_dbg(musb->controller, "ch %p, 0x%x -> 0x%x (%zu / %d) %s\n", |
| 319 | channel, musb_channel->start_addr, | 320 | channel, musb_channel->start_addr, |
| 320 | addr, channel->actual_len, | 321 | addr, channel->actual_len, |
| 321 | musb_channel->len, | 322 | musb_channel->len, |
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index e9e60b6e058..c5d4c44d0ff 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c | |||
| @@ -76,7 +76,7 @@ static void musb_do_idle(unsigned long _musb) | |||
| 76 | if (musb->port1_status & MUSB_PORT_STAT_RESUME) { | 76 | if (musb->port1_status & MUSB_PORT_STAT_RESUME) { |
| 77 | power = musb_readb(musb->mregs, MUSB_POWER); | 77 | power = musb_readb(musb->mregs, MUSB_POWER); |
| 78 | power &= ~MUSB_POWER_RESUME; | 78 | power &= ~MUSB_POWER_RESUME; |
| 79 | DBG(1, "root port resume stopped, power %02x\n", power); | 79 | dev_dbg(musb->controller, "root port resume stopped, power %02x\n", power); |
| 80 | musb_writeb(musb->mregs, MUSB_POWER, power); | 80 | musb_writeb(musb->mregs, MUSB_POWER, power); |
| 81 | musb->is_active = 1; | 81 | musb->is_active = 1; |
| 82 | musb->port1_status &= ~(USB_PORT_STAT_SUSPEND | 82 | musb->port1_status &= ~(USB_PORT_STAT_SUSPEND |
| @@ -114,7 +114,8 @@ static void omap2430_musb_try_idle(struct musb *musb, unsigned long timeout) | |||
| 114 | /* Never idle if active, or when VBUS timeout is not set as host */ | 114 | /* Never idle if active, or when VBUS timeout is not set as host */ |
| 115 | if (musb->is_active || ((musb->a_wait_bcon == 0) | 115 | if (musb->is_active || ((musb->a_wait_bcon == 0) |
| 116 | && (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) { | 116 | && (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) { |
| 117 | DBG(4, "%s active, deleting timer\n", otg_state_string(musb)); | 117 | dev_dbg(musb->controller, "%s active, deleting timer\n", |
| 118 | otg_state_string(musb->xceiv->state)); | ||
| 118 | del_timer(&musb_idle_timer); | 119 | del_timer(&musb_idle_timer); |
| 119 | last_timer = jiffies; | 120 | last_timer = jiffies; |
| 120 | return; | 121 | return; |
| @@ -124,14 +125,14 @@ static void omap2430_musb_try_idle(struct musb *musb, unsigned long timeout) | |||
| 124 | if (!timer_pending(&musb_idle_timer)) | 125 | if (!timer_pending(&musb_idle_timer)) |
| 125 | last_timer = timeout; | 126 | last_timer = timeout; |
| 126 | else { | 127 | else { |
| 127 | DBG(4, "Longer idle timer already pending, ignoring\n"); | 128 | dev_dbg(musb->controller, "Longer idle timer already pending, ignoring\n"); |
| 128 | return; | 129 | return; |
| 129 | } | 130 | } |
| 130 | } | 131 | } |
| 131 | last_timer = timeout; | 132 | last_timer = timeout; |
| 132 | 133 | ||
| 133 | DBG(4, "%s inactive, for idle timer for %lu ms\n", | 134 | dev_dbg(musb->controller, "%s inactive, for idle timer for %lu ms\n", |
| 134 | otg_state_string(musb), | 135 | otg_state_string(musb->xceiv->state), |
| 135 | (unsigned long)jiffies_to_msecs(timeout - jiffies)); | 136 | (unsigned long)jiffies_to_msecs(timeout - jiffies)); |
| 136 | mod_timer(&musb_idle_timer, timeout); | 137 | mod_timer(&musb_idle_timer, timeout); |
| 137 | } | 138 | } |
| @@ -193,9 +194,9 @@ static void omap2430_musb_set_vbus(struct musb *musb, int is_on) | |||
| 193 | } | 194 | } |
| 194 | musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); | 195 | musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); |
| 195 | 196 | ||
| 196 | DBG(1, "VBUS %s, devctl %02x " | 197 | dev_dbg(musb->controller, "VBUS %s, devctl %02x " |
| 197 | /* otg %3x conf %08x prcm %08x */ "\n", | 198 | /* otg %3x conf %08x prcm %08x */ "\n", |
| 198 | otg_state_string(musb), | 199 | otg_state_string(musb->xceiv->state), |
| 199 | musb_readb(musb->mregs, MUSB_DEVCTL)); | 200 | musb_readb(musb->mregs, MUSB_DEVCTL)); |
| 200 | } | 201 | } |
| 201 | 202 | ||
| @@ -239,7 +240,7 @@ static int musb_otg_notifications(struct notifier_block *nb, | |||
| 239 | 240 | ||
| 240 | switch (event) { | 241 | switch (event) { |
| 241 | case USB_EVENT_ID: | 242 | case USB_EVENT_ID: |
| 242 | DBG(4, "ID GND\n"); | 243 | dev_dbg(musb->controller, "ID GND\n"); |
| 243 | 244 | ||
| 244 | if (is_otg_enabled(musb)) { | 245 | if (is_otg_enabled(musb)) { |
| 245 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC | 246 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC |
| @@ -257,7 +258,7 @@ static int musb_otg_notifications(struct notifier_block *nb, | |||
| 257 | break; | 258 | break; |
| 258 | 259 | ||
| 259 | case USB_EVENT_VBUS: | 260 | case USB_EVENT_VBUS: |
| 260 | DBG(4, "VBUS Connect\n"); | 261 | dev_dbg(musb->controller, "VBUS Connect\n"); |
| 261 | 262 | ||
| 262 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC | 263 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC |
| 263 | if (musb->gadget_driver) | 264 | if (musb->gadget_driver) |
| @@ -267,7 +268,7 @@ static int musb_otg_notifications(struct notifier_block *nb, | |||
| 267 | break; | 268 | break; |
| 268 | 269 | ||
| 269 | case USB_EVENT_NONE: | 270 | case USB_EVENT_NONE: |
| 270 | DBG(4, "VBUS Disconnect\n"); | 271 | dev_dbg(musb->controller, "VBUS Disconnect\n"); |
| 271 | 272 | ||
| 272 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC | 273 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC |
| 273 | if (is_otg_enabled(musb) || is_peripheral_enabled(musb)) | 274 | if (is_otg_enabled(musb) || is_peripheral_enabled(musb)) |
| @@ -285,7 +286,7 @@ static int musb_otg_notifications(struct notifier_block *nb, | |||
| 285 | otg_shutdown(musb->xceiv); | 286 | otg_shutdown(musb->xceiv); |
| 286 | break; | 287 | break; |
| 287 | default: | 288 | default: |
| 288 | DBG(4, "ID float\n"); | 289 | dev_dbg(musb->controller, "ID float\n"); |
| 289 | return NOTIFY_DONE; | 290 | return NOTIFY_DONE; |
| 290 | } | 291 | } |
| 291 | 292 | ||
| @@ -339,7 +340,7 @@ static int omap2430_musb_init(struct musb *musb) | |||
| 339 | status = otg_register_notifier(musb->xceiv, &musb->nb); | 340 | status = otg_register_notifier(musb->xceiv, &musb->nb); |
| 340 | 341 | ||
| 341 | if (status) | 342 | if (status) |
| 342 | DBG(1, "notification register failed\n"); | 343 | dev_dbg(musb->controller, "notification register failed\n"); |
| 343 | 344 | ||
| 344 | setup_timer(&musb_idle_timer, musb_do_idle, (unsigned long) musb); | 345 | setup_timer(&musb_idle_timer, musb_do_idle, (unsigned long) musb); |
| 345 | 346 | ||
diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c index c47aac4a1f9..b410357cf01 100644 --- a/drivers/usb/musb/tusb6010.c +++ b/drivers/usb/musb/tusb6010.c | |||
| @@ -106,7 +106,7 @@ static void tusb_wbus_quirk(struct musb *musb, int enabled) | |||
| 106 | tmp = phy_otg_ena & ~WBUS_QUIRK_MASK; | 106 | tmp = phy_otg_ena & ~WBUS_QUIRK_MASK; |
| 107 | tmp |= TUSB_PHY_OTG_CTRL_WRPROTECT | TUSB_PHY_OTG_CTRL_TESTM2; | 107 | tmp |= TUSB_PHY_OTG_CTRL_WRPROTECT | TUSB_PHY_OTG_CTRL_TESTM2; |
| 108 | musb_writel(tbase, TUSB_PHY_OTG_CTRL_ENABLE, tmp); | 108 | musb_writel(tbase, TUSB_PHY_OTG_CTRL_ENABLE, tmp); |
| 109 | DBG(2, "Enabled tusb wbus quirk ctrl %08x ena %08x\n", | 109 | dev_dbg(musb->controller, "Enabled tusb wbus quirk ctrl %08x ena %08x\n", |
| 110 | musb_readl(tbase, TUSB_PHY_OTG_CTRL), | 110 | musb_readl(tbase, TUSB_PHY_OTG_CTRL), |
| 111 | musb_readl(tbase, TUSB_PHY_OTG_CTRL_ENABLE)); | 111 | musb_readl(tbase, TUSB_PHY_OTG_CTRL_ENABLE)); |
| 112 | } else if (musb_readl(tbase, TUSB_PHY_OTG_CTRL_ENABLE) | 112 | } else if (musb_readl(tbase, TUSB_PHY_OTG_CTRL_ENABLE) |
| @@ -115,7 +115,7 @@ static void tusb_wbus_quirk(struct musb *musb, int enabled) | |||
| 115 | musb_writel(tbase, TUSB_PHY_OTG_CTRL, tmp); | 115 | musb_writel(tbase, TUSB_PHY_OTG_CTRL, tmp); |
| 116 | tmp = TUSB_PHY_OTG_CTRL_WRPROTECT | phy_otg_ena; | 116 | tmp = TUSB_PHY_OTG_CTRL_WRPROTECT | phy_otg_ena; |
| 117 | musb_writel(tbase, TUSB_PHY_OTG_CTRL_ENABLE, tmp); | 117 | musb_writel(tbase, TUSB_PHY_OTG_CTRL_ENABLE, tmp); |
| 118 | DBG(2, "Disabled tusb wbus quirk ctrl %08x ena %08x\n", | 118 | dev_dbg(musb->controller, "Disabled tusb wbus quirk ctrl %08x ena %08x\n", |
| 119 | musb_readl(tbase, TUSB_PHY_OTG_CTRL), | 119 | musb_readl(tbase, TUSB_PHY_OTG_CTRL), |
| 120 | musb_readl(tbase, TUSB_PHY_OTG_CTRL_ENABLE)); | 120 | musb_readl(tbase, TUSB_PHY_OTG_CTRL_ENABLE)); |
| 121 | phy_otg_ctrl = 0; | 121 | phy_otg_ctrl = 0; |
| @@ -172,13 +172,14 @@ static inline void tusb_fifo_read_unaligned(void __iomem *fifo, | |||
| 172 | 172 | ||
| 173 | void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *buf) | 173 | void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *buf) |
| 174 | { | 174 | { |
| 175 | struct musb *musb = hw_ep->musb; | ||
| 175 | void __iomem *ep_conf = hw_ep->conf; | 176 | void __iomem *ep_conf = hw_ep->conf; |
| 176 | void __iomem *fifo = hw_ep->fifo; | 177 | void __iomem *fifo = hw_ep->fifo; |
| 177 | u8 epnum = hw_ep->epnum; | 178 | u8 epnum = hw_ep->epnum; |
| 178 | 179 | ||
| 179 | prefetch(buf); | 180 | prefetch(buf); |
| 180 | 181 | ||
| 181 | DBG(4, "%cX ep%d fifo %p count %d buf %p\n", | 182 | dev_dbg(musb->controller, "%cX ep%d fifo %p count %d buf %p\n", |
| 182 | 'T', epnum, fifo, len, buf); | 183 | 'T', epnum, fifo, len, buf); |
| 183 | 184 | ||
| 184 | if (epnum) | 185 | if (epnum) |
| @@ -221,11 +222,12 @@ void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *buf) | |||
| 221 | 222 | ||
| 222 | void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *buf) | 223 | void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *buf) |
| 223 | { | 224 | { |
| 225 | struct musb *musb = hw_ep->musb; | ||
| 224 | void __iomem *ep_conf = hw_ep->conf; | 226 | void __iomem *ep_conf = hw_ep->conf; |
| 225 | void __iomem *fifo = hw_ep->fifo; | 227 | void __iomem *fifo = hw_ep->fifo; |
| 226 | u8 epnum = hw_ep->epnum; | 228 | u8 epnum = hw_ep->epnum; |
| 227 | 229 | ||
| 228 | DBG(4, "%cX ep%d fifo %p count %d buf %p\n", | 230 | dev_dbg(musb->controller, "%cX ep%d fifo %p count %d buf %p\n", |
| 229 | 'R', epnum, fifo, len, buf); | 231 | 'R', epnum, fifo, len, buf); |
| 230 | 232 | ||
| 231 | if (epnum) | 233 | if (epnum) |
| @@ -304,7 +306,7 @@ static int tusb_draw_power(struct otg_transceiver *x, unsigned mA) | |||
| 304 | } | 306 | } |
| 305 | musb_writel(tbase, TUSB_PRCM_MNGMT, reg); | 307 | musb_writel(tbase, TUSB_PRCM_MNGMT, reg); |
| 306 | 308 | ||
| 307 | DBG(2, "draw max %d mA VBUS\n", mA); | 309 | dev_dbg(musb->controller, "draw max %d mA VBUS\n", mA); |
| 308 | return 0; | 310 | return 0; |
| 309 | } | 311 | } |
| 310 | 312 | ||
| @@ -374,7 +376,7 @@ static void tusb_allow_idle(struct musb *musb, u32 wakeup_enables) | |||
| 374 | reg |= TUSB_PRCM_MNGMT_PM_IDLE | TUSB_PRCM_MNGMT_DEV_IDLE; | 376 | reg |= TUSB_PRCM_MNGMT_PM_IDLE | TUSB_PRCM_MNGMT_DEV_IDLE; |
| 375 | musb_writel(tbase, TUSB_PRCM_MNGMT, reg); | 377 | musb_writel(tbase, TUSB_PRCM_MNGMT, reg); |
| 376 | 378 | ||
| 377 | DBG(6, "idle, wake on %02x\n", wakeup_enables); | 379 | dev_dbg(musb->controller, "idle, wake on %02x\n", wakeup_enables); |
| 378 | } | 380 | } |
| 379 | 381 | ||
| 380 | /* | 382 | /* |
| @@ -421,8 +423,8 @@ static void musb_do_idle(unsigned long _musb) | |||
| 421 | if ((musb->a_wait_bcon != 0) | 423 | if ((musb->a_wait_bcon != 0) |
| 422 | && (musb->idle_timeout == 0 | 424 | && (musb->idle_timeout == 0 |
| 423 | || time_after(jiffies, musb->idle_timeout))) { | 425 | || time_after(jiffies, musb->idle_timeout))) { |
| 424 | DBG(4, "Nothing connected %s, turning off VBUS\n", | 426 | dev_dbg(musb->controller, "Nothing connected %s, turning off VBUS\n", |
| 425 | otg_state_string(musb)); | 427 | otg_state_string(musb->xceiv->state)); |
| 426 | } | 428 | } |
| 427 | /* FALLTHROUGH */ | 429 | /* FALLTHROUGH */ |
| 428 | case OTG_STATE_A_IDLE: | 430 | case OTG_STATE_A_IDLE: |
| @@ -481,7 +483,8 @@ static void tusb_musb_try_idle(struct musb *musb, unsigned long timeout) | |||
| 481 | /* Never idle if active, or when VBUS timeout is not set as host */ | 483 | /* Never idle if active, or when VBUS timeout is not set as host */ |
| 482 | if (musb->is_active || ((musb->a_wait_bcon == 0) | 484 | if (musb->is_active || ((musb->a_wait_bcon == 0) |
| 483 | && (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) { | 485 | && (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) { |
| 484 | DBG(4, "%s active, deleting timer\n", otg_state_string(musb)); | 486 | dev_dbg(musb->controller, "%s active, deleting timer\n", |
| 487 | otg_state_string(musb->xceiv->state)); | ||
| 485 | del_timer(&musb_idle_timer); | 488 | del_timer(&musb_idle_timer); |
| 486 | last_timer = jiffies; | 489 | last_timer = jiffies; |
| 487 | return; | 490 | return; |
| @@ -491,14 +494,14 @@ static void tusb_musb_try_idle(struct musb *musb, unsigned long timeout) | |||
| 491 | if (!timer_pending(&musb_idle_timer)) | 494 | if (!timer_pending(&musb_idle_timer)) |
| 492 | last_timer = timeout; | 495 | last_timer = timeout; |
| 493 | else { | 496 | else { |
| 494 | DBG(4, "Longer idle timer already pending, ignoring\n"); | 497 | dev_dbg(musb->controller, "Longer idle timer already pending, ignoring\n"); |
| 495 | return; | 498 | return; |
| 496 | } | 499 | } |
| 497 | } | 500 | } |
| 498 | last_timer = timeout; | 501 | last_timer = timeout; |
| 499 | 502 | ||
| 500 | DBG(4, "%s inactive, for idle timer for %lu ms\n", | 503 | dev_dbg(musb->controller, "%s inactive, for idle timer for %lu ms\n", |
| 501 | otg_state_string(musb), | 504 | otg_state_string(musb->xceiv->state), |
| 502 | (unsigned long)jiffies_to_msecs(timeout - jiffies)); | 505 | (unsigned long)jiffies_to_msecs(timeout - jiffies)); |
| 503 | mod_timer(&musb_idle_timer, timeout); | 506 | mod_timer(&musb_idle_timer, timeout); |
| 504 | } | 507 | } |
| @@ -572,8 +575,8 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on) | |||
| 572 | musb_writel(tbase, TUSB_DEV_CONF, conf); | 575 | musb_writel(tbase, TUSB_DEV_CONF, conf); |
| 573 | musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); | 576 | musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); |
| 574 | 577 | ||
| 575 | DBG(1, "VBUS %s, devctl %02x otg %3x conf %08x prcm %08x\n", | 578 | dev_dbg(musb->controller, "VBUS %s, devctl %02x otg %3x conf %08x prcm %08x\n", |
| 576 | otg_state_string(musb), | 579 | otg_state_string(musb->xceiv->state), |
| 577 | musb_readb(musb->mregs, MUSB_DEVCTL), | 580 | musb_readb(musb->mregs, MUSB_DEVCTL), |
| 578 | musb_readl(tbase, TUSB_DEV_OTG_STAT), | 581 | musb_readl(tbase, TUSB_DEV_OTG_STAT), |
| 579 | conf, prcm); | 582 | conf, prcm); |
| @@ -633,7 +636,7 @@ static int tusb_musb_set_mode(struct musb *musb, u8 musb_mode) | |||
| 633 | #endif | 636 | #endif |
| 634 | 637 | ||
| 635 | default: | 638 | default: |
| 636 | DBG(2, "Trying to set mode %i\n", musb_mode); | 639 | dev_dbg(musb->controller, "Trying to set mode %i\n", musb_mode); |
| 637 | return -EINVAL; | 640 | return -EINVAL; |
| 638 | } | 641 | } |
| 639 | 642 | ||
| @@ -666,7 +669,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase) | |||
| 666 | default_a = !(otg_stat & TUSB_DEV_OTG_STAT_ID_STATUS); | 669 | default_a = !(otg_stat & TUSB_DEV_OTG_STAT_ID_STATUS); |
| 667 | else | 670 | else |
| 668 | default_a = is_host_enabled(musb); | 671 | default_a = is_host_enabled(musb); |
| 669 | DBG(2, "Default-%c\n", default_a ? 'A' : 'B'); | 672 | dev_dbg(musb->controller, "Default-%c\n", default_a ? 'A' : 'B'); |
| 670 | musb->xceiv->default_a = default_a; | 673 | musb->xceiv->default_a = default_a; |
| 671 | tusb_musb_set_vbus(musb, default_a); | 674 | tusb_musb_set_vbus(musb, default_a); |
| 672 | 675 | ||
| @@ -693,7 +696,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase) | |||
| 693 | #endif | 696 | #endif |
| 694 | 697 | ||
| 695 | if (otg_stat & TUSB_DEV_OTG_STAT_SESS_END) { | 698 | if (otg_stat & TUSB_DEV_OTG_STAT_SESS_END) { |
| 696 | DBG(1, "Forcing disconnect (no interrupt)\n"); | 699 | dev_dbg(musb->controller, "Forcing disconnect (no interrupt)\n"); |
| 697 | if (musb->xceiv->state != OTG_STATE_B_IDLE) { | 700 | if (musb->xceiv->state != OTG_STATE_B_IDLE) { |
| 698 | /* INTR_DISCONNECT can hide... */ | 701 | /* INTR_DISCONNECT can hide... */ |
| 699 | musb->xceiv->state = OTG_STATE_B_IDLE; | 702 | musb->xceiv->state = OTG_STATE_B_IDLE; |
| @@ -701,18 +704,18 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase) | |||
| 701 | } | 704 | } |
| 702 | musb->is_active = 0; | 705 | musb->is_active = 0; |
| 703 | } | 706 | } |
| 704 | DBG(2, "vbus change, %s, otg %03x\n", | 707 | dev_dbg(musb->controller, "vbus change, %s, otg %03x\n", |
| 705 | otg_state_string(musb), otg_stat); | 708 | otg_state_string(musb->xceiv->state), otg_stat); |
| 706 | idle_timeout = jiffies + (1 * HZ); | 709 | idle_timeout = jiffies + (1 * HZ); |
| 707 | schedule_work(&musb->irq_work); | 710 | schedule_work(&musb->irq_work); |
| 708 | 711 | ||
| 709 | } else /* A-dev state machine */ { | 712 | } else /* A-dev state machine */ { |
| 710 | DBG(2, "vbus change, %s, otg %03x\n", | 713 | dev_dbg(musb->controller, "vbus change, %s, otg %03x\n", |
| 711 | otg_state_string(musb), otg_stat); | 714 | otg_state_string(musb->xceiv->state), otg_stat); |
| 712 | 715 | ||
| 713 | switch (musb->xceiv->state) { | 716 | switch (musb->xceiv->state) { |
| 714 | case OTG_STATE_A_IDLE: | 717 | case OTG_STATE_A_IDLE: |
| 715 | DBG(2, "Got SRP, turning on VBUS\n"); | 718 | dev_dbg(musb->controller, "Got SRP, turning on VBUS\n"); |
| 716 | musb_platform_set_vbus(musb, 1); | 719 | musb_platform_set_vbus(musb, 1); |
| 717 | 720 | ||
| 718 | /* CONNECT can wake if a_wait_bcon is set */ | 721 | /* CONNECT can wake if a_wait_bcon is set */ |
| @@ -756,7 +759,8 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase) | |||
| 756 | if (int_src & TUSB_INT_SRC_OTG_TIMEOUT) { | 759 | if (int_src & TUSB_INT_SRC_OTG_TIMEOUT) { |
| 757 | u8 devctl; | 760 | u8 devctl; |
| 758 | 761 | ||
| 759 | DBG(4, "%s timer, %03x\n", otg_state_string(musb), otg_stat); | 762 | dev_dbg(musb->controller, "%s timer, %03x\n", |
| 763 | otg_state_string(musb->xceiv->state), otg_stat); | ||
| 760 | 764 | ||
| 761 | switch (musb->xceiv->state) { | 765 | switch (musb->xceiv->state) { |
| 762 | case OTG_STATE_A_WAIT_VRISE: | 766 | case OTG_STATE_A_WAIT_VRISE: |
| @@ -767,7 +771,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase) | |||
| 767 | if (otg_stat & TUSB_DEV_OTG_STAT_VBUS_VALID) { | 771 | if (otg_stat & TUSB_DEV_OTG_STAT_VBUS_VALID) { |
| 768 | if ((devctl & MUSB_DEVCTL_VBUS) | 772 | if ((devctl & MUSB_DEVCTL_VBUS) |
| 769 | != MUSB_DEVCTL_VBUS) { | 773 | != MUSB_DEVCTL_VBUS) { |
| 770 | DBG(2, "devctl %02x\n", devctl); | 774 | dev_dbg(musb->controller, "devctl %02x\n", devctl); |
| 771 | break; | 775 | break; |
| 772 | } | 776 | } |
| 773 | musb->xceiv->state = OTG_STATE_A_WAIT_BCON; | 777 | musb->xceiv->state = OTG_STATE_A_WAIT_BCON; |
| @@ -812,7 +816,7 @@ static irqreturn_t tusb_musb_interrupt(int irq, void *__hci) | |||
| 812 | musb_writel(tbase, TUSB_INT_MASK, ~TUSB_INT_MASK_RESERVED_BITS); | 816 | musb_writel(tbase, TUSB_INT_MASK, ~TUSB_INT_MASK_RESERVED_BITS); |
| 813 | 817 | ||
| 814 | int_src = musb_readl(tbase, TUSB_INT_SRC) & ~TUSB_INT_SRC_RESERVED_BITS; | 818 | int_src = musb_readl(tbase, TUSB_INT_SRC) & ~TUSB_INT_SRC_RESERVED_BITS; |
| 815 | DBG(3, "TUSB IRQ %08x\n", int_src); | 819 | dev_dbg(musb->controller, "TUSB IRQ %08x\n", int_src); |
| 816 | 820 | ||
| 817 | musb->int_usb = (u8) int_src; | 821 | musb->int_usb = (u8) int_src; |
| 818 | 822 | ||
| @@ -833,7 +837,7 @@ static irqreturn_t tusb_musb_interrupt(int irq, void *__hci) | |||
| 833 | reg = musb_readl(tbase, TUSB_SCRATCH_PAD); | 837 | reg = musb_readl(tbase, TUSB_SCRATCH_PAD); |
| 834 | if (reg == i) | 838 | if (reg == i) |
| 835 | break; | 839 | break; |
| 836 | DBG(6, "TUSB NOR not ready\n"); | 840 | dev_dbg(musb->controller, "TUSB NOR not ready\n"); |
| 837 | } | 841 | } |
| 838 | 842 | ||
| 839 | /* work around issue 13 (2nd half) */ | 843 | /* work around issue 13 (2nd half) */ |
| @@ -845,7 +849,7 @@ static irqreturn_t tusb_musb_interrupt(int irq, void *__hci) | |||
| 845 | musb->is_active = 1; | 849 | musb->is_active = 1; |
| 846 | schedule_work(&musb->irq_work); | 850 | schedule_work(&musb->irq_work); |
| 847 | } | 851 | } |
| 848 | DBG(3, "wake %sactive %02x\n", | 852 | dev_dbg(musb->controller, "wake %sactive %02x\n", |
| 849 | musb->is_active ? "" : "in", reg); | 853 | musb->is_active ? "" : "in", reg); |
| 850 | 854 | ||
| 851 | /* REVISIT host side TUSB_PRCM_WHOSTDISCON, TUSB_PRCM_WBUS */ | 855 | /* REVISIT host side TUSB_PRCM_WHOSTDISCON, TUSB_PRCM_WBUS */ |
| @@ -867,7 +871,7 @@ static irqreturn_t tusb_musb_interrupt(int irq, void *__hci) | |||
| 867 | u32 dma_src = musb_readl(tbase, TUSB_DMA_INT_SRC); | 871 | u32 dma_src = musb_readl(tbase, TUSB_DMA_INT_SRC); |
| 868 | u32 real_dma_src = musb_readl(tbase, TUSB_DMA_INT_MASK); | 872 | u32 real_dma_src = musb_readl(tbase, TUSB_DMA_INT_MASK); |
| 869 | 873 | ||
| 870 | DBG(3, "DMA IRQ %08x\n", dma_src); | 874 | dev_dbg(musb->controller, "DMA IRQ %08x\n", dma_src); |
| 871 | real_dma_src = ~real_dma_src & dma_src; | 875 | real_dma_src = ~real_dma_src & dma_src; |
| 872 | if (tusb_dma_omap() && real_dma_src) { | 876 | if (tusb_dma_omap() && real_dma_src) { |
| 873 | int tx_source = (real_dma_src & 0xffff); | 877 | int tx_source = (real_dma_src & 0xffff); |
| @@ -875,7 +879,7 @@ static irqreturn_t tusb_musb_interrupt(int irq, void *__hci) | |||
| 875 | 879 | ||
| 876 | for (i = 1; i <= 15; i++) { | 880 | for (i = 1; i <= 15; i++) { |
| 877 | if (tx_source & (1 << i)) { | 881 | if (tx_source & (1 << i)) { |
| 878 | DBG(3, "completing ep%i %s\n", i, "tx"); | 882 | dev_dbg(musb->controller, "completing ep%i %s\n", i, "tx"); |
| 879 | musb_dma_completion(musb, i, 1); | 883 | musb_dma_completion(musb, i, 1); |
| 880 | } | 884 | } |
| 881 | } | 885 | } |
diff --git a/drivers/usb/musb/tusb6010_omap.c b/drivers/usb/musb/tusb6010_omap.c index 99cb541e4ef..c784e6c03aa 100644 --- a/drivers/usb/musb/tusb6010_omap.c +++ b/drivers/usb/musb/tusb6010_omap.c | |||
| @@ -65,7 +65,7 @@ static int tusb_omap_dma_start(struct dma_controller *c) | |||
| 65 | 65 | ||
| 66 | tusb_dma = container_of(c, struct tusb_omap_dma, controller); | 66 | tusb_dma = container_of(c, struct tusb_omap_dma, controller); |
| 67 | 67 | ||
| 68 | /* DBG(3, "ep%i ch: %i\n", chdat->epnum, chdat->ch); */ | 68 | /* dev_dbg(musb->controller, "ep%i ch: %i\n", chdat->epnum, chdat->ch); */ |
| 69 | 69 | ||
| 70 | return 0; | 70 | return 0; |
| 71 | } | 71 | } |
| @@ -76,7 +76,7 @@ static int tusb_omap_dma_stop(struct dma_controller *c) | |||
| 76 | 76 | ||
| 77 | tusb_dma = container_of(c, struct tusb_omap_dma, controller); | 77 | tusb_dma = container_of(c, struct tusb_omap_dma, controller); |
| 78 | 78 | ||
| 79 | /* DBG(3, "ep%i ch: %i\n", chdat->epnum, chdat->ch); */ | 79 | /* dev_dbg(musb->controller, "ep%i ch: %i\n", chdat->epnum, chdat->ch); */ |
| 80 | 80 | ||
| 81 | return 0; | 81 | return 0; |
| 82 | } | 82 | } |
| @@ -89,7 +89,7 @@ static inline int tusb_omap_use_shared_dmareq(struct tusb_omap_dma_ch *chdat) | |||
| 89 | u32 reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP); | 89 | u32 reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP); |
| 90 | 90 | ||
| 91 | if (reg != 0) { | 91 | if (reg != 0) { |
| 92 | DBG(3, "ep%i dmareq0 is busy for ep%i\n", | 92 | dev_dbg(musb->controller, "ep%i dmareq0 is busy for ep%i\n", |
| 93 | chdat->epnum, reg & 0xf); | 93 | chdat->epnum, reg & 0xf); |
| 94 | return -EAGAIN; | 94 | return -EAGAIN; |
| 95 | } | 95 | } |
| @@ -143,7 +143,7 @@ static void tusb_omap_dma_cb(int lch, u16 ch_status, void *data) | |||
| 143 | if (ch_status != OMAP_DMA_BLOCK_IRQ) | 143 | if (ch_status != OMAP_DMA_BLOCK_IRQ) |
| 144 | printk(KERN_ERR "TUSB DMA error status: %i\n", ch_status); | 144 | printk(KERN_ERR "TUSB DMA error status: %i\n", ch_status); |
| 145 | 145 | ||
| 146 | DBG(3, "ep%i %s dma callback ch: %i status: %x\n", | 146 | dev_dbg(musb->controller, "ep%i %s dma callback ch: %i status: %x\n", |
| 147 | chdat->epnum, chdat->tx ? "tx" : "rx", | 147 | chdat->epnum, chdat->tx ? "tx" : "rx", |
| 148 | ch, ch_status); | 148 | ch, ch_status); |
| 149 | 149 | ||
| @@ -156,7 +156,7 @@ static void tusb_omap_dma_cb(int lch, u16 ch_status, void *data) | |||
| 156 | 156 | ||
| 157 | /* HW issue #10: XFR_SIZE may get corrupt on DMA (both async & sync) */ | 157 | /* HW issue #10: XFR_SIZE may get corrupt on DMA (both async & sync) */ |
| 158 | if (unlikely(remaining > chdat->transfer_len)) { | 158 | if (unlikely(remaining > chdat->transfer_len)) { |
| 159 | DBG(2, "Corrupt %s dma ch%i XFR_SIZE: 0x%08lx\n", | 159 | dev_dbg(musb->controller, "Corrupt %s dma ch%i XFR_SIZE: 0x%08lx\n", |
| 160 | chdat->tx ? "tx" : "rx", chdat->ch, | 160 | chdat->tx ? "tx" : "rx", chdat->ch, |
| 161 | remaining); | 161 | remaining); |
| 162 | remaining = 0; | 162 | remaining = 0; |
| @@ -165,13 +165,13 @@ static void tusb_omap_dma_cb(int lch, u16 ch_status, void *data) | |||
| 165 | channel->actual_len = chdat->transfer_len - remaining; | 165 | channel->actual_len = chdat->transfer_len - remaining; |
| 166 | pio = chdat->len - channel->actual_len; | 166 | pio = chdat->len - channel->actual_len; |
| 167 | 167 | ||
| 168 | DBG(3, "DMA remaining %lu/%u\n", remaining, chdat->transfer_len); | 168 | dev_dbg(musb->controller, "DMA remaining %lu/%u\n", remaining, chdat->transfer_len); |
| 169 | 169 | ||
| 170 | /* Transfer remaining 1 - 31 bytes */ | 170 | /* Transfer remaining 1 - 31 bytes */ |
| 171 | if (pio > 0 && pio < 32) { | 171 | if (pio > 0 && pio < 32) { |
| 172 | u8 *buf; | 172 | u8 *buf; |
| 173 | 173 | ||
| 174 | DBG(3, "Using PIO for remaining %lu bytes\n", pio); | 174 | dev_dbg(musb->controller, "Using PIO for remaining %lu bytes\n", pio); |
| 175 | buf = phys_to_virt((u32)chdat->dma_addr) + chdat->transfer_len; | 175 | buf = phys_to_virt((u32)chdat->dma_addr) + chdat->transfer_len; |
| 176 | if (chdat->tx) { | 176 | if (chdat->tx) { |
| 177 | dma_unmap_single(dev, chdat->dma_addr, | 177 | dma_unmap_single(dev, chdat->dma_addr, |
| @@ -209,7 +209,7 @@ static void tusb_omap_dma_cb(int lch, u16 ch_status, void *data) | |||
| 209 | u16 csr; | 209 | u16 csr; |
| 210 | 210 | ||
| 211 | if (chdat->tx) { | 211 | if (chdat->tx) { |
| 212 | DBG(3, "terminating short tx packet\n"); | 212 | dev_dbg(musb->controller, "terminating short tx packet\n"); |
| 213 | musb_ep_select(mbase, chdat->epnum); | 213 | musb_ep_select(mbase, chdat->epnum); |
| 214 | csr = musb_readw(hw_ep->regs, MUSB_TXCSR); | 214 | csr = musb_readw(hw_ep->regs, MUSB_TXCSR); |
| 215 | csr |= MUSB_TXCSR_MODE | MUSB_TXCSR_TXPKTRDY | 215 | csr |= MUSB_TXCSR_MODE | MUSB_TXCSR_TXPKTRDY |
| @@ -264,7 +264,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz, | |||
| 264 | 264 | ||
| 265 | dma_remaining = TUSB_EP_CONFIG_XFR_SIZE(dma_remaining); | 265 | dma_remaining = TUSB_EP_CONFIG_XFR_SIZE(dma_remaining); |
| 266 | if (dma_remaining) { | 266 | if (dma_remaining) { |
| 267 | DBG(2, "Busy %s dma ch%i, not using: %08x\n", | 267 | dev_dbg(musb->controller, "Busy %s dma ch%i, not using: %08x\n", |
| 268 | chdat->tx ? "tx" : "rx", chdat->ch, | 268 | chdat->tx ? "tx" : "rx", chdat->ch, |
| 269 | dma_remaining); | 269 | dma_remaining); |
| 270 | return false; | 270 | return false; |
| @@ -283,7 +283,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz, | |||
| 283 | sync_dev = chdat->sync_dev; | 283 | sync_dev = chdat->sync_dev; |
| 284 | } else { | 284 | } else { |
| 285 | if (tusb_omap_use_shared_dmareq(chdat) != 0) { | 285 | if (tusb_omap_use_shared_dmareq(chdat) != 0) { |
| 286 | DBG(3, "could not get dma for ep%i\n", chdat->epnum); | 286 | dev_dbg(musb->controller, "could not get dma for ep%i\n", chdat->epnum); |
| 287 | return false; | 287 | return false; |
| 288 | } | 288 | } |
| 289 | if (tusb_dma->ch < 0) { | 289 | if (tusb_dma->ch < 0) { |
| @@ -326,7 +326,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz, | |||
| 326 | 326 | ||
| 327 | dma_params.frame_count = chdat->transfer_len / 32; /* Burst sz frame */ | 327 | dma_params.frame_count = chdat->transfer_len / 32; /* Burst sz frame */ |
| 328 | 328 | ||
| 329 | DBG(3, "ep%i %s dma ch%i dma: %08x len: %u(%u) packet_sz: %i(%i)\n", | 329 | dev_dbg(musb->controller, "ep%i %s dma ch%i dma: %08x len: %u(%u) packet_sz: %i(%i)\n", |
| 330 | chdat->epnum, chdat->tx ? "tx" : "rx", | 330 | chdat->epnum, chdat->tx ? "tx" : "rx", |
| 331 | ch, dma_addr, chdat->transfer_len, len, | 331 | ch, dma_addr, chdat->transfer_len, len, |
| 332 | chdat->transfer_packet_sz, packet_sz); | 332 | chdat->transfer_packet_sz, packet_sz); |
| @@ -370,7 +370,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz, | |||
| 370 | dst_burst = OMAP_DMA_DATA_BURST_16; /* 16x32 write */ | 370 | dst_burst = OMAP_DMA_DATA_BURST_16; /* 16x32 write */ |
| 371 | } | 371 | } |
| 372 | 372 | ||
| 373 | DBG(3, "ep%i %s using %i-bit %s dma from 0x%08lx to 0x%08lx\n", | 373 | dev_dbg(musb->controller, "ep%i %s using %i-bit %s dma from 0x%08lx to 0x%08lx\n", |
| 374 | chdat->epnum, chdat->tx ? "tx" : "rx", | 374 | chdat->epnum, chdat->tx ? "tx" : "rx", |
| 375 | (dma_params.data_type == OMAP_DMA_DATA_TYPE_S32) ? 32 : 16, | 375 | (dma_params.data_type == OMAP_DMA_DATA_TYPE_S32) ? 32 : 16, |
| 376 | ((dma_addr & 0x3) == 0) ? "sync" : "async", | 376 | ((dma_addr & 0x3) == 0) ? "sync" : "async", |
| @@ -525,7 +525,7 @@ tusb_omap_dma_allocate(struct dma_controller *c, | |||
| 525 | 525 | ||
| 526 | /* REVISIT: Why does dmareq5 not work? */ | 526 | /* REVISIT: Why does dmareq5 not work? */ |
| 527 | if (hw_ep->epnum == 0) { | 527 | if (hw_ep->epnum == 0) { |
| 528 | DBG(3, "Not allowing DMA for ep0 %s\n", tx ? "tx" : "rx"); | 528 | dev_dbg(musb->controller, "Not allowing DMA for ep0 %s\n", tx ? "tx" : "rx"); |
| 529 | return NULL; | 529 | return NULL; |
| 530 | } | 530 | } |
| 531 | 531 | ||
| @@ -585,7 +585,7 @@ tusb_omap_dma_allocate(struct dma_controller *c, | |||
| 585 | chdat->ch = -1; | 585 | chdat->ch = -1; |
| 586 | } | 586 | } |
| 587 | 587 | ||
| 588 | DBG(3, "ep%i %s dma: %s dma%i dmareq%i sync%i\n", | 588 | dev_dbg(musb->controller, "ep%i %s dma: %s dma%i dmareq%i sync%i\n", |
| 589 | chdat->epnum, | 589 | chdat->epnum, |
| 590 | chdat->tx ? "tx" : "rx", | 590 | chdat->tx ? "tx" : "rx", |
| 591 | chdat->ch >= 0 ? "dedicated" : "shared", | 591 | chdat->ch >= 0 ? "dedicated" : "shared", |
| @@ -598,7 +598,7 @@ tusb_omap_dma_allocate(struct dma_controller *c, | |||
| 598 | free_dmareq: | 598 | free_dmareq: |
| 599 | tusb_omap_dma_free_dmareq(chdat); | 599 | tusb_omap_dma_free_dmareq(chdat); |
| 600 | 600 | ||
| 601 | DBG(3, "ep%i: Could not get a DMA channel\n", chdat->epnum); | 601 | dev_dbg(musb->controller, "ep%i: Could not get a DMA channel\n", chdat->epnum); |
| 602 | channel->status = MUSB_DMA_STATUS_UNKNOWN; | 602 | channel->status = MUSB_DMA_STATUS_UNKNOWN; |
| 603 | 603 | ||
| 604 | return NULL; | 604 | return NULL; |
| @@ -611,7 +611,7 @@ static void tusb_omap_dma_release(struct dma_channel *channel) | |||
| 611 | void __iomem *tbase = musb->ctrl_base; | 611 | void __iomem *tbase = musb->ctrl_base; |
| 612 | u32 reg; | 612 | u32 reg; |
| 613 | 613 | ||
| 614 | DBG(3, "ep%i ch%i\n", chdat->epnum, chdat->ch); | 614 | dev_dbg(musb->controller, "ep%i ch%i\n", chdat->epnum, chdat->ch); |
| 615 | 615 | ||
| 616 | reg = musb_readl(tbase, TUSB_DMA_INT_MASK); | 616 | reg = musb_readl(tbase, TUSB_DMA_INT_MASK); |
| 617 | if (chdat->tx) | 617 | if (chdat->tx) |
diff --git a/drivers/usb/musb/ux500_dma.c b/drivers/usb/musb/ux500_dma.c new file mode 100644 index 00000000000..cecace41183 --- /dev/null +++ b/drivers/usb/musb/ux500_dma.c | |||
| @@ -0,0 +1,422 @@ | |||
| 1 | /* | ||
| 2 | * drivers/usb/musb/ux500_dma.c | ||
| 3 | * | ||
| 4 | * U8500 and U5500 DMA support code | ||
| 5 | * | ||
| 6 | * Copyright (C) 2009 STMicroelectronics | ||
| 7 | * Copyright (C) 2011 ST-Ericsson SA | ||
| 8 | * Authors: | ||
| 9 | * Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com> | ||
| 10 | * Praveena Nadahally <praveen.nadahally@stericsson.com> | ||
| 11 | * Rajaram Regupathy <ragupathy.rajaram@stericsson.com> | ||
| 12 | * | ||
| 13 | * This program is free software: you can redistribute it and/or modify | ||
| 14 | * it under the terms of the GNU General Public License as published by | ||
| 15 | * the Free Software Foundation, either version 2 of the License, or | ||
| 16 | * (at your option) any later version. | ||
| 17 | * | ||
| 18 | * This program is distributed in the hope that it will be useful, | ||
| 19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 21 | * GNU General Public License for more details. | ||
| 22 | * | ||
| 23 | * You should have received a copy of the GNU General Public License | ||
| 24 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 25 | */ | ||
| 26 | |||
| 27 | #include <linux/device.h> | ||
| 28 | #include <linux/interrupt.h> | ||
| 29 | #include <linux/platform_device.h> | ||
| 30 | #include <linux/dma-mapping.h> | ||
| 31 | #include <linux/dmaengine.h> | ||
| 32 | #include <linux/pfn.h> | ||
| 33 | #include <mach/usb.h> | ||
| 34 | #include "musb_core.h" | ||
| 35 | |||
| 36 | struct ux500_dma_channel { | ||
| 37 | struct dma_channel channel; | ||
| 38 | struct ux500_dma_controller *controller; | ||
| 39 | struct musb_hw_ep *hw_ep; | ||
| 40 | struct work_struct channel_work; | ||
| 41 | struct dma_chan *dma_chan; | ||
| 42 | unsigned int cur_len; | ||
| 43 | dma_cookie_t cookie; | ||
| 44 | u8 ch_num; | ||
| 45 | u8 is_tx; | ||
| 46 | u8 is_allocated; | ||
| 47 | }; | ||
| 48 | |||
| 49 | struct ux500_dma_controller { | ||
| 50 | struct dma_controller controller; | ||
| 51 | struct ux500_dma_channel rx_channel[UX500_MUSB_DMA_NUM_RX_CHANNELS]; | ||
| 52 | struct ux500_dma_channel tx_channel[UX500_MUSB_DMA_NUM_TX_CHANNELS]; | ||
| 53 | u32 num_rx_channels; | ||
| 54 | u32 num_tx_channels; | ||
| 55 | void *private_data; | ||
| 56 | dma_addr_t phy_base; | ||
| 57 | }; | ||
| 58 | |||
| 59 | /* Work function invoked from DMA callback to handle tx transfers. */ | ||
| 60 | static void ux500_tx_work(struct work_struct *data) | ||
| 61 | { | ||
| 62 | struct ux500_dma_channel *ux500_channel = container_of(data, | ||
| 63 | struct ux500_dma_channel, channel_work); | ||
| 64 | struct musb_hw_ep *hw_ep = ux500_channel->hw_ep; | ||
| 65 | struct musb *musb = hw_ep->musb; | ||
| 66 | unsigned long flags; | ||
| 67 | |||
| 68 | DBG(4, "DMA tx transfer done on hw_ep=%d\n", hw_ep->epnum); | ||
| 69 | |||
| 70 | spin_lock_irqsave(&musb->lock, flags); | ||
| 71 | ux500_channel->channel.actual_len = ux500_channel->cur_len; | ||
| 72 | ux500_channel->channel.status = MUSB_DMA_STATUS_FREE; | ||
| 73 | musb_dma_completion(musb, hw_ep->epnum, | ||
| 74 | ux500_channel->is_tx); | ||
| 75 | spin_unlock_irqrestore(&musb->lock, flags); | ||
| 76 | } | ||
| 77 | |||
| 78 | /* Work function invoked from DMA callback to handle rx transfers. */ | ||
| 79 | static void ux500_rx_work(struct work_struct *data) | ||
| 80 | { | ||
| 81 | struct ux500_dma_channel *ux500_channel = container_of(data, | ||
| 82 | struct ux500_dma_channel, channel_work); | ||
| 83 | struct musb_hw_ep *hw_ep = ux500_channel->hw_ep; | ||
| 84 | struct musb *musb = hw_ep->musb; | ||
| 85 | unsigned long flags; | ||
| 86 | |||
| 87 | DBG(4, "DMA rx transfer done on hw_ep=%d\n", hw_ep->epnum); | ||
| 88 | |||
| 89 | spin_lock_irqsave(&musb->lock, flags); | ||
| 90 | ux500_channel->channel.actual_len = ux500_channel->cur_len; | ||
| 91 | ux500_channel->channel.status = MUSB_DMA_STATUS_FREE; | ||
| 92 | musb_dma_completion(musb, hw_ep->epnum, | ||
| 93 | ux500_channel->is_tx); | ||
| 94 | spin_unlock_irqrestore(&musb->lock, flags); | ||
| 95 | } | ||
| 96 | |||
| 97 | void ux500_dma_callback(void *private_data) | ||
| 98 | { | ||
| 99 | struct dma_channel *channel = (struct dma_channel *)private_data; | ||
| 100 | struct ux500_dma_channel *ux500_channel = channel->private_data; | ||
| 101 | |||
| 102 | schedule_work(&ux500_channel->channel_work); | ||
| 103 | } | ||
| 104 | |||
| 105 | static bool ux500_configure_channel(struct dma_channel *channel, | ||
| 106 | u16 packet_sz, u8 mode, | ||
| 107 | dma_addr_t dma_addr, u32 len) | ||
| 108 | { | ||
| 109 | struct ux500_dma_channel *ux500_channel = channel->private_data; | ||
| 110 | struct musb_hw_ep *hw_ep = ux500_channel->hw_ep; | ||
| 111 | struct dma_chan *dma_chan = ux500_channel->dma_chan; | ||
| 112 | struct dma_async_tx_descriptor *dma_desc; | ||
| 113 | enum dma_data_direction direction; | ||
| 114 | struct scatterlist sg; | ||
| 115 | struct dma_slave_config slave_conf; | ||
| 116 | enum dma_slave_buswidth addr_width; | ||
| 117 | dma_addr_t usb_fifo_addr = (MUSB_FIFO_OFFSET(hw_ep->epnum) + | ||
| 118 | ux500_channel->controller->phy_base); | ||
| 119 | |||
| 120 | DBG(4, "packet_sz=%d, mode=%d, dma_addr=0x%x, len=%d is_tx=%d\n", | ||
| 121 | packet_sz, mode, dma_addr, len, ux500_channel->is_tx); | ||
| 122 | |||
| 123 | ux500_channel->cur_len = len; | ||
| 124 | |||
| 125 | sg_init_table(&sg, 1); | ||
| 126 | sg_set_page(&sg, pfn_to_page(PFN_DOWN(dma_addr)), len, | ||
| 127 | offset_in_page(dma_addr)); | ||
| 128 | sg_dma_address(&sg) = dma_addr; | ||
| 129 | sg_dma_len(&sg) = len; | ||
| 130 | |||
| 131 | direction = ux500_channel->is_tx ? DMA_TO_DEVICE : DMA_FROM_DEVICE; | ||
| 132 | addr_width = (len & 0x3) ? DMA_SLAVE_BUSWIDTH_1_BYTE : | ||
| 133 | DMA_SLAVE_BUSWIDTH_4_BYTES; | ||
| 134 | |||
| 135 | slave_conf.direction = direction; | ||
| 136 | if (direction == DMA_FROM_DEVICE) { | ||
| 137 | slave_conf.src_addr = usb_fifo_addr; | ||
| 138 | slave_conf.src_addr_width = addr_width; | ||
| 139 | slave_conf.src_maxburst = 16; | ||
| 140 | } else { | ||
| 141 | slave_conf.dst_addr = usb_fifo_addr; | ||
| 142 | slave_conf.dst_addr_width = addr_width; | ||
| 143 | slave_conf.dst_maxburst = 16; | ||
| 144 | } | ||
| 145 | dma_chan->device->device_control(dma_chan, DMA_SLAVE_CONFIG, | ||
| 146 | (unsigned long) &slave_conf); | ||
| 147 | |||
| 148 | dma_desc = dma_chan->device-> | ||
| 149 | device_prep_slave_sg(dma_chan, &sg, 1, direction, | ||
| 150 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | ||
| 151 | if (!dma_desc) | ||
| 152 | return false; | ||
| 153 | |||
| 154 | dma_desc->callback = ux500_dma_callback; | ||
| 155 | dma_desc->callback_param = channel; | ||
| 156 | ux500_channel->cookie = dma_desc->tx_submit(dma_desc); | ||
| 157 | |||
| 158 | dma_async_issue_pending(dma_chan); | ||
| 159 | |||
| 160 | return true; | ||
| 161 | } | ||
| 162 | |||
| 163 | static struct dma_channel *ux500_dma_channel_allocate(struct dma_controller *c, | ||
| 164 | struct musb_hw_ep *hw_ep, u8 is_tx) | ||
| 165 | { | ||
| 166 | struct ux500_dma_controller *controller = container_of(c, | ||
| 167 | struct ux500_dma_controller, controller); | ||
| 168 | struct ux500_dma_channel *ux500_channel = NULL; | ||
| 169 | u8 ch_num = hw_ep->epnum - 1; | ||
| 170 | u32 max_ch; | ||
| 171 | |||
| 172 | /* Max 8 DMA channels (0 - 7). Each DMA channel can only be allocated | ||
| 173 | * to specified hw_ep. For example DMA channel 0 can only be allocated | ||
| 174 | * to hw_ep 1 and 9. | ||
| 175 | */ | ||
| 176 | if (ch_num > 7) | ||
| 177 | ch_num -= 8; | ||
| 178 | |||
| 179 | max_ch = is_tx ? controller->num_tx_channels : | ||
| 180 | controller->num_rx_channels; | ||
| 181 | |||
| 182 | if (ch_num >= max_ch) | ||
| 183 | return NULL; | ||
| 184 | |||
| 185 | ux500_channel = is_tx ? &(controller->tx_channel[ch_num]) : | ||
| 186 | &(controller->rx_channel[ch_num]) ; | ||
| 187 | |||
| 188 | /* Check if channel is already used. */ | ||
| 189 | if (ux500_channel->is_allocated) | ||
| 190 | return NULL; | ||
| 191 | |||
| 192 | ux500_channel->hw_ep = hw_ep; | ||
| 193 | ux500_channel->is_allocated = 1; | ||
| 194 | |||
| 195 | DBG(7, "hw_ep=%d, is_tx=0x%x, channel=%d\n", | ||
| 196 | hw_ep->epnum, is_tx, ch_num); | ||
| 197 | |||
| 198 | return &(ux500_channel->channel); | ||
| 199 | } | ||
| 200 | |||
| 201 | static void ux500_dma_channel_release(struct dma_channel *channel) | ||
| 202 | { | ||
| 203 | struct ux500_dma_channel *ux500_channel = channel->private_data; | ||
| 204 | |||
| 205 | DBG(7, "channel=%d\n", ux500_channel->ch_num); | ||
| 206 | |||
| 207 | if (ux500_channel->is_allocated) { | ||
| 208 | ux500_channel->is_allocated = 0; | ||
| 209 | channel->status = MUSB_DMA_STATUS_FREE; | ||
| 210 | channel->actual_len = 0; | ||
| 211 | } | ||
| 212 | } | ||
| 213 | |||
| 214 | static int ux500_dma_is_compatible(struct dma_channel *channel, | ||
| 215 | u16 maxpacket, void *buf, u32 length) | ||
| 216 | { | ||
| 217 | if ((maxpacket & 0x3) || | ||
| 218 | ((int)buf & 0x3) || | ||
| 219 | (length < 512) || | ||
| 220 | (length & 0x3)) | ||
| 221 | return false; | ||
| 222 | else | ||
| 223 | return true; | ||
| 224 | } | ||
| 225 | |||
| 226 | static int ux500_dma_channel_program(struct dma_channel *channel, | ||
| 227 | u16 packet_sz, u8 mode, | ||
| 228 | dma_addr_t dma_addr, u32 len) | ||
| 229 | { | ||
| 230 | int ret; | ||
| 231 | |||
| 232 | BUG_ON(channel->status == MUSB_DMA_STATUS_UNKNOWN || | ||
| 233 | channel->status == MUSB_DMA_STATUS_BUSY); | ||
| 234 | |||
| 235 | if (!ux500_dma_is_compatible(channel, packet_sz, (void *)dma_addr, len)) | ||
| 236 | return false; | ||
| 237 | |||
| 238 | channel->status = MUSB_DMA_STATUS_BUSY; | ||
| 239 | channel->actual_len = 0; | ||
| 240 | ret = ux500_configure_channel(channel, packet_sz, mode, dma_addr, len); | ||
| 241 | if (!ret) | ||
| 242 | channel->status = MUSB_DMA_STATUS_FREE; | ||
| 243 | |||
| 244 | return ret; | ||
| 245 | } | ||
| 246 | |||
| 247 | static int ux500_dma_channel_abort(struct dma_channel *channel) | ||
| 248 | { | ||
| 249 | struct ux500_dma_channel *ux500_channel = channel->private_data; | ||
| 250 | struct ux500_dma_controller *controller = ux500_channel->controller; | ||
| 251 | struct musb *musb = controller->private_data; | ||
| 252 | void __iomem *epio = musb->endpoints[ux500_channel->hw_ep->epnum].regs; | ||
| 253 | u16 csr; | ||
| 254 | |||
| 255 | DBG(4, "channel=%d, is_tx=%d\n", ux500_channel->ch_num, | ||
| 256 | ux500_channel->is_tx); | ||
| 257 | |||
| 258 | if (channel->status == MUSB_DMA_STATUS_BUSY) { | ||
| 259 | if (ux500_channel->is_tx) { | ||
| 260 | csr = musb_readw(epio, MUSB_TXCSR); | ||
| 261 | csr &= ~(MUSB_TXCSR_AUTOSET | | ||
| 262 | MUSB_TXCSR_DMAENAB | | ||
| 263 | MUSB_TXCSR_DMAMODE); | ||
| 264 | musb_writew(epio, MUSB_TXCSR, csr); | ||
| 265 | } else { | ||
| 266 | csr = musb_readw(epio, MUSB_RXCSR); | ||
| 267 | csr &= ~(MUSB_RXCSR_AUTOCLEAR | | ||
| 268 | MUSB_RXCSR_DMAENAB | | ||
| 269 | MUSB_RXCSR_DMAMODE); | ||
| 270 | musb_writew(epio, MUSB_RXCSR, csr); | ||
| 271 | } | ||
| 272 | |||
| 273 | ux500_channel->dma_chan->device-> | ||
| 274 | device_control(ux500_channel->dma_chan, | ||
| 275 | DMA_TERMINATE_ALL, 0); | ||
| 276 | channel->status = MUSB_DMA_STATUS_FREE; | ||
| 277 | } | ||
| 278 | return 0; | ||
| 279 | } | ||
| 280 | |||
| 281 | static int ux500_dma_controller_stop(struct dma_controller *c) | ||
| 282 | { | ||
| 283 | struct ux500_dma_controller *controller = container_of(c, | ||
| 284 | struct ux500_dma_controller, controller); | ||
| 285 | struct ux500_dma_channel *ux500_channel; | ||
| 286 | struct dma_channel *channel; | ||
| 287 | u8 ch_num; | ||
| 288 | |||
| 289 | for (ch_num = 0; ch_num < controller->num_rx_channels; ch_num++) { | ||
| 290 | channel = &controller->rx_channel[ch_num].channel; | ||
| 291 | ux500_channel = channel->private_data; | ||
| 292 | |||
| 293 | ux500_dma_channel_release(channel); | ||
| 294 | |||
| 295 | if (ux500_channel->dma_chan) | ||
| 296 | dma_release_channel(ux500_channel->dma_chan); | ||
| 297 | } | ||
| 298 | |||
| 299 | for (ch_num = 0; ch_num < controller->num_tx_channels; ch_num++) { | ||
| 300 | channel = &controller->tx_channel[ch_num].channel; | ||
| 301 | ux500_channel = channel->private_data; | ||
| 302 | |||
| 303 | ux500_dma_channel_release(channel); | ||
| 304 | |||
| 305 | if (ux500_channel->dma_chan) | ||
| 306 | dma_release_channel(ux500_channel->dma_chan); | ||
| 307 | } | ||
| 308 | |||
| 309 | return 0; | ||
| 310 | } | ||
| 311 | |||
| 312 | static int ux500_dma_controller_start(struct dma_controller *c) | ||
| 313 | { | ||
| 314 | struct ux500_dma_controller *controller = container_of(c, | ||
| 315 | struct ux500_dma_controller, controller); | ||
| 316 | struct ux500_dma_channel *ux500_channel = NULL; | ||
| 317 | struct musb *musb = controller->private_data; | ||
| 318 | struct device *dev = musb->controller; | ||
| 319 | struct musb_hdrc_platform_data *plat = dev->platform_data; | ||
| 320 | struct ux500_musb_board_data *data = plat->board_data; | ||
| 321 | struct dma_channel *dma_channel = NULL; | ||
| 322 | u32 ch_num; | ||
| 323 | u8 dir; | ||
| 324 | u8 is_tx = 0; | ||
| 325 | |||
| 326 | void **param_array; | ||
| 327 | struct ux500_dma_channel *channel_array; | ||
| 328 | u32 ch_count; | ||
| 329 | void (*musb_channel_work)(struct work_struct *); | ||
| 330 | dma_cap_mask_t mask; | ||
| 331 | |||
| 332 | if ((data->num_rx_channels > UX500_MUSB_DMA_NUM_RX_CHANNELS) || | ||
| 333 | (data->num_tx_channels > UX500_MUSB_DMA_NUM_TX_CHANNELS)) | ||
| 334 | return -EINVAL; | ||
| 335 | |||
| 336 | controller->num_rx_channels = data->num_rx_channels; | ||
| 337 | controller->num_tx_channels = data->num_tx_channels; | ||
| 338 | |||
| 339 | dma_cap_zero(mask); | ||
| 340 | dma_cap_set(DMA_SLAVE, mask); | ||
| 341 | |||
| 342 | /* Prepare the loop for RX channels */ | ||
| 343 | channel_array = controller->rx_channel; | ||
| 344 | ch_count = data->num_rx_channels; | ||
| 345 | param_array = data->dma_rx_param_array; | ||
| 346 | musb_channel_work = ux500_rx_work; | ||
| 347 | |||
| 348 | for (dir = 0; dir < 2; dir++) { | ||
| 349 | for (ch_num = 0; ch_num < ch_count; ch_num++) { | ||
| 350 | ux500_channel = &channel_array[ch_num]; | ||
| 351 | ux500_channel->controller = controller; | ||
| 352 | ux500_channel->ch_num = ch_num; | ||
| 353 | ux500_channel->is_tx = is_tx; | ||
| 354 | |||
| 355 | dma_channel = &(ux500_channel->channel); | ||
| 356 | dma_channel->private_data = ux500_channel; | ||
| 357 | dma_channel->status = MUSB_DMA_STATUS_FREE; | ||
| 358 | dma_channel->max_len = SZ_16M; | ||
| 359 | |||
| 360 | ux500_channel->dma_chan = dma_request_channel(mask, | ||
| 361 | data->dma_filter, | ||
| 362 | param_array[ch_num]); | ||
| 363 | if (!ux500_channel->dma_chan) { | ||
| 364 | ERR("Dma pipe allocation error dir=%d ch=%d\n", | ||
| 365 | dir, ch_num); | ||
| 366 | |||
| 367 | /* Release already allocated channels */ | ||
| 368 | ux500_dma_controller_stop(c); | ||
| 369 | |||
| 370 | return -EBUSY; | ||
| 371 | } | ||
| 372 | |||
| 373 | INIT_WORK(&ux500_channel->channel_work, | ||
| 374 | musb_channel_work); | ||
| 375 | } | ||
| 376 | |||
| 377 | /* Prepare the loop for TX channels */ | ||
| 378 | channel_array = controller->tx_channel; | ||
| 379 | ch_count = data->num_tx_channels; | ||
| 380 | param_array = data->dma_tx_param_array; | ||
| 381 | musb_channel_work = ux500_tx_work; | ||
| 382 | is_tx = 1; | ||
| 383 | } | ||
| 384 | |||
| 385 | return 0; | ||
| 386 | } | ||
| 387 | |||
| 388 | void dma_controller_destroy(struct dma_controller *c) | ||
| 389 | { | ||
| 390 | struct ux500_dma_controller *controller = container_of(c, | ||
| 391 | struct ux500_dma_controller, controller); | ||
| 392 | |||
| 393 | kfree(controller); | ||
| 394 | } | ||
| 395 | |||
| 396 | struct dma_controller *__init | ||
| 397 | dma_controller_create(struct musb *musb, void __iomem *base) | ||
| 398 | { | ||
| 399 | struct ux500_dma_controller *controller; | ||
| 400 | struct platform_device *pdev = to_platform_device(musb->controller); | ||
| 401 | struct resource *iomem; | ||
| 402 | |||
| 403 | controller = kzalloc(sizeof(*controller), GFP_KERNEL); | ||
| 404 | if (!controller) | ||
| 405 | return NULL; | ||
| 406 | |||
| 407 | controller->private_data = musb; | ||
| 408 | |||
| 409 | /* Save physical address for DMA controller. */ | ||
| 410 | iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 411 | controller->phy_base = (dma_addr_t) iomem->start; | ||
| 412 | |||
| 413 | controller->controller.start = ux500_dma_controller_start; | ||
| 414 | controller->controller.stop = ux500_dma_controller_stop; | ||
| 415 | controller->controller.channel_alloc = ux500_dma_channel_allocate; | ||
| 416 | controller->controller.channel_release = ux500_dma_channel_release; | ||
| 417 | controller->controller.channel_program = ux500_dma_channel_program; | ||
| 418 | controller->controller.channel_abort = ux500_dma_channel_abort; | ||
| 419 | controller->controller.is_compatible = ux500_dma_is_compatible; | ||
| 420 | |||
| 421 | return &controller->controller; | ||
| 422 | } | ||
diff --git a/drivers/usb/otg/Kconfig b/drivers/usb/otg/Kconfig index daf3e5f1a0e..c66481ad98d 100644 --- a/drivers/usb/otg/Kconfig +++ b/drivers/usb/otg/Kconfig | |||
| @@ -122,4 +122,12 @@ config AB8500_USB | |||
| 122 | This transceiver supports high and full speed devices plus, | 122 | This transceiver supports high and full speed devices plus, |
| 123 | in host mode, low speed. | 123 | in host mode, low speed. |
| 124 | 124 | ||
| 125 | config FSL_USB2_OTG | ||
| 126 | bool "Freescale USB OTG Transceiver Driver" | ||
| 127 | depends on USB_EHCI_FSL && USB_GADGET_FSL_USB2 | ||
| 128 | select USB_OTG | ||
| 129 | select USB_OTG_UTILS | ||
| 130 | help | ||
| 131 | Enable this to support Freescale USB OTG transceiver. | ||
| 132 | |||
| 125 | endif # USB || OTG | 133 | endif # USB || OTG |
diff --git a/drivers/usb/otg/Makefile b/drivers/usb/otg/Makefile index e22d917de01..566655c5333 100644 --- a/drivers/usb/otg/Makefile +++ b/drivers/usb/otg/Makefile | |||
| @@ -19,3 +19,5 @@ obj-$(CONFIG_USB_ULPI) += ulpi.o | |||
| 19 | obj-$(CONFIG_USB_ULPI_VIEWPORT) += ulpi_viewport.o | 19 | obj-$(CONFIG_USB_ULPI_VIEWPORT) += ulpi_viewport.o |
| 20 | obj-$(CONFIG_USB_MSM_OTG) += msm_otg.o | 20 | obj-$(CONFIG_USB_MSM_OTG) += msm_otg.o |
| 21 | obj-$(CONFIG_AB8500_USB) += ab8500-usb.o | 21 | obj-$(CONFIG_AB8500_USB) += ab8500-usb.o |
| 22 | fsl_usb2_otg-objs := fsl_otg.o otg_fsm.o | ||
| 23 | obj-$(CONFIG_FSL_USB2_OTG) += fsl_usb2_otg.o | ||
diff --git a/drivers/usb/otg/fsl_otg.c b/drivers/usb/otg/fsl_otg.c new file mode 100644 index 00000000000..0f420b25e9a --- /dev/null +++ b/drivers/usb/otg/fsl_otg.c | |||
| @@ -0,0 +1,1169 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2007,2008 Freescale semiconductor, Inc. | ||
| 3 | * | ||
| 4 | * Author: Li Yang <LeoLi@freescale.com> | ||
| 5 | * Jerry Huang <Chang-Ming.Huang@freescale.com> | ||
| 6 | * | ||
| 7 | * Initialization based on code from Shlomi Gridish. | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify it | ||
| 10 | * under the terms of the GNU General Public License as published by the | ||
| 11 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 12 | * option) any later version. | ||
| 13 | * | ||
| 14 | * This program is distributed in the hope that it will be useful, but | ||
| 15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 17 | * General Public License for more details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU General Public License along | ||
| 20 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 21 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 22 | */ | ||
| 23 | |||
| 24 | #include <linux/module.h> | ||
| 25 | #include <linux/kernel.h> | ||
| 26 | #include <linux/delay.h> | ||
| 27 | #include <linux/slab.h> | ||
| 28 | #include <linux/proc_fs.h> | ||
| 29 | #include <linux/errno.h> | ||
| 30 | #include <linux/init.h> | ||
| 31 | #include <linux/interrupt.h> | ||
| 32 | #include <linux/io.h> | ||
| 33 | #include <linux/timer.h> | ||
| 34 | #include <linux/usb.h> | ||
| 35 | #include <linux/device.h> | ||
| 36 | #include <linux/usb/ch9.h> | ||
| 37 | #include <linux/usb/gadget.h> | ||
| 38 | #include <linux/workqueue.h> | ||
| 39 | #include <linux/time.h> | ||
| 40 | #include <linux/fsl_devices.h> | ||
| 41 | #include <linux/platform_device.h> | ||
| 42 | #include <linux/uaccess.h> | ||
| 43 | |||
| 44 | #include <asm/unaligned.h> | ||
| 45 | |||
| 46 | #include "fsl_otg.h" | ||
| 47 | |||
| 48 | #define DRIVER_VERSION "Rev. 1.55" | ||
| 49 | #define DRIVER_AUTHOR "Jerry Huang/Li Yang" | ||
| 50 | #define DRIVER_DESC "Freescale USB OTG Transceiver Driver" | ||
| 51 | #define DRIVER_INFO DRIVER_DESC " " DRIVER_VERSION | ||
| 52 | |||
| 53 | static const char driver_name[] = "fsl-usb2-otg"; | ||
| 54 | |||
| 55 | const pm_message_t otg_suspend_state = { | ||
| 56 | .event = 1, | ||
| 57 | }; | ||
| 58 | |||
| 59 | #define HA_DATA_PULSE | ||
| 60 | |||
| 61 | static struct usb_dr_mmap *usb_dr_regs; | ||
| 62 | static struct fsl_otg *fsl_otg_dev; | ||
| 63 | static int srp_wait_done; | ||
| 64 | |||
| 65 | /* FSM timers */ | ||
| 66 | struct fsl_otg_timer *a_wait_vrise_tmr, *a_wait_bcon_tmr, *a_aidl_bdis_tmr, | ||
| 67 | *b_ase0_brst_tmr, *b_se0_srp_tmr; | ||
| 68 | |||
| 69 | /* Driver specific timers */ | ||
| 70 | struct fsl_otg_timer *b_data_pulse_tmr, *b_vbus_pulse_tmr, *b_srp_fail_tmr, | ||
| 71 | *b_srp_wait_tmr, *a_wait_enum_tmr; | ||
| 72 | |||
| 73 | static struct list_head active_timers; | ||
| 74 | |||
| 75 | static struct fsl_otg_config fsl_otg_initdata = { | ||
| 76 | .otg_port = 1, | ||
| 77 | }; | ||
| 78 | |||
| 79 | #ifdef CONFIG_PPC32 | ||
| 80 | static u32 _fsl_readl_be(const unsigned __iomem *p) | ||
| 81 | { | ||
| 82 | return in_be32(p); | ||
| 83 | } | ||
| 84 | |||
| 85 | static u32 _fsl_readl_le(const unsigned __iomem *p) | ||
| 86 | { | ||
| 87 | return in_le32(p); | ||
| 88 | } | ||
| 89 | |||
| 90 | static void _fsl_writel_be(u32 v, unsigned __iomem *p) | ||
| 91 | { | ||
| 92 | out_be32(p, v); | ||
| 93 | } | ||
| 94 | |||
| 95 | static void _fsl_writel_le(u32 v, unsigned __iomem *p) | ||
| 96 | { | ||
| 97 | out_le32(p, v); | ||
| 98 | } | ||
| 99 | |||
| 100 | static u32 (*_fsl_readl)(const unsigned __iomem *p); | ||
| 101 | static void (*_fsl_writel)(u32 v, unsigned __iomem *p); | ||
| 102 | |||
| 103 | #define fsl_readl(p) (*_fsl_readl)((p)) | ||
| 104 | #define fsl_writel(v, p) (*_fsl_writel)((v), (p)) | ||
| 105 | |||
| 106 | #else | ||
| 107 | #define fsl_readl(addr) readl(addr) | ||
| 108 | #define fsl_writel(val, addr) writel(val, addr) | ||
| 109 | #endif /* CONFIG_PPC32 */ | ||
| 110 | |||
| 111 | /* Routines to access transceiver ULPI registers */ | ||
| 112 | u8 view_ulpi(u8 addr) | ||
| 113 | { | ||
| 114 | u32 temp; | ||
| 115 | |||
| 116 | temp = 0x40000000 | (addr << 16); | ||
| 117 | fsl_writel(temp, &usb_dr_regs->ulpiview); | ||
| 118 | udelay(1000); | ||
| 119 | while (temp & 0x40) | ||
| 120 | temp = fsl_readl(&usb_dr_regs->ulpiview); | ||
| 121 | return (le32_to_cpu(temp) & 0x0000ff00) >> 8; | ||
| 122 | } | ||
| 123 | |||
| 124 | int write_ulpi(u8 addr, u8 data) | ||
| 125 | { | ||
| 126 | u32 temp; | ||
| 127 | |||
| 128 | temp = 0x60000000 | (addr << 16) | data; | ||
| 129 | fsl_writel(temp, &usb_dr_regs->ulpiview); | ||
| 130 | return 0; | ||
| 131 | } | ||
| 132 | |||
| 133 | /* -------------------------------------------------------------*/ | ||
| 134 | /* Operations that will be called from OTG Finite State Machine */ | ||
| 135 | |||
| 136 | /* Charge vbus for vbus pulsing in SRP */ | ||
| 137 | void fsl_otg_chrg_vbus(int on) | ||
| 138 | { | ||
| 139 | u32 tmp; | ||
| 140 | |||
| 141 | tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK; | ||
| 142 | |||
| 143 | if (on) | ||
| 144 | /* stop discharging, start charging */ | ||
| 145 | tmp = (tmp & ~OTGSC_CTRL_VBUS_DISCHARGE) | | ||
| 146 | OTGSC_CTRL_VBUS_CHARGE; | ||
| 147 | else | ||
| 148 | /* stop charging */ | ||
| 149 | tmp &= ~OTGSC_CTRL_VBUS_CHARGE; | ||
| 150 | |||
| 151 | fsl_writel(tmp, &usb_dr_regs->otgsc); | ||
| 152 | } | ||
| 153 | |||
| 154 | /* Discharge vbus through a resistor to ground */ | ||
| 155 | void fsl_otg_dischrg_vbus(int on) | ||
| 156 | { | ||
| 157 | u32 tmp; | ||
| 158 | |||
| 159 | tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK; | ||
| 160 | |||
| 161 | if (on) | ||
| 162 | /* stop charging, start discharging */ | ||
| 163 | tmp = (tmp & ~OTGSC_CTRL_VBUS_CHARGE) | | ||
| 164 | OTGSC_CTRL_VBUS_DISCHARGE; | ||
| 165 | else | ||
| 166 | /* stop discharging */ | ||
| 167 | tmp &= ~OTGSC_CTRL_VBUS_DISCHARGE; | ||
| 168 | |||
| 169 | fsl_writel(tmp, &usb_dr_regs->otgsc); | ||
| 170 | } | ||
| 171 | |||
| 172 | /* A-device driver vbus, controlled through PP bit in PORTSC */ | ||
| 173 | void fsl_otg_drv_vbus(int on) | ||
| 174 | { | ||
| 175 | u32 tmp; | ||
| 176 | |||
| 177 | if (on) { | ||
| 178 | tmp = fsl_readl(&usb_dr_regs->portsc) & ~PORTSC_W1C_BITS; | ||
| 179 | fsl_writel(tmp | PORTSC_PORT_POWER, &usb_dr_regs->portsc); | ||
| 180 | } else { | ||
| 181 | tmp = fsl_readl(&usb_dr_regs->portsc) & | ||
| 182 | ~PORTSC_W1C_BITS & ~PORTSC_PORT_POWER; | ||
| 183 | fsl_writel(tmp, &usb_dr_regs->portsc); | ||
| 184 | } | ||
| 185 | } | ||
| 186 | |||
| 187 | /* | ||
| 188 | * Pull-up D+, signalling connect by periperal. Also used in | ||
| 189 | * data-line pulsing in SRP | ||
| 190 | */ | ||
| 191 | void fsl_otg_loc_conn(int on) | ||
| 192 | { | ||
| 193 | u32 tmp; | ||
| 194 | |||
| 195 | tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK; | ||
| 196 | |||
| 197 | if (on) | ||
| 198 | tmp |= OTGSC_CTRL_DATA_PULSING; | ||
| 199 | else | ||
| 200 | tmp &= ~OTGSC_CTRL_DATA_PULSING; | ||
| 201 | |||
| 202 | fsl_writel(tmp, &usb_dr_regs->otgsc); | ||
| 203 | } | ||
| 204 | |||
| 205 | /* | ||
| 206 | * Generate SOF by host. This is controlled through suspend/resume the | ||
| 207 | * port. In host mode, controller will automatically send SOF. | ||
| 208 | * Suspend will block the data on the port. | ||
| 209 | */ | ||
| 210 | void fsl_otg_loc_sof(int on) | ||
| 211 | { | ||
| 212 | u32 tmp; | ||
| 213 | |||
| 214 | tmp = fsl_readl(&fsl_otg_dev->dr_mem_map->portsc) & ~PORTSC_W1C_BITS; | ||
| 215 | if (on) | ||
| 216 | tmp |= PORTSC_PORT_FORCE_RESUME; | ||
| 217 | else | ||
| 218 | tmp |= PORTSC_PORT_SUSPEND; | ||
| 219 | |||
| 220 | fsl_writel(tmp, &fsl_otg_dev->dr_mem_map->portsc); | ||
| 221 | |||
| 222 | } | ||
| 223 | |||
| 224 | /* Start SRP pulsing by data-line pulsing, followed with v-bus pulsing. */ | ||
| 225 | void fsl_otg_start_pulse(void) | ||
| 226 | { | ||
| 227 | u32 tmp; | ||
| 228 | |||
| 229 | srp_wait_done = 0; | ||
| 230 | #ifdef HA_DATA_PULSE | ||
| 231 | tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK; | ||
| 232 | tmp |= OTGSC_HA_DATA_PULSE; | ||
| 233 | fsl_writel(tmp, &usb_dr_regs->otgsc); | ||
| 234 | #else | ||
| 235 | fsl_otg_loc_conn(1); | ||
| 236 | #endif | ||
| 237 | |||
| 238 | fsl_otg_add_timer(b_data_pulse_tmr); | ||
| 239 | } | ||
| 240 | |||
| 241 | void b_data_pulse_end(unsigned long foo) | ||
| 242 | { | ||
| 243 | #ifdef HA_DATA_PULSE | ||
| 244 | #else | ||
| 245 | fsl_otg_loc_conn(0); | ||
| 246 | #endif | ||
| 247 | |||
| 248 | /* Do VBUS pulse after data pulse */ | ||
| 249 | fsl_otg_pulse_vbus(); | ||
| 250 | } | ||
| 251 | |||
| 252 | void fsl_otg_pulse_vbus(void) | ||
| 253 | { | ||
| 254 | srp_wait_done = 0; | ||
| 255 | fsl_otg_chrg_vbus(1); | ||
| 256 | /* start the timer to end vbus charge */ | ||
| 257 | fsl_otg_add_timer(b_vbus_pulse_tmr); | ||
| 258 | } | ||
| 259 | |||
| 260 | void b_vbus_pulse_end(unsigned long foo) | ||
| 261 | { | ||
| 262 | fsl_otg_chrg_vbus(0); | ||
| 263 | |||
| 264 | /* | ||
| 265 | * As USB3300 using the same a_sess_vld and b_sess_vld voltage | ||
| 266 | * we need to discharge the bus for a while to distinguish | ||
| 267 | * residual voltage of vbus pulsing and A device pull up | ||
| 268 | */ | ||
| 269 | fsl_otg_dischrg_vbus(1); | ||
| 270 | fsl_otg_add_timer(b_srp_wait_tmr); | ||
| 271 | } | ||
| 272 | |||
| 273 | void b_srp_end(unsigned long foo) | ||
| 274 | { | ||
| 275 | fsl_otg_dischrg_vbus(0); | ||
| 276 | srp_wait_done = 1; | ||
| 277 | |||
| 278 | if ((fsl_otg_dev->otg.state == OTG_STATE_B_SRP_INIT) && | ||
| 279 | fsl_otg_dev->fsm.b_sess_vld) | ||
| 280 | fsl_otg_dev->fsm.b_srp_done = 1; | ||
| 281 | } | ||
| 282 | |||
| 283 | /* | ||
| 284 | * Workaround for a_host suspending too fast. When a_bus_req=0, | ||
| 285 | * a_host will start by SRP. It needs to set b_hnp_enable before | ||
| 286 | * actually suspending to start HNP | ||
| 287 | */ | ||
| 288 | void a_wait_enum(unsigned long foo) | ||
| 289 | { | ||
| 290 | VDBG("a_wait_enum timeout\n"); | ||
| 291 | if (!fsl_otg_dev->otg.host->b_hnp_enable) | ||
| 292 | fsl_otg_add_timer(a_wait_enum_tmr); | ||
| 293 | else | ||
| 294 | otg_statemachine(&fsl_otg_dev->fsm); | ||
| 295 | } | ||
| 296 | |||
| 297 | /* The timeout callback function to set time out bit */ | ||
| 298 | void set_tmout(unsigned long indicator) | ||
| 299 | { | ||
| 300 | *(int *)indicator = 1; | ||
| 301 | } | ||
| 302 | |||
| 303 | /* Initialize timers */ | ||
| 304 | int fsl_otg_init_timers(struct otg_fsm *fsm) | ||
| 305 | { | ||
| 306 | /* FSM used timers */ | ||
| 307 | a_wait_vrise_tmr = otg_timer_initializer(&set_tmout, TA_WAIT_VRISE, | ||
| 308 | (unsigned long)&fsm->a_wait_vrise_tmout); | ||
| 309 | if (!a_wait_vrise_tmr) | ||
| 310 | return -ENOMEM; | ||
| 311 | |||
| 312 | a_wait_bcon_tmr = otg_timer_initializer(&set_tmout, TA_WAIT_BCON, | ||
| 313 | (unsigned long)&fsm->a_wait_bcon_tmout); | ||
| 314 | if (!a_wait_bcon_tmr) | ||
| 315 | return -ENOMEM; | ||
| 316 | |||
| 317 | a_aidl_bdis_tmr = otg_timer_initializer(&set_tmout, TA_AIDL_BDIS, | ||
| 318 | (unsigned long)&fsm->a_aidl_bdis_tmout); | ||
| 319 | if (!a_aidl_bdis_tmr) | ||
| 320 | return -ENOMEM; | ||
| 321 | |||
| 322 | b_ase0_brst_tmr = otg_timer_initializer(&set_tmout, TB_ASE0_BRST, | ||
| 323 | (unsigned long)&fsm->b_ase0_brst_tmout); | ||
| 324 | if (!b_ase0_brst_tmr) | ||
| 325 | return -ENOMEM; | ||
| 326 | |||
| 327 | b_se0_srp_tmr = otg_timer_initializer(&set_tmout, TB_SE0_SRP, | ||
| 328 | (unsigned long)&fsm->b_se0_srp); | ||
| 329 | if (!b_se0_srp_tmr) | ||
| 330 | return -ENOMEM; | ||
| 331 | |||
| 332 | b_srp_fail_tmr = otg_timer_initializer(&set_tmout, TB_SRP_FAIL, | ||
| 333 | (unsigned long)&fsm->b_srp_done); | ||
| 334 | if (!b_srp_fail_tmr) | ||
| 335 | return -ENOMEM; | ||
| 336 | |||
| 337 | a_wait_enum_tmr = otg_timer_initializer(&a_wait_enum, 10, | ||
| 338 | (unsigned long)&fsm); | ||
| 339 | if (!a_wait_enum_tmr) | ||
| 340 | return -ENOMEM; | ||
| 341 | |||
| 342 | /* device driver used timers */ | ||
| 343 | b_srp_wait_tmr = otg_timer_initializer(&b_srp_end, TB_SRP_WAIT, 0); | ||
| 344 | if (!b_srp_wait_tmr) | ||
| 345 | return -ENOMEM; | ||
| 346 | |||
| 347 | b_data_pulse_tmr = otg_timer_initializer(&b_data_pulse_end, | ||
| 348 | TB_DATA_PLS, 0); | ||
| 349 | if (!b_data_pulse_tmr) | ||
| 350 | return -ENOMEM; | ||
| 351 | |||
| 352 | b_vbus_pulse_tmr = otg_timer_initializer(&b_vbus_pulse_end, | ||
| 353 | TB_VBUS_PLS, 0); | ||
| 354 | if (!b_vbus_pulse_tmr) | ||
| 355 | return -ENOMEM; | ||
| 356 | |||
| 357 | return 0; | ||
| 358 | } | ||
| 359 | |||
| 360 | /* Uninitialize timers */ | ||
| 361 | void fsl_otg_uninit_timers(void) | ||
| 362 | { | ||
| 363 | /* FSM used timers */ | ||
| 364 | if (a_wait_vrise_tmr != NULL) | ||
| 365 | kfree(a_wait_vrise_tmr); | ||
| 366 | if (a_wait_bcon_tmr != NULL) | ||
| 367 | kfree(a_wait_bcon_tmr); | ||
| 368 | if (a_aidl_bdis_tmr != NULL) | ||
| 369 | kfree(a_aidl_bdis_tmr); | ||
| 370 | if (b_ase0_brst_tmr != NULL) | ||
| 371 | kfree(b_ase0_brst_tmr); | ||
| 372 | if (b_se0_srp_tmr != NULL) | ||
| 373 | kfree(b_se0_srp_tmr); | ||
| 374 | if (b_srp_fail_tmr != NULL) | ||
| 375 | kfree(b_srp_fail_tmr); | ||
| 376 | if (a_wait_enum_tmr != NULL) | ||
| 377 | kfree(a_wait_enum_tmr); | ||
| 378 | |||
| 379 | /* device driver used timers */ | ||
| 380 | if (b_srp_wait_tmr != NULL) | ||
| 381 | kfree(b_srp_wait_tmr); | ||
| 382 | if (b_data_pulse_tmr != NULL) | ||
| 383 | kfree(b_data_pulse_tmr); | ||
| 384 | if (b_vbus_pulse_tmr != NULL) | ||
| 385 | kfree(b_vbus_pulse_tmr); | ||
| 386 | } | ||
| 387 | |||
| 388 | /* Add timer to timer list */ | ||
| 389 | void fsl_otg_add_timer(void *gtimer) | ||
| 390 | { | ||
| 391 | struct fsl_otg_timer *timer = gtimer; | ||
| 392 | struct fsl_otg_timer *tmp_timer; | ||
| 393 | |||
| 394 | /* | ||
| 395 | * Check if the timer is already in the active list, | ||
| 396 | * if so update timer count | ||
| 397 | */ | ||
| 398 | list_for_each_entry(tmp_timer, &active_timers, list) | ||
| 399 | if (tmp_timer == timer) { | ||
| 400 | timer->count = timer->expires; | ||
| 401 | return; | ||
| 402 | } | ||
| 403 | timer->count = timer->expires; | ||
| 404 | list_add_tail(&timer->list, &active_timers); | ||
| 405 | } | ||
| 406 | |||
| 407 | /* Remove timer from the timer list; clear timeout status */ | ||
| 408 | void fsl_otg_del_timer(void *gtimer) | ||
| 409 | { | ||
| 410 | struct fsl_otg_timer *timer = gtimer; | ||
| 411 | struct fsl_otg_timer *tmp_timer, *del_tmp; | ||
| 412 | |||
| 413 | list_for_each_entry_safe(tmp_timer, del_tmp, &active_timers, list) | ||
| 414 | if (tmp_timer == timer) | ||
| 415 | list_del(&timer->list); | ||
| 416 | } | ||
| 417 | |||
| 418 | /* | ||
| 419 | * Reduce timer count by 1, and find timeout conditions. | ||
| 420 | * Called by fsl_otg 1ms timer interrupt | ||
| 421 | */ | ||
| 422 | int fsl_otg_tick_timer(void) | ||
| 423 | { | ||
| 424 | struct fsl_otg_timer *tmp_timer, *del_tmp; | ||
| 425 | int expired = 0; | ||
| 426 | |||
| 427 | list_for_each_entry_safe(tmp_timer, del_tmp, &active_timers, list) { | ||
| 428 | tmp_timer->count--; | ||
| 429 | /* check if timer expires */ | ||
| 430 | if (!tmp_timer->count) { | ||
| 431 | list_del(&tmp_timer->list); | ||
| 432 | tmp_timer->function(tmp_timer->data); | ||
| 433 | expired = 1; | ||
| 434 | } | ||
| 435 | } | ||
| 436 | |||
| 437 | return expired; | ||
| 438 | } | ||
| 439 | |||
| 440 | /* Reset controller, not reset the bus */ | ||
| 441 | void otg_reset_controller(void) | ||
| 442 | { | ||
| 443 | u32 command; | ||
| 444 | |||
| 445 | command = fsl_readl(&usb_dr_regs->usbcmd); | ||
| 446 | command |= (1 << 1); | ||
| 447 | fsl_writel(command, &usb_dr_regs->usbcmd); | ||
| 448 | while (fsl_readl(&usb_dr_regs->usbcmd) & (1 << 1)) | ||
| 449 | ; | ||
| 450 | } | ||
| 451 | |||
| 452 | /* Call suspend/resume routines in host driver */ | ||
| 453 | int fsl_otg_start_host(struct otg_fsm *fsm, int on) | ||
| 454 | { | ||
| 455 | struct otg_transceiver *xceiv = fsm->transceiver; | ||
| 456 | struct device *dev; | ||
| 457 | struct fsl_otg *otg_dev = container_of(xceiv, struct fsl_otg, otg); | ||
| 458 | u32 retval = 0; | ||
| 459 | |||
| 460 | if (!xceiv->host) | ||
| 461 | return -ENODEV; | ||
| 462 | dev = xceiv->host->controller; | ||
| 463 | |||
| 464 | /* | ||
| 465 | * Update a_vbus_vld state as a_vbus_vld int is disabled | ||
| 466 | * in device mode | ||
| 467 | */ | ||
| 468 | fsm->a_vbus_vld = | ||
| 469 | !!(fsl_readl(&usb_dr_regs->otgsc) & OTGSC_STS_A_VBUS_VALID); | ||
| 470 | if (on) { | ||
| 471 | /* start fsl usb host controller */ | ||
| 472 | if (otg_dev->host_working) | ||
| 473 | goto end; | ||
| 474 | else { | ||
| 475 | otg_reset_controller(); | ||
| 476 | VDBG("host on......\n"); | ||
| 477 | if (dev->driver->pm && dev->driver->pm->resume) { | ||
| 478 | retval = dev->driver->pm->resume(dev); | ||
| 479 | if (fsm->id) { | ||
| 480 | /* default-b */ | ||
| 481 | fsl_otg_drv_vbus(1); | ||
| 482 | /* | ||
| 483 | * Workaround: b_host can't driver | ||
| 484 | * vbus, but PP in PORTSC needs to | ||
| 485 | * be 1 for host to work. | ||
| 486 | * So we set drv_vbus bit in | ||
| 487 | * transceiver to 0 thru ULPI. | ||
| 488 | */ | ||
| 489 | write_ulpi(0x0c, 0x20); | ||
| 490 | } | ||
| 491 | } | ||
| 492 | |||
| 493 | otg_dev->host_working = 1; | ||
| 494 | } | ||
| 495 | } else { | ||
| 496 | /* stop fsl usb host controller */ | ||
| 497 | if (!otg_dev->host_working) | ||
| 498 | goto end; | ||
| 499 | else { | ||
| 500 | VDBG("host off......\n"); | ||
| 501 | if (dev && dev->driver) { | ||
| 502 | if (dev->driver->pm && dev->driver->pm->suspend) | ||
| 503 | retval = dev->driver->pm->suspend(dev); | ||
| 504 | if (fsm->id) | ||
| 505 | /* default-b */ | ||
| 506 | fsl_otg_drv_vbus(0); | ||
| 507 | } | ||
| 508 | otg_dev->host_working = 0; | ||
| 509 | } | ||
| 510 | } | ||
| 511 | end: | ||
| 512 | return retval; | ||
| 513 | } | ||
| 514 | |||
| 515 | /* | ||
| 516 | * Call suspend and resume function in udc driver | ||
| 517 | * to stop and start udc driver. | ||
| 518 | */ | ||
| 519 | int fsl_otg_start_gadget(struct otg_fsm *fsm, int on) | ||
| 520 | { | ||
| 521 | struct otg_transceiver *xceiv = fsm->transceiver; | ||
| 522 | struct device *dev; | ||
| 523 | |||
| 524 | if (!xceiv->gadget || !xceiv->gadget->dev.parent) | ||
| 525 | return -ENODEV; | ||
| 526 | |||
| 527 | VDBG("gadget %s\n", on ? "on" : "off"); | ||
| 528 | dev = xceiv->gadget->dev.parent; | ||
| 529 | |||
| 530 | if (on) { | ||
| 531 | if (dev->driver->resume) | ||
| 532 | dev->driver->resume(dev); | ||
| 533 | } else { | ||
| 534 | if (dev->driver->suspend) | ||
| 535 | dev->driver->suspend(dev, otg_suspend_state); | ||
| 536 | } | ||
| 537 | |||
| 538 | return 0; | ||
| 539 | } | ||
| 540 | |||
| 541 | /* | ||
| 542 | * Called by initialization code of host driver. Register host controller | ||
| 543 | * to the OTG. Suspend host for OTG role detection. | ||
| 544 | */ | ||
| 545 | static int fsl_otg_set_host(struct otg_transceiver *otg_p, struct usb_bus *host) | ||
| 546 | { | ||
| 547 | struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); | ||
| 548 | |||
| 549 | if (!otg_p || otg_dev != fsl_otg_dev) | ||
| 550 | return -ENODEV; | ||
| 551 | |||
| 552 | otg_p->host = host; | ||
| 553 | |||
| 554 | otg_dev->fsm.a_bus_drop = 0; | ||
| 555 | otg_dev->fsm.a_bus_req = 1; | ||
| 556 | |||
| 557 | if (host) { | ||
| 558 | VDBG("host off......\n"); | ||
| 559 | |||
| 560 | otg_p->host->otg_port = fsl_otg_initdata.otg_port; | ||
| 561 | otg_p->host->is_b_host = otg_dev->fsm.id; | ||
| 562 | /* | ||
| 563 | * must leave time for khubd to finish its thing | ||
| 564 | * before yanking the host driver out from under it, | ||
| 565 | * so suspend the host after a short delay. | ||
| 566 | */ | ||
| 567 | otg_dev->host_working = 1; | ||
| 568 | schedule_delayed_work(&otg_dev->otg_event, 100); | ||
| 569 | return 0; | ||
| 570 | } else { | ||
| 571 | /* host driver going away */ | ||
| 572 | if (!(fsl_readl(&otg_dev->dr_mem_map->otgsc) & | ||
| 573 | OTGSC_STS_USB_ID)) { | ||
| 574 | /* Mini-A cable connected */ | ||
| 575 | struct otg_fsm *fsm = &otg_dev->fsm; | ||
| 576 | |||
| 577 | otg_p->state = OTG_STATE_UNDEFINED; | ||
| 578 | fsm->protocol = PROTO_UNDEF; | ||
| 579 | } | ||
| 580 | } | ||
| 581 | |||
| 582 | otg_dev->host_working = 0; | ||
| 583 | |||
| 584 | otg_statemachine(&otg_dev->fsm); | ||
| 585 | |||
| 586 | return 0; | ||
| 587 | } | ||
| 588 | |||
| 589 | /* Called by initialization code of udc. Register udc to OTG. */ | ||
| 590 | static int fsl_otg_set_peripheral(struct otg_transceiver *otg_p, | ||
| 591 | struct usb_gadget *gadget) | ||
| 592 | { | ||
| 593 | struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); | ||
| 594 | |||
| 595 | VDBG("otg_dev 0x%x\n", (int)otg_dev); | ||
| 596 | VDBG("fsl_otg_dev 0x%x\n", (int)fsl_otg_dev); | ||
| 597 | |||
| 598 | if (!otg_p || otg_dev != fsl_otg_dev) | ||
| 599 | return -ENODEV; | ||
| 600 | |||
| 601 | if (!gadget) { | ||
| 602 | if (!otg_dev->otg.default_a) | ||
| 603 | otg_p->gadget->ops->vbus_draw(otg_p->gadget, 0); | ||
| 604 | usb_gadget_vbus_disconnect(otg_dev->otg.gadget); | ||
| 605 | otg_dev->otg.gadget = 0; | ||
| 606 | otg_dev->fsm.b_bus_req = 0; | ||
| 607 | otg_statemachine(&otg_dev->fsm); | ||
| 608 | return 0; | ||
| 609 | } | ||
| 610 | |||
| 611 | otg_p->gadget = gadget; | ||
| 612 | otg_p->gadget->is_a_peripheral = !otg_dev->fsm.id; | ||
| 613 | |||
| 614 | otg_dev->fsm.b_bus_req = 1; | ||
| 615 | |||
| 616 | /* start the gadget right away if the ID pin says Mini-B */ | ||
| 617 | DBG("ID pin=%d\n", otg_dev->fsm.id); | ||
| 618 | if (otg_dev->fsm.id == 1) { | ||
| 619 | fsl_otg_start_host(&otg_dev->fsm, 0); | ||
| 620 | otg_drv_vbus(&otg_dev->fsm, 0); | ||
| 621 | fsl_otg_start_gadget(&otg_dev->fsm, 1); | ||
| 622 | } | ||
| 623 | |||
| 624 | return 0; | ||
| 625 | } | ||
| 626 | |||
| 627 | /* Set OTG port power, only for B-device */ | ||
| 628 | static int fsl_otg_set_power(struct otg_transceiver *otg_p, unsigned mA) | ||
| 629 | { | ||
| 630 | if (!fsl_otg_dev) | ||
| 631 | return -ENODEV; | ||
| 632 | if (otg_p->state == OTG_STATE_B_PERIPHERAL) | ||
| 633 | pr_info("FSL OTG: Draw %d mA\n", mA); | ||
| 634 | |||
| 635 | return 0; | ||
| 636 | } | ||
| 637 | |||
| 638 | /* | ||
| 639 | * Delayed pin detect interrupt processing. | ||
| 640 | * | ||
| 641 | * When the Mini-A cable is disconnected from the board, | ||
| 642 | * the pin-detect interrupt happens before the disconnnect | ||
| 643 | * interrupts for the connected device(s). In order to | ||
| 644 | * process the disconnect interrupt(s) prior to switching | ||
| 645 | * roles, the pin-detect interrupts are delayed, and handled | ||
| 646 | * by this routine. | ||
| 647 | */ | ||
| 648 | static void fsl_otg_event(struct work_struct *work) | ||
| 649 | { | ||
| 650 | struct fsl_otg *og = container_of(work, struct fsl_otg, otg_event.work); | ||
| 651 | struct otg_fsm *fsm = &og->fsm; | ||
| 652 | |||
| 653 | if (fsm->id) { /* switch to gadget */ | ||
| 654 | fsl_otg_start_host(fsm, 0); | ||
| 655 | otg_drv_vbus(fsm, 0); | ||
| 656 | fsl_otg_start_gadget(fsm, 1); | ||
| 657 | } | ||
| 658 | } | ||
| 659 | |||
| 660 | /* B-device start SRP */ | ||
| 661 | static int fsl_otg_start_srp(struct otg_transceiver *otg_p) | ||
| 662 | { | ||
| 663 | struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); | ||
| 664 | |||
| 665 | if (!otg_p || otg_dev != fsl_otg_dev | ||
| 666 | || otg_p->state != OTG_STATE_B_IDLE) | ||
| 667 | return -ENODEV; | ||
| 668 | |||
| 669 | otg_dev->fsm.b_bus_req = 1; | ||
| 670 | otg_statemachine(&otg_dev->fsm); | ||
| 671 | |||
| 672 | return 0; | ||
| 673 | } | ||
| 674 | |||
| 675 | /* A_host suspend will call this function to start hnp */ | ||
| 676 | static int fsl_otg_start_hnp(struct otg_transceiver *otg_p) | ||
| 677 | { | ||
| 678 | struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); | ||
| 679 | |||
| 680 | if (!otg_p || otg_dev != fsl_otg_dev) | ||
| 681 | return -ENODEV; | ||
| 682 | |||
| 683 | DBG("start_hnp...n"); | ||
| 684 | |||
| 685 | /* clear a_bus_req to enter a_suspend state */ | ||
| 686 | otg_dev->fsm.a_bus_req = 0; | ||
| 687 | otg_statemachine(&otg_dev->fsm); | ||
| 688 | |||
| 689 | return 0; | ||
| 690 | } | ||
| 691 | |||
| 692 | /* | ||
| 693 | * Interrupt handler. OTG/host/peripheral share the same int line. | ||
| 694 | * OTG driver clears OTGSC interrupts and leaves USB interrupts | ||
| 695 | * intact. It needs to have knowledge of some USB interrupts | ||
| 696 | * such as port change. | ||
| 697 | */ | ||
| 698 | irqreturn_t fsl_otg_isr(int irq, void *dev_id) | ||
| 699 | { | ||
| 700 | struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm; | ||
| 701 | struct otg_transceiver *otg = &((struct fsl_otg *)dev_id)->otg; | ||
| 702 | u32 otg_int_src, otg_sc; | ||
| 703 | |||
| 704 | otg_sc = fsl_readl(&usb_dr_regs->otgsc); | ||
| 705 | otg_int_src = otg_sc & OTGSC_INTSTS_MASK & (otg_sc >> 8); | ||
| 706 | |||
| 707 | /* Only clear otg interrupts */ | ||
| 708 | fsl_writel(otg_sc, &usb_dr_regs->otgsc); | ||
| 709 | |||
| 710 | /*FIXME: ID change not generate when init to 0 */ | ||
| 711 | fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; | ||
| 712 | otg->default_a = (fsm->id == 0); | ||
| 713 | |||
| 714 | /* process OTG interrupts */ | ||
| 715 | if (otg_int_src) { | ||
| 716 | if (otg_int_src & OTGSC_INTSTS_USB_ID) { | ||
| 717 | fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; | ||
| 718 | otg->default_a = (fsm->id == 0); | ||
| 719 | /* clear conn information */ | ||
| 720 | if (fsm->id) | ||
| 721 | fsm->b_conn = 0; | ||
| 722 | else | ||
| 723 | fsm->a_conn = 0; | ||
| 724 | |||
| 725 | if (otg->host) | ||
| 726 | otg->host->is_b_host = fsm->id; | ||
| 727 | if (otg->gadget) | ||
| 728 | otg->gadget->is_a_peripheral = !fsm->id; | ||
| 729 | VDBG("ID int (ID is %d)\n", fsm->id); | ||
| 730 | |||
| 731 | if (fsm->id) { /* switch to gadget */ | ||
| 732 | schedule_delayed_work( | ||
| 733 | &((struct fsl_otg *)dev_id)->otg_event, | ||
| 734 | 100); | ||
| 735 | } else { /* switch to host */ | ||
| 736 | cancel_delayed_work(& | ||
| 737 | ((struct fsl_otg *)dev_id)-> | ||
| 738 | otg_event); | ||
| 739 | fsl_otg_start_gadget(fsm, 0); | ||
| 740 | otg_drv_vbus(fsm, 1); | ||
| 741 | fsl_otg_start_host(fsm, 1); | ||
| 742 | } | ||
| 743 | return IRQ_HANDLED; | ||
| 744 | } | ||
| 745 | } | ||
| 746 | return IRQ_NONE; | ||
| 747 | } | ||
| 748 | |||
| 749 | static struct otg_fsm_ops fsl_otg_ops = { | ||
| 750 | .chrg_vbus = fsl_otg_chrg_vbus, | ||
| 751 | .drv_vbus = fsl_otg_drv_vbus, | ||
| 752 | .loc_conn = fsl_otg_loc_conn, | ||
| 753 | .loc_sof = fsl_otg_loc_sof, | ||
| 754 | .start_pulse = fsl_otg_start_pulse, | ||
| 755 | |||
| 756 | .add_timer = fsl_otg_add_timer, | ||
| 757 | .del_timer = fsl_otg_del_timer, | ||
| 758 | |||
| 759 | .start_host = fsl_otg_start_host, | ||
| 760 | .start_gadget = fsl_otg_start_gadget, | ||
| 761 | }; | ||
| 762 | |||
| 763 | /* Initialize the global variable fsl_otg_dev and request IRQ for OTG */ | ||
| 764 | static int fsl_otg_conf(struct platform_device *pdev) | ||
| 765 | { | ||
| 766 | struct fsl_otg *fsl_otg_tc; | ||
| 767 | int status; | ||
| 768 | |||
| 769 | if (fsl_otg_dev) | ||
| 770 | return 0; | ||
| 771 | |||
| 772 | /* allocate space to fsl otg device */ | ||
| 773 | fsl_otg_tc = kzalloc(sizeof(struct fsl_otg), GFP_KERNEL); | ||
| 774 | if (!fsl_otg_tc) | ||
| 775 | return -ENOMEM; | ||
| 776 | |||
| 777 | INIT_DELAYED_WORK(&fsl_otg_tc->otg_event, fsl_otg_event); | ||
| 778 | |||
| 779 | INIT_LIST_HEAD(&active_timers); | ||
| 780 | status = fsl_otg_init_timers(&fsl_otg_tc->fsm); | ||
| 781 | if (status) { | ||
| 782 | pr_info("Couldn't init OTG timers\n"); | ||
| 783 | goto err; | ||
| 784 | } | ||
| 785 | spin_lock_init(&fsl_otg_tc->fsm.lock); | ||
| 786 | |||
| 787 | /* Set OTG state machine operations */ | ||
| 788 | fsl_otg_tc->fsm.ops = &fsl_otg_ops; | ||
| 789 | |||
| 790 | /* initialize the otg structure */ | ||
| 791 | fsl_otg_tc->otg.label = DRIVER_DESC; | ||
| 792 | fsl_otg_tc->otg.set_host = fsl_otg_set_host; | ||
| 793 | fsl_otg_tc->otg.set_peripheral = fsl_otg_set_peripheral; | ||
| 794 | fsl_otg_tc->otg.set_power = fsl_otg_set_power; | ||
| 795 | fsl_otg_tc->otg.start_hnp = fsl_otg_start_hnp; | ||
| 796 | fsl_otg_tc->otg.start_srp = fsl_otg_start_srp; | ||
| 797 | |||
| 798 | fsl_otg_dev = fsl_otg_tc; | ||
| 799 | |||
| 800 | /* Store the otg transceiver */ | ||
| 801 | status = otg_set_transceiver(&fsl_otg_tc->otg); | ||
| 802 | if (status) { | ||
| 803 | pr_warn(FSL_OTG_NAME ": unable to register OTG transceiver.\n"); | ||
| 804 | goto err; | ||
| 805 | } | ||
| 806 | |||
| 807 | return 0; | ||
| 808 | err: | ||
| 809 | fsl_otg_uninit_timers(); | ||
| 810 | kfree(fsl_otg_tc); | ||
| 811 | return status; | ||
| 812 | } | ||
| 813 | |||
| 814 | /* OTG Initialization */ | ||
| 815 | int usb_otg_start(struct platform_device *pdev) | ||
| 816 | { | ||
| 817 | struct fsl_otg *p_otg; | ||
| 818 | struct otg_transceiver *otg_trans = otg_get_transceiver(); | ||
| 819 | struct otg_fsm *fsm; | ||
| 820 | int status; | ||
| 821 | struct resource *res; | ||
| 822 | u32 temp; | ||
| 823 | struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; | ||
| 824 | |||
| 825 | p_otg = container_of(otg_trans, struct fsl_otg, otg); | ||
| 826 | fsm = &p_otg->fsm; | ||
| 827 | |||
| 828 | /* Initialize the state machine structure with default values */ | ||
| 829 | SET_OTG_STATE(otg_trans, OTG_STATE_UNDEFINED); | ||
| 830 | fsm->transceiver = &p_otg->otg; | ||
| 831 | |||
| 832 | /* We don't require predefined MEM/IRQ resource index */ | ||
| 833 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 834 | if (!res) | ||
| 835 | return -ENXIO; | ||
| 836 | |||
| 837 | /* We don't request_mem_region here to enable resource sharing | ||
| 838 | * with host/device */ | ||
| 839 | |||
| 840 | usb_dr_regs = ioremap(res->start, sizeof(struct usb_dr_mmap)); | ||
| 841 | p_otg->dr_mem_map = (struct usb_dr_mmap *)usb_dr_regs; | ||
| 842 | pdata->regs = (void *)usb_dr_regs; | ||
| 843 | |||
| 844 | if (pdata->init && pdata->init(pdev) != 0) | ||
| 845 | return -EINVAL; | ||
| 846 | |||
| 847 | if (pdata->big_endian_mmio) { | ||
| 848 | _fsl_readl = _fsl_readl_be; | ||
| 849 | _fsl_writel = _fsl_writel_be; | ||
| 850 | } else { | ||
| 851 | _fsl_readl = _fsl_readl_le; | ||
| 852 | _fsl_writel = _fsl_writel_le; | ||
| 853 | } | ||
| 854 | |||
| 855 | /* request irq */ | ||
| 856 | p_otg->irq = platform_get_irq(pdev, 0); | ||
| 857 | status = request_irq(p_otg->irq, fsl_otg_isr, | ||
| 858 | IRQF_SHARED, driver_name, p_otg); | ||
| 859 | if (status) { | ||
| 860 | dev_dbg(p_otg->otg.dev, "can't get IRQ %d, error %d\n", | ||
| 861 | p_otg->irq, status); | ||
| 862 | iounmap(p_otg->dr_mem_map); | ||
| 863 | kfree(p_otg); | ||
| 864 | return status; | ||
| 865 | } | ||
| 866 | |||
| 867 | /* stop the controller */ | ||
| 868 | temp = fsl_readl(&p_otg->dr_mem_map->usbcmd); | ||
| 869 | temp &= ~USB_CMD_RUN_STOP; | ||
| 870 | fsl_writel(temp, &p_otg->dr_mem_map->usbcmd); | ||
| 871 | |||
| 872 | /* reset the controller */ | ||
| 873 | temp = fsl_readl(&p_otg->dr_mem_map->usbcmd); | ||
| 874 | temp |= USB_CMD_CTRL_RESET; | ||
| 875 | fsl_writel(temp, &p_otg->dr_mem_map->usbcmd); | ||
| 876 | |||
| 877 | /* wait reset completed */ | ||
| 878 | while (fsl_readl(&p_otg->dr_mem_map->usbcmd) & USB_CMD_CTRL_RESET) | ||
| 879 | ; | ||
| 880 | |||
| 881 | /* configure the VBUSHS as IDLE(both host and device) */ | ||
| 882 | temp = USB_MODE_STREAM_DISABLE | (pdata->es ? USB_MODE_ES : 0); | ||
| 883 | fsl_writel(temp, &p_otg->dr_mem_map->usbmode); | ||
| 884 | |||
| 885 | /* configure PHY interface */ | ||
| 886 | temp = fsl_readl(&p_otg->dr_mem_map->portsc); | ||
| 887 | temp &= ~(PORTSC_PHY_TYPE_SEL | PORTSC_PTW); | ||
| 888 | switch (pdata->phy_mode) { | ||
| 889 | case FSL_USB2_PHY_ULPI: | ||
| 890 | temp |= PORTSC_PTS_ULPI; | ||
| 891 | break; | ||
| 892 | case FSL_USB2_PHY_UTMI_WIDE: | ||
| 893 | temp |= PORTSC_PTW_16BIT; | ||
| 894 | /* fall through */ | ||
| 895 | case FSL_USB2_PHY_UTMI: | ||
| 896 | temp |= PORTSC_PTS_UTMI; | ||
| 897 | /* fall through */ | ||
| 898 | default: | ||
| 899 | break; | ||
| 900 | } | ||
| 901 | fsl_writel(temp, &p_otg->dr_mem_map->portsc); | ||
| 902 | |||
| 903 | if (pdata->have_sysif_regs) { | ||
| 904 | /* configure control enable IO output, big endian register */ | ||
| 905 | temp = __raw_readl(&p_otg->dr_mem_map->control); | ||
| 906 | temp |= USB_CTRL_IOENB; | ||
| 907 | __raw_writel(temp, &p_otg->dr_mem_map->control); | ||
| 908 | } | ||
| 909 | |||
| 910 | /* disable all interrupt and clear all OTGSC status */ | ||
| 911 | temp = fsl_readl(&p_otg->dr_mem_map->otgsc); | ||
| 912 | temp &= ~OTGSC_INTERRUPT_ENABLE_BITS_MASK; | ||
| 913 | temp |= OTGSC_INTERRUPT_STATUS_BITS_MASK | OTGSC_CTRL_VBUS_DISCHARGE; | ||
| 914 | fsl_writel(temp, &p_otg->dr_mem_map->otgsc); | ||
| 915 | |||
| 916 | /* | ||
| 917 | * The identification (id) input is FALSE when a Mini-A plug is inserted | ||
| 918 | * in the devices Mini-AB receptacle. Otherwise, this input is TRUE. | ||
| 919 | * Also: record initial state of ID pin | ||
| 920 | */ | ||
| 921 | if (fsl_readl(&p_otg->dr_mem_map->otgsc) & OTGSC_STS_USB_ID) { | ||
| 922 | p_otg->otg.state = OTG_STATE_UNDEFINED; | ||
| 923 | p_otg->fsm.id = 1; | ||
| 924 | } else { | ||
| 925 | p_otg->otg.state = OTG_STATE_A_IDLE; | ||
| 926 | p_otg->fsm.id = 0; | ||
| 927 | } | ||
| 928 | |||
| 929 | DBG("initial ID pin=%d\n", p_otg->fsm.id); | ||
| 930 | |||
| 931 | /* enable OTG ID pin interrupt */ | ||
| 932 | temp = fsl_readl(&p_otg->dr_mem_map->otgsc); | ||
| 933 | temp |= OTGSC_INTR_USB_ID_EN; | ||
| 934 | temp &= ~(OTGSC_CTRL_VBUS_DISCHARGE | OTGSC_INTR_1MS_TIMER_EN); | ||
| 935 | fsl_writel(temp, &p_otg->dr_mem_map->otgsc); | ||
| 936 | |||
| 937 | return 0; | ||
| 938 | } | ||
| 939 | |||
| 940 | /* | ||
| 941 | * state file in sysfs | ||
| 942 | */ | ||
| 943 | static int show_fsl_usb2_otg_state(struct device *dev, | ||
| 944 | struct device_attribute *attr, char *buf) | ||
| 945 | { | ||
| 946 | struct otg_fsm *fsm = &fsl_otg_dev->fsm; | ||
| 947 | char *next = buf; | ||
| 948 | unsigned size = PAGE_SIZE; | ||
| 949 | unsigned long flags; | ||
| 950 | int t; | ||
| 951 | |||
| 952 | spin_lock_irqsave(&fsm->lock, flags); | ||
| 953 | |||
| 954 | /* basic driver infomation */ | ||
| 955 | t = scnprintf(next, size, | ||
| 956 | DRIVER_DESC "\n" "fsl_usb2_otg version: %s\n\n", | ||
| 957 | DRIVER_VERSION); | ||
| 958 | size -= t; | ||
| 959 | next += t; | ||
| 960 | |||
| 961 | /* Registers */ | ||
| 962 | t = scnprintf(next, size, | ||
| 963 | "OTGSC: 0x%08x\n" | ||
| 964 | "PORTSC: 0x%08x\n" | ||
| 965 | "USBMODE: 0x%08x\n" | ||
| 966 | "USBCMD: 0x%08x\n" | ||
| 967 | "USBSTS: 0x%08x\n" | ||
| 968 | "USBINTR: 0x%08x\n", | ||
| 969 | fsl_readl(&usb_dr_regs->otgsc), | ||
| 970 | fsl_readl(&usb_dr_regs->portsc), | ||
| 971 | fsl_readl(&usb_dr_regs->usbmode), | ||
| 972 | fsl_readl(&usb_dr_regs->usbcmd), | ||
| 973 | fsl_readl(&usb_dr_regs->usbsts), | ||
| 974 | fsl_readl(&usb_dr_regs->usbintr)); | ||
| 975 | size -= t; | ||
| 976 | next += t; | ||
| 977 | |||
| 978 | /* State */ | ||
| 979 | t = scnprintf(next, size, | ||
| 980 | "OTG state: %s\n\n", | ||
| 981 | otg_state_string(fsl_otg_dev->otg.state)); | ||
| 982 | size -= t; | ||
| 983 | next += t; | ||
| 984 | |||
| 985 | /* State Machine Variables */ | ||
| 986 | t = scnprintf(next, size, | ||
| 987 | "a_bus_req: %d\n" | ||
| 988 | "b_bus_req: %d\n" | ||
| 989 | "a_bus_resume: %d\n" | ||
| 990 | "a_bus_suspend: %d\n" | ||
| 991 | "a_conn: %d\n" | ||
| 992 | "a_sess_vld: %d\n" | ||
| 993 | "a_srp_det: %d\n" | ||
| 994 | "a_vbus_vld: %d\n" | ||
| 995 | "b_bus_resume: %d\n" | ||
| 996 | "b_bus_suspend: %d\n" | ||
| 997 | "b_conn: %d\n" | ||
| 998 | "b_se0_srp: %d\n" | ||
| 999 | "b_sess_end: %d\n" | ||
| 1000 | "b_sess_vld: %d\n" | ||
| 1001 | "id: %d\n", | ||
| 1002 | fsm->a_bus_req, | ||
| 1003 | fsm->b_bus_req, | ||
| 1004 | fsm->a_bus_resume, | ||
| 1005 | fsm->a_bus_suspend, | ||
| 1006 | fsm->a_conn, | ||
| 1007 | fsm->a_sess_vld, | ||
| 1008 | fsm->a_srp_det, | ||
| 1009 | fsm->a_vbus_vld, | ||
| 1010 | fsm->b_bus_resume, | ||
| 1011 | fsm->b_bus_suspend, | ||
| 1012 | fsm->b_conn, | ||
| 1013 | fsm->b_se0_srp, | ||
| 1014 | fsm->b_sess_end, | ||
| 1015 | fsm->b_sess_vld, | ||
| 1016 | fsm->id); | ||
| 1017 | size -= t; | ||
| 1018 | next += t; | ||
| 1019 | |||
| 1020 | spin_unlock_irqrestore(&fsm->lock, flags); | ||
| 1021 | |||
| 1022 | return PAGE_SIZE - size; | ||
| 1023 | } | ||
| 1024 | |||
| 1025 | static DEVICE_ATTR(fsl_usb2_otg_state, S_IRUGO, show_fsl_usb2_otg_state, NULL); | ||
| 1026 | |||
| 1027 | |||
| 1028 | /* Char driver interface to control some OTG input */ | ||
| 1029 | |||
| 1030 | /* | ||
| 1031 | * Handle some ioctl command, such as get otg | ||
| 1032 | * status and set host suspend | ||
| 1033 | */ | ||
| 1034 | static long fsl_otg_ioctl(struct file *file, unsigned int cmd, | ||
| 1035 | unsigned long arg) | ||
| 1036 | { | ||
| 1037 | u32 retval = 0; | ||
| 1038 | |||
| 1039 | switch (cmd) { | ||
| 1040 | case GET_OTG_STATUS: | ||
| 1041 | retval = fsl_otg_dev->host_working; | ||
| 1042 | break; | ||
| 1043 | |||
| 1044 | case SET_A_SUSPEND_REQ: | ||
| 1045 | fsl_otg_dev->fsm.a_suspend_req = arg; | ||
| 1046 | break; | ||
| 1047 | |||
| 1048 | case SET_A_BUS_DROP: | ||
| 1049 | fsl_otg_dev->fsm.a_bus_drop = arg; | ||
| 1050 | break; | ||
| 1051 | |||
| 1052 | case SET_A_BUS_REQ: | ||
| 1053 | fsl_otg_dev->fsm.a_bus_req = arg; | ||
| 1054 | break; | ||
| 1055 | |||
| 1056 | case SET_B_BUS_REQ: | ||
| 1057 | fsl_otg_dev->fsm.b_bus_req = arg; | ||
| 1058 | break; | ||
| 1059 | |||
| 1060 | default: | ||
| 1061 | break; | ||
| 1062 | } | ||
| 1063 | |||
| 1064 | otg_statemachine(&fsl_otg_dev->fsm); | ||
| 1065 | |||
| 1066 | return retval; | ||
| 1067 | } | ||
| 1068 | |||
| 1069 | static int fsl_otg_open(struct inode *inode, struct file *file) | ||
| 1070 | { | ||
| 1071 | return 0; | ||
| 1072 | } | ||
| 1073 | |||
| 1074 | static int fsl_otg_release(struct inode *inode, struct file *file) | ||
| 1075 | { | ||
| 1076 | return 0; | ||
| 1077 | } | ||
| 1078 | |||
| 1079 | static const struct file_operations otg_fops = { | ||
| 1080 | .owner = THIS_MODULE, | ||
| 1081 | .llseek = NULL, | ||
| 1082 | .read = NULL, | ||
| 1083 | .write = NULL, | ||
| 1084 | .unlocked_ioctl = fsl_otg_ioctl, | ||
| 1085 | .open = fsl_otg_open, | ||
| 1086 | .release = fsl_otg_release, | ||
| 1087 | }; | ||
| 1088 | |||
| 1089 | static int __devinit fsl_otg_probe(struct platform_device *pdev) | ||
| 1090 | { | ||
| 1091 | int ret; | ||
| 1092 | |||
| 1093 | if (!pdev->dev.platform_data) | ||
| 1094 | return -ENODEV; | ||
| 1095 | |||
| 1096 | /* configure the OTG */ | ||
| 1097 | ret = fsl_otg_conf(pdev); | ||
| 1098 | if (ret) { | ||
| 1099 | dev_err(&pdev->dev, "Couldn't configure OTG module\n"); | ||
| 1100 | return ret; | ||
| 1101 | } | ||
| 1102 | |||
| 1103 | /* start OTG */ | ||
| 1104 | ret = usb_otg_start(pdev); | ||
| 1105 | if (ret) { | ||
| 1106 | dev_err(&pdev->dev, "Can't init FSL OTG device\n"); | ||
| 1107 | return ret; | ||
| 1108 | } | ||
| 1109 | |||
| 1110 | ret = register_chrdev(FSL_OTG_MAJOR, FSL_OTG_NAME, &otg_fops); | ||
| 1111 | if (ret) { | ||
| 1112 | dev_err(&pdev->dev, "unable to register FSL OTG device\n"); | ||
| 1113 | return ret; | ||
| 1114 | } | ||
| 1115 | |||
| 1116 | ret = device_create_file(&pdev->dev, &dev_attr_fsl_usb2_otg_state); | ||
| 1117 | if (ret) | ||
| 1118 | dev_warn(&pdev->dev, "Can't register sysfs attribute\n"); | ||
| 1119 | |||
| 1120 | return ret; | ||
| 1121 | } | ||
| 1122 | |||
| 1123 | static int __devexit fsl_otg_remove(struct platform_device *pdev) | ||
| 1124 | { | ||
| 1125 | struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; | ||
| 1126 | |||
| 1127 | otg_set_transceiver(NULL); | ||
| 1128 | free_irq(fsl_otg_dev->irq, fsl_otg_dev); | ||
| 1129 | |||
| 1130 | iounmap((void *)usb_dr_regs); | ||
| 1131 | |||
| 1132 | fsl_otg_uninit_timers(); | ||
| 1133 | kfree(fsl_otg_dev); | ||
| 1134 | |||
| 1135 | device_remove_file(&pdev->dev, &dev_attr_fsl_usb2_otg_state); | ||
| 1136 | |||
| 1137 | unregister_chrdev(FSL_OTG_MAJOR, FSL_OTG_NAME); | ||
| 1138 | |||
| 1139 | if (pdata->exit) | ||
| 1140 | pdata->exit(pdev); | ||
| 1141 | |||
| 1142 | return 0; | ||
| 1143 | } | ||
| 1144 | |||
| 1145 | struct platform_driver fsl_otg_driver = { | ||
| 1146 | .probe = fsl_otg_probe, | ||
| 1147 | .remove = __devexit_p(fsl_otg_remove), | ||
| 1148 | .driver = { | ||
| 1149 | .name = driver_name, | ||
| 1150 | .owner = THIS_MODULE, | ||
| 1151 | }, | ||
| 1152 | }; | ||
| 1153 | |||
| 1154 | static int __init fsl_usb_otg_init(void) | ||
| 1155 | { | ||
| 1156 | pr_info(DRIVER_INFO "\n"); | ||
| 1157 | return platform_driver_register(&fsl_otg_driver); | ||
| 1158 | } | ||
| 1159 | module_init(fsl_usb_otg_init); | ||
| 1160 | |||
| 1161 | static void __exit fsl_usb_otg_exit(void) | ||
| 1162 | { | ||
| 1163 | platform_driver_unregister(&fsl_otg_driver); | ||
| 1164 | } | ||
| 1165 | module_exit(fsl_usb_otg_exit); | ||
| 1166 | |||
| 1167 | MODULE_DESCRIPTION(DRIVER_INFO); | ||
| 1168 | MODULE_AUTHOR(DRIVER_AUTHOR); | ||
| 1169 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/otg/fsl_otg.h b/drivers/usb/otg/fsl_otg.h new file mode 100644 index 00000000000..3f8ef731aac --- /dev/null +++ b/drivers/usb/otg/fsl_otg.h | |||
| @@ -0,0 +1,406 @@ | |||
| 1 | /* Copyright (C) 2007,2008 Freescale Semiconductor, Inc. | ||
| 2 | * | ||
| 3 | * This program is free software; you can redistribute it and/or modify it | ||
| 4 | * under the terms of the GNU General Public License as published by the | ||
| 5 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 6 | * option) any later version. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope that it will be useful, but | ||
| 9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 11 | * General Public License for more details. | ||
| 12 | * | ||
| 13 | * You should have received a copy of the GNU General Public License along | ||
| 14 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 15 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 16 | */ | ||
| 17 | |||
| 18 | #include "otg_fsm.h" | ||
| 19 | #include <linux/usb/otg.h> | ||
| 20 | #include <linux/ioctl.h> | ||
| 21 | |||
| 22 | /* USB Command Register Bit Masks */ | ||
| 23 | #define USB_CMD_RUN_STOP (0x1<<0) | ||
| 24 | #define USB_CMD_CTRL_RESET (0x1<<1) | ||
| 25 | #define USB_CMD_PERIODIC_SCHEDULE_EN (0x1<<4) | ||
| 26 | #define USB_CMD_ASYNC_SCHEDULE_EN (0x1<<5) | ||
| 27 | #define USB_CMD_INT_AA_DOORBELL (0x1<<6) | ||
| 28 | #define USB_CMD_ASP (0x3<<8) | ||
| 29 | #define USB_CMD_ASYNC_SCH_PARK_EN (0x1<<11) | ||
| 30 | #define USB_CMD_SUTW (0x1<<13) | ||
| 31 | #define USB_CMD_ATDTW (0x1<<14) | ||
| 32 | #define USB_CMD_ITC (0xFF<<16) | ||
| 33 | |||
| 34 | /* bit 15,3,2 are frame list size */ | ||
| 35 | #define USB_CMD_FRAME_SIZE_1024 (0x0<<15 | 0x0<<2) | ||
| 36 | #define USB_CMD_FRAME_SIZE_512 (0x0<<15 | 0x1<<2) | ||
| 37 | #define USB_CMD_FRAME_SIZE_256 (0x0<<15 | 0x2<<2) | ||
| 38 | #define USB_CMD_FRAME_SIZE_128 (0x0<<15 | 0x3<<2) | ||
| 39 | #define USB_CMD_FRAME_SIZE_64 (0x1<<15 | 0x0<<2) | ||
| 40 | #define USB_CMD_FRAME_SIZE_32 (0x1<<15 | 0x1<<2) | ||
| 41 | #define USB_CMD_FRAME_SIZE_16 (0x1<<15 | 0x2<<2) | ||
| 42 | #define USB_CMD_FRAME_SIZE_8 (0x1<<15 | 0x3<<2) | ||
| 43 | |||
| 44 | /* bit 9-8 are async schedule park mode count */ | ||
| 45 | #define USB_CMD_ASP_00 (0x0<<8) | ||
| 46 | #define USB_CMD_ASP_01 (0x1<<8) | ||
| 47 | #define USB_CMD_ASP_10 (0x2<<8) | ||
| 48 | #define USB_CMD_ASP_11 (0x3<<8) | ||
| 49 | #define USB_CMD_ASP_BIT_POS (8) | ||
| 50 | |||
| 51 | /* bit 23-16 are interrupt threshold control */ | ||
| 52 | #define USB_CMD_ITC_NO_THRESHOLD (0x00<<16) | ||
| 53 | #define USB_CMD_ITC_1_MICRO_FRM (0x01<<16) | ||
| 54 | #define USB_CMD_ITC_2_MICRO_FRM (0x02<<16) | ||
| 55 | #define USB_CMD_ITC_4_MICRO_FRM (0x04<<16) | ||
| 56 | #define USB_CMD_ITC_8_MICRO_FRM (0x08<<16) | ||
| 57 | #define USB_CMD_ITC_16_MICRO_FRM (0x10<<16) | ||
| 58 | #define USB_CMD_ITC_32_MICRO_FRM (0x20<<16) | ||
| 59 | #define USB_CMD_ITC_64_MICRO_FRM (0x40<<16) | ||
| 60 | #define USB_CMD_ITC_BIT_POS (16) | ||
| 61 | |||
| 62 | /* USB Status Register Bit Masks */ | ||
| 63 | #define USB_STS_INT (0x1<<0) | ||
| 64 | #define USB_STS_ERR (0x1<<1) | ||
| 65 | #define USB_STS_PORT_CHANGE (0x1<<2) | ||
| 66 | #define USB_STS_FRM_LST_ROLL (0x1<<3) | ||
| 67 | #define USB_STS_SYS_ERR (0x1<<4) | ||
| 68 | #define USB_STS_IAA (0x1<<5) | ||
| 69 | #define USB_STS_RESET_RECEIVED (0x1<<6) | ||
| 70 | #define USB_STS_SOF (0x1<<7) | ||
| 71 | #define USB_STS_DCSUSPEND (0x1<<8) | ||
| 72 | #define USB_STS_HC_HALTED (0x1<<12) | ||
| 73 | #define USB_STS_RCL (0x1<<13) | ||
| 74 | #define USB_STS_PERIODIC_SCHEDULE (0x1<<14) | ||
| 75 | #define USB_STS_ASYNC_SCHEDULE (0x1<<15) | ||
| 76 | |||
| 77 | /* USB Interrupt Enable Register Bit Masks */ | ||
| 78 | #define USB_INTR_INT_EN (0x1<<0) | ||
| 79 | #define USB_INTR_ERR_INT_EN (0x1<<1) | ||
| 80 | #define USB_INTR_PC_DETECT_EN (0x1<<2) | ||
| 81 | #define USB_INTR_FRM_LST_ROLL_EN (0x1<<3) | ||
| 82 | #define USB_INTR_SYS_ERR_EN (0x1<<4) | ||
| 83 | #define USB_INTR_ASYN_ADV_EN (0x1<<5) | ||
| 84 | #define USB_INTR_RESET_EN (0x1<<6) | ||
| 85 | #define USB_INTR_SOF_EN (0x1<<7) | ||
| 86 | #define USB_INTR_DEVICE_SUSPEND (0x1<<8) | ||
| 87 | |||
| 88 | /* Device Address bit masks */ | ||
| 89 | #define USB_DEVICE_ADDRESS_MASK (0x7F<<25) | ||
| 90 | #define USB_DEVICE_ADDRESS_BIT_POS (25) | ||
| 91 | /* PORTSC Register Bit Masks,Only one PORT in OTG mode*/ | ||
| 92 | #define PORTSC_CURRENT_CONNECT_STATUS (0x1<<0) | ||
| 93 | #define PORTSC_CONNECT_STATUS_CHANGE (0x1<<1) | ||
| 94 | #define PORTSC_PORT_ENABLE (0x1<<2) | ||
| 95 | #define PORTSC_PORT_EN_DIS_CHANGE (0x1<<3) | ||
| 96 | #define PORTSC_OVER_CURRENT_ACT (0x1<<4) | ||
| 97 | #define PORTSC_OVER_CUURENT_CHG (0x1<<5) | ||
| 98 | #define PORTSC_PORT_FORCE_RESUME (0x1<<6) | ||
| 99 | #define PORTSC_PORT_SUSPEND (0x1<<7) | ||
| 100 | #define PORTSC_PORT_RESET (0x1<<8) | ||
| 101 | #define PORTSC_LINE_STATUS_BITS (0x3<<10) | ||
| 102 | #define PORTSC_PORT_POWER (0x1<<12) | ||
| 103 | #define PORTSC_PORT_INDICTOR_CTRL (0x3<<14) | ||
| 104 | #define PORTSC_PORT_TEST_CTRL (0xF<<16) | ||
| 105 | #define PORTSC_WAKE_ON_CONNECT_EN (0x1<<20) | ||
| 106 | #define PORTSC_WAKE_ON_CONNECT_DIS (0x1<<21) | ||
| 107 | #define PORTSC_WAKE_ON_OVER_CURRENT (0x1<<22) | ||
| 108 | #define PORTSC_PHY_LOW_POWER_SPD (0x1<<23) | ||
| 109 | #define PORTSC_PORT_FORCE_FULL_SPEED (0x1<<24) | ||
| 110 | #define PORTSC_PORT_SPEED_MASK (0x3<<26) | ||
| 111 | #define PORTSC_TRANSCEIVER_WIDTH (0x1<<28) | ||
| 112 | #define PORTSC_PHY_TYPE_SEL (0x3<<30) | ||
| 113 | /* bit 11-10 are line status */ | ||
| 114 | #define PORTSC_LINE_STATUS_SE0 (0x0<<10) | ||
| 115 | #define PORTSC_LINE_STATUS_JSTATE (0x1<<10) | ||
| 116 | #define PORTSC_LINE_STATUS_KSTATE (0x2<<10) | ||
| 117 | #define PORTSC_LINE_STATUS_UNDEF (0x3<<10) | ||
| 118 | #define PORTSC_LINE_STATUS_BIT_POS (10) | ||
| 119 | |||
| 120 | /* bit 15-14 are port indicator control */ | ||
| 121 | #define PORTSC_PIC_OFF (0x0<<14) | ||
| 122 | #define PORTSC_PIC_AMBER (0x1<<14) | ||
| 123 | #define PORTSC_PIC_GREEN (0x2<<14) | ||
| 124 | #define PORTSC_PIC_UNDEF (0x3<<14) | ||
| 125 | #define PORTSC_PIC_BIT_POS (14) | ||
| 126 | |||
| 127 | /* bit 19-16 are port test control */ | ||
| 128 | #define PORTSC_PTC_DISABLE (0x0<<16) | ||
| 129 | #define PORTSC_PTC_JSTATE (0x1<<16) | ||
| 130 | #define PORTSC_PTC_KSTATE (0x2<<16) | ||
| 131 | #define PORTSC_PTC_SEQNAK (0x3<<16) | ||
| 132 | #define PORTSC_PTC_PACKET (0x4<<16) | ||
| 133 | #define PORTSC_PTC_FORCE_EN (0x5<<16) | ||
| 134 | #define PORTSC_PTC_BIT_POS (16) | ||
| 135 | |||
| 136 | /* bit 27-26 are port speed */ | ||
| 137 | #define PORTSC_PORT_SPEED_FULL (0x0<<26) | ||
| 138 | #define PORTSC_PORT_SPEED_LOW (0x1<<26) | ||
| 139 | #define PORTSC_PORT_SPEED_HIGH (0x2<<26) | ||
| 140 | #define PORTSC_PORT_SPEED_UNDEF (0x3<<26) | ||
| 141 | #define PORTSC_SPEED_BIT_POS (26) | ||
| 142 | |||
| 143 | /* bit 28 is parallel transceiver width for UTMI interface */ | ||
| 144 | #define PORTSC_PTW (0x1<<28) | ||
| 145 | #define PORTSC_PTW_8BIT (0x0<<28) | ||
| 146 | #define PORTSC_PTW_16BIT (0x1<<28) | ||
| 147 | |||
| 148 | /* bit 31-30 are port transceiver select */ | ||
| 149 | #define PORTSC_PTS_UTMI (0x0<<30) | ||
| 150 | #define PORTSC_PTS_ULPI (0x2<<30) | ||
| 151 | #define PORTSC_PTS_FSLS_SERIAL (0x3<<30) | ||
| 152 | #define PORTSC_PTS_BIT_POS (30) | ||
| 153 | |||
| 154 | #define PORTSC_W1C_BITS \ | ||
| 155 | (PORTSC_CONNECT_STATUS_CHANGE | \ | ||
| 156 | PORTSC_PORT_EN_DIS_CHANGE | \ | ||
| 157 | PORTSC_OVER_CUURENT_CHG) | ||
| 158 | |||
| 159 | /* OTG Status Control Register Bit Masks */ | ||
| 160 | #define OTGSC_CTRL_VBUS_DISCHARGE (0x1<<0) | ||
| 161 | #define OTGSC_CTRL_VBUS_CHARGE (0x1<<1) | ||
| 162 | #define OTGSC_CTRL_OTG_TERMINATION (0x1<<3) | ||
| 163 | #define OTGSC_CTRL_DATA_PULSING (0x1<<4) | ||
| 164 | #define OTGSC_CTRL_ID_PULL_EN (0x1<<5) | ||
| 165 | #define OTGSC_HA_DATA_PULSE (0x1<<6) | ||
| 166 | #define OTGSC_HA_BA (0x1<<7) | ||
| 167 | #define OTGSC_STS_USB_ID (0x1<<8) | ||
| 168 | #define OTGSC_STS_A_VBUS_VALID (0x1<<9) | ||
| 169 | #define OTGSC_STS_A_SESSION_VALID (0x1<<10) | ||
| 170 | #define OTGSC_STS_B_SESSION_VALID (0x1<<11) | ||
| 171 | #define OTGSC_STS_B_SESSION_END (0x1<<12) | ||
| 172 | #define OTGSC_STS_1MS_TOGGLE (0x1<<13) | ||
| 173 | #define OTGSC_STS_DATA_PULSING (0x1<<14) | ||
| 174 | #define OTGSC_INTSTS_USB_ID (0x1<<16) | ||
| 175 | #define OTGSC_INTSTS_A_VBUS_VALID (0x1<<17) | ||
| 176 | #define OTGSC_INTSTS_A_SESSION_VALID (0x1<<18) | ||
| 177 | #define OTGSC_INTSTS_B_SESSION_VALID (0x1<<19) | ||
| 178 | #define OTGSC_INTSTS_B_SESSION_END (0x1<<20) | ||
| 179 | #define OTGSC_INTSTS_1MS (0x1<<21) | ||
| 180 | #define OTGSC_INTSTS_DATA_PULSING (0x1<<22) | ||
| 181 | #define OTGSC_INTR_USB_ID_EN (0x1<<24) | ||
| 182 | #define OTGSC_INTR_A_VBUS_VALID_EN (0x1<<25) | ||
| 183 | #define OTGSC_INTR_A_SESSION_VALID_EN (0x1<<26) | ||
| 184 | #define OTGSC_INTR_B_SESSION_VALID_EN (0x1<<27) | ||
| 185 | #define OTGSC_INTR_B_SESSION_END_EN (0x1<<28) | ||
| 186 | #define OTGSC_INTR_1MS_TIMER_EN (0x1<<29) | ||
| 187 | #define OTGSC_INTR_DATA_PULSING_EN (0x1<<30) | ||
| 188 | #define OTGSC_INTSTS_MASK (0x00ff0000) | ||
| 189 | |||
| 190 | /* USB MODE Register Bit Masks */ | ||
| 191 | #define USB_MODE_CTRL_MODE_IDLE (0x0<<0) | ||
| 192 | #define USB_MODE_CTRL_MODE_DEVICE (0x2<<0) | ||
| 193 | #define USB_MODE_CTRL_MODE_HOST (0x3<<0) | ||
| 194 | #define USB_MODE_CTRL_MODE_RSV (0x1<<0) | ||
| 195 | #define USB_MODE_SETUP_LOCK_OFF (0x1<<3) | ||
| 196 | #define USB_MODE_STREAM_DISABLE (0x1<<4) | ||
| 197 | #define USB_MODE_ES (0x1<<2) /* Endian Select */ | ||
| 198 | |||
| 199 | /* control Register Bit Masks */ | ||
| 200 | #define USB_CTRL_IOENB (0x1<<2) | ||
| 201 | #define USB_CTRL_ULPI_INT0EN (0x1<<0) | ||
| 202 | |||
| 203 | /* BCSR5 */ | ||
| 204 | #define BCSR5_INT_USB (0x02) | ||
| 205 | |||
| 206 | /* USB module clk cfg */ | ||
| 207 | #define SCCR_OFFS (0xA08) | ||
| 208 | #define SCCR_USB_CLK_DISABLE (0x00000000) /* USB clk disable */ | ||
| 209 | #define SCCR_USB_MPHCM_11 (0x00c00000) | ||
| 210 | #define SCCR_USB_MPHCM_01 (0x00400000) | ||
| 211 | #define SCCR_USB_MPHCM_10 (0x00800000) | ||
| 212 | #define SCCR_USB_DRCM_11 (0x00300000) | ||
| 213 | #define SCCR_USB_DRCM_01 (0x00100000) | ||
| 214 | #define SCCR_USB_DRCM_10 (0x00200000) | ||
| 215 | |||
| 216 | #define SICRL_OFFS (0x114) | ||
| 217 | #define SICRL_USB0 (0x40000000) | ||
| 218 | #define SICRL_USB1 (0x20000000) | ||
| 219 | |||
| 220 | #define SICRH_OFFS (0x118) | ||
| 221 | #define SICRH_USB_UTMI (0x00020000) | ||
| 222 | |||
| 223 | /* OTG interrupt enable bit masks */ | ||
| 224 | #define OTGSC_INTERRUPT_ENABLE_BITS_MASK \ | ||
| 225 | (OTGSC_INTR_USB_ID_EN | \ | ||
| 226 | OTGSC_INTR_1MS_TIMER_EN | \ | ||
| 227 | OTGSC_INTR_A_VBUS_VALID_EN | \ | ||
| 228 | OTGSC_INTR_A_SESSION_VALID_EN | \ | ||
| 229 | OTGSC_INTR_B_SESSION_VALID_EN | \ | ||
| 230 | OTGSC_INTR_B_SESSION_END_EN | \ | ||
| 231 | OTGSC_INTR_DATA_PULSING_EN) | ||
| 232 | |||
| 233 | /* OTG interrupt status bit masks */ | ||
| 234 | #define OTGSC_INTERRUPT_STATUS_BITS_MASK \ | ||
| 235 | (OTGSC_INTSTS_USB_ID | \ | ||
| 236 | OTGSC_INTR_1MS_TIMER_EN | \ | ||
| 237 | OTGSC_INTSTS_A_VBUS_VALID | \ | ||
| 238 | OTGSC_INTSTS_A_SESSION_VALID | \ | ||
| 239 | OTGSC_INTSTS_B_SESSION_VALID | \ | ||
| 240 | OTGSC_INTSTS_B_SESSION_END | \ | ||
| 241 | OTGSC_INTSTS_DATA_PULSING) | ||
| 242 | |||
| 243 | /* | ||
| 244 | * A-DEVICE timing constants | ||
| 245 | */ | ||
| 246 | |||
| 247 | /* Wait for VBUS Rise */ | ||
| 248 | #define TA_WAIT_VRISE (100) /* a_wait_vrise 100 ms, section: 6.6.5.1 */ | ||
| 249 | |||
| 250 | /* Wait for B-Connect */ | ||
| 251 | #define TA_WAIT_BCON (10000) /* a_wait_bcon > 1 sec, section: 6.6.5.2 | ||
| 252 | * This is only used to get out of | ||
| 253 | * OTG_STATE_A_WAIT_BCON state if there was | ||
| 254 | * no connection for these many milliseconds | ||
| 255 | */ | ||
| 256 | |||
| 257 | /* A-Idle to B-Disconnect */ | ||
| 258 | /* It is necessary for this timer to be more than 750 ms because of a bug in OPT | ||
| 259 | * test 5.4 in which B OPT disconnects after 750 ms instead of 75ms as stated | ||
| 260 | * in the test description | ||
| 261 | */ | ||
| 262 | #define TA_AIDL_BDIS (5000) /* a_suspend minimum 200 ms, section: 6.6.5.3 */ | ||
| 263 | |||
| 264 | /* B-Idle to A-Disconnect */ | ||
| 265 | #define TA_BIDL_ADIS (12) /* 3 to 200 ms */ | ||
| 266 | |||
| 267 | /* B-device timing constants */ | ||
| 268 | |||
| 269 | |||
| 270 | /* Data-Line Pulse Time*/ | ||
| 271 | #define TB_DATA_PLS (10) /* b_srp_init,continue 5~10ms, section:5.3.3 */ | ||
| 272 | #define TB_DATA_PLS_MIN (5) /* minimum 5 ms */ | ||
| 273 | #define TB_DATA_PLS_MAX (10) /* maximum 10 ms */ | ||
| 274 | |||
| 275 | /* SRP Initiate Time */ | ||
| 276 | #define TB_SRP_INIT (100) /* b_srp_init,maximum 100 ms, section:5.3.8 */ | ||
| 277 | |||
| 278 | /* SRP Fail Time */ | ||
| 279 | #define TB_SRP_FAIL (7000) /* b_srp_init,Fail time 5~30s, section:6.8.2.2*/ | ||
| 280 | |||
| 281 | /* SRP result wait time */ | ||
| 282 | #define TB_SRP_WAIT (60) | ||
| 283 | |||
| 284 | /* VBus time */ | ||
| 285 | #define TB_VBUS_PLS (30) /* time to keep vbus pulsing asserted */ | ||
| 286 | |||
| 287 | /* Discharge time */ | ||
| 288 | /* This time should be less than 10ms. It varies from system to system. */ | ||
| 289 | #define TB_VBUS_DSCHRG (8) | ||
| 290 | |||
| 291 | /* A-SE0 to B-Reset */ | ||
| 292 | #define TB_ASE0_BRST (20) /* b_wait_acon, mini 3.125 ms,section:6.8.2.4 */ | ||
| 293 | |||
| 294 | /* A bus suspend timer before we can switch to b_wait_aconn */ | ||
| 295 | #define TB_A_SUSPEND (7) | ||
| 296 | #define TB_BUS_RESUME (12) | ||
| 297 | |||
| 298 | /* SE0 Time Before SRP */ | ||
| 299 | #define TB_SE0_SRP (2) /* b_idle,minimum 2 ms, section:5.3.2 */ | ||
| 300 | |||
| 301 | #define SET_OTG_STATE(otg_ptr, newstate) ((otg_ptr)->state = newstate) | ||
| 302 | |||
| 303 | struct usb_dr_mmap { | ||
| 304 | /* Capability register */ | ||
| 305 | u8 res1[256]; | ||
| 306 | u16 caplength; /* Capability Register Length */ | ||
| 307 | u16 hciversion; /* Host Controller Interface Version */ | ||
| 308 | u32 hcsparams; /* Host Controller Structual Parameters */ | ||
| 309 | u32 hccparams; /* Host Controller Capability Parameters */ | ||
| 310 | u8 res2[20]; | ||
| 311 | u32 dciversion; /* Device Controller Interface Version */ | ||
| 312 | u32 dccparams; /* Device Controller Capability Parameters */ | ||
| 313 | u8 res3[24]; | ||
| 314 | /* Operation register */ | ||
| 315 | u32 usbcmd; /* USB Command Register */ | ||
| 316 | u32 usbsts; /* USB Status Register */ | ||
| 317 | u32 usbintr; /* USB Interrupt Enable Register */ | ||
| 318 | u32 frindex; /* Frame Index Register */ | ||
| 319 | u8 res4[4]; | ||
| 320 | u32 deviceaddr; /* Device Address */ | ||
| 321 | u32 endpointlistaddr; /* Endpoint List Address Register */ | ||
| 322 | u8 res5[4]; | ||
| 323 | u32 burstsize; /* Master Interface Data Burst Size Register */ | ||
| 324 | u32 txttfilltuning; /* Transmit FIFO Tuning Controls Register */ | ||
| 325 | u8 res6[8]; | ||
| 326 | u32 ulpiview; /* ULPI register access */ | ||
| 327 | u8 res7[12]; | ||
| 328 | u32 configflag; /* Configure Flag Register */ | ||
| 329 | u32 portsc; /* Port 1 Status and Control Register */ | ||
| 330 | u8 res8[28]; | ||
| 331 | u32 otgsc; /* On-The-Go Status and Control */ | ||
| 332 | u32 usbmode; /* USB Mode Register */ | ||
| 333 | u32 endptsetupstat; /* Endpoint Setup Status Register */ | ||
| 334 | u32 endpointprime; /* Endpoint Initialization Register */ | ||
| 335 | u32 endptflush; /* Endpoint Flush Register */ | ||
| 336 | u32 endptstatus; /* Endpoint Status Register */ | ||
| 337 | u32 endptcomplete; /* Endpoint Complete Register */ | ||
| 338 | u32 endptctrl[6]; /* Endpoint Control Registers */ | ||
| 339 | u8 res9[552]; | ||
| 340 | u32 snoop1; | ||
| 341 | u32 snoop2; | ||
| 342 | u32 age_cnt_thresh; /* Age Count Threshold Register */ | ||
| 343 | u32 pri_ctrl; /* Priority Control Register */ | ||
| 344 | u32 si_ctrl; /* System Interface Control Register */ | ||
| 345 | u8 res10[236]; | ||
| 346 | u32 control; /* General Purpose Control Register */ | ||
| 347 | }; | ||
| 348 | |||
| 349 | struct fsl_otg_timer { | ||
| 350 | unsigned long expires; /* Number of count increase to timeout */ | ||
| 351 | unsigned long count; /* Tick counter */ | ||
| 352 | void (*function)(unsigned long); /* Timeout function */ | ||
| 353 | unsigned long data; /* Data passed to function */ | ||
| 354 | struct list_head list; | ||
| 355 | }; | ||
| 356 | |||
| 357 | inline struct fsl_otg_timer *otg_timer_initializer | ||
| 358 | (void (*function)(unsigned long), unsigned long expires, unsigned long data) | ||
| 359 | { | ||
| 360 | struct fsl_otg_timer *timer; | ||
| 361 | |||
| 362 | timer = kmalloc(sizeof(struct fsl_otg_timer), GFP_KERNEL); | ||
| 363 | if (!timer) | ||
| 364 | return NULL; | ||
| 365 | timer->function = function; | ||
| 366 | timer->expires = expires; | ||
| 367 | timer->data = data; | ||
| 368 | return timer; | ||
| 369 | } | ||
| 370 | |||
| 371 | struct fsl_otg { | ||
| 372 | struct otg_transceiver otg; | ||
| 373 | struct otg_fsm fsm; | ||
| 374 | struct usb_dr_mmap *dr_mem_map; | ||
| 375 | struct delayed_work otg_event; | ||
| 376 | |||
| 377 | /* used for usb host */ | ||
| 378 | struct work_struct work_wq; | ||
| 379 | u8 host_working; | ||
| 380 | |||
| 381 | int irq; | ||
| 382 | }; | ||
| 383 | |||
| 384 | struct fsl_otg_config { | ||
| 385 | u8 otg_port; | ||
| 386 | }; | ||
| 387 | |||
| 388 | /* For SRP and HNP handle */ | ||
| 389 | #define FSL_OTG_MAJOR 240 | ||
| 390 | #define FSL_OTG_NAME "fsl-usb2-otg" | ||
| 391 | /* Command to OTG driver ioctl */ | ||
| 392 | #define OTG_IOCTL_MAGIC FSL_OTG_MAJOR | ||
| 393 | /* if otg work as host, it should return 1, otherwise return 0 */ | ||
| 394 | #define GET_OTG_STATUS _IOR(OTG_IOCTL_MAGIC, 1, int) | ||
| 395 | #define SET_A_SUSPEND_REQ _IOW(OTG_IOCTL_MAGIC, 2, int) | ||
| 396 | #define SET_A_BUS_DROP _IOW(OTG_IOCTL_MAGIC, 3, int) | ||
| 397 | #define SET_A_BUS_REQ _IOW(OTG_IOCTL_MAGIC, 4, int) | ||
| 398 | #define SET_B_BUS_REQ _IOW(OTG_IOCTL_MAGIC, 5, int) | ||
| 399 | #define GET_A_SUSPEND_REQ _IOR(OTG_IOCTL_MAGIC, 6, int) | ||
| 400 | #define GET_A_BUS_DROP _IOR(OTG_IOCTL_MAGIC, 7, int) | ||
| 401 | #define GET_A_BUS_REQ _IOR(OTG_IOCTL_MAGIC, 8, int) | ||
| 402 | #define GET_B_BUS_REQ _IOR(OTG_IOCTL_MAGIC, 9, int) | ||
| 403 | |||
| 404 | void fsl_otg_add_timer(void *timer); | ||
| 405 | void fsl_otg_del_timer(void *timer); | ||
| 406 | void fsl_otg_pulse_vbus(void); | ||
diff --git a/drivers/usb/otg/gpio_vbus.c b/drivers/usb/otg/gpio_vbus.c index 221c44444ec..52733d9959b 100644 --- a/drivers/usb/otg/gpio_vbus.c +++ b/drivers/usb/otg/gpio_vbus.c | |||
| @@ -279,6 +279,13 @@ static int __init gpio_vbus_probe(struct platform_device *pdev) | |||
| 279 | } | 279 | } |
| 280 | INIT_WORK(&gpio_vbus->work, gpio_vbus_work); | 280 | INIT_WORK(&gpio_vbus->work, gpio_vbus_work); |
| 281 | 281 | ||
| 282 | gpio_vbus->vbus_draw = regulator_get(&pdev->dev, "vbus_draw"); | ||
| 283 | if (IS_ERR(gpio_vbus->vbus_draw)) { | ||
| 284 | dev_dbg(&pdev->dev, "can't get vbus_draw regulator, err: %ld\n", | ||
| 285 | PTR_ERR(gpio_vbus->vbus_draw)); | ||
| 286 | gpio_vbus->vbus_draw = NULL; | ||
| 287 | } | ||
| 288 | |||
| 282 | /* only active when a gadget is registered */ | 289 | /* only active when a gadget is registered */ |
| 283 | err = otg_set_transceiver(&gpio_vbus->otg); | 290 | err = otg_set_transceiver(&gpio_vbus->otg); |
| 284 | if (err) { | 291 | if (err) { |
| @@ -287,13 +294,6 @@ static int __init gpio_vbus_probe(struct platform_device *pdev) | |||
| 287 | goto err_otg; | 294 | goto err_otg; |
| 288 | } | 295 | } |
| 289 | 296 | ||
| 290 | gpio_vbus->vbus_draw = regulator_get(&pdev->dev, "vbus_draw"); | ||
| 291 | if (IS_ERR(gpio_vbus->vbus_draw)) { | ||
| 292 | dev_dbg(&pdev->dev, "can't get vbus_draw regulator, err: %ld\n", | ||
| 293 | PTR_ERR(gpio_vbus->vbus_draw)); | ||
| 294 | gpio_vbus->vbus_draw = NULL; | ||
| 295 | } | ||
| 296 | |||
| 297 | return 0; | 297 | return 0; |
| 298 | err_otg: | 298 | err_otg: |
| 299 | free_irq(irq, &pdev->dev); | 299 | free_irq(irq, &pdev->dev); |
diff --git a/drivers/usb/otg/isp1301_omap.c b/drivers/usb/otg/isp1301_omap.c index e25700f44b6..8c282258e1b 100644 --- a/drivers/usb/otg/isp1301_omap.c +++ b/drivers/usb/otg/isp1301_omap.c | |||
| @@ -234,29 +234,9 @@ isp1301_clear_bits(struct isp1301 *isp, u8 reg, u8 bits) | |||
| 234 | 234 | ||
| 235 | /*-------------------------------------------------------------------------*/ | 235 | /*-------------------------------------------------------------------------*/ |
| 236 | 236 | ||
| 237 | static const char *state_string(enum usb_otg_state state) | ||
| 238 | { | ||
| 239 | switch (state) { | ||
| 240 | case OTG_STATE_A_IDLE: return "a_idle"; | ||
| 241 | case OTG_STATE_A_WAIT_VRISE: return "a_wait_vrise"; | ||
| 242 | case OTG_STATE_A_WAIT_BCON: return "a_wait_bcon"; | ||
| 243 | case OTG_STATE_A_HOST: return "a_host"; | ||
| 244 | case OTG_STATE_A_SUSPEND: return "a_suspend"; | ||
| 245 | case OTG_STATE_A_PERIPHERAL: return "a_peripheral"; | ||
| 246 | case OTG_STATE_A_WAIT_VFALL: return "a_wait_vfall"; | ||
| 247 | case OTG_STATE_A_VBUS_ERR: return "a_vbus_err"; | ||
| 248 | case OTG_STATE_B_IDLE: return "b_idle"; | ||
| 249 | case OTG_STATE_B_SRP_INIT: return "b_srp_init"; | ||
| 250 | case OTG_STATE_B_PERIPHERAL: return "b_peripheral"; | ||
| 251 | case OTG_STATE_B_WAIT_ACON: return "b_wait_acon"; | ||
| 252 | case OTG_STATE_B_HOST: return "b_host"; | ||
| 253 | default: return "UNDEFINED"; | ||
| 254 | } | ||
| 255 | } | ||
| 256 | |||
| 257 | static inline const char *state_name(struct isp1301 *isp) | 237 | static inline const char *state_name(struct isp1301 *isp) |
| 258 | { | 238 | { |
| 259 | return state_string(isp->otg.state); | 239 | return otg_state_string(isp->otg.state); |
| 260 | } | 240 | } |
| 261 | 241 | ||
| 262 | /*-------------------------------------------------------------------------*/ | 242 | /*-------------------------------------------------------------------------*/ |
| @@ -501,7 +481,7 @@ static void check_state(struct isp1301 *isp, const char *tag) | |||
| 501 | if (isp->otg.state == state && !extra) | 481 | if (isp->otg.state == state && !extra) |
| 502 | return; | 482 | return; |
| 503 | pr_debug("otg: %s FSM %s/%02x, %s, %06x\n", tag, | 483 | pr_debug("otg: %s FSM %s/%02x, %s, %06x\n", tag, |
| 504 | state_string(state), fsm, state_name(isp), | 484 | otg_state_string(state), fsm, state_name(isp), |
| 505 | omap_readl(OTG_CTRL)); | 485 | omap_readl(OTG_CTRL)); |
| 506 | } | 486 | } |
| 507 | 487 | ||
| @@ -1095,7 +1075,7 @@ static void isp_update_otg(struct isp1301 *isp, u8 stat) | |||
| 1095 | 1075 | ||
| 1096 | if (state != isp->otg.state) | 1076 | if (state != isp->otg.state) |
| 1097 | pr_debug(" isp, %s -> %s\n", | 1077 | pr_debug(" isp, %s -> %s\n", |
| 1098 | state_string(state), state_name(isp)); | 1078 | otg_state_string(state), state_name(isp)); |
| 1099 | 1079 | ||
| 1100 | #ifdef CONFIG_USB_OTG | 1080 | #ifdef CONFIG_USB_OTG |
| 1101 | /* update the OTG controller state to match the isp1301; may | 1081 | /* update the OTG controller state to match the isp1301; may |
diff --git a/drivers/usb/otg/langwell_otg.c b/drivers/usb/otg/langwell_otg.c index e973ff19c55..f08f784086f 100644 --- a/drivers/usb/otg/langwell_otg.c +++ b/drivers/usb/otg/langwell_otg.c | |||
| @@ -82,40 +82,6 @@ static struct pci_driver otg_pci_driver = { | |||
| 82 | .resume = langwell_otg_resume, | 82 | .resume = langwell_otg_resume, |
| 83 | }; | 83 | }; |
| 84 | 84 | ||
| 85 | static const char *state_string(enum usb_otg_state state) | ||
| 86 | { | ||
| 87 | switch (state) { | ||
| 88 | case OTG_STATE_A_IDLE: | ||
| 89 | return "a_idle"; | ||
| 90 | case OTG_STATE_A_WAIT_VRISE: | ||
| 91 | return "a_wait_vrise"; | ||
| 92 | case OTG_STATE_A_WAIT_BCON: | ||
| 93 | return "a_wait_bcon"; | ||
| 94 | case OTG_STATE_A_HOST: | ||
| 95 | return "a_host"; | ||
| 96 | case OTG_STATE_A_SUSPEND: | ||
| 97 | return "a_suspend"; | ||
| 98 | case OTG_STATE_A_PERIPHERAL: | ||
| 99 | return "a_peripheral"; | ||
| 100 | case OTG_STATE_A_WAIT_VFALL: | ||
| 101 | return "a_wait_vfall"; | ||
| 102 | case OTG_STATE_A_VBUS_ERR: | ||
| 103 | return "a_vbus_err"; | ||
| 104 | case OTG_STATE_B_IDLE: | ||
| 105 | return "b_idle"; | ||
| 106 | case OTG_STATE_B_SRP_INIT: | ||
| 107 | return "b_srp_init"; | ||
| 108 | case OTG_STATE_B_PERIPHERAL: | ||
| 109 | return "b_peripheral"; | ||
| 110 | case OTG_STATE_B_WAIT_ACON: | ||
| 111 | return "b_wait_acon"; | ||
| 112 | case OTG_STATE_B_HOST: | ||
| 113 | return "b_host"; | ||
| 114 | default: | ||
| 115 | return "UNDEFINED"; | ||
| 116 | } | ||
| 117 | } | ||
| 118 | |||
| 119 | /* HSM timers */ | 85 | /* HSM timers */ |
| 120 | static inline struct langwell_otg_timer *otg_timer_initializer | 86 | static inline struct langwell_otg_timer *otg_timer_initializer |
| 121 | (void (*function)(unsigned long), unsigned long expires, unsigned long data) | 87 | (void (*function)(unsigned long), unsigned long expires, unsigned long data) |
| @@ -968,7 +934,7 @@ static void langwell_otg_work(struct work_struct *work) | |||
| 968 | pdev = to_pci_dev(lnw->dev); | 934 | pdev = to_pci_dev(lnw->dev); |
| 969 | 935 | ||
| 970 | dev_dbg(lnw->dev, "%s: old state = %s\n", __func__, | 936 | dev_dbg(lnw->dev, "%s: old state = %s\n", __func__, |
| 971 | state_string(iotg->otg.state)); | 937 | otg_state_string(iotg->otg.state)); |
| 972 | 938 | ||
| 973 | switch (iotg->otg.state) { | 939 | switch (iotg->otg.state) { |
| 974 | case OTG_STATE_UNDEFINED: | 940 | case OTG_STATE_UNDEFINED: |
| @@ -1703,7 +1669,7 @@ static void langwell_otg_work(struct work_struct *work) | |||
| 1703 | } | 1669 | } |
| 1704 | 1670 | ||
| 1705 | dev_dbg(lnw->dev, "%s: new state = %s\n", __func__, | 1671 | dev_dbg(lnw->dev, "%s: new state = %s\n", __func__, |
| 1706 | state_string(iotg->otg.state)); | 1672 | otg_state_string(iotg->otg.state)); |
| 1707 | } | 1673 | } |
| 1708 | 1674 | ||
| 1709 | static ssize_t | 1675 | static ssize_t |
| @@ -1789,7 +1755,7 @@ show_hsm(struct device *_dev, struct device_attribute *attr, char *buf) | |||
| 1789 | "b_bus_req = \t%d\n" | 1755 | "b_bus_req = \t%d\n" |
| 1790 | "b_bus_suspend_tmout = \t%d\n" | 1756 | "b_bus_suspend_tmout = \t%d\n" |
| 1791 | "b_bus_suspend_vld = \t%d\n", | 1757 | "b_bus_suspend_vld = \t%d\n", |
| 1792 | state_string(iotg->otg.state), | 1758 | otg_state_string(iotg->otg.state), |
| 1793 | iotg->hsm.a_bus_resume, | 1759 | iotg->hsm.a_bus_resume, |
| 1794 | iotg->hsm.a_bus_suspend, | 1760 | iotg->hsm.a_bus_suspend, |
| 1795 | iotg->hsm.a_conn, | 1761 | iotg->hsm.a_conn, |
diff --git a/drivers/usb/otg/msm_otg.c b/drivers/usb/otg/msm_otg.c index 296598628b8..b276f8fcdeb 100644 --- a/drivers/usb/otg/msm_otg.c +++ b/drivers/usb/otg/msm_otg.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* Copyright (c) 2009-2010, Code Aurora Forum. All rights reserved. | 1 | /* Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved. |
| 2 | * | 2 | * |
| 3 | * This program is free software; you can redistribute it and/or modify | 3 | * This program is free software; you can redistribute it and/or modify |
| 4 | * it under the terms of the GNU General Public License version 2 and | 4 | * it under the terms of the GNU General Public License version 2 and |
| @@ -38,6 +38,7 @@ | |||
| 38 | #include <linux/usb/hcd.h> | 38 | #include <linux/usb/hcd.h> |
| 39 | #include <linux/usb/msm_hsusb.h> | 39 | #include <linux/usb/msm_hsusb.h> |
| 40 | #include <linux/usb/msm_hsusb_hw.h> | 40 | #include <linux/usb/msm_hsusb_hw.h> |
| 41 | #include <linux/regulator/consumer.h> | ||
| 41 | 42 | ||
| 42 | #include <mach/clk.h> | 43 | #include <mach/clk.h> |
| 43 | 44 | ||
| @@ -45,6 +46,195 @@ | |||
| 45 | #define DRIVER_NAME "msm_otg" | 46 | #define DRIVER_NAME "msm_otg" |
| 46 | 47 | ||
| 47 | #define ULPI_IO_TIMEOUT_USEC (10 * 1000) | 48 | #define ULPI_IO_TIMEOUT_USEC (10 * 1000) |
| 49 | |||
| 50 | #define USB_PHY_3P3_VOL_MIN 3050000 /* uV */ | ||
| 51 | #define USB_PHY_3P3_VOL_MAX 3300000 /* uV */ | ||
| 52 | #define USB_PHY_3P3_HPM_LOAD 50000 /* uA */ | ||
| 53 | #define USB_PHY_3P3_LPM_LOAD 4000 /* uA */ | ||
| 54 | |||
| 55 | #define USB_PHY_1P8_VOL_MIN 1800000 /* uV */ | ||
| 56 | #define USB_PHY_1P8_VOL_MAX 1800000 /* uV */ | ||
| 57 | #define USB_PHY_1P8_HPM_LOAD 50000 /* uA */ | ||
| 58 | #define USB_PHY_1P8_LPM_LOAD 4000 /* uA */ | ||
| 59 | |||
| 60 | #define USB_PHY_VDD_DIG_VOL_MIN 1000000 /* uV */ | ||
| 61 | #define USB_PHY_VDD_DIG_VOL_MAX 1320000 /* uV */ | ||
| 62 | |||
| 63 | static struct regulator *hsusb_3p3; | ||
| 64 | static struct regulator *hsusb_1p8; | ||
| 65 | static struct regulator *hsusb_vddcx; | ||
| 66 | |||
| 67 | static int msm_hsusb_init_vddcx(struct msm_otg *motg, int init) | ||
| 68 | { | ||
| 69 | int ret = 0; | ||
| 70 | |||
| 71 | if (init) { | ||
| 72 | hsusb_vddcx = regulator_get(motg->otg.dev, "HSUSB_VDDCX"); | ||
| 73 | if (IS_ERR(hsusb_vddcx)) { | ||
| 74 | dev_err(motg->otg.dev, "unable to get hsusb vddcx\n"); | ||
| 75 | return PTR_ERR(hsusb_vddcx); | ||
| 76 | } | ||
| 77 | |||
| 78 | ret = regulator_set_voltage(hsusb_vddcx, | ||
| 79 | USB_PHY_VDD_DIG_VOL_MIN, | ||
| 80 | USB_PHY_VDD_DIG_VOL_MAX); | ||
| 81 | if (ret) { | ||
| 82 | dev_err(motg->otg.dev, "unable to set the voltage " | ||
| 83 | "for hsusb vddcx\n"); | ||
| 84 | regulator_put(hsusb_vddcx); | ||
| 85 | return ret; | ||
| 86 | } | ||
| 87 | |||
| 88 | ret = regulator_enable(hsusb_vddcx); | ||
| 89 | if (ret) { | ||
| 90 | dev_err(motg->otg.dev, "unable to enable hsusb vddcx\n"); | ||
| 91 | regulator_put(hsusb_vddcx); | ||
| 92 | } | ||
| 93 | } else { | ||
| 94 | ret = regulator_set_voltage(hsusb_vddcx, 0, | ||
| 95 | USB_PHY_VDD_DIG_VOL_MAX); | ||
| 96 | if (ret) | ||
| 97 | dev_err(motg->otg.dev, "unable to set the voltage " | ||
| 98 | "for hsusb vddcx\n"); | ||
| 99 | ret = regulator_disable(hsusb_vddcx); | ||
| 100 | if (ret) | ||
| 101 | dev_err(motg->otg.dev, "unable to disable hsusb vddcx\n"); | ||
| 102 | |||
| 103 | regulator_put(hsusb_vddcx); | ||
| 104 | } | ||
| 105 | |||
| 106 | return ret; | ||
| 107 | } | ||
| 108 | |||
| 109 | static int msm_hsusb_ldo_init(struct msm_otg *motg, int init) | ||
| 110 | { | ||
| 111 | int rc = 0; | ||
| 112 | |||
| 113 | if (init) { | ||
| 114 | hsusb_3p3 = regulator_get(motg->otg.dev, "HSUSB_3p3"); | ||
| 115 | if (IS_ERR(hsusb_3p3)) { | ||
| 116 | dev_err(motg->otg.dev, "unable to get hsusb 3p3\n"); | ||
| 117 | return PTR_ERR(hsusb_3p3); | ||
| 118 | } | ||
| 119 | |||
| 120 | rc = regulator_set_voltage(hsusb_3p3, USB_PHY_3P3_VOL_MIN, | ||
| 121 | USB_PHY_3P3_VOL_MAX); | ||
| 122 | if (rc) { | ||
| 123 | dev_err(motg->otg.dev, "unable to set voltage level " | ||
| 124 | "for hsusb 3p3\n"); | ||
| 125 | goto put_3p3; | ||
| 126 | } | ||
| 127 | rc = regulator_enable(hsusb_3p3); | ||
| 128 | if (rc) { | ||
| 129 | dev_err(motg->otg.dev, "unable to enable the hsusb 3p3\n"); | ||
| 130 | goto put_3p3; | ||
| 131 | } | ||
| 132 | hsusb_1p8 = regulator_get(motg->otg.dev, "HSUSB_1p8"); | ||
| 133 | if (IS_ERR(hsusb_1p8)) { | ||
| 134 | dev_err(motg->otg.dev, "unable to get hsusb 1p8\n"); | ||
| 135 | rc = PTR_ERR(hsusb_1p8); | ||
| 136 | goto disable_3p3; | ||
| 137 | } | ||
| 138 | rc = regulator_set_voltage(hsusb_1p8, USB_PHY_1P8_VOL_MIN, | ||
| 139 | USB_PHY_1P8_VOL_MAX); | ||
| 140 | if (rc) { | ||
| 141 | dev_err(motg->otg.dev, "unable to set voltage level " | ||
| 142 | "for hsusb 1p8\n"); | ||
| 143 | goto put_1p8; | ||
| 144 | } | ||
| 145 | rc = regulator_enable(hsusb_1p8); | ||
| 146 | if (rc) { | ||
| 147 | dev_err(motg->otg.dev, "unable to enable the hsusb 1p8\n"); | ||
| 148 | goto put_1p8; | ||
| 149 | } | ||
| 150 | |||
| 151 | return 0; | ||
| 152 | } | ||
| 153 | |||
| 154 | regulator_disable(hsusb_1p8); | ||
| 155 | put_1p8: | ||
| 156 | regulator_put(hsusb_1p8); | ||
| 157 | disable_3p3: | ||
| 158 | regulator_disable(hsusb_3p3); | ||
| 159 | put_3p3: | ||
| 160 | regulator_put(hsusb_3p3); | ||
| 161 | return rc; | ||
| 162 | } | ||
| 163 | |||
| 164 | #ifdef CONFIG_PM_SLEEP | ||
| 165 | #define USB_PHY_SUSP_DIG_VOL 500000 | ||
| 166 | static int msm_hsusb_config_vddcx(int high) | ||
| 167 | { | ||
| 168 | int max_vol = USB_PHY_VDD_DIG_VOL_MAX; | ||
| 169 | int min_vol; | ||
| 170 | int ret; | ||
| 171 | |||
| 172 | if (high) | ||
| 173 | min_vol = USB_PHY_VDD_DIG_VOL_MIN; | ||
| 174 | else | ||
| 175 | min_vol = USB_PHY_SUSP_DIG_VOL; | ||
| 176 | |||
| 177 | ret = regulator_set_voltage(hsusb_vddcx, min_vol, max_vol); | ||
| 178 | if (ret) { | ||
| 179 | pr_err("%s: unable to set the voltage for regulator " | ||
| 180 | "HSUSB_VDDCX\n", __func__); | ||
| 181 | return ret; | ||
| 182 | } | ||
| 183 | |||
| 184 | pr_debug("%s: min_vol:%d max_vol:%d\n", __func__, min_vol, max_vol); | ||
| 185 | |||
| 186 | return ret; | ||
| 187 | } | ||
| 188 | #endif | ||
| 189 | |||
| 190 | static int msm_hsusb_ldo_set_mode(int on) | ||
| 191 | { | ||
| 192 | int ret = 0; | ||
| 193 | |||
| 194 | if (!hsusb_1p8 || IS_ERR(hsusb_1p8)) { | ||
| 195 | pr_err("%s: HSUSB_1p8 is not initialized\n", __func__); | ||
| 196 | return -ENODEV; | ||
| 197 | } | ||
| 198 | |||
| 199 | if (!hsusb_3p3 || IS_ERR(hsusb_3p3)) { | ||
| 200 | pr_err("%s: HSUSB_3p3 is not initialized\n", __func__); | ||
| 201 | return -ENODEV; | ||
| 202 | } | ||
| 203 | |||
| 204 | if (on) { | ||
| 205 | ret = regulator_set_optimum_mode(hsusb_1p8, | ||
| 206 | USB_PHY_1P8_HPM_LOAD); | ||
| 207 | if (ret < 0) { | ||
| 208 | pr_err("%s: Unable to set HPM of the regulator " | ||
| 209 | "HSUSB_1p8\n", __func__); | ||
| 210 | return ret; | ||
| 211 | } | ||
| 212 | ret = regulator_set_optimum_mode(hsusb_3p3, | ||
| 213 | USB_PHY_3P3_HPM_LOAD); | ||
| 214 | if (ret < 0) { | ||
| 215 | pr_err("%s: Unable to set HPM of the regulator " | ||
| 216 | "HSUSB_3p3\n", __func__); | ||
| 217 | regulator_set_optimum_mode(hsusb_1p8, | ||
| 218 | USB_PHY_1P8_LPM_LOAD); | ||
| 219 | return ret; | ||
| 220 | } | ||
| 221 | } else { | ||
| 222 | ret = regulator_set_optimum_mode(hsusb_1p8, | ||
| 223 | USB_PHY_1P8_LPM_LOAD); | ||
| 224 | if (ret < 0) | ||
| 225 | pr_err("%s: Unable to set LPM of the regulator " | ||
| 226 | "HSUSB_1p8\n", __func__); | ||
| 227 | ret = regulator_set_optimum_mode(hsusb_3p3, | ||
| 228 | USB_PHY_3P3_LPM_LOAD); | ||
| 229 | if (ret < 0) | ||
| 230 | pr_err("%s: Unable to set LPM of the regulator " | ||
| 231 | "HSUSB_3p3\n", __func__); | ||
| 232 | } | ||
| 233 | |||
| 234 | pr_debug("reg (%s)\n", on ? "HPM" : "LPM"); | ||
| 235 | return ret < 0 ? ret : 0; | ||
| 236 | } | ||
| 237 | |||
| 48 | static int ulpi_read(struct otg_transceiver *otg, u32 reg) | 238 | static int ulpi_read(struct otg_transceiver *otg, u32 reg) |
| 49 | { | 239 | { |
| 50 | struct msm_otg *motg = container_of(otg, struct msm_otg, otg); | 240 | struct msm_otg *motg = container_of(otg, struct msm_otg, otg); |
| @@ -268,27 +458,28 @@ static int msm_otg_suspend(struct msm_otg *motg) | |||
| 268 | 458 | ||
| 269 | disable_irq(motg->irq); | 459 | disable_irq(motg->irq); |
| 270 | /* | 460 | /* |
| 461 | * Chipidea 45-nm PHY suspend sequence: | ||
| 462 | * | ||
| 271 | * Interrupt Latch Register auto-clear feature is not present | 463 | * Interrupt Latch Register auto-clear feature is not present |
| 272 | * in all PHY versions. Latch register is clear on read type. | 464 | * in all PHY versions. Latch register is clear on read type. |
| 273 | * Clear latch register to avoid spurious wakeup from | 465 | * Clear latch register to avoid spurious wakeup from |
| 274 | * low power mode (LPM). | 466 | * low power mode (LPM). |
| 275 | */ | 467 | * |
| 276 | ulpi_read(otg, 0x14); | ||
| 277 | |||
| 278 | /* | ||
| 279 | * PHY comparators are disabled when PHY enters into low power | 468 | * PHY comparators are disabled when PHY enters into low power |
| 280 | * mode (LPM). Keep PHY comparators ON in LPM only when we expect | 469 | * mode (LPM). Keep PHY comparators ON in LPM only when we expect |
| 281 | * VBUS/Id notifications from USB PHY. Otherwise turn off USB | 470 | * VBUS/Id notifications from USB PHY. Otherwise turn off USB |
| 282 | * PHY comparators. This save significant amount of power. | 471 | * PHY comparators. This save significant amount of power. |
| 283 | */ | 472 | * |
| 284 | if (pdata->otg_control == OTG_PHY_CONTROL) | ||
| 285 | ulpi_write(otg, 0x01, 0x30); | ||
| 286 | |||
| 287 | /* | ||
| 288 | * PLL is not turned off when PHY enters into low power mode (LPM). | 473 | * PLL is not turned off when PHY enters into low power mode (LPM). |
| 289 | * Disable PLL for maximum power savings. | 474 | * Disable PLL for maximum power savings. |
| 290 | */ | 475 | */ |
| 291 | ulpi_write(otg, 0x08, 0x09); | 476 | |
| 477 | if (motg->pdata->phy_type == CI_45NM_INTEGRATED_PHY) { | ||
| 478 | ulpi_read(otg, 0x14); | ||
| 479 | if (pdata->otg_control == OTG_PHY_CONTROL) | ||
| 480 | ulpi_write(otg, 0x01, 0x30); | ||
| 481 | ulpi_write(otg, 0x08, 0x09); | ||
| 482 | } | ||
| 292 | 483 | ||
| 293 | /* | 484 | /* |
| 294 | * PHY may take some time or even fail to enter into low power | 485 | * PHY may take some time or even fail to enter into low power |
| @@ -319,11 +510,24 @@ static int msm_otg_suspend(struct msm_otg *motg) | |||
| 319 | */ | 510 | */ |
| 320 | writel(readl(USB_USBCMD) | ASYNC_INTR_CTRL | ULPI_STP_CTRL, USB_USBCMD); | 511 | writel(readl(USB_USBCMD) | ASYNC_INTR_CTRL | ULPI_STP_CTRL, USB_USBCMD); |
| 321 | 512 | ||
| 513 | if (motg->pdata->phy_type == SNPS_28NM_INTEGRATED_PHY && | ||
| 514 | motg->pdata->otg_control == OTG_PMIC_CONTROL) | ||
| 515 | writel(readl(USB_PHY_CTRL) | PHY_RETEN, USB_PHY_CTRL); | ||
| 516 | |||
| 322 | clk_disable(motg->pclk); | 517 | clk_disable(motg->pclk); |
| 323 | clk_disable(motg->clk); | 518 | clk_disable(motg->clk); |
| 324 | if (motg->core_clk) | 519 | if (motg->core_clk) |
| 325 | clk_disable(motg->core_clk); | 520 | clk_disable(motg->core_clk); |
| 326 | 521 | ||
| 522 | if (!IS_ERR(motg->pclk_src)) | ||
| 523 | clk_disable(motg->pclk_src); | ||
| 524 | |||
| 525 | if (motg->pdata->phy_type == SNPS_28NM_INTEGRATED_PHY && | ||
| 526 | motg->pdata->otg_control == OTG_PMIC_CONTROL) { | ||
| 527 | msm_hsusb_ldo_set_mode(0); | ||
| 528 | msm_hsusb_config_vddcx(0); | ||
| 529 | } | ||
| 530 | |||
| 327 | if (device_may_wakeup(otg->dev)) | 531 | if (device_may_wakeup(otg->dev)) |
| 328 | enable_irq_wake(motg->irq); | 532 | enable_irq_wake(motg->irq); |
| 329 | if (bus) | 533 | if (bus) |
| @@ -347,11 +551,21 @@ static int msm_otg_resume(struct msm_otg *motg) | |||
| 347 | if (!atomic_read(&motg->in_lpm)) | 551 | if (!atomic_read(&motg->in_lpm)) |
| 348 | return 0; | 552 | return 0; |
| 349 | 553 | ||
| 554 | if (!IS_ERR(motg->pclk_src)) | ||
| 555 | clk_enable(motg->pclk_src); | ||
| 556 | |||
| 350 | clk_enable(motg->pclk); | 557 | clk_enable(motg->pclk); |
| 351 | clk_enable(motg->clk); | 558 | clk_enable(motg->clk); |
| 352 | if (motg->core_clk) | 559 | if (motg->core_clk) |
| 353 | clk_enable(motg->core_clk); | 560 | clk_enable(motg->core_clk); |
| 354 | 561 | ||
| 562 | if (motg->pdata->phy_type == SNPS_28NM_INTEGRATED_PHY && | ||
| 563 | motg->pdata->otg_control == OTG_PMIC_CONTROL) { | ||
| 564 | msm_hsusb_ldo_set_mode(1); | ||
| 565 | msm_hsusb_config_vddcx(1); | ||
| 566 | writel(readl(USB_PHY_CTRL) & ~PHY_RETEN, USB_PHY_CTRL); | ||
| 567 | } | ||
| 568 | |||
| 355 | temp = readl(USB_USBCMD); | 569 | temp = readl(USB_USBCMD); |
| 356 | temp &= ~ASYNC_INTR_CTRL; | 570 | temp &= ~ASYNC_INTR_CTRL; |
| 357 | temp &= ~ULPI_STP_CTRL; | 571 | temp &= ~ULPI_STP_CTRL; |
| @@ -389,20 +603,47 @@ skip_phy_resume: | |||
| 389 | if (bus) | 603 | if (bus) |
| 390 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &(bus_to_hcd(bus))->flags); | 604 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &(bus_to_hcd(bus))->flags); |
| 391 | 605 | ||
| 606 | atomic_set(&motg->in_lpm, 0); | ||
| 607 | |||
| 392 | if (motg->async_int) { | 608 | if (motg->async_int) { |
| 393 | motg->async_int = 0; | 609 | motg->async_int = 0; |
| 394 | pm_runtime_put(otg->dev); | 610 | pm_runtime_put(otg->dev); |
| 395 | enable_irq(motg->irq); | 611 | enable_irq(motg->irq); |
| 396 | } | 612 | } |
| 397 | 613 | ||
| 398 | atomic_set(&motg->in_lpm, 0); | ||
| 399 | |||
| 400 | dev_info(otg->dev, "USB exited from low power mode\n"); | 614 | dev_info(otg->dev, "USB exited from low power mode\n"); |
| 401 | 615 | ||
| 402 | return 0; | 616 | return 0; |
| 403 | } | 617 | } |
| 404 | #endif | 618 | #endif |
| 405 | 619 | ||
| 620 | static void msm_otg_notify_charger(struct msm_otg *motg, unsigned mA) | ||
| 621 | { | ||
| 622 | if (motg->cur_power == mA) | ||
| 623 | return; | ||
| 624 | |||
| 625 | /* TODO: Notify PMIC about available current */ | ||
| 626 | dev_info(motg->otg.dev, "Avail curr from USB = %u\n", mA); | ||
| 627 | motg->cur_power = mA; | ||
| 628 | } | ||
| 629 | |||
| 630 | static int msm_otg_set_power(struct otg_transceiver *otg, unsigned mA) | ||
| 631 | { | ||
| 632 | struct msm_otg *motg = container_of(otg, struct msm_otg, otg); | ||
| 633 | |||
| 634 | /* | ||
| 635 | * Gadget driver uses set_power method to notify about the | ||
| 636 | * available current based on suspend/configured states. | ||
| 637 | * | ||
| 638 | * IDEV_CHG can be drawn irrespective of suspend/un-configured | ||
| 639 | * states when CDP/ACA is connected. | ||
| 640 | */ | ||
| 641 | if (motg->chg_type == USB_SDP_CHARGER) | ||
| 642 | msm_otg_notify_charger(motg, mA); | ||
| 643 | |||
| 644 | return 0; | ||
| 645 | } | ||
| 646 | |||
| 406 | static void msm_otg_start_host(struct otg_transceiver *otg, int on) | 647 | static void msm_otg_start_host(struct otg_transceiver *otg, int on) |
| 407 | { | 648 | { |
| 408 | struct msm_otg *motg = container_of(otg, struct msm_otg, otg); | 649 | struct msm_otg *motg = container_of(otg, struct msm_otg, otg); |
| @@ -557,6 +798,306 @@ static int msm_otg_set_peripheral(struct otg_transceiver *otg, | |||
| 557 | return 0; | 798 | return 0; |
| 558 | } | 799 | } |
| 559 | 800 | ||
| 801 | static bool msm_chg_check_secondary_det(struct msm_otg *motg) | ||
| 802 | { | ||
| 803 | struct otg_transceiver *otg = &motg->otg; | ||
| 804 | u32 chg_det; | ||
| 805 | bool ret = false; | ||
| 806 | |||
| 807 | switch (motg->pdata->phy_type) { | ||
| 808 | case CI_45NM_INTEGRATED_PHY: | ||
| 809 | chg_det = ulpi_read(otg, 0x34); | ||
| 810 | ret = chg_det & (1 << 4); | ||
| 811 | break; | ||
| 812 | case SNPS_28NM_INTEGRATED_PHY: | ||
| 813 | chg_det = ulpi_read(otg, 0x87); | ||
| 814 | ret = chg_det & 1; | ||
| 815 | break; | ||
| 816 | default: | ||
| 817 | break; | ||
| 818 | } | ||
| 819 | return ret; | ||
| 820 | } | ||
| 821 | |||
| 822 | static void msm_chg_enable_secondary_det(struct msm_otg *motg) | ||
| 823 | { | ||
| 824 | struct otg_transceiver *otg = &motg->otg; | ||
| 825 | u32 chg_det; | ||
| 826 | |||
| 827 | switch (motg->pdata->phy_type) { | ||
| 828 | case CI_45NM_INTEGRATED_PHY: | ||
| 829 | chg_det = ulpi_read(otg, 0x34); | ||
| 830 | /* Turn off charger block */ | ||
| 831 | chg_det |= ~(1 << 1); | ||
| 832 | ulpi_write(otg, chg_det, 0x34); | ||
| 833 | udelay(20); | ||
| 834 | /* control chg block via ULPI */ | ||
| 835 | chg_det &= ~(1 << 3); | ||
| 836 | ulpi_write(otg, chg_det, 0x34); | ||
| 837 | /* put it in host mode for enabling D- source */ | ||
| 838 | chg_det &= ~(1 << 2); | ||
| 839 | ulpi_write(otg, chg_det, 0x34); | ||
| 840 | /* Turn on chg detect block */ | ||
| 841 | chg_det &= ~(1 << 1); | ||
| 842 | ulpi_write(otg, chg_det, 0x34); | ||
| 843 | udelay(20); | ||
| 844 | /* enable chg detection */ | ||
| 845 | chg_det &= ~(1 << 0); | ||
| 846 | ulpi_write(otg, chg_det, 0x34); | ||
| 847 | break; | ||
| 848 | case SNPS_28NM_INTEGRATED_PHY: | ||
| 849 | /* | ||
| 850 | * Configure DM as current source, DP as current sink | ||
| 851 | * and enable battery charging comparators. | ||
| 852 | */ | ||
| 853 | ulpi_write(otg, 0x8, 0x85); | ||
| 854 | ulpi_write(otg, 0x2, 0x85); | ||
| 855 | ulpi_write(otg, 0x1, 0x85); | ||
| 856 | break; | ||
| 857 | default: | ||
| 858 | break; | ||
| 859 | } | ||
| 860 | } | ||
| 861 | |||
| 862 | static bool msm_chg_check_primary_det(struct msm_otg *motg) | ||
| 863 | { | ||
| 864 | struct otg_transceiver *otg = &motg->otg; | ||
| 865 | u32 chg_det; | ||
| 866 | bool ret = false; | ||
| 867 | |||
| 868 | switch (motg->pdata->phy_type) { | ||
| 869 | case CI_45NM_INTEGRATED_PHY: | ||
| 870 | chg_det = ulpi_read(otg, 0x34); | ||
| 871 | ret = chg_det & (1 << 4); | ||
| 872 | break; | ||
| 873 | case SNPS_28NM_INTEGRATED_PHY: | ||
| 874 | chg_det = ulpi_read(otg, 0x87); | ||
| 875 | ret = chg_det & 1; | ||
| 876 | break; | ||
| 877 | default: | ||
| 878 | break; | ||
| 879 | } | ||
| 880 | return ret; | ||
| 881 | } | ||
| 882 | |||
| 883 | static void msm_chg_enable_primary_det(struct msm_otg *motg) | ||
| 884 | { | ||
| 885 | struct otg_transceiver *otg = &motg->otg; | ||
| 886 | u32 chg_det; | ||
| 887 | |||
| 888 | switch (motg->pdata->phy_type) { | ||
| 889 | case CI_45NM_INTEGRATED_PHY: | ||
| 890 | chg_det = ulpi_read(otg, 0x34); | ||
| 891 | /* enable chg detection */ | ||
| 892 | chg_det &= ~(1 << 0); | ||
| 893 | ulpi_write(otg, chg_det, 0x34); | ||
| 894 | break; | ||
| 895 | case SNPS_28NM_INTEGRATED_PHY: | ||
| 896 | /* | ||
| 897 | * Configure DP as current source, DM as current sink | ||
| 898 | * and enable battery charging comparators. | ||
| 899 | */ | ||
| 900 | ulpi_write(otg, 0x2, 0x85); | ||
| 901 | ulpi_write(otg, 0x1, 0x85); | ||
| 902 | break; | ||
| 903 | default: | ||
| 904 | break; | ||
| 905 | } | ||
| 906 | } | ||
| 907 | |||
| 908 | static bool msm_chg_check_dcd(struct msm_otg *motg) | ||
| 909 | { | ||
| 910 | struct otg_transceiver *otg = &motg->otg; | ||
| 911 | u32 line_state; | ||
| 912 | bool ret = false; | ||
| 913 | |||
| 914 | switch (motg->pdata->phy_type) { | ||
| 915 | case CI_45NM_INTEGRATED_PHY: | ||
| 916 | line_state = ulpi_read(otg, 0x15); | ||
| 917 | ret = !(line_state & 1); | ||
| 918 | break; | ||
| 919 | case SNPS_28NM_INTEGRATED_PHY: | ||
| 920 | line_state = ulpi_read(otg, 0x87); | ||
| 921 | ret = line_state & 2; | ||
| 922 | break; | ||
| 923 | default: | ||
| 924 | break; | ||
| 925 | } | ||
| 926 | return ret; | ||
| 927 | } | ||
| 928 | |||
| 929 | static void msm_chg_disable_dcd(struct msm_otg *motg) | ||
| 930 | { | ||
| 931 | struct otg_transceiver *otg = &motg->otg; | ||
| 932 | u32 chg_det; | ||
| 933 | |||
| 934 | switch (motg->pdata->phy_type) { | ||
| 935 | case CI_45NM_INTEGRATED_PHY: | ||
| 936 | chg_det = ulpi_read(otg, 0x34); | ||
| 937 | chg_det &= ~(1 << 5); | ||
| 938 | ulpi_write(otg, chg_det, 0x34); | ||
| 939 | break; | ||
| 940 | case SNPS_28NM_INTEGRATED_PHY: | ||
| 941 | ulpi_write(otg, 0x10, 0x86); | ||
| 942 | break; | ||
| 943 | default: | ||
| 944 | break; | ||
| 945 | } | ||
| 946 | } | ||
| 947 | |||
| 948 | static void msm_chg_enable_dcd(struct msm_otg *motg) | ||
| 949 | { | ||
| 950 | struct otg_transceiver *otg = &motg->otg; | ||
| 951 | u32 chg_det; | ||
| 952 | |||
| 953 | switch (motg->pdata->phy_type) { | ||
| 954 | case CI_45NM_INTEGRATED_PHY: | ||
| 955 | chg_det = ulpi_read(otg, 0x34); | ||
| 956 | /* Turn on D+ current source */ | ||
| 957 | chg_det |= (1 << 5); | ||
| 958 | ulpi_write(otg, chg_det, 0x34); | ||
| 959 | break; | ||
| 960 | case SNPS_28NM_INTEGRATED_PHY: | ||
| 961 | /* Data contact detection enable */ | ||
| 962 | ulpi_write(otg, 0x10, 0x85); | ||
| 963 | break; | ||
| 964 | default: | ||
| 965 | break; | ||
| 966 | } | ||
| 967 | } | ||
| 968 | |||
| 969 | static void msm_chg_block_on(struct msm_otg *motg) | ||
| 970 | { | ||
| 971 | struct otg_transceiver *otg = &motg->otg; | ||
| 972 | u32 func_ctrl, chg_det; | ||
| 973 | |||
| 974 | /* put the controller in non-driving mode */ | ||
| 975 | func_ctrl = ulpi_read(otg, ULPI_FUNC_CTRL); | ||
| 976 | func_ctrl &= ~ULPI_FUNC_CTRL_OPMODE_MASK; | ||
| 977 | func_ctrl |= ULPI_FUNC_CTRL_OPMODE_NONDRIVING; | ||
| 978 | ulpi_write(otg, func_ctrl, ULPI_FUNC_CTRL); | ||
| 979 | |||
| 980 | switch (motg->pdata->phy_type) { | ||
| 981 | case CI_45NM_INTEGRATED_PHY: | ||
| 982 | chg_det = ulpi_read(otg, 0x34); | ||
| 983 | /* control chg block via ULPI */ | ||
| 984 | chg_det &= ~(1 << 3); | ||
| 985 | ulpi_write(otg, chg_det, 0x34); | ||
| 986 | /* Turn on chg detect block */ | ||
| 987 | chg_det &= ~(1 << 1); | ||
| 988 | ulpi_write(otg, chg_det, 0x34); | ||
| 989 | udelay(20); | ||
| 990 | break; | ||
| 991 | case SNPS_28NM_INTEGRATED_PHY: | ||
| 992 | /* Clear charger detecting control bits */ | ||
| 993 | ulpi_write(otg, 0x3F, 0x86); | ||
| 994 | /* Clear alt interrupt latch and enable bits */ | ||
| 995 | ulpi_write(otg, 0x1F, 0x92); | ||
| 996 | ulpi_write(otg, 0x1F, 0x95); | ||
| 997 | udelay(100); | ||
| 998 | break; | ||
| 999 | default: | ||
| 1000 | break; | ||
| 1001 | } | ||
| 1002 | } | ||
| 1003 | |||
| 1004 | static void msm_chg_block_off(struct msm_otg *motg) | ||
| 1005 | { | ||
| 1006 | struct otg_transceiver *otg = &motg->otg; | ||
| 1007 | u32 func_ctrl, chg_det; | ||
| 1008 | |||
| 1009 | switch (motg->pdata->phy_type) { | ||
| 1010 | case CI_45NM_INTEGRATED_PHY: | ||
| 1011 | chg_det = ulpi_read(otg, 0x34); | ||
| 1012 | /* Turn off charger block */ | ||
| 1013 | chg_det |= ~(1 << 1); | ||
| 1014 | ulpi_write(otg, chg_det, 0x34); | ||
| 1015 | break; | ||
| 1016 | case SNPS_28NM_INTEGRATED_PHY: | ||
| 1017 | /* Clear charger detecting control bits */ | ||
| 1018 | ulpi_write(otg, 0x3F, 0x86); | ||
| 1019 | /* Clear alt interrupt latch and enable bits */ | ||
| 1020 | ulpi_write(otg, 0x1F, 0x92); | ||
| 1021 | ulpi_write(otg, 0x1F, 0x95); | ||
| 1022 | break; | ||
| 1023 | default: | ||
| 1024 | break; | ||
| 1025 | } | ||
| 1026 | |||
| 1027 | /* put the controller in normal mode */ | ||
| 1028 | func_ctrl = ulpi_read(otg, ULPI_FUNC_CTRL); | ||
| 1029 | func_ctrl &= ~ULPI_FUNC_CTRL_OPMODE_MASK; | ||
| 1030 | func_ctrl |= ULPI_FUNC_CTRL_OPMODE_NORMAL; | ||
| 1031 | ulpi_write(otg, func_ctrl, ULPI_FUNC_CTRL); | ||
| 1032 | } | ||
| 1033 | |||
| 1034 | #define MSM_CHG_DCD_POLL_TIME (100 * HZ/1000) /* 100 msec */ | ||
| 1035 | #define MSM_CHG_DCD_MAX_RETRIES 6 /* Tdcd_tmout = 6 * 100 msec */ | ||
| 1036 | #define MSM_CHG_PRIMARY_DET_TIME (40 * HZ/1000) /* TVDPSRC_ON */ | ||
| 1037 | #define MSM_CHG_SECONDARY_DET_TIME (40 * HZ/1000) /* TVDMSRC_ON */ | ||
| 1038 | static void msm_chg_detect_work(struct work_struct *w) | ||
| 1039 | { | ||
| 1040 | struct msm_otg *motg = container_of(w, struct msm_otg, chg_work.work); | ||
| 1041 | struct otg_transceiver *otg = &motg->otg; | ||
| 1042 | bool is_dcd, tmout, vout; | ||
| 1043 | unsigned long delay; | ||
| 1044 | |||
| 1045 | dev_dbg(otg->dev, "chg detection work\n"); | ||
| 1046 | switch (motg->chg_state) { | ||
| 1047 | case USB_CHG_STATE_UNDEFINED: | ||
| 1048 | pm_runtime_get_sync(otg->dev); | ||
| 1049 | msm_chg_block_on(motg); | ||
| 1050 | msm_chg_enable_dcd(motg); | ||
| 1051 | motg->chg_state = USB_CHG_STATE_WAIT_FOR_DCD; | ||
| 1052 | motg->dcd_retries = 0; | ||
| 1053 | delay = MSM_CHG_DCD_POLL_TIME; | ||
| 1054 | break; | ||
| 1055 | case USB_CHG_STATE_WAIT_FOR_DCD: | ||
| 1056 | is_dcd = msm_chg_check_dcd(motg); | ||
| 1057 | tmout = ++motg->dcd_retries == MSM_CHG_DCD_MAX_RETRIES; | ||
| 1058 | if (is_dcd || tmout) { | ||
| 1059 | msm_chg_disable_dcd(motg); | ||
| 1060 | msm_chg_enable_primary_det(motg); | ||
| 1061 | delay = MSM_CHG_PRIMARY_DET_TIME; | ||
| 1062 | motg->chg_state = USB_CHG_STATE_DCD_DONE; | ||
| 1063 | } else { | ||
| 1064 | delay = MSM_CHG_DCD_POLL_TIME; | ||
| 1065 | } | ||
| 1066 | break; | ||
| 1067 | case USB_CHG_STATE_DCD_DONE: | ||
| 1068 | vout = msm_chg_check_primary_det(motg); | ||
| 1069 | if (vout) { | ||
| 1070 | msm_chg_enable_secondary_det(motg); | ||
| 1071 | delay = MSM_CHG_SECONDARY_DET_TIME; | ||
| 1072 | motg->chg_state = USB_CHG_STATE_PRIMARY_DONE; | ||
| 1073 | } else { | ||
| 1074 | motg->chg_type = USB_SDP_CHARGER; | ||
| 1075 | motg->chg_state = USB_CHG_STATE_DETECTED; | ||
| 1076 | delay = 0; | ||
| 1077 | } | ||
| 1078 | break; | ||
| 1079 | case USB_CHG_STATE_PRIMARY_DONE: | ||
| 1080 | vout = msm_chg_check_secondary_det(motg); | ||
| 1081 | if (vout) | ||
| 1082 | motg->chg_type = USB_DCP_CHARGER; | ||
| 1083 | else | ||
| 1084 | motg->chg_type = USB_CDP_CHARGER; | ||
| 1085 | motg->chg_state = USB_CHG_STATE_SECONDARY_DONE; | ||
| 1086 | /* fall through */ | ||
| 1087 | case USB_CHG_STATE_SECONDARY_DONE: | ||
| 1088 | motg->chg_state = USB_CHG_STATE_DETECTED; | ||
| 1089 | case USB_CHG_STATE_DETECTED: | ||
| 1090 | msm_chg_block_off(motg); | ||
| 1091 | dev_dbg(otg->dev, "charger = %d\n", motg->chg_type); | ||
| 1092 | schedule_work(&motg->sm_work); | ||
| 1093 | return; | ||
| 1094 | default: | ||
| 1095 | return; | ||
| 1096 | } | ||
| 1097 | |||
| 1098 | schedule_delayed_work(&motg->chg_work, delay); | ||
| 1099 | } | ||
| 1100 | |||
| 560 | /* | 1101 | /* |
| 561 | * We support OTG, Peripheral only and Host only configurations. In case | 1102 | * We support OTG, Peripheral only and Host only configurations. In case |
| 562 | * of OTG, mode switch (host-->peripheral/peripheral-->host) can happen | 1103 | * of OTG, mode switch (host-->peripheral/peripheral-->host) can happen |
| @@ -627,9 +1168,48 @@ static void msm_otg_sm_work(struct work_struct *w) | |||
| 627 | writel(readl(USB_OTGSC) & ~OTGSC_BSVIE, USB_OTGSC); | 1168 | writel(readl(USB_OTGSC) & ~OTGSC_BSVIE, USB_OTGSC); |
| 628 | msm_otg_start_host(otg, 1); | 1169 | msm_otg_start_host(otg, 1); |
| 629 | otg->state = OTG_STATE_A_HOST; | 1170 | otg->state = OTG_STATE_A_HOST; |
| 630 | } else if (test_bit(B_SESS_VLD, &motg->inputs) && otg->gadget) { | 1171 | } else if (test_bit(B_SESS_VLD, &motg->inputs)) { |
| 631 | msm_otg_start_peripheral(otg, 1); | 1172 | switch (motg->chg_state) { |
| 632 | otg->state = OTG_STATE_B_PERIPHERAL; | 1173 | case USB_CHG_STATE_UNDEFINED: |
| 1174 | msm_chg_detect_work(&motg->chg_work.work); | ||
| 1175 | break; | ||
| 1176 | case USB_CHG_STATE_DETECTED: | ||
| 1177 | switch (motg->chg_type) { | ||
| 1178 | case USB_DCP_CHARGER: | ||
| 1179 | msm_otg_notify_charger(motg, | ||
| 1180 | IDEV_CHG_MAX); | ||
| 1181 | break; | ||
| 1182 | case USB_CDP_CHARGER: | ||
| 1183 | msm_otg_notify_charger(motg, | ||
| 1184 | IDEV_CHG_MAX); | ||
| 1185 | msm_otg_start_peripheral(otg, 1); | ||
| 1186 | otg->state = OTG_STATE_B_PERIPHERAL; | ||
| 1187 | break; | ||
| 1188 | case USB_SDP_CHARGER: | ||
| 1189 | msm_otg_notify_charger(motg, IUNIT); | ||
| 1190 | msm_otg_start_peripheral(otg, 1); | ||
| 1191 | otg->state = OTG_STATE_B_PERIPHERAL; | ||
| 1192 | break; | ||
| 1193 | default: | ||
| 1194 | break; | ||
| 1195 | } | ||
| 1196 | break; | ||
| 1197 | default: | ||
| 1198 | break; | ||
| 1199 | } | ||
| 1200 | } else { | ||
| 1201 | /* | ||
| 1202 | * If charger detection work is pending, decrement | ||
| 1203 | * the pm usage counter to balance with the one that | ||
| 1204 | * is incremented in charger detection work. | ||
| 1205 | */ | ||
| 1206 | if (cancel_delayed_work_sync(&motg->chg_work)) { | ||
| 1207 | pm_runtime_put_sync(otg->dev); | ||
| 1208 | msm_otg_reset(otg); | ||
| 1209 | } | ||
| 1210 | msm_otg_notify_charger(motg, 0); | ||
| 1211 | motg->chg_state = USB_CHG_STATE_UNDEFINED; | ||
| 1212 | motg->chg_type = USB_INVALID_CHARGER; | ||
| 633 | } | 1213 | } |
| 634 | pm_runtime_put_sync(otg->dev); | 1214 | pm_runtime_put_sync(otg->dev); |
| 635 | break; | 1215 | break; |
| @@ -637,7 +1217,10 @@ static void msm_otg_sm_work(struct work_struct *w) | |||
| 637 | dev_dbg(otg->dev, "OTG_STATE_B_PERIPHERAL state\n"); | 1217 | dev_dbg(otg->dev, "OTG_STATE_B_PERIPHERAL state\n"); |
| 638 | if (!test_bit(B_SESS_VLD, &motg->inputs) || | 1218 | if (!test_bit(B_SESS_VLD, &motg->inputs) || |
| 639 | !test_bit(ID, &motg->inputs)) { | 1219 | !test_bit(ID, &motg->inputs)) { |
| 1220 | msm_otg_notify_charger(motg, 0); | ||
| 640 | msm_otg_start_peripheral(otg, 0); | 1221 | msm_otg_start_peripheral(otg, 0); |
| 1222 | motg->chg_state = USB_CHG_STATE_UNDEFINED; | ||
| 1223 | motg->chg_type = USB_INVALID_CHARGER; | ||
| 641 | otg->state = OTG_STATE_B_IDLE; | 1224 | otg->state = OTG_STATE_B_IDLE; |
| 642 | msm_otg_reset(otg); | 1225 | msm_otg_reset(otg); |
| 643 | schedule_work(w); | 1226 | schedule_work(w); |
| @@ -862,12 +1445,31 @@ static int __init msm_otg_probe(struct platform_device *pdev) | |||
| 862 | ret = PTR_ERR(motg->clk); | 1445 | ret = PTR_ERR(motg->clk); |
| 863 | goto put_phy_reset_clk; | 1446 | goto put_phy_reset_clk; |
| 864 | } | 1447 | } |
| 1448 | clk_set_rate(motg->clk, 60000000); | ||
| 1449 | |||
| 1450 | /* | ||
| 1451 | * If USB Core is running its protocol engine based on CORE CLK, | ||
| 1452 | * CORE CLK must be running at >55Mhz for correct HSUSB | ||
| 1453 | * operation and USB core cannot tolerate frequency changes on | ||
| 1454 | * CORE CLK. For such USB cores, vote for maximum clk frequency | ||
| 1455 | * on pclk source | ||
| 1456 | */ | ||
| 1457 | if (motg->pdata->pclk_src_name) { | ||
| 1458 | motg->pclk_src = clk_get(&pdev->dev, | ||
| 1459 | motg->pdata->pclk_src_name); | ||
| 1460 | if (IS_ERR(motg->pclk_src)) | ||
| 1461 | goto put_clk; | ||
| 1462 | clk_set_rate(motg->pclk_src, INT_MAX); | ||
| 1463 | clk_enable(motg->pclk_src); | ||
| 1464 | } else | ||
| 1465 | motg->pclk_src = ERR_PTR(-ENOENT); | ||
| 1466 | |||
| 865 | 1467 | ||
| 866 | motg->pclk = clk_get(&pdev->dev, "usb_hs_pclk"); | 1468 | motg->pclk = clk_get(&pdev->dev, "usb_hs_pclk"); |
| 867 | if (IS_ERR(motg->pclk)) { | 1469 | if (IS_ERR(motg->pclk)) { |
| 868 | dev_err(&pdev->dev, "failed to get usb_hs_pclk\n"); | 1470 | dev_err(&pdev->dev, "failed to get usb_hs_pclk\n"); |
| 869 | ret = PTR_ERR(motg->pclk); | 1471 | ret = PTR_ERR(motg->pclk); |
| 870 | goto put_clk; | 1472 | goto put_pclk_src; |
| 871 | } | 1473 | } |
| 872 | 1474 | ||
| 873 | /* | 1475 | /* |
| @@ -903,6 +1505,24 @@ static int __init msm_otg_probe(struct platform_device *pdev) | |||
| 903 | 1505 | ||
| 904 | clk_enable(motg->clk); | 1506 | clk_enable(motg->clk); |
| 905 | clk_enable(motg->pclk); | 1507 | clk_enable(motg->pclk); |
| 1508 | |||
| 1509 | ret = msm_hsusb_init_vddcx(motg, 1); | ||
| 1510 | if (ret) { | ||
| 1511 | dev_err(&pdev->dev, "hsusb vddcx configuration failed\n"); | ||
| 1512 | goto free_regs; | ||
| 1513 | } | ||
| 1514 | |||
| 1515 | ret = msm_hsusb_ldo_init(motg, 1); | ||
| 1516 | if (ret) { | ||
| 1517 | dev_err(&pdev->dev, "hsusb vreg configuration failed\n"); | ||
| 1518 | goto vddcx_exit; | ||
| 1519 | } | ||
| 1520 | ret = msm_hsusb_ldo_set_mode(1); | ||
| 1521 | if (ret) { | ||
| 1522 | dev_err(&pdev->dev, "hsusb vreg enable failed\n"); | ||
| 1523 | goto ldo_exit; | ||
| 1524 | } | ||
| 1525 | |||
| 906 | if (motg->core_clk) | 1526 | if (motg->core_clk) |
| 907 | clk_enable(motg->core_clk); | 1527 | clk_enable(motg->core_clk); |
| 908 | 1528 | ||
| @@ -910,6 +1530,7 @@ static int __init msm_otg_probe(struct platform_device *pdev) | |||
| 910 | writel(0, USB_OTGSC); | 1530 | writel(0, USB_OTGSC); |
| 911 | 1531 | ||
| 912 | INIT_WORK(&motg->sm_work, msm_otg_sm_work); | 1532 | INIT_WORK(&motg->sm_work, msm_otg_sm_work); |
| 1533 | INIT_DELAYED_WORK(&motg->chg_work, msm_chg_detect_work); | ||
| 913 | ret = request_irq(motg->irq, msm_otg_irq, IRQF_SHARED, | 1534 | ret = request_irq(motg->irq, msm_otg_irq, IRQF_SHARED, |
| 914 | "msm_otg", motg); | 1535 | "msm_otg", motg); |
| 915 | if (ret) { | 1536 | if (ret) { |
| @@ -920,6 +1541,7 @@ static int __init msm_otg_probe(struct platform_device *pdev) | |||
| 920 | otg->init = msm_otg_reset; | 1541 | otg->init = msm_otg_reset; |
| 921 | otg->set_host = msm_otg_set_host; | 1542 | otg->set_host = msm_otg_set_host; |
| 922 | otg->set_peripheral = msm_otg_set_peripheral; | 1543 | otg->set_peripheral = msm_otg_set_peripheral; |
| 1544 | otg->set_power = msm_otg_set_power; | ||
| 923 | 1545 | ||
| 924 | otg->io_ops = &msm_otg_io_ops; | 1546 | otg->io_ops = &msm_otg_io_ops; |
| 925 | 1547 | ||
| @@ -949,12 +1571,21 @@ free_irq: | |||
| 949 | disable_clks: | 1571 | disable_clks: |
| 950 | clk_disable(motg->pclk); | 1572 | clk_disable(motg->pclk); |
| 951 | clk_disable(motg->clk); | 1573 | clk_disable(motg->clk); |
| 1574 | ldo_exit: | ||
| 1575 | msm_hsusb_ldo_init(motg, 0); | ||
| 1576 | vddcx_exit: | ||
| 1577 | msm_hsusb_init_vddcx(motg, 0); | ||
| 952 | free_regs: | 1578 | free_regs: |
| 953 | iounmap(motg->regs); | 1579 | iounmap(motg->regs); |
| 954 | put_core_clk: | 1580 | put_core_clk: |
| 955 | if (motg->core_clk) | 1581 | if (motg->core_clk) |
| 956 | clk_put(motg->core_clk); | 1582 | clk_put(motg->core_clk); |
| 957 | clk_put(motg->pclk); | 1583 | clk_put(motg->pclk); |
| 1584 | put_pclk_src: | ||
| 1585 | if (!IS_ERR(motg->pclk_src)) { | ||
| 1586 | clk_disable(motg->pclk_src); | ||
| 1587 | clk_put(motg->pclk_src); | ||
| 1588 | } | ||
| 958 | put_clk: | 1589 | put_clk: |
| 959 | clk_put(motg->clk); | 1590 | clk_put(motg->clk); |
| 960 | put_phy_reset_clk: | 1591 | put_phy_reset_clk: |
| @@ -974,6 +1605,7 @@ static int __devexit msm_otg_remove(struct platform_device *pdev) | |||
| 974 | return -EBUSY; | 1605 | return -EBUSY; |
| 975 | 1606 | ||
| 976 | msm_otg_debugfs_cleanup(); | 1607 | msm_otg_debugfs_cleanup(); |
| 1608 | cancel_delayed_work_sync(&motg->chg_work); | ||
| 977 | cancel_work_sync(&motg->sm_work); | 1609 | cancel_work_sync(&motg->sm_work); |
| 978 | 1610 | ||
| 979 | pm_runtime_resume(&pdev->dev); | 1611 | pm_runtime_resume(&pdev->dev); |
| @@ -1004,6 +1636,11 @@ static int __devexit msm_otg_remove(struct platform_device *pdev) | |||
| 1004 | clk_disable(motg->clk); | 1636 | clk_disable(motg->clk); |
| 1005 | if (motg->core_clk) | 1637 | if (motg->core_clk) |
| 1006 | clk_disable(motg->core_clk); | 1638 | clk_disable(motg->core_clk); |
| 1639 | if (!IS_ERR(motg->pclk_src)) { | ||
| 1640 | clk_disable(motg->pclk_src); | ||
| 1641 | clk_put(motg->pclk_src); | ||
| 1642 | } | ||
| 1643 | msm_hsusb_ldo_init(motg, 0); | ||
| 1007 | 1644 | ||
| 1008 | iounmap(motg->regs); | 1645 | iounmap(motg->regs); |
| 1009 | pm_runtime_set_suspended(&pdev->dev); | 1646 | pm_runtime_set_suspended(&pdev->dev); |
diff --git a/drivers/usb/otg/otg.c b/drivers/usb/otg/otg.c index 0a43a7db750..fb7adeff9ff 100644 --- a/drivers/usb/otg/otg.c +++ b/drivers/usb/otg/otg.c | |||
| @@ -64,3 +64,38 @@ int otg_set_transceiver(struct otg_transceiver *x) | |||
| 64 | return 0; | 64 | return 0; |
| 65 | } | 65 | } |
| 66 | EXPORT_SYMBOL(otg_set_transceiver); | 66 | EXPORT_SYMBOL(otg_set_transceiver); |
| 67 | |||
| 68 | const char *otg_state_string(enum usb_otg_state state) | ||
| 69 | { | ||
| 70 | switch (state) { | ||
| 71 | case OTG_STATE_A_IDLE: | ||
| 72 | return "a_idle"; | ||
| 73 | case OTG_STATE_A_WAIT_VRISE: | ||
| 74 | return "a_wait_vrise"; | ||
| 75 | case OTG_STATE_A_WAIT_BCON: | ||
| 76 | return "a_wait_bcon"; | ||
| 77 | case OTG_STATE_A_HOST: | ||
| 78 | return "a_host"; | ||
| 79 | case OTG_STATE_A_SUSPEND: | ||
| 80 | return "a_suspend"; | ||
| 81 | case OTG_STATE_A_PERIPHERAL: | ||
| 82 | return "a_peripheral"; | ||
| 83 | case OTG_STATE_A_WAIT_VFALL: | ||
| 84 | return "a_wait_vfall"; | ||
| 85 | case OTG_STATE_A_VBUS_ERR: | ||
| 86 | return "a_vbus_err"; | ||
| 87 | case OTG_STATE_B_IDLE: | ||
| 88 | return "b_idle"; | ||
| 89 | case OTG_STATE_B_SRP_INIT: | ||
| 90 | return "b_srp_init"; | ||
| 91 | case OTG_STATE_B_PERIPHERAL: | ||
| 92 | return "b_peripheral"; | ||
| 93 | case OTG_STATE_B_WAIT_ACON: | ||
| 94 | return "b_wait_acon"; | ||
| 95 | case OTG_STATE_B_HOST: | ||
| 96 | return "b_host"; | ||
| 97 | default: | ||
| 98 | return "UNDEFINED"; | ||
| 99 | } | ||
| 100 | } | ||
| 101 | EXPORT_SYMBOL(otg_state_string); | ||
diff --git a/drivers/usb/otg/otg_fsm.c b/drivers/usb/otg/otg_fsm.c new file mode 100644 index 00000000000..b0cc422f2ff --- /dev/null +++ b/drivers/usb/otg/otg_fsm.c | |||
| @@ -0,0 +1,349 @@ | |||
| 1 | /* | ||
| 2 | * OTG Finite State Machine from OTG spec | ||
| 3 | * | ||
| 4 | * Copyright (C) 2007,2008 Freescale Semiconductor, Inc. | ||
| 5 | * | ||
| 6 | * Author: Li Yang <LeoLi@freescale.com> | ||
| 7 | * Jerry Huang <Chang-Ming.Huang@freescale.com> | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify it | ||
| 10 | * under the terms of the GNU General Public License as published by the | ||
| 11 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 12 | * option) any later version. | ||
| 13 | * | ||
| 14 | * This program is distributed in the hope that it will be useful, but | ||
| 15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 17 | * General Public License for more details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU General Public License along | ||
| 20 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 21 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 22 | */ | ||
| 23 | |||
| 24 | #include <linux/kernel.h> | ||
| 25 | #include <linux/types.h> | ||
| 26 | #include <linux/spinlock.h> | ||
| 27 | #include <linux/delay.h> | ||
| 28 | #include <linux/usb.h> | ||
| 29 | #include <linux/usb/gadget.h> | ||
| 30 | #include <linux/usb/otg.h> | ||
| 31 | #include <linux/types.h> | ||
| 32 | |||
| 33 | #include "otg_fsm.h" | ||
| 34 | |||
| 35 | /* Change USB protocol when there is a protocol change */ | ||
| 36 | static int otg_set_protocol(struct otg_fsm *fsm, int protocol) | ||
| 37 | { | ||
| 38 | int ret = 0; | ||
| 39 | |||
| 40 | if (fsm->protocol != protocol) { | ||
| 41 | VDBG("Changing role fsm->protocol= %d; new protocol= %d\n", | ||
| 42 | fsm->protocol, protocol); | ||
| 43 | /* stop old protocol */ | ||
| 44 | if (fsm->protocol == PROTO_HOST) | ||
| 45 | ret = fsm->ops->start_host(fsm, 0); | ||
| 46 | else if (fsm->protocol == PROTO_GADGET) | ||
| 47 | ret = fsm->ops->start_gadget(fsm, 0); | ||
| 48 | if (ret) | ||
| 49 | return ret; | ||
| 50 | |||
| 51 | /* start new protocol */ | ||
| 52 | if (protocol == PROTO_HOST) | ||
| 53 | ret = fsm->ops->start_host(fsm, 1); | ||
| 54 | else if (protocol == PROTO_GADGET) | ||
| 55 | ret = fsm->ops->start_gadget(fsm, 1); | ||
| 56 | if (ret) | ||
| 57 | return ret; | ||
| 58 | |||
| 59 | fsm->protocol = protocol; | ||
| 60 | return 0; | ||
| 61 | } | ||
| 62 | |||
| 63 | return 0; | ||
| 64 | } | ||
| 65 | |||
| 66 | static int state_changed; | ||
| 67 | |||
| 68 | /* Called when leaving a state. Do state clean up jobs here */ | ||
| 69 | void otg_leave_state(struct otg_fsm *fsm, enum usb_otg_state old_state) | ||
| 70 | { | ||
| 71 | switch (old_state) { | ||
| 72 | case OTG_STATE_B_IDLE: | ||
| 73 | otg_del_timer(fsm, b_se0_srp_tmr); | ||
| 74 | fsm->b_se0_srp = 0; | ||
| 75 | break; | ||
| 76 | case OTG_STATE_B_SRP_INIT: | ||
| 77 | fsm->b_srp_done = 0; | ||
| 78 | break; | ||
| 79 | case OTG_STATE_B_PERIPHERAL: | ||
| 80 | break; | ||
| 81 | case OTG_STATE_B_WAIT_ACON: | ||
| 82 | otg_del_timer(fsm, b_ase0_brst_tmr); | ||
| 83 | fsm->b_ase0_brst_tmout = 0; | ||
| 84 | break; | ||
| 85 | case OTG_STATE_B_HOST: | ||
| 86 | break; | ||
| 87 | case OTG_STATE_A_IDLE: | ||
| 88 | break; | ||
| 89 | case OTG_STATE_A_WAIT_VRISE: | ||
| 90 | otg_del_timer(fsm, a_wait_vrise_tmr); | ||
| 91 | fsm->a_wait_vrise_tmout = 0; | ||
| 92 | break; | ||
| 93 | case OTG_STATE_A_WAIT_BCON: | ||
| 94 | otg_del_timer(fsm, a_wait_bcon_tmr); | ||
| 95 | fsm->a_wait_bcon_tmout = 0; | ||
| 96 | break; | ||
| 97 | case OTG_STATE_A_HOST: | ||
| 98 | otg_del_timer(fsm, a_wait_enum_tmr); | ||
| 99 | break; | ||
| 100 | case OTG_STATE_A_SUSPEND: | ||
| 101 | otg_del_timer(fsm, a_aidl_bdis_tmr); | ||
| 102 | fsm->a_aidl_bdis_tmout = 0; | ||
| 103 | fsm->a_suspend_req = 0; | ||
| 104 | break; | ||
| 105 | case OTG_STATE_A_PERIPHERAL: | ||
| 106 | break; | ||
| 107 | case OTG_STATE_A_WAIT_VFALL: | ||
| 108 | otg_del_timer(fsm, a_wait_vrise_tmr); | ||
| 109 | break; | ||
| 110 | case OTG_STATE_A_VBUS_ERR: | ||
| 111 | break; | ||
| 112 | default: | ||
| 113 | break; | ||
| 114 | } | ||
| 115 | } | ||
| 116 | |||
| 117 | /* Called when entering a state */ | ||
| 118 | int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state) | ||
| 119 | { | ||
| 120 | state_changed = 1; | ||
| 121 | if (fsm->transceiver->state == new_state) | ||
| 122 | return 0; | ||
| 123 | VDBG("Set state: %s\n", otg_state_string(new_state)); | ||
| 124 | otg_leave_state(fsm, fsm->transceiver->state); | ||
| 125 | switch (new_state) { | ||
| 126 | case OTG_STATE_B_IDLE: | ||
| 127 | otg_drv_vbus(fsm, 0); | ||
| 128 | otg_chrg_vbus(fsm, 0); | ||
| 129 | otg_loc_conn(fsm, 0); | ||
| 130 | otg_loc_sof(fsm, 0); | ||
| 131 | otg_set_protocol(fsm, PROTO_UNDEF); | ||
| 132 | otg_add_timer(fsm, b_se0_srp_tmr); | ||
| 133 | break; | ||
| 134 | case OTG_STATE_B_SRP_INIT: | ||
| 135 | otg_start_pulse(fsm); | ||
| 136 | otg_loc_sof(fsm, 0); | ||
| 137 | otg_set_protocol(fsm, PROTO_UNDEF); | ||
| 138 | otg_add_timer(fsm, b_srp_fail_tmr); | ||
| 139 | break; | ||
| 140 | case OTG_STATE_B_PERIPHERAL: | ||
| 141 | otg_chrg_vbus(fsm, 0); | ||
| 142 | otg_loc_conn(fsm, 1); | ||
| 143 | otg_loc_sof(fsm, 0); | ||
| 144 | otg_set_protocol(fsm, PROTO_GADGET); | ||
| 145 | break; | ||
| 146 | case OTG_STATE_B_WAIT_ACON: | ||
| 147 | otg_chrg_vbus(fsm, 0); | ||
| 148 | otg_loc_conn(fsm, 0); | ||
| 149 | otg_loc_sof(fsm, 0); | ||
| 150 | otg_set_protocol(fsm, PROTO_HOST); | ||
| 151 | otg_add_timer(fsm, b_ase0_brst_tmr); | ||
| 152 | fsm->a_bus_suspend = 0; | ||
| 153 | break; | ||
| 154 | case OTG_STATE_B_HOST: | ||
| 155 | otg_chrg_vbus(fsm, 0); | ||
| 156 | otg_loc_conn(fsm, 0); | ||
| 157 | otg_loc_sof(fsm, 1); | ||
| 158 | otg_set_protocol(fsm, PROTO_HOST); | ||
| 159 | usb_bus_start_enum(fsm->transceiver->host, | ||
| 160 | fsm->transceiver->host->otg_port); | ||
| 161 | break; | ||
| 162 | case OTG_STATE_A_IDLE: | ||
| 163 | otg_drv_vbus(fsm, 0); | ||
| 164 | otg_chrg_vbus(fsm, 0); | ||
| 165 | otg_loc_conn(fsm, 0); | ||
| 166 | otg_loc_sof(fsm, 0); | ||
| 167 | otg_set_protocol(fsm, PROTO_HOST); | ||
| 168 | break; | ||
| 169 | case OTG_STATE_A_WAIT_VRISE: | ||
| 170 | otg_drv_vbus(fsm, 1); | ||
| 171 | otg_loc_conn(fsm, 0); | ||
| 172 | otg_loc_sof(fsm, 0); | ||
| 173 | otg_set_protocol(fsm, PROTO_HOST); | ||
| 174 | otg_add_timer(fsm, a_wait_vrise_tmr); | ||
| 175 | break; | ||
| 176 | case OTG_STATE_A_WAIT_BCON: | ||
| 177 | otg_drv_vbus(fsm, 1); | ||
| 178 | otg_loc_conn(fsm, 0); | ||
| 179 | otg_loc_sof(fsm, 0); | ||
| 180 | otg_set_protocol(fsm, PROTO_HOST); | ||
| 181 | otg_add_timer(fsm, a_wait_bcon_tmr); | ||
| 182 | break; | ||
| 183 | case OTG_STATE_A_HOST: | ||
| 184 | otg_drv_vbus(fsm, 1); | ||
| 185 | otg_loc_conn(fsm, 0); | ||
| 186 | otg_loc_sof(fsm, 1); | ||
| 187 | otg_set_protocol(fsm, PROTO_HOST); | ||
| 188 | /* | ||
| 189 | * When HNP is triggered while a_bus_req = 0, a_host will | ||
| 190 | * suspend too fast to complete a_set_b_hnp_en | ||
| 191 | */ | ||
| 192 | if (!fsm->a_bus_req || fsm->a_suspend_req) | ||
| 193 | otg_add_timer(fsm, a_wait_enum_tmr); | ||
| 194 | break; | ||
| 195 | case OTG_STATE_A_SUSPEND: | ||
| 196 | otg_drv_vbus(fsm, 1); | ||
| 197 | otg_loc_conn(fsm, 0); | ||
| 198 | otg_loc_sof(fsm, 0); | ||
| 199 | otg_set_protocol(fsm, PROTO_HOST); | ||
| 200 | otg_add_timer(fsm, a_aidl_bdis_tmr); | ||
| 201 | |||
| 202 | break; | ||
| 203 | case OTG_STATE_A_PERIPHERAL: | ||
| 204 | otg_loc_conn(fsm, 1); | ||
| 205 | otg_loc_sof(fsm, 0); | ||
| 206 | otg_set_protocol(fsm, PROTO_GADGET); | ||
| 207 | otg_drv_vbus(fsm, 1); | ||
| 208 | break; | ||
| 209 | case OTG_STATE_A_WAIT_VFALL: | ||
| 210 | otg_drv_vbus(fsm, 0); | ||
| 211 | otg_loc_conn(fsm, 0); | ||
| 212 | otg_loc_sof(fsm, 0); | ||
| 213 | otg_set_protocol(fsm, PROTO_HOST); | ||
| 214 | break; | ||
| 215 | case OTG_STATE_A_VBUS_ERR: | ||
| 216 | otg_drv_vbus(fsm, 0); | ||
| 217 | otg_loc_conn(fsm, 0); | ||
| 218 | otg_loc_sof(fsm, 0); | ||
| 219 | otg_set_protocol(fsm, PROTO_UNDEF); | ||
| 220 | break; | ||
| 221 | default: | ||
| 222 | break; | ||
| 223 | } | ||
| 224 | |||
| 225 | fsm->transceiver->state = new_state; | ||
| 226 | return 0; | ||
| 227 | } | ||
| 228 | |||
| 229 | /* State change judgement */ | ||
| 230 | int otg_statemachine(struct otg_fsm *fsm) | ||
| 231 | { | ||
| 232 | enum usb_otg_state state; | ||
| 233 | unsigned long flags; | ||
| 234 | |||
| 235 | spin_lock_irqsave(&fsm->lock, flags); | ||
| 236 | |||
| 237 | state = fsm->transceiver->state; | ||
| 238 | state_changed = 0; | ||
| 239 | /* State machine state change judgement */ | ||
| 240 | |||
| 241 | switch (state) { | ||
| 242 | case OTG_STATE_UNDEFINED: | ||
| 243 | VDBG("fsm->id = %d\n", fsm->id); | ||
| 244 | if (fsm->id) | ||
| 245 | otg_set_state(fsm, OTG_STATE_B_IDLE); | ||
| 246 | else | ||
| 247 | otg_set_state(fsm, OTG_STATE_A_IDLE); | ||
| 248 | break; | ||
| 249 | case OTG_STATE_B_IDLE: | ||
| 250 | if (!fsm->id) | ||
| 251 | otg_set_state(fsm, OTG_STATE_A_IDLE); | ||
| 252 | else if (fsm->b_sess_vld && fsm->transceiver->gadget) | ||
| 253 | otg_set_state(fsm, OTG_STATE_B_PERIPHERAL); | ||
| 254 | else if (fsm->b_bus_req && fsm->b_sess_end && fsm->b_se0_srp) | ||
| 255 | otg_set_state(fsm, OTG_STATE_B_SRP_INIT); | ||
| 256 | break; | ||
| 257 | case OTG_STATE_B_SRP_INIT: | ||
| 258 | if (!fsm->id || fsm->b_srp_done) | ||
| 259 | otg_set_state(fsm, OTG_STATE_B_IDLE); | ||
| 260 | break; | ||
| 261 | case OTG_STATE_B_PERIPHERAL: | ||
| 262 | if (!fsm->id || !fsm->b_sess_vld) | ||
| 263 | otg_set_state(fsm, OTG_STATE_B_IDLE); | ||
| 264 | else if (fsm->b_bus_req && fsm->transceiver-> | ||
| 265 | gadget->b_hnp_enable && fsm->a_bus_suspend) | ||
| 266 | otg_set_state(fsm, OTG_STATE_B_WAIT_ACON); | ||
| 267 | break; | ||
| 268 | case OTG_STATE_B_WAIT_ACON: | ||
| 269 | if (fsm->a_conn) | ||
| 270 | otg_set_state(fsm, OTG_STATE_B_HOST); | ||
| 271 | else if (!fsm->id || !fsm->b_sess_vld) | ||
| 272 | otg_set_state(fsm, OTG_STATE_B_IDLE); | ||
| 273 | else if (fsm->a_bus_resume || fsm->b_ase0_brst_tmout) { | ||
| 274 | fsm->b_ase0_brst_tmout = 0; | ||
| 275 | otg_set_state(fsm, OTG_STATE_B_PERIPHERAL); | ||
| 276 | } | ||
| 277 | break; | ||
| 278 | case OTG_STATE_B_HOST: | ||
| 279 | if (!fsm->id || !fsm->b_sess_vld) | ||
| 280 | otg_set_state(fsm, OTG_STATE_B_IDLE); | ||
| 281 | else if (!fsm->b_bus_req || !fsm->a_conn) | ||
| 282 | otg_set_state(fsm, OTG_STATE_B_PERIPHERAL); | ||
| 283 | break; | ||
| 284 | case OTG_STATE_A_IDLE: | ||
| 285 | if (fsm->id) | ||
| 286 | otg_set_state(fsm, OTG_STATE_B_IDLE); | ||
| 287 | else if (!fsm->a_bus_drop && (fsm->a_bus_req || fsm->a_srp_det)) | ||
| 288 | otg_set_state(fsm, OTG_STATE_A_WAIT_VRISE); | ||
| 289 | break; | ||
| 290 | case OTG_STATE_A_WAIT_VRISE: | ||
| 291 | if (fsm->id || fsm->a_bus_drop || fsm->a_vbus_vld || | ||
| 292 | fsm->a_wait_vrise_tmout) { | ||
| 293 | otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); | ||
| 294 | } | ||
| 295 | break; | ||
| 296 | case OTG_STATE_A_WAIT_BCON: | ||
| 297 | if (!fsm->a_vbus_vld) | ||
| 298 | otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); | ||
| 299 | else if (fsm->b_conn) | ||
| 300 | otg_set_state(fsm, OTG_STATE_A_HOST); | ||
| 301 | else if (fsm->id | fsm->a_bus_drop | fsm->a_wait_bcon_tmout) | ||
| 302 | otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); | ||
| 303 | break; | ||
| 304 | case OTG_STATE_A_HOST: | ||
| 305 | if ((!fsm->a_bus_req || fsm->a_suspend_req) && | ||
| 306 | fsm->transceiver->host->b_hnp_enable) | ||
| 307 | otg_set_state(fsm, OTG_STATE_A_SUSPEND); | ||
| 308 | else if (fsm->id || !fsm->b_conn || fsm->a_bus_drop) | ||
| 309 | otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); | ||
| 310 | else if (!fsm->a_vbus_vld) | ||
| 311 | otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); | ||
| 312 | break; | ||
| 313 | case OTG_STATE_A_SUSPEND: | ||
| 314 | if (!fsm->b_conn && fsm->transceiver->host->b_hnp_enable) | ||
| 315 | otg_set_state(fsm, OTG_STATE_A_PERIPHERAL); | ||
| 316 | else if (!fsm->b_conn && !fsm->transceiver->host->b_hnp_enable) | ||
| 317 | otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); | ||
| 318 | else if (fsm->a_bus_req || fsm->b_bus_resume) | ||
| 319 | otg_set_state(fsm, OTG_STATE_A_HOST); | ||
| 320 | else if (fsm->id || fsm->a_bus_drop || fsm->a_aidl_bdis_tmout) | ||
| 321 | otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); | ||
| 322 | else if (!fsm->a_vbus_vld) | ||
| 323 | otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); | ||
| 324 | break; | ||
| 325 | case OTG_STATE_A_PERIPHERAL: | ||
| 326 | if (fsm->id || fsm->a_bus_drop) | ||
| 327 | otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); | ||
| 328 | else if (fsm->b_bus_suspend) | ||
| 329 | otg_set_state(fsm, OTG_STATE_A_WAIT_BCON); | ||
| 330 | else if (!fsm->a_vbus_vld) | ||
| 331 | otg_set_state(fsm, OTG_STATE_A_VBUS_ERR); | ||
| 332 | break; | ||
| 333 | case OTG_STATE_A_WAIT_VFALL: | ||
| 334 | if (fsm->id || fsm->a_bus_req || (!fsm->a_sess_vld && | ||
| 335 | !fsm->b_conn)) | ||
| 336 | otg_set_state(fsm, OTG_STATE_A_IDLE); | ||
| 337 | break; | ||
| 338 | case OTG_STATE_A_VBUS_ERR: | ||
| 339 | if (fsm->id || fsm->a_bus_drop || fsm->a_clr_err) | ||
| 340 | otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL); | ||
| 341 | break; | ||
| 342 | default: | ||
| 343 | break; | ||
| 344 | } | ||
| 345 | spin_unlock_irqrestore(&fsm->lock, flags); | ||
| 346 | |||
| 347 | VDBG("quit statemachine, changed = %d\n", state_changed); | ||
| 348 | return state_changed; | ||
| 349 | } | ||
diff --git a/drivers/usb/otg/otg_fsm.h b/drivers/usb/otg/otg_fsm.h new file mode 100644 index 00000000000..0cecf1d593a --- /dev/null +++ b/drivers/usb/otg/otg_fsm.h | |||
| @@ -0,0 +1,154 @@ | |||
| 1 | /* Copyright (C) 2007,2008 Freescale Semiconductor, Inc. | ||
| 2 | * | ||
| 3 | * This program is free software; you can redistribute it and/or modify it | ||
| 4 | * under the terms of the GNU General Public License as published by the | ||
| 5 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 6 | * option) any later version. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope that it will be useful, but | ||
| 9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 11 | * General Public License for more details. | ||
| 12 | * | ||
| 13 | * You should have received a copy of the GNU General Public License along | ||
| 14 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 15 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 16 | */ | ||
| 17 | |||
| 18 | #undef DEBUG | ||
| 19 | #undef VERBOSE | ||
| 20 | |||
| 21 | #ifdef DEBUG | ||
| 22 | #define DBG(fmt, args...) printk(KERN_DEBUG "[%s] " fmt , \ | ||
| 23 | __func__, ## args) | ||
| 24 | #else | ||
| 25 | #define DBG(fmt, args...) do {} while (0) | ||
| 26 | #endif | ||
| 27 | |||
| 28 | #ifdef VERBOSE | ||
| 29 | #define VDBG DBG | ||
| 30 | #else | ||
| 31 | #define VDBG(stuff...) do {} while (0) | ||
| 32 | #endif | ||
| 33 | |||
| 34 | #ifdef VERBOSE | ||
| 35 | #define MPC_LOC printk("Current Location [%s]:[%d]\n", __FILE__, __LINE__) | ||
| 36 | #else | ||
| 37 | #define MPC_LOC do {} while (0) | ||
| 38 | #endif | ||
| 39 | |||
| 40 | #define PROTO_UNDEF (0) | ||
| 41 | #define PROTO_HOST (1) | ||
| 42 | #define PROTO_GADGET (2) | ||
| 43 | |||
| 44 | /* OTG state machine according to the OTG spec */ | ||
| 45 | struct otg_fsm { | ||
| 46 | /* Input */ | ||
| 47 | int a_bus_resume; | ||
| 48 | int a_bus_suspend; | ||
| 49 | int a_conn; | ||
| 50 | int a_sess_vld; | ||
| 51 | int a_srp_det; | ||
| 52 | int a_vbus_vld; | ||
| 53 | int b_bus_resume; | ||
| 54 | int b_bus_suspend; | ||
| 55 | int b_conn; | ||
| 56 | int b_se0_srp; | ||
| 57 | int b_sess_end; | ||
| 58 | int b_sess_vld; | ||
| 59 | int id; | ||
| 60 | |||
| 61 | /* Internal variables */ | ||
| 62 | int a_set_b_hnp_en; | ||
| 63 | int b_srp_done; | ||
| 64 | int b_hnp_enable; | ||
| 65 | |||
| 66 | /* Timeout indicator for timers */ | ||
| 67 | int a_wait_vrise_tmout; | ||
| 68 | int a_wait_bcon_tmout; | ||
| 69 | int a_aidl_bdis_tmout; | ||
| 70 | int b_ase0_brst_tmout; | ||
| 71 | |||
| 72 | /* Informative variables */ | ||
| 73 | int a_bus_drop; | ||
| 74 | int a_bus_req; | ||
| 75 | int a_clr_err; | ||
| 76 | int a_suspend_req; | ||
| 77 | int b_bus_req; | ||
| 78 | |||
| 79 | /* Output */ | ||
| 80 | int drv_vbus; | ||
| 81 | int loc_conn; | ||
| 82 | int loc_sof; | ||
| 83 | |||
| 84 | struct otg_fsm_ops *ops; | ||
| 85 | struct otg_transceiver *transceiver; | ||
| 86 | |||
| 87 | /* Current usb protocol used: 0:undefine; 1:host; 2:client */ | ||
| 88 | int protocol; | ||
| 89 | spinlock_t lock; | ||
| 90 | }; | ||
| 91 | |||
| 92 | struct otg_fsm_ops { | ||
| 93 | void (*chrg_vbus)(int on); | ||
| 94 | void (*drv_vbus)(int on); | ||
| 95 | void (*loc_conn)(int on); | ||
| 96 | void (*loc_sof)(int on); | ||
| 97 | void (*start_pulse)(void); | ||
| 98 | void (*add_timer)(void *timer); | ||
| 99 | void (*del_timer)(void *timer); | ||
| 100 | int (*start_host)(struct otg_fsm *fsm, int on); | ||
| 101 | int (*start_gadget)(struct otg_fsm *fsm, int on); | ||
| 102 | }; | ||
| 103 | |||
| 104 | |||
| 105 | static inline void otg_chrg_vbus(struct otg_fsm *fsm, int on) | ||
| 106 | { | ||
| 107 | fsm->ops->chrg_vbus(on); | ||
| 108 | } | ||
| 109 | |||
| 110 | static inline void otg_drv_vbus(struct otg_fsm *fsm, int on) | ||
| 111 | { | ||
| 112 | if (fsm->drv_vbus != on) { | ||
| 113 | fsm->drv_vbus = on; | ||
| 114 | fsm->ops->drv_vbus(on); | ||
| 115 | } | ||
| 116 | } | ||
| 117 | |||
| 118 | static inline void otg_loc_conn(struct otg_fsm *fsm, int on) | ||
| 119 | { | ||
| 120 | if (fsm->loc_conn != on) { | ||
| 121 | fsm->loc_conn = on; | ||
| 122 | fsm->ops->loc_conn(on); | ||
| 123 | } | ||
| 124 | } | ||
| 125 | |||
| 126 | static inline void otg_loc_sof(struct otg_fsm *fsm, int on) | ||
| 127 | { | ||
| 128 | if (fsm->loc_sof != on) { | ||
| 129 | fsm->loc_sof = on; | ||
| 130 | fsm->ops->loc_sof(on); | ||
| 131 | } | ||
| 132 | } | ||
| 133 | |||
| 134 | static inline void otg_start_pulse(struct otg_fsm *fsm) | ||
| 135 | { | ||
| 136 | fsm->ops->start_pulse(); | ||
| 137 | } | ||
| 138 | |||
| 139 | static inline void otg_add_timer(struct otg_fsm *fsm, void *timer) | ||
| 140 | { | ||
| 141 | fsm->ops->add_timer(timer); | ||
| 142 | } | ||
| 143 | |||
| 144 | static inline void otg_del_timer(struct otg_fsm *fsm, void *timer) | ||
| 145 | { | ||
| 146 | fsm->ops->del_timer(timer); | ||
| 147 | } | ||
| 148 | |||
| 149 | int otg_statemachine(struct otg_fsm *fsm); | ||
| 150 | |||
| 151 | /* Defined by device specific driver, for different timer implementation */ | ||
| 152 | extern struct fsl_otg_timer *a_wait_vrise_tmr, *a_wait_bcon_tmr, | ||
| 153 | *a_aidl_bdis_tmr, *b_ase0_brst_tmr, *b_se0_srp_tmr, *b_srp_fail_tmr, | ||
| 154 | *a_wait_enum_tmr; | ||
diff --git a/drivers/usb/otg/twl4030-usb.c b/drivers/usb/otg/twl4030-usb.c index e01b073cc48..efeb4d1517f 100644 --- a/drivers/usb/otg/twl4030-usb.c +++ b/drivers/usb/otg/twl4030-usb.c | |||
| @@ -160,6 +160,7 @@ struct twl4030_usb { | |||
| 160 | 160 | ||
| 161 | int irq; | 161 | int irq; |
| 162 | u8 linkstat; | 162 | u8 linkstat; |
| 163 | bool vbus_supplied; | ||
| 163 | u8 asleep; | 164 | u8 asleep; |
| 164 | bool irq_enabled; | 165 | bool irq_enabled; |
| 165 | }; | 166 | }; |
| @@ -250,6 +251,8 @@ static enum usb_xceiv_events twl4030_usb_linkstat(struct twl4030_usb *twl) | |||
| 250 | int status; | 251 | int status; |
| 251 | int linkstat = USB_EVENT_NONE; | 252 | int linkstat = USB_EVENT_NONE; |
| 252 | 253 | ||
| 254 | twl->vbus_supplied = false; | ||
| 255 | |||
| 253 | /* | 256 | /* |
| 254 | * For ID/VBUS sensing, see manual section 15.4.8 ... | 257 | * For ID/VBUS sensing, see manual section 15.4.8 ... |
| 255 | * except when using only battery backup power, two | 258 | * except when using only battery backup power, two |
| @@ -265,6 +268,9 @@ static enum usb_xceiv_events twl4030_usb_linkstat(struct twl4030_usb *twl) | |||
| 265 | if (status < 0) | 268 | if (status < 0) |
| 266 | dev_err(twl->dev, "USB link status err %d\n", status); | 269 | dev_err(twl->dev, "USB link status err %d\n", status); |
| 267 | else if (status & (BIT(7) | BIT(2))) { | 270 | else if (status & (BIT(7) | BIT(2))) { |
| 271 | if (status & (BIT(7))) | ||
| 272 | twl->vbus_supplied = true; | ||
| 273 | |||
| 268 | if (status & BIT(2)) | 274 | if (status & BIT(2)) |
| 269 | linkstat = USB_EVENT_ID; | 275 | linkstat = USB_EVENT_ID; |
| 270 | else | 276 | else |
| @@ -484,7 +490,7 @@ static ssize_t twl4030_usb_vbus_show(struct device *dev, | |||
| 484 | 490 | ||
| 485 | spin_lock_irqsave(&twl->lock, flags); | 491 | spin_lock_irqsave(&twl->lock, flags); |
| 486 | ret = sprintf(buf, "%s\n", | 492 | ret = sprintf(buf, "%s\n", |
| 487 | (twl->linkstat == USB_EVENT_VBUS) ? "on" : "off"); | 493 | twl->vbus_supplied ? "on" : "off"); |
| 488 | spin_unlock_irqrestore(&twl->lock, flags); | 494 | spin_unlock_irqrestore(&twl->lock, flags); |
| 489 | 495 | ||
| 490 | return ret; | 496 | return ret; |
| @@ -608,6 +614,7 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev) | |||
| 608 | twl->otg.set_peripheral = twl4030_set_peripheral; | 614 | twl->otg.set_peripheral = twl4030_set_peripheral; |
| 609 | twl->otg.set_suspend = twl4030_set_suspend; | 615 | twl->otg.set_suspend = twl4030_set_suspend; |
| 610 | twl->usb_mode = pdata->usb_mode; | 616 | twl->usb_mode = pdata->usb_mode; |
| 617 | twl->vbus_supplied = false; | ||
| 611 | twl->asleep = 1; | 618 | twl->asleep = 1; |
| 612 | 619 | ||
| 613 | /* init spinlock for workqueue */ | 620 | /* init spinlock for workqueue */ |
diff --git a/drivers/usb/otg/twl6030-usb.c b/drivers/usb/otg/twl6030-usb.c index 8a91b4b832a..3f2e07011a4 100644 --- a/drivers/usb/otg/twl6030-usb.c +++ b/drivers/usb/otg/twl6030-usb.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <linux/err.h> | 31 | #include <linux/err.h> |
| 32 | #include <linux/notifier.h> | 32 | #include <linux/notifier.h> |
| 33 | #include <linux/slab.h> | 33 | #include <linux/slab.h> |
| 34 | #include <linux/delay.h> | ||
| 34 | 35 | ||
| 35 | /* usb register definitions */ | 36 | /* usb register definitions */ |
| 36 | #define USB_VENDOR_ID_LSB 0x00 | 37 | #define USB_VENDOR_ID_LSB 0x00 |
| @@ -101,7 +102,7 @@ struct twl6030_usb { | |||
| 101 | bool irq_enabled; | 102 | bool irq_enabled; |
| 102 | }; | 103 | }; |
| 103 | 104 | ||
| 104 | #define xceiv_to_twl(x) container_of((x), struct twl6030_usb, otg); | 105 | #define xceiv_to_twl(x) container_of((x), struct twl6030_usb, otg) |
| 105 | 106 | ||
| 106 | /*-------------------------------------------------------------------------*/ | 107 | /*-------------------------------------------------------------------------*/ |
| 107 | 108 | ||
| @@ -188,6 +189,19 @@ static int twl6030_phy_suspend(struct otg_transceiver *x, int suspend) | |||
| 188 | return 0; | 189 | return 0; |
| 189 | } | 190 | } |
| 190 | 191 | ||
| 192 | static int twl6030_start_srp(struct otg_transceiver *x) | ||
| 193 | { | ||
| 194 | struct twl6030_usb *twl = xceiv_to_twl(x); | ||
| 195 | |||
| 196 | twl6030_writeb(twl, TWL_MODULE_USB, 0x24, USB_VBUS_CTRL_SET); | ||
| 197 | twl6030_writeb(twl, TWL_MODULE_USB, 0x84, USB_VBUS_CTRL_SET); | ||
| 198 | |||
| 199 | mdelay(100); | ||
| 200 | twl6030_writeb(twl, TWL_MODULE_USB, 0xa0, USB_VBUS_CTRL_CLR); | ||
| 201 | |||
| 202 | return 0; | ||
| 203 | } | ||
| 204 | |||
| 191 | static int twl6030_usb_ldo_init(struct twl6030_usb *twl) | 205 | static int twl6030_usb_ldo_init(struct twl6030_usb *twl) |
| 192 | { | 206 | { |
| 193 | 207 | ||
| @@ -403,6 +417,7 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev) | |||
| 403 | twl->otg.init = twl6030_phy_init; | 417 | twl->otg.init = twl6030_phy_init; |
| 404 | twl->otg.shutdown = twl6030_phy_shutdown; | 418 | twl->otg.shutdown = twl6030_phy_shutdown; |
| 405 | twl->otg.set_suspend = twl6030_phy_suspend; | 419 | twl->otg.set_suspend = twl6030_phy_suspend; |
| 420 | twl->otg.start_srp = twl6030_start_srp; | ||
| 406 | 421 | ||
| 407 | /* init spinlock for workqueue */ | 422 | /* init spinlock for workqueue */ |
| 408 | spin_lock_init(&twl->lock); | 423 | spin_lock_init(&twl->lock); |
diff --git a/drivers/usb/renesas_usbhs/Kconfig b/drivers/usb/renesas_usbhs/Kconfig new file mode 100644 index 00000000000..b2e64918884 --- /dev/null +++ b/drivers/usb/renesas_usbhs/Kconfig | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | # | ||
| 2 | # Renesas USB Controller Drivers | ||
| 3 | # | ||
| 4 | |||
| 5 | config USB_RENESAS_USBHS | ||
| 6 | tristate 'Renesas USBHS controller' | ||
| 7 | depends on SUPERH || ARCH_SHMOBILE | ||
| 8 | default n | ||
| 9 | help | ||
| 10 | Renesas USBHS is a discrete USB host and peripheral controller chip | ||
| 11 | that supports both full and high speed USB 2.0 data transfers. | ||
| 12 | It has nine or more configurable endpoints, and endpoint zero. | ||
| 13 | |||
| 14 | Say "y" to link the driver statically, or "m" to build a | ||
| 15 | dynamically linked module called "renesas_usbhs" and force all | ||
| 16 | gadget drivers to also be dynamically linked. | ||
diff --git a/drivers/usb/renesas_usbhs/Makefile b/drivers/usb/renesas_usbhs/Makefile new file mode 100644 index 00000000000..b8798ad1627 --- /dev/null +++ b/drivers/usb/renesas_usbhs/Makefile | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | # | ||
| 2 | # for Renesas USB | ||
| 3 | # | ||
| 4 | |||
| 5 | obj-$(CONFIG_USB_RENESAS_USBHS) += renesas_usbhs.o | ||
| 6 | |||
| 7 | renesas_usbhs-y := common.o mod.o pipe.o | ||
| 8 | |||
| 9 | renesas_usbhs-$(CONFIG_USB_RENESAS_USBHS_UDC) += mod_gadget.o | ||
diff --git a/drivers/usb/renesas_usbhs/common.c b/drivers/usb/renesas_usbhs/common.c new file mode 100644 index 00000000000..f3664d6af66 --- /dev/null +++ b/drivers/usb/renesas_usbhs/common.c | |||
| @@ -0,0 +1,437 @@ | |||
| 1 | /* | ||
| 2 | * Renesas USB driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Renesas Solutions Corp. | ||
| 5 | * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, write to the Free Software | ||
| 14 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 15 | * | ||
| 16 | */ | ||
| 17 | #include <linux/io.h> | ||
| 18 | #include <linux/module.h> | ||
| 19 | #include <linux/pm_runtime.h> | ||
| 20 | #include <linux/slab.h> | ||
| 21 | #include <linux/sysfs.h> | ||
| 22 | #include "./common.h" | ||
| 23 | |||
| 24 | #define USBHSF_RUNTIME_PWCTRL (1 << 0) | ||
| 25 | |||
| 26 | /* status */ | ||
| 27 | #define usbhsc_flags_init(p) do {(p)->flags = 0; } while (0) | ||
| 28 | #define usbhsc_flags_set(p, b) ((p)->flags |= (b)) | ||
| 29 | #define usbhsc_flags_clr(p, b) ((p)->flags &= ~(b)) | ||
| 30 | #define usbhsc_flags_has(p, b) ((p)->flags & (b)) | ||
| 31 | |||
| 32 | /* | ||
| 33 | * platform call back | ||
| 34 | * | ||
| 35 | * renesas usb support platform callback function. | ||
| 36 | * Below macro call it. | ||
| 37 | * if platform doesn't have callback, it return 0 (no error) | ||
| 38 | */ | ||
| 39 | #define usbhs_platform_call(priv, func, args...)\ | ||
| 40 | (!(priv) ? -ENODEV : \ | ||
| 41 | !((priv)->pfunc->func) ? 0 : \ | ||
| 42 | (priv)->pfunc->func(args)) | ||
| 43 | |||
| 44 | /* | ||
| 45 | * common functions | ||
| 46 | */ | ||
| 47 | u16 usbhs_read(struct usbhs_priv *priv, u32 reg) | ||
| 48 | { | ||
| 49 | return ioread16(priv->base + reg); | ||
| 50 | } | ||
| 51 | |||
| 52 | void usbhs_write(struct usbhs_priv *priv, u32 reg, u16 data) | ||
| 53 | { | ||
| 54 | iowrite16(data, priv->base + reg); | ||
| 55 | } | ||
| 56 | |||
| 57 | void usbhs_bset(struct usbhs_priv *priv, u32 reg, u16 mask, u16 data) | ||
| 58 | { | ||
| 59 | u16 val = usbhs_read(priv, reg); | ||
| 60 | |||
| 61 | val &= ~mask; | ||
| 62 | val |= data & mask; | ||
| 63 | |||
| 64 | usbhs_write(priv, reg, val); | ||
| 65 | } | ||
| 66 | |||
| 67 | struct usbhs_priv *usbhs_pdev_to_priv(struct platform_device *pdev) | ||
| 68 | { | ||
| 69 | return dev_get_drvdata(&pdev->dev); | ||
| 70 | } | ||
| 71 | |||
| 72 | /* | ||
| 73 | * syscfg functions | ||
| 74 | */ | ||
| 75 | void usbhs_sys_clock_ctrl(struct usbhs_priv *priv, int enable) | ||
| 76 | { | ||
| 77 | usbhs_bset(priv, SYSCFG, SCKE, enable ? SCKE : 0); | ||
| 78 | } | ||
| 79 | |||
| 80 | void usbhs_sys_hispeed_ctrl(struct usbhs_priv *priv, int enable) | ||
| 81 | { | ||
| 82 | usbhs_bset(priv, SYSCFG, HSE, enable ? HSE : 0); | ||
| 83 | } | ||
| 84 | |||
| 85 | void usbhs_sys_usb_ctrl(struct usbhs_priv *priv, int enable) | ||
| 86 | { | ||
| 87 | usbhs_bset(priv, SYSCFG, USBE, enable ? USBE : 0); | ||
| 88 | } | ||
| 89 | |||
| 90 | void usbhs_sys_host_ctrl(struct usbhs_priv *priv, int enable) | ||
| 91 | { | ||
| 92 | u16 mask = DCFM | DRPD | DPRPU; | ||
| 93 | u16 val = DCFM | DRPD; | ||
| 94 | |||
| 95 | /* | ||
| 96 | * if enable | ||
| 97 | * | ||
| 98 | * - select Host mode | ||
| 99 | * - D+ Line/D- Line Pull-down | ||
| 100 | */ | ||
| 101 | usbhs_bset(priv, SYSCFG, mask, enable ? val : 0); | ||
| 102 | } | ||
| 103 | |||
| 104 | void usbhs_sys_function_ctrl(struct usbhs_priv *priv, int enable) | ||
| 105 | { | ||
| 106 | u16 mask = DCFM | DRPD | DPRPU; | ||
| 107 | u16 val = DPRPU; | ||
| 108 | |||
| 109 | /* | ||
| 110 | * if enable | ||
| 111 | * | ||
| 112 | * - select Function mode | ||
| 113 | * - D+ Line Pull-up | ||
| 114 | */ | ||
| 115 | usbhs_bset(priv, SYSCFG, mask, enable ? val : 0); | ||
| 116 | } | ||
| 117 | |||
| 118 | /* | ||
| 119 | * frame functions | ||
| 120 | */ | ||
| 121 | int usbhs_frame_get_num(struct usbhs_priv *priv) | ||
| 122 | { | ||
| 123 | return usbhs_read(priv, FRMNUM) & FRNM_MASK; | ||
| 124 | } | ||
| 125 | |||
| 126 | /* | ||
| 127 | * local functions | ||
| 128 | */ | ||
| 129 | static void usbhsc_bus_ctrl(struct usbhs_priv *priv, int enable) | ||
| 130 | { | ||
| 131 | int wait = usbhs_get_dparam(priv, buswait_bwait); | ||
| 132 | u16 data = 0; | ||
| 133 | |||
| 134 | if (enable) { | ||
| 135 | /* set bus wait if platform have */ | ||
| 136 | if (wait) | ||
| 137 | usbhs_bset(priv, BUSWAIT, 0x000F, wait); | ||
| 138 | } | ||
| 139 | usbhs_write(priv, DVSTCTR, data); | ||
| 140 | } | ||
| 141 | |||
| 142 | /* | ||
| 143 | * platform default param | ||
| 144 | */ | ||
| 145 | static u32 usbhsc_default_pipe_type[] = { | ||
| 146 | USB_ENDPOINT_XFER_CONTROL, | ||
| 147 | USB_ENDPOINT_XFER_ISOC, | ||
| 148 | USB_ENDPOINT_XFER_ISOC, | ||
| 149 | USB_ENDPOINT_XFER_BULK, | ||
| 150 | USB_ENDPOINT_XFER_BULK, | ||
| 151 | USB_ENDPOINT_XFER_BULK, | ||
| 152 | USB_ENDPOINT_XFER_INT, | ||
| 153 | USB_ENDPOINT_XFER_INT, | ||
| 154 | USB_ENDPOINT_XFER_INT, | ||
| 155 | USB_ENDPOINT_XFER_INT, | ||
| 156 | }; | ||
| 157 | |||
| 158 | /* | ||
| 159 | * power control | ||
| 160 | */ | ||
| 161 | static void usbhsc_power_ctrl(struct usbhs_priv *priv, int enable) | ||
| 162 | { | ||
| 163 | struct device *dev = usbhs_priv_to_dev(priv); | ||
| 164 | |||
| 165 | if (enable) { | ||
| 166 | /* enable PM */ | ||
| 167 | pm_runtime_get_sync(dev); | ||
| 168 | |||
| 169 | /* USB on */ | ||
| 170 | usbhs_sys_clock_ctrl(priv, enable); | ||
| 171 | usbhsc_bus_ctrl(priv, enable); | ||
| 172 | } else { | ||
| 173 | /* USB off */ | ||
| 174 | usbhsc_bus_ctrl(priv, enable); | ||
| 175 | usbhs_sys_clock_ctrl(priv, enable); | ||
| 176 | |||
| 177 | /* disable PM */ | ||
| 178 | pm_runtime_put_sync(dev); | ||
| 179 | } | ||
| 180 | } | ||
| 181 | |||
| 182 | /* | ||
| 183 | * notify hotplug | ||
| 184 | */ | ||
| 185 | static void usbhsc_notify_hotplug(struct work_struct *work) | ||
| 186 | { | ||
| 187 | struct usbhs_priv *priv = container_of(work, | ||
| 188 | struct usbhs_priv, | ||
| 189 | notify_hotplug_work.work); | ||
| 190 | struct platform_device *pdev = usbhs_priv_to_pdev(priv); | ||
| 191 | struct usbhs_mod *mod = usbhs_mod_get_current(priv); | ||
| 192 | int id; | ||
| 193 | int enable; | ||
| 194 | int ret; | ||
| 195 | |||
| 196 | /* | ||
| 197 | * get vbus status from platform | ||
| 198 | */ | ||
| 199 | enable = usbhs_platform_call(priv, get_vbus, pdev); | ||
| 200 | |||
| 201 | /* | ||
| 202 | * get id from platform | ||
| 203 | */ | ||
| 204 | id = usbhs_platform_call(priv, get_id, pdev); | ||
| 205 | |||
| 206 | if (enable && !mod) { | ||
| 207 | ret = usbhs_mod_change(priv, id); | ||
| 208 | if (ret < 0) | ||
| 209 | return; | ||
| 210 | |||
| 211 | dev_dbg(&pdev->dev, "%s enable\n", __func__); | ||
| 212 | |||
| 213 | /* power on */ | ||
| 214 | if (usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL)) | ||
| 215 | usbhsc_power_ctrl(priv, enable); | ||
| 216 | |||
| 217 | /* module start */ | ||
| 218 | usbhs_mod_call(priv, start, priv); | ||
| 219 | |||
| 220 | } else if (!enable && mod) { | ||
| 221 | dev_dbg(&pdev->dev, "%s disable\n", __func__); | ||
| 222 | |||
| 223 | /* module stop */ | ||
| 224 | usbhs_mod_call(priv, stop, priv); | ||
| 225 | |||
| 226 | /* power off */ | ||
| 227 | if (usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL)) | ||
| 228 | usbhsc_power_ctrl(priv, enable); | ||
| 229 | |||
| 230 | usbhs_mod_change(priv, -1); | ||
| 231 | |||
| 232 | /* reset phy for next connection */ | ||
| 233 | usbhs_platform_call(priv, phy_reset, pdev); | ||
| 234 | } | ||
| 235 | } | ||
| 236 | |||
| 237 | int usbhsc_drvcllbck_notify_hotplug(struct platform_device *pdev) | ||
| 238 | { | ||
| 239 | struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev); | ||
| 240 | int delay = usbhs_get_dparam(priv, detection_delay); | ||
| 241 | |||
| 242 | /* | ||
| 243 | * This functions will be called in interrupt. | ||
| 244 | * To make sure safety context, | ||
| 245 | * use workqueue for usbhs_notify_hotplug | ||
| 246 | */ | ||
| 247 | schedule_delayed_work(&priv->notify_hotplug_work, delay); | ||
| 248 | return 0; | ||
| 249 | } | ||
| 250 | |||
| 251 | /* | ||
| 252 | * platform functions | ||
| 253 | */ | ||
| 254 | static int __devinit usbhs_probe(struct platform_device *pdev) | ||
| 255 | { | ||
| 256 | struct renesas_usbhs_platform_info *info = pdev->dev.platform_data; | ||
| 257 | struct renesas_usbhs_driver_callback *dfunc; | ||
| 258 | struct usbhs_priv *priv; | ||
| 259 | struct resource *res; | ||
| 260 | unsigned int irq; | ||
| 261 | int ret; | ||
| 262 | |||
| 263 | /* check platform information */ | ||
| 264 | if (!info || | ||
| 265 | !info->platform_callback.get_id) { | ||
| 266 | dev_err(&pdev->dev, "no platform information\n"); | ||
| 267 | return -EINVAL; | ||
| 268 | } | ||
| 269 | |||
| 270 | /* platform data */ | ||
| 271 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 272 | irq = platform_get_irq(pdev, 0); | ||
| 273 | if (!res || (int)irq <= 0) { | ||
| 274 | dev_err(&pdev->dev, "Not enough Renesas USB platform resources.\n"); | ||
| 275 | return -ENODEV; | ||
| 276 | } | ||
| 277 | |||
| 278 | /* usb private data */ | ||
| 279 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | ||
| 280 | if (!priv) { | ||
| 281 | dev_err(&pdev->dev, "Could not allocate priv\n"); | ||
| 282 | return -ENOMEM; | ||
| 283 | } | ||
| 284 | |||
| 285 | priv->base = ioremap_nocache(res->start, resource_size(res)); | ||
| 286 | if (!priv->base) { | ||
| 287 | dev_err(&pdev->dev, "ioremap error.\n"); | ||
| 288 | ret = -ENOMEM; | ||
| 289 | goto probe_end_kfree; | ||
| 290 | } | ||
| 291 | |||
| 292 | /* | ||
| 293 | * care platform info | ||
| 294 | */ | ||
| 295 | priv->pfunc = &info->platform_callback; | ||
| 296 | priv->dparam = &info->driver_param; | ||
| 297 | |||
| 298 | /* set driver callback functions for platform */ | ||
| 299 | dfunc = &info->driver_callback; | ||
| 300 | dfunc->notify_hotplug = usbhsc_drvcllbck_notify_hotplug; | ||
| 301 | |||
| 302 | /* set default param if platform doesn't have */ | ||
| 303 | if (!priv->dparam->pipe_type) { | ||
| 304 | priv->dparam->pipe_type = usbhsc_default_pipe_type; | ||
| 305 | priv->dparam->pipe_size = ARRAY_SIZE(usbhsc_default_pipe_type); | ||
| 306 | } | ||
| 307 | |||
| 308 | /* FIXME */ | ||
| 309 | /* runtime power control ? */ | ||
| 310 | if (priv->pfunc->get_vbus) | ||
| 311 | usbhsc_flags_set(priv, USBHSF_RUNTIME_PWCTRL); | ||
| 312 | |||
| 313 | /* | ||
| 314 | * priv settings | ||
| 315 | */ | ||
| 316 | priv->irq = irq; | ||
| 317 | priv->pdev = pdev; | ||
| 318 | INIT_DELAYED_WORK(&priv->notify_hotplug_work, usbhsc_notify_hotplug); | ||
| 319 | spin_lock_init(usbhs_priv_to_lock(priv)); | ||
| 320 | |||
| 321 | /* call pipe and module init */ | ||
| 322 | ret = usbhs_pipe_probe(priv); | ||
| 323 | if (ret < 0) | ||
| 324 | goto probe_end_iounmap; | ||
| 325 | |||
| 326 | ret = usbhs_mod_probe(priv); | ||
| 327 | if (ret < 0) | ||
| 328 | goto probe_end_pipe_exit; | ||
| 329 | |||
| 330 | /* dev_set_drvdata should be called after usbhs_mod_init */ | ||
| 331 | dev_set_drvdata(&pdev->dev, priv); | ||
| 332 | |||
| 333 | /* | ||
| 334 | * deviece reset here because | ||
| 335 | * USB device might be used in boot loader. | ||
| 336 | */ | ||
| 337 | usbhs_sys_clock_ctrl(priv, 0); | ||
| 338 | |||
| 339 | /* | ||
| 340 | * platform call | ||
| 341 | * | ||
| 342 | * USB phy setup might depend on CPU/Board. | ||
| 343 | * If platform has its callback functions, | ||
| 344 | * call it here. | ||
| 345 | */ | ||
| 346 | ret = usbhs_platform_call(priv, hardware_init, pdev); | ||
| 347 | if (ret < 0) { | ||
| 348 | dev_err(&pdev->dev, "platform prove failed.\n"); | ||
| 349 | goto probe_end_mod_exit; | ||
| 350 | } | ||
| 351 | |||
| 352 | /* reset phy for connection */ | ||
| 353 | usbhs_platform_call(priv, phy_reset, pdev); | ||
| 354 | |||
| 355 | /* power control */ | ||
| 356 | pm_runtime_enable(&pdev->dev); | ||
| 357 | if (!usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL)) { | ||
| 358 | usbhsc_power_ctrl(priv, 1); | ||
| 359 | usbhs_mod_autonomy_mode(priv); | ||
| 360 | } | ||
| 361 | |||
| 362 | /* | ||
| 363 | * manual call notify_hotplug for cold plug | ||
| 364 | */ | ||
| 365 | ret = usbhsc_drvcllbck_notify_hotplug(pdev); | ||
| 366 | if (ret < 0) | ||
| 367 | goto probe_end_call_remove; | ||
| 368 | |||
| 369 | dev_info(&pdev->dev, "probed\n"); | ||
| 370 | |||
| 371 | return ret; | ||
| 372 | |||
| 373 | probe_end_call_remove: | ||
| 374 | usbhs_platform_call(priv, hardware_exit, pdev); | ||
| 375 | probe_end_mod_exit: | ||
| 376 | usbhs_mod_remove(priv); | ||
| 377 | probe_end_pipe_exit: | ||
| 378 | usbhs_pipe_remove(priv); | ||
| 379 | probe_end_iounmap: | ||
| 380 | iounmap(priv->base); | ||
| 381 | probe_end_kfree: | ||
| 382 | kfree(priv); | ||
| 383 | |||
| 384 | dev_info(&pdev->dev, "probe failed\n"); | ||
| 385 | |||
| 386 | return ret; | ||
| 387 | } | ||
| 388 | |||
| 389 | static int __devexit usbhs_remove(struct platform_device *pdev) | ||
| 390 | { | ||
| 391 | struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev); | ||
| 392 | struct renesas_usbhs_platform_info *info = pdev->dev.platform_data; | ||
| 393 | struct renesas_usbhs_driver_callback *dfunc = &info->driver_callback; | ||
| 394 | |||
| 395 | dev_dbg(&pdev->dev, "usb remove\n"); | ||
| 396 | |||
| 397 | dfunc->notify_hotplug = NULL; | ||
| 398 | |||
| 399 | /* power off */ | ||
| 400 | if (!usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL)) | ||
| 401 | usbhsc_power_ctrl(priv, 0); | ||
| 402 | |||
| 403 | pm_runtime_disable(&pdev->dev); | ||
| 404 | |||
| 405 | usbhs_platform_call(priv, hardware_exit, pdev); | ||
| 406 | usbhs_mod_remove(priv); | ||
| 407 | usbhs_pipe_remove(priv); | ||
| 408 | iounmap(priv->base); | ||
| 409 | kfree(priv); | ||
| 410 | |||
| 411 | return 0; | ||
| 412 | } | ||
| 413 | |||
| 414 | static struct platform_driver renesas_usbhs_driver = { | ||
| 415 | .driver = { | ||
| 416 | .name = "renesas_usbhs", | ||
| 417 | }, | ||
| 418 | .probe = usbhs_probe, | ||
| 419 | .remove = __devexit_p(usbhs_remove), | ||
| 420 | }; | ||
| 421 | |||
| 422 | static int __init usbhs_init(void) | ||
| 423 | { | ||
| 424 | return platform_driver_register(&renesas_usbhs_driver); | ||
| 425 | } | ||
| 426 | |||
| 427 | static void __exit usbhs_exit(void) | ||
| 428 | { | ||
| 429 | platform_driver_unregister(&renesas_usbhs_driver); | ||
| 430 | } | ||
| 431 | |||
| 432 | module_init(usbhs_init); | ||
| 433 | module_exit(usbhs_exit); | ||
| 434 | |||
| 435 | MODULE_LICENSE("GPL"); | ||
| 436 | MODULE_DESCRIPTION("Renesas USB driver"); | ||
| 437 | MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>"); | ||
diff --git a/drivers/usb/renesas_usbhs/common.h b/drivers/usb/renesas_usbhs/common.h new file mode 100644 index 00000000000..0aadcb40276 --- /dev/null +++ b/drivers/usb/renesas_usbhs/common.h | |||
| @@ -0,0 +1,230 @@ | |||
| 1 | /* | ||
| 2 | * Renesas USB driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Renesas Solutions Corp. | ||
| 5 | * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, write to the Free Software | ||
| 14 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 15 | * | ||
| 16 | */ | ||
| 17 | #ifndef RENESAS_USB_DRIVER_H | ||
| 18 | #define RENESAS_USB_DRIVER_H | ||
| 19 | |||
| 20 | #include <linux/platform_device.h> | ||
| 21 | #include <linux/usb/renesas_usbhs.h> | ||
| 22 | |||
| 23 | struct usbhs_priv; | ||
| 24 | |||
| 25 | #include "./mod.h" | ||
| 26 | #include "./pipe.h" | ||
| 27 | |||
| 28 | /* | ||
| 29 | * | ||
| 30 | * register define | ||
| 31 | * | ||
| 32 | */ | ||
| 33 | #define SYSCFG 0x0000 | ||
| 34 | #define BUSWAIT 0x0002 | ||
| 35 | #define DVSTCTR 0x0008 | ||
| 36 | #define CFIFO 0x0014 | ||
| 37 | #define CFIFOSEL 0x0020 | ||
| 38 | #define CFIFOCTR 0x0022 | ||
| 39 | #define INTENB0 0x0030 | ||
| 40 | #define INTENB1 0x0032 | ||
| 41 | #define BRDYENB 0x0036 | ||
| 42 | #define NRDYENB 0x0038 | ||
| 43 | #define BEMPENB 0x003A | ||
| 44 | #define INTSTS0 0x0040 | ||
| 45 | #define INTSTS1 0x0042 | ||
| 46 | #define BRDYSTS 0x0046 | ||
| 47 | #define NRDYSTS 0x0048 | ||
| 48 | #define BEMPSTS 0x004A | ||
| 49 | #define FRMNUM 0x004C | ||
| 50 | #define USBREQ 0x0054 /* USB request type register */ | ||
| 51 | #define USBVAL 0x0056 /* USB request value register */ | ||
| 52 | #define USBINDX 0x0058 /* USB request index register */ | ||
| 53 | #define USBLENG 0x005A /* USB request length register */ | ||
| 54 | #define DCPCFG 0x005C | ||
| 55 | #define DCPMAXP 0x005E | ||
| 56 | #define DCPCTR 0x0060 | ||
| 57 | #define PIPESEL 0x0064 | ||
| 58 | #define PIPECFG 0x0068 | ||
| 59 | #define PIPEBUF 0x006A | ||
| 60 | #define PIPEMAXP 0x006C | ||
| 61 | #define PIPEPERI 0x006E | ||
| 62 | #define PIPEnCTR 0x0070 | ||
| 63 | |||
| 64 | /* SYSCFG */ | ||
| 65 | #define SCKE (1 << 10) /* USB Module Clock Enable */ | ||
| 66 | #define HSE (1 << 7) /* High-Speed Operation Enable */ | ||
| 67 | #define DCFM (1 << 6) /* Controller Function Select */ | ||
| 68 | #define DRPD (1 << 5) /* D+ Line/D- Line Resistance Control */ | ||
| 69 | #define DPRPU (1 << 4) /* D+ Line Resistance Control */ | ||
| 70 | #define USBE (1 << 0) /* USB Module Operation Enable */ | ||
| 71 | |||
| 72 | /* DVSTCTR */ | ||
| 73 | #define EXTLP (1 << 10) /* Controls the EXTLP pin output state */ | ||
| 74 | #define PWEN (1 << 9) /* Controls the PWEN pin output state */ | ||
| 75 | #define RHST (0x7) /* Reset Handshake */ | ||
| 76 | #define RHST_LOW_SPEED 1 /* Low-speed connection */ | ||
| 77 | #define RHST_FULL_SPEED 2 /* Full-speed connection */ | ||
| 78 | #define RHST_HIGH_SPEED 3 /* High-speed connection */ | ||
| 79 | |||
| 80 | /* CFIFOSEL */ | ||
| 81 | #define MBW_32 (0x2 << 10) /* CFIFO Port Access Bit Width */ | ||
| 82 | |||
| 83 | /* CFIFOCTR */ | ||
| 84 | #define BVAL (1 << 15) /* Buffer Memory Enable Flag */ | ||
| 85 | #define BCLR (1 << 14) /* CPU buffer clear */ | ||
| 86 | #define FRDY (1 << 13) /* FIFO Port Ready */ | ||
| 87 | #define DTLN_MASK (0x0FFF) /* Receive Data Length */ | ||
| 88 | |||
| 89 | /* INTENB0 */ | ||
| 90 | #define VBSE (1 << 15) /* Enable IRQ VBUS_0 and VBUSIN_0 */ | ||
| 91 | #define RSME (1 << 14) /* Enable IRQ Resume */ | ||
| 92 | #define SOFE (1 << 13) /* Enable IRQ Frame Number Update */ | ||
| 93 | #define DVSE (1 << 12) /* Enable IRQ Device State Transition */ | ||
| 94 | #define CTRE (1 << 11) /* Enable IRQ Control Stage Transition */ | ||
| 95 | #define BEMPE (1 << 10) /* Enable IRQ Buffer Empty */ | ||
| 96 | #define NRDYE (1 << 9) /* Enable IRQ Buffer Not Ready Response */ | ||
| 97 | #define BRDYE (1 << 8) /* Enable IRQ Buffer Ready */ | ||
| 98 | |||
| 99 | /* INTENB1 */ | ||
| 100 | #define BCHGE (1 << 14) /* USB Bus Change Interrupt Enable */ | ||
| 101 | #define DTCHE (1 << 12) /* Disconnection Detect Interrupt Enable */ | ||
| 102 | #define ATTCHE (1 << 11) /* Connection Detect Interrupt Enable */ | ||
| 103 | #define EOFERRE (1 << 6) /* EOF Error Detect Interrupt Enable */ | ||
| 104 | #define SIGNE (1 << 5) /* Setup Transaction Error Interrupt Enable */ | ||
| 105 | #define SACKE (1 << 4) /* Setup Transaction ACK Interrupt Enable */ | ||
| 106 | |||
| 107 | /* INTSTS0 */ | ||
| 108 | #define VBINT (1 << 15) /* VBUS0_0 and VBUS1_0 Interrupt Status */ | ||
| 109 | #define DVST (1 << 12) /* Device State Transition Interrupt Status */ | ||
| 110 | #define CTRT (1 << 11) /* Control Stage Interrupt Status */ | ||
| 111 | #define BEMP (1 << 10) /* Buffer Empty Interrupt Status */ | ||
| 112 | #define BRDY (1 << 8) /* Buffer Ready Interrupt Status */ | ||
| 113 | #define VBSTS (1 << 7) /* VBUS_0 and VBUSIN_0 Input Status */ | ||
| 114 | #define VALID (1 << 3) /* USB Request Receive */ | ||
| 115 | |||
| 116 | #define DVSQ_MASK (0x3 << 4) /* Device State */ | ||
| 117 | #define POWER_STATE (0 << 4) | ||
| 118 | #define DEFAULT_STATE (1 << 4) | ||
| 119 | #define ADDRESS_STATE (2 << 4) | ||
| 120 | #define CONFIGURATION_STATE (3 << 4) | ||
| 121 | |||
| 122 | #define CTSQ_MASK (0x7) /* Control Transfer Stage */ | ||
| 123 | #define IDLE_SETUP_STAGE 0 /* Idle stage or setup stage */ | ||
| 124 | #define READ_DATA_STAGE 1 /* Control read data stage */ | ||
| 125 | #define READ_STATUS_STAGE 2 /* Control read status stage */ | ||
| 126 | #define WRITE_DATA_STAGE 3 /* Control write data stage */ | ||
| 127 | #define WRITE_STATUS_STAGE 4 /* Control write status stage */ | ||
| 128 | #define NODATA_STATUS_STAGE 5 /* Control write NoData status stage */ | ||
| 129 | #define SEQUENCE_ERROR 6 /* Control transfer sequence error */ | ||
| 130 | |||
| 131 | /* PIPECFG */ | ||
| 132 | /* DCPCFG */ | ||
| 133 | #define TYPE_NONE (0 << 14) /* Transfer Type */ | ||
| 134 | #define TYPE_BULK (1 << 14) | ||
| 135 | #define TYPE_INT (2 << 14) | ||
| 136 | #define TYPE_ISO (3 << 14) | ||
| 137 | #define DBLB (1 << 9) /* Double Buffer Mode */ | ||
| 138 | #define SHTNAK (1 << 7) /* Pipe Disable in Transfer End */ | ||
| 139 | #define DIR_OUT (1 << 4) /* Transfer Direction */ | ||
| 140 | |||
| 141 | /* PIPEMAXP */ | ||
| 142 | /* DCPMAXP */ | ||
| 143 | #define DEVSEL_MASK (0xF << 12) /* Device Select */ | ||
| 144 | #define DCP_MAXP_MASK (0x7F) | ||
| 145 | #define PIPE_MAXP_MASK (0x7FF) | ||
| 146 | |||
| 147 | /* PIPEBUF */ | ||
| 148 | #define BUFSIZE_SHIFT 10 | ||
| 149 | #define BUFSIZE_MASK (0x1F << BUFSIZE_SHIFT) | ||
| 150 | #define BUFNMB_MASK (0xFF) | ||
| 151 | |||
| 152 | /* PIPEnCTR */ | ||
| 153 | /* DCPCTR */ | ||
| 154 | #define BSTS (1 << 15) /* Buffer Status */ | ||
| 155 | #define CSSTS (1 << 12) /* CSSTS Status */ | ||
| 156 | #define SQCLR (1 << 8) /* Toggle Bit Clear */ | ||
| 157 | #define ACLRM (1 << 9) /* Buffer Auto-Clear Mode */ | ||
| 158 | #define PBUSY (1 << 5) /* Pipe Busy */ | ||
| 159 | #define PID_MASK (0x3) /* Response PID */ | ||
| 160 | #define PID_NAK 0 | ||
| 161 | #define PID_BUF 1 | ||
| 162 | #define PID_STALL10 2 | ||
| 163 | #define PID_STALL11 3 | ||
| 164 | |||
| 165 | #define CCPL (1 << 2) /* Control Transfer End Enable */ | ||
| 166 | |||
| 167 | /* FRMNUM */ | ||
| 168 | #define FRNM_MASK (0x7FF) | ||
| 169 | |||
| 170 | /* | ||
| 171 | * struct | ||
| 172 | */ | ||
| 173 | struct usbhs_priv { | ||
| 174 | |||
| 175 | void __iomem *base; | ||
| 176 | unsigned int irq; | ||
| 177 | |||
| 178 | struct renesas_usbhs_platform_callback *pfunc; | ||
| 179 | struct renesas_usbhs_driver_param *dparam; | ||
| 180 | |||
| 181 | struct delayed_work notify_hotplug_work; | ||
| 182 | struct platform_device *pdev; | ||
| 183 | |||
| 184 | spinlock_t lock; | ||
| 185 | |||
| 186 | u32 flags; | ||
| 187 | |||
| 188 | /* | ||
| 189 | * module control | ||
| 190 | */ | ||
| 191 | struct usbhs_mod_info mod_info; | ||
| 192 | |||
| 193 | /* | ||
| 194 | * pipe control | ||
| 195 | */ | ||
| 196 | struct usbhs_pipe_info pipe_info; | ||
| 197 | }; | ||
| 198 | |||
| 199 | /* | ||
| 200 | * common | ||
| 201 | */ | ||
| 202 | u16 usbhs_read(struct usbhs_priv *priv, u32 reg); | ||
| 203 | void usbhs_write(struct usbhs_priv *priv, u32 reg, u16 data); | ||
| 204 | void usbhs_bset(struct usbhs_priv *priv, u32 reg, u16 mask, u16 data); | ||
| 205 | |||
| 206 | int usbhsc_drvcllbck_notify_hotplug(struct platform_device *pdev); | ||
| 207 | /* | ||
| 208 | * sysconfig | ||
| 209 | */ | ||
| 210 | void usbhs_sys_clock_ctrl(struct usbhs_priv *priv, int enable); | ||
| 211 | void usbhs_sys_hispeed_ctrl(struct usbhs_priv *priv, int enable); | ||
| 212 | void usbhs_sys_usb_ctrl(struct usbhs_priv *priv, int enable); | ||
| 213 | void usbhs_sys_host_ctrl(struct usbhs_priv *priv, int enable); | ||
| 214 | void usbhs_sys_function_ctrl(struct usbhs_priv *priv, int enable); | ||
| 215 | |||
| 216 | /* | ||
| 217 | * frame | ||
| 218 | */ | ||
| 219 | int usbhs_frame_get_num(struct usbhs_priv *priv); | ||
| 220 | |||
| 221 | /* | ||
| 222 | * data | ||
| 223 | */ | ||
| 224 | struct usbhs_priv *usbhs_pdev_to_priv(struct platform_device *pdev); | ||
| 225 | #define usbhs_get_dparam(priv, param) (priv->dparam->param) | ||
| 226 | #define usbhs_priv_to_pdev(priv) (priv->pdev) | ||
| 227 | #define usbhs_priv_to_dev(priv) (&priv->pdev->dev) | ||
| 228 | #define usbhs_priv_to_lock(priv) (&priv->lock) | ||
| 229 | |||
| 230 | #endif /* RENESAS_USB_DRIVER_H */ | ||
diff --git a/drivers/usb/renesas_usbhs/mod.c b/drivers/usb/renesas_usbhs/mod.c new file mode 100644 index 00000000000..a577f8f4064 --- /dev/null +++ b/drivers/usb/renesas_usbhs/mod.c | |||
| @@ -0,0 +1,328 @@ | |||
| 1 | /* | ||
| 2 | * Renesas USB driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Renesas Solutions Corp. | ||
| 5 | * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, write to the Free Software | ||
| 14 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 15 | * | ||
| 16 | */ | ||
| 17 | #include <linux/interrupt.h> | ||
| 18 | |||
| 19 | #include "./common.h" | ||
| 20 | #include "./mod.h" | ||
| 21 | |||
| 22 | #define usbhs_priv_to_modinfo(priv) (&priv->mod_info) | ||
| 23 | #define usbhs_mod_info_call(priv, func, param...) \ | ||
| 24 | ({ \ | ||
| 25 | struct usbhs_mod_info *info; \ | ||
| 26 | info = usbhs_priv_to_modinfo(priv); \ | ||
| 27 | !info->func ? 0 : \ | ||
| 28 | info->func(param); \ | ||
| 29 | }) | ||
| 30 | |||
| 31 | /* | ||
| 32 | * autonomy | ||
| 33 | * | ||
| 34 | * these functions are used if platform doesn't have external phy. | ||
| 35 | * -> there is no "notify_hotplug" callback from platform | ||
| 36 | * -> call "notify_hotplug" by itself | ||
| 37 | * -> use own interrupt to connect/disconnect | ||
| 38 | * -> it mean module clock is always ON | ||
| 39 | * ~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| 40 | */ | ||
| 41 | static int usbhsm_autonomy_get_vbus(struct platform_device *pdev) | ||
| 42 | { | ||
| 43 | struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev); | ||
| 44 | |||
| 45 | return VBSTS & usbhs_read(priv, INTSTS0); | ||
| 46 | } | ||
| 47 | |||
| 48 | static int usbhsm_autonomy_irq_vbus(struct usbhs_priv *priv, | ||
| 49 | struct usbhs_irq_state *irq_state) | ||
| 50 | { | ||
| 51 | struct platform_device *pdev = usbhs_priv_to_pdev(priv); | ||
| 52 | |||
| 53 | return usbhsc_drvcllbck_notify_hotplug(pdev); | ||
| 54 | } | ||
| 55 | |||
| 56 | void usbhs_mod_autonomy_mode(struct usbhs_priv *priv) | ||
| 57 | { | ||
| 58 | struct usbhs_mod_info *info = usbhs_priv_to_modinfo(priv); | ||
| 59 | |||
| 60 | info->irq_vbus = usbhsm_autonomy_irq_vbus; | ||
| 61 | priv->pfunc->get_vbus = usbhsm_autonomy_get_vbus; | ||
| 62 | |||
| 63 | usbhs_irq_callback_update(priv, NULL); | ||
| 64 | } | ||
| 65 | |||
| 66 | /* | ||
| 67 | * host / gadget functions | ||
| 68 | * | ||
| 69 | * renesas_usbhs host/gadget can register itself by below functions. | ||
| 70 | * these functions are called when probe | ||
| 71 | * | ||
| 72 | */ | ||
| 73 | void usbhs_mod_register(struct usbhs_priv *priv, struct usbhs_mod *mod, int id) | ||
| 74 | { | ||
| 75 | struct usbhs_mod_info *info = usbhs_priv_to_modinfo(priv); | ||
| 76 | |||
| 77 | info->mod[id] = mod; | ||
| 78 | mod->priv = priv; | ||
| 79 | } | ||
| 80 | |||
| 81 | struct usbhs_mod *usbhs_mod_get(struct usbhs_priv *priv, int id) | ||
| 82 | { | ||
| 83 | struct usbhs_mod_info *info = usbhs_priv_to_modinfo(priv); | ||
| 84 | struct usbhs_mod *ret = NULL; | ||
| 85 | |||
| 86 | switch (id) { | ||
| 87 | case USBHS_HOST: | ||
| 88 | case USBHS_GADGET: | ||
| 89 | ret = info->mod[id]; | ||
| 90 | break; | ||
| 91 | } | ||
| 92 | |||
| 93 | return ret; | ||
| 94 | } | ||
| 95 | |||
| 96 | int usbhs_mod_is_host(struct usbhs_priv *priv, struct usbhs_mod *mod) | ||
| 97 | { | ||
| 98 | struct usbhs_mod_info *info = usbhs_priv_to_modinfo(priv); | ||
| 99 | |||
| 100 | if (!mod) | ||
| 101 | return -EINVAL; | ||
| 102 | |||
| 103 | return info->mod[USBHS_HOST] == mod; | ||
| 104 | } | ||
| 105 | |||
| 106 | struct usbhs_mod *usbhs_mod_get_current(struct usbhs_priv *priv) | ||
| 107 | { | ||
| 108 | struct usbhs_mod_info *info = usbhs_priv_to_modinfo(priv); | ||
| 109 | |||
| 110 | return info->curt; | ||
| 111 | } | ||
| 112 | |||
| 113 | int usbhs_mod_change(struct usbhs_priv *priv, int id) | ||
| 114 | { | ||
| 115 | struct usbhs_mod_info *info = usbhs_priv_to_modinfo(priv); | ||
| 116 | struct usbhs_mod *mod = NULL; | ||
| 117 | int ret = 0; | ||
| 118 | |||
| 119 | /* id < 0 mean no current */ | ||
| 120 | switch (id) { | ||
| 121 | case USBHS_HOST: | ||
| 122 | case USBHS_GADGET: | ||
| 123 | mod = info->mod[id]; | ||
| 124 | break; | ||
| 125 | default: | ||
| 126 | ret = -EINVAL; | ||
| 127 | } | ||
| 128 | info->curt = mod; | ||
| 129 | |||
| 130 | return ret; | ||
| 131 | } | ||
| 132 | |||
| 133 | static irqreturn_t usbhs_interrupt(int irq, void *data); | ||
| 134 | int usbhs_mod_probe(struct usbhs_priv *priv) | ||
| 135 | { | ||
| 136 | struct device *dev = usbhs_priv_to_dev(priv); | ||
| 137 | int ret; | ||
| 138 | |||
| 139 | /* | ||
| 140 | * install host/gadget driver | ||
| 141 | */ | ||
| 142 | ret = usbhs_mod_gadget_probe(priv); | ||
| 143 | if (ret < 0) | ||
| 144 | return ret; | ||
| 145 | |||
| 146 | /* irq settings */ | ||
| 147 | ret = request_irq(priv->irq, usbhs_interrupt, | ||
| 148 | IRQF_DISABLED, dev_name(dev), priv); | ||
| 149 | if (ret) { | ||
| 150 | dev_err(dev, "irq request err\n"); | ||
| 151 | goto mod_init_gadget_err; | ||
| 152 | } | ||
| 153 | |||
| 154 | return ret; | ||
| 155 | |||
| 156 | mod_init_gadget_err: | ||
| 157 | usbhs_mod_gadget_remove(priv); | ||
| 158 | |||
| 159 | return ret; | ||
| 160 | } | ||
| 161 | |||
| 162 | void usbhs_mod_remove(struct usbhs_priv *priv) | ||
| 163 | { | ||
| 164 | usbhs_mod_gadget_remove(priv); | ||
| 165 | free_irq(priv->irq, priv); | ||
| 166 | } | ||
| 167 | |||
| 168 | /* | ||
| 169 | * status functions | ||
| 170 | */ | ||
| 171 | int usbhs_status_get_usb_speed(struct usbhs_irq_state *irq_state) | ||
| 172 | { | ||
| 173 | switch (irq_state->dvstctr & RHST) { | ||
| 174 | case RHST_LOW_SPEED: | ||
| 175 | return USB_SPEED_LOW; | ||
| 176 | case RHST_FULL_SPEED: | ||
| 177 | return USB_SPEED_FULL; | ||
| 178 | case RHST_HIGH_SPEED: | ||
| 179 | return USB_SPEED_HIGH; | ||
| 180 | } | ||
| 181 | |||
| 182 | return USB_SPEED_UNKNOWN; | ||
| 183 | } | ||
| 184 | |||
| 185 | int usbhs_status_get_device_state(struct usbhs_irq_state *irq_state) | ||
| 186 | { | ||
| 187 | int state = irq_state->intsts0 & DVSQ_MASK; | ||
| 188 | |||
| 189 | switch (state) { | ||
| 190 | case POWER_STATE: | ||
| 191 | case DEFAULT_STATE: | ||
| 192 | case ADDRESS_STATE: | ||
| 193 | case CONFIGURATION_STATE: | ||
| 194 | return state; | ||
| 195 | } | ||
| 196 | |||
| 197 | return -EIO; | ||
| 198 | } | ||
| 199 | |||
| 200 | int usbhs_status_get_ctrl_stage(struct usbhs_irq_state *irq_state) | ||
| 201 | { | ||
| 202 | /* | ||
| 203 | * return value | ||
| 204 | * | ||
| 205 | * IDLE_SETUP_STAGE | ||
| 206 | * READ_DATA_STAGE | ||
| 207 | * READ_STATUS_STAGE | ||
| 208 | * WRITE_DATA_STAGE | ||
| 209 | * WRITE_STATUS_STAGE | ||
| 210 | * NODATA_STATUS_STAGE | ||
| 211 | * SEQUENCE_ERROR | ||
| 212 | */ | ||
| 213 | return (int)irq_state->intsts0 & CTSQ_MASK; | ||
| 214 | } | ||
| 215 | |||
| 216 | static void usbhs_status_get_each_irq(struct usbhs_priv *priv, | ||
| 217 | struct usbhs_irq_state *state) | ||
| 218 | { | ||
| 219 | struct usbhs_mod *mod = usbhs_mod_get_current(priv); | ||
| 220 | |||
| 221 | state->intsts0 = usbhs_read(priv, INTSTS0); | ||
| 222 | state->intsts1 = usbhs_read(priv, INTSTS1); | ||
| 223 | |||
| 224 | state->dvstctr = usbhs_read(priv, DVSTCTR); | ||
| 225 | |||
| 226 | /* mask */ | ||
| 227 | if (mod) { | ||
| 228 | state->brdysts = usbhs_read(priv, BRDYSTS); | ||
| 229 | state->nrdysts = usbhs_read(priv, NRDYSTS); | ||
| 230 | state->bempsts = usbhs_read(priv, BEMPSTS); | ||
| 231 | |||
| 232 | state->bempsts &= mod->irq_bempsts; | ||
| 233 | state->brdysts &= mod->irq_brdysts; | ||
| 234 | } | ||
| 235 | } | ||
| 236 | |||
| 237 | /* | ||
| 238 | * interrupt | ||
| 239 | */ | ||
| 240 | #define INTSTS0_MAGIC 0xF800 /* acknowledge magical interrupt sources */ | ||
| 241 | #define INTSTS1_MAGIC 0xA870 /* acknowledge magical interrupt sources */ | ||
| 242 | static irqreturn_t usbhs_interrupt(int irq, void *data) | ||
| 243 | { | ||
| 244 | struct usbhs_priv *priv = data; | ||
| 245 | struct usbhs_irq_state irq_state; | ||
| 246 | |||
| 247 | usbhs_status_get_each_irq(priv, &irq_state); | ||
| 248 | |||
| 249 | /* | ||
| 250 | * clear interrupt | ||
| 251 | * | ||
| 252 | * The hardware is _very_ picky to clear interrupt bit. | ||
| 253 | * Especially INTSTS0_MAGIC, INTSTS1_MAGIC value. | ||
| 254 | * | ||
| 255 | * see | ||
| 256 | * "Operation" | ||
| 257 | * - "Control Transfer (DCP)" | ||
| 258 | * - Function :: VALID bit should 0 | ||
| 259 | */ | ||
| 260 | usbhs_write(priv, INTSTS0, ~irq_state.intsts0 & INTSTS0_MAGIC); | ||
| 261 | usbhs_write(priv, INTSTS1, ~irq_state.intsts1 & INTSTS1_MAGIC); | ||
| 262 | |||
| 263 | usbhs_write(priv, BRDYSTS, 0); | ||
| 264 | usbhs_write(priv, NRDYSTS, 0); | ||
| 265 | usbhs_write(priv, BEMPSTS, 0); | ||
| 266 | |||
| 267 | /* | ||
| 268 | * call irq callback functions | ||
| 269 | * see also | ||
| 270 | * usbhs_irq_setting_update | ||
| 271 | */ | ||
| 272 | if (irq_state.intsts0 & VBINT) | ||
| 273 | usbhs_mod_info_call(priv, irq_vbus, priv, &irq_state); | ||
| 274 | |||
| 275 | if (irq_state.intsts0 & DVST) | ||
| 276 | usbhs_mod_call(priv, irq_dev_state, priv, &irq_state); | ||
| 277 | |||
| 278 | if (irq_state.intsts0 & CTRT) | ||
| 279 | usbhs_mod_call(priv, irq_ctrl_stage, priv, &irq_state); | ||
| 280 | |||
| 281 | if (irq_state.intsts0 & BEMP) | ||
| 282 | usbhs_mod_call(priv, irq_empty, priv, &irq_state); | ||
| 283 | |||
| 284 | if (irq_state.intsts0 & BRDY) | ||
| 285 | usbhs_mod_call(priv, irq_ready, priv, &irq_state); | ||
| 286 | |||
| 287 | return IRQ_HANDLED; | ||
| 288 | } | ||
| 289 | |||
| 290 | void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod) | ||
| 291 | { | ||
| 292 | u16 intenb0 = 0; | ||
| 293 | struct usbhs_mod_info *info = usbhs_priv_to_modinfo(priv); | ||
| 294 | |||
| 295 | usbhs_write(priv, INTENB0, 0); | ||
| 296 | |||
| 297 | usbhs_write(priv, BEMPENB, 0); | ||
| 298 | usbhs_write(priv, BRDYENB, 0); | ||
| 299 | |||
| 300 | /* | ||
| 301 | * see also | ||
| 302 | * usbhs_interrupt | ||
| 303 | */ | ||
| 304 | |||
| 305 | /* | ||
| 306 | * it don't enable DVSE (intenb0) here | ||
| 307 | * but "mod->irq_dev_state" will be called. | ||
| 308 | */ | ||
| 309 | if (info->irq_vbus) | ||
| 310 | intenb0 |= VBSE; | ||
| 311 | |||
| 312 | if (mod) { | ||
| 313 | if (mod->irq_ctrl_stage) | ||
| 314 | intenb0 |= CTRE; | ||
| 315 | |||
| 316 | if (mod->irq_empty && mod->irq_bempsts) { | ||
| 317 | usbhs_write(priv, BEMPENB, mod->irq_bempsts); | ||
| 318 | intenb0 |= BEMPE; | ||
| 319 | } | ||
| 320 | |||
| 321 | if (mod->irq_ready && mod->irq_brdysts) { | ||
| 322 | usbhs_write(priv, BRDYENB, mod->irq_brdysts); | ||
| 323 | intenb0 |= BRDYE; | ||
| 324 | } | ||
| 325 | } | ||
| 326 | |||
| 327 | usbhs_write(priv, INTENB0, intenb0); | ||
| 328 | } | ||
diff --git a/drivers/usb/renesas_usbhs/mod.h b/drivers/usb/renesas_usbhs/mod.h new file mode 100644 index 00000000000..5c845a28a21 --- /dev/null +++ b/drivers/usb/renesas_usbhs/mod.h | |||
| @@ -0,0 +1,137 @@ | |||
| 1 | /* | ||
| 2 | * Renesas USB driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Renesas Solutions Corp. | ||
| 5 | * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, write to the Free Software | ||
| 14 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 15 | * | ||
| 16 | */ | ||
| 17 | #ifndef RENESAS_USB_MOD_H | ||
| 18 | #define RENESAS_USB_MOD_H | ||
| 19 | |||
| 20 | #include <linux/spinlock.h> | ||
| 21 | #include <linux/usb/renesas_usbhs.h> | ||
| 22 | #include "./common.h" | ||
| 23 | |||
| 24 | /* | ||
| 25 | * struct | ||
| 26 | */ | ||
| 27 | struct usbhs_irq_state { | ||
| 28 | u16 intsts0; | ||
| 29 | u16 intsts1; | ||
| 30 | u16 brdysts; | ||
| 31 | u16 nrdysts; | ||
| 32 | u16 bempsts; | ||
| 33 | u16 dvstctr; | ||
| 34 | }; | ||
| 35 | |||
| 36 | struct usbhs_mod { | ||
| 37 | char *name; | ||
| 38 | |||
| 39 | /* | ||
| 40 | * entry point from common.c | ||
| 41 | */ | ||
| 42 | int (*start)(struct usbhs_priv *priv); | ||
| 43 | int (*stop)(struct usbhs_priv *priv); | ||
| 44 | |||
| 45 | /* INTSTS0 :: DVST (DVSQ) */ | ||
| 46 | int (*irq_dev_state)(struct usbhs_priv *priv, | ||
| 47 | struct usbhs_irq_state *irq_state); | ||
| 48 | |||
| 49 | /* INTSTS0 :: CTRT (CTSQ) */ | ||
| 50 | int (*irq_ctrl_stage)(struct usbhs_priv *priv, | ||
| 51 | struct usbhs_irq_state *irq_state); | ||
| 52 | |||
| 53 | /* INTSTS0 :: BEMP */ | ||
| 54 | /* BEMPSTS */ | ||
| 55 | int (*irq_empty)(struct usbhs_priv *priv, | ||
| 56 | struct usbhs_irq_state *irq_state); | ||
| 57 | u16 irq_bempsts; | ||
| 58 | |||
| 59 | /* INTSTS0 :: BRDY */ | ||
| 60 | /* BRDYSTS */ | ||
| 61 | int (*irq_ready)(struct usbhs_priv *priv, | ||
| 62 | struct usbhs_irq_state *irq_state); | ||
| 63 | u16 irq_brdysts; | ||
| 64 | |||
| 65 | struct usbhs_priv *priv; | ||
| 66 | }; | ||
| 67 | |||
| 68 | struct usbhs_mod_info { | ||
| 69 | struct usbhs_mod *mod[USBHS_MAX]; | ||
| 70 | struct usbhs_mod *curt; /* current mod */ | ||
| 71 | |||
| 72 | /* | ||
| 73 | * INTSTS0 :: VBINT | ||
| 74 | * | ||
| 75 | * This function will be used as autonomy mode | ||
| 76 | * when platform cannot call notify_hotplug. | ||
| 77 | * | ||
| 78 | * This callback cannot be member of "struct usbhs_mod" | ||
| 79 | * because it will be used even though | ||
| 80 | * host/gadget has not been selected. | ||
| 81 | */ | ||
| 82 | int (*irq_vbus)(struct usbhs_priv *priv, | ||
| 83 | struct usbhs_irq_state *irq_state); | ||
| 84 | }; | ||
| 85 | |||
| 86 | /* | ||
| 87 | * for host/gadget module | ||
| 88 | */ | ||
| 89 | struct usbhs_mod *usbhs_mod_get(struct usbhs_priv *priv, int id); | ||
| 90 | struct usbhs_mod *usbhs_mod_get_current(struct usbhs_priv *priv); | ||
| 91 | void usbhs_mod_register(struct usbhs_priv *priv, struct usbhs_mod *usb, int id); | ||
| 92 | int usbhs_mod_is_host(struct usbhs_priv *priv, struct usbhs_mod *mod); | ||
| 93 | int usbhs_mod_change(struct usbhs_priv *priv, int id); | ||
| 94 | int usbhs_mod_probe(struct usbhs_priv *priv); | ||
| 95 | void usbhs_mod_remove(struct usbhs_priv *priv); | ||
| 96 | |||
| 97 | void usbhs_mod_autonomy_mode(struct usbhs_priv *priv); | ||
| 98 | |||
| 99 | /* | ||
| 100 | * status functions | ||
| 101 | */ | ||
| 102 | int usbhs_status_get_usb_speed(struct usbhs_irq_state *irq_state); | ||
| 103 | int usbhs_status_get_device_state(struct usbhs_irq_state *irq_state); | ||
| 104 | int usbhs_status_get_ctrl_stage(struct usbhs_irq_state *irq_state); | ||
| 105 | |||
| 106 | /* | ||
| 107 | * callback functions | ||
| 108 | */ | ||
| 109 | void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod); | ||
| 110 | |||
| 111 | |||
| 112 | #define usbhs_mod_call(priv, func, param...) \ | ||
| 113 | ({ \ | ||
| 114 | struct usbhs_mod *mod; \ | ||
| 115 | mod = usbhs_mod_get_current(priv); \ | ||
| 116 | !mod ? -ENODEV : \ | ||
| 117 | !mod->func ? 0 : \ | ||
| 118 | mod->func(param); \ | ||
| 119 | }) | ||
| 120 | |||
| 121 | /* | ||
| 122 | * gadget control | ||
| 123 | */ | ||
| 124 | #ifdef CONFIG_USB_RENESAS_USBHS_UDC | ||
| 125 | extern int __devinit usbhs_mod_gadget_probe(struct usbhs_priv *priv); | ||
| 126 | extern void __devexit usbhs_mod_gadget_remove(struct usbhs_priv *priv); | ||
| 127 | #else | ||
| 128 | static inline int usbhs_mod_gadget_probe(struct usbhs_priv *priv) | ||
| 129 | { | ||
| 130 | return 0; | ||
| 131 | } | ||
| 132 | static inline void usbhs_mod_gadget_remove(struct usbhs_priv *priv) | ||
| 133 | { | ||
| 134 | } | ||
| 135 | #endif | ||
| 136 | |||
| 137 | #endif /* RENESAS_USB_MOD_H */ | ||
diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c new file mode 100644 index 00000000000..206cfabc928 --- /dev/null +++ b/drivers/usb/renesas_usbhs/mod_gadget.c | |||
| @@ -0,0 +1,1384 @@ | |||
| 1 | /* | ||
| 2 | * Renesas USB driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Renesas Solutions Corp. | ||
| 5 | * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, write to the Free Software | ||
| 14 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 15 | * | ||
| 16 | */ | ||
| 17 | #include <linux/io.h> | ||
| 18 | #include <linux/module.h> | ||
| 19 | #include <linux/platform_device.h> | ||
| 20 | #include <linux/usb/ch9.h> | ||
| 21 | #include <linux/usb/gadget.h> | ||
| 22 | #include "common.h" | ||
| 23 | |||
| 24 | /* | ||
| 25 | * struct | ||
| 26 | */ | ||
| 27 | struct usbhsg_request { | ||
| 28 | struct usb_request req; | ||
| 29 | struct list_head node; | ||
| 30 | }; | ||
| 31 | |||
| 32 | #define EP_NAME_SIZE 8 | ||
| 33 | struct usbhsg_gpriv; | ||
| 34 | struct usbhsg_pipe_handle; | ||
| 35 | struct usbhsg_uep { | ||
| 36 | struct usb_ep ep; | ||
| 37 | struct usbhs_pipe *pipe; | ||
| 38 | struct list_head list; | ||
| 39 | |||
| 40 | char ep_name[EP_NAME_SIZE]; | ||
| 41 | |||
| 42 | struct usbhsg_gpriv *gpriv; | ||
| 43 | struct usbhsg_pipe_handle *handler; | ||
| 44 | }; | ||
| 45 | |||
| 46 | struct usbhsg_gpriv { | ||
| 47 | struct usb_gadget gadget; | ||
| 48 | struct usbhs_mod mod; | ||
| 49 | |||
| 50 | struct usbhsg_uep *uep; | ||
| 51 | int uep_size; | ||
| 52 | |||
| 53 | struct usb_gadget_driver *driver; | ||
| 54 | |||
| 55 | u32 status; | ||
| 56 | #define USBHSG_STATUS_STARTED (1 << 0) | ||
| 57 | #define USBHSG_STATUS_REGISTERD (1 << 1) | ||
| 58 | #define USBHSG_STATUS_WEDGE (1 << 2) | ||
| 59 | }; | ||
| 60 | |||
| 61 | struct usbhsg_pipe_handle { | ||
| 62 | int (*prepare)(struct usbhsg_uep *uep, struct usbhsg_request *ureq); | ||
| 63 | int (*try_run)(struct usbhsg_uep *uep, struct usbhsg_request *ureq); | ||
| 64 | void (*irq_mask)(struct usbhsg_uep *uep, int enable); | ||
| 65 | }; | ||
| 66 | |||
| 67 | struct usbhsg_recip_handle { | ||
| 68 | char *name; | ||
| 69 | int (*device)(struct usbhs_priv *priv, struct usbhsg_uep *uep, | ||
| 70 | struct usb_ctrlrequest *ctrl); | ||
| 71 | int (*interface)(struct usbhs_priv *priv, struct usbhsg_uep *uep, | ||
| 72 | struct usb_ctrlrequest *ctrl); | ||
| 73 | int (*endpoint)(struct usbhs_priv *priv, struct usbhsg_uep *uep, | ||
| 74 | struct usb_ctrlrequest *ctrl); | ||
| 75 | }; | ||
| 76 | |||
| 77 | /* | ||
| 78 | * macro | ||
| 79 | */ | ||
| 80 | #define usbhsg_priv_to_gpriv(priv) \ | ||
| 81 | container_of( \ | ||
| 82 | usbhs_mod_get(priv, USBHS_GADGET), \ | ||
| 83 | struct usbhsg_gpriv, mod) | ||
| 84 | |||
| 85 | #define __usbhsg_for_each_uep(start, pos, g, i) \ | ||
| 86 | for (i = start, pos = (g)->uep; \ | ||
| 87 | i < (g)->uep_size; \ | ||
| 88 | i++, pos = (g)->uep + i) | ||
| 89 | |||
| 90 | #define usbhsg_for_each_uep(pos, gpriv, i) \ | ||
| 91 | __usbhsg_for_each_uep(1, pos, gpriv, i) | ||
| 92 | |||
| 93 | #define usbhsg_for_each_uep_with_dcp(pos, gpriv, i) \ | ||
| 94 | __usbhsg_for_each_uep(0, pos, gpriv, i) | ||
| 95 | |||
| 96 | #define usbhsg_gadget_to_gpriv(g)\ | ||
| 97 | container_of(g, struct usbhsg_gpriv, gadget) | ||
| 98 | |||
| 99 | #define usbhsg_req_to_ureq(r)\ | ||
| 100 | container_of(r, struct usbhsg_request, req) | ||
| 101 | |||
| 102 | #define usbhsg_ep_to_uep(e) container_of(e, struct usbhsg_uep, ep) | ||
| 103 | #define usbhsg_gpriv_to_lock(gp) usbhs_priv_to_lock((gp)->mod.priv) | ||
| 104 | #define usbhsg_gpriv_to_dev(gp) usbhs_priv_to_dev((gp)->mod.priv) | ||
| 105 | #define usbhsg_gpriv_to_priv(gp) ((gp)->mod.priv) | ||
| 106 | #define usbhsg_gpriv_to_dcp(gp) ((gp)->uep) | ||
| 107 | #define usbhsg_gpriv_to_nth_uep(gp, i) ((gp)->uep + i) | ||
| 108 | #define usbhsg_uep_to_gpriv(u) ((u)->gpriv) | ||
| 109 | #define usbhsg_uep_to_pipe(u) ((u)->pipe) | ||
| 110 | #define usbhsg_pipe_to_uep(p) ((p)->mod_private) | ||
| 111 | #define usbhsg_is_dcp(u) ((u) == usbhsg_gpriv_to_dcp((u)->gpriv)) | ||
| 112 | |||
| 113 | #define usbhsg_is_not_connected(gp) ((gp)->gadget.speed == USB_SPEED_UNKNOWN) | ||
| 114 | |||
| 115 | /* status */ | ||
| 116 | #define usbhsg_status_init(gp) do {(gp)->status = 0; } while (0) | ||
| 117 | #define usbhsg_status_set(gp, b) (gp->status |= b) | ||
| 118 | #define usbhsg_status_clr(gp, b) (gp->status &= ~b) | ||
| 119 | #define usbhsg_status_has(gp, b) (gp->status & b) | ||
| 120 | |||
| 121 | /* | ||
| 122 | * usbhsg_trylock | ||
| 123 | * | ||
| 124 | * This driver don't use spin_try_lock | ||
| 125 | * to avoid warning of CONFIG_DEBUG_SPINLOCK | ||
| 126 | */ | ||
| 127 | static spinlock_t *usbhsg_trylock(struct usbhsg_gpriv *gpriv, | ||
| 128 | unsigned long *flags) | ||
| 129 | { | ||
| 130 | spinlock_t *lock = usbhsg_gpriv_to_lock(gpriv); | ||
| 131 | |||
| 132 | /* check spin lock status | ||
| 133 | * to avoid deadlock/nest */ | ||
| 134 | if (spin_is_locked(lock)) | ||
| 135 | return NULL; | ||
| 136 | |||
| 137 | spin_lock_irqsave(lock, *flags); | ||
| 138 | |||
| 139 | return lock; | ||
| 140 | } | ||
| 141 | |||
| 142 | static void usbhsg_unlock(spinlock_t *lock, unsigned long *flags) | ||
| 143 | { | ||
| 144 | if (!lock) | ||
| 145 | return; | ||
| 146 | |||
| 147 | spin_unlock_irqrestore(lock, *flags); | ||
| 148 | } | ||
| 149 | |||
| 150 | /* | ||
| 151 | * list push/pop | ||
| 152 | */ | ||
| 153 | static void usbhsg_queue_push(struct usbhsg_uep *uep, | ||
| 154 | struct usbhsg_request *ureq) | ||
| 155 | { | ||
| 156 | struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); | ||
| 157 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 158 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); | ||
| 159 | |||
| 160 | /* | ||
| 161 | ********* assume under spin lock ********* | ||
| 162 | */ | ||
| 163 | list_del_init(&ureq->node); | ||
| 164 | list_add_tail(&ureq->node, &uep->list); | ||
| 165 | ureq->req.actual = 0; | ||
| 166 | ureq->req.status = -EINPROGRESS; | ||
| 167 | |||
| 168 | dev_dbg(dev, "pipe %d : queue push (%d)\n", | ||
| 169 | usbhs_pipe_number(pipe), | ||
| 170 | ureq->req.length); | ||
| 171 | } | ||
| 172 | |||
| 173 | static struct usbhsg_request *usbhsg_queue_get(struct usbhsg_uep *uep) | ||
| 174 | { | ||
| 175 | /* | ||
| 176 | ********* assume under spin lock ********* | ||
| 177 | */ | ||
| 178 | if (list_empty(&uep->list)) | ||
| 179 | return NULL; | ||
| 180 | |||
| 181 | return list_entry(uep->list.next, struct usbhsg_request, node); | ||
| 182 | } | ||
| 183 | |||
| 184 | #define usbhsg_queue_prepare(uep) __usbhsg_queue_handler(uep, 1); | ||
| 185 | #define usbhsg_queue_handle(uep) __usbhsg_queue_handler(uep, 0); | ||
| 186 | static int __usbhsg_queue_handler(struct usbhsg_uep *uep, int prepare) | ||
| 187 | { | ||
| 188 | struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); | ||
| 189 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 190 | struct usbhsg_request *ureq; | ||
| 191 | spinlock_t *lock; | ||
| 192 | unsigned long flags; | ||
| 193 | int ret = 0; | ||
| 194 | |||
| 195 | if (!uep->handler) { | ||
| 196 | dev_err(dev, "no handler function\n"); | ||
| 197 | return -EIO; | ||
| 198 | } | ||
| 199 | |||
| 200 | /* | ||
| 201 | * CAUTION [*queue handler*] | ||
| 202 | * | ||
| 203 | * This function will be called for start/restart queue operation. | ||
| 204 | * OTOH the most much worry for USB driver is spinlock nest. | ||
| 205 | * Specially it are | ||
| 206 | * - usb_ep_ops :: queue | ||
| 207 | * - usb_request :: complete | ||
| 208 | * | ||
| 209 | * But the caller of this function need not care about spinlock. | ||
| 210 | * This function is using usbhsg_trylock for it. | ||
| 211 | * if "is_locked" is 1, this mean this function lock it. | ||
| 212 | * but if it is 0, this mean it is already under spin lock. | ||
| 213 | * see also | ||
| 214 | * CAUTION [*endpoint queue*] | ||
| 215 | * CAUTION [*request complete*] | ||
| 216 | */ | ||
| 217 | |||
| 218 | /****************** spin try lock *******************/ | ||
| 219 | lock = usbhsg_trylock(gpriv, &flags); | ||
| 220 | |||
| 221 | ureq = usbhsg_queue_get(uep); | ||
| 222 | if (ureq) { | ||
| 223 | if (prepare) | ||
| 224 | ret = uep->handler->prepare(uep, ureq); | ||
| 225 | else | ||
| 226 | ret = uep->handler->try_run(uep, ureq); | ||
| 227 | } | ||
| 228 | usbhsg_unlock(lock, &flags); | ||
| 229 | /******************** spin unlock ******************/ | ||
| 230 | |||
| 231 | return ret; | ||
| 232 | } | ||
| 233 | |||
| 234 | static void usbhsg_queue_pop(struct usbhsg_uep *uep, | ||
| 235 | struct usbhsg_request *ureq, | ||
| 236 | int status) | ||
| 237 | { | ||
| 238 | struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); | ||
| 239 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); | ||
| 240 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 241 | |||
| 242 | /* | ||
| 243 | ********* assume under spin lock ********* | ||
| 244 | */ | ||
| 245 | |||
| 246 | /* | ||
| 247 | * CAUTION [*request complete*] | ||
| 248 | * | ||
| 249 | * There is a possibility not to be called in correct order | ||
| 250 | * if "complete" is called without spinlock. | ||
| 251 | * | ||
| 252 | * So, this function assume it is under spinlock, | ||
| 253 | * and call usb_request :: complete. | ||
| 254 | * | ||
| 255 | * But this "complete" will push next usb_request. | ||
| 256 | * It mean "usb_ep_ops :: queue" which is using spinlock is called | ||
| 257 | * under spinlock. | ||
| 258 | * | ||
| 259 | * To avoid dead-lock, this driver is using usbhsg_trylock. | ||
| 260 | * CAUTION [*endpoint queue*] | ||
| 261 | * CAUTION [*queue handler*] | ||
| 262 | */ | ||
| 263 | |||
| 264 | dev_dbg(dev, "pipe %d : queue pop\n", usbhs_pipe_number(pipe)); | ||
| 265 | |||
| 266 | list_del_init(&ureq->node); | ||
| 267 | |||
| 268 | ureq->req.status = status; | ||
| 269 | ureq->req.complete(&uep->ep, &ureq->req); | ||
| 270 | |||
| 271 | /* more request ? */ | ||
| 272 | if (0 == status) | ||
| 273 | usbhsg_queue_prepare(uep); | ||
| 274 | } | ||
| 275 | |||
| 276 | /* | ||
| 277 | * irq enable/disable function | ||
| 278 | */ | ||
| 279 | #define usbhsg_irq_callback_ctrl(uep, status, enable) \ | ||
| 280 | ({ \ | ||
| 281 | struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); \ | ||
| 282 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); \ | ||
| 283 | struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv); \ | ||
| 284 | struct usbhs_mod *mod = usbhs_mod_get_current(priv); \ | ||
| 285 | if (!mod) \ | ||
| 286 | return; \ | ||
| 287 | if (enable) \ | ||
| 288 | mod->irq_##status |= (1 << usbhs_pipe_number(pipe)); \ | ||
| 289 | else \ | ||
| 290 | mod->irq_##status &= ~(1 << usbhs_pipe_number(pipe)); \ | ||
| 291 | usbhs_irq_callback_update(priv, mod); \ | ||
| 292 | }) | ||
| 293 | |||
| 294 | static void usbhsg_irq_empty_ctrl(struct usbhsg_uep *uep, int enable) | ||
| 295 | { | ||
| 296 | usbhsg_irq_callback_ctrl(uep, bempsts, enable); | ||
| 297 | } | ||
| 298 | |||
| 299 | static void usbhsg_irq_ready_ctrl(struct usbhsg_uep *uep, int enable) | ||
| 300 | { | ||
| 301 | usbhsg_irq_callback_ctrl(uep, brdysts, enable); | ||
| 302 | } | ||
| 303 | |||
| 304 | /* | ||
| 305 | * handler function | ||
| 306 | */ | ||
| 307 | static int usbhsg_try_run_ctrl_stage_end(struct usbhsg_uep *uep, | ||
| 308 | struct usbhsg_request *ureq) | ||
| 309 | { | ||
| 310 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); | ||
| 311 | |||
| 312 | /* | ||
| 313 | ********* assume under spin lock ********* | ||
| 314 | */ | ||
| 315 | |||
| 316 | usbhs_dcp_control_transfer_done(pipe); | ||
| 317 | usbhsg_queue_pop(uep, ureq, 0); | ||
| 318 | |||
| 319 | return 0; | ||
| 320 | } | ||
| 321 | |||
| 322 | static int usbhsg_try_run_send_packet(struct usbhsg_uep *uep, | ||
| 323 | struct usbhsg_request *ureq) | ||
| 324 | { | ||
| 325 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); | ||
| 326 | struct usb_request *req = &ureq->req; | ||
| 327 | struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); | ||
| 328 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 329 | void *buf; | ||
| 330 | int remainder, send; | ||
| 331 | int is_done = 0; | ||
| 332 | int enable; | ||
| 333 | int maxp; | ||
| 334 | |||
| 335 | /* | ||
| 336 | ********* assume under spin lock ********* | ||
| 337 | */ | ||
| 338 | |||
| 339 | maxp = usbhs_pipe_get_maxpacket(pipe); | ||
| 340 | buf = req->buf + req->actual; | ||
| 341 | remainder = req->length - req->actual; | ||
| 342 | |||
| 343 | send = usbhs_fifo_write(pipe, buf, remainder); | ||
| 344 | |||
| 345 | /* | ||
| 346 | * send < 0 : pipe busy | ||
| 347 | * send = 0 : send zero packet | ||
| 348 | * send > 0 : send data | ||
| 349 | * | ||
| 350 | * send <= max_packet | ||
| 351 | */ | ||
| 352 | if (send > 0) | ||
| 353 | req->actual += send; | ||
| 354 | |||
| 355 | /* send all packet ? */ | ||
| 356 | if (send < remainder) | ||
| 357 | is_done = 0; /* there are remainder data */ | ||
| 358 | else if (send < maxp) | ||
| 359 | is_done = 1; /* short packet */ | ||
| 360 | else | ||
| 361 | is_done = !req->zero; /* send zero packet ? */ | ||
| 362 | |||
| 363 | dev_dbg(dev, " send %d (%d/ %d/ %d/ %d)\n", | ||
| 364 | usbhs_pipe_number(pipe), | ||
| 365 | remainder, send, is_done, req->zero); | ||
| 366 | |||
| 367 | /* | ||
| 368 | * enable interrupt and send again in irq handler | ||
| 369 | * if it still have remainder data which should be sent. | ||
| 370 | */ | ||
| 371 | enable = !is_done; | ||
| 372 | uep->handler->irq_mask(uep, enable); | ||
| 373 | |||
| 374 | /* | ||
| 375 | * usbhs_fifo_enable execute | ||
| 376 | * - after callback_update, | ||
| 377 | * - before queue_pop / stage_end | ||
| 378 | */ | ||
| 379 | usbhs_fifo_enable(pipe); | ||
| 380 | |||
| 381 | /* | ||
| 382 | * all data were sent ? | ||
| 383 | */ | ||
| 384 | if (is_done) { | ||
| 385 | /* it care below call in | ||
| 386 | "function mode" */ | ||
| 387 | if (usbhsg_is_dcp(uep)) | ||
| 388 | usbhs_dcp_control_transfer_done(pipe); | ||
| 389 | |||
| 390 | usbhsg_queue_pop(uep, ureq, 0); | ||
| 391 | } | ||
| 392 | |||
| 393 | return 0; | ||
| 394 | } | ||
| 395 | |||
| 396 | static int usbhsg_prepare_send_packet(struct usbhsg_uep *uep, | ||
| 397 | struct usbhsg_request *ureq) | ||
| 398 | { | ||
| 399 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); | ||
| 400 | |||
| 401 | /* | ||
| 402 | ********* assume under spin lock ********* | ||
| 403 | */ | ||
| 404 | |||
| 405 | usbhs_fifo_prepare_write(pipe); | ||
| 406 | usbhsg_try_run_send_packet(uep, ureq); | ||
| 407 | |||
| 408 | return 0; | ||
| 409 | } | ||
| 410 | |||
| 411 | static int usbhsg_try_run_receive_packet(struct usbhsg_uep *uep, | ||
| 412 | struct usbhsg_request *ureq) | ||
| 413 | { | ||
| 414 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); | ||
| 415 | struct usb_request *req = &ureq->req; | ||
| 416 | struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); | ||
| 417 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 418 | void *buf; | ||
| 419 | int maxp; | ||
| 420 | int remainder, recv; | ||
| 421 | int is_done = 0; | ||
| 422 | |||
| 423 | /* | ||
| 424 | ********* assume under spin lock ********* | ||
| 425 | */ | ||
| 426 | |||
| 427 | maxp = usbhs_pipe_get_maxpacket(pipe); | ||
| 428 | buf = req->buf + req->actual; | ||
| 429 | remainder = req->length - req->actual; | ||
| 430 | |||
| 431 | recv = usbhs_fifo_read(pipe, buf, remainder); | ||
| 432 | /* | ||
| 433 | * recv < 0 : pipe busy | ||
| 434 | * recv >= 0 : receive data | ||
| 435 | * | ||
| 436 | * recv <= max_packet | ||
| 437 | */ | ||
| 438 | if (recv < 0) | ||
| 439 | return -EBUSY; | ||
| 440 | |||
| 441 | /* update parameters */ | ||
| 442 | req->actual += recv; | ||
| 443 | |||
| 444 | if ((recv == remainder) || /* receive all data */ | ||
| 445 | (recv < maxp)) /* short packet */ | ||
| 446 | is_done = 1; | ||
| 447 | |||
| 448 | dev_dbg(dev, " recv %d (%d/ %d/ %d/ %d)\n", | ||
| 449 | usbhs_pipe_number(pipe), | ||
| 450 | remainder, recv, is_done, req->zero); | ||
| 451 | |||
| 452 | /* read all data ? */ | ||
| 453 | if (is_done) { | ||
| 454 | int disable = 0; | ||
| 455 | |||
| 456 | uep->handler->irq_mask(uep, disable); | ||
| 457 | usbhs_fifo_disable(pipe); | ||
| 458 | usbhsg_queue_pop(uep, ureq, 0); | ||
| 459 | } | ||
| 460 | |||
| 461 | return 0; | ||
| 462 | } | ||
| 463 | |||
| 464 | static int usbhsg_prepare_receive_packet(struct usbhsg_uep *uep, | ||
| 465 | struct usbhsg_request *ureq) | ||
| 466 | { | ||
| 467 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); | ||
| 468 | int enable = 1; | ||
| 469 | int ret; | ||
| 470 | |||
| 471 | /* | ||
| 472 | ********* assume under spin lock ********* | ||
| 473 | */ | ||
| 474 | |||
| 475 | ret = usbhs_fifo_prepare_read(pipe); | ||
| 476 | if (ret < 0) | ||
| 477 | return ret; | ||
| 478 | |||
| 479 | /* | ||
| 480 | * data will be read in interrupt handler | ||
| 481 | */ | ||
| 482 | uep->handler->irq_mask(uep, enable); | ||
| 483 | |||
| 484 | return ret; | ||
| 485 | } | ||
| 486 | |||
| 487 | static struct usbhsg_pipe_handle usbhsg_handler_send_by_empty = { | ||
| 488 | .prepare = usbhsg_prepare_send_packet, | ||
| 489 | .try_run = usbhsg_try_run_send_packet, | ||
| 490 | .irq_mask = usbhsg_irq_empty_ctrl, | ||
| 491 | }; | ||
| 492 | |||
| 493 | static struct usbhsg_pipe_handle usbhsg_handler_send_by_ready = { | ||
| 494 | .prepare = usbhsg_prepare_send_packet, | ||
| 495 | .try_run = usbhsg_try_run_send_packet, | ||
| 496 | .irq_mask = usbhsg_irq_ready_ctrl, | ||
| 497 | }; | ||
| 498 | |||
| 499 | static struct usbhsg_pipe_handle usbhsg_handler_recv_by_ready = { | ||
| 500 | .prepare = usbhsg_prepare_receive_packet, | ||
| 501 | .try_run = usbhsg_try_run_receive_packet, | ||
| 502 | .irq_mask = usbhsg_irq_ready_ctrl, | ||
| 503 | }; | ||
| 504 | |||
| 505 | static struct usbhsg_pipe_handle usbhsg_handler_ctrl_stage_end = { | ||
| 506 | .prepare = usbhsg_try_run_ctrl_stage_end, | ||
| 507 | .try_run = usbhsg_try_run_ctrl_stage_end, | ||
| 508 | }; | ||
| 509 | |||
| 510 | /* | ||
| 511 | * DCP pipe can NOT use "ready interrupt" for "send" | ||
| 512 | * it should use "empty" interrupt. | ||
| 513 | * see | ||
| 514 | * "Operation" - "Interrupt Function" - "BRDY Interrupt" | ||
| 515 | * | ||
| 516 | * on the other hand, normal pipe can use "ready interrupt" for "send" | ||
| 517 | * even though it is single/double buffer | ||
| 518 | */ | ||
| 519 | #define usbhsg_handler_send_ctrl usbhsg_handler_send_by_empty | ||
| 520 | #define usbhsg_handler_recv_ctrl usbhsg_handler_recv_by_ready | ||
| 521 | |||
| 522 | #define usbhsg_handler_send_packet usbhsg_handler_send_by_ready | ||
| 523 | #define usbhsg_handler_recv_packet usbhsg_handler_recv_by_ready | ||
| 524 | |||
| 525 | /* | ||
| 526 | * USB_TYPE_STANDARD / clear feature functions | ||
| 527 | */ | ||
| 528 | static int usbhsg_recip_handler_std_control_done(struct usbhs_priv *priv, | ||
| 529 | struct usbhsg_uep *uep, | ||
| 530 | struct usb_ctrlrequest *ctrl) | ||
| 531 | { | ||
| 532 | struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); | ||
| 533 | struct usbhsg_uep *dcp = usbhsg_gpriv_to_dcp(gpriv); | ||
| 534 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(dcp); | ||
| 535 | |||
| 536 | usbhs_dcp_control_transfer_done(pipe); | ||
| 537 | |||
| 538 | return 0; | ||
| 539 | } | ||
| 540 | |||
| 541 | static int usbhsg_recip_handler_std_clear_endpoint(struct usbhs_priv *priv, | ||
| 542 | struct usbhsg_uep *uep, | ||
| 543 | struct usb_ctrlrequest *ctrl) | ||
| 544 | { | ||
| 545 | struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); | ||
| 546 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); | ||
| 547 | |||
| 548 | if (!usbhsg_status_has(gpriv, USBHSG_STATUS_WEDGE)) { | ||
| 549 | usbhs_fifo_disable(pipe); | ||
| 550 | usbhs_pipe_clear_sequence(pipe); | ||
| 551 | usbhs_fifo_enable(pipe); | ||
| 552 | } | ||
| 553 | |||
| 554 | usbhsg_recip_handler_std_control_done(priv, uep, ctrl); | ||
| 555 | |||
| 556 | usbhsg_queue_prepare(uep); | ||
| 557 | |||
| 558 | return 0; | ||
| 559 | } | ||
| 560 | |||
| 561 | struct usbhsg_recip_handle req_clear_feature = { | ||
| 562 | .name = "clear feature", | ||
| 563 | .device = usbhsg_recip_handler_std_control_done, | ||
| 564 | .interface = usbhsg_recip_handler_std_control_done, | ||
| 565 | .endpoint = usbhsg_recip_handler_std_clear_endpoint, | ||
| 566 | }; | ||
| 567 | |||
| 568 | /* | ||
| 569 | * USB_TYPE handler | ||
| 570 | */ | ||
| 571 | static int usbhsg_recip_run_handle(struct usbhs_priv *priv, | ||
| 572 | struct usbhsg_recip_handle *handler, | ||
| 573 | struct usb_ctrlrequest *ctrl) | ||
| 574 | { | ||
| 575 | struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); | ||
| 576 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 577 | struct usbhsg_uep *uep; | ||
| 578 | int recip = ctrl->bRequestType & USB_RECIP_MASK; | ||
| 579 | int nth = le16_to_cpu(ctrl->wIndex) & USB_ENDPOINT_NUMBER_MASK; | ||
| 580 | int ret; | ||
| 581 | int (*func)(struct usbhs_priv *priv, struct usbhsg_uep *uep, | ||
| 582 | struct usb_ctrlrequest *ctrl); | ||
| 583 | char *msg; | ||
| 584 | |||
| 585 | uep = usbhsg_gpriv_to_nth_uep(gpriv, nth); | ||
| 586 | if (!usbhsg_uep_to_pipe(uep)) { | ||
| 587 | dev_err(dev, "wrong recip request\n"); | ||
| 588 | return -EINVAL; | ||
| 589 | } | ||
| 590 | |||
| 591 | switch (recip) { | ||
| 592 | case USB_RECIP_DEVICE: | ||
| 593 | msg = "DEVICE"; | ||
| 594 | func = handler->device; | ||
| 595 | break; | ||
| 596 | case USB_RECIP_INTERFACE: | ||
| 597 | msg = "INTERFACE"; | ||
| 598 | func = handler->interface; | ||
| 599 | break; | ||
| 600 | case USB_RECIP_ENDPOINT: | ||
| 601 | msg = "ENDPOINT"; | ||
| 602 | func = handler->endpoint; | ||
| 603 | break; | ||
| 604 | default: | ||
| 605 | dev_warn(dev, "unsupported RECIP(%d)\n", recip); | ||
| 606 | func = NULL; | ||
| 607 | ret = -EINVAL; | ||
| 608 | } | ||
| 609 | |||
| 610 | if (func) { | ||
| 611 | dev_dbg(dev, "%s (pipe %d :%s)\n", handler->name, nth, msg); | ||
| 612 | ret = func(priv, uep, ctrl); | ||
| 613 | } | ||
| 614 | |||
| 615 | return ret; | ||
| 616 | } | ||
| 617 | |||
| 618 | /* | ||
| 619 | * irq functions | ||
| 620 | * | ||
| 621 | * it will be called from usbhs_interrupt | ||
| 622 | */ | ||
| 623 | static int usbhsg_irq_dev_state(struct usbhs_priv *priv, | ||
| 624 | struct usbhs_irq_state *irq_state) | ||
| 625 | { | ||
| 626 | struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); | ||
| 627 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 628 | |||
| 629 | gpriv->gadget.speed = usbhs_status_get_usb_speed(irq_state); | ||
| 630 | |||
| 631 | dev_dbg(dev, "state = %x : speed : %d\n", | ||
| 632 | usbhs_status_get_device_state(irq_state), | ||
| 633 | gpriv->gadget.speed); | ||
| 634 | |||
| 635 | return 0; | ||
| 636 | } | ||
| 637 | |||
| 638 | static int usbhsg_irq_ctrl_stage(struct usbhs_priv *priv, | ||
| 639 | struct usbhs_irq_state *irq_state) | ||
| 640 | { | ||
| 641 | struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); | ||
| 642 | struct usbhsg_uep *dcp = usbhsg_gpriv_to_dcp(gpriv); | ||
| 643 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(dcp); | ||
| 644 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 645 | struct usb_ctrlrequest ctrl; | ||
| 646 | struct usbhsg_recip_handle *recip_handler = NULL; | ||
| 647 | int stage = usbhs_status_get_ctrl_stage(irq_state); | ||
| 648 | int ret = 0; | ||
| 649 | |||
| 650 | dev_dbg(dev, "stage = %d\n", stage); | ||
| 651 | |||
| 652 | /* | ||
| 653 | * see Manual | ||
| 654 | * | ||
| 655 | * "Operation" | ||
| 656 | * - "Interrupt Function" | ||
| 657 | * - "Control Transfer Stage Transition Interrupt" | ||
| 658 | * - Fig. "Control Transfer Stage Transitions" | ||
| 659 | */ | ||
| 660 | |||
| 661 | switch (stage) { | ||
| 662 | case READ_DATA_STAGE: | ||
| 663 | dcp->handler = &usbhsg_handler_send_ctrl; | ||
| 664 | break; | ||
| 665 | case WRITE_DATA_STAGE: | ||
| 666 | dcp->handler = &usbhsg_handler_recv_ctrl; | ||
| 667 | break; | ||
| 668 | case NODATA_STATUS_STAGE: | ||
| 669 | dcp->handler = &usbhsg_handler_ctrl_stage_end; | ||
| 670 | break; | ||
| 671 | default: | ||
| 672 | return ret; | ||
| 673 | } | ||
| 674 | |||
| 675 | /* | ||
| 676 | * get usb request | ||
| 677 | */ | ||
| 678 | usbhs_usbreq_get_val(priv, &ctrl); | ||
| 679 | |||
| 680 | switch (ctrl.bRequestType & USB_TYPE_MASK) { | ||
| 681 | case USB_TYPE_STANDARD: | ||
| 682 | switch (ctrl.bRequest) { | ||
| 683 | case USB_REQ_CLEAR_FEATURE: | ||
| 684 | recip_handler = &req_clear_feature; | ||
| 685 | break; | ||
| 686 | } | ||
| 687 | } | ||
| 688 | |||
| 689 | /* | ||
| 690 | * setup stage / run recip | ||
| 691 | */ | ||
| 692 | if (recip_handler) | ||
| 693 | ret = usbhsg_recip_run_handle(priv, recip_handler, &ctrl); | ||
| 694 | else | ||
| 695 | ret = gpriv->driver->setup(&gpriv->gadget, &ctrl); | ||
| 696 | |||
| 697 | if (ret < 0) | ||
| 698 | usbhs_fifo_stall(pipe); | ||
| 699 | |||
| 700 | return ret; | ||
| 701 | } | ||
| 702 | |||
| 703 | static int usbhsg_irq_empty(struct usbhs_priv *priv, | ||
| 704 | struct usbhs_irq_state *irq_state) | ||
| 705 | { | ||
| 706 | struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); | ||
| 707 | struct usbhsg_uep *uep; | ||
| 708 | struct usbhs_pipe *pipe; | ||
| 709 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 710 | int i, ret; | ||
| 711 | |||
| 712 | if (!irq_state->bempsts) { | ||
| 713 | dev_err(dev, "debug %s !!\n", __func__); | ||
| 714 | return -EIO; | ||
| 715 | } | ||
| 716 | |||
| 717 | dev_dbg(dev, "irq empty [0x%04x]\n", irq_state->bempsts); | ||
| 718 | |||
| 719 | /* | ||
| 720 | * search interrupted "pipe" | ||
| 721 | * not "uep". | ||
| 722 | */ | ||
| 723 | usbhs_for_each_pipe_with_dcp(pipe, priv, i) { | ||
| 724 | if (!(irq_state->bempsts & (1 << i))) | ||
| 725 | continue; | ||
| 726 | |||
| 727 | uep = usbhsg_pipe_to_uep(pipe); | ||
| 728 | ret = usbhsg_queue_handle(uep); | ||
| 729 | if (ret < 0) | ||
| 730 | dev_err(dev, "send error %d : %d\n", i, ret); | ||
| 731 | } | ||
| 732 | |||
| 733 | return 0; | ||
| 734 | } | ||
| 735 | |||
| 736 | static int usbhsg_irq_ready(struct usbhs_priv *priv, | ||
| 737 | struct usbhs_irq_state *irq_state) | ||
| 738 | { | ||
| 739 | struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); | ||
| 740 | struct usbhsg_uep *uep; | ||
| 741 | struct usbhs_pipe *pipe; | ||
| 742 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 743 | int i, ret; | ||
| 744 | |||
| 745 | if (!irq_state->brdysts) { | ||
| 746 | dev_err(dev, "debug %s !!\n", __func__); | ||
| 747 | return -EIO; | ||
| 748 | } | ||
| 749 | |||
| 750 | dev_dbg(dev, "irq ready [0x%04x]\n", irq_state->brdysts); | ||
| 751 | |||
| 752 | /* | ||
| 753 | * search interrupted "pipe" | ||
| 754 | * not "uep". | ||
| 755 | */ | ||
| 756 | usbhs_for_each_pipe_with_dcp(pipe, priv, i) { | ||
| 757 | if (!(irq_state->brdysts & (1 << i))) | ||
| 758 | continue; | ||
| 759 | |||
| 760 | uep = usbhsg_pipe_to_uep(pipe); | ||
| 761 | ret = usbhsg_queue_handle(uep); | ||
| 762 | if (ret < 0) | ||
| 763 | dev_err(dev, "receive error %d : %d\n", i, ret); | ||
| 764 | } | ||
| 765 | |||
| 766 | return 0; | ||
| 767 | } | ||
| 768 | |||
| 769 | /* | ||
| 770 | * | ||
| 771 | * usb_dcp_ops | ||
| 772 | * | ||
| 773 | */ | ||
| 774 | static int usbhsg_dcp_enable(struct usbhsg_uep *uep) | ||
| 775 | { | ||
| 776 | struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); | ||
| 777 | struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv); | ||
| 778 | struct usbhs_pipe *pipe; | ||
| 779 | |||
| 780 | /* | ||
| 781 | ********* assume under spin lock ********* | ||
| 782 | */ | ||
| 783 | |||
| 784 | pipe = usbhs_dcp_malloc(priv); | ||
| 785 | if (!pipe) | ||
| 786 | return -EIO; | ||
| 787 | |||
| 788 | uep->pipe = pipe; | ||
| 789 | uep->pipe->mod_private = uep; | ||
| 790 | INIT_LIST_HEAD(&uep->list); | ||
| 791 | |||
| 792 | return 0; | ||
| 793 | } | ||
| 794 | |||
| 795 | #define usbhsg_dcp_disable usbhsg_pipe_disable | ||
| 796 | static int usbhsg_pipe_disable(struct usbhsg_uep *uep) | ||
| 797 | { | ||
| 798 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); | ||
| 799 | struct usbhsg_request *ureq; | ||
| 800 | int disable = 0; | ||
| 801 | |||
| 802 | /* | ||
| 803 | ********* assume under spin lock ********* | ||
| 804 | */ | ||
| 805 | |||
| 806 | usbhs_fifo_disable(pipe); | ||
| 807 | |||
| 808 | /* | ||
| 809 | * disable pipe irq | ||
| 810 | */ | ||
| 811 | usbhsg_irq_empty_ctrl(uep, disable); | ||
| 812 | usbhsg_irq_ready_ctrl(uep, disable); | ||
| 813 | |||
| 814 | while (1) { | ||
| 815 | ureq = usbhsg_queue_get(uep); | ||
| 816 | if (!ureq) | ||
| 817 | break; | ||
| 818 | |||
| 819 | usbhsg_queue_pop(uep, ureq, -ECONNRESET); | ||
| 820 | } | ||
| 821 | |||
| 822 | return 0; | ||
| 823 | } | ||
| 824 | |||
| 825 | static void usbhsg_uep_init(struct usbhsg_gpriv *gpriv) | ||
| 826 | { | ||
| 827 | int i; | ||
| 828 | struct usbhsg_uep *uep; | ||
| 829 | |||
| 830 | usbhsg_for_each_uep_with_dcp(uep, gpriv, i) | ||
| 831 | uep->pipe = NULL; | ||
| 832 | } | ||
| 833 | |||
| 834 | /* | ||
| 835 | * | ||
| 836 | * usb_ep_ops | ||
| 837 | * | ||
| 838 | */ | ||
| 839 | static int usbhsg_ep_enable(struct usb_ep *ep, | ||
| 840 | const struct usb_endpoint_descriptor *desc) | ||
| 841 | { | ||
| 842 | struct usbhsg_uep *uep = usbhsg_ep_to_uep(ep); | ||
| 843 | struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); | ||
| 844 | struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv); | ||
| 845 | struct usbhs_pipe *pipe; | ||
| 846 | spinlock_t *lock; | ||
| 847 | unsigned long flags; | ||
| 848 | int ret = -EIO; | ||
| 849 | |||
| 850 | /* | ||
| 851 | * if it already have pipe, | ||
| 852 | * nothing to do | ||
| 853 | */ | ||
| 854 | if (uep->pipe) | ||
| 855 | return 0; | ||
| 856 | |||
| 857 | /******************** spin lock ********************/ | ||
| 858 | lock = usbhsg_trylock(gpriv, &flags); | ||
| 859 | |||
| 860 | pipe = usbhs_pipe_malloc(priv, desc); | ||
| 861 | if (pipe) { | ||
| 862 | uep->pipe = pipe; | ||
| 863 | pipe->mod_private = uep; | ||
| 864 | INIT_LIST_HEAD(&uep->list); | ||
| 865 | |||
| 866 | if (usb_endpoint_dir_in(desc)) | ||
| 867 | uep->handler = &usbhsg_handler_send_packet; | ||
| 868 | else | ||
| 869 | uep->handler = &usbhsg_handler_recv_packet; | ||
| 870 | |||
| 871 | ret = 0; | ||
| 872 | } | ||
| 873 | |||
| 874 | usbhsg_unlock(lock, &flags); | ||
| 875 | /******************** spin unlock ******************/ | ||
| 876 | |||
| 877 | return ret; | ||
| 878 | } | ||
| 879 | |||
| 880 | static int usbhsg_ep_disable(struct usb_ep *ep) | ||
| 881 | { | ||
| 882 | struct usbhsg_uep *uep = usbhsg_ep_to_uep(ep); | ||
| 883 | struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); | ||
| 884 | spinlock_t *lock; | ||
| 885 | unsigned long flags; | ||
| 886 | int ret; | ||
| 887 | |||
| 888 | /******************** spin lock ********************/ | ||
| 889 | lock = usbhsg_trylock(gpriv, &flags); | ||
| 890 | |||
| 891 | ret = usbhsg_pipe_disable(uep); | ||
| 892 | |||
| 893 | usbhsg_unlock(lock, &flags); | ||
| 894 | /******************** spin unlock ******************/ | ||
| 895 | |||
| 896 | return ret; | ||
| 897 | } | ||
| 898 | |||
| 899 | static struct usb_request *usbhsg_ep_alloc_request(struct usb_ep *ep, | ||
| 900 | gfp_t gfp_flags) | ||
| 901 | { | ||
| 902 | struct usbhsg_request *ureq; | ||
| 903 | |||
| 904 | ureq = kzalloc(sizeof *ureq, gfp_flags); | ||
| 905 | if (!ureq) | ||
| 906 | return NULL; | ||
| 907 | |||
| 908 | INIT_LIST_HEAD(&ureq->node); | ||
| 909 | return &ureq->req; | ||
| 910 | } | ||
| 911 | |||
| 912 | static void usbhsg_ep_free_request(struct usb_ep *ep, | ||
| 913 | struct usb_request *req) | ||
| 914 | { | ||
| 915 | struct usbhsg_request *ureq = usbhsg_req_to_ureq(req); | ||
| 916 | |||
| 917 | WARN_ON(!list_empty(&ureq->node)); | ||
| 918 | kfree(ureq); | ||
| 919 | } | ||
| 920 | |||
| 921 | static int usbhsg_ep_queue(struct usb_ep *ep, struct usb_request *req, | ||
| 922 | gfp_t gfp_flags) | ||
| 923 | { | ||
| 924 | struct usbhsg_uep *uep = usbhsg_ep_to_uep(ep); | ||
| 925 | struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); | ||
| 926 | struct usbhsg_request *ureq = usbhsg_req_to_ureq(req); | ||
| 927 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); | ||
| 928 | spinlock_t *lock; | ||
| 929 | unsigned long flags; | ||
| 930 | int ret = 0; | ||
| 931 | |||
| 932 | /* | ||
| 933 | * CAUTION [*endpoint queue*] | ||
| 934 | * | ||
| 935 | * This function will be called from usb_request :: complete | ||
| 936 | * or usb driver timing. | ||
| 937 | * If this function is called from usb_request :: complete, | ||
| 938 | * it is already under spinlock on this driver. | ||
| 939 | * but it is called frm usb driver, this function should call spinlock. | ||
| 940 | * | ||
| 941 | * This function is using usbshg_trylock to solve this issue. | ||
| 942 | * if "is_locked" is 1, this mean this function lock it. | ||
| 943 | * but if it is 0, this mean it is already under spin lock. | ||
| 944 | * see also | ||
| 945 | * CAUTION [*queue handler*] | ||
| 946 | * CAUTION [*request complete*] | ||
| 947 | */ | ||
| 948 | |||
| 949 | /******************** spin lock ********************/ | ||
| 950 | lock = usbhsg_trylock(gpriv, &flags); | ||
| 951 | |||
| 952 | /* param check */ | ||
| 953 | if (usbhsg_is_not_connected(gpriv) || | ||
| 954 | unlikely(!gpriv->driver) || | ||
| 955 | unlikely(!pipe)) | ||
| 956 | ret = -ESHUTDOWN; | ||
| 957 | else | ||
| 958 | usbhsg_queue_push(uep, ureq); | ||
| 959 | |||
| 960 | usbhsg_unlock(lock, &flags); | ||
| 961 | /******************** spin unlock ******************/ | ||
| 962 | |||
| 963 | usbhsg_queue_prepare(uep); | ||
| 964 | |||
| 965 | return ret; | ||
| 966 | } | ||
| 967 | |||
| 968 | static int usbhsg_ep_dequeue(struct usb_ep *ep, struct usb_request *req) | ||
| 969 | { | ||
| 970 | struct usbhsg_uep *uep = usbhsg_ep_to_uep(ep); | ||
| 971 | struct usbhsg_request *ureq = usbhsg_req_to_ureq(req); | ||
| 972 | struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); | ||
| 973 | spinlock_t *lock; | ||
| 974 | unsigned long flags; | ||
| 975 | |||
| 976 | /* | ||
| 977 | * see | ||
| 978 | * CAUTION [*queue handler*] | ||
| 979 | * CAUTION [*endpoint queue*] | ||
| 980 | * CAUTION [*request complete*] | ||
| 981 | */ | ||
| 982 | |||
| 983 | /******************** spin lock ********************/ | ||
| 984 | lock = usbhsg_trylock(gpriv, &flags); | ||
| 985 | |||
| 986 | usbhsg_queue_pop(uep, ureq, -ECONNRESET); | ||
| 987 | |||
| 988 | usbhsg_unlock(lock, &flags); | ||
| 989 | /******************** spin unlock ******************/ | ||
| 990 | |||
| 991 | return 0; | ||
| 992 | } | ||
| 993 | |||
| 994 | static int __usbhsg_ep_set_halt_wedge(struct usb_ep *ep, int halt, int wedge) | ||
| 995 | { | ||
| 996 | struct usbhsg_uep *uep = usbhsg_ep_to_uep(ep); | ||
| 997 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); | ||
| 998 | struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); | ||
| 999 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 1000 | spinlock_t *lock; | ||
| 1001 | unsigned long flags; | ||
| 1002 | int ret = -EAGAIN; | ||
| 1003 | |||
| 1004 | /* | ||
| 1005 | * see | ||
| 1006 | * CAUTION [*queue handler*] | ||
| 1007 | * CAUTION [*endpoint queue*] | ||
| 1008 | * CAUTION [*request complete*] | ||
| 1009 | */ | ||
| 1010 | |||
| 1011 | /******************** spin lock ********************/ | ||
| 1012 | lock = usbhsg_trylock(gpriv, &flags); | ||
| 1013 | if (!usbhsg_queue_get(uep)) { | ||
| 1014 | |||
| 1015 | dev_dbg(dev, "set halt %d (pipe %d)\n", | ||
| 1016 | halt, usbhs_pipe_number(pipe)); | ||
| 1017 | |||
| 1018 | if (halt) | ||
| 1019 | usbhs_fifo_stall(pipe); | ||
| 1020 | else | ||
| 1021 | usbhs_fifo_disable(pipe); | ||
| 1022 | |||
| 1023 | if (halt && wedge) | ||
| 1024 | usbhsg_status_set(gpriv, USBHSG_STATUS_WEDGE); | ||
| 1025 | else | ||
| 1026 | usbhsg_status_clr(gpriv, USBHSG_STATUS_WEDGE); | ||
| 1027 | |||
| 1028 | ret = 0; | ||
| 1029 | } | ||
| 1030 | |||
| 1031 | usbhsg_unlock(lock, &flags); | ||
| 1032 | /******************** spin unlock ******************/ | ||
| 1033 | |||
| 1034 | return ret; | ||
| 1035 | } | ||
| 1036 | |||
| 1037 | static int usbhsg_ep_set_halt(struct usb_ep *ep, int value) | ||
| 1038 | { | ||
| 1039 | return __usbhsg_ep_set_halt_wedge(ep, value, 0); | ||
| 1040 | } | ||
| 1041 | |||
| 1042 | static int usbhsg_ep_set_wedge(struct usb_ep *ep) | ||
| 1043 | { | ||
| 1044 | return __usbhsg_ep_set_halt_wedge(ep, 1, 1); | ||
| 1045 | } | ||
| 1046 | |||
| 1047 | static struct usb_ep_ops usbhsg_ep_ops = { | ||
| 1048 | .enable = usbhsg_ep_enable, | ||
| 1049 | .disable = usbhsg_ep_disable, | ||
| 1050 | |||
| 1051 | .alloc_request = usbhsg_ep_alloc_request, | ||
| 1052 | .free_request = usbhsg_ep_free_request, | ||
| 1053 | |||
| 1054 | .queue = usbhsg_ep_queue, | ||
| 1055 | .dequeue = usbhsg_ep_dequeue, | ||
| 1056 | |||
| 1057 | .set_halt = usbhsg_ep_set_halt, | ||
| 1058 | .set_wedge = usbhsg_ep_set_wedge, | ||
| 1059 | }; | ||
| 1060 | |||
| 1061 | /* | ||
| 1062 | * usb module start/end | ||
| 1063 | */ | ||
| 1064 | static int usbhsg_try_start(struct usbhs_priv *priv, u32 status) | ||
| 1065 | { | ||
| 1066 | struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); | ||
| 1067 | struct usbhsg_uep *dcp = usbhsg_gpriv_to_dcp(gpriv); | ||
| 1068 | struct usbhs_mod *mod = usbhs_mod_get_current(priv); | ||
| 1069 | struct device *dev = usbhs_priv_to_dev(priv); | ||
| 1070 | spinlock_t *lock; | ||
| 1071 | unsigned long flags; | ||
| 1072 | |||
| 1073 | /******************** spin lock ********************/ | ||
| 1074 | lock = usbhsg_trylock(gpriv, &flags); | ||
| 1075 | |||
| 1076 | /* | ||
| 1077 | * enable interrupt and systems if ready | ||
| 1078 | */ | ||
| 1079 | usbhsg_status_set(gpriv, status); | ||
| 1080 | if (!(usbhsg_status_has(gpriv, USBHSG_STATUS_STARTED) && | ||
| 1081 | usbhsg_status_has(gpriv, USBHSG_STATUS_REGISTERD))) | ||
| 1082 | goto usbhsg_try_start_unlock; | ||
| 1083 | |||
| 1084 | dev_dbg(dev, "start gadget\n"); | ||
| 1085 | |||
| 1086 | /* | ||
| 1087 | * pipe initialize and enable DCP | ||
| 1088 | */ | ||
| 1089 | usbhs_pipe_init(priv); | ||
| 1090 | usbhsg_uep_init(gpriv); | ||
| 1091 | usbhsg_dcp_enable(dcp); | ||
| 1092 | |||
| 1093 | /* | ||
| 1094 | * system config enble | ||
| 1095 | * - HI speed | ||
| 1096 | * - function | ||
| 1097 | * - usb module | ||
| 1098 | */ | ||
| 1099 | usbhs_sys_hispeed_ctrl(priv, 1); | ||
| 1100 | usbhs_sys_function_ctrl(priv, 1); | ||
| 1101 | usbhs_sys_usb_ctrl(priv, 1); | ||
| 1102 | |||
| 1103 | /* | ||
| 1104 | * enable irq callback | ||
| 1105 | */ | ||
| 1106 | mod->irq_dev_state = usbhsg_irq_dev_state; | ||
| 1107 | mod->irq_ctrl_stage = usbhsg_irq_ctrl_stage; | ||
| 1108 | mod->irq_empty = usbhsg_irq_empty; | ||
| 1109 | mod->irq_ready = usbhsg_irq_ready; | ||
| 1110 | mod->irq_bempsts = 0; | ||
| 1111 | mod->irq_brdysts = 0; | ||
| 1112 | usbhs_irq_callback_update(priv, mod); | ||
| 1113 | |||
| 1114 | usbhsg_try_start_unlock: | ||
| 1115 | usbhsg_unlock(lock, &flags); | ||
| 1116 | /******************** spin unlock ********************/ | ||
| 1117 | |||
| 1118 | return 0; | ||
| 1119 | } | ||
| 1120 | |||
| 1121 | static int usbhsg_try_stop(struct usbhs_priv *priv, u32 status) | ||
| 1122 | { | ||
| 1123 | struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); | ||
| 1124 | struct usbhs_mod *mod = usbhs_mod_get_current(priv); | ||
| 1125 | struct usbhsg_uep *dcp = usbhsg_gpriv_to_dcp(gpriv); | ||
| 1126 | struct device *dev = usbhs_priv_to_dev(priv); | ||
| 1127 | spinlock_t *lock; | ||
| 1128 | unsigned long flags; | ||
| 1129 | |||
| 1130 | /******************** spin lock ********************/ | ||
| 1131 | lock = usbhsg_trylock(gpriv, &flags); | ||
| 1132 | |||
| 1133 | /* | ||
| 1134 | * disable interrupt and systems if 1st try | ||
| 1135 | */ | ||
| 1136 | usbhsg_status_clr(gpriv, status); | ||
| 1137 | if (!usbhsg_status_has(gpriv, USBHSG_STATUS_STARTED) && | ||
| 1138 | !usbhsg_status_has(gpriv, USBHSG_STATUS_REGISTERD)) | ||
| 1139 | goto usbhsg_try_stop_unlock; | ||
| 1140 | |||
| 1141 | /* disable all irq */ | ||
| 1142 | mod->irq_dev_state = NULL; | ||
| 1143 | mod->irq_ctrl_stage = NULL; | ||
| 1144 | mod->irq_empty = NULL; | ||
| 1145 | mod->irq_ready = NULL; | ||
| 1146 | mod->irq_bempsts = 0; | ||
| 1147 | mod->irq_brdysts = 0; | ||
| 1148 | usbhs_irq_callback_update(priv, mod); | ||
| 1149 | |||
| 1150 | usbhsg_dcp_disable(dcp); | ||
| 1151 | |||
| 1152 | gpriv->gadget.speed = USB_SPEED_UNKNOWN; | ||
| 1153 | |||
| 1154 | /* disable sys */ | ||
| 1155 | usbhs_sys_hispeed_ctrl(priv, 0); | ||
| 1156 | usbhs_sys_function_ctrl(priv, 0); | ||
| 1157 | usbhs_sys_usb_ctrl(priv, 0); | ||
| 1158 | |||
| 1159 | usbhsg_unlock(lock, &flags); | ||
| 1160 | /******************** spin unlock ********************/ | ||
| 1161 | |||
| 1162 | if (gpriv->driver && | ||
| 1163 | gpriv->driver->disconnect) | ||
| 1164 | gpriv->driver->disconnect(&gpriv->gadget); | ||
| 1165 | |||
| 1166 | dev_dbg(dev, "stop gadget\n"); | ||
| 1167 | |||
| 1168 | return 0; | ||
| 1169 | |||
| 1170 | usbhsg_try_stop_unlock: | ||
| 1171 | usbhsg_unlock(lock, &flags); | ||
| 1172 | |||
| 1173 | return 0; | ||
| 1174 | } | ||
| 1175 | |||
| 1176 | /* | ||
| 1177 | * | ||
| 1178 | * linux usb function | ||
| 1179 | * | ||
| 1180 | */ | ||
| 1181 | struct usbhsg_gpriv *the_controller; | ||
| 1182 | int usb_gadget_probe_driver(struct usb_gadget_driver *driver, | ||
| 1183 | int (*bind)(struct usb_gadget *)) | ||
| 1184 | { | ||
| 1185 | struct usbhsg_gpriv *gpriv = the_controller; | ||
| 1186 | struct usbhs_priv *priv; | ||
| 1187 | struct device *dev; | ||
| 1188 | int ret; | ||
| 1189 | |||
| 1190 | if (!bind || | ||
| 1191 | !driver || | ||
| 1192 | !driver->setup || | ||
| 1193 | driver->speed != USB_SPEED_HIGH) | ||
| 1194 | return -EINVAL; | ||
| 1195 | if (!gpriv) | ||
| 1196 | return -ENODEV; | ||
| 1197 | if (gpriv->driver) | ||
| 1198 | return -EBUSY; | ||
| 1199 | |||
| 1200 | dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 1201 | priv = usbhsg_gpriv_to_priv(gpriv); | ||
| 1202 | |||
| 1203 | /* first hook up the driver ... */ | ||
| 1204 | gpriv->driver = driver; | ||
| 1205 | gpriv->gadget.dev.driver = &driver->driver; | ||
| 1206 | |||
| 1207 | ret = device_add(&gpriv->gadget.dev); | ||
| 1208 | if (ret) { | ||
| 1209 | dev_err(dev, "device_add error %d\n", ret); | ||
| 1210 | goto add_fail; | ||
| 1211 | } | ||
| 1212 | |||
| 1213 | ret = bind(&gpriv->gadget); | ||
| 1214 | if (ret) { | ||
| 1215 | dev_err(dev, "bind to driver %s error %d\n", | ||
| 1216 | driver->driver.name, ret); | ||
| 1217 | goto bind_fail; | ||
| 1218 | } | ||
| 1219 | |||
| 1220 | dev_dbg(dev, "bind %s\n", driver->driver.name); | ||
| 1221 | |||
| 1222 | return usbhsg_try_start(priv, USBHSG_STATUS_REGISTERD); | ||
| 1223 | |||
| 1224 | bind_fail: | ||
| 1225 | device_del(&gpriv->gadget.dev); | ||
| 1226 | add_fail: | ||
| 1227 | gpriv->driver = NULL; | ||
| 1228 | gpriv->gadget.dev.driver = NULL; | ||
| 1229 | |||
| 1230 | return ret; | ||
| 1231 | } | ||
| 1232 | EXPORT_SYMBOL(usb_gadget_probe_driver); | ||
| 1233 | |||
| 1234 | int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) | ||
| 1235 | { | ||
| 1236 | struct usbhsg_gpriv *gpriv = the_controller; | ||
| 1237 | struct usbhs_priv *priv; | ||
| 1238 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 1239 | |||
| 1240 | if (!gpriv) | ||
| 1241 | return -ENODEV; | ||
| 1242 | |||
| 1243 | if (!driver || | ||
| 1244 | !driver->unbind || | ||
| 1245 | driver != gpriv->driver) | ||
| 1246 | return -EINVAL; | ||
| 1247 | |||
| 1248 | dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 1249 | priv = usbhsg_gpriv_to_priv(gpriv); | ||
| 1250 | |||
| 1251 | usbhsg_try_stop(priv, USBHSG_STATUS_REGISTERD); | ||
| 1252 | device_del(&gpriv->gadget.dev); | ||
| 1253 | gpriv->driver = NULL; | ||
| 1254 | |||
| 1255 | if (driver->disconnect) | ||
| 1256 | driver->disconnect(&gpriv->gadget); | ||
| 1257 | |||
| 1258 | driver->unbind(&gpriv->gadget); | ||
| 1259 | dev_dbg(dev, "unbind %s\n", driver->driver.name); | ||
| 1260 | |||
| 1261 | return 0; | ||
| 1262 | } | ||
| 1263 | EXPORT_SYMBOL(usb_gadget_unregister_driver); | ||
| 1264 | |||
| 1265 | /* | ||
| 1266 | * usb gadget ops | ||
| 1267 | */ | ||
| 1268 | static int usbhsg_get_frame(struct usb_gadget *gadget) | ||
| 1269 | { | ||
| 1270 | struct usbhsg_gpriv *gpriv = usbhsg_gadget_to_gpriv(gadget); | ||
| 1271 | struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv); | ||
| 1272 | |||
| 1273 | return usbhs_frame_get_num(priv); | ||
| 1274 | } | ||
| 1275 | |||
| 1276 | static struct usb_gadget_ops usbhsg_gadget_ops = { | ||
| 1277 | .get_frame = usbhsg_get_frame, | ||
| 1278 | }; | ||
| 1279 | |||
| 1280 | static int usbhsg_start(struct usbhs_priv *priv) | ||
| 1281 | { | ||
| 1282 | return usbhsg_try_start(priv, USBHSG_STATUS_STARTED); | ||
| 1283 | } | ||
| 1284 | |||
| 1285 | static int usbhsg_stop(struct usbhs_priv *priv) | ||
| 1286 | { | ||
| 1287 | return usbhsg_try_stop(priv, USBHSG_STATUS_STARTED); | ||
| 1288 | } | ||
| 1289 | |||
| 1290 | int __devinit usbhs_mod_gadget_probe(struct usbhs_priv *priv) | ||
| 1291 | { | ||
| 1292 | struct usbhsg_gpriv *gpriv; | ||
| 1293 | struct usbhsg_uep *uep; | ||
| 1294 | struct device *dev = usbhs_priv_to_dev(priv); | ||
| 1295 | int pipe_size = usbhs_get_dparam(priv, pipe_size); | ||
| 1296 | int i; | ||
| 1297 | |||
| 1298 | gpriv = kzalloc(sizeof(struct usbhsg_gpriv), GFP_KERNEL); | ||
| 1299 | if (!gpriv) { | ||
| 1300 | dev_err(dev, "Could not allocate gadget priv\n"); | ||
| 1301 | return -ENOMEM; | ||
| 1302 | } | ||
| 1303 | |||
| 1304 | uep = kzalloc(sizeof(struct usbhsg_uep) * pipe_size, GFP_KERNEL); | ||
| 1305 | if (!uep) { | ||
| 1306 | dev_err(dev, "Could not allocate ep\n"); | ||
| 1307 | goto usbhs_mod_gadget_probe_err_gpriv; | ||
| 1308 | } | ||
| 1309 | |||
| 1310 | /* | ||
| 1311 | * CAUTION | ||
| 1312 | * | ||
| 1313 | * There is no guarantee that it is possible to access usb module here. | ||
| 1314 | * Don't accesses to it. | ||
| 1315 | * The accesse will be enable after "usbhsg_start" | ||
| 1316 | */ | ||
| 1317 | |||
| 1318 | /* | ||
| 1319 | * register itself | ||
| 1320 | */ | ||
| 1321 | usbhs_mod_register(priv, &gpriv->mod, USBHS_GADGET); | ||
| 1322 | |||
| 1323 | /* init gpriv */ | ||
| 1324 | gpriv->mod.name = "gadget"; | ||
| 1325 | gpriv->mod.start = usbhsg_start; | ||
| 1326 | gpriv->mod.stop = usbhsg_stop; | ||
| 1327 | gpriv->uep = uep; | ||
| 1328 | gpriv->uep_size = pipe_size; | ||
| 1329 | usbhsg_status_init(gpriv); | ||
| 1330 | |||
| 1331 | /* | ||
| 1332 | * init gadget | ||
| 1333 | */ | ||
| 1334 | device_initialize(&gpriv->gadget.dev); | ||
| 1335 | dev_set_name(&gpriv->gadget.dev, "gadget"); | ||
| 1336 | gpriv->gadget.dev.parent = dev; | ||
| 1337 | gpriv->gadget.name = "renesas_usbhs_udc"; | ||
| 1338 | gpriv->gadget.ops = &usbhsg_gadget_ops; | ||
| 1339 | gpriv->gadget.is_dualspeed = 1; | ||
| 1340 | |||
| 1341 | INIT_LIST_HEAD(&gpriv->gadget.ep_list); | ||
| 1342 | |||
| 1343 | /* | ||
| 1344 | * init usb_ep | ||
| 1345 | */ | ||
| 1346 | usbhsg_for_each_uep_with_dcp(uep, gpriv, i) { | ||
| 1347 | uep->gpriv = gpriv; | ||
| 1348 | snprintf(uep->ep_name, EP_NAME_SIZE, "ep%d", i); | ||
| 1349 | |||
| 1350 | uep->ep.name = uep->ep_name; | ||
| 1351 | uep->ep.ops = &usbhsg_ep_ops; | ||
| 1352 | INIT_LIST_HEAD(&uep->ep.ep_list); | ||
| 1353 | INIT_LIST_HEAD(&uep->list); | ||
| 1354 | |||
| 1355 | /* init DCP */ | ||
| 1356 | if (usbhsg_is_dcp(uep)) { | ||
| 1357 | gpriv->gadget.ep0 = &uep->ep; | ||
| 1358 | uep->ep.maxpacket = 64; | ||
| 1359 | } | ||
| 1360 | /* init normal pipe */ | ||
| 1361 | else { | ||
| 1362 | uep->ep.maxpacket = 512; | ||
| 1363 | list_add_tail(&uep->ep.ep_list, &gpriv->gadget.ep_list); | ||
| 1364 | } | ||
| 1365 | } | ||
| 1366 | |||
| 1367 | the_controller = gpriv; | ||
| 1368 | |||
| 1369 | dev_info(dev, "gadget probed\n"); | ||
| 1370 | |||
| 1371 | return 0; | ||
| 1372 | |||
| 1373 | usbhs_mod_gadget_probe_err_gpriv: | ||
| 1374 | kfree(gpriv); | ||
| 1375 | |||
| 1376 | return -ENOMEM; | ||
| 1377 | } | ||
| 1378 | |||
| 1379 | void __devexit usbhs_mod_gadget_remove(struct usbhs_priv *priv) | ||
| 1380 | { | ||
| 1381 | struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); | ||
| 1382 | |||
| 1383 | kfree(gpriv); | ||
| 1384 | } | ||
diff --git a/drivers/usb/renesas_usbhs/pipe.c b/drivers/usb/renesas_usbhs/pipe.c new file mode 100644 index 00000000000..bc4521c5426 --- /dev/null +++ b/drivers/usb/renesas_usbhs/pipe.c | |||
| @@ -0,0 +1,874 @@ | |||
| 1 | /* | ||
| 2 | * Renesas USB driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Renesas Solutions Corp. | ||
| 5 | * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, write to the Free Software | ||
| 14 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 15 | * | ||
| 16 | */ | ||
| 17 | #include <linux/delay.h> | ||
| 18 | #include <linux/io.h> | ||
| 19 | #include <linux/slab.h> | ||
| 20 | #include "./common.h" | ||
| 21 | #include "./pipe.h" | ||
| 22 | |||
| 23 | /* | ||
| 24 | * macros | ||
| 25 | */ | ||
| 26 | #define usbhsp_priv_to_pipeinfo(pr) (&(pr)->pipe_info) | ||
| 27 | #define usbhsp_pipe_to_priv(p) ((p)->priv) | ||
| 28 | |||
| 29 | #define usbhsp_addr_offset(p) ((usbhs_pipe_number(p) - 1) * 2) | ||
| 30 | |||
| 31 | #define usbhsp_is_dcp(p) ((p)->priv->pipe_info.pipe == (p)) | ||
| 32 | |||
| 33 | #define usbhsp_flags_set(p, f) ((p)->flags |= USBHS_PIPE_FLAGS_##f) | ||
| 34 | #define usbhsp_flags_clr(p, f) ((p)->flags &= ~USBHS_PIPE_FLAGS_##f) | ||
| 35 | #define usbhsp_flags_has(p, f) ((p)->flags & USBHS_PIPE_FLAGS_##f) | ||
| 36 | #define usbhsp_flags_init(p) do {(p)->flags = 0; } while (0) | ||
| 37 | |||
| 38 | #define usbhsp_type(p) ((p)->pipe_type) | ||
| 39 | #define usbhsp_type_is(p, t) ((p)->pipe_type == t) | ||
| 40 | |||
| 41 | /* | ||
| 42 | * for debug | ||
| 43 | */ | ||
| 44 | static char *usbhsp_pipe_name[] = { | ||
| 45 | [USB_ENDPOINT_XFER_CONTROL] = "DCP", | ||
| 46 | [USB_ENDPOINT_XFER_BULK] = "BULK", | ||
| 47 | [USB_ENDPOINT_XFER_INT] = "INT", | ||
| 48 | [USB_ENDPOINT_XFER_ISOC] = "ISO", | ||
| 49 | }; | ||
| 50 | |||
| 51 | /* | ||
| 52 | * usb request functions | ||
| 53 | */ | ||
| 54 | void usbhs_usbreq_get_val(struct usbhs_priv *priv, struct usb_ctrlrequest *req) | ||
| 55 | { | ||
| 56 | u16 val; | ||
| 57 | |||
| 58 | val = usbhs_read(priv, USBREQ); | ||
| 59 | req->bRequest = (val >> 8) & 0xFF; | ||
| 60 | req->bRequestType = (val >> 0) & 0xFF; | ||
| 61 | |||
| 62 | req->wValue = usbhs_read(priv, USBVAL); | ||
| 63 | req->wIndex = usbhs_read(priv, USBINDX); | ||
| 64 | req->wLength = usbhs_read(priv, USBLENG); | ||
| 65 | } | ||
| 66 | |||
| 67 | void usbhs_usbreq_set_val(struct usbhs_priv *priv, struct usb_ctrlrequest *req) | ||
| 68 | { | ||
| 69 | usbhs_write(priv, USBREQ, (req->bRequest << 8) | req->bRequestType); | ||
| 70 | usbhs_write(priv, USBVAL, req->wValue); | ||
| 71 | usbhs_write(priv, USBINDX, req->wIndex); | ||
| 72 | usbhs_write(priv, USBLENG, req->wLength); | ||
| 73 | } | ||
| 74 | |||
| 75 | /* | ||
| 76 | * DCPCTR/PIPEnCTR functions | ||
| 77 | */ | ||
| 78 | static void usbhsp_pipectrl_set(struct usbhs_pipe *pipe, u16 mask, u16 val) | ||
| 79 | { | ||
| 80 | struct usbhs_priv *priv = usbhsp_pipe_to_priv(pipe); | ||
| 81 | int offset = usbhsp_addr_offset(pipe); | ||
| 82 | |||
| 83 | if (usbhsp_is_dcp(pipe)) | ||
| 84 | usbhs_bset(priv, DCPCTR, mask, val); | ||
| 85 | else | ||
| 86 | usbhs_bset(priv, PIPEnCTR + offset, mask, val); | ||
| 87 | } | ||
| 88 | |||
| 89 | static u16 usbhsp_pipectrl_get(struct usbhs_pipe *pipe) | ||
| 90 | { | ||
| 91 | struct usbhs_priv *priv = usbhsp_pipe_to_priv(pipe); | ||
| 92 | int offset = usbhsp_addr_offset(pipe); | ||
| 93 | |||
| 94 | if (usbhsp_is_dcp(pipe)) | ||
| 95 | return usbhs_read(priv, DCPCTR); | ||
| 96 | else | ||
| 97 | return usbhs_read(priv, PIPEnCTR + offset); | ||
| 98 | } | ||
| 99 | |||
| 100 | /* | ||
| 101 | * DCP/PIPE functions | ||
| 102 | */ | ||
| 103 | static void __usbhsp_pipe_xxx_set(struct usbhs_pipe *pipe, | ||
| 104 | u16 dcp_reg, u16 pipe_reg, | ||
| 105 | u16 mask, u16 val) | ||
| 106 | { | ||
| 107 | struct usbhs_priv *priv = usbhsp_pipe_to_priv(pipe); | ||
| 108 | |||
| 109 | if (usbhsp_is_dcp(pipe)) | ||
| 110 | usbhs_bset(priv, dcp_reg, mask, val); | ||
| 111 | else | ||
| 112 | usbhs_bset(priv, pipe_reg, mask, val); | ||
| 113 | } | ||
| 114 | |||
| 115 | static u16 __usbhsp_pipe_xxx_get(struct usbhs_pipe *pipe, | ||
| 116 | u16 dcp_reg, u16 pipe_reg) | ||
| 117 | { | ||
| 118 | struct usbhs_priv *priv = usbhsp_pipe_to_priv(pipe); | ||
| 119 | |||
| 120 | if (usbhsp_is_dcp(pipe)) | ||
| 121 | return usbhs_read(priv, dcp_reg); | ||
| 122 | else | ||
| 123 | return usbhs_read(priv, pipe_reg); | ||
| 124 | } | ||
| 125 | |||
| 126 | /* | ||
| 127 | * DCPCFG/PIPECFG functions | ||
| 128 | */ | ||
| 129 | static void usbhsp_pipe_cfg_set(struct usbhs_pipe *pipe, u16 mask, u16 val) | ||
| 130 | { | ||
| 131 | __usbhsp_pipe_xxx_set(pipe, DCPCFG, PIPECFG, mask, val); | ||
| 132 | } | ||
| 133 | |||
| 134 | /* | ||
| 135 | * PIPEBUF | ||
| 136 | */ | ||
| 137 | static void usbhsp_pipe_buf_set(struct usbhs_pipe *pipe, u16 mask, u16 val) | ||
| 138 | { | ||
| 139 | if (usbhsp_is_dcp(pipe)) | ||
| 140 | return; | ||
| 141 | |||
| 142 | __usbhsp_pipe_xxx_set(pipe, 0, PIPEBUF, mask, val); | ||
| 143 | } | ||
| 144 | |||
| 145 | /* | ||
| 146 | * DCPMAXP/PIPEMAXP | ||
| 147 | */ | ||
| 148 | static void usbhsp_pipe_maxp_set(struct usbhs_pipe *pipe, u16 mask, u16 val) | ||
| 149 | { | ||
| 150 | __usbhsp_pipe_xxx_set(pipe, DCPMAXP, PIPEMAXP, mask, val); | ||
| 151 | } | ||
| 152 | |||
| 153 | static u16 usbhsp_pipe_maxp_get(struct usbhs_pipe *pipe) | ||
| 154 | { | ||
| 155 | return __usbhsp_pipe_xxx_get(pipe, DCPMAXP, PIPEMAXP); | ||
| 156 | } | ||
| 157 | |||
| 158 | /* | ||
| 159 | * pipe control functions | ||
| 160 | */ | ||
| 161 | static void usbhsp_pipe_select(struct usbhs_pipe *pipe) | ||
| 162 | { | ||
| 163 | struct usbhs_priv *priv = usbhsp_pipe_to_priv(pipe); | ||
| 164 | |||
| 165 | /* | ||
| 166 | * On pipe, this is necessary before | ||
| 167 | * accesses to below registers. | ||
| 168 | * | ||
| 169 | * PIPESEL : usbhsp_pipe_select | ||
| 170 | * PIPECFG : usbhsp_pipe_cfg_xxx | ||
| 171 | * PIPEBUF : usbhsp_pipe_buf_xxx | ||
| 172 | * PIPEMAXP : usbhsp_pipe_maxp_xxx | ||
| 173 | * PIPEPERI | ||
| 174 | */ | ||
| 175 | |||
| 176 | /* | ||
| 177 | * if pipe is dcp, no pipe is selected. | ||
| 178 | * it is no problem, because dcp have its register | ||
| 179 | */ | ||
| 180 | usbhs_write(priv, PIPESEL, 0xF & usbhs_pipe_number(pipe)); | ||
| 181 | } | ||
| 182 | |||
| 183 | static int usbhsp_pipe_barrier(struct usbhs_pipe *pipe) | ||
| 184 | { | ||
| 185 | struct usbhs_priv *priv = usbhsp_pipe_to_priv(pipe); | ||
| 186 | int timeout = 1024; | ||
| 187 | u16 val; | ||
| 188 | |||
| 189 | /* | ||
| 190 | * make sure.... | ||
| 191 | * | ||
| 192 | * Modify these bits when CSSTS = 0, PID = NAK, and no pipe number is | ||
| 193 | * specified by the CURPIPE bits. | ||
| 194 | * When changing the setting of this bit after changing | ||
| 195 | * the PID bits for the selected pipe from BUF to NAK, | ||
| 196 | * check that CSSTS = 0 and PBUSY = 0. | ||
| 197 | */ | ||
| 198 | |||
| 199 | /* | ||
| 200 | * CURPIPE bit = 0 | ||
| 201 | * | ||
| 202 | * see also | ||
| 203 | * "Operation" | ||
| 204 | * - "Pipe Control" | ||
| 205 | * - "Pipe Control Registers Switching Procedure" | ||
| 206 | */ | ||
| 207 | usbhs_write(priv, CFIFOSEL, 0); | ||
| 208 | usbhs_fifo_disable(pipe); | ||
| 209 | |||
| 210 | do { | ||
| 211 | val = usbhsp_pipectrl_get(pipe); | ||
| 212 | val &= CSSTS | PID_MASK; | ||
| 213 | if (!val) | ||
| 214 | return 0; | ||
| 215 | |||
| 216 | udelay(10); | ||
| 217 | |||
| 218 | } while (timeout--); | ||
| 219 | |||
| 220 | return -EBUSY; | ||
| 221 | } | ||
| 222 | |||
| 223 | static int usbhsp_pipe_is_accessible(struct usbhs_pipe *pipe) | ||
| 224 | { | ||
| 225 | u16 val; | ||
| 226 | |||
| 227 | val = usbhsp_pipectrl_get(pipe); | ||
| 228 | if (val & BSTS) | ||
| 229 | return 0; | ||
| 230 | |||
| 231 | return -EBUSY; | ||
| 232 | } | ||
| 233 | |||
| 234 | /* | ||
| 235 | * PID ctrl | ||
| 236 | */ | ||
| 237 | static void __usbhsp_pid_try_nak_if_stall(struct usbhs_pipe *pipe) | ||
| 238 | { | ||
| 239 | u16 pid = usbhsp_pipectrl_get(pipe); | ||
| 240 | |||
| 241 | pid &= PID_MASK; | ||
| 242 | |||
| 243 | /* | ||
| 244 | * see | ||
| 245 | * "Pipe n Control Register" - "PID" | ||
| 246 | */ | ||
| 247 | switch (pid) { | ||
| 248 | case PID_STALL11: | ||
| 249 | usbhsp_pipectrl_set(pipe, PID_MASK, PID_STALL10); | ||
| 250 | /* fall-through */ | ||
| 251 | case PID_STALL10: | ||
| 252 | usbhsp_pipectrl_set(pipe, PID_MASK, PID_NAK); | ||
| 253 | } | ||
| 254 | } | ||
| 255 | |||
| 256 | void usbhs_fifo_disable(struct usbhs_pipe *pipe) | ||
| 257 | { | ||
| 258 | int timeout = 1024; | ||
| 259 | u16 val; | ||
| 260 | |||
| 261 | /* see "Pipe n Control Register" - "PID" */ | ||
| 262 | __usbhsp_pid_try_nak_if_stall(pipe); | ||
| 263 | |||
| 264 | usbhsp_pipectrl_set(pipe, PID_MASK, PID_NAK); | ||
| 265 | |||
| 266 | do { | ||
| 267 | val = usbhsp_pipectrl_get(pipe); | ||
| 268 | val &= PBUSY; | ||
| 269 | if (!val) | ||
| 270 | break; | ||
| 271 | |||
| 272 | udelay(10); | ||
| 273 | } while (timeout--); | ||
| 274 | } | ||
| 275 | |||
| 276 | void usbhs_fifo_enable(struct usbhs_pipe *pipe) | ||
| 277 | { | ||
| 278 | /* see "Pipe n Control Register" - "PID" */ | ||
| 279 | __usbhsp_pid_try_nak_if_stall(pipe); | ||
| 280 | |||
| 281 | usbhsp_pipectrl_set(pipe, PID_MASK, PID_BUF); | ||
| 282 | } | ||
| 283 | |||
| 284 | void usbhs_fifo_stall(struct usbhs_pipe *pipe) | ||
| 285 | { | ||
| 286 | u16 pid = usbhsp_pipectrl_get(pipe); | ||
| 287 | |||
| 288 | pid &= PID_MASK; | ||
| 289 | |||
| 290 | /* | ||
| 291 | * see | ||
| 292 | * "Pipe n Control Register" - "PID" | ||
| 293 | */ | ||
| 294 | switch (pid) { | ||
| 295 | case PID_NAK: | ||
| 296 | usbhsp_pipectrl_set(pipe, PID_MASK, PID_STALL10); | ||
| 297 | break; | ||
| 298 | case PID_BUF: | ||
| 299 | usbhsp_pipectrl_set(pipe, PID_MASK, PID_STALL11); | ||
| 300 | break; | ||
| 301 | } | ||
| 302 | } | ||
| 303 | |||
| 304 | /* | ||
| 305 | * CFIFO ctrl | ||
| 306 | */ | ||
| 307 | void usbhs_fifo_send_terminator(struct usbhs_pipe *pipe) | ||
| 308 | { | ||
| 309 | struct usbhs_priv *priv = usbhsp_pipe_to_priv(pipe); | ||
| 310 | |||
| 311 | usbhs_bset(priv, CFIFOCTR, BVAL, BVAL); | ||
| 312 | } | ||
| 313 | |||
| 314 | static void usbhsp_fifo_clear(struct usbhs_pipe *pipe) | ||
| 315 | { | ||
| 316 | struct usbhs_priv *priv = usbhsp_pipe_to_priv(pipe); | ||
| 317 | |||
| 318 | usbhs_write(priv, CFIFOCTR, BCLR); | ||
| 319 | } | ||
| 320 | |||
| 321 | static int usbhsp_fifo_barrier(struct usbhs_priv *priv) | ||
| 322 | { | ||
| 323 | int timeout = 1024; | ||
| 324 | |||
| 325 | do { | ||
| 326 | /* The FIFO port is accessible */ | ||
| 327 | if (usbhs_read(priv, CFIFOCTR) & FRDY) | ||
| 328 | return 0; | ||
| 329 | |||
| 330 | udelay(10); | ||
| 331 | } while (timeout--); | ||
| 332 | |||
| 333 | return -EBUSY; | ||
| 334 | } | ||
| 335 | |||
| 336 | static int usbhsp_fifo_rcv_len(struct usbhs_priv *priv) | ||
| 337 | { | ||
| 338 | return usbhs_read(priv, CFIFOCTR) & DTLN_MASK; | ||
| 339 | } | ||
| 340 | |||
| 341 | static int usbhsp_fifo_select(struct usbhs_pipe *pipe, int write) | ||
| 342 | { | ||
| 343 | struct usbhs_priv *priv = usbhsp_pipe_to_priv(pipe); | ||
| 344 | struct device *dev = usbhs_priv_to_dev(priv); | ||
| 345 | int timeout = 1024; | ||
| 346 | u16 mask = ((1 << 5) | 0xF); /* mask of ISEL | CURPIPE */ | ||
| 347 | u16 base = usbhs_pipe_number(pipe); /* CURPIPE */ | ||
| 348 | |||
| 349 | if (usbhsp_is_dcp(pipe)) | ||
| 350 | base |= (1 == write) << 5; /* ISEL */ | ||
| 351 | |||
| 352 | /* "base" will be used below */ | ||
| 353 | usbhs_write(priv, CFIFOSEL, base | MBW_32); | ||
| 354 | |||
| 355 | /* check ISEL and CURPIPE value */ | ||
| 356 | while (timeout--) { | ||
| 357 | if (base == (mask & usbhs_read(priv, CFIFOSEL))) | ||
| 358 | return 0; | ||
| 359 | udelay(10); | ||
| 360 | } | ||
| 361 | |||
| 362 | dev_err(dev, "fifo select error\n"); | ||
| 363 | |||
| 364 | return -EIO; | ||
| 365 | } | ||
| 366 | |||
| 367 | int usbhs_fifo_prepare_write(struct usbhs_pipe *pipe) | ||
| 368 | { | ||
| 369 | return usbhsp_fifo_select(pipe, 1); | ||
| 370 | } | ||
| 371 | |||
| 372 | int usbhs_fifo_write(struct usbhs_pipe *pipe, u8 *buf, int len) | ||
| 373 | { | ||
| 374 | struct usbhs_priv *priv = usbhsp_pipe_to_priv(pipe); | ||
| 375 | void __iomem *addr = priv->base + CFIFO; | ||
| 376 | int maxp = usbhs_pipe_get_maxpacket(pipe); | ||
| 377 | int total_len; | ||
| 378 | int i, ret; | ||
| 379 | |||
| 380 | ret = usbhsp_pipe_is_accessible(pipe); | ||
| 381 | if (ret < 0) | ||
| 382 | return ret; | ||
| 383 | |||
| 384 | ret = usbhsp_fifo_select(pipe, 1); | ||
| 385 | if (ret < 0) | ||
| 386 | return ret; | ||
| 387 | |||
| 388 | ret = usbhsp_fifo_barrier(priv); | ||
| 389 | if (ret < 0) | ||
| 390 | return ret; | ||
| 391 | |||
| 392 | len = min(len, maxp); | ||
| 393 | total_len = len; | ||
| 394 | |||
| 395 | /* | ||
| 396 | * FIXME | ||
| 397 | * | ||
| 398 | * 32-bit access only | ||
| 399 | */ | ||
| 400 | if (len >= 4 && | ||
| 401 | !((unsigned long)buf & 0x03)) { | ||
| 402 | iowrite32_rep(addr, buf, len / 4); | ||
| 403 | len %= 4; | ||
| 404 | buf += total_len - len; | ||
| 405 | } | ||
| 406 | |||
| 407 | /* the rest operation */ | ||
| 408 | for (i = 0; i < len; i++) | ||
| 409 | iowrite8(buf[i], addr + (0x03 - (i & 0x03))); | ||
| 410 | |||
| 411 | if (total_len < maxp) | ||
| 412 | usbhs_fifo_send_terminator(pipe); | ||
| 413 | |||
| 414 | return total_len; | ||
| 415 | } | ||
| 416 | |||
| 417 | int usbhs_fifo_prepare_read(struct usbhs_pipe *pipe) | ||
| 418 | { | ||
| 419 | int ret; | ||
| 420 | |||
| 421 | /* | ||
| 422 | * select pipe and enable it to prepare packet receive | ||
| 423 | */ | ||
| 424 | ret = usbhsp_fifo_select(pipe, 0); | ||
| 425 | if (ret < 0) | ||
| 426 | return ret; | ||
| 427 | |||
| 428 | usbhs_fifo_enable(pipe); | ||
| 429 | |||
| 430 | return ret; | ||
| 431 | } | ||
| 432 | |||
| 433 | int usbhs_fifo_read(struct usbhs_pipe *pipe, u8 *buf, int len) | ||
| 434 | { | ||
| 435 | struct usbhs_priv *priv = usbhsp_pipe_to_priv(pipe); | ||
| 436 | void __iomem *addr = priv->base + CFIFO; | ||
| 437 | int rcv_len; | ||
| 438 | int i, ret; | ||
| 439 | int total_len; | ||
| 440 | u32 data = 0; | ||
| 441 | |||
| 442 | ret = usbhsp_fifo_select(pipe, 0); | ||
| 443 | if (ret < 0) | ||
| 444 | return ret; | ||
| 445 | |||
| 446 | ret = usbhsp_fifo_barrier(priv); | ||
| 447 | if (ret < 0) | ||
| 448 | return ret; | ||
| 449 | |||
| 450 | rcv_len = usbhsp_fifo_rcv_len(priv); | ||
| 451 | |||
| 452 | /* | ||
| 453 | * Buffer clear if Zero-Length packet | ||
| 454 | * | ||
| 455 | * see | ||
| 456 | * "Operation" - "FIFO Buffer Memory" - "FIFO Port Function" | ||
| 457 | */ | ||
| 458 | if (0 == rcv_len) { | ||
| 459 | usbhsp_fifo_clear(pipe); | ||
| 460 | return 0; | ||
| 461 | } | ||
| 462 | |||
| 463 | len = min(rcv_len, len); | ||
| 464 | total_len = len; | ||
| 465 | |||
| 466 | /* | ||
| 467 | * FIXME | ||
| 468 | * | ||
| 469 | * 32-bit access only | ||
| 470 | */ | ||
| 471 | if (len >= 4 && | ||
| 472 | !((unsigned long)buf & 0x03)) { | ||
| 473 | ioread32_rep(addr, buf, len / 4); | ||
| 474 | len %= 4; | ||
| 475 | buf += rcv_len - len; | ||
| 476 | } | ||
| 477 | |||
| 478 | /* the rest operation */ | ||
| 479 | for (i = 0; i < len; i++) { | ||
| 480 | if (!(i & 0x03)) | ||
| 481 | data = ioread32(addr); | ||
| 482 | |||
| 483 | buf[i] = (data >> ((i & 0x03) * 8)) & 0xff; | ||
| 484 | } | ||
| 485 | |||
| 486 | return total_len; | ||
| 487 | } | ||
| 488 | |||
| 489 | /* | ||
| 490 | * pipe setup | ||
| 491 | */ | ||
| 492 | static int usbhsp_possible_double_buffer(struct usbhs_pipe *pipe) | ||
| 493 | { | ||
| 494 | /* | ||
| 495 | * only ISO / BULK pipe can use double buffer | ||
| 496 | */ | ||
| 497 | if (usbhsp_type_is(pipe, USB_ENDPOINT_XFER_BULK) || | ||
| 498 | usbhsp_type_is(pipe, USB_ENDPOINT_XFER_ISOC)) | ||
| 499 | return 1; | ||
| 500 | |||
| 501 | return 0; | ||
| 502 | } | ||
| 503 | |||
| 504 | static u16 usbhsp_setup_pipecfg(struct usbhs_pipe *pipe, | ||
| 505 | const struct usb_endpoint_descriptor *desc, | ||
| 506 | int is_host) | ||
| 507 | { | ||
| 508 | u16 type = 0; | ||
| 509 | u16 bfre = 0; | ||
| 510 | u16 dblb = 0; | ||
| 511 | u16 cntmd = 0; | ||
| 512 | u16 dir = 0; | ||
| 513 | u16 epnum = 0; | ||
| 514 | u16 shtnak = 0; | ||
| 515 | u16 type_array[] = { | ||
| 516 | [USB_ENDPOINT_XFER_BULK] = TYPE_BULK, | ||
| 517 | [USB_ENDPOINT_XFER_INT] = TYPE_INT, | ||
| 518 | [USB_ENDPOINT_XFER_ISOC] = TYPE_ISO, | ||
| 519 | }; | ||
| 520 | int is_double = usbhsp_possible_double_buffer(pipe); | ||
| 521 | |||
| 522 | if (usbhsp_is_dcp(pipe)) | ||
| 523 | return -EINVAL; | ||
| 524 | |||
| 525 | /* | ||
| 526 | * PIPECFG | ||
| 527 | * | ||
| 528 | * see | ||
| 529 | * - "Register Descriptions" - "PIPECFG" register | ||
| 530 | * - "Features" - "Pipe configuration" | ||
| 531 | * - "Operation" - "Pipe Control" | ||
| 532 | */ | ||
| 533 | |||
| 534 | /* TYPE */ | ||
| 535 | type = type_array[usbhsp_type(pipe)]; | ||
| 536 | |||
| 537 | /* BFRE */ | ||
| 538 | if (usbhsp_type_is(pipe, USB_ENDPOINT_XFER_ISOC) || | ||
| 539 | usbhsp_type_is(pipe, USB_ENDPOINT_XFER_BULK)) | ||
| 540 | bfre = 0; /* FIXME */ | ||
| 541 | |||
| 542 | /* DBLB */ | ||
| 543 | if (usbhsp_type_is(pipe, USB_ENDPOINT_XFER_ISOC) || | ||
| 544 | usbhsp_type_is(pipe, USB_ENDPOINT_XFER_BULK)) | ||
| 545 | dblb = (is_double) ? DBLB : 0; | ||
| 546 | |||
| 547 | /* CNTMD */ | ||
| 548 | if (usbhsp_type_is(pipe, USB_ENDPOINT_XFER_BULK)) | ||
| 549 | cntmd = 0; /* FIXME */ | ||
| 550 | |||
| 551 | /* DIR */ | ||
| 552 | if (usb_endpoint_dir_in(desc)) | ||
| 553 | usbhsp_flags_set(pipe, IS_DIR_IN); | ||
| 554 | |||
| 555 | if ((is_host && usb_endpoint_dir_out(desc)) || | ||
| 556 | (!is_host && usb_endpoint_dir_in(desc))) | ||
| 557 | dir |= DIR_OUT; | ||
| 558 | |||
| 559 | /* SHTNAK */ | ||
| 560 | if (usbhsp_type_is(pipe, USB_ENDPOINT_XFER_BULK) && | ||
| 561 | !dir) | ||
| 562 | shtnak = SHTNAK; | ||
| 563 | |||
| 564 | /* EPNUM */ | ||
| 565 | epnum = 0xF & usb_endpoint_num(desc); | ||
| 566 | |||
| 567 | return type | | ||
| 568 | bfre | | ||
| 569 | dblb | | ||
| 570 | cntmd | | ||
| 571 | dir | | ||
| 572 | shtnak | | ||
| 573 | epnum; | ||
| 574 | } | ||
| 575 | |||
| 576 | static u16 usbhsp_setup_pipemaxp(struct usbhs_pipe *pipe, | ||
| 577 | const struct usb_endpoint_descriptor *desc, | ||
| 578 | int is_host) | ||
| 579 | { | ||
| 580 | /* host should set DEVSEL */ | ||
| 581 | |||
| 582 | /* reutn MXPS */ | ||
| 583 | return PIPE_MAXP_MASK & le16_to_cpu(desc->wMaxPacketSize); | ||
| 584 | } | ||
| 585 | |||
| 586 | static u16 usbhsp_setup_pipebuff(struct usbhs_pipe *pipe, | ||
| 587 | const struct usb_endpoint_descriptor *desc, | ||
| 588 | int is_host) | ||
| 589 | { | ||
| 590 | struct usbhs_priv *priv = usbhsp_pipe_to_priv(pipe); | ||
| 591 | struct usbhs_pipe_info *info = usbhsp_priv_to_pipeinfo(priv); | ||
| 592 | struct device *dev = usbhs_priv_to_dev(priv); | ||
| 593 | int pipe_num = usbhs_pipe_number(pipe); | ||
| 594 | int is_double = usbhsp_possible_double_buffer(pipe); | ||
| 595 | u16 buff_size; | ||
| 596 | u16 bufnmb; | ||
| 597 | u16 bufnmb_cnt; | ||
| 598 | |||
| 599 | /* | ||
| 600 | * PIPEBUF | ||
| 601 | * | ||
| 602 | * see | ||
| 603 | * - "Register Descriptions" - "PIPEBUF" register | ||
| 604 | * - "Features" - "Pipe configuration" | ||
| 605 | * - "Operation" - "FIFO Buffer Memory" | ||
| 606 | * - "Operation" - "Pipe Control" | ||
| 607 | * | ||
| 608 | * ex) if pipe6 - pipe9 are USB_ENDPOINT_XFER_INT (SH7724) | ||
| 609 | * | ||
| 610 | * BUFNMB: PIPE | ||
| 611 | * 0: pipe0 (DCP 256byte) | ||
| 612 | * 1: - | ||
| 613 | * 2: - | ||
| 614 | * 3: - | ||
| 615 | * 4: pipe6 (INT 64byte) | ||
| 616 | * 5: pipe7 (INT 64byte) | ||
| 617 | * 6: pipe8 (INT 64byte) | ||
| 618 | * 7: pipe9 (INT 64byte) | ||
| 619 | * 8 - xx: free (for BULK, ISOC) | ||
| 620 | */ | ||
| 621 | |||
| 622 | /* | ||
| 623 | * FIXME | ||
| 624 | * | ||
| 625 | * it doesn't have good buffer allocator | ||
| 626 | * | ||
| 627 | * DCP : 256 byte | ||
| 628 | * BULK: 512 byte | ||
| 629 | * INT : 64 byte | ||
| 630 | * ISOC: 512 byte | ||
| 631 | */ | ||
| 632 | if (usbhsp_type_is(pipe, USB_ENDPOINT_XFER_CONTROL)) | ||
| 633 | buff_size = 256; | ||
| 634 | else if (usbhsp_type_is(pipe, USB_ENDPOINT_XFER_INT)) | ||
| 635 | buff_size = 64; | ||
| 636 | else | ||
| 637 | buff_size = 512; | ||
| 638 | |||
| 639 | /* change buff_size to register value */ | ||
| 640 | bufnmb_cnt = (buff_size / 64) - 1; | ||
| 641 | |||
| 642 | /* BUFNMB has been reserved for INT pipe | ||
| 643 | * see above */ | ||
| 644 | if (usbhsp_type_is(pipe, USB_ENDPOINT_XFER_INT)) { | ||
| 645 | bufnmb = pipe_num - 2; | ||
| 646 | } else { | ||
| 647 | bufnmb = info->bufnmb_last; | ||
| 648 | info->bufnmb_last += bufnmb_cnt + 1; | ||
| 649 | |||
| 650 | /* | ||
| 651 | * double buffer | ||
| 652 | */ | ||
| 653 | if (is_double) | ||
| 654 | info->bufnmb_last += bufnmb_cnt + 1; | ||
| 655 | } | ||
| 656 | |||
| 657 | dev_dbg(dev, "pipe : %d : buff_size 0x%x: bufnmb 0x%x\n", | ||
| 658 | pipe_num, buff_size, bufnmb); | ||
| 659 | |||
| 660 | return (0x1f & bufnmb_cnt) << 10 | | ||
| 661 | (0xff & bufnmb) << 0; | ||
| 662 | } | ||
| 663 | |||
| 664 | /* | ||
| 665 | * pipe control | ||
| 666 | */ | ||
| 667 | int usbhs_pipe_get_maxpacket(struct usbhs_pipe *pipe) | ||
| 668 | { | ||
| 669 | u16 mask = usbhsp_is_dcp(pipe) ? DCP_MAXP_MASK : PIPE_MAXP_MASK; | ||
| 670 | |||
| 671 | usbhsp_pipe_select(pipe); | ||
| 672 | |||
| 673 | return (int)(usbhsp_pipe_maxp_get(pipe) & mask); | ||
| 674 | } | ||
| 675 | |||
| 676 | int usbhs_pipe_is_dir_in(struct usbhs_pipe *pipe) | ||
| 677 | { | ||
| 678 | return usbhsp_flags_has(pipe, IS_DIR_IN); | ||
| 679 | } | ||
| 680 | |||
| 681 | void usbhs_pipe_clear_sequence(struct usbhs_pipe *pipe) | ||
| 682 | { | ||
| 683 | usbhsp_pipectrl_set(pipe, SQCLR, SQCLR); | ||
| 684 | } | ||
| 685 | |||
| 686 | static struct usbhs_pipe *usbhsp_get_pipe(struct usbhs_priv *priv, u32 type) | ||
| 687 | { | ||
| 688 | struct usbhs_pipe *pos, *pipe; | ||
| 689 | int i; | ||
| 690 | |||
| 691 | /* | ||
| 692 | * find target pipe | ||
| 693 | */ | ||
| 694 | pipe = NULL; | ||
| 695 | usbhs_for_each_pipe_with_dcp(pos, priv, i) { | ||
| 696 | if (!usbhsp_type_is(pos, type)) | ||
| 697 | continue; | ||
| 698 | if (usbhsp_flags_has(pos, IS_USED)) | ||
| 699 | continue; | ||
| 700 | |||
| 701 | pipe = pos; | ||
| 702 | break; | ||
| 703 | } | ||
| 704 | |||
| 705 | if (!pipe) | ||
| 706 | return NULL; | ||
| 707 | |||
| 708 | /* | ||
| 709 | * initialize pipe flags | ||
| 710 | */ | ||
| 711 | usbhsp_flags_init(pipe); | ||
| 712 | usbhsp_flags_set(pipe, IS_USED); | ||
| 713 | |||
| 714 | return pipe; | ||
| 715 | } | ||
| 716 | |||
| 717 | void usbhs_pipe_init(struct usbhs_priv *priv) | ||
| 718 | { | ||
| 719 | struct usbhs_pipe_info *info = usbhsp_priv_to_pipeinfo(priv); | ||
| 720 | struct usbhs_pipe *pipe; | ||
| 721 | int i; | ||
| 722 | |||
| 723 | /* | ||
| 724 | * FIXME | ||
| 725 | * | ||
| 726 | * driver needs good allocator. | ||
| 727 | * | ||
| 728 | * find first free buffer area (BULK, ISOC) | ||
| 729 | * (DCP, INT area is fixed) | ||
| 730 | * | ||
| 731 | * buffer number 0 - 3 have been reserved for DCP | ||
| 732 | * see | ||
| 733 | * usbhsp_to_bufnmb | ||
| 734 | */ | ||
| 735 | info->bufnmb_last = 4; | ||
| 736 | usbhs_for_each_pipe_with_dcp(pipe, priv, i) { | ||
| 737 | if (usbhsp_type_is(pipe, USB_ENDPOINT_XFER_INT)) | ||
| 738 | info->bufnmb_last++; | ||
| 739 | |||
| 740 | usbhsp_flags_init(pipe); | ||
| 741 | pipe->mod_private = NULL; | ||
| 742 | |||
| 743 | usbhsp_fifo_clear(pipe); | ||
| 744 | } | ||
| 745 | } | ||
| 746 | |||
| 747 | struct usbhs_pipe *usbhs_pipe_malloc(struct usbhs_priv *priv, | ||
| 748 | const struct usb_endpoint_descriptor *desc) | ||
| 749 | { | ||
| 750 | struct device *dev = usbhs_priv_to_dev(priv); | ||
| 751 | struct usbhs_mod *mod = usbhs_mod_get_current(priv); | ||
| 752 | struct usbhs_pipe *pipe; | ||
| 753 | int is_host = usbhs_mod_is_host(priv, mod); | ||
| 754 | int ret; | ||
| 755 | u16 pipecfg, pipebuf, pipemaxp; | ||
| 756 | |||
| 757 | pipe = usbhsp_get_pipe(priv, usb_endpoint_type(desc)); | ||
| 758 | if (!pipe) { | ||
| 759 | dev_err(dev, "can't get pipe (%s)\n", | ||
| 760 | usbhsp_pipe_name[usb_endpoint_type(desc)]); | ||
| 761 | return NULL; | ||
| 762 | } | ||
| 763 | |||
| 764 | usbhs_fifo_disable(pipe); | ||
| 765 | |||
| 766 | /* make sure pipe is not busy */ | ||
| 767 | ret = usbhsp_pipe_barrier(pipe); | ||
| 768 | if (ret < 0) { | ||
| 769 | dev_err(dev, "pipe setup failed %d\n", usbhs_pipe_number(pipe)); | ||
| 770 | return NULL; | ||
| 771 | } | ||
| 772 | |||
| 773 | pipecfg = usbhsp_setup_pipecfg(pipe, desc, is_host); | ||
| 774 | pipebuf = usbhsp_setup_pipebuff(pipe, desc, is_host); | ||
| 775 | pipemaxp = usbhsp_setup_pipemaxp(pipe, desc, is_host); | ||
| 776 | |||
| 777 | /* buffer clear | ||
| 778 | * see PIPECFG :: BFRE */ | ||
| 779 | usbhsp_pipectrl_set(pipe, ACLRM, ACLRM); | ||
| 780 | usbhsp_pipectrl_set(pipe, ACLRM, 0); | ||
| 781 | |||
| 782 | usbhsp_pipe_select(pipe); | ||
| 783 | usbhsp_pipe_cfg_set(pipe, 0xFFFF, pipecfg); | ||
| 784 | usbhsp_pipe_buf_set(pipe, 0xFFFF, pipebuf); | ||
| 785 | usbhsp_pipe_maxp_set(pipe, 0xFFFF, pipemaxp); | ||
| 786 | |||
| 787 | usbhs_pipe_clear_sequence(pipe); | ||
| 788 | |||
| 789 | dev_dbg(dev, "enable pipe %d : %s (%s)\n", | ||
| 790 | usbhs_pipe_number(pipe), | ||
| 791 | usbhsp_pipe_name[usb_endpoint_type(desc)], | ||
| 792 | usbhs_pipe_is_dir_in(pipe) ? "in" : "out"); | ||
| 793 | |||
| 794 | return pipe; | ||
| 795 | } | ||
| 796 | |||
| 797 | /* | ||
| 798 | * dcp control | ||
| 799 | */ | ||
| 800 | struct usbhs_pipe *usbhs_dcp_malloc(struct usbhs_priv *priv) | ||
| 801 | { | ||
| 802 | struct usbhs_pipe *pipe; | ||
| 803 | |||
| 804 | pipe = usbhsp_get_pipe(priv, USB_ENDPOINT_XFER_CONTROL); | ||
| 805 | if (!pipe) | ||
| 806 | return NULL; | ||
| 807 | |||
| 808 | /* | ||
| 809 | * dcpcfg : default | ||
| 810 | * dcpmaxp : default | ||
| 811 | * pipebuf : nothing to do | ||
| 812 | */ | ||
| 813 | |||
| 814 | usbhsp_pipe_select(pipe); | ||
| 815 | usbhs_pipe_clear_sequence(pipe); | ||
| 816 | |||
| 817 | return pipe; | ||
| 818 | } | ||
| 819 | |||
| 820 | void usbhs_dcp_control_transfer_done(struct usbhs_pipe *pipe) | ||
| 821 | { | ||
| 822 | WARN_ON(!usbhsp_is_dcp(pipe)); | ||
| 823 | |||
| 824 | usbhs_fifo_enable(pipe); | ||
| 825 | usbhsp_pipectrl_set(pipe, CCPL, CCPL); | ||
| 826 | } | ||
| 827 | |||
| 828 | |||
| 829 | /* | ||
| 830 | * pipe module function | ||
| 831 | */ | ||
| 832 | int usbhs_pipe_probe(struct usbhs_priv *priv) | ||
| 833 | { | ||
| 834 | struct usbhs_pipe_info *info = usbhsp_priv_to_pipeinfo(priv); | ||
| 835 | struct usbhs_pipe *pipe; | ||
| 836 | struct device *dev = usbhs_priv_to_dev(priv); | ||
| 837 | u32 *pipe_type = usbhs_get_dparam(priv, pipe_type); | ||
| 838 | int pipe_size = usbhs_get_dparam(priv, pipe_size); | ||
| 839 | int i; | ||
| 840 | |||
| 841 | /* This driver expects 1st pipe is DCP */ | ||
| 842 | if (pipe_type[0] != USB_ENDPOINT_XFER_CONTROL) { | ||
| 843 | dev_err(dev, "1st PIPE is not DCP\n"); | ||
| 844 | return -EINVAL; | ||
| 845 | } | ||
| 846 | |||
| 847 | info->pipe = kzalloc(sizeof(struct usbhs_pipe) * pipe_size, GFP_KERNEL); | ||
| 848 | if (!info->pipe) { | ||
| 849 | dev_err(dev, "Could not allocate pipe\n"); | ||
| 850 | return -ENOMEM; | ||
| 851 | } | ||
| 852 | |||
| 853 | info->size = pipe_size; | ||
| 854 | |||
| 855 | /* | ||
| 856 | * init pipe | ||
| 857 | */ | ||
| 858 | usbhs_for_each_pipe_with_dcp(pipe, priv, i) { | ||
| 859 | pipe->priv = priv; | ||
| 860 | usbhsp_type(pipe) = pipe_type[i] & USB_ENDPOINT_XFERTYPE_MASK; | ||
| 861 | |||
| 862 | dev_dbg(dev, "pipe %x\t: %s\n", | ||
| 863 | i, usbhsp_pipe_name[pipe_type[i]]); | ||
| 864 | } | ||
| 865 | |||
| 866 | return 0; | ||
| 867 | } | ||
| 868 | |||
| 869 | void usbhs_pipe_remove(struct usbhs_priv *priv) | ||
| 870 | { | ||
| 871 | struct usbhs_pipe_info *info = usbhsp_priv_to_pipeinfo(priv); | ||
| 872 | |||
| 873 | kfree(info->pipe); | ||
| 874 | } | ||
diff --git a/drivers/usb/renesas_usbhs/pipe.h b/drivers/usb/renesas_usbhs/pipe.h new file mode 100644 index 00000000000..1cca9b7fb26 --- /dev/null +++ b/drivers/usb/renesas_usbhs/pipe.h | |||
| @@ -0,0 +1,104 @@ | |||
| 1 | /* | ||
| 2 | * Renesas USB driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Renesas Solutions Corp. | ||
| 5 | * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, write to the Free Software | ||
| 14 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 15 | * | ||
| 16 | */ | ||
| 17 | #ifndef RENESAS_USB_PIPE_H | ||
| 18 | #define RENESAS_USB_PIPE_H | ||
| 19 | |||
| 20 | #include "./common.h" | ||
| 21 | |||
| 22 | /* | ||
| 23 | * struct | ||
| 24 | */ | ||
| 25 | struct usbhs_pipe { | ||
| 26 | u32 pipe_type; /* USB_ENDPOINT_XFER_xxx */ | ||
| 27 | |||
| 28 | struct usbhs_priv *priv; | ||
| 29 | |||
| 30 | u32 flags; | ||
| 31 | #define USBHS_PIPE_FLAGS_IS_USED (1 << 0) | ||
| 32 | #define USBHS_PIPE_FLAGS_IS_DIR_IN (1 << 1) | ||
| 33 | |||
| 34 | void *mod_private; | ||
| 35 | }; | ||
| 36 | |||
| 37 | struct usbhs_pipe_info { | ||
| 38 | struct usbhs_pipe *pipe; | ||
| 39 | int size; /* array size of "pipe" */ | ||
| 40 | int bufnmb_last; /* FIXME : driver needs good allocator */ | ||
| 41 | }; | ||
| 42 | |||
| 43 | /* | ||
| 44 | * pipe list | ||
| 45 | */ | ||
| 46 | #define __usbhs_for_each_pipe(start, pos, info, i) \ | ||
| 47 | for (i = start, pos = (info)->pipe; \ | ||
| 48 | i < (info)->size; \ | ||
| 49 | i++, pos = (info)->pipe + i) | ||
| 50 | |||
| 51 | #define usbhs_for_each_pipe(pos, priv, i) \ | ||
| 52 | __usbhs_for_each_pipe(1, pos, &((priv)->pipe_info), i) | ||
| 53 | |||
| 54 | #define usbhs_for_each_pipe_with_dcp(pos, priv, i) \ | ||
| 55 | __usbhs_for_each_pipe(0, pos, &((priv)->pipe_info), i) | ||
| 56 | |||
| 57 | /* | ||
| 58 | * pipe module probe / remove | ||
| 59 | */ | ||
| 60 | int usbhs_pipe_probe(struct usbhs_priv *priv); | ||
| 61 | void usbhs_pipe_remove(struct usbhs_priv *priv); | ||
| 62 | |||
| 63 | /* | ||
| 64 | * cfifo | ||
| 65 | */ | ||
| 66 | int usbhs_fifo_write(struct usbhs_pipe *pipe, u8 *buf, int len); | ||
| 67 | int usbhs_fifo_read(struct usbhs_pipe *pipe, u8 *buf, int len); | ||
| 68 | int usbhs_fifo_prepare_write(struct usbhs_pipe *pipe); | ||
| 69 | int usbhs_fifo_prepare_read(struct usbhs_pipe *pipe); | ||
| 70 | |||
| 71 | void usbhs_fifo_enable(struct usbhs_pipe *pipe); | ||
| 72 | void usbhs_fifo_disable(struct usbhs_pipe *pipe); | ||
| 73 | void usbhs_fifo_stall(struct usbhs_pipe *pipe); | ||
| 74 | |||
| 75 | void usbhs_fifo_send_terminator(struct usbhs_pipe *pipe); | ||
| 76 | |||
| 77 | |||
| 78 | /* | ||
| 79 | * usb request | ||
| 80 | */ | ||
| 81 | void usbhs_usbreq_get_val(struct usbhs_priv *priv, struct usb_ctrlrequest *req); | ||
| 82 | void usbhs_usbreq_set_val(struct usbhs_priv *priv, struct usb_ctrlrequest *req); | ||
| 83 | |||
| 84 | /* | ||
| 85 | * pipe control | ||
| 86 | */ | ||
| 87 | struct usbhs_pipe | ||
| 88 | *usbhs_pipe_malloc(struct usbhs_priv *priv, | ||
| 89 | const struct usb_endpoint_descriptor *desc); | ||
| 90 | |||
| 91 | int usbhs_pipe_is_dir_in(struct usbhs_pipe *pipe); | ||
| 92 | void usbhs_pipe_init(struct usbhs_priv *priv); | ||
| 93 | int usbhs_pipe_get_maxpacket(struct usbhs_pipe *pipe); | ||
| 94 | void usbhs_pipe_clear_sequence(struct usbhs_pipe *pipe); | ||
| 95 | |||
| 96 | #define usbhs_pipe_number(p) (int)((p) - (p)->priv->pipe_info.pipe) | ||
| 97 | |||
| 98 | /* | ||
| 99 | * dcp control | ||
| 100 | */ | ||
| 101 | struct usbhs_pipe *usbhs_dcp_malloc(struct usbhs_priv *priv); | ||
| 102 | void usbhs_dcp_control_transfer_done(struct usbhs_pipe *pipe); | ||
| 103 | |||
| 104 | #endif /* RENESAS_USB_PIPE_H */ | ||
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index c2b29761fa9..b71e309116a 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig | |||
| @@ -527,15 +527,6 @@ config USB_SERIAL_SAFE_PADDED | |||
| 527 | bool "USB Secure Encapsulated Driver - Padded" | 527 | bool "USB Secure Encapsulated Driver - Padded" |
| 528 | depends on USB_SERIAL_SAFE | 528 | depends on USB_SERIAL_SAFE |
| 529 | 529 | ||
| 530 | config USB_SERIAL_SAMBA | ||
| 531 | tristate "USB Atmel SAM Boot Assistant (SAM-BA) driver" | ||
| 532 | help | ||
| 533 | Say Y here if you want to access the SAM-BA boot application of an | ||
| 534 | Atmel AT91SAM device. | ||
| 535 | |||
| 536 | To compile this driver as a module, choose M here: the | ||
| 537 | module will be called sam-ba. | ||
| 538 | |||
| 539 | config USB_SERIAL_SIEMENS_MPI | 530 | config USB_SERIAL_SIEMENS_MPI |
| 540 | tristate "USB Siemens MPI driver" | 531 | tristate "USB Siemens MPI driver" |
| 541 | help | 532 | help |
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile index 9a2117f2b06..9e536eefb32 100644 --- a/drivers/usb/serial/Makefile +++ b/drivers/usb/serial/Makefile | |||
| @@ -48,7 +48,6 @@ obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o | |||
| 48 | obj-$(CONFIG_USB_SERIAL_QCAUX) += qcaux.o | 48 | obj-$(CONFIG_USB_SERIAL_QCAUX) += qcaux.o |
| 49 | obj-$(CONFIG_USB_SERIAL_QUALCOMM) += qcserial.o | 49 | obj-$(CONFIG_USB_SERIAL_QUALCOMM) += qcserial.o |
| 50 | obj-$(CONFIG_USB_SERIAL_SAFE) += safe_serial.o | 50 | obj-$(CONFIG_USB_SERIAL_SAFE) += safe_serial.o |
| 51 | obj-$(CONFIG_USB_SERIAL_SAMBA) += sam-ba.o | ||
| 52 | obj-$(CONFIG_USB_SERIAL_SIEMENS_MPI) += siemens_mpi.o | 51 | obj-$(CONFIG_USB_SERIAL_SIEMENS_MPI) += siemens_mpi.o |
| 53 | obj-$(CONFIG_USB_SERIAL_SIERRAWIRELESS) += sierra.o | 52 | obj-$(CONFIG_USB_SERIAL_SIERRAWIRELESS) += sierra.o |
| 54 | obj-$(CONFIG_USB_SERIAL_SPCP8X5) += spcp8x5.o | 53 | obj-$(CONFIG_USB_SERIAL_SPCP8X5) += spcp8x5.o |
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index 0f11afdda13..fd67cc53545 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
| @@ -102,7 +102,7 @@ static const struct usb_device_id id_table[] = { | |||
| 102 | { USB_DEVICE(0x10C4, 0x8218) }, /* Lipowsky Industrie Elektronik GmbH, HARP-1 */ | 102 | { USB_DEVICE(0x10C4, 0x8218) }, /* Lipowsky Industrie Elektronik GmbH, HARP-1 */ |
| 103 | { USB_DEVICE(0x10C4, 0x822B) }, /* Modem EDGE(GSM) Comander 2 */ | 103 | { USB_DEVICE(0x10C4, 0x822B) }, /* Modem EDGE(GSM) Comander 2 */ |
| 104 | { USB_DEVICE(0x10C4, 0x826B) }, /* Cygnal Integrated Products, Inc., Fasttrax GPS demonstration module */ | 104 | { USB_DEVICE(0x10C4, 0x826B) }, /* Cygnal Integrated Products, Inc., Fasttrax GPS demonstration module */ |
| 105 | { USB_DEVICE(0x10C4, 0x8293) }, /* Telegesys ETRX2USB */ | 105 | { USB_DEVICE(0x10C4, 0x8293) }, /* Telegesis ETRX2USB */ |
| 106 | { USB_DEVICE(0x10C4, 0x82F9) }, /* Procyon AVS */ | 106 | { USB_DEVICE(0x10C4, 0x82F9) }, /* Procyon AVS */ |
| 107 | { USB_DEVICE(0x10C4, 0x8341) }, /* Siemens MC35PU GPRS Modem */ | 107 | { USB_DEVICE(0x10C4, 0x8341) }, /* Siemens MC35PU GPRS Modem */ |
| 108 | { USB_DEVICE(0x10C4, 0x8382) }, /* Cygnal Integrated Products, Inc. */ | 108 | { USB_DEVICE(0x10C4, 0x8382) }, /* Cygnal Integrated Products, Inc. */ |
| @@ -112,6 +112,10 @@ static const struct usb_device_id id_table[] = { | |||
| 112 | { USB_DEVICE(0x10C4, 0x8418) }, /* IRZ Automation Teleport SG-10 GSM/GPRS Modem */ | 112 | { USB_DEVICE(0x10C4, 0x8418) }, /* IRZ Automation Teleport SG-10 GSM/GPRS Modem */ |
| 113 | { USB_DEVICE(0x10C4, 0x846E) }, /* BEI USB Sensor Interface (VCP) */ | 113 | { USB_DEVICE(0x10C4, 0x846E) }, /* BEI USB Sensor Interface (VCP) */ |
| 114 | { USB_DEVICE(0x10C4, 0x8477) }, /* Balluff RFID */ | 114 | { USB_DEVICE(0x10C4, 0x8477) }, /* Balluff RFID */ |
| 115 | { USB_DEVICE(0x10C4, 0x85EA) }, /* AC-Services IBUS-IF */ | ||
| 116 | { USB_DEVICE(0x10C4, 0x85EB) }, /* AC-Services CIS-IBUS */ | ||
| 117 | { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ | ||
| 118 | { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ | ||
| 115 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ | 119 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ |
| 116 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ | 120 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ |
| 117 | { USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */ | 121 | { USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */ |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 4de6ef0ae52..e8dbde55f6c 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -566,6 +566,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 566 | { USB_DEVICE(FTDI_VID, FTDI_IBS_APP70_PID) }, | 566 | { USB_DEVICE(FTDI_VID, FTDI_IBS_APP70_PID) }, |
| 567 | { USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) }, | 567 | { USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) }, |
| 568 | { USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) }, | 568 | { USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) }, |
| 569 | { USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) }, | ||
| 569 | /* | 570 | /* |
| 570 | * ELV devices: | 571 | * ELV devices: |
| 571 | */ | 572 | */ |
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index efffc23723b..1d946cd238b 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
| @@ -491,6 +491,11 @@ | |||
| 491 | /* www.canusb.com Lawicel CANUSB device (FTDI_VID) */ | 491 | /* www.canusb.com Lawicel CANUSB device (FTDI_VID) */ |
| 492 | #define FTDI_CANUSB_PID 0xFFA8 /* Product Id */ | 492 | #define FTDI_CANUSB_PID 0xFFA8 /* Product Id */ |
| 493 | 493 | ||
| 494 | /* | ||
| 495 | * TavIR AVR product ids (FTDI_VID) | ||
| 496 | */ | ||
| 497 | #define FTDI_TAVIR_STK500_PID 0xFA33 /* STK500 AVR programmer */ | ||
| 498 | |||
| 494 | 499 | ||
| 495 | 500 | ||
| 496 | /********************************/ | 501 | /********************************/ |
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 26710b18991..b0a7a9e909a 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Garmin GPS driver | 2 | * Garmin GPS driver |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2006-2009 Hermann Kneissel herkne@users.sourceforge.net | 4 | * Copyright (C) 2006-2011 Hermann Kneissel herkne@gmx.de |
| 5 | * | 5 | * |
| 6 | * The latest version of the driver can be found at | 6 | * The latest version of the driver can be found at |
| 7 | * http://sourceforge.net/projects/garmin-gps/ | 7 | * http://sourceforge.net/projects/garmin-gps/ |
| @@ -51,7 +51,7 @@ static int debug; | |||
| 51 | */ | 51 | */ |
| 52 | 52 | ||
| 53 | #define VERSION_MAJOR 0 | 53 | #define VERSION_MAJOR 0 |
| 54 | #define VERSION_MINOR 33 | 54 | #define VERSION_MINOR 36 |
| 55 | 55 | ||
| 56 | #define _STR(s) #s | 56 | #define _STR(s) #s |
| 57 | #define _DRIVER_VERSION(a, b) "v" _STR(a) "." _STR(b) | 57 | #define _DRIVER_VERSION(a, b) "v" _STR(a) "." _STR(b) |
| @@ -410,6 +410,7 @@ static int gsp_send_ack(struct garmin_data *garmin_data_p, __u8 pkt_id) | |||
| 410 | */ | 410 | */ |
| 411 | static int gsp_rec_packet(struct garmin_data *garmin_data_p, int count) | 411 | static int gsp_rec_packet(struct garmin_data *garmin_data_p, int count) |
| 412 | { | 412 | { |
| 413 | unsigned long flags; | ||
| 413 | const __u8 *recpkt = garmin_data_p->inbuffer+GSP_INITIAL_OFFSET; | 414 | const __u8 *recpkt = garmin_data_p->inbuffer+GSP_INITIAL_OFFSET; |
| 414 | __le32 *usbdata = (__le32 *) garmin_data_p->inbuffer; | 415 | __le32 *usbdata = (__le32 *) garmin_data_p->inbuffer; |
| 415 | 416 | ||
| @@ -458,7 +459,9 @@ static int gsp_rec_packet(struct garmin_data *garmin_data_p, int count) | |||
| 458 | /* if this was an abort-transfer command, flush all | 459 | /* if this was an abort-transfer command, flush all |
| 459 | queued data. */ | 460 | queued data. */ |
| 460 | if (isAbortTrfCmnd(garmin_data_p->inbuffer)) { | 461 | if (isAbortTrfCmnd(garmin_data_p->inbuffer)) { |
| 462 | spin_lock_irqsave(&garmin_data_p->lock, flags); | ||
| 461 | garmin_data_p->flags |= FLAGS_DROP_DATA; | 463 | garmin_data_p->flags |= FLAGS_DROP_DATA; |
| 464 | spin_unlock_irqrestore(&garmin_data_p->lock, flags); | ||
| 462 | pkt_clear(garmin_data_p); | 465 | pkt_clear(garmin_data_p); |
| 463 | } | 466 | } |
| 464 | 467 | ||
| @@ -943,7 +946,7 @@ static int garmin_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
| 943 | spin_lock_irqsave(&garmin_data_p->lock, flags); | 946 | spin_lock_irqsave(&garmin_data_p->lock, flags); |
| 944 | garmin_data_p->mode = initial_mode; | 947 | garmin_data_p->mode = initial_mode; |
| 945 | garmin_data_p->count = 0; | 948 | garmin_data_p->count = 0; |
| 946 | garmin_data_p->flags = 0; | 949 | garmin_data_p->flags &= FLAGS_SESSION_REPLY1_SEEN; |
| 947 | spin_unlock_irqrestore(&garmin_data_p->lock, flags); | 950 | spin_unlock_irqrestore(&garmin_data_p->lock, flags); |
| 948 | 951 | ||
| 949 | /* shutdown any bulk reads that might be going on */ | 952 | /* shutdown any bulk reads that might be going on */ |
| @@ -1178,7 +1181,8 @@ static int garmin_write_room(struct tty_struct *tty) | |||
| 1178 | 1181 | ||
| 1179 | 1182 | ||
| 1180 | static void garmin_read_process(struct garmin_data *garmin_data_p, | 1183 | static void garmin_read_process(struct garmin_data *garmin_data_p, |
| 1181 | unsigned char *data, unsigned data_length) | 1184 | unsigned char *data, unsigned data_length, |
| 1185 | int bulk_data) | ||
| 1182 | { | 1186 | { |
| 1183 | unsigned long flags; | 1187 | unsigned long flags; |
| 1184 | 1188 | ||
| @@ -1193,7 +1197,8 @@ static void garmin_read_process(struct garmin_data *garmin_data_p, | |||
| 1193 | send it directly to the tty port */ | 1197 | send it directly to the tty port */ |
| 1194 | if (garmin_data_p->flags & FLAGS_QUEUING) { | 1198 | if (garmin_data_p->flags & FLAGS_QUEUING) { |
| 1195 | pkt_add(garmin_data_p, data, data_length); | 1199 | pkt_add(garmin_data_p, data, data_length); |
| 1196 | } else if (getLayerId(data) == GARMIN_LAYERID_APPL) { | 1200 | } else if (bulk_data || |
| 1201 | getLayerId(data) == GARMIN_LAYERID_APPL) { | ||
| 1197 | 1202 | ||
| 1198 | spin_lock_irqsave(&garmin_data_p->lock, flags); | 1203 | spin_lock_irqsave(&garmin_data_p->lock, flags); |
| 1199 | garmin_data_p->flags |= APP_RESP_SEEN; | 1204 | garmin_data_p->flags |= APP_RESP_SEEN; |
| @@ -1237,7 +1242,7 @@ static void garmin_read_bulk_callback(struct urb *urb) | |||
| 1237 | usb_serial_debug_data(debug, &port->dev, | 1242 | usb_serial_debug_data(debug, &port->dev, |
| 1238 | __func__, urb->actual_length, data); | 1243 | __func__, urb->actual_length, data); |
| 1239 | 1244 | ||
| 1240 | garmin_read_process(garmin_data_p, data, urb->actual_length); | 1245 | garmin_read_process(garmin_data_p, data, urb->actual_length, 1); |
| 1241 | 1246 | ||
| 1242 | if (urb->actual_length == 0 && | 1247 | if (urb->actual_length == 0 && |
| 1243 | 0 != (garmin_data_p->flags & FLAGS_BULK_IN_RESTART)) { | 1248 | 0 != (garmin_data_p->flags & FLAGS_BULK_IN_RESTART)) { |
| @@ -1346,7 +1351,7 @@ static void garmin_read_int_callback(struct urb *urb) | |||
| 1346 | __func__, garmin_data_p->serial_num); | 1351 | __func__, garmin_data_p->serial_num); |
| 1347 | } | 1352 | } |
| 1348 | 1353 | ||
| 1349 | garmin_read_process(garmin_data_p, data, urb->actual_length); | 1354 | garmin_read_process(garmin_data_p, data, urb->actual_length, 0); |
| 1350 | 1355 | ||
| 1351 | port->interrupt_in_urb->dev = port->serial->dev; | 1356 | port->interrupt_in_urb->dev = port->serial->dev; |
| 1352 | retval = usb_submit_urb(urb, GFP_ATOMIC); | 1357 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
| @@ -1461,6 +1466,7 @@ static int garmin_attach(struct usb_serial *serial) | |||
| 1461 | garmin_data_p->timer.function = timeout_handler; | 1466 | garmin_data_p->timer.function = timeout_handler; |
| 1462 | garmin_data_p->port = port; | 1467 | garmin_data_p->port = port; |
| 1463 | garmin_data_p->state = 0; | 1468 | garmin_data_p->state = 0; |
| 1469 | garmin_data_p->flags = 0; | ||
| 1464 | garmin_data_p->count = 0; | 1470 | garmin_data_p->count = 0; |
| 1465 | usb_set_serial_port_data(port, garmin_data_p); | 1471 | usb_set_serial_port_data(port, garmin_data_p); |
| 1466 | 1472 | ||
diff --git a/drivers/usb/serial/moto_modem.c b/drivers/usb/serial/moto_modem.c index 653465f61d4..e2bfecc4640 100644 --- a/drivers/usb/serial/moto_modem.c +++ b/drivers/usb/serial/moto_modem.c | |||
| @@ -25,6 +25,7 @@ static const struct usb_device_id id_table[] = { | |||
| 25 | { USB_DEVICE(0x05c6, 0x3197) }, /* unknown Motorola phone */ | 25 | { USB_DEVICE(0x05c6, 0x3197) }, /* unknown Motorola phone */ |
| 26 | { USB_DEVICE(0x0c44, 0x0022) }, /* unknown Mororola phone */ | 26 | { USB_DEVICE(0x0c44, 0x0022) }, /* unknown Mororola phone */ |
| 27 | { USB_DEVICE(0x22b8, 0x2a64) }, /* Motorola KRZR K1m */ | 27 | { USB_DEVICE(0x22b8, 0x2a64) }, /* Motorola KRZR K1m */ |
| 28 | { USB_DEVICE(0x22b8, 0x2c84) }, /* Motorola VE240 phone */ | ||
| 28 | { USB_DEVICE(0x22b8, 0x2c64) }, /* Motorola V950 phone */ | 29 | { USB_DEVICE(0x22b8, 0x2c64) }, /* Motorola V950 phone */ |
| 29 | { }, | 30 | { }, |
| 30 | }; | 31 | }; |
diff --git a/drivers/usb/serial/opticon.c b/drivers/usb/serial/opticon.c index 1b5633f4698..96423f3c8ef 100644 --- a/drivers/usb/serial/opticon.c +++ b/drivers/usb/serial/opticon.c | |||
| @@ -289,8 +289,11 @@ static int opticon_write(struct tty_struct *tty, struct usb_serial_port *port, | |||
| 289 | /* The conncected devices do not have a bulk write endpoint, | 289 | /* The conncected devices do not have a bulk write endpoint, |
| 290 | * to transmit data to de barcode device the control endpoint is used */ | 290 | * to transmit data to de barcode device the control endpoint is used */ |
| 291 | dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO); | 291 | dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO); |
| 292 | if (!dr) | 292 | if (!dr) { |
| 293 | return -ENOMEM; | 293 | dev_err(&port->dev, "out of memory\n"); |
| 294 | count = -ENOMEM; | ||
| 295 | goto error; | ||
| 296 | } | ||
| 294 | 297 | ||
| 295 | dr->bRequestType = USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT; | 298 | dr->bRequestType = USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT; |
| 296 | dr->bRequest = 0x01; | 299 | dr->bRequest = 0x01; |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index d77ff043589..318dd00040a 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -149,6 +149,7 @@ static void option_instat_callback(struct urb *urb); | |||
| 149 | #define HUAWEI_PRODUCT_K3765 0x1465 | 149 | #define HUAWEI_PRODUCT_K3765 0x1465 |
| 150 | #define HUAWEI_PRODUCT_E14AC 0x14AC | 150 | #define HUAWEI_PRODUCT_E14AC 0x14AC |
| 151 | #define HUAWEI_PRODUCT_ETS1220 0x1803 | 151 | #define HUAWEI_PRODUCT_ETS1220 0x1803 |
| 152 | #define HUAWEI_PRODUCT_E353 0x1506 | ||
| 152 | 153 | ||
| 153 | #define QUANTA_VENDOR_ID 0x0408 | 154 | #define QUANTA_VENDOR_ID 0x0408 |
| 154 | #define QUANTA_PRODUCT_Q101 0xEA02 | 155 | #define QUANTA_PRODUCT_Q101 0xEA02 |
| @@ -532,6 +533,7 @@ static const struct usb_device_id option_ids[] = { | |||
| 532 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff) }, | 533 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff) }, |
| 533 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_ETS1220, 0xff, 0xff, 0xff) }, | 534 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_ETS1220, 0xff, 0xff, 0xff) }, |
| 534 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E14AC, 0xff, 0xff, 0xff) }, | 535 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E14AC, 0xff, 0xff, 0xff) }, |
| 536 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x01) }, | ||
| 535 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, | 537 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, |
| 536 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, | 538 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, |
| 537 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V740) }, | 539 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V740) }, |
| @@ -972,7 +974,7 @@ static const struct usb_device_id option_ids[] = { | |||
| 972 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) }, | 974 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) }, |
| 973 | { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ | 975 | { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ |
| 974 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_MT825UP) }, /* ONDA MT825UP modem */ | 976 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_MT825UP) }, /* ONDA MT825UP modem */ |
| 975 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730/GT-B3710 LTE USB modem.*/ | 977 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ |
| 976 | { } /* Terminating entry */ | 978 | { } /* Terminating entry */ |
| 977 | }; | 979 | }; |
| 978 | MODULE_DEVICE_TABLE(usb, option_ids); | 980 | MODULE_DEVICE_TABLE(usb, option_ids); |
| @@ -1109,6 +1111,12 @@ static int option_probe(struct usb_serial *serial, | |||
| 1109 | serial->interface->cur_altsetting->desc.bInterfaceNumber == 1) | 1111 | serial->interface->cur_altsetting->desc.bInterfaceNumber == 1) |
| 1110 | return -ENODEV; | 1112 | return -ENODEV; |
| 1111 | 1113 | ||
| 1114 | /* Don't bind network interface on Samsung GT-B3730, it is handled by a separate module */ | ||
| 1115 | if (serial->dev->descriptor.idVendor == SAMSUNG_VENDOR_ID && | ||
| 1116 | serial->dev->descriptor.idProduct == SAMSUNG_PRODUCT_GT_B3730 && | ||
| 1117 | serial->interface->cur_altsetting->desc.bInterfaceClass != USB_CLASS_CDC_DATA) | ||
| 1118 | return -ENODEV; | ||
| 1119 | |||
| 1112 | data = serial->private = kzalloc(sizeof(struct usb_wwan_intf_private), GFP_KERNEL); | 1120 | data = serial->private = kzalloc(sizeof(struct usb_wwan_intf_private), GFP_KERNEL); |
| 1113 | 1121 | ||
| 1114 | if (!data) | 1122 | if (!data) |
diff --git a/drivers/usb/serial/sam-ba.c b/drivers/usb/serial/sam-ba.c deleted file mode 100644 index e3bba64afc5..00000000000 --- a/drivers/usb/serial/sam-ba.c +++ /dev/null | |||
| @@ -1,206 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Atmel SAM Boot Assistant (SAM-BA) driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 Johan Hovold <jhovold@gmail.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License version | ||
| 8 | * 2 as published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/kernel.h> | ||
| 12 | #include <linux/tty.h> | ||
| 13 | #include <linux/module.h> | ||
| 14 | #include <linux/moduleparam.h> | ||
| 15 | #include <linux/usb.h> | ||
| 16 | #include <linux/usb/serial.h> | ||
| 17 | |||
| 18 | |||
| 19 | #define DRIVER_VERSION "v1.0" | ||
| 20 | #define DRIVER_AUTHOR "Johan Hovold <jhovold@gmail.com>" | ||
| 21 | #define DRIVER_DESC "Atmel SAM Boot Assistant (SAM-BA) driver" | ||
| 22 | |||
| 23 | #define SAMBA_VENDOR_ID 0x3eb | ||
| 24 | #define SAMBA_PRODUCT_ID 0x6124 | ||
| 25 | |||
| 26 | |||
| 27 | static int debug; | ||
| 28 | |||
| 29 | static const struct usb_device_id id_table[] = { | ||
| 30 | /* | ||
| 31 | * NOTE: Only match the CDC Data interface. | ||
| 32 | */ | ||
| 33 | { USB_DEVICE_AND_INTERFACE_INFO(SAMBA_VENDOR_ID, SAMBA_PRODUCT_ID, | ||
| 34 | USB_CLASS_CDC_DATA, 0, 0) }, | ||
| 35 | { } | ||
| 36 | }; | ||
| 37 | MODULE_DEVICE_TABLE(usb, id_table); | ||
| 38 | |||
| 39 | static struct usb_driver samba_driver = { | ||
| 40 | .name = "sam-ba", | ||
| 41 | .probe = usb_serial_probe, | ||
| 42 | .disconnect = usb_serial_disconnect, | ||
| 43 | .id_table = id_table, | ||
| 44 | .no_dynamic_id = 1, | ||
| 45 | }; | ||
| 46 | |||
| 47 | |||
| 48 | /* | ||
| 49 | * NOTE: The SAM-BA firmware cannot handle merged write requests so we cannot | ||
| 50 | * use the generic write implementation (which uses the port write fifo). | ||
| 51 | */ | ||
| 52 | static int samba_write(struct tty_struct *tty, struct usb_serial_port *port, | ||
| 53 | const unsigned char *buf, int count) | ||
| 54 | { | ||
| 55 | struct urb *urb; | ||
| 56 | unsigned long flags; | ||
| 57 | int result; | ||
| 58 | int i; | ||
| 59 | |||
| 60 | if (!count) | ||
| 61 | return 0; | ||
| 62 | |||
| 63 | count = min_t(int, count, port->bulk_out_size); | ||
| 64 | |||
| 65 | spin_lock_irqsave(&port->lock, flags); | ||
| 66 | if (!port->write_urbs_free) { | ||
| 67 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 68 | return 0; | ||
| 69 | } | ||
| 70 | i = find_first_bit(&port->write_urbs_free, | ||
| 71 | ARRAY_SIZE(port->write_urbs)); | ||
| 72 | __clear_bit(i, &port->write_urbs_free); | ||
| 73 | port->tx_bytes += count; | ||
| 74 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 75 | |||
| 76 | urb = port->write_urbs[i]; | ||
| 77 | memcpy(urb->transfer_buffer, buf, count); | ||
| 78 | urb->transfer_buffer_length = count; | ||
| 79 | usb_serial_debug_data(debug, &port->dev, __func__, count, | ||
| 80 | urb->transfer_buffer); | ||
| 81 | result = usb_submit_urb(urb, GFP_ATOMIC); | ||
| 82 | if (result) { | ||
| 83 | dev_err(&port->dev, "%s - error submitting urb: %d\n", | ||
| 84 | __func__, result); | ||
| 85 | spin_lock_irqsave(&port->lock, flags); | ||
| 86 | __set_bit(i, &port->write_urbs_free); | ||
| 87 | port->tx_bytes -= count; | ||
| 88 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 89 | |||
| 90 | return result; | ||
| 91 | } | ||
| 92 | |||
| 93 | return count; | ||
| 94 | } | ||
| 95 | |||
| 96 | static int samba_write_room(struct tty_struct *tty) | ||
| 97 | { | ||
| 98 | struct usb_serial_port *port = tty->driver_data; | ||
| 99 | unsigned long flags; | ||
| 100 | unsigned long free; | ||
| 101 | int count; | ||
| 102 | int room; | ||
| 103 | |||
| 104 | spin_lock_irqsave(&port->lock, flags); | ||
| 105 | free = port->write_urbs_free; | ||
| 106 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 107 | |||
| 108 | count = hweight_long(free); | ||
| 109 | room = count * port->bulk_out_size; | ||
| 110 | |||
| 111 | dbg("%s - returns %d", __func__, room); | ||
| 112 | |||
| 113 | return room; | ||
| 114 | } | ||
| 115 | |||
| 116 | static int samba_chars_in_buffer(struct tty_struct *tty) | ||
| 117 | { | ||
| 118 | struct usb_serial_port *port = tty->driver_data; | ||
| 119 | unsigned long flags; | ||
| 120 | int chars; | ||
| 121 | |||
| 122 | spin_lock_irqsave(&port->lock, flags); | ||
| 123 | chars = port->tx_bytes; | ||
| 124 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 125 | |||
| 126 | dbg("%s - returns %d", __func__, chars); | ||
| 127 | |||
| 128 | return chars; | ||
| 129 | } | ||
| 130 | |||
| 131 | static void samba_write_bulk_callback(struct urb *urb) | ||
| 132 | { | ||
| 133 | struct usb_serial_port *port = urb->context; | ||
| 134 | unsigned long flags; | ||
| 135 | int i; | ||
| 136 | |||
| 137 | dbg("%s - port %d", __func__, port->number); | ||
| 138 | |||
| 139 | for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i) { | ||
| 140 | if (port->write_urbs[i] == urb) | ||
| 141 | break; | ||
| 142 | } | ||
| 143 | spin_lock_irqsave(&port->lock, flags); | ||
| 144 | __set_bit(i, &port->write_urbs_free); | ||
| 145 | port->tx_bytes -= urb->transfer_buffer_length; | ||
| 146 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 147 | |||
| 148 | if (urb->status) | ||
| 149 | dbg("%s - non-zero urb status: %d", __func__, urb->status); | ||
| 150 | |||
| 151 | usb_serial_port_softint(port); | ||
| 152 | } | ||
| 153 | |||
| 154 | static struct usb_serial_driver samba_device = { | ||
| 155 | .driver = { | ||
| 156 | .owner = THIS_MODULE, | ||
| 157 | .name = "sam-ba", | ||
| 158 | }, | ||
| 159 | .usb_driver = &samba_driver, | ||
| 160 | .id_table = id_table, | ||
| 161 | .num_ports = 1, | ||
| 162 | .bulk_in_size = 512, | ||
| 163 | .bulk_out_size = 2048, | ||
| 164 | .write = samba_write, | ||
| 165 | .write_room = samba_write_room, | ||
| 166 | .chars_in_buffer = samba_chars_in_buffer, | ||
| 167 | .write_bulk_callback = samba_write_bulk_callback, | ||
| 168 | .throttle = usb_serial_generic_throttle, | ||
| 169 | .unthrottle = usb_serial_generic_unthrottle, | ||
| 170 | }; | ||
| 171 | |||
| 172 | static int __init samba_init(void) | ||
| 173 | { | ||
| 174 | int retval; | ||
| 175 | |||
| 176 | retval = usb_serial_register(&samba_device); | ||
| 177 | if (retval) | ||
| 178 | return retval; | ||
| 179 | |||
| 180 | retval = usb_register(&samba_driver); | ||
| 181 | if (retval) { | ||
| 182 | usb_serial_deregister(&samba_device); | ||
| 183 | return retval; | ||
| 184 | } | ||
| 185 | |||
| 186 | printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ": " | ||
| 187 | DRIVER_DESC "\n"); | ||
| 188 | return 0; | ||
| 189 | } | ||
| 190 | |||
| 191 | static void __exit samba_exit(void) | ||
| 192 | { | ||
| 193 | usb_deregister(&samba_driver); | ||
| 194 | usb_serial_deregister(&samba_device); | ||
| 195 | } | ||
| 196 | |||
| 197 | module_init(samba_init); | ||
| 198 | module_exit(samba_exit); | ||
| 199 | |||
| 200 | MODULE_AUTHOR(DRIVER_AUTHOR); | ||
| 201 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
| 202 | MODULE_VERSION(DRIVER_VERSION); | ||
| 203 | MODULE_LICENSE("GPL"); | ||
| 204 | |||
| 205 | module_param(debug, bool, S_IRUGO | S_IWUSR); | ||
| 206 | MODULE_PARM_DESC(debug, "Enable verbose debugging messages"); | ||
diff --git a/drivers/usb/storage/unusual_realtek.h b/drivers/usb/storage/unusual_realtek.h index 3236e032851..e41f50c95ed 100644 --- a/drivers/usb/storage/unusual_realtek.h +++ b/drivers/usb/storage/unusual_realtek.h | |||
| @@ -23,19 +23,19 @@ | |||
| 23 | #if defined(CONFIG_USB_STORAGE_REALTEK) || \ | 23 | #if defined(CONFIG_USB_STORAGE_REALTEK) || \ |
| 24 | defined(CONFIG_USB_STORAGE_REALTEK_MODULE) | 24 | defined(CONFIG_USB_STORAGE_REALTEK_MODULE) |
| 25 | 25 | ||
| 26 | UNUSUAL_DEV(0x0bda, 0x0159, 0x0000, 0x9999, | 26 | UNUSUAL_DEV(0x0bda, 0x0138, 0x0000, 0x9999, |
| 27 | "Realtek", | 27 | "Realtek", |
| 28 | "USB Card Reader", | 28 | "USB Card Reader", |
| 29 | USB_SC_SCSI, USB_PR_BULK, init_realtek_cr, 0), | 29 | USB_SC_DEVICE, USB_PR_DEVICE, init_realtek_cr, 0), |
| 30 | 30 | ||
| 31 | UNUSUAL_DEV(0x0bda, 0x0158, 0x0000, 0x9999, | 31 | UNUSUAL_DEV(0x0bda, 0x0158, 0x0000, 0x9999, |
| 32 | "Realtek", | 32 | "Realtek", |
| 33 | "USB Card Reader", | 33 | "USB Card Reader", |
| 34 | USB_SC_SCSI, USB_PR_BULK, init_realtek_cr, 0), | 34 | USB_SC_DEVICE, USB_PR_DEVICE, init_realtek_cr, 0), |
| 35 | 35 | ||
| 36 | UNUSUAL_DEV(0x0bda, 0x0138, 0x0000, 0x9999, | 36 | UNUSUAL_DEV(0x0bda, 0x0159, 0x0000, 0x9999, |
| 37 | "Realtek", | 37 | "Realtek", |
| 38 | "USB Card Reader", | 38 | "USB Card Reader", |
| 39 | USB_SC_SCSI, USB_PR_BULK, init_realtek_cr, 0), | 39 | USB_SC_DEVICE, USB_PR_DEVICE, init_realtek_cr, 0), |
| 40 | 40 | ||
| 41 | #endif /* defined(CONFIG_USB_STORAGE_REALTEK) || ... */ | 41 | #endif /* defined(CONFIG_USB_STORAGE_REALTEK) || ... */ |
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 4219c197cb0..5ee7ac42e08 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c | |||
| @@ -439,7 +439,8 @@ static void adjust_quirks(struct us_data *us) | |||
| 439 | US_FL_CAPACITY_HEURISTICS | US_FL_IGNORE_DEVICE | | 439 | US_FL_CAPACITY_HEURISTICS | US_FL_IGNORE_DEVICE | |
| 440 | US_FL_NOT_LOCKABLE | US_FL_MAX_SECTORS_64 | | 440 | US_FL_NOT_LOCKABLE | US_FL_MAX_SECTORS_64 | |
| 441 | US_FL_CAPACITY_OK | US_FL_IGNORE_RESIDUE | | 441 | US_FL_CAPACITY_OK | US_FL_IGNORE_RESIDUE | |
| 442 | US_FL_SINGLE_LUN | US_FL_NO_WP_DETECT); | 442 | US_FL_SINGLE_LUN | US_FL_NO_WP_DETECT | |
| 443 | US_FL_NO_READ_DISC_INFO | US_FL_NO_READ_CAPACITY_16); | ||
| 443 | 444 | ||
| 444 | p = quirks; | 445 | p = quirks; |
| 445 | while (*p) { | 446 | while (*p) { |
| @@ -471,6 +472,12 @@ static void adjust_quirks(struct us_data *us) | |||
| 471 | case 'c': | 472 | case 'c': |
| 472 | f |= US_FL_FIX_CAPACITY; | 473 | f |= US_FL_FIX_CAPACITY; |
| 473 | break; | 474 | break; |
| 475 | case 'd': | ||
| 476 | f |= US_FL_NO_READ_DISC_INFO; | ||
| 477 | break; | ||
| 478 | case 'e': | ||
| 479 | f |= US_FL_NO_READ_CAPACITY_16; | ||
| 480 | break; | ||
| 474 | case 'h': | 481 | case 'h': |
| 475 | f |= US_FL_CAPACITY_HEURISTICS; | 482 | f |= US_FL_CAPACITY_HEURISTICS; |
| 476 | break; | 483 | break; |
diff --git a/include/linux/fsl_devices.h b/include/linux/fsl_devices.h index 4eb56ed75fb..fffdf00f87b 100644 --- a/include/linux/fsl_devices.h +++ b/include/linux/fsl_devices.h | |||
| @@ -72,6 +72,7 @@ struct fsl_usb2_platform_data { | |||
| 72 | void (*exit)(struct platform_device *); | 72 | void (*exit)(struct platform_device *); |
| 73 | void __iomem *regs; /* ioremap'd register base */ | 73 | void __iomem *regs; /* ioremap'd register base */ |
| 74 | struct clk *clk; | 74 | struct clk *clk; |
| 75 | unsigned power_budget; /* hcd->power_budget */ | ||
| 75 | unsigned big_endian_mmio:1; | 76 | unsigned big_endian_mmio:1; |
| 76 | unsigned big_endian_desc:1; | 77 | unsigned big_endian_desc:1; |
| 77 | unsigned es:1; /* need USBMODE:ES */ | 78 | unsigned es:1; /* need USBMODE:ES */ |
| @@ -79,6 +80,21 @@ struct fsl_usb2_platform_data { | |||
| 79 | unsigned have_sysif_regs:1; | 80 | unsigned have_sysif_regs:1; |
| 80 | unsigned invert_drvvbus:1; | 81 | unsigned invert_drvvbus:1; |
| 81 | unsigned invert_pwr_fault:1; | 82 | unsigned invert_pwr_fault:1; |
| 83 | |||
| 84 | unsigned suspended:1; | ||
| 85 | unsigned already_suspended:1; | ||
| 86 | |||
| 87 | /* register save area for suspend/resume */ | ||
| 88 | u32 pm_command; | ||
| 89 | u32 pm_status; | ||
| 90 | u32 pm_intr_enable; | ||
| 91 | u32 pm_frame_index; | ||
| 92 | u32 pm_segment; | ||
| 93 | u32 pm_frame_list; | ||
| 94 | u32 pm_async_next; | ||
| 95 | u32 pm_configured_flag; | ||
| 96 | u32 pm_portsc; | ||
| 97 | u32 pm_usbgenctrl; | ||
| 82 | }; | 98 | }; |
| 83 | 99 | ||
| 84 | /* Flags in fsl_usb2_mph_platform_data */ | 100 | /* Flags in fsl_usb2_mph_platform_data */ |
diff --git a/include/linux/usb.h b/include/linux/usb.h index 65f78ca5d88..73c7df48960 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
| @@ -806,8 +806,10 @@ struct usbdrv_wrap { | |||
| 806 | * @resume: Called when the device is being resumed by the system. | 806 | * @resume: Called when the device is being resumed by the system. |
| 807 | * @reset_resume: Called when the suspended device has been reset instead | 807 | * @reset_resume: Called when the suspended device has been reset instead |
| 808 | * of being resumed. | 808 | * of being resumed. |
| 809 | * @pre_reset: Called by usb_reset_device() when the device | 809 | * @pre_reset: Called by usb_reset_device() when the device is about to be |
| 810 | * is about to be reset. | 810 | * reset. This routine must not return until the driver has no active |
| 811 | * URBs for the device, and no more URBs may be submitted until the | ||
| 812 | * post_reset method is called. | ||
| 811 | * @post_reset: Called by usb_reset_device() after the device | 813 | * @post_reset: Called by usb_reset_device() after the device |
| 812 | * has been reset | 814 | * has been reset |
| 813 | * @id_table: USB drivers use ID table to support hotplugging. | 815 | * @id_table: USB drivers use ID table to support hotplugging. |
diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h index b72f305ce6b..0fd3fbdd828 100644 --- a/include/linux/usb/ch9.h +++ b/include/linux/usb/ch9.h | |||
| @@ -579,7 +579,7 @@ struct usb_ss_ep_comp_descriptor { | |||
| 579 | 579 | ||
| 580 | __u8 bMaxBurst; | 580 | __u8 bMaxBurst; |
| 581 | __u8 bmAttributes; | 581 | __u8 bmAttributes; |
| 582 | __u16 wBytesPerInterval; | 582 | __le16 wBytesPerInterval; |
| 583 | } __attribute__ ((packed)); | 583 | } __attribute__ ((packed)); |
| 584 | 584 | ||
| 585 | #define USB_DT_SS_EP_COMP_SIZE 6 | 585 | #define USB_DT_SS_EP_COMP_SIZE 6 |
diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index 882a084a841..b78cba466d3 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h | |||
| @@ -37,6 +37,14 @@ | |||
| 37 | #include <linux/usb/ch9.h> | 37 | #include <linux/usb/ch9.h> |
| 38 | #include <linux/usb/gadget.h> | 38 | #include <linux/usb/gadget.h> |
| 39 | 39 | ||
| 40 | /* | ||
| 41 | * USB function drivers should return USB_GADGET_DELAYED_STATUS if they | ||
| 42 | * wish to delay the data/status stages of the control transfer till they | ||
| 43 | * are ready. The control transfer will then be kept from completing till | ||
| 44 | * all the function drivers that requested for USB_GADGET_DELAYED_STAUS | ||
| 45 | * invoke usb_composite_setup_continue(). | ||
| 46 | */ | ||
| 47 | #define USB_GADGET_DELAYED_STATUS 0x7fff /* Impossibly large value */ | ||
| 40 | 48 | ||
| 41 | struct usb_configuration; | 49 | struct usb_configuration; |
| 42 | 50 | ||
| @@ -285,6 +293,7 @@ struct usb_composite_driver { | |||
| 285 | extern int usb_composite_probe(struct usb_composite_driver *driver, | 293 | extern int usb_composite_probe(struct usb_composite_driver *driver, |
| 286 | int (*bind)(struct usb_composite_dev *cdev)); | 294 | int (*bind)(struct usb_composite_dev *cdev)); |
| 287 | extern void usb_composite_unregister(struct usb_composite_driver *driver); | 295 | extern void usb_composite_unregister(struct usb_composite_driver *driver); |
| 296 | extern void usb_composite_setup_continue(struct usb_composite_dev *cdev); | ||
| 288 | 297 | ||
| 289 | 298 | ||
| 290 | /** | 299 | /** |
| @@ -342,7 +351,12 @@ struct usb_composite_dev { | |||
| 342 | */ | 351 | */ |
| 343 | unsigned deactivations; | 352 | unsigned deactivations; |
| 344 | 353 | ||
| 345 | /* protects at least deactivation count */ | 354 | /* the composite driver won't complete the control transfer's |
| 355 | * data/status stages till delayed_status is zero. | ||
| 356 | */ | ||
| 357 | int delayed_status; | ||
| 358 | |||
| 359 | /* protects deactivations and delayed_status counts*/ | ||
| 346 | spinlock_t lock; | 360 | spinlock_t lock; |
| 347 | }; | 361 | }; |
| 348 | 362 | ||
diff --git a/include/linux/usb/ehci_def.h b/include/linux/usb/ehci_def.h index e49dfd45baa..7cc95ee3606 100644 --- a/include/linux/usb/ehci_def.h +++ b/include/linux/usb/ehci_def.h | |||
| @@ -25,10 +25,15 @@ | |||
| 25 | struct ehci_caps { | 25 | struct ehci_caps { |
| 26 | /* these fields are specified as 8 and 16 bit registers, | 26 | /* these fields are specified as 8 and 16 bit registers, |
| 27 | * but some hosts can't perform 8 or 16 bit PCI accesses. | 27 | * but some hosts can't perform 8 or 16 bit PCI accesses. |
| 28 | * some hosts treat caplength and hciversion as parts of a 32-bit | ||
| 29 | * register, others treat them as two separate registers, this | ||
| 30 | * affects the memory map for big endian controllers. | ||
| 28 | */ | 31 | */ |
| 29 | u32 hc_capbase; | 32 | u32 hc_capbase; |
| 30 | #define HC_LENGTH(p) (((p)>>00)&0x00ff) /* bits 7:0 */ | 33 | #define HC_LENGTH(ehci, p) (0x00ff&((p) >> /* bits 7:0 / offset 00h */ \ |
| 31 | #define HC_VERSION(p) (((p)>>16)&0xffff) /* bits 31:16 */ | 34 | (ehci_big_endian_capbase(ehci) ? 24 : 0))) |
| 35 | #define HC_VERSION(ehci, p) (0xffff&((p) >> /* bits 31:16 / offset 02h */ \ | ||
| 36 | (ehci_big_endian_capbase(ehci) ? 0 : 16))) | ||
| 32 | u32 hcs_params; /* HCSPARAMS - offset 0x4 */ | 37 | u32 hcs_params; /* HCSPARAMS - offset 0x4 */ |
| 33 | #define HCS_DEBUG_PORT(p) (((p)>>20)&0xf) /* bits 23:20, debug port? */ | 38 | #define HCS_DEBUG_PORT(p) (((p)>>20)&0xf) /* bits 23:20, debug port? */ |
| 34 | #define HCS_INDICATOR(p) ((p)&(1 << 16)) /* true: has port indicators */ | 39 | #define HCS_INDICATOR(p) ((p)&(1 << 16)) /* true: has port indicators */ |
| @@ -52,7 +57,7 @@ struct ehci_caps { | |||
| 52 | #define HCC_PGM_FRAMELISTLEN(p) ((p)&(1 << 1)) /* true: periodic_size changes*/ | 57 | #define HCC_PGM_FRAMELISTLEN(p) ((p)&(1 << 1)) /* true: periodic_size changes*/ |
| 53 | #define HCC_64BIT_ADDR(p) ((p)&(1)) /* true: can use 64-bit addr */ | 58 | #define HCC_64BIT_ADDR(p) ((p)&(1)) /* true: can use 64-bit addr */ |
| 54 | u8 portroute[8]; /* nibbles for routing - offset 0xC */ | 59 | u8 portroute[8]; /* nibbles for routing - offset 0xC */ |
| 55 | } __attribute__ ((packed)); | 60 | }; |
| 56 | 61 | ||
| 57 | 62 | ||
| 58 | /* Section 2.3 Host Controller Operational Registers */ | 63 | /* Section 2.3 Host Controller Operational Registers */ |
| @@ -150,7 +155,7 @@ struct ehci_regs { | |||
| 150 | #define PORT_CSC (1<<1) /* connect status change */ | 155 | #define PORT_CSC (1<<1) /* connect status change */ |
| 151 | #define PORT_CONNECT (1<<0) /* device connected */ | 156 | #define PORT_CONNECT (1<<0) /* device connected */ |
| 152 | #define PORT_RWC_BITS (PORT_CSC | PORT_PEC | PORT_OCC) | 157 | #define PORT_RWC_BITS (PORT_CSC | PORT_PEC | PORT_OCC) |
| 153 | } __attribute__ ((packed)); | 158 | }; |
| 154 | 159 | ||
| 155 | #define USBMODE 0x68 /* USB Device mode */ | 160 | #define USBMODE 0x68 /* USB Device mode */ |
| 156 | #define USBMODE_SDIS (1<<3) /* Stream disable */ | 161 | #define USBMODE_SDIS (1<<3) /* Stream disable */ |
| @@ -194,7 +199,7 @@ struct ehci_dbg_port { | |||
| 194 | u32 data47; | 199 | u32 data47; |
| 195 | u32 address; | 200 | u32 address; |
| 196 | #define DBGP_EPADDR(dev, ep) (((dev)<<8)|(ep)) | 201 | #define DBGP_EPADDR(dev, ep) (((dev)<<8)|(ep)) |
| 197 | } __attribute__ ((packed)); | 202 | }; |
| 198 | 203 | ||
| 199 | #ifdef CONFIG_EARLY_PRINTK_DBGP | 204 | #ifdef CONFIG_EARLY_PRINTK_DBGP |
| 200 | #include <linux/init.h> | 205 | #include <linux/init.h> |
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index e538172c0f6..dd1571db55e 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h | |||
| @@ -890,8 +890,8 @@ static inline void usb_free_descriptors(struct usb_descriptor_header **v) | |||
| 890 | /* utility wrapping a simple endpoint selection policy */ | 890 | /* utility wrapping a simple endpoint selection policy */ |
| 891 | 891 | ||
| 892 | extern struct usb_ep *usb_ep_autoconfig(struct usb_gadget *, | 892 | extern struct usb_ep *usb_ep_autoconfig(struct usb_gadget *, |
| 893 | struct usb_endpoint_descriptor *) __devinit; | 893 | struct usb_endpoint_descriptor *); |
| 894 | 894 | ||
| 895 | extern void usb_ep_autoconfig_reset(struct usb_gadget *) __devinit; | 895 | extern void usb_ep_autoconfig_reset(struct usb_gadget *); |
| 896 | 896 | ||
| 897 | #endif /* __LINUX_USB_GADGET_H */ | 897 | #endif /* __LINUX_USB_GADGET_H */ |
diff --git a/include/linux/usb/msm_hsusb.h b/include/linux/usb/msm_hsusb.h index 3657403eac1..00311fe9d0d 100644 --- a/include/linux/usb/msm_hsusb.h +++ b/include/linux/usb/msm_hsusb.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * | 2 | * |
| 3 | * Copyright (C) 2008 Google, Inc. | 3 | * Copyright (C) 2008 Google, Inc. |
| 4 | * Author: Brian Swetland <swetland@google.com> | 4 | * Author: Brian Swetland <swetland@google.com> |
| 5 | * Copyright (c) 2009-2010, Code Aurora Forum. All rights reserved. | 5 | * Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved. |
| 6 | * | 6 | * |
| 7 | * This software is licensed under the terms of the GNU General Public | 7 | * This software is licensed under the terms of the GNU General Public |
| 8 | * License version 2, as published by the Free Software Foundation, and | 8 | * License version 2, as published by the Free Software Foundation, and |
| @@ -54,6 +54,64 @@ enum otg_control_type { | |||
| 54 | }; | 54 | }; |
| 55 | 55 | ||
| 56 | /** | 56 | /** |
| 57 | * PHY used in | ||
| 58 | * | ||
| 59 | * INVALID_PHY Unsupported PHY | ||
| 60 | * CI_45NM_INTEGRATED_PHY Chipidea 45nm integrated PHY | ||
| 61 | * SNPS_28NM_INTEGRATED_PHY Synopsis 28nm integrated PHY | ||
| 62 | * | ||
| 63 | */ | ||
| 64 | enum msm_usb_phy_type { | ||
| 65 | INVALID_PHY = 0, | ||
| 66 | CI_45NM_INTEGRATED_PHY, | ||
| 67 | SNPS_28NM_INTEGRATED_PHY, | ||
| 68 | }; | ||
| 69 | |||
| 70 | #define IDEV_CHG_MAX 1500 | ||
| 71 | #define IUNIT 100 | ||
| 72 | |||
| 73 | /** | ||
| 74 | * Different states involved in USB charger detection. | ||
| 75 | * | ||
| 76 | * USB_CHG_STATE_UNDEFINED USB charger is not connected or detection | ||
| 77 | * process is not yet started. | ||
| 78 | * USB_CHG_STATE_WAIT_FOR_DCD Waiting for Data pins contact. | ||
| 79 | * USB_CHG_STATE_DCD_DONE Data pin contact is detected. | ||
| 80 | * USB_CHG_STATE_PRIMARY_DONE Primary detection is completed (Detects | ||
| 81 | * between SDP and DCP/CDP). | ||
| 82 | * USB_CHG_STATE_SECONDARY_DONE Secondary detection is completed (Detects | ||
| 83 | * between DCP and CDP). | ||
| 84 | * USB_CHG_STATE_DETECTED USB charger type is determined. | ||
| 85 | * | ||
| 86 | */ | ||
| 87 | enum usb_chg_state { | ||
| 88 | USB_CHG_STATE_UNDEFINED = 0, | ||
| 89 | USB_CHG_STATE_WAIT_FOR_DCD, | ||
| 90 | USB_CHG_STATE_DCD_DONE, | ||
| 91 | USB_CHG_STATE_PRIMARY_DONE, | ||
| 92 | USB_CHG_STATE_SECONDARY_DONE, | ||
| 93 | USB_CHG_STATE_DETECTED, | ||
| 94 | }; | ||
| 95 | |||
| 96 | /** | ||
| 97 | * USB charger types | ||
| 98 | * | ||
| 99 | * USB_INVALID_CHARGER Invalid USB charger. | ||
| 100 | * USB_SDP_CHARGER Standard downstream port. Refers to a downstream port | ||
| 101 | * on USB2.0 compliant host/hub. | ||
| 102 | * USB_DCP_CHARGER Dedicated charger port (AC charger/ Wall charger). | ||
| 103 | * USB_CDP_CHARGER Charging downstream port. Enumeration can happen and | ||
| 104 | * IDEV_CHG_MAX can be drawn irrespective of USB state. | ||
| 105 | * | ||
| 106 | */ | ||
| 107 | enum usb_chg_type { | ||
| 108 | USB_INVALID_CHARGER = 0, | ||
| 109 | USB_SDP_CHARGER, | ||
| 110 | USB_DCP_CHARGER, | ||
| 111 | USB_CDP_CHARGER, | ||
| 112 | }; | ||
| 113 | |||
| 114 | /** | ||
| 57 | * struct msm_otg_platform_data - platform device data | 115 | * struct msm_otg_platform_data - platform device data |
| 58 | * for msm_otg driver. | 116 | * for msm_otg driver. |
| 59 | * @phy_init_seq: PHY configuration sequence. val, reg pairs | 117 | * @phy_init_seq: PHY configuration sequence. val, reg pairs |
| @@ -64,7 +122,8 @@ enum otg_control_type { | |||
| 64 | * @otg_control: OTG switch controlled by user/Id pin | 122 | * @otg_control: OTG switch controlled by user/Id pin |
| 65 | * @default_mode: Default operational mode. Applicable only if | 123 | * @default_mode: Default operational mode. Applicable only if |
| 66 | * OTG switch is controller by user. | 124 | * OTG switch is controller by user. |
| 67 | * | 125 | * @pclk_src_name: pclk is derived from ebi1_usb_clk in case of 7x27 and 8k |
| 126 | * dfab_usb_hs_clk in case of 8660 and 8960. | ||
| 68 | */ | 127 | */ |
| 69 | struct msm_otg_platform_data { | 128 | struct msm_otg_platform_data { |
| 70 | int *phy_init_seq; | 129 | int *phy_init_seq; |
| @@ -73,7 +132,9 @@ struct msm_otg_platform_data { | |||
| 73 | enum usb_mode_type mode; | 132 | enum usb_mode_type mode; |
| 74 | enum otg_control_type otg_control; | 133 | enum otg_control_type otg_control; |
| 75 | enum usb_mode_type default_mode; | 134 | enum usb_mode_type default_mode; |
| 135 | enum msm_usb_phy_type phy_type; | ||
| 76 | void (*setup_gpio)(enum usb_otg_state state); | 136 | void (*setup_gpio)(enum usb_otg_state state); |
| 137 | char *pclk_src_name; | ||
| 77 | }; | 138 | }; |
| 78 | 139 | ||
| 79 | /** | 140 | /** |
| @@ -83,6 +144,7 @@ struct msm_otg_platform_data { | |||
| 83 | * @irq: IRQ number assigned for HSUSB controller. | 144 | * @irq: IRQ number assigned for HSUSB controller. |
| 84 | * @clk: clock struct of usb_hs_clk. | 145 | * @clk: clock struct of usb_hs_clk. |
| 85 | * @pclk: clock struct of usb_hs_pclk. | 146 | * @pclk: clock struct of usb_hs_pclk. |
| 147 | * @pclk_src: pclk source for voting. | ||
| 86 | * @phy_reset_clk: clock struct of usb_phy_clk. | 148 | * @phy_reset_clk: clock struct of usb_phy_clk. |
| 87 | * @core_clk: clock struct of usb_hs_core_clk. | 149 | * @core_clk: clock struct of usb_hs_core_clk. |
| 88 | * @regs: ioremapped register base address. | 150 | * @regs: ioremapped register base address. |
| @@ -90,7 +152,12 @@ struct msm_otg_platform_data { | |||
| 90 | * @sm_work: OTG state machine work. | 152 | * @sm_work: OTG state machine work. |
| 91 | * @in_lpm: indicates low power mode (LPM) state. | 153 | * @in_lpm: indicates low power mode (LPM) state. |
| 92 | * @async_int: Async interrupt arrived. | 154 | * @async_int: Async interrupt arrived. |
| 93 | * | 155 | * @cur_power: The amount of mA available from downstream port. |
| 156 | * @chg_work: Charger detection work. | ||
| 157 | * @chg_state: The state of charger detection process. | ||
| 158 | * @chg_type: The type of charger attached. | ||
| 159 | * @dcd_retires: The retry count used to track Data contact | ||
| 160 | * detection process. | ||
| 94 | */ | 161 | */ |
| 95 | struct msm_otg { | 162 | struct msm_otg { |
| 96 | struct otg_transceiver otg; | 163 | struct otg_transceiver otg; |
| @@ -98,6 +165,7 @@ struct msm_otg { | |||
| 98 | int irq; | 165 | int irq; |
| 99 | struct clk *clk; | 166 | struct clk *clk; |
| 100 | struct clk *pclk; | 167 | struct clk *pclk; |
| 168 | struct clk *pclk_src; | ||
| 101 | struct clk *phy_reset_clk; | 169 | struct clk *phy_reset_clk; |
| 102 | struct clk *core_clk; | 170 | struct clk *core_clk; |
| 103 | void __iomem *regs; | 171 | void __iomem *regs; |
| @@ -107,6 +175,11 @@ struct msm_otg { | |||
| 107 | struct work_struct sm_work; | 175 | struct work_struct sm_work; |
| 108 | atomic_t in_lpm; | 176 | atomic_t in_lpm; |
| 109 | int async_int; | 177 | int async_int; |
| 178 | unsigned cur_power; | ||
| 179 | struct delayed_work chg_work; | ||
| 180 | enum usb_chg_state chg_state; | ||
| 181 | enum usb_chg_type chg_type; | ||
| 182 | u8 dcd_retries; | ||
| 110 | }; | 183 | }; |
| 111 | 184 | ||
| 112 | #endif | 185 | #endif |
diff --git a/include/linux/usb/msm_hsusb_hw.h b/include/linux/usb/msm_hsusb_hw.h index 7d1babbff07..6e97a2d3d39 100644 --- a/include/linux/usb/msm_hsusb_hw.h +++ b/include/linux/usb/msm_hsusb_hw.h | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #define USB_PORTSC (MSM_USB_BASE + 0x0184) | 24 | #define USB_PORTSC (MSM_USB_BASE + 0x0184) |
| 25 | #define USB_OTGSC (MSM_USB_BASE + 0x01A4) | 25 | #define USB_OTGSC (MSM_USB_BASE + 0x01A4) |
| 26 | #define USB_USBMODE (MSM_USB_BASE + 0x01A8) | 26 | #define USB_USBMODE (MSM_USB_BASE + 0x01A8) |
| 27 | #define USB_PHY_CTRL (MSM_USB_BASE + 0x0240) | ||
| 27 | 28 | ||
| 28 | #define USBCMD_RESET 2 | 29 | #define USBCMD_RESET 2 |
| 29 | #define USB_USBINTR (MSM_USB_BASE + 0x0148) | 30 | #define USB_USBINTR (MSM_USB_BASE + 0x0148) |
| @@ -42,6 +43,7 @@ | |||
| 42 | 43 | ||
| 43 | #define ASYNC_INTR_CTRL (1 << 29) /* Enable async interrupt */ | 44 | #define ASYNC_INTR_CTRL (1 << 29) /* Enable async interrupt */ |
| 44 | #define ULPI_STP_CTRL (1 << 30) /* Block communication with PHY */ | 45 | #define ULPI_STP_CTRL (1 << 30) /* Block communication with PHY */ |
| 46 | #define PHY_RETEN (1 << 1) /* PHY retention enable/disable */ | ||
| 45 | 47 | ||
| 46 | /* OTG definitions */ | 48 | /* OTG definitions */ |
| 47 | #define OTGSC_INTSTS_MASK (0x7f << 16) | 49 | #define OTGSC_INTSTS_MASK (0x7f << 16) |
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index 6e40718f5ab..d87f44f5b04 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h | |||
| @@ -168,6 +168,7 @@ otg_shutdown(struct otg_transceiver *otg) | |||
| 168 | #ifdef CONFIG_USB_OTG_UTILS | 168 | #ifdef CONFIG_USB_OTG_UTILS |
| 169 | extern struct otg_transceiver *otg_get_transceiver(void); | 169 | extern struct otg_transceiver *otg_get_transceiver(void); |
| 170 | extern void otg_put_transceiver(struct otg_transceiver *); | 170 | extern void otg_put_transceiver(struct otg_transceiver *); |
| 171 | extern const char *otg_state_string(enum usb_otg_state state); | ||
| 171 | #else | 172 | #else |
| 172 | static inline struct otg_transceiver *otg_get_transceiver(void) | 173 | static inline struct otg_transceiver *otg_get_transceiver(void) |
| 173 | { | 174 | { |
| @@ -177,6 +178,11 @@ static inline struct otg_transceiver *otg_get_transceiver(void) | |||
| 177 | static inline void otg_put_transceiver(struct otg_transceiver *x) | 178 | static inline void otg_put_transceiver(struct otg_transceiver *x) |
| 178 | { | 179 | { |
| 179 | } | 180 | } |
| 181 | |||
| 182 | static inline const char *otg_state_string(enum usb_otg_state state) | ||
| 183 | { | ||
| 184 | return NULL; | ||
| 185 | } | ||
| 180 | #endif | 186 | #endif |
| 181 | 187 | ||
| 182 | /* Context: can sleep */ | 188 | /* Context: can sleep */ |
diff --git a/include/linux/usb/renesas_usbhs.h b/include/linux/usb/renesas_usbhs.h new file mode 100644 index 00000000000..3a7f1d982dd --- /dev/null +++ b/include/linux/usb/renesas_usbhs.h | |||
| @@ -0,0 +1,156 @@ | |||
| 1 | /* | ||
| 2 | * Renesas USB | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Renesas Solutions Corp. | ||
| 5 | * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, write to the Free Software | ||
| 14 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 15 | * | ||
| 16 | */ | ||
| 17 | #ifndef RENESAS_USB_H | ||
| 18 | #define RENESAS_USB_H | ||
| 19 | #include <linux/platform_device.h> | ||
| 20 | #include <linux/usb/ch9.h> | ||
| 21 | |||
| 22 | /* | ||
| 23 | * module type | ||
| 24 | * | ||
| 25 | * it will be return value from get_id | ||
| 26 | */ | ||
| 27 | enum { | ||
| 28 | USBHS_HOST = 0, | ||
| 29 | USBHS_GADGET, | ||
| 30 | USBHS_MAX, | ||
| 31 | }; | ||
| 32 | |||
| 33 | /* | ||
| 34 | * callback functions table for driver | ||
| 35 | * | ||
| 36 | * These functions are called from platform for driver. | ||
| 37 | * Callback function's pointer will be set before | ||
| 38 | * renesas_usbhs_platform_callback :: hardware_init was called | ||
| 39 | */ | ||
| 40 | struct renesas_usbhs_driver_callback { | ||
| 41 | int (*notify_hotplug)(struct platform_device *pdev); | ||
| 42 | }; | ||
| 43 | |||
| 44 | /* | ||
| 45 | * callback functions for platform | ||
| 46 | * | ||
| 47 | * These functions are called from driver for platform | ||
| 48 | */ | ||
| 49 | struct renesas_usbhs_platform_callback { | ||
| 50 | |||
| 51 | /* | ||
| 52 | * option: | ||
| 53 | * | ||
| 54 | * Hardware init function for platform. | ||
| 55 | * it is called when driver was probed. | ||
| 56 | */ | ||
| 57 | int (*hardware_init)(struct platform_device *pdev); | ||
| 58 | |||
| 59 | /* | ||
| 60 | * option: | ||
| 61 | * | ||
| 62 | * Hardware exit function for platform. | ||
| 63 | * it is called when driver was removed | ||
| 64 | */ | ||
| 65 | void (*hardware_exit)(struct platform_device *pdev); | ||
| 66 | |||
| 67 | /* | ||
| 68 | * option: | ||
| 69 | * | ||
| 70 | * Phy reset for platform | ||
| 71 | */ | ||
| 72 | void (*phy_reset)(struct platform_device *pdev); | ||
| 73 | |||
| 74 | /* | ||
| 75 | * get USB ID function | ||
| 76 | * - USBHS_HOST | ||
| 77 | * - USBHS_GADGET | ||
| 78 | */ | ||
| 79 | int (*get_id)(struct platform_device *pdev); | ||
| 80 | |||
| 81 | /* | ||
| 82 | * get VBUS status function. | ||
| 83 | */ | ||
| 84 | int (*get_vbus)(struct platform_device *pdev); | ||
| 85 | }; | ||
| 86 | |||
| 87 | /* | ||
| 88 | * parameters for renesas usbhs | ||
| 89 | * | ||
| 90 | * some register needs USB chip specific parameters. | ||
| 91 | * This struct show it to driver | ||
| 92 | */ | ||
| 93 | struct renesas_usbhs_driver_param { | ||
| 94 | /* | ||
| 95 | * pipe settings | ||
| 96 | */ | ||
| 97 | u32 *pipe_type; /* array of USB_ENDPOINT_XFER_xxx (from ep0) */ | ||
| 98 | int pipe_size; /* pipe_type array size */ | ||
| 99 | |||
| 100 | /* | ||
| 101 | * option: | ||
| 102 | * | ||
| 103 | * for BUSWAIT :: BWAIT | ||
| 104 | * */ | ||
| 105 | int buswait_bwait; | ||
| 106 | |||
| 107 | /* | ||
| 108 | * option: | ||
| 109 | * | ||
| 110 | * delay time from notify_hotplug callback | ||
| 111 | */ | ||
| 112 | int detection_delay; | ||
| 113 | }; | ||
| 114 | |||
| 115 | /* | ||
| 116 | * option: | ||
| 117 | * | ||
| 118 | * platform information for renesas_usbhs driver. | ||
| 119 | */ | ||
| 120 | struct renesas_usbhs_platform_info { | ||
| 121 | /* | ||
| 122 | * option: | ||
| 123 | * | ||
| 124 | * platform set these functions before | ||
| 125 | * call platform_add_devices if needed | ||
| 126 | */ | ||
| 127 | struct renesas_usbhs_platform_callback platform_callback; | ||
| 128 | |||
| 129 | /* | ||
| 130 | * driver set these callback functions pointer. | ||
| 131 | * platform can use it on callback functions | ||
| 132 | */ | ||
| 133 | struct renesas_usbhs_driver_callback driver_callback; | ||
| 134 | |||
| 135 | /* | ||
| 136 | * option: | ||
| 137 | * | ||
| 138 | * driver use these param for some register | ||
| 139 | */ | ||
| 140 | struct renesas_usbhs_driver_param driver_param; | ||
| 141 | }; | ||
| 142 | |||
| 143 | /* | ||
| 144 | * macro for platform | ||
| 145 | */ | ||
| 146 | #define renesas_usbhs_get_info(pdev)\ | ||
| 147 | ((struct renesas_usbhs_platform_info *)(pdev)->dev.platform_data) | ||
| 148 | |||
| 149 | #define renesas_usbhs_call_notify_hotplug(pdev) \ | ||
| 150 | ({ \ | ||
| 151 | struct renesas_usbhs_driver_callback *dc; \ | ||
| 152 | dc = &(renesas_usbhs_get_info(pdev)->driver_callback); \ | ||
| 153 | if (dc && dc->notify_hotplug) \ | ||
| 154 | dc->notify_hotplug(pdev); \ | ||
| 155 | }) | ||
| 156 | #endif /* RENESAS_USB_H */ | ||
