* [RFC][PATCH 00/18] am33x: add musb
@ 2014-06-13 7:54 Christoph Fritz
2014-06-13 7:54 ` [PATCH 01/18] arm: am33xx: add USB clocks Christoph Fritz
` (16 more replies)
0 siblings, 17 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
This RFC patchset is intended as a start or reference to get musb support
mainline. So mostly there is no Signed-off-by. This patchset applies to
current barebox and is tested on phytec-phycore-am335x.
If due to mail size restrictions a patch doesn't get through to this
mailinglist, the full patchset is also availible as branch 'musb' at
https://github.com/ch-f/barebox.git
Christoph Fritz (18):
arm: am33xx: add USB clocks
arm: am33xx: add pinmux config for USB
linux wrapper: add more dummy spin_lock stubs
musb: add musb driver from u-boot
musb: delete unused include files
musb: move musb.h to path include/usb
musb: drop gadget support - remove appropriate files
musb: use __BAREBOX__ macro
musb: adapt Kconfig and Makefiles
arm: pcm051: enable musb in defconfig
musb: adapt driver to work on barebox
musb: only support USB_SPEED_HIGH devices
usb: add musb support
arm: am33xx: add usb base addresses
arm: am33xx: add usb platform helper code
musb: add barebox gluecode
arm: pcm051: enable USB pinmux
arm: pcm051: enable USB
arch/arm/boards/phytec-phycore-am335x/board.c | 16 +
arch/arm/configs/am335x_defconfig | 2 +
arch/arm/include/asm/omap_musb.h | 24 +
arch/arm/mach-omap/Makefile | 2 +-
arch/arm/mach-omap/am33xx_clock.c | 7 +
arch/arm/mach-omap/am33xx_mux.c | 24 +
arch/arm/mach-omap/am33xx_usb.c | 65 +
arch/arm/mach-omap/include/mach/am33xx-clock.h | 2 +
arch/arm/mach-omap/include/mach/am33xx-mux.h | 2 +
arch/arm/mach-omap/include/mach/am33xx-silicon.h | 10 +
arch/arm/mach-omap/include/mach/am33xx-usb.h | 11 +
drivers/usb/Kconfig | 2 +
drivers/usb/Makefile | 1 +
drivers/usb/musb/Kconfig | 21 +
drivers/usb/musb/Makefile | 6 +
drivers/usb/musb/linux-compat.h | 69 +
drivers/usb/musb/musb.h | 164 ++
drivers/usb/musb/musb_barebox.c | 306 +++
drivers/usb/musb/musb_core.c | 2502 ++++++++++++++++++++++
drivers/usb/musb/musb_core.h | 605 ++++++
drivers/usb/musb/musb_debug.h | 58 +
drivers/usb/musb/musb_dma.h | 186 ++
drivers/usb/musb/musb_dsps.c | 768 +++++++
drivers/usb/musb/musb_host.c | 2399 +++++++++++++++++++++
drivers/usb/musb/musb_host.h | 114 +
drivers/usb/musb/musb_io.h | 127 ++
drivers/usb/musb/musb_regs.h | 645 ++++++
drivers/usb/musb/usb-compat.h | 88 +
include/linux/barebox-wrapper.h | 2 +
include/usb/usb.h | 62 +
30 files changed, 8289 insertions(+), 1 deletion(-)
create mode 100644 arch/arm/include/asm/omap_musb.h
create mode 100644 arch/arm/mach-omap/am33xx_usb.c
create mode 100644 arch/arm/mach-omap/include/mach/am33xx-usb.h
create mode 100644 drivers/usb/musb/Kconfig
create mode 100644 drivers/usb/musb/Makefile
create mode 100644 drivers/usb/musb/linux-compat.h
create mode 100644 drivers/usb/musb/musb.h
create mode 100644 drivers/usb/musb/musb_barebox.c
create mode 100644 drivers/usb/musb/musb_core.c
create mode 100644 drivers/usb/musb/musb_core.h
create mode 100644 drivers/usb/musb/musb_debug.h
create mode 100644 drivers/usb/musb/musb_dma.h
create mode 100644 drivers/usb/musb/musb_dsps.c
create mode 100644 drivers/usb/musb/musb_host.c
create mode 100644 drivers/usb/musb/musb_host.h
create mode 100644 drivers/usb/musb/musb_io.h
create mode 100644 drivers/usb/musb/musb_regs.h
create mode 100644 drivers/usb/musb/usb-compat.h
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 01/18] arm: am33xx: add USB clocks
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 02/18] arm: am33xx: add pinmux config for USB Christoph Fritz
` (15 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
Signed-off-by: Christoph Fritz <chf.fritz@googlemail.com>
---
arch/arm/mach-omap/am33xx_clock.c | 7 +++++++
arch/arm/mach-omap/include/mach/am33xx-clock.h | 2 ++
2 files changed, 9 insertions(+)
diff --git a/arch/arm/mach-omap/am33xx_clock.c b/arch/arm/mach-omap/am33xx_clock.c
index 9105ddc..f4b1f4e 100644
--- a/arch/arm/mach-omap/am33xx_clock.c
+++ b/arch/arm/mach-omap/am33xx_clock.c
@@ -26,6 +26,8 @@
#define PLL_LOCK_MODE 0x7
#define PLL_MULTIPLIER_SHIFT 8
+#define DPLL_CLKDCOLDO_GATE_EN (0x1 << 8)
+
static void interface_clocks_enable(void)
{
/* Enable all the Interconnect Modules */
@@ -154,6 +156,11 @@ static void per_clocks_enable(void)
__raw_writel(PRCM_MOD_EN, CM_PER_SPI1_CLKCTRL);
while (__raw_readl(CM_PER_SPI1_CLKCTRL) != PRCM_MOD_EN);
+
+ /* USB */
+ __raw_writel(DPLL_CLKDCOLDO_GATE_EN, CM_CLKDCOLDO_DPLL_PER);
+ __raw_writel(PRCM_MOD_EN, CM_PER_USB0_CLKCTRL);
+ while (__raw_readl(CM_PER_USB0_CLKCTRL) != PRCM_MOD_EN);
}
static void mpu_pll_config(int mpupll_M, int osc)
diff --git a/arch/arm/mach-omap/include/mach/am33xx-clock.h b/arch/arm/mach-omap/include/mach/am33xx-clock.h
index 65fbed6..996f531 100644
--- a/arch/arm/mach-omap/include/mach/am33xx-clock.h
+++ b/arch/arm/mach-omap/include/mach/am33xx-clock.h
@@ -120,6 +120,8 @@
#define CM_PER_TIMER2_CLKCTRL (CM_PER + 0x80) /* Timer2 */
#define CM_WKUP_UART0_CLKCTRL (CM_WKUP + 0xB4)/* UART0 */
#define CM_WKUP_CONTROL_CLKCTRL (CM_WKUP + 0x4) /* Control Module */
+#define CM_PER_USB0_CLKCTRL (CM_PER + 0x1C) /* USB */
+#define CM_CLKDCOLDO_DPLL_PER (CM_WKUP + 0x7C)/* USB phy */
#define CM_PER_EMIF_CLKCTRL (CM_PER + 0x28) /* EMIF */
#define CM_PER_EMIF_FW_CLKCTRL (CM_PER + 0xD0) /* EMIF FW */
#define CM_PER_GPMC_CLKCTRL (CM_PER + 0x30) /* GPMC */
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 02/18] arm: am33xx: add pinmux config for USB
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
2014-06-13 7:54 ` [PATCH 01/18] arm: am33xx: add USB clocks Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 03/18] linux wrapper: add more dummy spin_lock stubs Christoph Fritz
` (14 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
Signed-off-by: Christoph Fritz <chf.fritz@googlemail.com>
---
arch/arm/mach-omap/am33xx_mux.c | 24 ++++++++++++++++++++++++
arch/arm/mach-omap/include/mach/am33xx-mux.h | 2 ++
2 files changed, 26 insertions(+)
diff --git a/arch/arm/mach-omap/am33xx_mux.c b/arch/arm/mach-omap/am33xx_mux.c
index 8318713..8779f00 100644
--- a/arch/arm/mach-omap/am33xx_mux.c
+++ b/arch/arm/mach-omap/am33xx_mux.c
@@ -253,6 +253,20 @@ static const __maybe_unused struct module_pin_mux spi1_pin_mux[] = {
{-1},
};
+static const __maybe_unused struct module_pin_mux usb0_pin_mux[] = {
+ {OFFSET(usb0_drvvbus), MODE(0)},
+ /* MCASP0_AHCLKR gpio3_17 */
+ {OFFSET(mcasp0_ahclkr), MODE(7) | PULLUDEN | RXACTIVE | PULLUP_EN},
+ {-1},
+};
+
+static const __maybe_unused struct module_pin_mux usb1_pin_mux[] = {
+ {OFFSET(usb1_drvvbus), MODE(0)},
+ /* MCASP0_ACLKR gpio3_18 */
+ {OFFSET(mcasp0_aclkr), MODE(7) | PULLUDEN | RXACTIVE | PULLUP_EN},
+ {-1},
+};
+
/*
* Configure the pin mux for the module
*/
@@ -321,3 +335,13 @@ void am33xx_enable_nand_pin_mux(void)
{
configure_module_pin_mux(nand_pin_mux);
}
+
+void am33xx_enable_usb0_pin_mux(void)
+{
+ configure_module_pin_mux(usb0_pin_mux);
+}
+
+void am33xx_enable_usb1_pin_mux(void)
+{
+ configure_module_pin_mux(usb1_pin_mux);
+}
diff --git a/arch/arm/mach-omap/include/mach/am33xx-mux.h b/arch/arm/mach-omap/include/mach/am33xx-mux.h
index fe3168b..64ad078 100644
--- a/arch/arm/mach-omap/include/mach/am33xx-mux.h
+++ b/arch/arm/mach-omap/include/mach/am33xx-mux.h
@@ -258,5 +258,7 @@ extern void am33xx_enable_uart2_pin_mux(void);
extern void am33xx_enable_mmc0_pin_mux(void);
extern void am33xx_enable_spi0_pin_mux(void);
extern void am33xx_enable_nand_pin_mux(void);
+extern void am33xx_enable_usb0_pin_mux(void);
+extern void am33xx_enable_usb1_pin_mux(void);
#endif /*__AM33XX_MUX_H__ */
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 03/18] linux wrapper: add more dummy spin_lock stubs
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
2014-06-13 7:54 ` [PATCH 01/18] arm: am33xx: add USB clocks Christoph Fritz
2014-06-13 7:54 ` [PATCH 02/18] arm: am33xx: add pinmux config for USB Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 05/18] musb: delete unused include files Christoph Fritz
` (13 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
Signed-off-by: Christoph Fritz <chf.fritz@googlemail.com>
---
include/linux/barebox-wrapper.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/include/linux/barebox-wrapper.h b/include/linux/barebox-wrapper.h
index 753fb52..4b5ea10 100644
--- a/include/linux/barebox-wrapper.h
+++ b/include/linux/barebox-wrapper.h
@@ -38,6 +38,8 @@ typedef int spinlock_t;
#define spin_lock_init(...)
#define spin_lock(...)
#define spin_unlock(...)
+#define spin_lock_irqsave(...)
+#define spin_unlock_irqrestore(...)
#define mutex_init(...)
#define mutex_lock(...)
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 05/18] musb: delete unused include files
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
` (2 preceding siblings ...)
2014-06-13 7:54 ` [PATCH 03/18] linux wrapper: add more dummy spin_lock stubs Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 06/18] musb: move musb.h to path include/usb Christoph Fritz
` (12 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
---
include/linux/usb/atmel_usba_udc.h | 26 -
include/linux/usb/cdc.h | 224 --------
include/linux/usb/ch9.h | 1005 ------------------------------------
include/linux/usb/composite.h | 338 ------------
include/linux/usb/dwc3.h | 188 -------
include/linux/usb/gadget.h | 864 -------------------------------
include/linux/usb/xhci-omap.h | 140 -----
7 files changed, 2785 deletions(-)
delete mode 100644 include/linux/usb/atmel_usba_udc.h
delete mode 100644 include/linux/usb/cdc.h
delete mode 100644 include/linux/usb/ch9.h
delete mode 100644 include/linux/usb/composite.h
delete mode 100644 include/linux/usb/dwc3.h
delete mode 100644 include/linux/usb/gadget.h
delete mode 100644 include/linux/usb/xhci-omap.h
diff --git a/include/linux/usb/atmel_usba_udc.h b/include/linux/usb/atmel_usba_udc.h
deleted file mode 100644
index be29ef0..0000000
--- a/include/linux/usb/atmel_usba_udc.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Platform data definitions for Atmel USBA gadget driver
- * [Original from Linux kernel: include/linux/usb/atmel_usba_udc.h]
- *
- * SPDX-License-Identifier: GPL-2.0+
- */
-#ifndef __LINUX_USB_USBA_H__
-#define __LINUX_USB_USBA_H__
-
-struct usba_ep_data {
- char *name;
- int index;
- int fifo_size;
- int nr_banks;
- int can_dma;
- int can_isoc;
-};
-
-struct usba_platform_data {
- int num_ep;
- struct usba_ep_data *ep;
-};
-
-extern int usba_udc_probe(struct usba_platform_data *pdata);
-
-#endif /* __LINUX_USB_USBA_H */
diff --git a/include/linux/usb/cdc.h b/include/linux/usb/cdc.h
deleted file mode 100644
index c1d039c..0000000
--- a/include/linux/usb/cdc.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * USB Communications Device Class (CDC) definitions
- *
- * CDC says how to talk to lots of different types of network adapters,
- * notably ethernet adapters and various modems. It's used mostly with
- * firmware based USB peripherals.
- *
- * Ported to U-boot by: Thomas Smits <ts.smits@gmail.com> and
- * Remy Bohmer <linux@bohmer.net>
- */
-
-#define USB_CDC_SUBCLASS_ACM 0x02
-#define USB_CDC_SUBCLASS_ETHERNET 0x06
-#define USB_CDC_SUBCLASS_WHCM 0x08
-#define USB_CDC_SUBCLASS_DMM 0x09
-#define USB_CDC_SUBCLASS_MDLM 0x0a
-#define USB_CDC_SUBCLASS_OBEX 0x0b
-
-#define USB_CDC_PROTO_NONE 0
-
-#define USB_CDC_ACM_PROTO_AT_V25TER 1
-#define USB_CDC_ACM_PROTO_AT_PCCA101 2
-#define USB_CDC_ACM_PROTO_AT_PCCA101_WAKE 3
-#define USB_CDC_ACM_PROTO_AT_GSM 4
-#define USB_CDC_ACM_PROTO_AT_3G 5
-#define USB_CDC_ACM_PROTO_AT_CDMA 6
-#define USB_CDC_ACM_PROTO_VENDOR 0xff
-
-/*-------------------------------------------------------------------------*/
-
-/*
- * Class-Specific descriptors ... there are a couple dozen of them
- */
-
-#define USB_CDC_HEADER_TYPE 0x00 /* header_desc */
-#define USB_CDC_CALL_MANAGEMENT_TYPE 0x01 /* call_mgmt_descriptor */
-#define USB_CDC_ACM_TYPE 0x02 /* acm_descriptor */
-#define USB_CDC_UNION_TYPE 0x06 /* union_desc */
-#define USB_CDC_COUNTRY_TYPE 0x07
-#define USB_CDC_NETWORK_TERMINAL_TYPE 0x0a /* network_terminal_desc */
-#define USB_CDC_ETHERNET_TYPE 0x0f /* ether_desc */
-#define USB_CDC_WHCM_TYPE 0x11
-#define USB_CDC_MDLM_TYPE 0x12 /* mdlm_desc */
-#define USB_CDC_MDLM_DETAIL_TYPE 0x13 /* mdlm_detail_desc */
-#define USB_CDC_DMM_TYPE 0x14
-#define USB_CDC_OBEX_TYPE 0x15
-
-/* "Header Functional Descriptor" from CDC spec 5.2.3.1 */
-struct usb_cdc_header_desc {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubType;
-
- __le16 bcdCDC;
-} __attribute__ ((packed));
-
-/* "Call Management Descriptor" from CDC spec 5.2.3.2 */
-struct usb_cdc_call_mgmt_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubType;
-
- __u8 bmCapabilities;
-#define USB_CDC_CALL_MGMT_CAP_CALL_MGMT 0x01
-#define USB_CDC_CALL_MGMT_CAP_DATA_INTF 0x02
-
- __u8 bDataInterface;
-} __attribute__ ((packed));
-
-/* "Abstract Control Management Descriptor" from CDC spec 5.2.3.3 */
-struct usb_cdc_acm_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubType;
-
- __u8 bmCapabilities;
-} __attribute__ ((packed));
-
-/* capabilities from 5.2.3.3 */
-
-#define USB_CDC_COMM_FEATURE 0x01
-#define USB_CDC_CAP_LINE 0x02
-#define USB_CDC_CAP_BRK 0x04
-#define USB_CDC_CAP_NOTIFY 0x08
-
-/* "Union Functional Descriptor" from CDC spec 5.2.3.8 */
-struct usb_cdc_union_desc {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubType;
-
- __u8 bMasterInterface0;
- __u8 bSlaveInterface0;
- /* ... and there could be other slave interfaces */
-} __attribute__ ((packed));
-
-/* "Country Selection Functional Descriptor" from CDC spec 5.2.3.9 */
-struct usb_cdc_country_functional_desc {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubType;
-
- __u8 iCountryCodeRelDate;
- __le16 wCountyCode0;
- /* ... and there can be a lot of country codes */
-} __attribute__ ((packed));
-
-/* "Network Channel Terminal Functional Descriptor" from CDC spec 5.2.3.11 */
-struct usb_cdc_network_terminal_desc {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubType;
-
- __u8 bEntityId;
- __u8 iName;
- __u8 bChannelIndex;
- __u8 bPhysicalInterface;
-} __attribute__ ((packed));
-
-/* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */
-struct usb_cdc_ether_desc {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubType;
-
- __u8 iMACAddress;
- __le32 bmEthernetStatistics;
- __le16 wMaxSegmentSize;
- __le16 wNumberMCFilters;
- __u8 bNumberPowerFilters;
-} __attribute__ ((packed));
-
-/* "MDLM Functional Descriptor" from CDC WMC spec 6.7.2.3 */
-struct usb_cdc_mdlm_desc {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubType;
-
- __le16 bcdVersion;
- __u8 bGUID[16];
-} __attribute__ ((packed));
-
-/* "MDLM Detail Functional Descriptor" from CDC WMC spec 6.7.2.4 */
-struct usb_cdc_mdlm_detail_desc {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDescriptorSubType;
-
- /* type is associated with mdlm_desc.bGUID */
- __u8 bGuidDescriptorType;
- __u8 bDetailData[0];
-} __attribute__ ((packed));
-
-/*-------------------------------------------------------------------------*/
-
-/*
- * Class-Specific Control Requests (6.2)
- *
- * section 3.6.2.1 table 4 has the ACM profile, for modems.
- * section 3.8.2 table 10 has the ethernet profile.
- *
- * Microsoft's RNDIS stack for Ethernet is a vendor-specific CDC ACM variant,
- * heavily dependent on the encapsulated (proprietary) command mechanism.
- */
-
-#define USB_CDC_SEND_ENCAPSULATED_COMMAND 0x00
-#define USB_CDC_GET_ENCAPSULATED_RESPONSE 0x01
-#define USB_CDC_REQ_SET_LINE_CODING 0x20
-#define USB_CDC_REQ_GET_LINE_CODING 0x21
-#define USB_CDC_REQ_SET_CONTROL_LINE_STATE 0x22
-#define USB_CDC_REQ_SEND_BREAK 0x23
-#define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40
-#define USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER 0x41
-#define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER 0x42
-#define USB_CDC_SET_ETHERNET_PACKET_FILTER 0x43
-#define USB_CDC_GET_ETHERNET_STATISTIC 0x44
-
-/* Line Coding Structure from CDC spec 6.2.13 */
-struct usb_cdc_line_coding {
- __le32 dwDTERate;
- __u8 bCharFormat;
-#define USB_CDC_1_STOP_BITS 0
-#define USB_CDC_1_5_STOP_BITS 1
-#define USB_CDC_2_STOP_BITS 2
-
- __u8 bParityType;
-#define USB_CDC_NO_PARITY 0
-#define USB_CDC_ODD_PARITY 1
-#define USB_CDC_EVEN_PARITY 2
-#define USB_CDC_MARK_PARITY 3
-#define USB_CDC_SPACE_PARITY 4
-
- __u8 bDataBits;
-} __attribute__ ((packed));
-
-/* table 62; bits in multicast filter */
-#define USB_CDC_PACKET_TYPE_PROMISCUOUS (1 << 0)
-#define USB_CDC_PACKET_TYPE_ALL_MULTICAST (1 << 1) /* no filter */
-#define USB_CDC_PACKET_TYPE_DIRECTED (1 << 2)
-#define USB_CDC_PACKET_TYPE_BROADCAST (1 << 3)
-#define USB_CDC_PACKET_TYPE_MULTICAST (1 << 4) /* filtered */
-
-/*-------------------------------------------------------------------------*/
-
-/*
- * Class-Specific Notifications (6.3) sent by interrupt transfers
- *
- * section 3.8.2 table 11 of the CDC spec lists Ethernet notifications
- * section 3.6.2.1 table 5 specifies ACM notifications, accepted by RNDIS
- * RNDIS also defines its own bit-incompatible notifications
- */
-
-#define USB_CDC_NOTIFY_NETWORK_CONNECTION 0x00
-#define USB_CDC_NOTIFY_RESPONSE_AVAILABLE 0x01
-#define USB_CDC_NOTIFY_SERIAL_STATE 0x20
-#define USB_CDC_NOTIFY_SPEED_CHANGE 0x2a
-
-struct usb_cdc_notification {
- __u8 bmRequestType;
- __u8 bNotificationType;
- __le16 wValue;
- __le16 wIndex;
- __le16 wLength;
-} __attribute__ ((packed));
diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h
deleted file mode 100644
index bd48704..0000000
--- a/include/linux/usb/ch9.h
+++ /dev/null
@@ -1,1005 +0,0 @@
-/*
- * This file holds USB constants and structures that are needed for
- * USB device APIs. These are used by the USB device model, which is
- * defined in chapter 9 of the USB 2.0 specification and in the
- * Wireless USB 1.0 (spread around). Linux has several APIs in C that
- * need these:
- *
- * - the master/host side Linux-USB kernel driver API;
- * - the "usbfs" user space API; and
- * - the Linux "gadget" slave/device/peripheral side driver API.
- *
- * USB 2.0 adds an additional "On The Go" (OTG) mode, which lets systems
- * act either as a USB master/host or as a USB slave/device. That means
- * the master and slave side APIs benefit from working well together.
- *
- * There's also "Wireless USB", using low power short range radios for
- * peripheral interconnection but otherwise building on the USB framework.
- *
- * Note all descriptors are declared '__attribute__((packed))' so that:
- *
- * [a] they never get padded, either internally (USB spec writers
- * probably handled that) or externally;
- *
- * [b] so that accessing bigger-than-a-bytes fields will never
- * generate bus errors on any platform, even when the location of
- * its descriptor inside a bundle isn't "naturally aligned", and
- *
- * [c] for consistency, removing all doubt even when it appears to
- * someone that the two other points are non-issues for that
- * particular descriptor type.
- */
-
-#ifndef __LINUX_USB_CH9_H
-#define __LINUX_USB_CH9_H
-
-#include <linux/types.h> /* __u8 etc */
-#include <asm/byteorder.h> /* le16_to_cpu */
-#include <asm/unaligned.h> /* get_unaligned() */
-
-/*-------------------------------------------------------------------------*/
-
-/* CONTROL REQUEST SUPPORT */
-
-/*
- * USB directions
- *
- * This bit flag is used in endpoint descriptors' bEndpointAddress field.
- * It's also one of three fields in control requests bRequestType.
- */
-#define USB_DIR_OUT 0 /* to device */
-#define USB_DIR_IN 0x80 /* to host */
-
-/*
- * USB types, the second of three bRequestType fields
- */
-#define USB_TYPE_MASK (0x03 << 5)
-#define USB_TYPE_STANDARD (0x00 << 5)
-#define USB_TYPE_CLASS (0x01 << 5)
-#define USB_TYPE_VENDOR (0x02 << 5)
-#define USB_TYPE_RESERVED (0x03 << 5)
-
-/*
- * USB recipients, the third of three bRequestType fields
- */
-#define USB_RECIP_MASK 0x1f
-#define USB_RECIP_DEVICE 0x00
-#define USB_RECIP_INTERFACE 0x01
-#define USB_RECIP_ENDPOINT 0x02
-#define USB_RECIP_OTHER 0x03
-/* From Wireless USB 1.0 */
-#define USB_RECIP_PORT 0x04
-#define USB_RECIP_RPIPE 0x05
-
-/*
- * Standard requests, for the bRequest field of a SETUP packet.
- *
- * These are qualified by the bRequestType field, so that for example
- * TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved
- * by a GET_STATUS request.
- */
-#define USB_REQ_GET_STATUS 0x00
-#define USB_REQ_CLEAR_FEATURE 0x01
-#define USB_REQ_SET_FEATURE 0x03
-#define USB_REQ_SET_ADDRESS 0x05
-#define USB_REQ_GET_DESCRIPTOR 0x06
-#define USB_REQ_SET_DESCRIPTOR 0x07
-#define USB_REQ_GET_CONFIGURATION 0x08
-#define USB_REQ_SET_CONFIGURATION 0x09
-#define USB_REQ_GET_INTERFACE 0x0A
-#define USB_REQ_SET_INTERFACE 0x0B
-#define USB_REQ_SYNCH_FRAME 0x0C
-#define USB_REQ_SET_SEL 0x30
-#define USB_REQ_SET_ISOCH_DELAY 0x31
-
-#define USB_REQ_SET_ENCRYPTION 0x0D /* Wireless USB */
-#define USB_REQ_GET_ENCRYPTION 0x0E
-#define USB_REQ_RPIPE_ABORT 0x0E
-#define USB_REQ_SET_HANDSHAKE 0x0F
-#define USB_REQ_RPIPE_RESET 0x0F
-#define USB_REQ_GET_HANDSHAKE 0x10
-#define USB_REQ_SET_CONNECTION 0x11
-#define USB_REQ_SET_SECURITY_DATA 0x12
-#define USB_REQ_GET_SECURITY_DATA 0x13
-#define USB_REQ_SET_WUSB_DATA 0x14
-#define USB_REQ_LOOPBACK_DATA_WRITE 0x15
-#define USB_REQ_LOOPBACK_DATA_READ 0x16
-#define USB_REQ_SET_INTERFACE_DS 0x17
-
-/* The Link Power Management (LPM) ECN defines USB_REQ_TEST_AND_SET command,
- * used by hubs to put ports into a new L1 suspend state, except that it
- * forgot to define its number ...
- */
-
-/*
- * USB feature flags are written using USB_REQ_{CLEAR,SET}_FEATURE, and
- * are read as a bit array returned by USB_REQ_GET_STATUS. (So there
- * are at most sixteen features of each type.) Hubs may also support a
- * new USB_REQ_TEST_AND_SET_FEATURE to put ports into L1 suspend.
- */
-#define USB_DEVICE_SELF_POWERED 0 /* (read only) */
-#define USB_DEVICE_REMOTE_WAKEUP 1 /* dev may initiate wakeup */
-#define USB_DEVICE_TEST_MODE 2 /* (wired high speed only) */
-#define USB_DEVICE_BATTERY 2 /* (wireless) */
-#define USB_DEVICE_B_HNP_ENABLE 3 /* (otg) dev may initiate HNP */
-#define USB_DEVICE_WUSB_DEVICE 3 /* (wireless)*/
-#define USB_DEVICE_A_HNP_SUPPORT 4 /* (otg) RH port supports HNP */
-#define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* (otg) other RH port does */
-#define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */
-
-/*
- * Test Mode Selectors
- * See USB 2.0 spec Table 9-7
- */
-#define TEST_J 1
-#define TEST_K 2
-#define TEST_SE0_NAK 3
-#define TEST_PACKET 4
-#define TEST_FORCE_EN 5
-
-/*
- * New Feature Selectors as added by USB 3.0
- * See USB 3.0 spec Table 9-6
- */
-#define USB_DEVICE_U1_ENABLE 48 /* dev may initiate U1 transition */
-#define USB_DEVICE_U2_ENABLE 49 /* dev may initiate U2 transition */
-#define USB_DEVICE_LTM_ENABLE 50 /* dev may send LTM */
-#define USB_INTRF_FUNC_SUSPEND 0 /* function suspend */
-
-#define USB_INTR_FUNC_SUSPEND_OPT_MASK 0xFF00
-/*
- * Suspend Options, Table 9-7 USB 3.0 spec
- */
-#define USB_INTRF_FUNC_SUSPEND_LP (1 << (8 + 0))
-#define USB_INTRF_FUNC_SUSPEND_RW (1 << (8 + 1))
-
-#define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */
-
-/* Bit array elements as returned by the USB_REQ_GET_STATUS request. */
-#define USB_DEV_STAT_U1_ENABLED 2 /* transition into U1 state */
-#define USB_DEV_STAT_U2_ENABLED 3 /* transition into U2 state */
-#define USB_DEV_STAT_LTM_ENABLED 4 /* Latency tolerance messages */
-
-/**
- * struct usb_ctrlrequest - SETUP data for a USB device control request
- * @bRequestType: matches the USB bmRequestType field
- * @bRequest: matches the USB bRequest field
- * @wValue: matches the USB wValue field (le16 byte order)
- * @wIndex: matches the USB wIndex field (le16 byte order)
- * @wLength: matches the USB wLength field (le16 byte order)
- *
- * This structure is used to send control requests to a USB device. It matches
- * the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the
- * USB spec for a fuller description of the different fields, and what they are
- * used for.
- *
- * Note that the driver for any interface can issue control requests.
- * For most devices, interfaces don't coordinate with each other, so
- * such requests may be made at any time.
- */
-struct usb_ctrlrequest {
- __u8 bRequestType;
- __u8 bRequest;
- __le16 wValue;
- __le16 wIndex;
- __le16 wLength;
-} __attribute__ ((packed));
-
-/*-------------------------------------------------------------------------*/
-
-/*
- * STANDARD DESCRIPTORS ... as returned by GET_DESCRIPTOR, or
- * (rarely) accepted by SET_DESCRIPTOR.
- *
- * Note that all multi-byte values here are encoded in little endian
- * byte order "on the wire". Within the kernel and when exposed
- * through the Linux-USB APIs, they are not converted to cpu byte
- * order; it is the responsibility of the client code to do this.
- * The single exception is when device and configuration descriptors (but
- * not other descriptors) are read from usbfs (i.e. /proc/bus/usb/BBB/DDD);
- * in this case the fields are converted to host endianness by the kernel.
- */
-
-/*
- * Descriptor types ... USB 2.0 spec table 9.5
- */
-#define USB_DT_DEVICE 0x01
-#define USB_DT_CONFIG 0x02
-#define USB_DT_STRING 0x03
-#define USB_DT_INTERFACE 0x04
-#define USB_DT_ENDPOINT 0x05
-#define USB_DT_DEVICE_QUALIFIER 0x06
-#define USB_DT_OTHER_SPEED_CONFIG 0x07
-#define USB_DT_INTERFACE_POWER 0x08
-/* these are from a minor usb 2.0 revision (ECN) */
-#define USB_DT_OTG 0x09
-#define USB_DT_DEBUG 0x0a
-#define USB_DT_INTERFACE_ASSOCIATION 0x0b
-/* these are from the Wireless USB spec */
-#define USB_DT_SECURITY 0x0c
-#define USB_DT_KEY 0x0d
-#define USB_DT_ENCRYPTION_TYPE 0x0e
-#define USB_DT_BOS 0x0f
-#define USB_DT_DEVICE_CAPABILITY 0x10
-#define USB_DT_WIRELESS_ENDPOINT_COMP 0x11
-#define USB_DT_WIRE_ADAPTER 0x21
-#define USB_DT_RPIPE 0x22
-#define USB_DT_CS_RADIO_CONTROL 0x23
-/* From the T10 UAS specification */
-#define USB_DT_PIPE_USAGE 0x24
-/* From the USB 3.0 spec */
-#define USB_DT_SS_ENDPOINT_COMP 0x30
-
-/* Conventional codes for class-specific descriptors. The convention is
- * defined in the USB "Common Class" Spec (3.11). Individual class specs
- * are authoritative for their usage, not the "common class" writeup.
- */
-#define USB_DT_CS_DEVICE (USB_TYPE_CLASS | USB_DT_DEVICE)
-#define USB_DT_CS_CONFIG (USB_TYPE_CLASS | USB_DT_CONFIG)
-#define USB_DT_CS_STRING (USB_TYPE_CLASS | USB_DT_STRING)
-#define USB_DT_CS_INTERFACE (USB_TYPE_CLASS | USB_DT_INTERFACE)
-#define USB_DT_CS_ENDPOINT (USB_TYPE_CLASS | USB_DT_ENDPOINT)
-
-/* All standard descriptors have these 2 fields at the beginning */
-struct usb_descriptor_header {
- __u8 bLength;
- __u8 bDescriptorType;
-} __attribute__ ((packed));
-
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_DEVICE: Device descriptor */
-struct usb_device_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
-
- __le16 bcdUSB;
- __u8 bDeviceClass;
- __u8 bDeviceSubClass;
- __u8 bDeviceProtocol;
- __u8 bMaxPacketSize0;
- __le16 idVendor;
- __le16 idProduct;
- __le16 bcdDevice;
- __u8 iManufacturer;
- __u8 iProduct;
- __u8 iSerialNumber;
- __u8 bNumConfigurations;
-} __attribute__ ((packed));
-
-#define USB_DT_DEVICE_SIZE 18
-
-
-/*
- * Device and/or Interface Class codes
- * as found in bDeviceClass or bInterfaceClass
- * and defined by www.usb.org documents
- */
-#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */
-#define USB_CLASS_AUDIO 1
-#define USB_CLASS_COMM 2
-#define USB_CLASS_HID 3
-#define USB_CLASS_PHYSICAL 5
-#define USB_CLASS_STILL_IMAGE 6
-#define USB_CLASS_PRINTER 7
-#define USB_CLASS_MASS_STORAGE 8
-#define USB_CLASS_HUB 9
-#define USB_CLASS_CDC_DATA 0x0a
-#define USB_CLASS_CSCID 0x0b /* chip+ smart card */
-#define USB_CLASS_CONTENT_SEC 0x0d /* content security */
-#define USB_CLASS_VIDEO 0x0e
-#define USB_CLASS_WIRELESS_CONTROLLER 0xe0
-#define USB_CLASS_MISC 0xef
-#define USB_CLASS_APP_SPEC 0xfe
-#define USB_CLASS_VENDOR_SPEC 0xff
-
-#define USB_SUBCLASS_VENDOR_SPEC 0xff
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_CONFIG: Configuration descriptor information.
- *
- * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the
- * descriptor type is different. Highspeed-capable devices can look
- * different depending on what speed they're currently running. Only
- * devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG
- * descriptors.
- */
-struct usb_config_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
-
- __le16 wTotalLength;
- __u8 bNumInterfaces;
- __u8 bConfigurationValue;
- __u8 iConfiguration;
- __u8 bmAttributes;
- __u8 bMaxPower;
-} __attribute__ ((packed));
-
-#define USB_DT_CONFIG_SIZE 9
-
-/* from config descriptor bmAttributes */
-#define USB_CONFIG_ATT_ONE (1 << 7) /* must be set */
-#define USB_CONFIG_ATT_SELFPOWER (1 << 6) /* self powered */
-#define USB_CONFIG_ATT_WAKEUP (1 << 5) /* can wakeup */
-#define USB_CONFIG_ATT_BATTERY (1 << 4) /* battery powered */
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_STRING: String descriptor */
-struct usb_string_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
-
- __le16 wData[1]; /* UTF-16LE encoded */
-} __attribute__ ((packed));
-
-/* note that "string" zero is special, it holds language codes that
- * the device supports, not Unicode characters.
- */
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_INTERFACE: Interface descriptor */
-struct usb_interface_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
-
- __u8 bInterfaceNumber;
- __u8 bAlternateSetting;
- __u8 bNumEndpoints;
- __u8 bInterfaceClass;
- __u8 bInterfaceSubClass;
- __u8 bInterfaceProtocol;
- __u8 iInterface;
-} __attribute__ ((packed));
-
-#define USB_DT_INTERFACE_SIZE 9
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_ENDPOINT: Endpoint descriptor */
-struct usb_endpoint_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
-
- __u8 bEndpointAddress;
- __u8 bmAttributes;
- __le16 wMaxPacketSize;
- __u8 bInterval;
-
- /* NOTE: these two are _only_ in audio endpoints. */
- /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
- __u8 bRefresh;
- __u8 bSynchAddress;
-} __attribute__ ((packed));
-
-#define USB_DT_ENDPOINT_SIZE 7
-#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */
-
-
-/*
- * Endpoints
- */
-#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */
-#define USB_ENDPOINT_DIR_MASK 0x80
-
-#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */
-#define USB_ENDPOINT_XFER_CONTROL 0
-#define USB_ENDPOINT_XFER_ISOC 1
-#define USB_ENDPOINT_XFER_BULK 2
-#define USB_ENDPOINT_XFER_INT 3
-#define USB_ENDPOINT_MAX_ADJUSTABLE 0x80
-
-/* The USB 3.0 spec redefines bits 5:4 of bmAttributes as interrupt ep type. */
-#define USB_ENDPOINT_INTRTYPE 0x30
-#define USB_ENDPOINT_INTR_PERIODIC (0 << 4)
-#define USB_ENDPOINT_INTR_NOTIFICATION (1 << 4)
-
-#define USB_ENDPOINT_SYNCTYPE 0x0c
-#define USB_ENDPOINT_SYNC_NONE (0 << 2)
-#define USB_ENDPOINT_SYNC_ASYNC (1 << 2)
-#define USB_ENDPOINT_SYNC_ADAPTIVE (2 << 2)
-#define USB_ENDPOINT_SYNC_SYNC (3 << 2)
-
-#define USB_ENDPOINT_USAGE_MASK 0x30
-#define USB_ENDPOINT_USAGE_DATA 0x00
-#define USB_ENDPOINT_USAGE_FEEDBACK 0x10
-#define USB_ENDPOINT_USAGE_IMPLICIT_FB 0x20 /* Implicit feedback Data endpoint */
-
-/*-------------------------------------------------------------------------*/
-
-/**
- * usb_endpoint_num - get the endpoint's number
- * @epd: endpoint to be checked
- *
- * Returns @epd's number: 0 to 15.
- */
-static inline int usb_endpoint_num(const struct usb_endpoint_descriptor *epd)
-{
- return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
-}
-
-/**
- * usb_endpoint_type - get the endpoint's transfer type
- * @epd: endpoint to be checked
- *
- * Returns one of USB_ENDPOINT_XFER_{CONTROL, ISOC, BULK, INT} according
- * to @epd's transfer type.
- */
-static inline int usb_endpoint_type(const struct usb_endpoint_descriptor *epd)
-{
- return epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
-}
-
-/**
- * usb_endpoint_dir_in - check if the endpoint has IN direction
- * @epd: endpoint to be checked
- *
- * Returns true if the endpoint is of type IN, otherwise it returns false.
- */
-static inline int usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd)
-{
- return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN);
-}
-
-/**
- * usb_endpoint_dir_out - check if the endpoint has OUT direction
- * @epd: endpoint to be checked
- *
- * Returns true if the endpoint is of type OUT, otherwise it returns false.
- */
-static inline int usb_endpoint_dir_out(
- const struct usb_endpoint_descriptor *epd)
-{
- return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT);
-}
-
-/**
- * usb_endpoint_xfer_bulk - check if the endpoint has bulk transfer type
- * @epd: endpoint to be checked
- *
- * Returns true if the endpoint is of type bulk, otherwise it returns false.
- */
-static inline int usb_endpoint_xfer_bulk(
- const struct usb_endpoint_descriptor *epd)
-{
- return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
- USB_ENDPOINT_XFER_BULK);
-}
-
-/**
- * usb_endpoint_xfer_control - check if the endpoint has control transfer type
- * @epd: endpoint to be checked
- *
- * Returns true if the endpoint is of type control, otherwise it returns false.
- */
-static inline int usb_endpoint_xfer_control(
- const struct usb_endpoint_descriptor *epd)
-{
- return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
- USB_ENDPOINT_XFER_CONTROL);
-}
-
-/**
- * usb_endpoint_xfer_int - check if the endpoint has interrupt transfer type
- * @epd: endpoint to be checked
- *
- * Returns true if the endpoint is of type interrupt, otherwise it returns
- * false.
- */
-static inline int usb_endpoint_xfer_int(
- const struct usb_endpoint_descriptor *epd)
-{
- return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
- USB_ENDPOINT_XFER_INT);
-}
-
-/**
- * usb_endpoint_xfer_isoc - check if the endpoint has isochronous transfer type
- * @epd: endpoint to be checked
- *
- * Returns true if the endpoint is of type isochronous, otherwise it returns
- * false.
- */
-static inline int usb_endpoint_xfer_isoc(
- const struct usb_endpoint_descriptor *epd)
-{
- return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
- USB_ENDPOINT_XFER_ISOC);
-}
-
-/**
- * usb_endpoint_is_bulk_in - check if the endpoint is bulk IN
- * @epd: endpoint to be checked
- *
- * Returns true if the endpoint has bulk transfer type and IN direction,
- * otherwise it returns false.
- */
-static inline int usb_endpoint_is_bulk_in(
- const struct usb_endpoint_descriptor *epd)
-{
- return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_in(epd);
-}
-
-/**
- * usb_endpoint_is_bulk_out - check if the endpoint is bulk OUT
- * @epd: endpoint to be checked
- *
- * Returns true if the endpoint has bulk transfer type and OUT direction,
- * otherwise it returns false.
- */
-static inline int usb_endpoint_is_bulk_out(
- const struct usb_endpoint_descriptor *epd)
-{
- return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_out(epd);
-}
-
-/**
- * usb_endpoint_is_int_in - check if the endpoint is interrupt IN
- * @epd: endpoint to be checked
- *
- * Returns true if the endpoint has interrupt transfer type and IN direction,
- * otherwise it returns false.
- */
-static inline int usb_endpoint_is_int_in(
- const struct usb_endpoint_descriptor *epd)
-{
- return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_in(epd);
-}
-
-/**
- * usb_endpoint_is_int_out - check if the endpoint is interrupt OUT
- * @epd: endpoint to be checked
- *
- * Returns true if the endpoint has interrupt transfer type and OUT direction,
- * otherwise it returns false.
- */
-static inline int usb_endpoint_is_int_out(
- const struct usb_endpoint_descriptor *epd)
-{
- return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_out(epd);
-}
-
-/**
- * usb_endpoint_is_isoc_in - check if the endpoint is isochronous IN
- * @epd: endpoint to be checked
- *
- * Returns true if the endpoint has isochronous transfer type and IN direction,
- * otherwise it returns false.
- */
-static inline int usb_endpoint_is_isoc_in(
- const struct usb_endpoint_descriptor *epd)
-{
- return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_in(epd);
-}
-
-/**
- * usb_endpoint_is_isoc_out - check if the endpoint is isochronous OUT
- * @epd: endpoint to be checked
- *
- * Returns true if the endpoint has isochronous transfer type and OUT direction,
- * otherwise it returns false.
- */
-static inline int usb_endpoint_is_isoc_out(
- const struct usb_endpoint_descriptor *epd)
-{
- return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_out(epd);
-}
-
-/**
- * usb_endpoint_maxp - get endpoint's max packet size
- * @epd: endpoint to be checked
- *
- * Returns @epd's max packet
- */
-static inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd)
-{
- return __le16_to_cpu(get_unaligned(&epd->wMaxPacketSize));
-}
-
-static inline int usb_endpoint_interrupt_type(
- const struct usb_endpoint_descriptor *epd)
-{
- return epd->bmAttributes & USB_ENDPOINT_INTRTYPE;
-}
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_SS_ENDPOINT_COMP: SuperSpeed Endpoint Companion descriptor */
-struct usb_ss_ep_comp_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
-
- __u8 bMaxBurst;
- __u8 bmAttributes;
- __le16 wBytesPerInterval;
-} __attribute__ ((packed));
-
-#define USB_DT_SS_EP_COMP_SIZE 6
-
-/* Bits 4:0 of bmAttributes if this is a bulk endpoint */
-static inline int
-usb_ss_max_streams(const struct usb_ss_ep_comp_descriptor *comp)
-{
- int max_streams;
-
- if (!comp)
- return 0;
-
- max_streams = comp->bmAttributes & 0x1f;
-
- if (!max_streams)
- return 0;
-
- max_streams = 1 << max_streams;
-
- return max_streams;
-}
-
-/* Bits 1:0 of bmAttributes if this is an isoc endpoint */
-#define USB_SS_MULT(p) (1 + ((p) & 0x3))
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */
-struct usb_qualifier_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
-
- __le16 bcdUSB;
- __u8 bDeviceClass;
- __u8 bDeviceSubClass;
- __u8 bDeviceProtocol;
- __u8 bMaxPacketSize0;
- __u8 bNumConfigurations;
- __u8 bRESERVED;
-} __attribute__ ((packed));
-
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_OTG (from OTG 1.0a supplement) */
-struct usb_otg_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
-
- __u8 bmAttributes; /* support for HNP, SRP, etc */
-} __attribute__ ((packed));
-
-/* from usb_otg_descriptor.bmAttributes */
-#define USB_OTG_SRP (1 << 0)
-#define USB_OTG_HNP (1 << 1) /* swap host/device roles */
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_DEBUG: for special highspeed devices, replacing serial console */
-struct usb_debug_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
-
- /* bulk endpoints with 8 byte maxpacket */
- __u8 bDebugInEndpoint;
- __u8 bDebugOutEndpoint;
-} __attribute__((packed));
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_INTERFACE_ASSOCIATION: groups interfaces */
-struct usb_interface_assoc_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
-
- __u8 bFirstInterface;
- __u8 bInterfaceCount;
- __u8 bFunctionClass;
- __u8 bFunctionSubClass;
- __u8 bFunctionProtocol;
- __u8 iFunction;
-} __attribute__ ((packed));
-
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_SECURITY: group of wireless security descriptors, including
- * encryption types available for setting up a CC/association.
- */
-struct usb_security_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
-
- __le16 wTotalLength;
- __u8 bNumEncryptionTypes;
-} __attribute__((packed));
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_KEY: used with {GET,SET}_SECURITY_DATA; only public keys
- * may be retrieved.
- */
-struct usb_key_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
-
- __u8 tTKID[3];
- __u8 bReserved;
- __u8 bKeyData[0];
-} __attribute__((packed));
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_ENCRYPTION_TYPE: bundled in DT_SECURITY groups */
-struct usb_encryption_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
-
- __u8 bEncryptionType;
-#define USB_ENC_TYPE_UNSECURE 0
-#define USB_ENC_TYPE_WIRED 1 /* non-wireless mode */
-#define USB_ENC_TYPE_CCM_1 2 /* aes128/cbc session */
-#define USB_ENC_TYPE_RSA_1 3 /* rsa3072/sha1 auth */
- __u8 bEncryptionValue; /* use in SET_ENCRYPTION */
- __u8 bAuthKeyIndex;
-} __attribute__((packed));
-
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_BOS: group of device-level capabilities */
-struct usb_bos_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
-
- __le16 wTotalLength;
- __u8 bNumDeviceCaps;
-} __attribute__((packed));
-
-#define USB_DT_BOS_SIZE 5
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_DEVICE_CAPABILITY: grouped with BOS */
-struct usb_dev_cap_header {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDevCapabilityType;
-} __attribute__((packed));
-
-#define USB_CAP_TYPE_WIRELESS_USB 1
-
-struct usb_wireless_cap_descriptor { /* Ultra Wide Band */
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDevCapabilityType;
-
- __u8 bmAttributes;
-#define USB_WIRELESS_P2P_DRD (1 << 1)
-#define USB_WIRELESS_BEACON_MASK (3 << 2)
-#define USB_WIRELESS_BEACON_SELF (1 << 2)
-#define USB_WIRELESS_BEACON_DIRECTED (2 << 2)
-#define USB_WIRELESS_BEACON_NONE (3 << 2)
- __le16 wPHYRates; /* bit rates, Mbps */
-#define USB_WIRELESS_PHY_53 (1 << 0) /* always set */
-#define USB_WIRELESS_PHY_80 (1 << 1)
-#define USB_WIRELESS_PHY_107 (1 << 2) /* always set */
-#define USB_WIRELESS_PHY_160 (1 << 3)
-#define USB_WIRELESS_PHY_200 (1 << 4) /* always set */
-#define USB_WIRELESS_PHY_320 (1 << 5)
-#define USB_WIRELESS_PHY_400 (1 << 6)
-#define USB_WIRELESS_PHY_480 (1 << 7)
- __u8 bmTFITXPowerInfo; /* TFI power levels */
- __u8 bmFFITXPowerInfo; /* FFI power levels */
- __le16 bmBandGroup;
- __u8 bReserved;
-} __attribute__((packed));
-
-/* USB 2.0 Extension descriptor */
-#define USB_CAP_TYPE_EXT 2
-
-struct usb_ext_cap_descriptor { /* Link Power Management */
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDevCapabilityType;
- __le32 bmAttributes;
-#define USB_LPM_SUPPORT (1 << 1) /* supports LPM */
-#define USB_BESL_SUPPORT (1 << 2) /* supports BESL */
-#define USB_BESL_BASELINE_VALID (1 << 3) /* Baseline BESL valid*/
-#define USB_BESL_DEEP_VALID (1 << 4) /* Deep BESL valid */
-#define USB_GET_BESL_BASELINE(p) (((p) & (0xf << 8)) >> 8)
-#define USB_GET_BESL_DEEP(p) (((p) & (0xf << 12)) >> 12)
-} __attribute__((packed));
-
-#define USB_DT_USB_EXT_CAP_SIZE 7
-
-/*
- * SuperSpeed USB Capability descriptor: Defines the set of SuperSpeed USB
- * specific device level capabilities
- */
-#define USB_SS_CAP_TYPE 3
-struct usb_ss_cap_descriptor { /* Link Power Management */
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDevCapabilityType;
- __u8 bmAttributes;
-#define USB_LTM_SUPPORT (1 << 1) /* supports LTM */
- __le16 wSpeedSupported;
-#define USB_LOW_SPEED_OPERATION (1) /* Low speed operation */
-#define USB_FULL_SPEED_OPERATION (1 << 1) /* Full speed operation */
-#define USB_HIGH_SPEED_OPERATION (1 << 2) /* High speed operation */
-#define USB_5GBPS_OPERATION (1 << 3) /* Operation at 5Gbps */
- __u8 bFunctionalitySupport;
- __u8 bU1devExitLat;
- __le16 bU2DevExitLat;
-} __attribute__((packed));
-
-#define USB_DT_USB_SS_CAP_SIZE 10
-
-/*
- * Container ID Capability descriptor: Defines the instance unique ID used to
- * identify the instance across all operating modes
- */
-#define CONTAINER_ID_TYPE 4
-struct usb_ss_container_id_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
- __u8 bDevCapabilityType;
- __u8 bReserved;
- __u8 ContainerID[16]; /* 128-bit number */
-} __attribute__((packed));
-
-#define USB_DT_USB_SS_CONTN_ID_SIZE 20
-/*-------------------------------------------------------------------------*/
-
-/* USB_DT_WIRELESS_ENDPOINT_COMP: companion descriptor associated with
- * each endpoint descriptor for a wireless device
- */
-struct usb_wireless_ep_comp_descriptor {
- __u8 bLength;
- __u8 bDescriptorType;
-
- __u8 bMaxBurst;
- __u8 bMaxSequence;
- __le16 wMaxStreamDelay;
- __le16 wOverTheAirPacketSize;
- __u8 bOverTheAirInterval;
- __u8 bmCompAttributes;
-#define USB_ENDPOINT_SWITCH_MASK 0x03 /* in bmCompAttributes */
-#define USB_ENDPOINT_SWITCH_NO 0
-#define USB_ENDPOINT_SWITCH_SWITCH 1
-#define USB_ENDPOINT_SWITCH_SCALE 2
-} __attribute__((packed));
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_REQ_SET_HANDSHAKE is a four-way handshake used between a wireless
- * host and a device for connection set up, mutual authentication, and
- * exchanging short lived session keys. The handshake depends on a CC.
- */
-struct usb_handshake {
- __u8 bMessageNumber;
- __u8 bStatus;
- __u8 tTKID[3];
- __u8 bReserved;
- __u8 CDID[16];
- __u8 nonce[16];
- __u8 MIC[8];
-} __attribute__((packed));
-
-/*-------------------------------------------------------------------------*/
-
-/* USB_REQ_SET_CONNECTION modifies or revokes a connection context (CC).
- * A CC may also be set up using non-wireless secure channels (including
- * wired USB!), and some devices may support CCs with multiple hosts.
- */
-struct usb_connection_context {
- __u8 CHID[16]; /* persistent host id */
- __u8 CDID[16]; /* device id (unique w/in host context) */
- __u8 CK[16]; /* connection key */
-} __attribute__((packed));
-
-/*-------------------------------------------------------------------------*/
-
-/* USB 2.0 defines three speeds, here's how Linux identifies them */
-
-enum usb_device_speed {
- USB_SPEED_UNKNOWN = 0, /* enumerating */
- USB_SPEED_LOW, USB_SPEED_FULL, /* usb 1.1 */
- USB_SPEED_HIGH, /* usb 2.0 */
- USB_SPEED_WIRELESS, /* wireless (usb 2.5) */
- USB_SPEED_SUPER, /* usb 3.0 */
-};
-
-#ifdef __KERNEL__
-
-/**
- * usb_speed_string() - Returns human readable-name of the speed.
- * @speed: The speed to return human-readable name for. If it's not
- * any of the speeds defined in usb_device_speed enum, string for
- * USB_SPEED_UNKNOWN will be returned.
- */
-extern const char *usb_speed_string(enum usb_device_speed speed);
-
-#endif
-
-enum usb_device_state {
- /* NOTATTACHED isn't in the USB spec, and this state acts
- * the same as ATTACHED ... but it's clearer this way.
- */
- USB_STATE_NOTATTACHED = 0,
-
- /* chapter 9 and authentication (wireless) device states */
- USB_STATE_ATTACHED,
- USB_STATE_POWERED, /* wired */
- USB_STATE_RECONNECTING, /* auth */
- USB_STATE_UNAUTHENTICATED, /* auth */
- USB_STATE_DEFAULT, /* limited function */
- USB_STATE_ADDRESS,
- USB_STATE_CONFIGURED, /* most functions */
-
- USB_STATE_SUSPENDED
-
- /* NOTE: there are actually four different SUSPENDED
- * states, returning to POWERED, DEFAULT, ADDRESS, or
- * CONFIGURED respectively when SOF tokens flow again.
- * At this level there's no difference between L1 and L2
- * suspend states. (L2 being original USB 1.1 suspend.)
- */
-};
-
-enum usb3_link_state {
- USB3_LPM_U0 = 0,
- USB3_LPM_U1,
- USB3_LPM_U2,
- USB3_LPM_U3
-};
-
-/*
- * A U1 timeout of 0x0 means the parent hub will reject any transitions to U1.
- * 0xff means the parent hub will accept transitions to U1, but will not
- * initiate a transition.
- *
- * A U1 timeout of 0x1 to 0x7F also causes the hub to initiate a transition to
- * U1 after that many microseconds. Timeouts of 0x80 to 0xFE are reserved
- * values.
- *
- * A U2 timeout of 0x0 means the parent hub will reject any transitions to U2.
- * 0xff means the parent hub will accept transitions to U2, but will not
- * initiate a transition.
- *
- * A U2 timeout of 0x1 to 0xFE also causes the hub to initiate a transition to
- * U2 after N*256 microseconds. Therefore a U2 timeout value of 0x1 means a U2
- * idle timer of 256 microseconds, 0x2 means 512 microseconds, 0xFE means
- * 65.024ms.
- */
-#define USB3_LPM_DISABLED 0x0
-#define USB3_LPM_U1_MAX_TIMEOUT 0x7F
-#define USB3_LPM_U2_MAX_TIMEOUT 0xFE
-#define USB3_LPM_DEVICE_INITIATED 0xFF
-
-struct usb_set_sel_req {
- __u8 u1_sel;
- __u8 u1_pel;
- __le16 u2_sel;
- __le16 u2_pel;
-} __attribute__ ((packed));
-
-/*
- * The Set System Exit Latency control transfer provides one byte each for
- * U1 SEL and U1 PEL, so the max exit latency is 0xFF. U2 SEL and U2 PEL each
- * are two bytes long.
- */
-#define USB3_LPM_MAX_U1_SEL_PEL 0xFF
-#define USB3_LPM_MAX_U2_SEL_PEL 0xFFFF
-
-/*-------------------------------------------------------------------------*/
-
-/*
- * As per USB compliance update, a device that is actively drawing
- * more than 100mA from USB must report itself as bus-powered in
- * the GetStatus(DEVICE) call.
- * http://compliance.usb.org/index.asp?UpdateFile=Electrical&Format=Standard#34
- */
-#define USB_SELF_POWER_VBUS_MAX_DRAW 100
-
-#endif /* __LINUX_USB_CH9_H */
diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h
deleted file mode 100644
index f833d10..0000000
--- a/include/linux/usb/composite.h
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * composite.h -- framework for usb gadgets which are composite devices
- *
- * Copyright (C) 2006-2008 David Brownell
- *
- * SPDX-License-Identifier: GPL-2.0+
- */
-
-#ifndef __LINUX_USB_COMPOSITE_H
-#define __LINUX_USB_COMPOSITE_H
-
-/*
- * This framework is an optional layer on top of the USB Gadget interface,
- * making it easier to build (a) Composite devices, supporting multiple
- * functions within any single configuration, and (b) Multi-configuration
- * devices, also supporting multiple functions but without necessarily
- * having more than one function per configuration.
- *
- * Example: a device with a single configuration supporting both network
- * link and mass storage functions is a composite device. Those functions
- * might alternatively be packaged in individual configurations, but in
- * the composite model the host can use both functions at the same time.
- */
-
-#include <common.h>
-#include <linux/usb/ch9.h>
-#include <linux/usb/gadget.h>
-#include <usb/lin_gadget_compat.h>
-
-struct usb_configuration;
-
-/**
- * struct usb_function - describes one function of a configuration
- * @name: For diagnostics, identifies the function.
- * @strings: tables of strings, keyed by identifiers assigned during bind()
- * and by language IDs provided in control requests
- * @descriptors: Table of full (or low) speed descriptors, using interface and
- * string identifiers assigned during @bind(). If this pointer is null,
- * the function will not be available at full speed (or at low speed).
- * @hs_descriptors: Table of high speed descriptors, using interface and
- * string identifiers assigned during @bind(). If this pointer is null,
- * the function will not be available at high speed.
- * @config: assigned when @usb_add_function() is called; this is the
- * configuration with which this function is associated.
- * @bind: Before the gadget can register, all of its functions bind() to the
- * available resources including string and interface identifiers used
- * in interface or class descriptors; endpoints; I/O buffers; and so on.
- * @unbind: Reverses @bind; called as a side effect of unregistering the
- * driver which added this function.
- * @set_alt: (REQUIRED) Reconfigures altsettings; function drivers may
- * initialize usb_ep.driver data at this time (when it is used).
- * Note that setting an interface to its current altsetting resets
- * interface state, and that all interfaces have a disabled state.
- * @get_alt: Returns the active altsetting. If this is not provided,
- * then only altsetting zero is supported.
- * @disable: (REQUIRED) Indicates the function should be disabled. Reasons
- * include host resetting or reconfiguring the gadget, and disconnection.
- * @setup: Used for interface-specific control requests.
- * @suspend: Notifies functions when the host stops sending USB traffic.
- * @resume: Notifies functions when the host restarts USB traffic.
- *
- * A single USB function uses one or more interfaces, and should in most
- * cases support operation at both full and high speeds. Each function is
- * associated by @usb_add_function() with a one configuration; that function
- * causes @bind() to be called so resources can be allocated as part of
- * setting up a gadget driver. Those resources include endpoints, which
- * should be allocated using @usb_ep_autoconfig().
- *
- * To support dual speed operation, a function driver provides descriptors
- * for both high and full speed operation. Except in rare cases that don't
- * involve bulk endpoints, each speed needs different endpoint descriptors.
- *
- * Function drivers choose their own strategies for managing instance data.
- * The simplest strategy just declares it "static', which means the function
- * can only be activated once. If the function needs to be exposed in more
- * than one configuration at a given speed, it needs to support multiple
- * usb_function structures (one for each configuration).
- *
- * A more complex strategy might encapsulate a @usb_function structure inside
- * a driver-specific instance structure to allows multiple activations. An
- * example of multiple activations might be a CDC ACM function that supports
- * two or more distinct instances within the same configuration, providing
- * several independent logical data links to a USB host.
- */
-struct usb_function {
- const char *name;
- struct usb_gadget_strings **strings;
- struct usb_descriptor_header **descriptors;
- struct usb_descriptor_header **hs_descriptors;
-
- struct usb_configuration *config;
-
- /* REVISIT: bind() functions can be marked __init, which
- * makes trouble for section mismatch analysis. See if
- * we can't restructure things to avoid mismatching.
- * Related: unbind() may kfree() but bind() won't...
- */
-
- /* configuration management: bind/unbind */
- int (*bind)(struct usb_configuration *,
- struct usb_function *);
- void (*unbind)(struct usb_configuration *,
- struct usb_function *);
-
- /* runtime state management */
- int (*set_alt)(struct usb_function *,
- unsigned interface, unsigned alt);
- int (*get_alt)(struct usb_function *,
- unsigned interface);
- void (*disable)(struct usb_function *);
- int (*setup)(struct usb_function *,
- const struct usb_ctrlrequest *);
- void (*suspend)(struct usb_function *);
- void (*resume)(struct usb_function *);
-
- /* private: */
- /* internals */
- struct list_head list;
- DECLARE_BITMAP(endpoints, 32);
-};
-
-int usb_add_function(struct usb_configuration *, struct usb_function *);
-
-int usb_function_deactivate(struct usb_function *);
-int usb_function_activate(struct usb_function *);
-
-int usb_interface_id(struct usb_configuration *, struct usb_function *);
-
-/**
- * ep_choose - select descriptor endpoint at current device speed
- * @g: gadget, connected and running at some speed
- * @hs: descriptor to use for high speed operation
- * @fs: descriptor to use for full or low speed operation
- */
-static inline struct usb_endpoint_descriptor *
-ep_choose(struct usb_gadget *g, struct usb_endpoint_descriptor *hs,
- struct usb_endpoint_descriptor *fs)
-{
- if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH)
- return hs;
- return fs;
-}
-
-#define MAX_CONFIG_INTERFACES 16 /* arbitrary; max 255 */
-
-/**
- * struct usb_configuration - represents one gadget configuration
- * @label: For diagnostics, describes the configuration.
- * @strings: Tables of strings, keyed by identifiers assigned during @bind()
- * and by language IDs provided in control requests.
- * @descriptors: Table of descriptors preceding all function descriptors.
- * Examples include OTG and vendor-specific descriptors.
- * @bind: Called from @usb_add_config() to allocate resources unique to this
- * configuration and to call @usb_add_function() for each function used.
- * @unbind: Reverses @bind; called as a side effect of unregistering the
- * driver which added this configuration.
- * @setup: Used to delegate control requests that aren't handled by standard
- * device infrastructure or directed at a specific interface.
- * @bConfigurationValue: Copied into configuration descriptor.
- * @iConfiguration: Copied into configuration descriptor.
- * @bmAttributes: Copied into configuration descriptor.
- * @bMaxPower: Copied into configuration descriptor.
- * @cdev: assigned by @usb_add_config() before calling @bind(); this is
- * the device associated with this configuration.
- *
- * Configurations are building blocks for gadget drivers structured around
- * function drivers. Simple USB gadgets require only one function and one
- * configuration, and handle dual-speed hardware by always providing the same
- * functionality. Slightly more complex gadgets may have more than one
- * single-function configuration at a given speed; or have configurations
- * that only work at one speed.
- *
- * Composite devices are, by definition, ones with configurations which
- * include more than one function.
- *
- * The lifecycle of a usb_configuration includes allocation, initialization
- * of the fields described above, and calling @usb_add_config() to set up
- * internal data and bind it to a specific device. The configuration's
- * @bind() method is then used to initialize all the functions and then
- * call @usb_add_function() for them.
- *
- * Those functions would normally be independant of each other, but that's
- * not mandatory. CDC WMC devices are an example where functions often
- * depend on other functions, with some functions subsidiary to others.
- * Such interdependency may be managed in any way, so long as all of the
- * descriptors complete by the time the composite driver returns from
- * its bind() routine.
- */
-struct usb_configuration {
- const char *label;
- struct usb_gadget_strings **strings;
- const struct usb_descriptor_header **descriptors;
-
- /* REVISIT: bind() functions can be marked __init, which
- * makes trouble for section mismatch analysis. See if
- * we can't restructure things to avoid mismatching...
- */
-
- /* configuration management: bind/unbind */
- int (*bind)(struct usb_configuration *);
- void (*unbind)(struct usb_configuration *);
- int (*setup)(struct usb_configuration *,
- const struct usb_ctrlrequest *);
-
- /* fields in the config descriptor */
- u8 bConfigurationValue;
- u8 iConfiguration;
- u8 bmAttributes;
- u8 bMaxPower;
-
- struct usb_composite_dev *cdev;
-
- /* private: */
- /* internals */
- struct list_head list;
- struct list_head functions;
- u8 next_interface_id;
- unsigned highspeed:1;
- unsigned fullspeed:1;
- struct usb_function *interface[MAX_CONFIG_INTERFACES];
-};
-
-int usb_add_config(struct usb_composite_dev *,
- struct usb_configuration *);
-
-/**
- * struct usb_composite_driver - groups configurations into a gadget
- * @name: For diagnostics, identifies the driver.
- * @dev: Template descriptor for the device, including default device
- * identifiers.
- * @strings: tables of strings, keyed by identifiers assigned during bind()
- * and language IDs provided in control requests
- * @bind: (REQUIRED) Used to allocate resources that are shared across the
- * whole device, such as string IDs, and add its configurations using
- * @usb_add_config(). This may fail by returning a negative errno
- * value; it should return zero on successful initialization.
- * @unbind: Reverses @bind(); called as a side effect of unregistering
- * this driver.
- * @disconnect: optional driver disconnect method
- * @suspend: Notifies when the host stops sending USB traffic,
- * after function notifications
- * @resume: Notifies configuration when the host restarts USB traffic,
- * before function notifications
- *
- * Devices default to reporting self powered operation. Devices which rely
- * on bus powered operation should report this in their @bind() method.
- *
- * Before returning from @bind, various fields in the template descriptor
- * may be overridden. These include the idVendor/idProduct/bcdDevice values
- * normally to bind the appropriate host side driver, and the three strings
- * (iManufacturer, iProduct, iSerialNumber) normally used to provide user
- * meaningful device identifiers. (The strings will not be defined unless
- * they are defined in @dev and @strings.) The correct ep0 maxpacket size
- * is also reported, as defined by the underlying controller driver.
- */
-struct usb_composite_driver {
- const char *name;
- const struct usb_device_descriptor *dev;
- struct usb_gadget_strings **strings;
-
- /* REVISIT: bind() functions can be marked __init, which
- * makes trouble for section mismatch analysis. See if
- * we can't restructure things to avoid mismatching...
- */
-
- int (*bind)(struct usb_composite_dev *);
- int (*unbind)(struct usb_composite_dev *);
-
- void (*disconnect)(struct usb_composite_dev *);
-
- /* global suspend hooks */
- void (*suspend)(struct usb_composite_dev *);
- void (*resume)(struct usb_composite_dev *);
-};
-
-extern int usb_composite_register(struct usb_composite_driver *);
-extern void usb_composite_unregister(struct usb_composite_driver *);
-
-
-/**
- * struct usb_composite_device - represents one composite usb gadget
- * @gadget: read-only, abstracts the gadget's usb peripheral controller
- * @req: used for control responses; buffer is pre-allocated
- * @bufsiz: size of buffer pre-allocated in @req
- * @config: the currently active configuration
- *
- * One of these devices is allocated and initialized before the
- * associated device driver's bind() is called.
- *
- * OPEN ISSUE: it appears that some WUSB devices will need to be
- * built by combining a normal (wired) gadget with a wireless one.
- * This revision of the gadget framework should probably try to make
- * sure doing that won't hurt too much.
- *
- * One notion for how to handle Wireless USB devices involves:
- * (a) a second gadget here, discovery mechanism TBD, but likely
- * needing separate "register/unregister WUSB gadget" calls;
- * (b) updates to usb_gadget to include flags "is it wireless",
- * "is it wired", plus (presumably in a wrapper structure)
- * bandgroup and PHY info;
- * (c) presumably a wireless_ep wrapping a usb_ep, and reporting
- * wireless-specific parameters like maxburst and maxsequence;
- * (d) configurations that are specific to wireless links;
- * (e) function drivers that understand wireless configs and will
- * support wireless for (additional) function instances;
- * (f) a function to support association setup (like CBAF), not
- * necessarily requiring a wireless adapter;
- * (g) composite device setup that can create one or more wireless
- * configs, including appropriate association setup support;
- * (h) more, TBD.
- */
-struct usb_composite_dev {
- struct usb_gadget *gadget;
- struct usb_request *req;
- unsigned bufsiz;
-
- struct usb_configuration *config;
-
- /* private: */
- /* internals */
- unsigned int suspended:1;
- struct usb_device_descriptor __aligned(CONFIG_SYS_CACHELINE_SIZE) desc;
- struct list_head configs;
- struct usb_composite_driver *driver;
- u8 next_string_id;
-
- /* the gadget driver won't enable the data pullup
- * while the deactivation count is nonzero.
- */
- unsigned deactivations;
-};
-
-extern int usb_string_id(struct usb_composite_dev *c);
-extern int usb_string_ids_tab(struct usb_composite_dev *c,
- struct usb_string *str);
-extern int usb_string_ids_n(struct usb_composite_dev *c, unsigned n);
-
-#endif /* __LINUX_USB_COMPOSITE_H */
diff --git a/include/linux/usb/dwc3.h b/include/linux/usb/dwc3.h
deleted file mode 100644
index 97d179a..0000000
--- a/include/linux/usb/dwc3.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/* include/linux/usb/dwc3.h
- *
- * Copyright (c) 2012 Samsung Electronics Co. Ltd
- *
- * Designware SuperSpeed USB 3.0 DRD Controller global and OTG registers
- *
- * SPDX-License-Identifier: GPL-2.0+
- */
-
-#ifndef __DWC3_H_
-#define __DWC3_H_
-
-/* Global constants */
-#define DWC3_ENDPOINTS_NUM 32
-
-#define DWC3_EVENT_BUFFERS_SIZE PAGE_SIZE
-#define DWC3_EVENT_TYPE_MASK 0xfe
-
-#define DWC3_EVENT_TYPE_DEV 0
-#define DWC3_EVENT_TYPE_CARKIT 3
-#define DWC3_EVENT_TYPE_I2C 4
-
-#define DWC3_DEVICE_EVENT_DISCONNECT 0
-#define DWC3_DEVICE_EVENT_RESET 1
-#define DWC3_DEVICE_EVENT_CONNECT_DONE 2
-#define DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE 3
-#define DWC3_DEVICE_EVENT_WAKEUP 4
-#define DWC3_DEVICE_EVENT_EOPF 6
-#define DWC3_DEVICE_EVENT_SOF 7
-#define DWC3_DEVICE_EVENT_ERRATIC_ERROR 9
-#define DWC3_DEVICE_EVENT_CMD_CMPL 10
-#define DWC3_DEVICE_EVENT_OVERFLOW 11
-
-#define DWC3_GEVNTCOUNT_MASK 0xfffc
-#define DWC3_GSNPSID_MASK 0xffff0000
-#define DWC3_GSNPSID_SHIFT 16
-#define DWC3_GSNPSREV_MASK 0xffff
-
-#define DWC3_REVISION_MASK 0xffff
-
-#define DWC3_REG_OFFSET 0xC100
-
-struct g_event_buffer {
- u64 g_evntadr;
- u32 g_evntsiz;
- u32 g_evntcount;
-};
-
-struct d_physical_endpoint {
- u32 d_depcmdpar2;
- u32 d_depcmdpar1;
- u32 d_depcmdpar0;
- u32 d_depcmd;
-};
-
-struct dwc3 { /* offset: 0xC100 */
- u32 g_sbuscfg0;
- u32 g_sbuscfg1;
- u32 g_txthrcfg;
- u32 g_rxthrcfg;
- u32 g_ctl;
-
- u32 reserved1;
-
- u32 g_sts;
-
- u32 reserved2;
-
- u32 g_snpsid;
- u32 g_gpio;
- u32 g_uid;
- u32 g_uctl;
- u64 g_buserraddr;
- u64 g_prtbimap;
-
- u32 g_hwparams0;
- u32 g_hwparams1;
- u32 g_hwparams2;
- u32 g_hwparams3;
- u32 g_hwparams4;
- u32 g_hwparams5;
- u32 g_hwparams6;
- u32 g_hwparams7;
-
- u32 g_dbgfifospace;
- u32 g_dbgltssm;
- u32 g_dbglnmcc;
- u32 g_dbgbmu;
- u32 g_dbglspmux;
- u32 g_dbglsp;
- u32 g_dbgepinfo0;
- u32 g_dbgepinfo1;
-
- u64 g_prtbimap_hs;
- u64 g_prtbimap_fs;
-
- u32 reserved3[28];
-
- u32 g_usb2phycfg[16];
- u32 g_usb2i2cctl[16];
- u32 g_usb2phyacc[16];
- u32 g_usb3pipectl[16];
-
- u32 g_txfifosiz[32];
- u32 g_rxfifosiz[32];
-
- struct g_event_buffer g_evnt_buf[32];
-
- u32 g_hwparams8;
-
- u32 reserved4[63];
-
- u32 d_cfg;
- u32 d_ctl;
- u32 d_evten;
- u32 d_sts;
- u32 d_gcmdpar;
- u32 d_gcmd;
-
- u32 reserved5[2];
-
- u32 d_alepena;
-
- u32 reserved6[55];
-
- struct d_physical_endpoint d_phy_ep_cmd[32];
-
- u32 reserved7[128];
-
- u32 o_cfg;
- u32 o_ctl;
- u32 o_evt;
- u32 o_evten;
- u32 o_sts;
-
- u32 reserved8[3];
-
- u32 adp_cfg;
- u32 adp_ctl;
- u32 adp_evt;
- u32 adp_evten;
-
- u32 bc_cfg;
-
- u32 reserved9;
-
- u32 bc_evt;
- u32 bc_evten;
-};
-
-/* Global Configuration Register */
-#define DWC3_GCTL_PWRDNSCALE(n) ((n) << 19)
-#define DWC3_GCTL_U2RSTECN (1 << 16)
-#define DWC3_GCTL_RAMCLKSEL(x) \
- (((x) & DWC3_GCTL_CLK_MASK) << 6)
-#define DWC3_GCTL_CLK_BUS (0)
-#define DWC3_GCTL_CLK_PIPE (1)
-#define DWC3_GCTL_CLK_PIPEHALF (2)
-#define DWC3_GCTL_CLK_MASK (3)
-#define DWC3_GCTL_PRTCAP(n) (((n) & (3 << 12)) >> 12)
-#define DWC3_GCTL_PRTCAPDIR(n) ((n) << 12)
-#define DWC3_GCTL_PRTCAP_HOST 1
-#define DWC3_GCTL_PRTCAP_DEVICE 2
-#define DWC3_GCTL_PRTCAP_OTG 3
-#define DWC3_GCTL_CORESOFTRESET (1 << 11)
-#define DWC3_GCTL_SCALEDOWN(n) ((n) << 4)
-#define DWC3_GCTL_SCALEDOWN_MASK DWC3_GCTL_SCALEDOWN(3)
-#define DWC3_GCTL_DISSCRAMBLE (1 << 3)
-#define DWC3_GCTL_DSBLCLKGTNG (1 << 0)
-
-/* Global HWPARAMS1 Register */
-#define DWC3_GHWPARAMS1_EN_PWROPT(n) (((n) & (3 << 24)) >> 24)
-#define DWC3_GHWPARAMS1_EN_PWROPT_NO 0
-#define DWC3_GHWPARAMS1_EN_PWROPT_CLK 1
-
-/* Global USB2 PHY Configuration Register */
-#define DWC3_GUSB2PHYCFG_PHYSOFTRST (1 << 31)
-#define DWC3_GUSB2PHYCFG_SUSPHY (1 << 6)
-
-/* Global USB3 PIPE Control Register */
-#define DWC3_GUSB3PIPECTL_PHYSOFTRST (1 << 31)
-#define DWC3_GUSB3PIPECTL_SUSPHY (1 << 17)
-
-/* Global TX Fifo Size Register */
-#define DWC3_GTXFIFOSIZ_TXFDEF(n) ((n) & 0xffff)
-#define DWC3_GTXFIFOSIZ_TXFSTADDR(n) ((n) & 0xffff0000)
-
-#endif /* __DWC3_H_ */
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
deleted file mode 100644
index a8a5763..0000000
--- a/include/linux/usb/gadget.h
+++ /dev/null
@@ -1,864 +0,0 @@
-/*
- * <linux/usb/gadget.h>
- *
- * We call the USB code inside a Linux-based peripheral device a "gadget"
- * driver, except for the hardware-specific bus glue. One USB host can
- * master many USB gadgets, but the gadgets are only slaved to one host.
- *
- *
- * (C) Copyright 2002-2004 by David Brownell
- * All Rights Reserved.
- *
- * This software is licensed under the GNU GPL version 2.
- *
- * Ported to U-boot by: Thomas Smits <ts.smits@gmail.com> and
- * Remy Bohmer <linux@bohmer.net>
- */
-
-#ifndef __LINUX_USB_GADGET_H
-#define __LINUX_USB_GADGET_H
-
-#include <errno.h>
-#include <linux/list.h>
-
-struct usb_ep;
-
-/**
- * struct usb_request - describes one i/o request
- * @buf: Buffer used for data. Always provide this; some controllers
- * only use PIO, or don't use DMA for some endpoints.
- * @dma: DMA address corresponding to 'buf'. If you don't set this
- * field, and the usb controller needs one, it is responsible
- * for mapping and unmapping the buffer.
- * @length: Length of that data
- * @no_interrupt: If true, hints that no completion irq is needed.
- * Helpful sometimes with deep request queues that are handled
- * directly by DMA controllers.
- * @zero: If true, when writing data, makes the last packet be "short"
- * by adding a zero length packet as needed;
- * @short_not_ok: When reading data, makes short packets be
- * treated as errors (queue stops advancing till cleanup).
- * @complete: Function called when request completes, so this request and
- * its buffer may be re-used.
- * Reads terminate with a short packet, or when the buffer fills,
- * whichever comes first. When writes terminate, some data bytes
- * will usually still be in flight (often in a hardware fifo).
- * Errors (for reads or writes) stop the queue from advancing
- * until the completion function returns, so that any transfers
- * invalidated by the error may first be dequeued.
- * @context: For use by the completion callback
- * @list: For use by the gadget driver.
- * @status: Reports completion code, zero or a negative errno.
- * Normally, faults block the transfer queue from advancing until
- * the completion callback returns.
- * Code "-ESHUTDOWN" indicates completion caused by device disconnect,
- * or when the driver disabled the endpoint.
- * @actual: Reports bytes transferred to/from the buffer. For reads (OUT
- * transfers) this may be less than the requested length. If the
- * short_not_ok flag is set, short reads are treated as errors
- * even when status otherwise indicates successful completion.
- * Note that for writes (IN transfers) some data bytes may still
- * reside in a device-side FIFO when the request is reported as
- * complete.
- *
- * These are allocated/freed through the endpoint they're used with. The
- * hardware's driver can add extra per-request data to the memory it returns,
- * which often avoids separate memory allocations (potential failures),
- * later when the request is queued.
- *
- * Request flags affect request handling, such as whether a zero length
- * packet is written (the "zero" flag), whether a short read should be
- * treated as an error (blocking request queue advance, the "short_not_ok"
- * flag), or hinting that an interrupt is not required (the "no_interrupt"
- * flag, for use with deep request queues).
- *
- * Bulk endpoints can use any size buffers, and can also be used for interrupt
- * transfers. interrupt-only endpoints can be much less functional.
- *
- * NOTE: this is analagous to 'struct urb' on the host side, except that
- * it's thinner and promotes more pre-allocation.
- */
-
-struct usb_request {
- void *buf;
- unsigned length;
- dma_addr_t dma;
-
- unsigned no_interrupt:1;
- unsigned zero:1;
- unsigned short_not_ok:1;
-
- void (*complete)(struct usb_ep *ep,
- struct usb_request *req);
- void *context;
- struct list_head list;
-
- int status;
- unsigned actual;
-};
-
-/*-------------------------------------------------------------------------*/
-
-/* endpoint-specific parts of the api to the usb controller hardware.
- * unlike the urb model, (de)multiplexing layers are not required.
- * (so this api could slash overhead if used on the host side...)
- *
- * note that device side usb controllers commonly differ in how many
- * endpoints they support, as well as their capabilities.
- */
-struct usb_ep_ops {
- int (*enable) (struct usb_ep *ep,
- const struct usb_endpoint_descriptor *desc);
- int (*disable) (struct usb_ep *ep);
-
- struct usb_request *(*alloc_request) (struct usb_ep *ep,
- gfp_t gfp_flags);
- void (*free_request) (struct usb_ep *ep, struct usb_request *req);
-
- int (*queue) (struct usb_ep *ep, struct usb_request *req,
- gfp_t gfp_flags);
- int (*dequeue) (struct usb_ep *ep, struct usb_request *req);
-
- int (*set_halt) (struct usb_ep *ep, int value);
- int (*fifo_status) (struct usb_ep *ep);
- void (*fifo_flush) (struct usb_ep *ep);
-};
-
-/**
- * struct usb_ep - device side representation of USB endpoint
- * @name:identifier for the endpoint, such as "ep-a" or "ep9in-bulk"
- * @ops: Function pointers used to access hardware-specific operations.
- * @ep_list:the gadget's ep_list holds all of its endpoints
- * @maxpacket:The maximum packet size used on this endpoint. The initial
- * value can sometimes be reduced (hardware allowing), according to
- * the endpoint descriptor used to configure the endpoint.
- * @driver_data:for use by the gadget driver. all other fields are
- * read-only to gadget drivers.
- *
- * the bus controller driver lists all the general purpose endpoints in
- * gadget->ep_list. the control endpoint (gadget->ep0) is not in that list,
- * and is accessed only in response to a driver setup() callback.
- */
-struct usb_ep {
- void *driver_data;
- const char *name;
- const struct usb_ep_ops *ops;
- struct list_head ep_list;
- unsigned maxpacket:16;
-};
-
-/*-------------------------------------------------------------------------*/
-
-/**
- * usb_ep_enable - configure endpoint, making it usable
- * @ep:the endpoint being configured. may not be the endpoint named "ep0".
- * drivers discover endpoints through the ep_list of a usb_gadget.
- * @desc:descriptor for desired behavior. caller guarantees this pointer
- * remains valid until the endpoint is disabled; the data byte order
- * is little-endian (usb-standard).
- *
- * when configurations are set, or when interface settings change, the driver
- * will enable or disable the relevant endpoints. while it is enabled, an
- * endpoint may be used for i/o until the driver receives a disconnect() from
- * the host or until the endpoint is disabled.
- *
- * the ep0 implementation (which calls this routine) must ensure that the
- * hardware capabilities of each endpoint match the descriptor provided
- * for it. for example, an endpoint named "ep2in-bulk" would be usable
- * for interrupt transfers as well as bulk, but it likely couldn't be used
- * for iso transfers or for endpoint 14. some endpoints are fully
- * configurable, with more generic names like "ep-a". (remember that for
- * USB, "in" means "towards the USB master".)
- *
- * returns zero, or a negative error code.
- */
-static inline int usb_ep_enable(struct usb_ep *ep,
- const struct usb_endpoint_descriptor *desc)
-{
- return ep->ops->enable(ep, desc);
-}
-
-/**
- * usb_ep_disable - endpoint is no longer usable
- * @ep:the endpoint being unconfigured. may not be the endpoint named "ep0".
- *
- * no other task may be using this endpoint when this is called.
- * any pending and uncompleted requests will complete with status
- * indicating disconnect (-ESHUTDOWN) before this call returns.
- * gadget drivers must call usb_ep_enable() again before queueing
- * requests to the endpoint.
- *
- * returns zero, or a negative error code.
- */
-static inline int usb_ep_disable(struct usb_ep *ep)
-{
- return ep->ops->disable(ep);
-}
-
-/**
- * usb_ep_alloc_request - allocate a request object to use with this endpoint
- * @ep:the endpoint to be used with with the request
- * @gfp_flags:GFP_* flags to use
- *
- * Request objects must be allocated with this call, since they normally
- * need controller-specific setup and may even need endpoint-specific
- * resources such as allocation of DMA descriptors.
- * Requests may be submitted with usb_ep_queue(), and receive a single
- * completion callback. Free requests with usb_ep_free_request(), when
- * they are no longer needed.
- *
- * Returns the request, or null if one could not be allocated.
- */
-static inline struct usb_request *usb_ep_alloc_request(struct usb_ep *ep,
- gfp_t gfp_flags)
-{
- return ep->ops->alloc_request(ep, gfp_flags);
-}
-
-/**
- * usb_ep_free_request - frees a request object
- * @ep:the endpoint associated with the request
- * @req:the request being freed
- *
- * Reverses the effect of usb_ep_alloc_request().
- * Caller guarantees the request is not queued, and that it will
- * no longer be requeued (or otherwise used).
- */
-static inline void usb_ep_free_request(struct usb_ep *ep,
- struct usb_request *req)
-{
- ep->ops->free_request(ep, req);
-}
-
-/**
- * usb_ep_queue - queues (submits) an I/O request to an endpoint.
- * @ep:the endpoint associated with the request
- * @req:the request being submitted
- * @gfp_flags: GFP_* flags to use in case the lower level driver couldn't
- * pre-allocate all necessary memory with the request.
- *
- * This tells the device controller to perform the specified request through
- * that endpoint (reading or writing a buffer). When the request completes,
- * including being canceled by usb_ep_dequeue(), the request's completion
- * routine is called to return the request to the driver. Any endpoint
- * (except control endpoints like ep0) may have more than one transfer
- * request queued; they complete in FIFO order. Once a gadget driver
- * submits a request, that request may not be examined or modified until it
- * is given back to that driver through the completion callback.
- *
- * Each request is turned into one or more packets. The controller driver
- * never merges adjacent requests into the same packet. OUT transfers
- * will sometimes use data that's already buffered in the hardware.
- * Drivers can rely on the fact that the first byte of the request's buffer
- * always corresponds to the first byte of some USB packet, for both
- * IN and OUT transfers.
- *
- * Bulk endpoints can queue any amount of data; the transfer is packetized
- * automatically. The last packet will be short if the request doesn't fill it
- * out completely. Zero length packets (ZLPs) should be avoided in portable
- * protocols since not all usb hardware can successfully handle zero length
- * packets. (ZLPs may be explicitly written, and may be implicitly written if
- * the request 'zero' flag is set.) Bulk endpoints may also be used
- * for interrupt transfers; but the reverse is not true, and some endpoints
- * won't support every interrupt transfer. (Such as 768 byte packets.)
- *
- * Interrupt-only endpoints are less functional than bulk endpoints, for
- * example by not supporting queueing or not handling buffers that are
- * larger than the endpoint's maxpacket size. They may also treat data
- * toggle differently.
- *
- * Control endpoints ... after getting a setup() callback, the driver queues
- * one response (even if it would be zero length). That enables the
- * status ack, after transfering data as specified in the response. Setup
- * functions may return negative error codes to generate protocol stalls.
- * (Note that some USB device controllers disallow protocol stall responses
- * in some cases.) When control responses are deferred (the response is
- * written after the setup callback returns), then usb_ep_set_halt() may be
- * used on ep0 to trigger protocol stalls.
- *
- * For periodic endpoints, like interrupt or isochronous ones, the usb host
- * arranges to poll once per interval, and the gadget driver usually will
- * have queued some data to transfer at that time.
- *
- * Returns zero, or a negative error code. Endpoints that are not enabled
- * report errors; errors will also be
- * reported when the usb peripheral is disconnected.
- */
-static inline int usb_ep_queue(struct usb_ep *ep,
- struct usb_request *req, gfp_t gfp_flags)
-{
- return ep->ops->queue(ep, req, gfp_flags);
-}
-
-/**
- * usb_ep_dequeue - dequeues (cancels, unlinks) an I/O request from an endpoint
- * @ep:the endpoint associated with the request
- * @req:the request being canceled
- *
- * if the request is still active on the endpoint, it is dequeued and its
- * completion routine is called (with status -ECONNRESET); else a negative
- * error code is returned.
- *
- * note that some hardware can't clear out write fifos (to unlink the request
- * at the head of the queue) except as part of disconnecting from usb. such
- * restrictions prevent drivers from supporting configuration changes,
- * even to configuration zero (a "chapter 9" requirement).
- */
-static inline int usb_ep_dequeue(struct usb_ep *ep, struct usb_request *req)
-{
- return ep->ops->dequeue(ep, req);
-}
-
-/**
- * usb_ep_set_halt - sets the endpoint halt feature.
- * @ep: the non-isochronous endpoint being stalled
- *
- * Use this to stall an endpoint, perhaps as an error report.
- * Except for control endpoints,
- * the endpoint stays halted (will not stream any data) until the host
- * clears this feature; drivers may need to empty the endpoint's request
- * queue first, to make sure no inappropriate transfers happen.
- *
- * Note that while an endpoint CLEAR_FEATURE will be invisible to the
- * gadget driver, a SET_INTERFACE will not be. To reset endpoints for the
- * current altsetting, see usb_ep_clear_halt(). When switching altsettings,
- * it's simplest to use usb_ep_enable() or usb_ep_disable() for the endpoints.
- *
- * Returns zero, or a negative error code. On success, this call sets
- * underlying hardware state that blocks data transfers.
- * Attempts to halt IN endpoints will fail (returning -EAGAIN) if any
- * transfer requests are still queued, or if the controller hardware
- * (usually a FIFO) still holds bytes that the host hasn't collected.
- */
-static inline int usb_ep_set_halt(struct usb_ep *ep)
-{
- return ep->ops->set_halt(ep, 1);
-}
-
-/**
- * usb_ep_clear_halt - clears endpoint halt, and resets toggle
- * @ep:the bulk or interrupt endpoint being reset
- *
- * Use this when responding to the standard usb "set interface" request,
- * for endpoints that aren't reconfigured, after clearing any other state
- * in the endpoint's i/o queue.
- *
- * Returns zero, or a negative error code. On success, this call clears
- * the underlying hardware state reflecting endpoint halt and data toggle.
- * Note that some hardware can't support this request (like pxa2xx_udc),
- * and accordingly can't correctly implement interface altsettings.
- */
-static inline int usb_ep_clear_halt(struct usb_ep *ep)
-{
- return ep->ops->set_halt(ep, 0);
-}
-
-/**
- * usb_ep_fifo_status - returns number of bytes in fifo, or error
- * @ep: the endpoint whose fifo status is being checked.
- *
- * FIFO endpoints may have "unclaimed data" in them in certain cases,
- * such as after aborted transfers. Hosts may not have collected all
- * the IN data written by the gadget driver (and reported by a request
- * completion). The gadget driver may not have collected all the data
- * written OUT to it by the host. Drivers that need precise handling for
- * fault reporting or recovery may need to use this call.
- *
- * This returns the number of such bytes in the fifo, or a negative
- * errno if the endpoint doesn't use a FIFO or doesn't support such
- * precise handling.
- */
-static inline int usb_ep_fifo_status(struct usb_ep *ep)
-{
- if (ep->ops->fifo_status)
- return ep->ops->fifo_status(ep);
- else
- return -EOPNOTSUPP;
-}
-
-/**
- * usb_ep_fifo_flush - flushes contents of a fifo
- * @ep: the endpoint whose fifo is being flushed.
- *
- * This call may be used to flush the "unclaimed data" that may exist in
- * an endpoint fifo after abnormal transaction terminations. The call
- * must never be used except when endpoint is not being used for any
- * protocol translation.
- */
-static inline void usb_ep_fifo_flush(struct usb_ep *ep)
-{
- if (ep->ops->fifo_flush)
- ep->ops->fifo_flush(ep);
-}
-
-
-/*-------------------------------------------------------------------------*/
-
-struct usb_gadget;
-
-/* the rest of the api to the controller hardware: device operations,
- * which don't involve endpoints (or i/o).
- */
-struct usb_gadget_ops {
- int (*get_frame)(struct usb_gadget *);
- int (*wakeup)(struct usb_gadget *);
- int (*set_selfpowered) (struct usb_gadget *, int is_selfpowered);
- int (*vbus_session) (struct usb_gadget *, int is_active);
- int (*vbus_draw) (struct usb_gadget *, unsigned mA);
- int (*pullup) (struct usb_gadget *, int is_on);
- int (*ioctl)(struct usb_gadget *,
- unsigned code, unsigned long param);
-};
-
-struct device {
- void *driver_data; /* data private to the driver */
- void *device_data; /* data private to the device */
-};
-
-/**
- * struct usb_gadget - represents a usb slave device
- * @ops: Function pointers used to access hardware-specific operations.
- * @ep0: Endpoint zero, used when reading or writing responses to
- * driver setup() requests
- * @ep_list: List of other endpoints supported by the device.
- * @speed: Speed of current connection to USB host.
- * @is_dualspeed: true if the controller supports both high and full speed
- * operation. If it does, the gadget driver must also support both.
- * @is_otg: true if the USB device port uses a Mini-AB jack, so that the
- * gadget driver must provide a USB OTG descriptor.
- * @is_a_peripheral: false unless is_otg, the "A" end of a USB cable
- * is in the Mini-AB jack, and HNP has been used to switch roles
- * so that the "A" device currently acts as A-Peripheral, not A-Host.
- * @a_hnp_support: OTG device feature flag, indicating that the A-Host
- * supports HNP at this port.
- * @a_alt_hnp_support: OTG device feature flag, indicating that the A-Host
- * only supports HNP on a different root port.
- * @b_hnp_enable: OTG device feature flag, indicating that the A-Host
- * enabled HNP support.
- * @name: Identifies the controller hardware type. Used in diagnostics
- * and sometimes configuration.
- * @dev: Driver model state for this abstract device.
- *
- * Gadgets have a mostly-portable "gadget driver" implementing device
- * functions, handling all usb configurations and interfaces. Gadget
- * drivers talk to hardware-specific code indirectly, through ops vectors.
- * That insulates the gadget driver from hardware details, and packages
- * the hardware endpoints through generic i/o queues. The "usb_gadget"
- * and "usb_ep" interfaces provide that insulation from the hardware.
- *
- * Except for the driver data, all fields in this structure are
- * read-only to the gadget driver. That driver data is part of the
- * "driver model" infrastructure in 2.6 (and later) kernels, and for
- * earlier systems is grouped in a similar structure that's not known
- * to the rest of the kernel.
- *
- * Values of the three OTG device feature flags are updated before the
- * setup() call corresponding to USB_REQ_SET_CONFIGURATION, and before
- * driver suspend() calls. They are valid only when is_otg, and when the
- * device is acting as a B-Peripheral (so is_a_peripheral is false).
- */
-struct usb_gadget {
- /* readonly to gadget driver */
- const struct usb_gadget_ops *ops;
- struct usb_ep *ep0;
- struct list_head ep_list; /* of usb_ep */
- enum usb_device_speed speed;
- unsigned is_dualspeed:1;
- unsigned is_otg:1;
- unsigned is_a_peripheral:1;
- unsigned b_hnp_enable:1;
- unsigned a_hnp_support:1;
- unsigned a_alt_hnp_support:1;
- const char *name;
- struct device dev;
-};
-
-static inline void set_gadget_data(struct usb_gadget *gadget, void *data)
-{
- gadget->dev.driver_data = data;
-}
-
-static inline void *get_gadget_data(struct usb_gadget *gadget)
-{
- return gadget->dev.driver_data;
-}
-
-static inline struct usb_gadget *dev_to_usb_gadget(struct device *dev)
-{
- return container_of(dev, struct usb_gadget, dev);
-}
-
-/* iterates the non-control endpoints; 'tmp' is a struct usb_ep pointer */
-#define gadget_for_each_ep(tmp, gadget) \
- list_for_each_entry(tmp, &(gadget)->ep_list, ep_list)
-
-
-/**
- * gadget_is_dualspeed - return true iff the hardware handles high speed
- * @g: controller that might support both high and full speeds
- */
-static inline int gadget_is_dualspeed(struct usb_gadget *g)
-{
-#ifdef CONFIG_USB_GADGET_DUALSPEED
- /* runtime test would check "g->is_dualspeed" ... that might be
- * useful to work around hardware bugs, but is mostly pointless
- */
- return 1;
-#else
- return 0;
-#endif
-}
-
-/**
- * gadget_is_otg - return true iff the hardware is OTG-ready
- * @g: controller that might have a Mini-AB connector
- *
- * This is a runtime test, since kernels with a USB-OTG stack sometimes
- * run on boards which only have a Mini-B (or Mini-A) connector.
- */
-static inline int gadget_is_otg(struct usb_gadget *g)
-{
-#ifdef CONFIG_USB_OTG
- return g->is_otg;
-#else
- return 0;
-#endif
-}
-
-/**
- * usb_gadget_frame_number - returns the current frame number
- * @gadget: controller that reports the frame number
- *
- * Returns the usb frame number, normally eleven bits from a SOF packet,
- * or negative errno if this device doesn't support this capability.
- */
-static inline int usb_gadget_frame_number(struct usb_gadget *gadget)
-{
- return gadget->ops->get_frame(gadget);
-}
-
-/**
- * usb_gadget_wakeup - tries to wake up the host connected to this gadget
- * @gadget: controller used to wake up the host
- *
- * Returns zero on success, else negative error code if the hardware
- * doesn't support such attempts, or its support has not been enabled
- * by the usb host. Drivers must return device descriptors that report
- * their ability to support this, or hosts won't enable it.
- *
- * This may also try to use SRP to wake the host and start enumeration,
- * even if OTG isn't otherwise in use. OTG devices may also start
- * remote wakeup even when hosts don't explicitly enable it.
- */
-static inline int usb_gadget_wakeup(struct usb_gadget *gadget)
-{
- if (!gadget->ops->wakeup)
- return -EOPNOTSUPP;
- return gadget->ops->wakeup(gadget);
-}
-
-/**
- * usb_gadget_set_selfpowered - sets the device selfpowered feature.
- * @gadget:the device being declared as self-powered
- *
- * this affects the device status reported by the hardware driver
- * to reflect that it now has a local power supply.
- *
- * returns zero on success, else negative errno.
- */
-static inline int usb_gadget_set_selfpowered(struct usb_gadget *gadget)
-{
- if (!gadget->ops->set_selfpowered)
- return -EOPNOTSUPP;
- return gadget->ops->set_selfpowered(gadget, 1);
-}
-
-/**
- * usb_gadget_clear_selfpowered - clear the device selfpowered feature.
- * @gadget:the device being declared as bus-powered
- *
- * this affects the device status reported by the hardware driver.
- * some hardware may not support bus-powered operation, in which
- * case this feature's value can never change.
- *
- * returns zero on success, else negative errno.
- */
-static inline int usb_gadget_clear_selfpowered(struct usb_gadget *gadget)
-{
- if (!gadget->ops->set_selfpowered)
- return -EOPNOTSUPP;
- return gadget->ops->set_selfpowered(gadget, 0);
-}
-
-/**
- * usb_gadget_vbus_connect - Notify controller that VBUS is powered
- * @gadget:The device which now has VBUS power.
- *
- * This call is used by a driver for an external transceiver (or GPIO)
- * that detects a VBUS power session starting. Common responses include
- * resuming the controller, activating the D+ (or D-) pullup to let the
- * host detect that a USB device is attached, and starting to draw power
- * (8mA or possibly more, especially after SET_CONFIGURATION).
- *
- * Returns zero on success, else negative errno.
- */
-static inline int usb_gadget_vbus_connect(struct usb_gadget *gadget)
-{
- if (!gadget->ops->vbus_session)
- return -EOPNOTSUPP;
- return gadget->ops->vbus_session(gadget, 1);
-}
-
-/**
- * usb_gadget_vbus_draw - constrain controller's VBUS power usage
- * @gadget:The device whose VBUS usage is being described
- * @mA:How much current to draw, in milliAmperes. This should be twice
- * the value listed in the configuration descriptor bMaxPower field.
- *
- * This call is used by gadget drivers during SET_CONFIGURATION calls,
- * reporting how much power the device may consume. For example, this
- * could affect how quickly batteries are recharged.
- *
- * Returns zero on success, else negative errno.
- */
-static inline int usb_gadget_vbus_draw(struct usb_gadget *gadget, unsigned mA)
-{
- if (!gadget->ops->vbus_draw)
- return -EOPNOTSUPP;
- return gadget->ops->vbus_draw(gadget, mA);
-}
-
-/**
- * usb_gadget_vbus_disconnect - notify controller about VBUS session end
- * @gadget:the device whose VBUS supply is being described
- *
- * This call is used by a driver for an external transceiver (or GPIO)
- * that detects a VBUS power session ending. Common responses include
- * reversing everything done in usb_gadget_vbus_connect().
- *
- * Returns zero on success, else negative errno.
- */
-static inline int usb_gadget_vbus_disconnect(struct usb_gadget *gadget)
-{
- if (!gadget->ops->vbus_session)
- return -EOPNOTSUPP;
- return gadget->ops->vbus_session(gadget, 0);
-}
-
-/**
- * usb_gadget_connect - software-controlled connect to USB host
- * @gadget:the peripheral being connected
- *
- * Enables the D+ (or potentially D-) pullup. The host will start
- * enumerating this gadget when the pullup is active and a VBUS session
- * is active (the link is powered). This pullup is always enabled unless
- * usb_gadget_disconnect() has been used to disable it.
- *
- * Returns zero on success, else negative errno.
- */
-static inline int usb_gadget_connect(struct usb_gadget *gadget)
-{
- if (!gadget->ops->pullup)
- return -EOPNOTSUPP;
- return gadget->ops->pullup(gadget, 1);
-}
-
-/**
- * usb_gadget_disconnect - software-controlled disconnect from USB host
- * @gadget:the peripheral being disconnected
- *
- * Disables the D+ (or potentially D-) pullup, which the host may see
- * as a disconnect (when a VBUS session is active). Not all systems
- * support software pullup controls.
- *
- * This routine may be used during the gadget driver bind() call to prevent
- * the peripheral from ever being visible to the USB host, unless later
- * usb_gadget_connect() is called. For example, user mode components may
- * need to be activated before the system can talk to hosts.
- *
- * Returns zero on success, else negative errno.
- */
-static inline int usb_gadget_disconnect(struct usb_gadget *gadget)
-{
- if (!gadget->ops->pullup)
- return -EOPNOTSUPP;
- return gadget->ops->pullup(gadget, 0);
-}
-
-
-/*-------------------------------------------------------------------------*/
-
-/**
- * struct usb_gadget_driver - driver for usb 'slave' devices
- * @speed: Highest speed the driver handles.
- * @bind: Invoked when the driver is bound to a gadget, usually
- * after registering the driver.
- * At that point, ep0 is fully initialized, and ep_list holds
- * the currently-available endpoints.
- * Called in a context that permits sleeping.
- * @setup: Invoked for ep0 control requests that aren't handled by
- * the hardware level driver. Most calls must be handled by
- * the gadget driver, including descriptor and configuration
- * management. The 16 bit members of the setup data are in
- * USB byte order. Called in_interrupt; this may not sleep. Driver
- * queues a response to ep0, or returns negative to stall.
- * @disconnect: Invoked after all transfers have been stopped,
- * when the host is disconnected. May be called in_interrupt; this
- * may not sleep. Some devices can't detect disconnect, so this might
- * not be called except as part of controller shutdown.
- * @unbind: Invoked when the driver is unbound from a gadget,
- * usually from rmmod (after a disconnect is reported).
- * Called in a context that permits sleeping.
- * @suspend: Invoked on USB suspend. May be called in_interrupt.
- * @resume: Invoked on USB resume. May be called in_interrupt.
- *
- * Devices are disabled till a gadget driver successfully bind()s, which
- * means the driver will handle setup() requests needed to enumerate (and
- * meet "chapter 9" requirements) then do some useful work.
- *
- * If gadget->is_otg is true, the gadget driver must provide an OTG
- * descriptor during enumeration, or else fail the bind() call. In such
- * cases, no USB traffic may flow until both bind() returns without
- * having called usb_gadget_disconnect(), and the USB host stack has
- * initialized.
- *
- * Drivers use hardware-specific knowledge to configure the usb hardware.
- * endpoint addressing is only one of several hardware characteristics that
- * are in descriptors the ep0 implementation returns from setup() calls.
- *
- * Except for ep0 implementation, most driver code shouldn't need change to
- * run on top of different usb controllers. It'll use endpoints set up by
- * that ep0 implementation.
- *
- * The usb controller driver handles a few standard usb requests. Those
- * include set_address, and feature flags for devices, interfaces, and
- * endpoints (the get_status, set_feature, and clear_feature requests).
- *
- * Accordingly, the driver's setup() callback must always implement all
- * get_descriptor requests, returning at least a device descriptor and
- * a configuration descriptor. Drivers must make sure the endpoint
- * descriptors match any hardware constraints. Some hardware also constrains
- * other descriptors. (The pxa250 allows only configurations 1, 2, or 3).
- *
- * The driver's setup() callback must also implement set_configuration,
- * and should also implement set_interface, get_configuration, and
- * get_interface. Setting a configuration (or interface) is where
- * endpoints should be activated or (config 0) shut down.
- *
- * (Note that only the default control endpoint is supported. Neither
- * hosts nor devices generally support control traffic except to ep0.)
- *
- * Most devices will ignore USB suspend/resume operations, and so will
- * not provide those callbacks. However, some may need to change modes
- * when the host is not longer directing those activities. For example,
- * local controls (buttons, dials, etc) may need to be re-enabled since
- * the (remote) host can't do that any longer; or an error state might
- * be cleared, to make the device behave identically whether or not
- * power is maintained.
- */
-struct usb_gadget_driver {
- enum usb_device_speed speed;
- int (*bind)(struct usb_gadget *);
- void (*unbind)(struct usb_gadget *);
- int (*setup)(struct usb_gadget *,
- const struct usb_ctrlrequest *);
- void (*disconnect)(struct usb_gadget *);
- void (*suspend)(struct usb_gadget *);
- void (*resume)(struct usb_gadget *);
-};
-
-
-/*-------------------------------------------------------------------------*/
-
-/* driver modules register and unregister, as usual.
- * these calls must be made in a context that can sleep.
- *
- * these will usually be implemented directly by the hardware-dependent
- * usb bus interface driver, which will only support a single driver.
- */
-
-/**
- * usb_gadget_register_driver - register a gadget driver
- * @driver:the driver being registered
- *
- * Call this in your gadget driver's module initialization function,
- * to tell the underlying usb controller driver about your driver.
- * The driver's bind() function will be called to bind it to a
- * gadget before this registration call returns. It's expected that
- * the bind() functions will be in init sections.
- * This function must be called in a context that can sleep.
- */
-int usb_gadget_register_driver(struct usb_gadget_driver *driver);
-
-/**
- * usb_gadget_unregister_driver - unregister a gadget driver
- * @driver:the driver being unregistered
- *
- * Call this in your gadget driver's module cleanup function,
- * to tell the underlying usb controller that your driver is
- * going away. If the controller is connected to a USB host,
- * it will first disconnect(). The driver is also requested
- * to unbind() and clean up any device state, before this procedure
- * finally returns. It's expected that the unbind() functions
- * will in in exit sections, so may not be linked in some kernels.
- * This function must be called in a context that can sleep.
- */
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver);
-
-/*-------------------------------------------------------------------------*/
-
-/* utility to simplify dealing with string descriptors */
-
-/**
- * struct usb_string - wraps a C string and its USB id
- * @id:the (nonzero) ID for this string
- * @s:the string, in UTF-8 encoding
- *
- * If you're using usb_gadget_get_string(), use this to wrap a string
- * together with its ID.
- */
-struct usb_string {
- u8 id;
- const char *s;
-};
-
-/**
- * struct usb_gadget_strings - a set of USB strings in a given language
- * @language:identifies the strings' language (0x0409 for en-us)
- * @strings:array of strings with their ids
- *
- * If you're using usb_gadget_get_string(), use this to wrap all the
- * strings for a given language.
- */
-struct usb_gadget_strings {
- u16 language; /* 0x0409 for en-us */
- struct usb_string *strings;
-};
-
-/* put descriptor for string with that id into buf (buflen >= 256) */
-int usb_gadget_get_string(struct usb_gadget_strings *table, int id, u8 *buf);
-
-/*-------------------------------------------------------------------------*/
-
-/* utility to simplify managing config descriptors */
-
-/* write vector of descriptors into buffer */
-int usb_descriptor_fillbuf(void *, unsigned,
- const struct usb_descriptor_header **);
-
-/* build config descriptor from single descriptor vector */
-int usb_gadget_config_buf(const struct usb_config_descriptor *config,
- void *buf, unsigned buflen, const struct usb_descriptor_header **desc);
-
-/*-------------------------------------------------------------------------*/
-
-/* utility wrapping a simple endpoint selection policy */
-
-extern struct usb_ep *usb_ep_autoconfig(struct usb_gadget *,
- struct usb_endpoint_descriptor *);
-
-extern void usb_ep_autoconfig_reset(struct usb_gadget *);
-
-extern int usb_gadget_handle_interrupts(void);
-
-#endif /* __LINUX_USB_GADGET_H */
diff --git a/include/linux/usb/xhci-omap.h b/include/linux/usb/xhci-omap.h
deleted file mode 100644
index 82630ad..0000000
--- a/include/linux/usb/xhci-omap.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * (C) Copyright 2013
- * Texas Instruments Inc, <www.ti.com>
- *
- * Author: Dan Murphy <dmurphy@ti.com>
- *
- * SPDX-License-Identifier: GPL-2.0+
- */
-
-#ifndef _ASM_ARCH_XHCI_OMAP_H_
-#define _ASM_ARCH_XHCI_OMAP_H_
-
-#ifdef CONFIG_DRA7XX
-#define OMAP_XHCI_BASE 0x488d0000
-#define OMAP_OCP1_SCP_BASE 0x4A081000
-#define OMAP_OTG_WRAPPER_BASE 0x488c0000
-#elif defined CONFIG_AM43XX
-#define OMAP_XHCI_BASE 0x483d0000
-#define OMAP_OCP1_SCP_BASE 0x483E8000
-#define OMAP_OTG_WRAPPER_BASE 0x483dc100
-#else
-/* Default to the OMAP5 XHCI defines */
-#define OMAP_XHCI_BASE 0x4a030000
-#define OMAP_OCP1_SCP_BASE 0x4a084c00
-#define OMAP_OTG_WRAPPER_BASE 0x4A020000
-#endif
-
-/* Phy register MACRO definitions */
-#define PLL_REGM_MASK 0x001FFE00
-#define PLL_REGM_SHIFT 0x9
-#define PLL_REGM_F_MASK 0x0003FFFF
-#define PLL_REGM_F_SHIFT 0x0
-#define PLL_REGN_MASK 0x000001FE
-#define PLL_REGN_SHIFT 0x1
-#define PLL_SELFREQDCO_MASK 0x0000000E
-#define PLL_SELFREQDCO_SHIFT 0x1
-#define PLL_SD_MASK 0x0003FC00
-#define PLL_SD_SHIFT 0x9
-#define SET_PLL_GO 0x1
-#define PLL_TICOPWDN 0x10000
-#define PLL_LOCK 0x2
-#define PLL_IDLE 0x1
-
-#define USB3_PWRCTL_CLK_CMD_MASK 0x3FE000
-#define USB3_PWRCTL_CLK_FREQ_MASK 0xFFC
-#define USB3_PHY_PARTIAL_RX_POWERON (1 << 6)
-#define USB3_PHY_RX_POWERON (1 << 14)
-#define USB3_PHY_TX_POWERON (1 << 15)
-#define USB3_PHY_TX_RX_POWERON (USB3_PHY_RX_POWERON | USB3_PHY_TX_POWERON)
-#define USB3_PWRCTL_CLK_CMD_SHIFT 14
-#define USB3_PWRCTL_CLK_FREQ_SHIFT 22
-
-/* USBOTGSS_WRAPPER definitions */
-#define USBOTGSS_WRAPRESET (1 << 17)
-#define USBOTGSS_DMADISABLE (1 << 16)
-#define USBOTGSS_STANDBYMODE_NO_STANDBY (1 << 4)
-#define USBOTGSS_STANDBYMODE_SMRT (1 << 5)
-#define USBOTGSS_STANDBYMODE_SMRT_WKUP (0x3 << 4)
-#define USBOTGSS_IDLEMODE_NOIDLE (1 << 2)
-#define USBOTGSS_IDLEMODE_SMRT (1 << 3)
-#define USBOTGSS_IDLEMODE_SMRT_WKUP (0x3 << 2)
-
-/* USBOTGSS_IRQENABLE_SET_0 bit */
-#define USBOTGSS_COREIRQ_EN (1 << 0)
-
-/* USBOTGSS_IRQENABLE_SET_1 bits */
-#define USBOTGSS_IRQ_SET_1_IDPULLUP_FALL_EN (1 << 0)
-#define USBOTGSS_IRQ_SET_1_DISCHRGVBUS_FALL_EN (1 << 3)
-#define USBOTGSS_IRQ_SET_1_CHRGVBUS_FALL_EN (1 << 4)
-#define USBOTGSS_IRQ_SET_1_DRVVBUS_FALL_EN (1 << 5)
-#define USBOTGSS_IRQ_SET_1_IDPULLUP_RISE_EN (1 << 8)
-#define USBOTGSS_IRQ_SET_1_DISCHRGVBUS_RISE_EN (1 << 11)
-#define USBOTGSS_IRQ_SET_1_CHRGVBUS_RISE_EN (1 << 12)
-#define USBOTGSS_IRQ_SET_1_DRVVBUS_RISE_EN (1 << 13)
-#define USBOTGSS_IRQ_SET_1_OEVT_EN (1 << 16)
-#define USBOTGSS_IRQ_SET_1_DMADISABLECLR_EN (1 << 17)
-
-/*
- * USBOTGSS_WRAPPER registers
- */
-struct omap_dwc_wrapper {
- u32 revision;
-
- u32 reserve_1[3];
-
- u32 sysconfig; /* offset of 0x10 */
-
- u32 reserve_2[3];
- u16 reserve_3;
-
- u32 irqstatus_raw_0; /* offset of 0x24 */
- u32 irqstatus_0;
- u32 irqenable_set_0;
- u32 irqenable_clr_0;
-
- u32 irqstatus_raw_1; /* offset of 0x34 */
- u32 irqstatus_1;
- u32 irqenable_set_1;
- u32 irqenable_clr_1;
-
- u32 reserve_4[15];
-
- u32 utmi_otg_ctrl; /* offset of 0x80 */
- u32 utmi_otg_status;
-
- u32 reserve_5[30];
-
- u32 mram_offset; /* offset of 0x100 */
- u32 fladj;
- u32 dbg_config;
- u32 dbg_data;
- u32 dev_ebc_en;
-};
-
-/* XHCI PHY register structure */
-struct omap_usb3_phy {
- u32 reserve1;
- u32 pll_status;
- u32 pll_go;
- u32 pll_config_1;
- u32 pll_config_2;
- u32 pll_config_3;
- u32 pll_ssc_config_1;
- u32 pll_ssc_config_2;
- u32 pll_config_4;
-};
-
-struct omap_xhci {
- struct omap_dwc_wrapper *otg_wrapper;
- struct omap_usb3_phy *usb3_phy;
- struct xhci_hccr *hcd;
- struct dwc3 *dwc3_reg;
-};
-
-/* USB PHY functions */
-void omap_enable_phy(struct omap_xhci *omap);
-void omap_reset_usb_phy(struct dwc3 *dwc3_reg);
-void usb_phy_power(int on);
-
-#endif /* _ASM_ARCH_XHCI_OMAP_H_ */
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 06/18] musb: move musb.h to path include/usb
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
` (3 preceding siblings ...)
2014-06-13 7:54 ` [PATCH 05/18] musb: delete unused include files Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 07/18] musb: drop gadget support - remove appropriate files Christoph Fritz
` (11 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
---
include/linux/usb/musb.h | 162 ----------------------------------------------
include/usb/musb.h | 162 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 162 insertions(+), 162 deletions(-)
delete mode 100644 include/linux/usb/musb.h
create mode 100644 include/usb/musb.h
diff --git a/include/linux/usb/musb.h b/include/linux/usb/musb.h
deleted file mode 100644
index 9f65ef9..0000000
--- a/include/linux/usb/musb.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * This is used to for host and peripheral modes of the driver for
- * Inventra (Multidrop) Highspeed Dual-Role Controllers: (M)HDRC.
- *
- * Board initialization should put one of these into dev->platform_data,
- * probably on some platform_device named "musb-hdrc". It encapsulates
- * key configuration differences between boards.
- */
-
-#ifndef __LINUX_USB_MUSB_H
-#define __LINUX_USB_MUSB_H
-
-#ifndef __deprecated
-#define __deprecated
-#endif
-
-/* The USB role is defined by the connector used on the board, so long as
- * standards are being followed. (Developer boards sometimes won't.)
- */
-enum musb_mode {
- MUSB_UNDEFINED = 0,
- MUSB_HOST, /* A or Mini-A connector */
- MUSB_PERIPHERAL, /* B or Mini-B connector */
- MUSB_OTG /* Mini-AB connector */
-};
-
-struct clk;
-
-enum musb_fifo_style {
- FIFO_RXTX,
- FIFO_TX,
- FIFO_RX
-} __attribute__ ((packed));
-
-enum musb_buf_mode {
- BUF_SINGLE,
- BUF_DOUBLE
-} __attribute__ ((packed));
-
-struct musb_fifo_cfg {
- u8 hw_ep_num;
- enum musb_fifo_style style;
- enum musb_buf_mode mode;
- u16 maxpacket;
-};
-
-#define MUSB_EP_FIFO(ep, st, m, pkt) \
-{ \
- .hw_ep_num = ep, \
- .style = st, \
- .mode = m, \
- .maxpacket = pkt, \
-}
-
-#define MUSB_EP_FIFO_SINGLE(ep, st, pkt) \
- MUSB_EP_FIFO(ep, st, BUF_SINGLE, pkt)
-
-#define MUSB_EP_FIFO_DOUBLE(ep, st, pkt) \
- MUSB_EP_FIFO(ep, st, BUF_DOUBLE, pkt)
-
-struct musb_hdrc_eps_bits {
- const char name[16];
- u8 bits;
-};
-
-struct musb_hdrc_config {
- struct musb_fifo_cfg *fifo_cfg; /* board fifo configuration */
- unsigned fifo_cfg_size; /* size of the fifo configuration */
-
- /* MUSB configuration-specific details */
- unsigned multipoint:1; /* multipoint device */
- unsigned dyn_fifo:1 __deprecated; /* supports dynamic fifo sizing */
- unsigned soft_con:1 __deprecated; /* soft connect required */
- unsigned utm_16:1 __deprecated; /* utm data witdh is 16 bits */
- unsigned big_endian:1; /* true if CPU uses big-endian */
- unsigned mult_bulk_tx:1; /* Tx ep required for multbulk pkts */
- unsigned mult_bulk_rx:1; /* Rx ep required for multbulk pkts */
- unsigned high_iso_tx:1; /* Tx ep required for HB iso */
- unsigned high_iso_rx:1; /* Rx ep required for HD iso */
- unsigned dma:1 __deprecated; /* supports DMA */
- unsigned vendor_req:1 __deprecated; /* vendor registers required */
-
- u8 num_eps; /* number of endpoints _with_ ep0 */
- u8 dma_channels __deprecated; /* number of dma channels */
- u8 dyn_fifo_size; /* dynamic size in bytes */
- u8 vendor_ctrl __deprecated; /* vendor control reg width */
- u8 vendor_stat __deprecated; /* vendor status reg witdh */
- u8 dma_req_chan __deprecated; /* bitmask for required dma channels */
- u8 ram_bits; /* ram address size */
-
- struct musb_hdrc_eps_bits *eps_bits __deprecated;
-#ifdef CONFIG_BLACKFIN
- /* A GPIO controlling VRSEL in Blackfin */
- unsigned int gpio_vrsel;
- unsigned int gpio_vrsel_active;
- /* musb CLKIN in Blackfin in MHZ */
- unsigned char clkin;
-#endif
-
-};
-
-struct musb_hdrc_platform_data {
- /* MUSB_HOST, MUSB_PERIPHERAL, or MUSB_OTG */
- u8 mode;
-
- /* for clk_get() */
- const char *clock;
-
- /* (HOST or OTG) switch VBUS on/off */
- int (*set_vbus)(struct device *dev, int is_on);
-
- /* (HOST or OTG) mA/2 power supplied on (default = 8mA) */
- u8 power;
-
- /* (PERIPHERAL) mA/2 max power consumed (default = 100mA) */
- u8 min_power;
-
- /* (HOST or OTG) msec/2 after VBUS on till power good */
- u8 potpgt;
-
- /* (HOST or OTG) program PHY for external Vbus */
- unsigned extvbus:1;
-
- /* Power the device on or off */
- int (*set_power)(int state);
-
- /* MUSB configuration-specific details */
- struct musb_hdrc_config *config;
-
- /* Architecture specific board data */
- void *board_data;
-
- /* Platform specific struct musb_ops pointer */
- const void *platform_ops;
-};
-
-
-/* TUSB 6010 support */
-
-#define TUSB6010_OSCCLK_60 16667 /* psec/clk @ 60.0 MHz */
-#define TUSB6010_REFCLK_24 41667 /* psec/clk @ 24.0 MHz XI */
-#define TUSB6010_REFCLK_19 52083 /* psec/clk @ 19.2 MHz CLKIN */
-
-#ifdef CONFIG_ARCH_OMAP2
-
-extern int __init tusb6010_setup_interface(
- struct musb_hdrc_platform_data *data,
- unsigned ps_refclk, unsigned waitpin,
- unsigned async_cs, unsigned sync_cs,
- unsigned irq, unsigned dmachan);
-
-extern int tusb6010_platform_retime(unsigned is_refclk);
-
-#endif /* OMAP2 */
-
-/*
- * U-Boot specfic stuff
- */
-int musb_register(struct musb_hdrc_platform_data *plat, void *bdata,
- void *ctl_regs);
-
-#endif /* __LINUX_USB_MUSB_H */
diff --git a/include/usb/musb.h b/include/usb/musb.h
new file mode 100644
index 0000000..9f65ef9
--- /dev/null
+++ b/include/usb/musb.h
@@ -0,0 +1,162 @@
+/*
+ * This is used to for host and peripheral modes of the driver for
+ * Inventra (Multidrop) Highspeed Dual-Role Controllers: (M)HDRC.
+ *
+ * Board initialization should put one of these into dev->platform_data,
+ * probably on some platform_device named "musb-hdrc". It encapsulates
+ * key configuration differences between boards.
+ */
+
+#ifndef __LINUX_USB_MUSB_H
+#define __LINUX_USB_MUSB_H
+
+#ifndef __deprecated
+#define __deprecated
+#endif
+
+/* The USB role is defined by the connector used on the board, so long as
+ * standards are being followed. (Developer boards sometimes won't.)
+ */
+enum musb_mode {
+ MUSB_UNDEFINED = 0,
+ MUSB_HOST, /* A or Mini-A connector */
+ MUSB_PERIPHERAL, /* B or Mini-B connector */
+ MUSB_OTG /* Mini-AB connector */
+};
+
+struct clk;
+
+enum musb_fifo_style {
+ FIFO_RXTX,
+ FIFO_TX,
+ FIFO_RX
+} __attribute__ ((packed));
+
+enum musb_buf_mode {
+ BUF_SINGLE,
+ BUF_DOUBLE
+} __attribute__ ((packed));
+
+struct musb_fifo_cfg {
+ u8 hw_ep_num;
+ enum musb_fifo_style style;
+ enum musb_buf_mode mode;
+ u16 maxpacket;
+};
+
+#define MUSB_EP_FIFO(ep, st, m, pkt) \
+{ \
+ .hw_ep_num = ep, \
+ .style = st, \
+ .mode = m, \
+ .maxpacket = pkt, \
+}
+
+#define MUSB_EP_FIFO_SINGLE(ep, st, pkt) \
+ MUSB_EP_FIFO(ep, st, BUF_SINGLE, pkt)
+
+#define MUSB_EP_FIFO_DOUBLE(ep, st, pkt) \
+ MUSB_EP_FIFO(ep, st, BUF_DOUBLE, pkt)
+
+struct musb_hdrc_eps_bits {
+ const char name[16];
+ u8 bits;
+};
+
+struct musb_hdrc_config {
+ struct musb_fifo_cfg *fifo_cfg; /* board fifo configuration */
+ unsigned fifo_cfg_size; /* size of the fifo configuration */
+
+ /* MUSB configuration-specific details */
+ unsigned multipoint:1; /* multipoint device */
+ unsigned dyn_fifo:1 __deprecated; /* supports dynamic fifo sizing */
+ unsigned soft_con:1 __deprecated; /* soft connect required */
+ unsigned utm_16:1 __deprecated; /* utm data witdh is 16 bits */
+ unsigned big_endian:1; /* true if CPU uses big-endian */
+ unsigned mult_bulk_tx:1; /* Tx ep required for multbulk pkts */
+ unsigned mult_bulk_rx:1; /* Rx ep required for multbulk pkts */
+ unsigned high_iso_tx:1; /* Tx ep required for HB iso */
+ unsigned high_iso_rx:1; /* Rx ep required for HD iso */
+ unsigned dma:1 __deprecated; /* supports DMA */
+ unsigned vendor_req:1 __deprecated; /* vendor registers required */
+
+ u8 num_eps; /* number of endpoints _with_ ep0 */
+ u8 dma_channels __deprecated; /* number of dma channels */
+ u8 dyn_fifo_size; /* dynamic size in bytes */
+ u8 vendor_ctrl __deprecated; /* vendor control reg width */
+ u8 vendor_stat __deprecated; /* vendor status reg witdh */
+ u8 dma_req_chan __deprecated; /* bitmask for required dma channels */
+ u8 ram_bits; /* ram address size */
+
+ struct musb_hdrc_eps_bits *eps_bits __deprecated;
+#ifdef CONFIG_BLACKFIN
+ /* A GPIO controlling VRSEL in Blackfin */
+ unsigned int gpio_vrsel;
+ unsigned int gpio_vrsel_active;
+ /* musb CLKIN in Blackfin in MHZ */
+ unsigned char clkin;
+#endif
+
+};
+
+struct musb_hdrc_platform_data {
+ /* MUSB_HOST, MUSB_PERIPHERAL, or MUSB_OTG */
+ u8 mode;
+
+ /* for clk_get() */
+ const char *clock;
+
+ /* (HOST or OTG) switch VBUS on/off */
+ int (*set_vbus)(struct device *dev, int is_on);
+
+ /* (HOST or OTG) mA/2 power supplied on (default = 8mA) */
+ u8 power;
+
+ /* (PERIPHERAL) mA/2 max power consumed (default = 100mA) */
+ u8 min_power;
+
+ /* (HOST or OTG) msec/2 after VBUS on till power good */
+ u8 potpgt;
+
+ /* (HOST or OTG) program PHY for external Vbus */
+ unsigned extvbus:1;
+
+ /* Power the device on or off */
+ int (*set_power)(int state);
+
+ /* MUSB configuration-specific details */
+ struct musb_hdrc_config *config;
+
+ /* Architecture specific board data */
+ void *board_data;
+
+ /* Platform specific struct musb_ops pointer */
+ const void *platform_ops;
+};
+
+
+/* TUSB 6010 support */
+
+#define TUSB6010_OSCCLK_60 16667 /* psec/clk @ 60.0 MHz */
+#define TUSB6010_REFCLK_24 41667 /* psec/clk @ 24.0 MHz XI */
+#define TUSB6010_REFCLK_19 52083 /* psec/clk @ 19.2 MHz CLKIN */
+
+#ifdef CONFIG_ARCH_OMAP2
+
+extern int __init tusb6010_setup_interface(
+ struct musb_hdrc_platform_data *data,
+ unsigned ps_refclk, unsigned waitpin,
+ unsigned async_cs, unsigned sync_cs,
+ unsigned irq, unsigned dmachan);
+
+extern int tusb6010_platform_retime(unsigned is_refclk);
+
+#endif /* OMAP2 */
+
+/*
+ * U-Boot specfic stuff
+ */
+int musb_register(struct musb_hdrc_platform_data *plat, void *bdata,
+ void *ctl_regs);
+
+#endif /* __LINUX_USB_MUSB_H */
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 07/18] musb: drop gadget support - remove appropriate files
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
` (4 preceding siblings ...)
2014-06-13 7:54 ` [PATCH 06/18] musb: move musb.h to path include/usb Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 08/18] musb: use __BAREBOX__ macro Christoph Fritz
` (10 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
---
drivers/usb/musb/Makefile | 6 +-
drivers/usb/musb/am35x.c | 709 -----------
drivers/usb/musb/musb_gadget.c | 2333 ------------------------------------
drivers/usb/musb/musb_gadget.h | 130 --
drivers/usb/musb/musb_gadget_ep0.c | 1089 -----------------
drivers/usb/musb/musb_uboot.c | 239 ----
drivers/usb/musb/omap2430.c | 626 ----------
drivers/usb/musb/omap2430.h | 56 -
8 files changed, 1 insertion(+), 5187 deletions(-)
delete mode 100644 drivers/usb/musb/am35x.c
delete mode 100644 drivers/usb/musb/musb_gadget.c
delete mode 100644 drivers/usb/musb/musb_gadget.h
delete mode 100644 drivers/usb/musb/musb_gadget_ep0.c
delete mode 100644 drivers/usb/musb/musb_uboot.c
delete mode 100644 drivers/usb/musb/omap2430.c
delete mode 100644 drivers/usb/musb/omap2430.h
diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile
index ba72348..64ebe06 100644
--- a/drivers/usb/musb/Makefile
+++ b/drivers/usb/musb/Makefile
@@ -2,12 +2,8 @@
# for USB OTG silicon based on Mentor Graphics INVENTRA designs
#
-obj-$(CONFIG_MUSB_GADGET) += musb_gadget.o musb_gadget_ep0.o musb_core.o
-obj-$(CONFIG_MUSB_GADGET) += musb_uboot.o
-obj-$(CONFIG_MUSB_HOST) += musb_host.o musb_core.o musb_uboot.o
+obj-$(CONFIG_USB_MUSB_HOST) += musb_host.o musb_core.o
obj-$(CONFIG_USB_MUSB_DSPS) += musb_dsps.o
-obj-$(CONFIG_USB_MUSB_AM35X) += am35x.o
-obj-$(CONFIG_USB_MUSB_OMAP2PLUS) += omap2430.o
CFLAGS_NO_WARN := $(call cc-option,-Wno-unused-variable) \
$(call cc-option,-Wno-unused-but-set-variable) \
diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c
deleted file mode 100644
index 57c9bd3..0000000
--- a/drivers/usb/musb/am35x.c
+++ /dev/null
@@ -1,709 +0,0 @@
-/*
- * Texas Instruments AM35x "glue layer"
- *
- * Copyright (c) 2010, by Texas Instruments
- *
- * Based on the DA8xx "glue layer" code.
- * Copyright (c) 2008-2009, MontaVista Software, Inc. <source@mvista.com>
- *
- * This file is part of the Inventra Controller Driver for Linux.
- *
- * The Inventra Controller Driver for Linux is free software; you
- * can redistribute it and/or modify it under the terms of the GNU
- * General Public License version 2 as published by the Free Software
- * Foundation.
- *
- * The Inventra Controller Driver for Linux is distributed in
- * the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- * License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with The Inventra Controller Driver for Linux ; if not,
- * write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#define __UBOOT__
-#ifndef __UBOOT__
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/clk.h>
-#include <linux/err.h>
-#include <linux/io.h>
-#include <linux/platform_device.h>
-#include <linux/dma-mapping.h>
-
-#include <plat/usb.h>
-#else
-#include <common.h>
-#include <asm/omap_musb.h>
-#include "linux-compat.h"
-#endif
-
-#include "musb_core.h"
-
-/*
- * AM35x specific definitions
- */
-/* USB 2.0 OTG module registers */
-#define USB_REVISION_REG 0x00
-#define USB_CTRL_REG 0x04
-#define USB_STAT_REG 0x08
-#define USB_EMULATION_REG 0x0c
-/* 0x10 Reserved */
-#define USB_AUTOREQ_REG 0x14
-#define USB_SRP_FIX_TIME_REG 0x18
-#define USB_TEARDOWN_REG 0x1c
-#define EP_INTR_SRC_REG 0x20
-#define EP_INTR_SRC_SET_REG 0x24
-#define EP_INTR_SRC_CLEAR_REG 0x28
-#define EP_INTR_MASK_REG 0x2c
-#define EP_INTR_MASK_SET_REG 0x30
-#define EP_INTR_MASK_CLEAR_REG 0x34
-#define EP_INTR_SRC_MASKED_REG 0x38
-#define CORE_INTR_SRC_REG 0x40
-#define CORE_INTR_SRC_SET_REG 0x44
-#define CORE_INTR_SRC_CLEAR_REG 0x48
-#define CORE_INTR_MASK_REG 0x4c
-#define CORE_INTR_MASK_SET_REG 0x50
-#define CORE_INTR_MASK_CLEAR_REG 0x54
-#define CORE_INTR_SRC_MASKED_REG 0x58
-/* 0x5c Reserved */
-#define USB_END_OF_INTR_REG 0x60
-
-/* Control register bits */
-#define AM35X_SOFT_RESET_MASK 1
-
-/* USB interrupt register bits */
-#define AM35X_INTR_USB_SHIFT 16
-#define AM35X_INTR_USB_MASK (0x1ff << AM35X_INTR_USB_SHIFT)
-#define AM35X_INTR_DRVVBUS 0x100
-#define AM35X_INTR_RX_SHIFT 16
-#define AM35X_INTR_TX_SHIFT 0
-#define AM35X_TX_EP_MASK 0xffff /* EP0 + 15 Tx EPs */
-#define AM35X_RX_EP_MASK 0xfffe /* 15 Rx EPs */
-#define AM35X_TX_INTR_MASK (AM35X_TX_EP_MASK << AM35X_INTR_TX_SHIFT)
-#define AM35X_RX_INTR_MASK (AM35X_RX_EP_MASK << AM35X_INTR_RX_SHIFT)
-
-#define USB_MENTOR_CORE_OFFSET 0x400
-
-struct am35x_glue {
- struct device *dev;
- struct platform_device *musb;
- struct clk *phy_clk;
- struct clk *clk;
-};
-#define glue_to_musb(g) platform_get_drvdata(g->musb)
-
-/*
- * am35x_musb_enable - enable interrupts
- */
-static void am35x_musb_enable(struct musb *musb)
-{
- void __iomem *reg_base = musb->ctrl_base;
- u32 epmask;
-
- /* Workaround: setup IRQs through both register sets. */
- epmask = ((musb->epmask & AM35X_TX_EP_MASK) << AM35X_INTR_TX_SHIFT) |
- ((musb->epmask & AM35X_RX_EP_MASK) << AM35X_INTR_RX_SHIFT);
-
- musb_writel(reg_base, EP_INTR_MASK_SET_REG, epmask);
- musb_writel(reg_base, CORE_INTR_MASK_SET_REG, AM35X_INTR_USB_MASK);
-
- /* Force the DRVVBUS IRQ so we can start polling for ID change. */
- if (is_otg_enabled(musb))
- musb_writel(reg_base, CORE_INTR_SRC_SET_REG,
- AM35X_INTR_DRVVBUS << AM35X_INTR_USB_SHIFT);
-}
-
-/*
- * am35x_musb_disable - disable HDRC and flush interrupts
- */
-static void am35x_musb_disable(struct musb *musb)
-{
- void __iomem *reg_base = musb->ctrl_base;
-
- musb_writel(reg_base, CORE_INTR_MASK_CLEAR_REG, AM35X_INTR_USB_MASK);
- musb_writel(reg_base, EP_INTR_MASK_CLEAR_REG,
- AM35X_TX_INTR_MASK | AM35X_RX_INTR_MASK);
- musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
- musb_writel(reg_base, USB_END_OF_INTR_REG, 0);
-}
-
-#ifndef __UBOOT__
-#define portstate(stmt) stmt
-
-static void am35x_musb_set_vbus(struct musb *musb, int is_on)
-{
- WARN_ON(is_on && is_peripheral_active(musb));
-}
-
-#define POLL_SECONDS 2
-
-static struct timer_list otg_workaround;
-
-static void otg_timer(unsigned long _musb)
-{
- struct musb *musb = (void *)_musb;
- void __iomem *mregs = musb->mregs;
- u8 devctl;
- unsigned long flags;
-
- /*
- * We poll because AM35x's won't expose several OTG-critical
- * status change events (from the transceiver) otherwise.
- */
- devctl = musb_readb(mregs, MUSB_DEVCTL);
- dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl,
- otg_state_string(musb->xceiv->state));
-
- spin_lock_irqsave(&musb->lock, flags);
- switch (musb->xceiv->state) {
- case OTG_STATE_A_WAIT_BCON:
- devctl &= ~MUSB_DEVCTL_SESSION;
- musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
-
- devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
- if (devctl & MUSB_DEVCTL_BDEVICE) {
- musb->xceiv->state = OTG_STATE_B_IDLE;
- MUSB_DEV_MODE(musb);
- } else {
- musb->xceiv->state = OTG_STATE_A_IDLE;
- MUSB_HST_MODE(musb);
- }
- break;
- case OTG_STATE_A_WAIT_VFALL:
- musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
- musb_writel(musb->ctrl_base, CORE_INTR_SRC_SET_REG,
- MUSB_INTR_VBUSERROR << AM35X_INTR_USB_SHIFT);
- break;
- case OTG_STATE_B_IDLE:
- if (!is_peripheral_enabled(musb))
- break;
-
- devctl = musb_readb(mregs, MUSB_DEVCTL);
- if (devctl & MUSB_DEVCTL_BDEVICE)
- mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
- else
- musb->xceiv->state = OTG_STATE_A_IDLE;
- break;
- default:
- break;
- }
- spin_unlock_irqrestore(&musb->lock, flags);
-}
-
-static void am35x_musb_try_idle(struct musb *musb, unsigned long timeout)
-{
- static unsigned long last_timer;
-
- if (!is_otg_enabled(musb))
- return;
-
- if (timeout == 0)
- timeout = jiffies + msecs_to_jiffies(3);
-
- /* Never idle if active, or when VBUS timeout is not set as host */
- if (musb->is_active || (musb->a_wait_bcon == 0 &&
- musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) {
- dev_dbg(musb->controller, "%s active, deleting timer\n",
- otg_state_string(musb->xceiv->state));
- del_timer(&otg_workaround);
- last_timer = jiffies;
- return;
- }
-
- if (time_after(last_timer, timeout) && timer_pending(&otg_workaround)) {
- dev_dbg(musb->controller, "Longer idle timer already pending, ignoring...\n");
- return;
- }
- last_timer = timeout;
-
- dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n",
- otg_state_string(musb->xceiv->state),
- jiffies_to_msecs(timeout - jiffies));
- mod_timer(&otg_workaround, timeout);
-}
-#endif
-
-static irqreturn_t am35x_musb_interrupt(int irq, void *hci)
-{
- struct musb *musb = hci;
- void __iomem *reg_base = musb->ctrl_base;
-#ifndef __UBOOT__
- struct device *dev = musb->controller;
- struct musb_hdrc_platform_data *plat = dev->platform_data;
- struct omap_musb_board_data *data = plat->board_data;
- struct usb_otg *otg = musb->xceiv->otg;
-#else
- struct omap_musb_board_data *data =
- (struct omap_musb_board_data *)musb->controller;
-#endif
- unsigned long flags;
- irqreturn_t ret = IRQ_NONE;
- u32 epintr, usbintr;
-
-#ifdef __UBOOT__
- /*
- * It seems that on AM35X interrupt registers can be updated
- * before core registers. This confuses the code.
- * As a workaround add a small delay here.
- */
- udelay(10);
-#endif
- spin_lock_irqsave(&musb->lock, flags);
-
- /* Get endpoint interrupts */
- epintr = musb_readl(reg_base, EP_INTR_SRC_MASKED_REG);
-
- if (epintr) {
- musb_writel(reg_base, EP_INTR_SRC_CLEAR_REG, epintr);
-
- musb->int_rx =
- (epintr & AM35X_RX_INTR_MASK) >> AM35X_INTR_RX_SHIFT;
- musb->int_tx =
- (epintr & AM35X_TX_INTR_MASK) >> AM35X_INTR_TX_SHIFT;
- }
-
- /* Get usb core interrupts */
- usbintr = musb_readl(reg_base, CORE_INTR_SRC_MASKED_REG);
- if (!usbintr && !epintr)
- goto eoi;
-
- if (usbintr) {
- musb_writel(reg_base, CORE_INTR_SRC_CLEAR_REG, usbintr);
-
- musb->int_usb =
- (usbintr & AM35X_INTR_USB_MASK) >> AM35X_INTR_USB_SHIFT;
- }
-#ifndef __UBOOT__
- /*
- * DRVVBUS IRQs are the only proxy we have (a very poor one!) for
- * AM35x's missing ID change IRQ. We need an ID change IRQ to
- * switch appropriately between halves of the OTG state machine.
- * Managing DEVCTL.SESSION per Mentor docs requires that we know its
- * value but DEVCTL.BDEVICE is invalid without DEVCTL.SESSION set.
- * Also, DRVVBUS pulses for SRP (but not at 5V) ...
- */
- if (usbintr & (AM35X_INTR_DRVVBUS << AM35X_INTR_USB_SHIFT)) {
- int drvvbus = musb_readl(reg_base, USB_STAT_REG);
- void __iomem *mregs = musb->mregs;
- u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
- int err;
-
- err = is_host_enabled(musb) && (musb->int_usb &
- MUSB_INTR_VBUSERROR);
- if (err) {
- /*
- * The Mentor core doesn't debounce VBUS as needed
- * to cope with device connect current spikes. This
- * means it's not uncommon for bus-powered devices
- * to get VBUS errors during enumeration.
- *
- * This is a workaround, but newer RTL from Mentor
- * seems to allow a better one: "re"-starting sessions
- * without waiting for VBUS to stop registering in
- * devctl.
- */
- musb->int_usb &= ~MUSB_INTR_VBUSERROR;
- musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
- mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
- WARNING("VBUS error workaround (delay coming)\n");
- } else if (is_host_enabled(musb) && drvvbus) {
- MUSB_HST_MODE(musb);
- otg->default_a = 1;
- musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
- portstate(musb->port1_status |= USB_PORT_STAT_POWER);
- del_timer(&otg_workaround);
- } else {
- musb->is_active = 0;
- MUSB_DEV_MODE(musb);
- otg->default_a = 0;
- musb->xceiv->state = OTG_STATE_B_IDLE;
- portstate(musb->port1_status &= ~USB_PORT_STAT_POWER);
- }
-
- /* NOTE: this must complete power-on within 100 ms. */
- dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",
- drvvbus ? "on" : "off",
- otg_state_string(musb->xceiv->state),
- err ? " ERROR" : "",
- devctl);
- ret = IRQ_HANDLED;
- }
-#endif
-
- if (musb->int_tx || musb->int_rx || musb->int_usb)
- ret |= musb_interrupt(musb);
-
-eoi:
- /* EOI needs to be written for the IRQ to be re-asserted. */
- if (ret == IRQ_HANDLED || epintr || usbintr) {
- /* clear level interrupt */
- if (data->clear_irq)
- data->clear_irq();
- /* write EOI */
- musb_writel(reg_base, USB_END_OF_INTR_REG, 0);
- }
-
-#ifndef __UBOOT__
- /* Poll for ID change */
- if (is_otg_enabled(musb) && musb->xceiv->state == OTG_STATE_B_IDLE)
- mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ);
-#endif
-
- spin_unlock_irqrestore(&musb->lock, flags);
-
- return ret;
-}
-
-#ifndef __UBOOT__
-static int am35x_musb_set_mode(struct musb *musb, u8 musb_mode)
-{
- struct device *dev = musb->controller;
- struct musb_hdrc_platform_data *plat = dev->platform_data;
- struct omap_musb_board_data *data = plat->board_data;
- int retval = 0;
-
- if (data->set_mode)
- data->set_mode(musb_mode);
- else
- retval = -EIO;
-
- return retval;
-}
-#endif
-
-static int am35x_musb_init(struct musb *musb)
-{
-#ifndef __UBOOT__
- struct device *dev = musb->controller;
- struct musb_hdrc_platform_data *plat = dev->platform_data;
- struct omap_musb_board_data *data = plat->board_data;
-#else
- struct omap_musb_board_data *data =
- (struct omap_musb_board_data *)musb->controller;
-#endif
- void __iomem *reg_base = musb->ctrl_base;
- u32 rev;
-
- musb->mregs += USB_MENTOR_CORE_OFFSET;
-
- /* Returns zero if e.g. not clocked */
- rev = musb_readl(reg_base, USB_REVISION_REG);
- if (!rev)
- return -ENODEV;
-
-#ifndef __UBOOT__
- usb_nop_xceiv_register();
- musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
- if (IS_ERR_OR_NULL(musb->xceiv))
- return -ENODEV;
-
- if (is_host_enabled(musb))
- setup_timer(&otg_workaround, otg_timer, (unsigned long) musb);
-#endif
-
- /* Reset the musb */
- if (data->reset)
- data->reset();
-
- /* Reset the controller */
- musb_writel(reg_base, USB_CTRL_REG, AM35X_SOFT_RESET_MASK);
-
- /* Start the on-chip PHY and its PLL. */
- if (data->set_phy_power)
- data->set_phy_power(1);
-
- msleep(5);
-
- musb->isr = am35x_musb_interrupt;
-
- /* clear level interrupt */
- if (data->clear_irq)
- data->clear_irq();
-
- return 0;
-}
-
-static int am35x_musb_exit(struct musb *musb)
-{
-#ifndef __UBOOT__
- struct device *dev = musb->controller;
- struct musb_hdrc_platform_data *plat = dev->platform_data;
- struct omap_musb_board_data *data = plat->board_data;
-#else
- struct omap_musb_board_data *data =
- (struct omap_musb_board_data *)musb->controller;
-#endif
-
-#ifndef __UBOOT__
- if (is_host_enabled(musb))
- del_timer_sync(&otg_workaround);
-#endif
-
- /* Shutdown the on-chip PHY and its PLL. */
- if (data->set_phy_power)
- data->set_phy_power(0);
-
-#ifndef __UBOOT__
- usb_put_phy(musb->xceiv);
- usb_nop_xceiv_unregister();
-#endif
-
- return 0;
-}
-
-/* AM35x supports only 32bit read operation */
-void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst)
-{
- void __iomem *fifo = hw_ep->fifo;
- u32 val;
- int i;
-
- /* Read for 32bit-aligned destination address */
- if (likely((0x03 & (unsigned long) dst) == 0) && len >= 4) {
- readsl(fifo, dst, len >> 2);
- dst += len & ~0x03;
- len &= 0x03;
- }
- /*
- * Now read the remaining 1 to 3 byte or complete length if
- * unaligned address.
- */
- if (len > 4) {
- for (i = 0; i < (len >> 2); i++) {
- *(u32 *) dst = musb_readl(fifo, 0);
- dst += 4;
- }
- len &= 0x03;
- }
- if (len > 0) {
- val = musb_readl(fifo, 0);
- memcpy(dst, &val, len);
- }
-}
-
-#ifndef __UBOOT__
-static const struct musb_platform_ops am35x_ops = {
-#else
-const struct musb_platform_ops am35x_ops = {
-#endif
- .init = am35x_musb_init,
- .exit = am35x_musb_exit,
-
- .enable = am35x_musb_enable,
- .disable = am35x_musb_disable,
-
-#ifndef __UBOOT__
- .set_mode = am35x_musb_set_mode,
- .try_idle = am35x_musb_try_idle,
-
- .set_vbus = am35x_musb_set_vbus,
-#endif
-};
-
-#ifndef __UBOOT__
-static u64 am35x_dmamask = DMA_BIT_MASK(32);
-
-static int __devinit am35x_probe(struct platform_device *pdev)
-{
- struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data;
- struct platform_device *musb;
- struct am35x_glue *glue;
-
- struct clk *phy_clk;
- struct clk *clk;
-
- int ret = -ENOMEM;
-
- glue = kzalloc(sizeof(*glue), GFP_KERNEL);
- if (!glue) {
- dev_err(&pdev->dev, "failed to allocate glue context\n");
- goto err0;
- }
-
- musb = platform_device_alloc("musb-hdrc", -1);
- if (!musb) {
- dev_err(&pdev->dev, "failed to allocate musb device\n");
- goto err1;
- }
-
- phy_clk = clk_get(&pdev->dev, "fck");
- if (IS_ERR(phy_clk)) {
- dev_err(&pdev->dev, "failed to get PHY clock\n");
- ret = PTR_ERR(phy_clk);
- goto err2;
- }
-
- clk = clk_get(&pdev->dev, "ick");
- if (IS_ERR(clk)) {
- dev_err(&pdev->dev, "failed to get clock\n");
- ret = PTR_ERR(clk);
- goto err3;
- }
-
- ret = clk_enable(phy_clk);
- if (ret) {
- dev_err(&pdev->dev, "failed to enable PHY clock\n");
- goto err4;
- }
-
- ret = clk_enable(clk);
- if (ret) {
- dev_err(&pdev->dev, "failed to enable clock\n");
- goto err5;
- }
-
- musb->dev.parent = &pdev->dev;
- musb->dev.dma_mask = &am35x_dmamask;
- musb->dev.coherent_dma_mask = am35x_dmamask;
-
- glue->dev = &pdev->dev;
- glue->musb = musb;
- glue->phy_clk = phy_clk;
- glue->clk = clk;
-
- pdata->platform_ops = &am35x_ops;
-
- platform_set_drvdata(pdev, glue);
-
- ret = platform_device_add_resources(musb, pdev->resource,
- pdev->num_resources);
- if (ret) {
- dev_err(&pdev->dev, "failed to add resources\n");
- goto err6;
- }
-
- ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
- if (ret) {
- dev_err(&pdev->dev, "failed to add platform_data\n");
- goto err6;
- }
-
- ret = platform_device_add(musb);
- if (ret) {
- dev_err(&pdev->dev, "failed to register musb device\n");
- goto err6;
- }
-
- return 0;
-
-err6:
- clk_disable(clk);
-
-err5:
- clk_disable(phy_clk);
-
-err4:
- clk_put(clk);
-
-err3:
- clk_put(phy_clk);
-
-err2:
- platform_device_put(musb);
-
-err1:
- kfree(glue);
-
-err0:
- return ret;
-}
-
-static int __devexit am35x_remove(struct platform_device *pdev)
-{
- struct am35x_glue *glue = platform_get_drvdata(pdev);
-
- platform_device_del(glue->musb);
- platform_device_put(glue->musb);
- clk_disable(glue->clk);
- clk_disable(glue->phy_clk);
- clk_put(glue->clk);
- clk_put(glue->phy_clk);
- kfree(glue);
-
- return 0;
-}
-
-#ifdef CONFIG_PM
-static int am35x_suspend(struct device *dev)
-{
- struct am35x_glue *glue = dev_get_drvdata(dev);
- struct musb_hdrc_platform_data *plat = dev->platform_data;
- struct omap_musb_board_data *data = plat->board_data;
-
- /* Shutdown the on-chip PHY and its PLL. */
- if (data->set_phy_power)
- data->set_phy_power(0);
-
- clk_disable(glue->phy_clk);
- clk_disable(glue->clk);
-
- return 0;
-}
-
-static int am35x_resume(struct device *dev)
-{
- struct am35x_glue *glue = dev_get_drvdata(dev);
- struct musb_hdrc_platform_data *plat = dev->platform_data;
- struct omap_musb_board_data *data = plat->board_data;
- int ret;
-
- /* Start the on-chip PHY and its PLL. */
- if (data->set_phy_power)
- data->set_phy_power(1);
-
- ret = clk_enable(glue->phy_clk);
- if (ret) {
- dev_err(dev, "failed to enable PHY clock\n");
- return ret;
- }
-
- ret = clk_enable(glue->clk);
- if (ret) {
- dev_err(dev, "failed to enable clock\n");
- return ret;
- }
-
- return 0;
-}
-
-static struct dev_pm_ops am35x_pm_ops = {
- .suspend = am35x_suspend,
- .resume = am35x_resume,
-};
-
-#define DEV_PM_OPS &am35x_pm_ops
-#else
-#define DEV_PM_OPS NULL
-#endif
-
-static struct platform_driver am35x_driver = {
- .probe = am35x_probe,
- .remove = __devexit_p(am35x_remove),
- .driver = {
- .name = "musb-am35x",
- .pm = DEV_PM_OPS,
- },
-};
-
-MODULE_DESCRIPTION("AM35x MUSB Glue Layer");
-MODULE_AUTHOR("Ajay Kumar Gupta <ajay.gupta@ti.com>");
-MODULE_LICENSE("GPL v2");
-
-static int __init am35x_init(void)
-{
- return platform_driver_register(&am35x_driver);
-}
-module_init(am35x_init);
-
-static void __exit am35x_exit(void)
-{
- platform_driver_unregister(&am35x_driver);
-}
-module_exit(am35x_exit);
-#endif
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
deleted file mode 100644
index d2cb91a..0000000
--- a/drivers/usb/musb/musb_gadget.c
+++ /dev/null
@@ -1,2333 +0,0 @@
-/*
- * MUSB OTG driver peripheral support
- *
- * Copyright 2005 Mentor Graphics Corporation
- * Copyright (C) 2005-2006 by Texas Instruments
- * Copyright (C) 2006-2007 Nokia Corporation
- * Copyright (C) 2009 MontaVista Software, Inc. <source@mvista.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
- * NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#define __UBOOT__
-#ifndef __UBOOT__
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/timer.h>
-#include <linux/module.h>
-#include <linux/smp.h>
-#include <linux/spinlock.h>
-#include <linux/delay.h>
-#include <linux/dma-mapping.h>
-#include <linux/slab.h>
-#else
-#include <common.h>
-#include <linux/usb/ch9.h>
-#include "linux-compat.h"
-#endif
-
-#include "musb_core.h"
-
-
-/* MUSB PERIPHERAL status 3-mar-2006:
- *
- * - EP0 seems solid. It passes both USBCV and usbtest control cases.
- * Minor glitches:
- *
- * + remote wakeup to Linux hosts work, but saw USBCV failures;
- * in one test run (operator error?)
- * + endpoint halt tests -- in both usbtest and usbcv -- seem
- * to break when dma is enabled ... is something wrongly
- * clearing SENDSTALL?
- *
- * - Mass storage behaved ok when last tested. Network traffic patterns
- * (with lots of short transfers etc) need retesting; they turn up the
- * worst cases of the DMA, since short packets are typical but are not
- * required.
- *
- * - TX/IN
- * + both pio and dma behave in with network and g_zero tests
- * + no cppi throughput issues other than no-hw-queueing
- * + failed with FLAT_REG (DaVinci)
- * + seems to behave with double buffering, PIO -and- CPPI
- * + with gadgetfs + AIO, requests got lost?
- *
- * - RX/OUT
- * + both pio and dma behave in with network and g_zero tests
- * + dma is slow in typical case (short_not_ok is clear)
- * + double buffering ok with PIO
- * + double buffering *FAILS* with CPPI, wrong data bytes sometimes
- * + request lossage observed with gadgetfs
- *
- * - ISO not tested ... might work, but only weakly isochronous
- *
- * - Gadget driver disabling of softconnect during bind() is ignored; so
- * drivers can't hold off host requests until userspace is ready.
- * (Workaround: they can turn it off later.)
- *
- * - PORTABILITY (assumes PIO works):
- * + DaVinci, basically works with cppi dma
- * + OMAP 2430, ditto with mentor dma
- * + TUSB 6010, platform-specific dma in the works
- */
-
-/* ----------------------------------------------------------------------- */
-
-#define is_buffer_mapped(req) (is_dma_capable() && \
- (req->map_state != UN_MAPPED))
-
-#ifndef CONFIG_MUSB_PIO_ONLY
-/* Maps the buffer to dma */
-
-static inline void map_dma_buffer(struct musb_request *request,
- struct musb *musb, struct musb_ep *musb_ep)
-{
- int compatible = true;
- struct dma_controller *dma = musb->dma_controller;
-
- request->map_state = UN_MAPPED;
-
- if (!is_dma_capable() || !musb_ep->dma)
- return;
-
- /* Check if DMA engine can handle this request.
- * DMA code must reject the USB request explicitly.
- * Default behaviour is to map the request.
- */
- if (dma->is_compatible)
- compatible = dma->is_compatible(musb_ep->dma,
- musb_ep->packet_sz, request->request.buf,
- request->request.length);
- if (!compatible)
- return;
-
- if (request->request.dma == DMA_ADDR_INVALID) {
- request->request.dma = dma_map_single(
- musb->controller,
- request->request.buf,
- request->request.length,
- request->tx
- ? DMA_TO_DEVICE
- : DMA_FROM_DEVICE);
- request->map_state = MUSB_MAPPED;
- } else {
- dma_sync_single_for_device(musb->controller,
- request->request.dma,
- request->request.length,
- request->tx
- ? DMA_TO_DEVICE
- : DMA_FROM_DEVICE);
- request->map_state = PRE_MAPPED;
- }
-}
-
-/* Unmap the buffer from dma and maps it back to cpu */
-static inline void unmap_dma_buffer(struct musb_request *request,
- struct musb *musb)
-{
- if (!is_buffer_mapped(request))
- return;
-
- if (request->request.dma == DMA_ADDR_INVALID) {
- dev_vdbg(musb->controller,
- "not unmapping a never mapped buffer\n");
- return;
- }
- if (request->map_state == MUSB_MAPPED) {
- dma_unmap_single(musb->controller,
- request->request.dma,
- request->request.length,
- request->tx
- ? DMA_TO_DEVICE
- : DMA_FROM_DEVICE);
- request->request.dma = DMA_ADDR_INVALID;
- } else { /* PRE_MAPPED */
- dma_sync_single_for_cpu(musb->controller,
- request->request.dma,
- request->request.length,
- request->tx
- ? DMA_TO_DEVICE
- : DMA_FROM_DEVICE);
- }
- request->map_state = UN_MAPPED;
-}
-#else
-static inline void map_dma_buffer(struct musb_request *request,
- struct musb *musb, struct musb_ep *musb_ep)
-{
-}
-
-static inline void unmap_dma_buffer(struct musb_request *request,
- struct musb *musb)
-{
-}
-#endif
-
-/*
- * Immediately complete a request.
- *
- * @param request the request to complete
- * @param status the status to complete the request with
- * Context: controller locked, IRQs blocked.
- */
-void musb_g_giveback(
- struct musb_ep *ep,
- struct usb_request *request,
- int status)
-__releases(ep->musb->lock)
-__acquires(ep->musb->lock)
-{
- struct musb_request *req;
- struct musb *musb;
- int busy = ep->busy;
-
- req = to_musb_request(request);
-
- list_del(&req->list);
- if (req->request.status == -EINPROGRESS)
- req->request.status = status;
- musb = req->musb;
-
- ep->busy = 1;
- spin_unlock(&musb->lock);
- unmap_dma_buffer(req, musb);
- if (request->status == 0)
- dev_dbg(musb->controller, "%s done request %p, %d/%d\n",
- ep->end_point.name, request,
- req->request.actual, req->request.length);
- else
- dev_dbg(musb->controller, "%s request %p, %d/%d fault %d\n",
- ep->end_point.name, request,
- req->request.actual, req->request.length,
- request->status);
- req->request.complete(&req->ep->end_point, &req->request);
- spin_lock(&musb->lock);
- ep->busy = busy;
-}
-
-/* ----------------------------------------------------------------------- */
-
-/*
- * Abort requests queued to an endpoint using the status. Synchronous.
- * caller locked controller and blocked irqs, and selected this ep.
- */
-static void nuke(struct musb_ep *ep, const int status)
-{
- struct musb *musb = ep->musb;
- struct musb_request *req = NULL;
- void __iomem *epio = ep->musb->endpoints[ep->current_epnum].regs;
-
- ep->busy = 1;
-
- if (is_dma_capable() && ep->dma) {
- struct dma_controller *c = ep->musb->dma_controller;
- int value;
-
- if (ep->is_in) {
- /*
- * The programming guide says that we must not clear
- * the DMAMODE bit before DMAENAB, so we only
- * clear it in the second write...
- */
- musb_writew(epio, MUSB_TXCSR,
- MUSB_TXCSR_DMAMODE | MUSB_TXCSR_FLUSHFIFO);
- musb_writew(epio, MUSB_TXCSR,
- 0 | MUSB_TXCSR_FLUSHFIFO);
- } else {
- musb_writew(epio, MUSB_RXCSR,
- 0 | MUSB_RXCSR_FLUSHFIFO);
- musb_writew(epio, MUSB_RXCSR,
- 0 | MUSB_RXCSR_FLUSHFIFO);
- }
-
- value = c->channel_abort(ep->dma);
- dev_dbg(musb->controller, "%s: abort DMA --> %d\n",
- ep->name, value);
- c->channel_release(ep->dma);
- ep->dma = NULL;
- }
-
- while (!list_empty(&ep->req_list)) {
- req = list_first_entry(&ep->req_list, struct musb_request, list);
- musb_g_giveback(ep, &req->request, status);
- }
-}
-
-/* ----------------------------------------------------------------------- */
-
-/* Data transfers - pure PIO, pure DMA, or mixed mode */
-
-/*
- * This assumes the separate CPPI engine is responding to DMA requests
- * from the usb core ... sequenced a bit differently from mentor dma.
- */
-
-static inline int max_ep_writesize(struct musb *musb, struct musb_ep *ep)
-{
- if (can_bulk_split(musb, ep->type))
- return ep->hw_ep->max_packet_sz_tx;
- else
- return ep->packet_sz;
-}
-
-
-#ifdef CONFIG_USB_INVENTRA_DMA
-
-/* Peripheral tx (IN) using Mentor DMA works as follows:
- Only mode 0 is used for transfers <= wPktSize,
- mode 1 is used for larger transfers,
-
- One of the following happens:
- - Host sends IN token which causes an endpoint interrupt
- -> TxAvail
- -> if DMA is currently busy, exit.
- -> if queue is non-empty, txstate().
-
- - Request is queued by the gadget driver.
- -> if queue was previously empty, txstate()
-
- txstate()
- -> start
- /\ -> setup DMA
- | (data is transferred to the FIFO, then sent out when
- | IN token(s) are recd from Host.
- | -> DMA interrupt on completion
- | calls TxAvail.
- | -> stop DMA, ~DMAENAB,
- | -> set TxPktRdy for last short pkt or zlp
- | -> Complete Request
- | -> Continue next request (call txstate)
- |___________________________________|
-
- * Non-Mentor DMA engines can of course work differently, such as by
- * upleveling from irq-per-packet to irq-per-buffer.
- */
-
-#endif
-
-/*
- * An endpoint is transmitting data. This can be called either from
- * the IRQ routine or from ep.queue() to kickstart a request on an
- * endpoint.
- *
- * Context: controller locked, IRQs blocked, endpoint selected
- */
-static void txstate(struct musb *musb, struct musb_request *req)
-{
- u8 epnum = req->epnum;
- struct musb_ep *musb_ep;
- void __iomem *epio = musb->endpoints[epnum].regs;
- struct usb_request *request;
- u16 fifo_count = 0, csr;
- int use_dma = 0;
-
- musb_ep = req->ep;
-
- /* Check if EP is disabled */
- if (!musb_ep->desc) {
- dev_dbg(musb->controller, "ep:%s disabled - ignore request\n",
- musb_ep->end_point.name);
- return;
- }
-
- /* we shouldn't get here while DMA is active ... but we do ... */
- if (dma_channel_status(musb_ep->dma) == MUSB_DMA_STATUS_BUSY) {
- dev_dbg(musb->controller, "dma pending...\n");
- return;
- }
-
- /* read TXCSR before */
- csr = musb_readw(epio, MUSB_TXCSR);
-
- request = &req->request;
- fifo_count = min(max_ep_writesize(musb, musb_ep),
- (int)(request->length - request->actual));
-
- if (csr & MUSB_TXCSR_TXPKTRDY) {
- dev_dbg(musb->controller, "%s old packet still ready , txcsr %03x\n",
- musb_ep->end_point.name, csr);
- return;
- }
-
- if (csr & MUSB_TXCSR_P_SENDSTALL) {
- dev_dbg(musb->controller, "%s stalling, txcsr %03x\n",
- musb_ep->end_point.name, csr);
- return;
- }
-
- dev_dbg(musb->controller, "hw_ep%d, maxpacket %d, fifo count %d, txcsr %03x\n",
- epnum, musb_ep->packet_sz, fifo_count,
- csr);
-
-#ifndef CONFIG_MUSB_PIO_ONLY
- if (is_buffer_mapped(req)) {
- struct dma_controller *c = musb->dma_controller;
- size_t request_size;
-
- /* setup DMA, then program endpoint CSR */
- request_size = min_t(size_t, request->length - request->actual,
- musb_ep->dma->max_len);
-
- use_dma = (request->dma != DMA_ADDR_INVALID);
-
- /* MUSB_TXCSR_P_ISO is still set correctly */
-
-#if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_UX500_DMA)
- {
- if (request_size < musb_ep->packet_sz)
- musb_ep->dma->desired_mode = 0;
- else
- musb_ep->dma->desired_mode = 1;
-
- use_dma = use_dma && c->channel_program(
- musb_ep->dma, musb_ep->packet_sz,
- musb_ep->dma->desired_mode,
- request->dma + request->actual, request_size);
- if (use_dma) {
- if (musb_ep->dma->desired_mode == 0) {
- /*
- * We must not clear the DMAMODE bit
- * before the DMAENAB bit -- and the
- * latter doesn't always get cleared
- * before we get here...
- */
- csr &= ~(MUSB_TXCSR_AUTOSET
- | MUSB_TXCSR_DMAENAB);
- musb_writew(epio, MUSB_TXCSR, csr
- | MUSB_TXCSR_P_WZC_BITS);
- csr &= ~MUSB_TXCSR_DMAMODE;
- csr |= (MUSB_TXCSR_DMAENAB |
- MUSB_TXCSR_MODE);
- /* against programming guide */
- } else {
- csr |= (MUSB_TXCSR_DMAENAB
- | MUSB_TXCSR_DMAMODE
- | MUSB_TXCSR_MODE);
- if (!musb_ep->hb_mult)
- csr |= MUSB_TXCSR_AUTOSET;
- }
- csr &= ~MUSB_TXCSR_P_UNDERRUN;
-
- musb_writew(epio, MUSB_TXCSR, csr);
- }
- }
-
-#elif defined(CONFIG_USB_TI_CPPI_DMA)
- /* program endpoint CSR first, then setup DMA */
- csr &= ~(MUSB_TXCSR_P_UNDERRUN | MUSB_TXCSR_TXPKTRDY);
- csr |= MUSB_TXCSR_DMAENAB | MUSB_TXCSR_DMAMODE |
- MUSB_TXCSR_MODE;
- musb_writew(epio, MUSB_TXCSR,
- (MUSB_TXCSR_P_WZC_BITS & ~MUSB_TXCSR_P_UNDERRUN)
- | csr);
-
- /* ensure writebuffer is empty */
- csr = musb_readw(epio, MUSB_TXCSR);
-
- /* NOTE host side sets DMAENAB later than this; both are
- * OK since the transfer dma glue (between CPPI and Mentor
- * fifos) just tells CPPI it could start. Data only moves
- * to the USB TX fifo when both fifos are ready.
- */
-
- /* "mode" is irrelevant here; handle terminating ZLPs like
- * PIO does, since the hardware RNDIS mode seems unreliable
- * except for the last-packet-is-already-short case.
- */
- use_dma = use_dma && c->channel_program(
- musb_ep->dma, musb_ep->packet_sz,
- 0,
- request->dma + request->actual,
- request_size);
- if (!use_dma) {
- c->channel_release(musb_ep->dma);
- musb_ep->dma = NULL;
- csr &= ~MUSB_TXCSR_DMAENAB;
- musb_writew(epio, MUSB_TXCSR, csr);
- /* invariant: prequest->buf is non-null */
- }
-#elif defined(CONFIG_USB_TUSB_OMAP_DMA)
- use_dma = use_dma && c->channel_program(
- musb_ep->dma, musb_ep->packet_sz,
- request->zero,
- request->dma + request->actual,
- request_size);
-#endif
- }
-#endif
-
- if (!use_dma) {
- /*
- * Unmap the dma buffer back to cpu if dma channel
- * programming fails
- */
- unmap_dma_buffer(req, musb);
-
- musb_write_fifo(musb_ep->hw_ep, fifo_count,
- (u8 *) (request->buf + request->actual));
- request->actual += fifo_count;
- csr |= MUSB_TXCSR_TXPKTRDY;
- csr &= ~MUSB_TXCSR_P_UNDERRUN;
- musb_writew(epio, MUSB_TXCSR, csr);
- }
-
- /* host may already have the data when this message shows... */
- dev_dbg(musb->controller, "%s TX/IN %s len %d/%d, txcsr %04x, fifo %d/%d\n",
- musb_ep->end_point.name, use_dma ? "dma" : "pio",
- request->actual, request->length,
- musb_readw(epio, MUSB_TXCSR),
- fifo_count,
- musb_readw(epio, MUSB_TXMAXP));
-}
-
-/*
- * FIFO state update (e.g. data ready).
- * Called from IRQ, with controller locked.
- */
-void musb_g_tx(struct musb *musb, u8 epnum)
-{
- u16 csr;
- struct musb_request *req;
- struct usb_request *request;
- u8 __iomem *mbase = musb->mregs;
- struct musb_ep *musb_ep = &musb->endpoints[epnum].ep_in;
- void __iomem *epio = musb->endpoints[epnum].regs;
- struct dma_channel *dma;
-
- musb_ep_select(mbase, epnum);
- req = next_request(musb_ep);
- request = &req->request;
-
- csr = musb_readw(epio, MUSB_TXCSR);
- dev_dbg(musb->controller, "<== %s, txcsr %04x\n", musb_ep->end_point.name, csr);
-
- dma = is_dma_capable() ? musb_ep->dma : NULL;
-
- /*
- * REVISIT: for high bandwidth, MUSB_TXCSR_P_INCOMPTX
- * probably rates reporting as a host error.
- */
- if (csr & MUSB_TXCSR_P_SENTSTALL) {
- csr |= MUSB_TXCSR_P_WZC_BITS;
- csr &= ~MUSB_TXCSR_P_SENTSTALL;
- musb_writew(epio, MUSB_TXCSR, csr);
- return;
- }
-
- if (csr & MUSB_TXCSR_P_UNDERRUN) {
- /* We NAKed, no big deal... little reason to care. */
- csr |= MUSB_TXCSR_P_WZC_BITS;
- csr &= ~(MUSB_TXCSR_P_UNDERRUN | MUSB_TXCSR_TXPKTRDY);
- musb_writew(epio, MUSB_TXCSR, csr);
- dev_vdbg(musb->controller, "underrun on ep%d, req %p\n",
- epnum, request);
- }
-
- if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) {
- /*
- * SHOULD NOT HAPPEN... has with CPPI though, after
- * changing SENDSTALL (and other cases); harmless?
- */
- dev_dbg(musb->controller, "%s dma still busy?\n", musb_ep->end_point.name);
- return;
- }
-
- if (request) {
- u8 is_dma = 0;
-
- if (dma && (csr & MUSB_TXCSR_DMAENAB)) {
- is_dma = 1;
- csr |= MUSB_TXCSR_P_WZC_BITS;
- csr &= ~(MUSB_TXCSR_DMAENAB | MUSB_TXCSR_P_UNDERRUN |
- MUSB_TXCSR_TXPKTRDY | MUSB_TXCSR_AUTOSET);
- musb_writew(epio, MUSB_TXCSR, csr);
- /* Ensure writebuffer is empty. */
- csr = musb_readw(epio, MUSB_TXCSR);
- request->actual += musb_ep->dma->actual_len;
- dev_dbg(musb->controller, "TXCSR%d %04x, DMA off, len %zu, req %p\n",
- epnum, csr, musb_ep->dma->actual_len, request);
- }
-
- /*
- * First, maybe a terminating short packet. Some DMA
- * engines might handle this by themselves.
- */
- if ((request->zero && request->length
- && (request->length % musb_ep->packet_sz == 0)
- && (request->actual == request->length))
-#if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_UX500_DMA)
- || (is_dma && (!dma->desired_mode ||
- (request->actual &
- (musb_ep->packet_sz - 1))))
-#endif
- ) {
- /*
- * On DMA completion, FIFO may not be
- * available yet...
- */
- if (csr & MUSB_TXCSR_TXPKTRDY)
- return;
-
- dev_dbg(musb->controller, "sending zero pkt\n");
- musb_writew(epio, MUSB_TXCSR, MUSB_TXCSR_MODE
- | MUSB_TXCSR_TXPKTRDY);
- request->zero = 0;
- }
-
- if (request->actual == request->length) {
- musb_g_giveback(musb_ep, request, 0);
- /*
- * In the giveback function the MUSB lock is
- * released and acquired after sometime. During
- * this time period the INDEX register could get
- * changed by the gadget_queue function especially
- * on SMP systems. Reselect the INDEX to be sure
- * we are reading/modifying the right registers
- */
- musb_ep_select(mbase, epnum);
- req = musb_ep->desc ? next_request(musb_ep) : NULL;
- if (!req) {
- dev_dbg(musb->controller, "%s idle now\n",
- musb_ep->end_point.name);
- return;
- }
- }
-
- txstate(musb, req);
- }
-}
-
-/* ------------------------------------------------------------ */
-
-#ifdef CONFIG_USB_INVENTRA_DMA
-
-/* Peripheral rx (OUT) using Mentor DMA works as follows:
- - Only mode 0 is used.
-
- - Request is queued by the gadget class driver.
- -> if queue was previously empty, rxstate()
-
- - Host sends OUT token which causes an endpoint interrupt
- /\ -> RxReady
- | -> if request queued, call rxstate
- | /\ -> setup DMA
- | | -> DMA interrupt on completion
- | | -> RxReady
- | | -> stop DMA
- | | -> ack the read
- | | -> if data recd = max expected
- | | by the request, or host
- | | sent a short packet,
- | | complete the request,
- | | and start the next one.
- | |_____________________________________|
- | else just wait for the host
- | to send the next OUT token.
- |__________________________________________________|
-
- * Non-Mentor DMA engines can of course work differently.
- */
-
-#endif
-
-/*
- * Context: controller locked, IRQs blocked, endpoint selected
- */
-static void rxstate(struct musb *musb, struct musb_request *req)
-{
- const u8 epnum = req->epnum;
- struct usb_request *request = &req->request;
- struct musb_ep *musb_ep;
- void __iomem *epio = musb->endpoints[epnum].regs;
- unsigned fifo_count = 0;
- u16 len;
- u16 csr = musb_readw(epio, MUSB_RXCSR);
- struct musb_hw_ep *hw_ep = &musb->endpoints[epnum];
- u8 use_mode_1;
-
- if (hw_ep->is_shared_fifo)
- musb_ep = &hw_ep->ep_in;
- else
- musb_ep = &hw_ep->ep_out;
-
- len = musb_ep->packet_sz;
-
- /* Check if EP is disabled */
- if (!musb_ep->desc) {
- dev_dbg(musb->controller, "ep:%s disabled - ignore request\n",
- musb_ep->end_point.name);
- return;
- }
-
- /* We shouldn't get here while DMA is active, but we do... */
- if (dma_channel_status(musb_ep->dma) == MUSB_DMA_STATUS_BUSY) {
- dev_dbg(musb->controller, "DMA pending...\n");
- return;
- }
-
- if (csr & MUSB_RXCSR_P_SENDSTALL) {
- dev_dbg(musb->controller, "%s stalling, RXCSR %04x\n",
- musb_ep->end_point.name, csr);
- return;
- }
-
- if (is_cppi_enabled() && is_buffer_mapped(req)) {
- struct dma_controller *c = musb->dma_controller;
- struct dma_channel *channel = musb_ep->dma;
-
- /* NOTE: CPPI won't actually stop advancing the DMA
- * queue after short packet transfers, so this is almost
- * always going to run as IRQ-per-packet DMA so that
- * faults will be handled correctly.
- */
- if (c->channel_program(channel,
- musb_ep->packet_sz,
- !request->short_not_ok,
- request->dma + request->actual,
- request->length - request->actual)) {
-
- /* make sure that if an rxpkt arrived after the irq,
- * the cppi engine will be ready to take it as soon
- * as DMA is enabled
- */
- csr &= ~(MUSB_RXCSR_AUTOCLEAR
- | MUSB_RXCSR_DMAMODE);
- csr |= MUSB_RXCSR_DMAENAB | MUSB_RXCSR_P_WZC_BITS;
- musb_writew(epio, MUSB_RXCSR, csr);
- return;
- }
- }
-
- if (csr & MUSB_RXCSR_RXPKTRDY) {
- len = musb_readw(epio, MUSB_RXCOUNT);
-
- /*
- * Enable Mode 1 on RX transfers only when short_not_ok flag
- * is set. Currently short_not_ok flag is set only from
- * file_storage and f_mass_storage drivers
- */
-
- if (request->short_not_ok && len == musb_ep->packet_sz)
- use_mode_1 = 1;
- else
- use_mode_1 = 0;
-
- if (request->actual < request->length) {
-#ifdef CONFIG_USB_INVENTRA_DMA
- if (is_buffer_mapped(req)) {
- struct dma_controller *c;
- struct dma_channel *channel;
- int use_dma = 0;
-
- c = musb->dma_controller;
- channel = musb_ep->dma;
-
- /* We use DMA Req mode 0 in rx_csr, and DMA controller operates in
- * mode 0 only. So we do not get endpoint interrupts due to DMA
- * completion. We only get interrupts from DMA controller.
- *
- * We could operate in DMA mode 1 if we knew the size of the tranfer
- * in advance. For mass storage class, request->length = what the host
- * sends, so that'd work. But for pretty much everything else,
- * request->length is routinely more than what the host sends. For
- * most these gadgets, end of is signified either by a short packet,
- * or filling the last byte of the buffer. (Sending extra data in
- * that last pckate should trigger an overflow fault.) But in mode 1,
- * we don't get DMA completion interrupt for short packets.
- *
- * Theoretically, we could enable DMAReq irq (MUSB_RXCSR_DMAMODE = 1),
- * to get endpoint interrupt on every DMA req, but that didn't seem
- * to work reliably.
- *
- * REVISIT an updated g_file_storage can set req->short_not_ok, which
- * then becomes usable as a runtime "use mode 1" hint...
- */
-
- /* Experimental: Mode1 works with mass storage use cases */
- if (use_mode_1) {
- csr |= MUSB_RXCSR_AUTOCLEAR;
- musb_writew(epio, MUSB_RXCSR, csr);
- csr |= MUSB_RXCSR_DMAENAB;
- musb_writew(epio, MUSB_RXCSR, csr);
-
- /*
- * this special sequence (enabling and then
- * disabling MUSB_RXCSR_DMAMODE) is required
- * to get DMAReq to activate
- */
- musb_writew(epio, MUSB_RXCSR,
- csr | MUSB_RXCSR_DMAMODE);
- musb_writew(epio, MUSB_RXCSR, csr);
-
- } else {
- if (!musb_ep->hb_mult &&
- musb_ep->hw_ep->rx_double_buffered)
- csr |= MUSB_RXCSR_AUTOCLEAR;
- csr |= MUSB_RXCSR_DMAENAB;
- musb_writew(epio, MUSB_RXCSR, csr);
- }
-
- if (request->actual < request->length) {
- int transfer_size = 0;
- if (use_mode_1) {
- transfer_size = min(request->length - request->actual,
- channel->max_len);
- musb_ep->dma->desired_mode = 1;
- } else {
- transfer_size = min(request->length - request->actual,
- (unsigned)len);
- musb_ep->dma->desired_mode = 0;
- }
-
- use_dma = c->channel_program(
- channel,
- musb_ep->packet_sz,
- channel->desired_mode,
- request->dma
- + request->actual,
- transfer_size);
- }
-
- if (use_dma)
- return;
- }
-#elif defined(CONFIG_USB_UX500_DMA)
- if ((is_buffer_mapped(req)) &&
- (request->actual < request->length)) {
-
- struct dma_controller *c;
- struct dma_channel *channel;
- int transfer_size = 0;
-
- c = musb->dma_controller;
- channel = musb_ep->dma;
-
- /* In case first packet is short */
- if (len < musb_ep->packet_sz)
- transfer_size = len;
- else if (request->short_not_ok)
- transfer_size = min(request->length -
- request->actual,
- channel->max_len);
- else
- transfer_size = min(request->length -
- request->actual,
- (unsigned)len);
-
- csr &= ~MUSB_RXCSR_DMAMODE;
- csr |= (MUSB_RXCSR_DMAENAB |
- MUSB_RXCSR_AUTOCLEAR);
-
- musb_writew(epio, MUSB_RXCSR, csr);
-
- if (transfer_size <= musb_ep->packet_sz) {
- musb_ep->dma->desired_mode = 0;
- } else {
- musb_ep->dma->desired_mode = 1;
- /* Mode must be set after DMAENAB */
- csr |= MUSB_RXCSR_DMAMODE;
- musb_writew(epio, MUSB_RXCSR, csr);
- }
-
- if (c->channel_program(channel,
- musb_ep->packet_sz,
- channel->desired_mode,
- request->dma
- + request->actual,
- transfer_size))
-
- return;
- }
-#endif /* Mentor's DMA */
-
- fifo_count = request->length - request->actual;
- dev_dbg(musb->controller, "%s OUT/RX pio fifo %d/%d, maxpacket %d\n",
- musb_ep->end_point.name,
- len, fifo_count,
- musb_ep->packet_sz);
-
- fifo_count = min_t(unsigned, len, fifo_count);
-
-#ifdef CONFIG_USB_TUSB_OMAP_DMA
- if (tusb_dma_omap() && is_buffer_mapped(req)) {
- struct dma_controller *c = musb->dma_controller;
- struct dma_channel *channel = musb_ep->dma;
- u32 dma_addr = request->dma + request->actual;
- int ret;
-
- ret = c->channel_program(channel,
- musb_ep->packet_sz,
- channel->desired_mode,
- dma_addr,
- fifo_count);
- if (ret)
- return;
- }
-#endif
- /*
- * Unmap the dma buffer back to cpu if dma channel
- * programming fails. This buffer is mapped if the
- * channel allocation is successful
- */
- if (is_buffer_mapped(req)) {
- unmap_dma_buffer(req, musb);
-
- /*
- * Clear DMAENAB and AUTOCLEAR for the
- * PIO mode transfer
- */
- csr &= ~(MUSB_RXCSR_DMAENAB | MUSB_RXCSR_AUTOCLEAR);
- musb_writew(epio, MUSB_RXCSR, csr);
- }
-
- musb_read_fifo(musb_ep->hw_ep, fifo_count, (u8 *)
- (request->buf + request->actual));
- request->actual += fifo_count;
-
- /* REVISIT if we left anything in the fifo, flush
- * it and report -EOVERFLOW
- */
-
- /* ack the read! */
- csr |= MUSB_RXCSR_P_WZC_BITS;
- csr &= ~MUSB_RXCSR_RXPKTRDY;
- musb_writew(epio, MUSB_RXCSR, csr);
- }
- }
-
- /* reach the end or short packet detected */
- if (request->actual == request->length || len < musb_ep->packet_sz)
- musb_g_giveback(musb_ep, request, 0);
-}
-
-/*
- * Data ready for a request; called from IRQ
- */
-void musb_g_rx(struct musb *musb, u8 epnum)
-{
- u16 csr;
- struct musb_request *req;
- struct usb_request *request;
- void __iomem *mbase = musb->mregs;
- struct musb_ep *musb_ep;
- void __iomem *epio = musb->endpoints[epnum].regs;
- struct dma_channel *dma;
- struct musb_hw_ep *hw_ep = &musb->endpoints[epnum];
-
- if (hw_ep->is_shared_fifo)
- musb_ep = &hw_ep->ep_in;
- else
- musb_ep = &hw_ep->ep_out;
-
- musb_ep_select(mbase, epnum);
-
- req = next_request(musb_ep);
- if (!req)
- return;
-
- request = &req->request;
-
- csr = musb_readw(epio, MUSB_RXCSR);
- dma = is_dma_capable() ? musb_ep->dma : NULL;
-
- dev_dbg(musb->controller, "<== %s, rxcsr %04x%s %p\n", musb_ep->end_point.name,
- csr, dma ? " (dma)" : "", request);
-
- if (csr & MUSB_RXCSR_P_SENTSTALL) {
- csr |= MUSB_RXCSR_P_WZC_BITS;
- csr &= ~MUSB_RXCSR_P_SENTSTALL;
- musb_writew(epio, MUSB_RXCSR, csr);
- return;
- }
-
- if (csr & MUSB_RXCSR_P_OVERRUN) {
- /* csr |= MUSB_RXCSR_P_WZC_BITS; */
- csr &= ~MUSB_RXCSR_P_OVERRUN;
- musb_writew(epio, MUSB_RXCSR, csr);
-
- dev_dbg(musb->controller, "%s iso overrun on %p\n", musb_ep->name, request);
- if (request->status == -EINPROGRESS)
- request->status = -EOVERFLOW;
- }
- if (csr & MUSB_RXCSR_INCOMPRX) {
- /* REVISIT not necessarily an error */
- dev_dbg(musb->controller, "%s, incomprx\n", musb_ep->end_point.name);
- }
-
- if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) {
- /* "should not happen"; likely RXPKTRDY pending for DMA */
- dev_dbg(musb->controller, "%s busy, csr %04x\n",
- musb_ep->end_point.name, csr);
- return;
- }
-
- if (dma && (csr & MUSB_RXCSR_DMAENAB)) {
- csr &= ~(MUSB_RXCSR_AUTOCLEAR
- | MUSB_RXCSR_DMAENAB
- | MUSB_RXCSR_DMAMODE);
- musb_writew(epio, MUSB_RXCSR,
- MUSB_RXCSR_P_WZC_BITS | csr);
-
- request->actual += musb_ep->dma->actual_len;
-
- dev_dbg(musb->controller, "RXCSR%d %04x, dma off, %04x, len %zu, req %p\n",
- epnum, csr,
- musb_readw(epio, MUSB_RXCSR),
- musb_ep->dma->actual_len, request);
-
-#if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_TUSB_OMAP_DMA) || \
- defined(CONFIG_USB_UX500_DMA)
- /* Autoclear doesn't clear RxPktRdy for short packets */
- if ((dma->desired_mode == 0 && !hw_ep->rx_double_buffered)
- || (dma->actual_len
- & (musb_ep->packet_sz - 1))) {
- /* ack the read! */
- csr &= ~MUSB_RXCSR_RXPKTRDY;
- musb_writew(epio, MUSB_RXCSR, csr);
- }
-
- /* incomplete, and not short? wait for next IN packet */
- if ((request->actual < request->length)
- && (musb_ep->dma->actual_len
- == musb_ep->packet_sz)) {
- /* In double buffer case, continue to unload fifo if
- * there is Rx packet in FIFO.
- **/
- csr = musb_readw(epio, MUSB_RXCSR);
- if ((csr & MUSB_RXCSR_RXPKTRDY) &&
- hw_ep->rx_double_buffered)
- goto exit;
- return;
- }
-#endif
- musb_g_giveback(musb_ep, request, 0);
- /*
- * In the giveback function the MUSB lock is
- * released and acquired after sometime. During
- * this time period the INDEX register could get
- * changed by the gadget_queue function especially
- * on SMP systems. Reselect the INDEX to be sure
- * we are reading/modifying the right registers
- */
- musb_ep_select(mbase, epnum);
-
- req = next_request(musb_ep);
- if (!req)
- return;
- }
-#if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_TUSB_OMAP_DMA) || \
- defined(CONFIG_USB_UX500_DMA)
-exit:
-#endif
- /* Analyze request */
- rxstate(musb, req);
-}
-
-/* ------------------------------------------------------------ */
-
-static int musb_gadget_enable(struct usb_ep *ep,
- const struct usb_endpoint_descriptor *desc)
-{
- unsigned long flags;
- struct musb_ep *musb_ep;
- struct musb_hw_ep *hw_ep;
- void __iomem *regs;
- struct musb *musb;
- void __iomem *mbase;
- u8 epnum;
- u16 csr;
- unsigned tmp;
- int status = -EINVAL;
-
- if (!ep || !desc)
- return -EINVAL;
-
- musb_ep = to_musb_ep(ep);
- hw_ep = musb_ep->hw_ep;
- regs = hw_ep->regs;
- musb = musb_ep->musb;
- mbase = musb->mregs;
- epnum = musb_ep->current_epnum;
-
- spin_lock_irqsave(&musb->lock, flags);
-
- if (musb_ep->desc) {
- status = -EBUSY;
- goto fail;
- }
- musb_ep->type = usb_endpoint_type(desc);
-
- /* check direction and (later) maxpacket size against endpoint */
- if (usb_endpoint_num(desc) != epnum)
- goto fail;
-
- /* REVISIT this rules out high bandwidth periodic transfers */
- tmp = usb_endpoint_maxp(desc);
- if (tmp & ~0x07ff) {
- int ok;
-
- if (usb_endpoint_dir_in(desc))
- ok = musb->hb_iso_tx;
- else
- ok = musb->hb_iso_rx;
-
- if (!ok) {
- dev_dbg(musb->controller, "no support for high bandwidth ISO\n");
- goto fail;
- }
- musb_ep->hb_mult = (tmp >> 11) & 3;
- } else {
- musb_ep->hb_mult = 0;
- }
-
- musb_ep->packet_sz = tmp & 0x7ff;
- tmp = musb_ep->packet_sz * (musb_ep->hb_mult + 1);
-
- /* enable the interrupts for the endpoint, set the endpoint
- * packet size (or fail), set the mode, clear the fifo
- */
- musb_ep_select(mbase, epnum);
- if (usb_endpoint_dir_in(desc)) {
- u16 int_txe = musb_readw(mbase, MUSB_INTRTXE);
-
- if (hw_ep->is_shared_fifo)
- musb_ep->is_in = 1;
- if (!musb_ep->is_in)
- goto fail;
-
- if (tmp > hw_ep->max_packet_sz_tx) {
- dev_dbg(musb->controller, "packet size beyond hardware FIFO size\n");
- goto fail;
- }
-
- int_txe |= (1 << epnum);
- musb_writew(mbase, MUSB_INTRTXE, int_txe);
-
- /* REVISIT if can_bulk_split(), use by updating "tmp";
- * likewise high bandwidth periodic tx
- */
- /* Set TXMAXP with the FIFO size of the endpoint
- * to disable double buffering mode.
- */
- if (musb->double_buffer_not_ok)
- musb_writew(regs, MUSB_TXMAXP, hw_ep->max_packet_sz_tx);
- else
- musb_writew(regs, MUSB_TXMAXP, musb_ep->packet_sz
- | (musb_ep->hb_mult << 11));
-
- csr = MUSB_TXCSR_MODE | MUSB_TXCSR_CLRDATATOG;
- if (musb_readw(regs, MUSB_TXCSR)
- & MUSB_TXCSR_FIFONOTEMPTY)
- csr |= MUSB_TXCSR_FLUSHFIFO;
- if (musb_ep->type == USB_ENDPOINT_XFER_ISOC)
- csr |= MUSB_TXCSR_P_ISO;
-
- /* set twice in case of double buffering */
- musb_writew(regs, MUSB_TXCSR, csr);
- /* REVISIT may be inappropriate w/o FIFONOTEMPTY ... */
- musb_writew(regs, MUSB_TXCSR, csr);
-
- } else {
- u16 int_rxe = musb_readw(mbase, MUSB_INTRRXE);
-
- if (hw_ep->is_shared_fifo)
- musb_ep->is_in = 0;
- if (musb_ep->is_in)
- goto fail;
-
- if (tmp > hw_ep->max_packet_sz_rx) {
- dev_dbg(musb->controller, "packet size beyond hardware FIFO size\n");
- goto fail;
- }
-
- int_rxe |= (1 << epnum);
- musb_writew(mbase, MUSB_INTRRXE, int_rxe);
-
- /* REVISIT if can_bulk_combine() use by updating "tmp"
- * likewise high bandwidth periodic rx
- */
- /* Set RXMAXP with the FIFO size of the endpoint
- * to disable double buffering mode.
- */
- if (musb->double_buffer_not_ok)
- musb_writew(regs, MUSB_RXMAXP, hw_ep->max_packet_sz_tx);
- else
- musb_writew(regs, MUSB_RXMAXP, musb_ep->packet_sz
- | (musb_ep->hb_mult << 11));
-
- /* force shared fifo to OUT-only mode */
- if (hw_ep->is_shared_fifo) {
- csr = musb_readw(regs, MUSB_TXCSR);
- csr &= ~(MUSB_TXCSR_MODE | MUSB_TXCSR_TXPKTRDY);
- musb_writew(regs, MUSB_TXCSR, csr);
- }
-
- csr = MUSB_RXCSR_FLUSHFIFO | MUSB_RXCSR_CLRDATATOG;
- if (musb_ep->type == USB_ENDPOINT_XFER_ISOC)
- csr |= MUSB_RXCSR_P_ISO;
- else if (musb_ep->type == USB_ENDPOINT_XFER_INT)
- csr |= MUSB_RXCSR_DISNYET;
-
- /* set twice in case of double buffering */
- musb_writew(regs, MUSB_RXCSR, csr);
- musb_writew(regs, MUSB_RXCSR, csr);
- }
-
- /* NOTE: all the I/O code _should_ work fine without DMA, in case
- * for some reason you run out of channels here.
- */
- if (is_dma_capable() && musb->dma_controller) {
- struct dma_controller *c = musb->dma_controller;
-
- musb_ep->dma = c->channel_alloc(c, hw_ep,
- (desc->bEndpointAddress & USB_DIR_IN));
- } else
- musb_ep->dma = NULL;
-
- musb_ep->desc = desc;
- musb_ep->busy = 0;
- musb_ep->wedged = 0;
- status = 0;
-
- pr_debug("%s periph: enabled %s for %s %s, %smaxpacket %d\n",
- musb_driver_name, musb_ep->end_point.name,
- ({ char *s; switch (musb_ep->type) {
- case USB_ENDPOINT_XFER_BULK: s = "bulk"; break;
- case USB_ENDPOINT_XFER_INT: s = "int"; break;
- default: s = "iso"; break;
- }; s; }),
- musb_ep->is_in ? "IN" : "OUT",
- musb_ep->dma ? "dma, " : "",
- musb_ep->packet_sz);
-
- schedule_work(&musb->irq_work);
-
-fail:
- spin_unlock_irqrestore(&musb->lock, flags);
- return status;
-}
-
-/*
- * Disable an endpoint flushing all requests queued.
- */
-static int musb_gadget_disable(struct usb_ep *ep)
-{
- unsigned long flags;
- struct musb *musb;
- u8 epnum;
- struct musb_ep *musb_ep;
- void __iomem *epio;
- int status = 0;
-
- musb_ep = to_musb_ep(ep);
- musb = musb_ep->musb;
- epnum = musb_ep->current_epnum;
- epio = musb->endpoints[epnum].regs;
-
- spin_lock_irqsave(&musb->lock, flags);
- musb_ep_select(musb->mregs, epnum);
-
- /* zero the endpoint sizes */
- if (musb_ep->is_in) {
- u16 int_txe = musb_readw(musb->mregs, MUSB_INTRTXE);
- int_txe &= ~(1 << epnum);
- musb_writew(musb->mregs, MUSB_INTRTXE, int_txe);
- musb_writew(epio, MUSB_TXMAXP, 0);
- } else {
- u16 int_rxe = musb_readw(musb->mregs, MUSB_INTRRXE);
- int_rxe &= ~(1 << epnum);
- musb_writew(musb->mregs, MUSB_INTRRXE, int_rxe);
- musb_writew(epio, MUSB_RXMAXP, 0);
- }
-
- musb_ep->desc = NULL;
-#ifndef __UBOOT__
- musb_ep->end_point.desc = NULL;
-#endif
-
- /* abort all pending DMA and requests */
- nuke(musb_ep, -ESHUTDOWN);
-
- schedule_work(&musb->irq_work);
-
- spin_unlock_irqrestore(&(musb->lock), flags);
-
- dev_dbg(musb->controller, "%s\n", musb_ep->end_point.name);
-
- return status;
-}
-
-/*
- * Allocate a request for an endpoint.
- * Reused by ep0 code.
- */
-struct usb_request *musb_alloc_request(struct usb_ep *ep, gfp_t gfp_flags)
-{
- struct musb_ep *musb_ep = to_musb_ep(ep);
- struct musb *musb = musb_ep->musb;
- struct musb_request *request = NULL;
-
- request = kzalloc(sizeof *request, gfp_flags);
- if (!request) {
- dev_dbg(musb->controller, "not enough memory\n");
- return NULL;
- }
-
- request->request.dma = DMA_ADDR_INVALID;
- request->epnum = musb_ep->current_epnum;
- request->ep = musb_ep;
-
- return &request->request;
-}
-
-/*
- * Free a request
- * Reused by ep0 code.
- */
-void musb_free_request(struct usb_ep *ep, struct usb_request *req)
-{
- kfree(to_musb_request(req));
-}
-
-static LIST_HEAD(buffers);
-
-struct free_record {
- struct list_head list;
- struct device *dev;
- unsigned bytes;
- dma_addr_t dma;
-};
-
-/*
- * Context: controller locked, IRQs blocked.
- */
-void musb_ep_restart(struct musb *musb, struct musb_request *req)
-{
- dev_dbg(musb->controller, "<== %s request %p len %u on hw_ep%d\n",
- req->tx ? "TX/IN" : "RX/OUT",
- &req->request, req->request.length, req->epnum);
-
- musb_ep_select(musb->mregs, req->epnum);
- if (req->tx)
- txstate(musb, req);
- else
- rxstate(musb, req);
-}
-
-static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req,
- gfp_t gfp_flags)
-{
- struct musb_ep *musb_ep;
- struct musb_request *request;
- struct musb *musb;
- int status = 0;
- unsigned long lockflags;
-
- if (!ep || !req)
- return -EINVAL;
- if (!req->buf)
- return -ENODATA;
-
- musb_ep = to_musb_ep(ep);
- musb = musb_ep->musb;
-
- request = to_musb_request(req);
- request->musb = musb;
-
- if (request->ep != musb_ep)
- return -EINVAL;
-
- dev_dbg(musb->controller, "<== to %s request=%p\n", ep->name, req);
-
- /* request is mine now... */
- request->request.actual = 0;
- request->request.status = -EINPROGRESS;
- request->epnum = musb_ep->current_epnum;
- request->tx = musb_ep->is_in;
-
- map_dma_buffer(request, musb, musb_ep);
-
- spin_lock_irqsave(&musb->lock, lockflags);
-
- /* don't queue if the ep is down */
- if (!musb_ep->desc) {
- dev_dbg(musb->controller, "req %p queued to %s while ep %s\n",
- req, ep->name, "disabled");
- status = -ESHUTDOWN;
- goto cleanup;
- }
-
- /* add request to the list */
- list_add_tail(&request->list, &musb_ep->req_list);
-
- /* it this is the head of the queue, start i/o ... */
- if (!musb_ep->busy && &request->list == musb_ep->req_list.next)
- musb_ep_restart(musb, request);
-
-cleanup:
- spin_unlock_irqrestore(&musb->lock, lockflags);
- return status;
-}
-
-static int musb_gadget_dequeue(struct usb_ep *ep, struct usb_request *request)
-{
- struct musb_ep *musb_ep = to_musb_ep(ep);
- struct musb_request *req = to_musb_request(request);
- struct musb_request *r;
- unsigned long flags;
- int status = 0;
- struct musb *musb = musb_ep->musb;
-
- if (!ep || !request || to_musb_request(request)->ep != musb_ep)
- return -EINVAL;
-
- spin_lock_irqsave(&musb->lock, flags);
-
- list_for_each_entry(r, &musb_ep->req_list, list) {
- if (r == req)
- break;
- }
- if (r != req) {
- dev_dbg(musb->controller, "request %p not queued to %s\n", request, ep->name);
- status = -EINVAL;
- goto done;
- }
-
- /* if the hardware doesn't have the request, easy ... */
- if (musb_ep->req_list.next != &req->list || musb_ep->busy)
- musb_g_giveback(musb_ep, request, -ECONNRESET);
-
- /* ... else abort the dma transfer ... */
- else if (is_dma_capable() && musb_ep->dma) {
- struct dma_controller *c = musb->dma_controller;
-
- musb_ep_select(musb->mregs, musb_ep->current_epnum);
- if (c->channel_abort)
- status = c->channel_abort(musb_ep->dma);
- else
- status = -EBUSY;
- if (status == 0)
- musb_g_giveback(musb_ep, request, -ECONNRESET);
- } else {
- /* NOTE: by sticking to easily tested hardware/driver states,
- * we leave counting of in-flight packets imprecise.
- */
- musb_g_giveback(musb_ep, request, -ECONNRESET);
- }
-
-done:
- spin_unlock_irqrestore(&musb->lock, flags);
- return status;
-}
-
-/*
- * Set or clear the halt bit of an endpoint. A halted enpoint won't tx/rx any
- * data but will queue requests.
- *
- * exported to ep0 code
- */
-static int musb_gadget_set_halt(struct usb_ep *ep, int value)
-{
- struct musb_ep *musb_ep = to_musb_ep(ep);
- u8 epnum = musb_ep->current_epnum;
- struct musb *musb = musb_ep->musb;
- void __iomem *epio = musb->endpoints[epnum].regs;
- void __iomem *mbase;
- unsigned long flags;
- u16 csr;
- struct musb_request *request;
- int status = 0;
-
- if (!ep)
- return -EINVAL;
- mbase = musb->mregs;
-
- spin_lock_irqsave(&musb->lock, flags);
-
- if ((USB_ENDPOINT_XFER_ISOC == musb_ep->type)) {
- status = -EINVAL;
- goto done;
- }
-
- musb_ep_select(mbase, epnum);
-
- request = next_request(musb_ep);
- if (value) {
- if (request) {
- dev_dbg(musb->controller, "request in progress, cannot halt %s\n",
- ep->name);
- status = -EAGAIN;
- goto done;
- }
- /* Cannot portably stall with non-empty FIFO */
- if (musb_ep->is_in) {
- csr = musb_readw(epio, MUSB_TXCSR);
- if (csr & MUSB_TXCSR_FIFONOTEMPTY) {
- dev_dbg(musb->controller, "FIFO busy, cannot halt %s\n", ep->name);
- status = -EAGAIN;
- goto done;
- }
- }
- } else
- musb_ep->wedged = 0;
-
- /* set/clear the stall and toggle bits */
- dev_dbg(musb->controller, "%s: %s stall\n", ep->name, value ? "set" : "clear");
- if (musb_ep->is_in) {
- csr = musb_readw(epio, MUSB_TXCSR);
- csr |= MUSB_TXCSR_P_WZC_BITS
- | MUSB_TXCSR_CLRDATATOG;
- if (value)
- csr |= MUSB_TXCSR_P_SENDSTALL;
- else
- csr &= ~(MUSB_TXCSR_P_SENDSTALL
- | MUSB_TXCSR_P_SENTSTALL);
- csr &= ~MUSB_TXCSR_TXPKTRDY;
- musb_writew(epio, MUSB_TXCSR, csr);
- } else {
- csr = musb_readw(epio, MUSB_RXCSR);
- csr |= MUSB_RXCSR_P_WZC_BITS
- | MUSB_RXCSR_FLUSHFIFO
- | MUSB_RXCSR_CLRDATATOG;
- if (value)
- csr |= MUSB_RXCSR_P_SENDSTALL;
- else
- csr &= ~(MUSB_RXCSR_P_SENDSTALL
- | MUSB_RXCSR_P_SENTSTALL);
- musb_writew(epio, MUSB_RXCSR, csr);
- }
-
- /* maybe start the first request in the queue */
- if (!musb_ep->busy && !value && request) {
- dev_dbg(musb->controller, "restarting the request\n");
- musb_ep_restart(musb, request);
- }
-
-done:
- spin_unlock_irqrestore(&musb->lock, flags);
- return status;
-}
-
-#ifndef __UBOOT__
-/*
- * Sets the halt feature with the clear requests ignored
- */
-static int musb_gadget_set_wedge(struct usb_ep *ep)
-{
- struct musb_ep *musb_ep = to_musb_ep(ep);
-
- if (!ep)
- return -EINVAL;
-
- musb_ep->wedged = 1;
-
- return usb_ep_set_halt(ep);
-}
-#endif
-
-static int musb_gadget_fifo_status(struct usb_ep *ep)
-{
- struct musb_ep *musb_ep = to_musb_ep(ep);
- void __iomem *epio = musb_ep->hw_ep->regs;
- int retval = -EINVAL;
-
- if (musb_ep->desc && !musb_ep->is_in) {
- struct musb *musb = musb_ep->musb;
- int epnum = musb_ep->current_epnum;
- void __iomem *mbase = musb->mregs;
- unsigned long flags;
-
- spin_lock_irqsave(&musb->lock, flags);
-
- musb_ep_select(mbase, epnum);
- /* FIXME return zero unless RXPKTRDY is set */
- retval = musb_readw(epio, MUSB_RXCOUNT);
-
- spin_unlock_irqrestore(&musb->lock, flags);
- }
- return retval;
-}
-
-static void musb_gadget_fifo_flush(struct usb_ep *ep)
-{
- struct musb_ep *musb_ep = to_musb_ep(ep);
- struct musb *musb = musb_ep->musb;
- u8 epnum = musb_ep->current_epnum;
- void __iomem *epio = musb->endpoints[epnum].regs;
- void __iomem *mbase;
- unsigned long flags;
- u16 csr, int_txe;
-
- mbase = musb->mregs;
-
- spin_lock_irqsave(&musb->lock, flags);
- musb_ep_select(mbase, (u8) epnum);
-
- /* disable interrupts */
- int_txe = musb_readw(mbase, MUSB_INTRTXE);
- musb_writew(mbase, MUSB_INTRTXE, int_txe & ~(1 << epnum));
-
- if (musb_ep->is_in) {
- csr = musb_readw(epio, MUSB_TXCSR);
- if (csr & MUSB_TXCSR_FIFONOTEMPTY) {
- csr |= MUSB_TXCSR_FLUSHFIFO | MUSB_TXCSR_P_WZC_BITS;
- /*
- * Setting both TXPKTRDY and FLUSHFIFO makes controller
- * to interrupt current FIFO loading, but not flushing
- * the already loaded ones.
- */
- csr &= ~MUSB_TXCSR_TXPKTRDY;
- musb_writew(epio, MUSB_TXCSR, csr);
- /* REVISIT may be inappropriate w/o FIFONOTEMPTY ... */
- musb_writew(epio, MUSB_TXCSR, csr);
- }
- } else {
- csr = musb_readw(epio, MUSB_RXCSR);
- csr |= MUSB_RXCSR_FLUSHFIFO | MUSB_RXCSR_P_WZC_BITS;
- musb_writew(epio, MUSB_RXCSR, csr);
- musb_writew(epio, MUSB_RXCSR, csr);
- }
-
- /* re-enable interrupt */
- musb_writew(mbase, MUSB_INTRTXE, int_txe);
- spin_unlock_irqrestore(&musb->lock, flags);
-}
-
-static const struct usb_ep_ops musb_ep_ops = {
- .enable = musb_gadget_enable,
- .disable = musb_gadget_disable,
- .alloc_request = musb_alloc_request,
- .free_request = musb_free_request,
- .queue = musb_gadget_queue,
- .dequeue = musb_gadget_dequeue,
- .set_halt = musb_gadget_set_halt,
-#ifndef __UBOOT__
- .set_wedge = musb_gadget_set_wedge,
-#endif
- .fifo_status = musb_gadget_fifo_status,
- .fifo_flush = musb_gadget_fifo_flush
-};
-
-/* ----------------------------------------------------------------------- */
-
-static int musb_gadget_get_frame(struct usb_gadget *gadget)
-{
- struct musb *musb = gadget_to_musb(gadget);
-
- return (int)musb_readw(musb->mregs, MUSB_FRAME);
-}
-
-static int musb_gadget_wakeup(struct usb_gadget *gadget)
-{
-#ifndef __UBOOT__
- struct musb *musb = gadget_to_musb(gadget);
- void __iomem *mregs = musb->mregs;
- unsigned long flags;
- int status = -EINVAL;
- u8 power, devctl;
- int retries;
-
- spin_lock_irqsave(&musb->lock, flags);
-
- switch (musb->xceiv->state) {
- case OTG_STATE_B_PERIPHERAL:
- /* NOTE: OTG state machine doesn't include B_SUSPENDED;
- * that's part of the standard usb 1.1 state machine, and
- * doesn't affect OTG transitions.
- */
- if (musb->may_wakeup && musb->is_suspended)
- break;
- goto done;
- case OTG_STATE_B_IDLE:
- /* Start SRP ... OTG not required. */
- devctl = musb_readb(mregs, MUSB_DEVCTL);
- dev_dbg(musb->controller, "Sending SRP: devctl: %02x\n", devctl);
- devctl |= MUSB_DEVCTL_SESSION;
- musb_writeb(mregs, MUSB_DEVCTL, devctl);
- devctl = musb_readb(mregs, MUSB_DEVCTL);
- retries = 100;
- while (!(devctl & MUSB_DEVCTL_SESSION)) {
- devctl = musb_readb(mregs, MUSB_DEVCTL);
- if (retries-- < 1)
- break;
- }
- retries = 10000;
- while (devctl & MUSB_DEVCTL_SESSION) {
- devctl = musb_readb(mregs, MUSB_DEVCTL);
- if (retries-- < 1)
- break;
- }
-
- spin_unlock_irqrestore(&musb->lock, flags);
- otg_start_srp(musb->xceiv->otg);
- spin_lock_irqsave(&musb->lock, flags);
-
- /* Block idling for at least 1s */
- musb_platform_try_idle(musb,
- jiffies + msecs_to_jiffies(1 * HZ));
-
- status = 0;
- goto done;
- default:
- dev_dbg(musb->controller, "Unhandled wake: %s\n",
- otg_state_string(musb->xceiv->state));
- goto done;
- }
-
- status = 0;
-
- power = musb_readb(mregs, MUSB_POWER);
- power |= MUSB_POWER_RESUME;
- musb_writeb(mregs, MUSB_POWER, power);
- dev_dbg(musb->controller, "issue wakeup\n");
-
- /* FIXME do this next chunk in a timer callback, no udelay */
- mdelay(2);
-
- power = musb_readb(mregs, MUSB_POWER);
- power &= ~MUSB_POWER_RESUME;
- musb_writeb(mregs, MUSB_POWER, power);
-done:
- spin_unlock_irqrestore(&musb->lock, flags);
- return status;
-#else
- return 0;
-#endif
-}
-
-static int
-musb_gadget_set_self_powered(struct usb_gadget *gadget, int is_selfpowered)
-{
- struct musb *musb = gadget_to_musb(gadget);
-
- musb->is_self_powered = !!is_selfpowered;
- return 0;
-}
-
-static void musb_pullup(struct musb *musb, int is_on)
-{
- u8 power;
-
- power = musb_readb(musb->mregs, MUSB_POWER);
- if (is_on)
- power |= MUSB_POWER_SOFTCONN;
- else
- power &= ~MUSB_POWER_SOFTCONN;
-
- /* FIXME if on, HdrcStart; if off, HdrcStop */
-
- dev_dbg(musb->controller, "gadget D+ pullup %s\n",
- is_on ? "on" : "off");
- musb_writeb(musb->mregs, MUSB_POWER, power);
-}
-
-#if 0
-static int musb_gadget_vbus_session(struct usb_gadget *gadget, int is_active)
-{
- dev_dbg(musb->controller, "<= %s =>\n", __func__);
-
- /*
- * FIXME iff driver's softconnect flag is set (as it is during probe,
- * though that can clear it), just musb_pullup().
- */
-
- return -EINVAL;
-}
-#endif
-
-static int musb_gadget_vbus_draw(struct usb_gadget *gadget, unsigned mA)
-{
-#ifndef __UBOOT__
- struct musb *musb = gadget_to_musb(gadget);
-
- if (!musb->xceiv->set_power)
- return -EOPNOTSUPP;
- return usb_phy_set_power(musb->xceiv, mA);
-#else
- return 0;
-#endif
-}
-
-static int musb_gadget_pullup(struct usb_gadget *gadget, int is_on)
-{
- struct musb *musb = gadget_to_musb(gadget);
- unsigned long flags;
-
- is_on = !!is_on;
-
- pm_runtime_get_sync(musb->controller);
-
- /* NOTE: this assumes we are sensing vbus; we'd rather
- * not pullup unless the B-session is active.
- */
- spin_lock_irqsave(&musb->lock, flags);
- if (is_on != musb->softconnect) {
- musb->softconnect = is_on;
- musb_pullup(musb, is_on);
- }
- spin_unlock_irqrestore(&musb->lock, flags);
-
- pm_runtime_put(musb->controller);
-
- return 0;
-}
-
-#ifndef __UBOOT__
-static int musb_gadget_start(struct usb_gadget *g,
- struct usb_gadget_driver *driver);
-static int musb_gadget_stop(struct usb_gadget *g,
- struct usb_gadget_driver *driver);
-#endif
-
-static const struct usb_gadget_ops musb_gadget_operations = {
- .get_frame = musb_gadget_get_frame,
- .wakeup = musb_gadget_wakeup,
- .set_selfpowered = musb_gadget_set_self_powered,
- /* .vbus_session = musb_gadget_vbus_session, */
- .vbus_draw = musb_gadget_vbus_draw,
- .pullup = musb_gadget_pullup,
-#ifndef __UBOOT__
- .udc_start = musb_gadget_start,
- .udc_stop = musb_gadget_stop,
-#endif
-};
-
-/* ----------------------------------------------------------------------- */
-
-/* Registration */
-
-/* Only this registration code "knows" the rule (from USB standards)
- * about there being only one external upstream port. It assumes
- * all peripheral ports are external...
- */
-
-#ifndef __UBOOT__
-static void musb_gadget_release(struct device *dev)
-{
- /* kref_put(WHAT) */
- dev_dbg(dev, "%s\n", __func__);
-}
-#endif
-
-
-static void __devinit
-init_peripheral_ep(struct musb *musb, struct musb_ep *ep, u8 epnum, int is_in)
-{
- struct musb_hw_ep *hw_ep = musb->endpoints + epnum;
-
- memset(ep, 0, sizeof *ep);
-
- ep->current_epnum = epnum;
- ep->musb = musb;
- ep->hw_ep = hw_ep;
- ep->is_in = is_in;
-
- INIT_LIST_HEAD(&ep->req_list);
-
- sprintf(ep->name, "ep%d%s", epnum,
- (!epnum || hw_ep->is_shared_fifo) ? "" : (
- is_in ? "in" : "out"));
- ep->end_point.name = ep->name;
- INIT_LIST_HEAD(&ep->end_point.ep_list);
- if (!epnum) {
- ep->end_point.maxpacket = 64;
- ep->end_point.ops = &musb_g_ep0_ops;
- musb->g.ep0 = &ep->end_point;
- } else {
- if (is_in)
- ep->end_point.maxpacket = hw_ep->max_packet_sz_tx;
- else
- ep->end_point.maxpacket = hw_ep->max_packet_sz_rx;
- ep->end_point.ops = &musb_ep_ops;
- list_add_tail(&ep->end_point.ep_list, &musb->g.ep_list);
- }
-}
-
-/*
- * Initialize the endpoints exposed to peripheral drivers, with backlinks
- * to the rest of the driver state.
- */
-static inline void __devinit musb_g_init_endpoints(struct musb *musb)
-{
- u8 epnum;
- struct musb_hw_ep *hw_ep;
- unsigned count = 0;
-
- /* initialize endpoint list just once */
- INIT_LIST_HEAD(&(musb->g.ep_list));
-
- for (epnum = 0, hw_ep = musb->endpoints;
- epnum < musb->nr_endpoints;
- epnum++, hw_ep++) {
- if (hw_ep->is_shared_fifo /* || !epnum */) {
- init_peripheral_ep(musb, &hw_ep->ep_in, epnum, 0);
- count++;
- } else {
- if (hw_ep->max_packet_sz_tx) {
- init_peripheral_ep(musb, &hw_ep->ep_in,
- epnum, 1);
- count++;
- }
- if (hw_ep->max_packet_sz_rx) {
- init_peripheral_ep(musb, &hw_ep->ep_out,
- epnum, 0);
- count++;
- }
- }
- }
-}
-
-/* called once during driver setup to initialize and link into
- * the driver model; memory is zeroed.
- */
-int __devinit musb_gadget_setup(struct musb *musb)
-{
- int status;
-
- /* REVISIT minor race: if (erroneously) setting up two
- * musb peripherals at the same time, only the bus lock
- * is probably held.
- */
-
- musb->g.ops = &musb_gadget_operations;
-#ifndef __UBOOT__
- musb->g.max_speed = USB_SPEED_HIGH;
-#endif
- musb->g.speed = USB_SPEED_UNKNOWN;
-
-#ifndef __UBOOT__
- /* this "gadget" abstracts/virtualizes the controller */
- dev_set_name(&musb->g.dev, "gadget");
- musb->g.dev.parent = musb->controller;
- musb->g.dev.dma_mask = musb->controller->dma_mask;
- musb->g.dev.release = musb_gadget_release;
-#endif
- musb->g.name = musb_driver_name;
-
-#ifndef __UBOOT__
- if (is_otg_enabled(musb))
- musb->g.is_otg = 1;
-#endif
-
- musb_g_init_endpoints(musb);
-
- musb->is_active = 0;
- musb_platform_try_idle(musb, 0);
-
-#ifndef __UBOOT__
- status = device_register(&musb->g.dev);
- if (status != 0) {
- put_device(&musb->g.dev);
- return status;
- }
- status = usb_add_gadget_udc(musb->controller, &musb->g);
- if (status)
- goto err;
-#endif
-
- return 0;
-#ifndef __UBOOT__
-err:
- musb->g.dev.parent = NULL;
- device_unregister(&musb->g.dev);
- return status;
-#endif
-}
-
-void musb_gadget_cleanup(struct musb *musb)
-{
-#ifndef __UBOOT__
- usb_del_gadget_udc(&musb->g);
- if (musb->g.dev.parent)
- device_unregister(&musb->g.dev);
-#endif
-}
-
-/*
- * Register the gadget driver. Used by gadget drivers when
- * registering themselves with the controller.
- *
- * -EINVAL something went wrong (not driver)
- * -EBUSY another gadget is already using the controller
- * -ENOMEM no memory to perform the operation
- *
- * @param driver the gadget driver
- * @return <0 if error, 0 if everything is fine
- */
-#ifndef __UBOOT__
-static int musb_gadget_start(struct usb_gadget *g,
- struct usb_gadget_driver *driver)
-#else
-int musb_gadget_start(struct usb_gadget *g,
- struct usb_gadget_driver *driver)
-#endif
-{
- struct musb *musb = gadget_to_musb(g);
-#ifndef __UBOOT__
- struct usb_otg *otg = musb->xceiv->otg;
-#endif
- unsigned long flags;
- int retval = -EINVAL;
-
-#ifndef __UBOOT__
- if (driver->max_speed < USB_SPEED_HIGH)
- goto err0;
-#endif
-
- pm_runtime_get_sync(musb->controller);
-
-#ifndef __UBOOT__
- dev_dbg(musb->controller, "registering driver %s\n", driver->function);
-#endif
-
- musb->softconnect = 0;
- musb->gadget_driver = driver;
-
- spin_lock_irqsave(&musb->lock, flags);
- musb->is_active = 1;
-
-#ifndef __UBOOT__
- otg_set_peripheral(otg, &musb->g);
- musb->xceiv->state = OTG_STATE_B_IDLE;
-
- /*
- * FIXME this ignores the softconnect flag. Drivers are
- * allowed hold the peripheral inactive until for example
- * userspace hooks up printer hardware or DSP codecs, so
- * hosts only see fully functional devices.
- */
-
- if (!is_otg_enabled(musb))
-#endif
- musb_start(musb);
-
- spin_unlock_irqrestore(&musb->lock, flags);
-
-#ifndef __UBOOT__
- if (is_otg_enabled(musb)) {
- struct usb_hcd *hcd = musb_to_hcd(musb);
-
- dev_dbg(musb->controller, "OTG startup...\n");
-
- /* REVISIT: funcall to other code, which also
- * handles power budgeting ... this way also
- * ensures HdrcStart is indirectly called.
- */
- retval = usb_add_hcd(musb_to_hcd(musb), 0, 0);
- if (retval < 0) {
- dev_dbg(musb->controller, "add_hcd failed, %d\n", retval);
- goto err2;
- }
-
- if ((musb->xceiv->last_event == USB_EVENT_ID)
- && otg->set_vbus)
- otg_set_vbus(otg, 1);
-
- hcd->self.uses_pio_for_control = 1;
- }
- if (musb->xceiv->last_event == USB_EVENT_NONE)
- pm_runtime_put(musb->controller);
-#endif
-
- return 0;
-
-#ifndef __UBOOT__
-err2:
- if (!is_otg_enabled(musb))
- musb_stop(musb);
-err0:
- return retval;
-#endif
-}
-
-#ifndef __UBOOT__
-static void stop_activity(struct musb *musb, struct usb_gadget_driver *driver)
-{
- int i;
- struct musb_hw_ep *hw_ep;
-
- /* don't disconnect if it's not connected */
- if (musb->g.speed == USB_SPEED_UNKNOWN)
- driver = NULL;
- else
- musb->g.speed = USB_SPEED_UNKNOWN;
-
- /* deactivate the hardware */
- if (musb->softconnect) {
- musb->softconnect = 0;
- musb_pullup(musb, 0);
- }
- musb_stop(musb);
-
- /* killing any outstanding requests will quiesce the driver;
- * then report disconnect
- */
- if (driver) {
- for (i = 0, hw_ep = musb->endpoints;
- i < musb->nr_endpoints;
- i++, hw_ep++) {
- musb_ep_select(musb->mregs, i);
- if (hw_ep->is_shared_fifo /* || !epnum */) {
- nuke(&hw_ep->ep_in, -ESHUTDOWN);
- } else {
- if (hw_ep->max_packet_sz_tx)
- nuke(&hw_ep->ep_in, -ESHUTDOWN);
- if (hw_ep->max_packet_sz_rx)
- nuke(&hw_ep->ep_out, -ESHUTDOWN);
- }
- }
- }
-}
-
-/*
- * Unregister the gadget driver. Used by gadget drivers when
- * unregistering themselves from the controller.
- *
- * @param driver the gadget driver to unregister
- */
-static int musb_gadget_stop(struct usb_gadget *g,
- struct usb_gadget_driver *driver)
-{
- struct musb *musb = gadget_to_musb(g);
- unsigned long flags;
-
- if (musb->xceiv->last_event == USB_EVENT_NONE)
- pm_runtime_get_sync(musb->controller);
-
- /*
- * REVISIT always use otg_set_peripheral() here too;
- * this needs to shut down the OTG engine.
- */
-
- spin_lock_irqsave(&musb->lock, flags);
-
- musb_hnp_stop(musb);
-
- (void) musb_gadget_vbus_draw(&musb->g, 0);
-
- musb->xceiv->state = OTG_STATE_UNDEFINED;
- stop_activity(musb, driver);
- otg_set_peripheral(musb->xceiv->otg, NULL);
-
- dev_dbg(musb->controller, "unregistering driver %s\n", driver->function);
-
- musb->is_active = 0;
- musb_platform_try_idle(musb, 0);
- spin_unlock_irqrestore(&musb->lock, flags);
-
- if (is_otg_enabled(musb)) {
- usb_remove_hcd(musb_to_hcd(musb));
- /* FIXME we need to be able to register another
- * gadget driver here and have everything work;
- * that currently misbehaves.
- */
- }
-
- if (!is_otg_enabled(musb))
- musb_stop(musb);
-
- pm_runtime_put(musb->controller);
-
- return 0;
-}
-#endif
-
-/* ----------------------------------------------------------------------- */
-
-/* lifecycle operations called through plat_uds.c */
-
-void musb_g_resume(struct musb *musb)
-{
-#ifndef __UBOOT__
- musb->is_suspended = 0;
- switch (musb->xceiv->state) {
- case OTG_STATE_B_IDLE:
- break;
- case OTG_STATE_B_WAIT_ACON:
- case OTG_STATE_B_PERIPHERAL:
- musb->is_active = 1;
- if (musb->gadget_driver && musb->gadget_driver->resume) {
- spin_unlock(&musb->lock);
- musb->gadget_driver->resume(&musb->g);
- spin_lock(&musb->lock);
- }
- break;
- default:
- WARNING("unhandled RESUME transition (%s)\n",
- otg_state_string(musb->xceiv->state));
- }
-#endif
-}
-
-/* called when SOF packets stop for 3+ msec */
-void musb_g_suspend(struct musb *musb)
-{
-#ifndef __UBOOT__
- u8 devctl;
-
- devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
- dev_dbg(musb->controller, "devctl %02x\n", devctl);
-
- switch (musb->xceiv->state) {
- case OTG_STATE_B_IDLE:
- if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS)
- musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
- break;
- case OTG_STATE_B_PERIPHERAL:
- musb->is_suspended = 1;
- if (musb->gadget_driver && musb->gadget_driver->suspend) {
- spin_unlock(&musb->lock);
- musb->gadget_driver->suspend(&musb->g);
- spin_lock(&musb->lock);
- }
- break;
- default:
- /* REVISIT if B_HOST, clear DEVCTL.HOSTREQ;
- * A_PERIPHERAL may need care too
- */
- WARNING("unhandled SUSPEND transition (%s)\n",
- otg_state_string(musb->xceiv->state));
- }
-#endif
-}
-
-/* Called during SRP */
-void musb_g_wakeup(struct musb *musb)
-{
- musb_gadget_wakeup(&musb->g);
-}
-
-/* called when VBUS drops below session threshold, and in other cases */
-void musb_g_disconnect(struct musb *musb)
-{
- void __iomem *mregs = musb->mregs;
- u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
-
- dev_dbg(musb->controller, "devctl %02x\n", devctl);
-
- /* clear HR */
- musb_writeb(mregs, MUSB_DEVCTL, devctl & MUSB_DEVCTL_SESSION);
-
- /* don't draw vbus until new b-default session */
- (void) musb_gadget_vbus_draw(&musb->g, 0);
-
- musb->g.speed = USB_SPEED_UNKNOWN;
- if (musb->gadget_driver && musb->gadget_driver->disconnect) {
- spin_unlock(&musb->lock);
- musb->gadget_driver->disconnect(&musb->g);
- spin_lock(&musb->lock);
- }
-
-#ifndef __UBOOT__
- switch (musb->xceiv->state) {
- default:
- dev_dbg(musb->controller, "Unhandled disconnect %s, setting a_idle\n",
- otg_state_string(musb->xceiv->state));
- musb->xceiv->state = OTG_STATE_A_IDLE;
- MUSB_HST_MODE(musb);
- break;
- case OTG_STATE_A_PERIPHERAL:
- musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
- MUSB_HST_MODE(musb);
- break;
- case OTG_STATE_B_WAIT_ACON:
- case OTG_STATE_B_HOST:
- case OTG_STATE_B_PERIPHERAL:
- case OTG_STATE_B_IDLE:
- musb->xceiv->state = OTG_STATE_B_IDLE;
- break;
- case OTG_STATE_B_SRP_INIT:
- break;
- }
-#endif
-
- musb->is_active = 0;
-}
-
-void musb_g_reset(struct musb *musb)
-__releases(musb->lock)
-__acquires(musb->lock)
-{
- void __iomem *mbase = musb->mregs;
- u8 devctl = musb_readb(mbase, MUSB_DEVCTL);
- u8 power;
-
-#ifndef __UBOOT__
- dev_dbg(musb->controller, "<== %s addr=%x driver '%s'\n",
- (devctl & MUSB_DEVCTL_BDEVICE)
- ? "B-Device" : "A-Device",
- musb_readb(mbase, MUSB_FADDR),
- musb->gadget_driver
- ? musb->gadget_driver->driver.name
- : NULL
- );
-#endif
-
- /* report disconnect, if we didn't already (flushing EP state) */
- if (musb->g.speed != USB_SPEED_UNKNOWN)
- musb_g_disconnect(musb);
-
- /* clear HR */
- else if (devctl & MUSB_DEVCTL_HR)
- musb_writeb(mbase, MUSB_DEVCTL, MUSB_DEVCTL_SESSION);
-
-
- /* what speed did we negotiate? */
- power = musb_readb(mbase, MUSB_POWER);
- musb->g.speed = (power & MUSB_POWER_HSMODE)
- ? USB_SPEED_HIGH : USB_SPEED_FULL;
-
- /* start in USB_STATE_DEFAULT */
- musb->is_active = 1;
- musb->is_suspended = 0;
- MUSB_DEV_MODE(musb);
- musb->address = 0;
- musb->ep0_state = MUSB_EP0_STAGE_SETUP;
-
- musb->may_wakeup = 0;
- musb->g.b_hnp_enable = 0;
- musb->g.a_alt_hnp_support = 0;
- musb->g.a_hnp_support = 0;
-
-#ifndef __UBOOT__
- /* Normal reset, as B-Device;
- * or else after HNP, as A-Device
- */
- if (devctl & MUSB_DEVCTL_BDEVICE) {
- musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
- musb->g.is_a_peripheral = 0;
- } else if (is_otg_enabled(musb)) {
- musb->xceiv->state = OTG_STATE_A_PERIPHERAL;
- musb->g.is_a_peripheral = 1;
- } else
- WARN_ON(1);
-
- /* start with default limits on VBUS power draw */
- (void) musb_gadget_vbus_draw(&musb->g,
- is_otg_enabled(musb) ? 8 : 100);
-#endif
-}
diff --git a/drivers/usb/musb/musb_gadget.h b/drivers/usb/musb/musb_gadget.h
deleted file mode 100644
index 392f701..0000000
--- a/drivers/usb/musb/musb_gadget.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * MUSB OTG driver peripheral defines
- *
- * Copyright 2005 Mentor Graphics Corporation
- * Copyright (C) 2005-2006 by Texas Instruments
- * Copyright (C) 2006-2007 Nokia Corporation
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
- * NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#ifndef __MUSB_GADGET_H
-#define __MUSB_GADGET_H
-
-#include <linux/list.h>
-#ifdef __UBOOT__
-#include <asm/byteorder.h>
-#include <asm/errno.h>
-#include <linux/usb/ch9.h>
-#include <linux/usb/gadget.h>
-#endif
-
-enum buffer_map_state {
- UN_MAPPED = 0,
- PRE_MAPPED,
- MUSB_MAPPED
-};
-
-struct musb_request {
- struct usb_request request;
- struct list_head list;
- struct musb_ep *ep;
- struct musb *musb;
- u8 tx; /* endpoint direction */
- u8 epnum;
- enum buffer_map_state map_state;
-};
-
-static inline struct musb_request *to_musb_request(struct usb_request *req)
-{
- return req ? container_of(req, struct musb_request, request) : NULL;
-}
-
-extern struct usb_request *
-musb_alloc_request(struct usb_ep *ep, gfp_t gfp_flags);
-extern void musb_free_request(struct usb_ep *ep, struct usb_request *req);
-
-
-/*
- * struct musb_ep - peripheral side view of endpoint rx or tx side
- */
-struct musb_ep {
- /* stuff towards the head is basically write-once. */
- struct usb_ep end_point;
- char name[12];
- struct musb_hw_ep *hw_ep;
- struct musb *musb;
- u8 current_epnum;
-
- /* ... when enabled/disabled ... */
- u8 type;
- u8 is_in;
- u16 packet_sz;
- const struct usb_endpoint_descriptor *desc;
- struct dma_channel *dma;
-
- /* later things are modified based on usage */
- struct list_head req_list;
-
- u8 wedged;
-
- /* true if lock must be dropped but req_list may not be advanced */
- u8 busy;
-
- u8 hb_mult;
-};
-
-static inline struct musb_ep *to_musb_ep(struct usb_ep *ep)
-{
- return ep ? container_of(ep, struct musb_ep, end_point) : NULL;
-}
-
-static inline struct musb_request *next_request(struct musb_ep *ep)
-{
- struct list_head *queue = &ep->req_list;
-
- if (list_empty(queue))
- return NULL;
- return container_of(queue->next, struct musb_request, list);
-}
-
-extern void musb_g_tx(struct musb *musb, u8 epnum);
-extern void musb_g_rx(struct musb *musb, u8 epnum);
-
-extern const struct usb_ep_ops musb_g_ep0_ops;
-
-extern int musb_gadget_setup(struct musb *);
-extern void musb_gadget_cleanup(struct musb *);
-
-extern void musb_g_giveback(struct musb_ep *, struct usb_request *, int);
-
-extern void musb_ep_restart(struct musb *, struct musb_request *);
-
-#ifdef __UBOOT__
-int musb_gadget_start(struct usb_gadget *g, struct usb_gadget_driver *driver);
-#endif
-#endif /* __MUSB_GADGET_H */
diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c
deleted file mode 100644
index 6599d38..0000000
--- a/drivers/usb/musb/musb_gadget_ep0.c
+++ /dev/null
@@ -1,1089 +0,0 @@
-/*
- * MUSB OTG peripheral driver ep0 handling
- *
- * Copyright 2005 Mentor Graphics Corporation
- * Copyright (C) 2005-2006 by Texas Instruments
- * Copyright (C) 2006-2007 Nokia Corporation
- * Copyright (C) 2008-2009 MontaVista Software, Inc. <source@mvista.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
- * NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#define __UBOOT__
-#ifndef __UBOOT__
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/timer.h>
-#include <linux/spinlock.h>
-#include <linux/device.h>
-#include <linux/interrupt.h>
-#else
-#include <common.h>
-#include "linux-compat.h"
-#endif
-
-#include "musb_core.h"
-
-/* ep0 is always musb->endpoints[0].ep_in */
-#define next_ep0_request(musb) next_in_request(&(musb)->endpoints[0])
-
-/*
- * locking note: we use only the controller lock, for simpler correctness.
- * It's always held with IRQs blocked.
- *
- * It protects the ep0 request queue as well as ep0_state, not just the
- * controller and indexed registers. And that lock stays held unless it
- * needs to be dropped to allow reentering this driver ... like upcalls to
- * the gadget driver, or adjusting endpoint halt status.
- */
-
-static char *decode_ep0stage(u8 stage)
-{
- switch (stage) {
- case MUSB_EP0_STAGE_IDLE: return "idle";
- case MUSB_EP0_STAGE_SETUP: return "setup";
- case MUSB_EP0_STAGE_TX: return "in";
- case MUSB_EP0_STAGE_RX: return "out";
- case MUSB_EP0_STAGE_ACKWAIT: return "wait";
- case MUSB_EP0_STAGE_STATUSIN: return "in/status";
- case MUSB_EP0_STAGE_STATUSOUT: return "out/status";
- default: return "?";
- }
-}
-
-/* handle a standard GET_STATUS request
- * Context: caller holds controller lock
- */
-static int service_tx_status_request(
- struct musb *musb,
- const struct usb_ctrlrequest *ctrlrequest)
-{
- void __iomem *mbase = musb->mregs;
- int handled = 1;
- u8 result[2], epnum = 0;
- const u8 recip = ctrlrequest->bRequestType & USB_RECIP_MASK;
-
- result[1] = 0;
-
- switch (recip) {
- case USB_RECIP_DEVICE:
- result[0] = musb->is_self_powered << USB_DEVICE_SELF_POWERED;
- result[0] |= musb->may_wakeup << USB_DEVICE_REMOTE_WAKEUP;
- if (musb->g.is_otg) {
- result[0] |= musb->g.b_hnp_enable
- << USB_DEVICE_B_HNP_ENABLE;
- result[0] |= musb->g.a_alt_hnp_support
- << USB_DEVICE_A_ALT_HNP_SUPPORT;
- result[0] |= musb->g.a_hnp_support
- << USB_DEVICE_A_HNP_SUPPORT;
- }
- break;
-
- case USB_RECIP_INTERFACE:
- result[0] = 0;
- break;
-
- case USB_RECIP_ENDPOINT: {
- int is_in;
- struct musb_ep *ep;
- u16 tmp;
- void __iomem *regs;
-
- epnum = (u8) ctrlrequest->wIndex;
- if (!epnum) {
- result[0] = 0;
- break;
- }
-
- is_in = epnum & USB_DIR_IN;
- if (is_in) {
- epnum &= 0x0f;
- ep = &musb->endpoints[epnum].ep_in;
- } else {
- ep = &musb->endpoints[epnum].ep_out;
- }
- regs = musb->endpoints[epnum].regs;
-
- if (epnum >= MUSB_C_NUM_EPS || !ep->desc) {
- handled = -EINVAL;
- break;
- }
-
- musb_ep_select(mbase, epnum);
- if (is_in)
- tmp = musb_readw(regs, MUSB_TXCSR)
- & MUSB_TXCSR_P_SENDSTALL;
- else
- tmp = musb_readw(regs, MUSB_RXCSR)
- & MUSB_RXCSR_P_SENDSTALL;
- musb_ep_select(mbase, 0);
-
- result[0] = tmp ? 1 : 0;
- } break;
-
- default:
- /* class, vendor, etc ... delegate */
- handled = 0;
- break;
- }
-
- /* fill up the fifo; caller updates csr0 */
- if (handled > 0) {
- u16 len = le16_to_cpu(ctrlrequest->wLength);
-
- if (len > 2)
- len = 2;
- musb_write_fifo(&musb->endpoints[0], len, result);
- }
-
- return handled;
-}
-
-/*
- * handle a control-IN request, the end0 buffer contains the current request
- * that is supposed to be a standard control request. Assumes the fifo to
- * be at least 2 bytes long.
- *
- * @return 0 if the request was NOT HANDLED,
- * < 0 when error
- * > 0 when the request is processed
- *
- * Context: caller holds controller lock
- */
-static int
-service_in_request(struct musb *musb, const struct usb_ctrlrequest *ctrlrequest)
-{
- int handled = 0; /* not handled */
-
- if ((ctrlrequest->bRequestType & USB_TYPE_MASK)
- == USB_TYPE_STANDARD) {
- switch (ctrlrequest->bRequest) {
- case USB_REQ_GET_STATUS:
- handled = service_tx_status_request(musb,
- ctrlrequest);
- break;
-
- /* case USB_REQ_SYNC_FRAME: */
-
- default:
- break;
- }
- }
- return handled;
-}
-
-/*
- * Context: caller holds controller lock
- */
-static void musb_g_ep0_giveback(struct musb *musb, struct usb_request *req)
-{
- musb_g_giveback(&musb->endpoints[0].ep_in, req, 0);
-}
-
-/*
- * Tries to start B-device HNP negotiation if enabled via sysfs
- */
-static inline void musb_try_b_hnp_enable(struct musb *musb)
-{
- void __iomem *mbase = musb->mregs;
- u8 devctl;
-
- dev_dbg(musb->controller, "HNP: Setting HR\n");
- devctl = musb_readb(mbase, MUSB_DEVCTL);
- musb_writeb(mbase, MUSB_DEVCTL, devctl | MUSB_DEVCTL_HR);
-}
-
-/*
- * Handle all control requests with no DATA stage, including standard
- * requests such as:
- * USB_REQ_SET_CONFIGURATION, USB_REQ_SET_INTERFACE, unrecognized
- * always delegated to the gadget driver
- * USB_REQ_SET_ADDRESS, USB_REQ_CLEAR_FEATURE, USB_REQ_SET_FEATURE
- * always handled here, except for class/vendor/... features
- *
- * Context: caller holds controller lock
- */
-static int
-service_zero_data_request(struct musb *musb,
- struct usb_ctrlrequest *ctrlrequest)
-__releases(musb->lock)
-__acquires(musb->lock)
-{
- int handled = -EINVAL;
- void __iomem *mbase = musb->mregs;
- const u8 recip = ctrlrequest->bRequestType & USB_RECIP_MASK;
-
- /* the gadget driver handles everything except what we MUST handle */
- if ((ctrlrequest->bRequestType & USB_TYPE_MASK)
- == USB_TYPE_STANDARD) {
- switch (ctrlrequest->bRequest) {
- case USB_REQ_SET_ADDRESS:
- /* change it after the status stage */
- musb->set_address = true;
- musb->address = (u8) (ctrlrequest->wValue & 0x7f);
- handled = 1;
- break;
-
- case USB_REQ_CLEAR_FEATURE:
- switch (recip) {
- case USB_RECIP_DEVICE:
- if (ctrlrequest->wValue
- != USB_DEVICE_REMOTE_WAKEUP)
- break;
- musb->may_wakeup = 0;
- handled = 1;
- break;
- case USB_RECIP_INTERFACE:
- break;
- case USB_RECIP_ENDPOINT:{
- const u8 epnum =
- ctrlrequest->wIndex & 0x0f;
- struct musb_ep *musb_ep;
- struct musb_hw_ep *ep;
- struct musb_request *request;
- void __iomem *regs;
- int is_in;
- u16 csr;
-
- if (epnum == 0 || epnum >= MUSB_C_NUM_EPS ||
- ctrlrequest->wValue != USB_ENDPOINT_HALT)
- break;
-
- ep = musb->endpoints + epnum;
- regs = ep->regs;
- is_in = ctrlrequest->wIndex & USB_DIR_IN;
- if (is_in)
- musb_ep = &ep->ep_in;
- else
- musb_ep = &ep->ep_out;
- if (!musb_ep->desc)
- break;
-
- handled = 1;
- /* Ignore request if endpoint is wedged */
- if (musb_ep->wedged)
- break;
-
- musb_ep_select(mbase, epnum);
- if (is_in) {
- csr = musb_readw(regs, MUSB_TXCSR);
- csr |= MUSB_TXCSR_CLRDATATOG |
- MUSB_TXCSR_P_WZC_BITS;
- csr &= ~(MUSB_TXCSR_P_SENDSTALL |
- MUSB_TXCSR_P_SENTSTALL |
- MUSB_TXCSR_TXPKTRDY);
- musb_writew(regs, MUSB_TXCSR, csr);
- } else {
- csr = musb_readw(regs, MUSB_RXCSR);
- csr |= MUSB_RXCSR_CLRDATATOG |
- MUSB_RXCSR_P_WZC_BITS;
- csr &= ~(MUSB_RXCSR_P_SENDSTALL |
- MUSB_RXCSR_P_SENTSTALL);
- musb_writew(regs, MUSB_RXCSR, csr);
- }
-
- /* Maybe start the first request in the queue */
- request = next_request(musb_ep);
- if (!musb_ep->busy && request) {
- dev_dbg(musb->controller, "restarting the request\n");
- musb_ep_restart(musb, request);
- }
-
- /* select ep0 again */
- musb_ep_select(mbase, 0);
- } break;
- default:
- /* class, vendor, etc ... delegate */
- handled = 0;
- break;
- }
- break;
-
- case USB_REQ_SET_FEATURE:
- switch (recip) {
- case USB_RECIP_DEVICE:
- handled = 1;
- switch (ctrlrequest->wValue) {
- case USB_DEVICE_REMOTE_WAKEUP:
- musb->may_wakeup = 1;
- break;
- case USB_DEVICE_TEST_MODE:
- if (musb->g.speed != USB_SPEED_HIGH)
- goto stall;
- if (ctrlrequest->wIndex & 0xff)
- goto stall;
-
- switch (ctrlrequest->wIndex >> 8) {
- case 1:
- pr_debug("TEST_J\n");
- /* TEST_J */
- musb->test_mode_nr =
- MUSB_TEST_J;
- break;
- case 2:
- /* TEST_K */
- pr_debug("TEST_K\n");
- musb->test_mode_nr =
- MUSB_TEST_K;
- break;
- case 3:
- /* TEST_SE0_NAK */
- pr_debug("TEST_SE0_NAK\n");
- musb->test_mode_nr =
- MUSB_TEST_SE0_NAK;
- break;
- case 4:
- /* TEST_PACKET */
- pr_debug("TEST_PACKET\n");
- musb->test_mode_nr =
- MUSB_TEST_PACKET;
- break;
-
- case 0xc0:
- /* TEST_FORCE_HS */
- pr_debug("TEST_FORCE_HS\n");
- musb->test_mode_nr =
- MUSB_TEST_FORCE_HS;
- break;
- case 0xc1:
- /* TEST_FORCE_FS */
- pr_debug("TEST_FORCE_FS\n");
- musb->test_mode_nr =
- MUSB_TEST_FORCE_FS;
- break;
- case 0xc2:
- /* TEST_FIFO_ACCESS */
- pr_debug("TEST_FIFO_ACCESS\n");
- musb->test_mode_nr =
- MUSB_TEST_FIFO_ACCESS;
- break;
- case 0xc3:
- /* TEST_FORCE_HOST */
- pr_debug("TEST_FORCE_HOST\n");
- musb->test_mode_nr =
- MUSB_TEST_FORCE_HOST;
- break;
- default:
- goto stall;
- }
-
- /* enter test mode after irq */
- if (handled > 0)
- musb->test_mode = true;
- break;
- case USB_DEVICE_B_HNP_ENABLE:
- if (!musb->g.is_otg)
- goto stall;
- musb->g.b_hnp_enable = 1;
- musb_try_b_hnp_enable(musb);
- break;
- case USB_DEVICE_A_HNP_SUPPORT:
- if (!musb->g.is_otg)
- goto stall;
- musb->g.a_hnp_support = 1;
- break;
- case USB_DEVICE_A_ALT_HNP_SUPPORT:
- if (!musb->g.is_otg)
- goto stall;
- musb->g.a_alt_hnp_support = 1;
- break;
- case USB_DEVICE_DEBUG_MODE:
- handled = 0;
- break;
-stall:
- default:
- handled = -EINVAL;
- break;
- }
- break;
-
- case USB_RECIP_INTERFACE:
- break;
-
- case USB_RECIP_ENDPOINT:{
- const u8 epnum =
- ctrlrequest->wIndex & 0x0f;
- struct musb_ep *musb_ep;
- struct musb_hw_ep *ep;
- void __iomem *regs;
- int is_in;
- u16 csr;
-
- if (epnum == 0 || epnum >= MUSB_C_NUM_EPS ||
- ctrlrequest->wValue != USB_ENDPOINT_HALT)
- break;
-
- ep = musb->endpoints + epnum;
- regs = ep->regs;
- is_in = ctrlrequest->wIndex & USB_DIR_IN;
- if (is_in)
- musb_ep = &ep->ep_in;
- else
- musb_ep = &ep->ep_out;
- if (!musb_ep->desc)
- break;
-
- musb_ep_select(mbase, epnum);
- if (is_in) {
- csr = musb_readw(regs, MUSB_TXCSR);
- if (csr & MUSB_TXCSR_FIFONOTEMPTY)
- csr |= MUSB_TXCSR_FLUSHFIFO;
- csr |= MUSB_TXCSR_P_SENDSTALL
- | MUSB_TXCSR_CLRDATATOG
- | MUSB_TXCSR_P_WZC_BITS;
- musb_writew(regs, MUSB_TXCSR, csr);
- } else {
- csr = musb_readw(regs, MUSB_RXCSR);
- csr |= MUSB_RXCSR_P_SENDSTALL
- | MUSB_RXCSR_FLUSHFIFO
- | MUSB_RXCSR_CLRDATATOG
- | MUSB_RXCSR_P_WZC_BITS;
- musb_writew(regs, MUSB_RXCSR, csr);
- }
-
- /* select ep0 again */
- musb_ep_select(mbase, 0);
- handled = 1;
- } break;
-
- default:
- /* class, vendor, etc ... delegate */
- handled = 0;
- break;
- }
- break;
- default:
- /* delegate SET_CONFIGURATION, etc */
- handled = 0;
- }
- } else
- handled = 0;
- return handled;
-}
-
-/* we have an ep0out data packet
- * Context: caller holds controller lock
- */
-static void ep0_rxstate(struct musb *musb)
-{
- void __iomem *regs = musb->control_ep->regs;
- struct musb_request *request;
- struct usb_request *req;
- u16 count, csr;
-
- request = next_ep0_request(musb);
- req = &request->request;
-
- /* read packet and ack; or stall because of gadget driver bug:
- * should have provided the rx buffer before setup() returned.
- */
- if (req) {
- void *buf = req->buf + req->actual;
- unsigned len = req->length - req->actual;
-
- /* read the buffer */
- count = musb_readb(regs, MUSB_COUNT0);
- if (count > len) {
- req->status = -EOVERFLOW;
- count = len;
- }
- musb_read_fifo(&musb->endpoints[0], count, buf);
- req->actual += count;
- csr = MUSB_CSR0_P_SVDRXPKTRDY;
- if (count < 64 || req->actual == req->length) {
- musb->ep0_state = MUSB_EP0_STAGE_STATUSIN;
- csr |= MUSB_CSR0_P_DATAEND;
- } else
- req = NULL;
- } else
- csr = MUSB_CSR0_P_SVDRXPKTRDY | MUSB_CSR0_P_SENDSTALL;
-
-
- /* Completion handler may choose to stall, e.g. because the
- * message just received holds invalid data.
- */
- if (req) {
- musb->ackpend = csr;
- musb_g_ep0_giveback(musb, req);
- if (!musb->ackpend)
- return;
- musb->ackpend = 0;
- }
- musb_ep_select(musb->mregs, 0);
- musb_writew(regs, MUSB_CSR0, csr);
-}
-
-/*
- * transmitting to the host (IN), this code might be called from IRQ
- * and from kernel thread.
- *
- * Context: caller holds controller lock
- */
-static void ep0_txstate(struct musb *musb)
-{
- void __iomem *regs = musb->control_ep->regs;
- struct musb_request *req = next_ep0_request(musb);
- struct usb_request *request;
- u16 csr = MUSB_CSR0_TXPKTRDY;
- u8 *fifo_src;
- u8 fifo_count;
-
- if (!req) {
- /* WARN_ON(1); */
- dev_dbg(musb->controller, "odd; csr0 %04x\n", musb_readw(regs, MUSB_CSR0));
- return;
- }
-
- request = &req->request;
-
- /* load the data */
- fifo_src = (u8 *) request->buf + request->actual;
- fifo_count = min((unsigned) MUSB_EP0_FIFOSIZE,
- request->length - request->actual);
- musb_write_fifo(&musb->endpoints[0], fifo_count, fifo_src);
- request->actual += fifo_count;
-
- /* update the flags */
- if (fifo_count < MUSB_MAX_END0_PACKET
- || (request->actual == request->length
- && !request->zero)) {
- musb->ep0_state = MUSB_EP0_STAGE_STATUSOUT;
- csr |= MUSB_CSR0_P_DATAEND;
- } else
- request = NULL;
-
- /* report completions as soon as the fifo's loaded; there's no
- * win in waiting till this last packet gets acked. (other than
- * very precise fault reporting, needed by USB TMC; possible with
- * this hardware, but not usable from portable gadget drivers.)
- */
- if (request) {
- musb->ackpend = csr;
- musb_g_ep0_giveback(musb, request);
- if (!musb->ackpend)
- return;
- musb->ackpend = 0;
- }
-
- /* send it out, triggering a "txpktrdy cleared" irq */
- musb_ep_select(musb->mregs, 0);
- musb_writew(regs, MUSB_CSR0, csr);
-}
-
-/*
- * Read a SETUP packet (struct usb_ctrlrequest) from the hardware.
- * Fields are left in USB byte-order.
- *
- * Context: caller holds controller lock.
- */
-static void
-musb_read_setup(struct musb *musb, struct usb_ctrlrequest *req)
-{
- struct musb_request *r;
- void __iomem *regs = musb->control_ep->regs;
-
- musb_read_fifo(&musb->endpoints[0], sizeof *req, (u8 *)req);
-
- /* NOTE: earlier 2.6 versions changed setup packets to host
- * order, but now USB packets always stay in USB byte order.
- */
- dev_dbg(musb->controller, "SETUP req%02x.%02x v%04x i%04x l%d\n",
- req->bRequestType,
- req->bRequest,
- le16_to_cpu(req->wValue),
- le16_to_cpu(req->wIndex),
- le16_to_cpu(req->wLength));
-
- /* clean up any leftover transfers */
- r = next_ep0_request(musb);
- if (r)
- musb_g_ep0_giveback(musb, &r->request);
-
- /* For zero-data requests we want to delay the STATUS stage to
- * avoid SETUPEND errors. If we read data (OUT), delay accepting
- * packets until there's a buffer to store them in.
- *
- * If we write data, the controller acts happier if we enable
- * the TX FIFO right away, and give the controller a moment
- * to switch modes...
- */
- musb->set_address = false;
- musb->ackpend = MUSB_CSR0_P_SVDRXPKTRDY;
- if (req->wLength == 0) {
- if (req->bRequestType & USB_DIR_IN)
- musb->ackpend |= MUSB_CSR0_TXPKTRDY;
- musb->ep0_state = MUSB_EP0_STAGE_ACKWAIT;
- } else if (req->bRequestType & USB_DIR_IN) {
- musb->ep0_state = MUSB_EP0_STAGE_TX;
- musb_writew(regs, MUSB_CSR0, MUSB_CSR0_P_SVDRXPKTRDY);
- while ((musb_readw(regs, MUSB_CSR0)
- & MUSB_CSR0_RXPKTRDY) != 0)
- cpu_relax();
- musb->ackpend = 0;
- } else
- musb->ep0_state = MUSB_EP0_STAGE_RX;
-}
-
-static int
-forward_to_driver(struct musb *musb, const struct usb_ctrlrequest *ctrlrequest)
-__releases(musb->lock)
-__acquires(musb->lock)
-{
- int retval;
- if (!musb->gadget_driver)
- return -EOPNOTSUPP;
- spin_unlock(&musb->lock);
- retval = musb->gadget_driver->setup(&musb->g, ctrlrequest);
- spin_lock(&musb->lock);
- return retval;
-}
-
-/*
- * Handle peripheral ep0 interrupt
- *
- * Context: irq handler; we won't re-enter the driver that way.
- */
-irqreturn_t musb_g_ep0_irq(struct musb *musb)
-{
- u16 csr;
- u16 len;
- void __iomem *mbase = musb->mregs;
- void __iomem *regs = musb->endpoints[0].regs;
- irqreturn_t retval = IRQ_NONE;
-
- musb_ep_select(mbase, 0); /* select ep0 */
- csr = musb_readw(regs, MUSB_CSR0);
- len = musb_readb(regs, MUSB_COUNT0);
-
- dev_dbg(musb->controller, "csr %04x, count %d, myaddr %d, ep0stage %s\n",
- csr, len,
- musb_readb(mbase, MUSB_FADDR),
- decode_ep0stage(musb->ep0_state));
-
- if (csr & MUSB_CSR0_P_DATAEND) {
- /*
- * If DATAEND is set we should not call the callback,
- * hence the status stage is not complete.
- */
- return IRQ_HANDLED;
- }
-
- /* I sent a stall.. need to acknowledge it now.. */
- if (csr & MUSB_CSR0_P_SENTSTALL) {
- musb_writew(regs, MUSB_CSR0,
- csr & ~MUSB_CSR0_P_SENTSTALL);
- retval = IRQ_HANDLED;
- musb->ep0_state = MUSB_EP0_STAGE_IDLE;
- csr = musb_readw(regs, MUSB_CSR0);
- }
-
- /* request ended "early" */
- if (csr & MUSB_CSR0_P_SETUPEND) {
- musb_writew(regs, MUSB_CSR0, MUSB_CSR0_P_SVDSETUPEND);
- retval = IRQ_HANDLED;
- /* Transition into the early status phase */
- switch (musb->ep0_state) {
- case MUSB_EP0_STAGE_TX:
- musb->ep0_state = MUSB_EP0_STAGE_STATUSOUT;
- break;
- case MUSB_EP0_STAGE_RX:
- musb->ep0_state = MUSB_EP0_STAGE_STATUSIN;
- break;
- default:
- ERR("SetupEnd came in a wrong ep0stage %s\n",
- decode_ep0stage(musb->ep0_state));
- }
- csr = musb_readw(regs, MUSB_CSR0);
- /* NOTE: request may need completion */
- }
-
- /* docs from Mentor only describe tx, rx, and idle/setup states.
- * we need to handle nuances around status stages, and also the
- * case where status and setup stages come back-to-back ...
- */
- switch (musb->ep0_state) {
-
- case MUSB_EP0_STAGE_TX:
- /* irq on clearing txpktrdy */
- if ((csr & MUSB_CSR0_TXPKTRDY) == 0) {
- ep0_txstate(musb);
- retval = IRQ_HANDLED;
- }
- break;
-
- case MUSB_EP0_STAGE_RX:
- /* irq on set rxpktrdy */
- if (csr & MUSB_CSR0_RXPKTRDY) {
- ep0_rxstate(musb);
- retval = IRQ_HANDLED;
- }
- break;
-
- case MUSB_EP0_STAGE_STATUSIN:
- /* end of sequence #2 (OUT/RX state) or #3 (no data) */
-
- /* update address (if needed) only @ the end of the
- * status phase per usb spec, which also guarantees
- * we get 10 msec to receive this irq... until this
- * is done we won't see the next packet.
- */
- if (musb->set_address) {
- musb->set_address = false;
- musb_writeb(mbase, MUSB_FADDR, musb->address);
- }
-
- /* enter test mode if needed (exit by reset) */
- else if (musb->test_mode) {
- dev_dbg(musb->controller, "entering TESTMODE\n");
-
- if (MUSB_TEST_PACKET == musb->test_mode_nr)
- musb_load_testpacket(musb);
-
- musb_writeb(mbase, MUSB_TESTMODE,
- musb->test_mode_nr);
- }
- /* FALLTHROUGH */
-
- case MUSB_EP0_STAGE_STATUSOUT:
- /* end of sequence #1: write to host (TX state) */
- {
- struct musb_request *req;
-
- req = next_ep0_request(musb);
- if (req)
- musb_g_ep0_giveback(musb, &req->request);
- }
-
- /*
- * In case when several interrupts can get coalesced,
- * check to see if we've already received a SETUP packet...
- */
- if (csr & MUSB_CSR0_RXPKTRDY)
- goto setup;
-
- retval = IRQ_HANDLED;
- musb->ep0_state = MUSB_EP0_STAGE_IDLE;
- break;
-
- case MUSB_EP0_STAGE_IDLE:
- /*
- * This state is typically (but not always) indiscernible
- * from the status states since the corresponding interrupts
- * tend to happen within too little period of time (with only
- * a zero-length packet in between) and so get coalesced...
- */
- retval = IRQ_HANDLED;
- musb->ep0_state = MUSB_EP0_STAGE_SETUP;
- /* FALLTHROUGH */
-
- case MUSB_EP0_STAGE_SETUP:
-setup:
- if (csr & MUSB_CSR0_RXPKTRDY) {
- struct usb_ctrlrequest setup;
- int handled = 0;
-
- if (len != 8) {
- ERR("SETUP packet len %d != 8 ?\n", len);
- break;
- }
- musb_read_setup(musb, &setup);
- retval = IRQ_HANDLED;
-
- /* sometimes the RESET won't be reported */
- if (unlikely(musb->g.speed == USB_SPEED_UNKNOWN)) {
- u8 power;
-
- printk(KERN_NOTICE "%s: peripheral reset "
- "irq lost!\n",
- musb_driver_name);
- power = musb_readb(mbase, MUSB_POWER);
- musb->g.speed = (power & MUSB_POWER_HSMODE)
- ? USB_SPEED_HIGH : USB_SPEED_FULL;
-
- }
-
- switch (musb->ep0_state) {
-
- /* sequence #3 (no data stage), includes requests
- * we can't forward (notably SET_ADDRESS and the
- * device/endpoint feature set/clear operations)
- * plus SET_CONFIGURATION and others we must
- */
- case MUSB_EP0_STAGE_ACKWAIT:
- handled = service_zero_data_request(
- musb, &setup);
-
- /*
- * We're expecting no data in any case, so
- * always set the DATAEND bit -- doing this
- * here helps avoid SetupEnd interrupt coming
- * in the idle stage when we're stalling...
- */
- musb->ackpend |= MUSB_CSR0_P_DATAEND;
-
- /* status stage might be immediate */
- if (handled > 0)
- musb->ep0_state =
- MUSB_EP0_STAGE_STATUSIN;
- break;
-
- /* sequence #1 (IN to host), includes GET_STATUS
- * requests that we can't forward, GET_DESCRIPTOR
- * and others that we must
- */
- case MUSB_EP0_STAGE_TX:
- handled = service_in_request(musb, &setup);
- if (handled > 0) {
- musb->ackpend = MUSB_CSR0_TXPKTRDY
- | MUSB_CSR0_P_DATAEND;
- musb->ep0_state =
- MUSB_EP0_STAGE_STATUSOUT;
- }
- break;
-
- /* sequence #2 (OUT from host), always forward */
- default: /* MUSB_EP0_STAGE_RX */
- break;
- }
-
- dev_dbg(musb->controller, "handled %d, csr %04x, ep0stage %s\n",
- handled, csr,
- decode_ep0stage(musb->ep0_state));
-
- /* unless we need to delegate this to the gadget
- * driver, we know how to wrap this up: csr0 has
- * not yet been written.
- */
- if (handled < 0)
- goto stall;
- else if (handled > 0)
- goto finish;
-
- handled = forward_to_driver(musb, &setup);
- if (handled < 0) {
- musb_ep_select(mbase, 0);
-stall:
- dev_dbg(musb->controller, "stall (%d)\n", handled);
- musb->ackpend |= MUSB_CSR0_P_SENDSTALL;
- musb->ep0_state = MUSB_EP0_STAGE_IDLE;
-finish:
- musb_writew(regs, MUSB_CSR0,
- musb->ackpend);
- musb->ackpend = 0;
- }
- }
- break;
-
- case MUSB_EP0_STAGE_ACKWAIT:
- /* This should not happen. But happens with tusb6010 with
- * g_file_storage and high speed. Do nothing.
- */
- retval = IRQ_HANDLED;
- break;
-
- default:
- /* "can't happen" */
- WARN_ON(1);
- musb_writew(regs, MUSB_CSR0, MUSB_CSR0_P_SENDSTALL);
- musb->ep0_state = MUSB_EP0_STAGE_IDLE;
- break;
- }
-
- return retval;
-}
-
-
-static int
-musb_g_ep0_enable(struct usb_ep *ep, const struct usb_endpoint_descriptor *desc)
-{
- /* always enabled */
- return -EINVAL;
-}
-
-static int musb_g_ep0_disable(struct usb_ep *e)
-{
- /* always enabled */
- return -EINVAL;
-}
-
-static int
-musb_g_ep0_queue(struct usb_ep *e, struct usb_request *r, gfp_t gfp_flags)
-{
- struct musb_ep *ep;
- struct musb_request *req;
- struct musb *musb;
- int status;
- unsigned long lockflags;
- void __iomem *regs;
-
- if (!e || !r)
- return -EINVAL;
-
- ep = to_musb_ep(e);
- musb = ep->musb;
- regs = musb->control_ep->regs;
-
- req = to_musb_request(r);
- req->musb = musb;
- req->request.actual = 0;
- req->request.status = -EINPROGRESS;
- req->tx = ep->is_in;
-
- spin_lock_irqsave(&musb->lock, lockflags);
-
- if (!list_empty(&ep->req_list)) {
- status = -EBUSY;
- goto cleanup;
- }
-
- switch (musb->ep0_state) {
- case MUSB_EP0_STAGE_RX: /* control-OUT data */
- case MUSB_EP0_STAGE_TX: /* control-IN data */
- case MUSB_EP0_STAGE_ACKWAIT: /* zero-length data */
- status = 0;
- break;
- default:
- dev_dbg(musb->controller, "ep0 request queued in state %d\n",
- musb->ep0_state);
- status = -EINVAL;
- goto cleanup;
- }
-
- /* add request to the list */
- list_add_tail(&req->list, &ep->req_list);
-
- dev_dbg(musb->controller, "queue to %s (%s), length=%d\n",
- ep->name, ep->is_in ? "IN/TX" : "OUT/RX",
- req->request.length);
-
- musb_ep_select(musb->mregs, 0);
-
- /* sequence #1, IN ... start writing the data */
- if (musb->ep0_state == MUSB_EP0_STAGE_TX)
- ep0_txstate(musb);
-
- /* sequence #3, no-data ... issue IN status */
- else if (musb->ep0_state == MUSB_EP0_STAGE_ACKWAIT) {
- if (req->request.length)
- status = -EINVAL;
- else {
- musb->ep0_state = MUSB_EP0_STAGE_STATUSIN;
- musb_writew(regs, MUSB_CSR0,
- musb->ackpend | MUSB_CSR0_P_DATAEND);
- musb->ackpend = 0;
- musb_g_ep0_giveback(ep->musb, r);
- }
-
- /* else for sequence #2 (OUT), caller provides a buffer
- * before the next packet arrives. deferred responses
- * (after SETUP is acked) are racey.
- */
- } else if (musb->ackpend) {
- musb_writew(regs, MUSB_CSR0, musb->ackpend);
- musb->ackpend = 0;
- }
-
-cleanup:
- spin_unlock_irqrestore(&musb->lock, lockflags);
- return status;
-}
-
-static int musb_g_ep0_dequeue(struct usb_ep *ep, struct usb_request *req)
-{
- /* we just won't support this */
- return -EINVAL;
-}
-
-static int musb_g_ep0_halt(struct usb_ep *e, int value)
-{
- struct musb_ep *ep;
- struct musb *musb;
- void __iomem *base, *regs;
- unsigned long flags;
- int status;
- u16 csr;
-
- if (!e || !value)
- return -EINVAL;
-
- ep = to_musb_ep(e);
- musb = ep->musb;
- base = musb->mregs;
- regs = musb->control_ep->regs;
- status = 0;
-
- spin_lock_irqsave(&musb->lock, flags);
-
- if (!list_empty(&ep->req_list)) {
- status = -EBUSY;
- goto cleanup;
- }
-
- musb_ep_select(base, 0);
- csr = musb->ackpend;
-
- switch (musb->ep0_state) {
-
- /* Stalls are usually issued after parsing SETUP packet, either
- * directly in irq context from setup() or else later.
- */
- case MUSB_EP0_STAGE_TX: /* control-IN data */
- case MUSB_EP0_STAGE_ACKWAIT: /* STALL for zero-length data */
- case MUSB_EP0_STAGE_RX: /* control-OUT data */
- csr = musb_readw(regs, MUSB_CSR0);
- /* FALLTHROUGH */
-
- /* It's also OK to issue stalls during callbacks when a non-empty
- * DATA stage buffer has been read (or even written).
- */
- case MUSB_EP0_STAGE_STATUSIN: /* control-OUT status */
- case MUSB_EP0_STAGE_STATUSOUT: /* control-IN status */
-
- csr |= MUSB_CSR0_P_SENDSTALL;
- musb_writew(regs, MUSB_CSR0, csr);
- musb->ep0_state = MUSB_EP0_STAGE_IDLE;
- musb->ackpend = 0;
- break;
- default:
- dev_dbg(musb->controller, "ep0 can't halt in state %d\n", musb->ep0_state);
- status = -EINVAL;
- }
-
-cleanup:
- spin_unlock_irqrestore(&musb->lock, flags);
- return status;
-}
-
-const struct usb_ep_ops musb_g_ep0_ops = {
- .enable = musb_g_ep0_enable,
- .disable = musb_g_ep0_disable,
- .alloc_request = musb_alloc_request,
- .free_request = musb_free_request,
- .queue = musb_g_ep0_queue,
- .dequeue = musb_g_ep0_dequeue,
- .set_halt = musb_g_ep0_halt,
-};
diff --git a/drivers/usb/musb/musb_uboot.c b/drivers/usb/musb/musb_uboot.c
deleted file mode 100644
index 0512680..0000000
--- a/drivers/usb/musb/musb_uboot.c
+++ /dev/null
@@ -1,239 +0,0 @@
-#include <common.h>
-#include <watchdog.h>
-#include <asm/errno.h>
-#include <linux/usb/ch9.h>
-#include <linux/usb/gadget.h>
-
-#define __UBOOT__
-#include <usb.h>
-#include "linux-compat.h"
-#include "usb-compat.h"
-#include "musb_core.h"
-#include "musb_host.h"
-#include "musb_gadget.h"
-
-#ifdef CONFIG_MUSB_HOST
-static struct musb *host;
-static struct usb_hcd hcd;
-static enum usb_device_speed host_speed;
-
-static void musb_host_complete_urb(struct urb *urb)
-{
- urb->dev->status &= ~USB_ST_NOT_PROC;
- urb->dev->act_len = urb->actual_length;
-}
-
-static struct usb_host_endpoint hep;
-static struct urb urb;
-
-static struct urb *construct_urb(struct usb_device *dev, int endpoint_type,
- unsigned long pipe, void *buffer, int len,
- struct devrequest *setup, int interval)
-{
- int epnum = usb_pipeendpoint(pipe);
- int is_in = usb_pipein(pipe);
-
- memset(&urb, 0, sizeof(struct urb));
- memset(&hep, 0, sizeof(struct usb_host_endpoint));
- INIT_LIST_HEAD(&hep.urb_list);
- INIT_LIST_HEAD(&urb.urb_list);
- urb.ep = &hep;
- urb.complete = musb_host_complete_urb;
- urb.status = -EINPROGRESS;
- urb.dev = dev;
- urb.pipe = pipe;
- urb.transfer_buffer = buffer;
- urb.transfer_dma = (unsigned long)buffer;
- urb.transfer_buffer_length = len;
- urb.setup_packet = (unsigned char *)setup;
-
- urb.ep->desc.wMaxPacketSize =
- __cpu_to_le16(is_in ? dev->epmaxpacketin[epnum] :
- dev->epmaxpacketout[epnum]);
- urb.ep->desc.bmAttributes = endpoint_type;
- urb.ep->desc.bEndpointAddress =
- (is_in ? USB_DIR_IN : USB_DIR_OUT) | epnum;
- urb.ep->desc.bInterval = interval;
-
- return &urb;
-}
-
-#define MUSB_HOST_TIMEOUT 0x3ffffff
-
-static int submit_urb(struct usb_hcd *hcd, struct urb *urb)
-{
- struct musb *host = hcd->hcd_priv;
- int ret;
- int timeout;
-
- ret = musb_urb_enqueue(hcd, urb, 0);
- if (ret < 0) {
- printf("Failed to enqueue URB to controller\n");
- return ret;
- }
-
- timeout = MUSB_HOST_TIMEOUT;
- do {
- if (ctrlc())
- return -EIO;
- host->isr(0, host);
- } while ((urb->dev->status & USB_ST_NOT_PROC) && --timeout);
-
- return urb->status;
-}
-
-int submit_control_msg(struct usb_device *dev, unsigned long pipe,
- void *buffer, int len, struct devrequest *setup)
-{
- struct urb *urb = construct_urb(dev, USB_ENDPOINT_XFER_CONTROL, pipe,
- buffer, len, setup, 0);
-
- /* Fix speed for non hub-attached devices */
- if (!dev->parent)
- dev->speed = host_speed;
-
- return submit_urb(&hcd, urb);
-}
-
-
-int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,
- void *buffer, int len)
-{
- struct urb *urb = construct_urb(dev, USB_ENDPOINT_XFER_BULK, pipe,
- buffer, len, NULL, 0);
- return submit_urb(&hcd, urb);
-}
-
-int submit_int_msg(struct usb_device *dev, unsigned long pipe,
- void *buffer, int len, int interval)
-{
- struct urb *urb = construct_urb(dev, USB_ENDPOINT_XFER_INT, pipe,
- buffer, len, NULL, interval);
- return submit_urb(&hcd, urb);
-}
-
-int usb_lowlevel_init(int index, enum usb_init_type init, void **controller)
-{
- u8 power;
- void *mbase;
- int timeout = MUSB_HOST_TIMEOUT;
-
- if (!host) {
- printf("MUSB host is not registered\n");
- return -ENODEV;
- }
-
- musb_start(host);
- mbase = host->mregs;
- do {
- if (musb_readb(mbase, MUSB_DEVCTL) & MUSB_DEVCTL_HM)
- break;
- } while (--timeout);
- if (!timeout)
- return -ENODEV;
-
- power = musb_readb(mbase, MUSB_POWER);
- musb_writeb(mbase, MUSB_POWER, MUSB_POWER_RESET | power);
- udelay(30000);
- power = musb_readb(mbase, MUSB_POWER);
- musb_writeb(mbase, MUSB_POWER, ~MUSB_POWER_RESET & power);
- host->isr(0, host);
- host_speed = (musb_readb(mbase, MUSB_POWER) & MUSB_POWER_HSMODE) ?
- USB_SPEED_HIGH :
- (musb_readb(mbase, MUSB_DEVCTL) & MUSB_DEVCTL_FSDEV) ?
- USB_SPEED_FULL : USB_SPEED_LOW;
- host->is_active = 1;
- hcd.hcd_priv = host;
-
- return 0;
-}
-
-int usb_lowlevel_stop(int index)
-{
- if (!host) {
- printf("MUSB host is not registered\n");
- return -ENODEV;
- }
-
- musb_stop(host);
- return 0;
-}
-#endif /* CONFIG_MUSB_HOST */
-
-#ifdef CONFIG_MUSB_GADGET
-static struct musb *gadget;
-
-int usb_gadget_handle_interrupts(void)
-{
- WATCHDOG_RESET();
- if (!gadget || !gadget->isr)
- return -EINVAL;
-
- return gadget->isr(0, gadget);
-}
-
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
-{
- int ret;
-
- if (!driver || driver->speed < USB_SPEED_FULL || !driver->bind ||
- !driver->setup) {
- printf("bad parameter.\n");
- return -EINVAL;
- }
-
- if (!gadget) {
- printf("Controller uninitialized\n");
- return -ENXIO;
- }
-
- ret = musb_gadget_start(&gadget->g, driver);
- if (ret < 0) {
- printf("gadget_start failed with %d\n", ret);
- return ret;
- }
-
- ret = driver->bind(&gadget->g);
- if (ret < 0) {
- printf("bind failed with %d\n", ret);
- return ret;
- }
-
- return 0;
-}
-
-int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
-{
- /* TODO: implement me */
- return 0;
-}
-#endif /* CONFIG_MUSB_GADGET */
-
-int musb_register(struct musb_hdrc_platform_data *plat, void *bdata,
- void *ctl_regs)
-{
- struct musb **musbp;
-
- switch (plat->mode) {
-#ifdef CONFIG_MUSB_HOST
- case MUSB_HOST:
- musbp = &host;
- break;
-#endif
-#ifdef CONFIG_MUSB_GADGET
- case MUSB_PERIPHERAL:
- musbp = &gadget;
- break;
-#endif
- default:
- return -EINVAL;
- }
-
- *musbp = musb_init_controller(plat, (struct device *)bdata, ctl_regs);
- if (!musbp) {
- printf("Failed to init the controller\n");
- return -EIO;
- }
-
- return 0;
-}
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c
deleted file mode 100644
index b1c4dc7..0000000
--- a/drivers/usb/musb/omap2430.c
+++ /dev/null
@@ -1,626 +0,0 @@
-/*
- * Copyright (C) 2005-2007 by Texas Instruments
- * Some code has been taken from tusb6010.c
- * Copyrights for that are attributable to:
- * Copyright (C) 2006 Nokia Corporation
- * Tony Lindgren <tony@atomide.com>
- *
- * This file is part of the Inventra Controller Driver for Linux.
- *
- * The Inventra Controller Driver for Linux is free software; you
- * can redistribute it and/or modify it under the terms of the GNU
- * General Public License version 2 as published by the Free Software
- * Foundation.
- *
- * The Inventra Controller Driver for Linux is distributed in
- * the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- * License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with The Inventra Controller Driver for Linux ; if not,
- * write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- */
-#define __UBOOT__
-#ifndef __UBOOT__
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/init.h>
-#include <linux/list.h>
-#include <linux/io.h>
-#include <linux/platform_device.h>
-#include <linux/dma-mapping.h>
-#include <linux/pm_runtime.h>
-#include <linux/err.h>
-#include <linux/usb/musb-omap.h>
-#else
-#include <common.h>
-#include <asm/omap_musb.h>
-#include <twl4030.h>
-#include "linux-compat.h"
-#endif
-
-#include "musb_core.h"
-#include "omap2430.h"
-
-#ifndef __UBOOT__
-struct omap2430_glue {
- struct device *dev;
- struct platform_device *musb;
- enum omap_musb_vbus_id_status status;
- struct work_struct omap_musb_mailbox_work;
-};
-#define glue_to_musb(g) platform_get_drvdata(g->musb)
-
-struct omap2430_glue *_glue;
-
-static struct timer_list musb_idle_timer;
-
-static void musb_do_idle(unsigned long _musb)
-{
- struct musb *musb = (void *)_musb;
- unsigned long flags;
- u8 power;
- u8 devctl;
-
- spin_lock_irqsave(&musb->lock, flags);
-
- switch (musb->xceiv->state) {
- case OTG_STATE_A_WAIT_BCON:
-
- devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
- if (devctl & MUSB_DEVCTL_BDEVICE) {
- musb->xceiv->state = OTG_STATE_B_IDLE;
- MUSB_DEV_MODE(musb);
- } else {
- musb->xceiv->state = OTG_STATE_A_IDLE;
- MUSB_HST_MODE(musb);
- }
- break;
- case OTG_STATE_A_SUSPEND:
- /* finish RESUME signaling? */
- if (musb->port1_status & MUSB_PORT_STAT_RESUME) {
- power = musb_readb(musb->mregs, MUSB_POWER);
- power &= ~MUSB_POWER_RESUME;
- dev_dbg(musb->controller, "root port resume stopped, power %02x\n", power);
- musb_writeb(musb->mregs, MUSB_POWER, power);
- musb->is_active = 1;
- musb->port1_status &= ~(USB_PORT_STAT_SUSPEND
- | MUSB_PORT_STAT_RESUME);
- musb->port1_status |= USB_PORT_STAT_C_SUSPEND << 16;
- usb_hcd_poll_rh_status(musb_to_hcd(musb));
- /* NOTE: it might really be A_WAIT_BCON ... */
- musb->xceiv->state = OTG_STATE_A_HOST;
- }
- break;
- case OTG_STATE_A_HOST:
- devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
- if (devctl & MUSB_DEVCTL_BDEVICE)
- musb->xceiv->state = OTG_STATE_B_IDLE;
- else
- musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
- default:
- break;
- }
- spin_unlock_irqrestore(&musb->lock, flags);
-}
-
-
-static void omap2430_musb_try_idle(struct musb *musb, unsigned long timeout)
-{
- unsigned long default_timeout = jiffies + msecs_to_jiffies(3);
- static unsigned long last_timer;
-
- if (timeout == 0)
- timeout = default_timeout;
-
- /* Never idle if active, or when VBUS timeout is not set as host */
- if (musb->is_active || ((musb->a_wait_bcon == 0)
- && (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) {
- dev_dbg(musb->controller, "%s active, deleting timer\n",
- otg_state_string(musb->xceiv->state));
- del_timer(&musb_idle_timer);
- last_timer = jiffies;
- return;
- }
-
- if (time_after(last_timer, timeout)) {
- if (!timer_pending(&musb_idle_timer))
- last_timer = timeout;
- else {
- dev_dbg(musb->controller, "Longer idle timer already pending, ignoring\n");
- return;
- }
- }
- last_timer = timeout;
-
- dev_dbg(musb->controller, "%s inactive, for idle timer for %lu ms\n",
- otg_state_string(musb->xceiv->state),
- (unsigned long)jiffies_to_msecs(timeout - jiffies));
- mod_timer(&musb_idle_timer, timeout);
-}
-
-static void omap2430_musb_set_vbus(struct musb *musb, int is_on)
-{
- struct usb_otg *otg = musb->xceiv->otg;
- u8 devctl;
- unsigned long timeout = jiffies + msecs_to_jiffies(1000);
- int ret = 1;
- /* HDRC controls CPEN, but beware current surges during device
- * connect. They can trigger transient overcurrent conditions
- * that must be ignored.
- */
-
- devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
-
- if (is_on) {
- if (musb->xceiv->state == OTG_STATE_A_IDLE) {
- /* start the session */
- devctl |= MUSB_DEVCTL_SESSION;
- musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
- /*
- * Wait for the musb to set as A device to enable the
- * VBUS
- */
- while (musb_readb(musb->mregs, MUSB_DEVCTL) & 0x80) {
-
- cpu_relax();
-
- if (time_after(jiffies, timeout)) {
- dev_err(musb->controller,
- "configured as A device timeout");
- ret = -EINVAL;
- break;
- }
- }
-
- if (ret && otg->set_vbus)
- otg_set_vbus(otg, 1);
- } else {
- musb->is_active = 1;
- otg->default_a = 1;
- musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
- devctl |= MUSB_DEVCTL_SESSION;
- MUSB_HST_MODE(musb);
- }
- } else {
- musb->is_active = 0;
-
- /* NOTE: we're skipping A_WAIT_VFALL -> A_IDLE and
- * jumping right to B_IDLE...
- */
-
- otg->default_a = 0;
- musb->xceiv->state = OTG_STATE_B_IDLE;
- devctl &= ~MUSB_DEVCTL_SESSION;
-
- MUSB_DEV_MODE(musb);
- }
- musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
-
- dev_dbg(musb->controller, "VBUS %s, devctl %02x "
- /* otg %3x conf %08x prcm %08x */ "\n",
- otg_state_string(musb->xceiv->state),
- musb_readb(musb->mregs, MUSB_DEVCTL));
-}
-
-static int omap2430_musb_set_mode(struct musb *musb, u8 musb_mode)
-{
- u8 devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
-
- devctl |= MUSB_DEVCTL_SESSION;
- musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
-
- return 0;
-}
-#endif
-
-static inline void omap2430_low_level_exit(struct musb *musb)
-{
- u32 l;
-
- /* in any role */
- l = musb_readl(musb->mregs, OTG_FORCESTDBY);
- l |= ENABLEFORCE; /* enable MSTANDBY */
- musb_writel(musb->mregs, OTG_FORCESTDBY, l);
-}
-
-static inline void omap2430_low_level_init(struct musb *musb)
-{
- u32 l;
-
- l = musb_readl(musb->mregs, OTG_FORCESTDBY);
- l &= ~ENABLEFORCE; /* disable MSTANDBY */
- musb_writel(musb->mregs, OTG_FORCESTDBY, l);
-}
-
-#ifndef __UBOOT__
-void omap_musb_mailbox(enum omap_musb_vbus_id_status status)
-{
- struct omap2430_glue *glue = _glue;
- struct musb *musb = glue_to_musb(glue);
-
- glue->status = status;
- if (!musb) {
- dev_err(glue->dev, "musb core is not yet ready\n");
- return;
- }
-
- schedule_work(&glue->omap_musb_mailbox_work);
-}
-EXPORT_SYMBOL_GPL(omap_musb_mailbox);
-
-static void omap_musb_set_mailbox(struct omap2430_glue *glue)
-{
- struct musb *musb = glue_to_musb(glue);
- struct device *dev = musb->controller;
- struct musb_hdrc_platform_data *pdata = dev->platform_data;
- struct omap_musb_board_data *data = pdata->board_data;
- struct usb_otg *otg = musb->xceiv->otg;
-
- switch (glue->status) {
- case OMAP_MUSB_ID_GROUND:
- dev_dbg(dev, "ID GND\n");
-
- otg->default_a = true;
- musb->xceiv->state = OTG_STATE_A_IDLE;
- musb->xceiv->last_event = USB_EVENT_ID;
- if (!is_otg_enabled(musb) || musb->gadget_driver) {
- pm_runtime_get_sync(dev);
- usb_phy_init(musb->xceiv);
- omap2430_musb_set_vbus(musb, 1);
- }
- break;
-
- case OMAP_MUSB_VBUS_VALID:
- dev_dbg(dev, "VBUS Connect\n");
-
- otg->default_a = false;
- musb->xceiv->state = OTG_STATE_B_IDLE;
- musb->xceiv->last_event = USB_EVENT_VBUS;
- if (musb->gadget_driver)
- pm_runtime_get_sync(dev);
- usb_phy_init(musb->xceiv);
- break;
-
- case OMAP_MUSB_ID_FLOAT:
- case OMAP_MUSB_VBUS_OFF:
- dev_dbg(dev, "VBUS Disconnect\n");
-
- musb->xceiv->last_event = USB_EVENT_NONE;
- if (is_otg_enabled(musb) || is_peripheral_enabled(musb))
- if (musb->gadget_driver) {
- pm_runtime_mark_last_busy(dev);
- pm_runtime_put_autosuspend(dev);
- }
-
- if (data->interface_type == MUSB_INTERFACE_UTMI) {
- if (musb->xceiv->otg->set_vbus)
- otg_set_vbus(musb->xceiv->otg, 0);
- }
- usb_phy_shutdown(musb->xceiv);
- break;
- default:
- dev_dbg(dev, "ID float\n");
- }
-}
-
-
-static void omap_musb_mailbox_work(struct work_struct *mailbox_work)
-{
- struct omap2430_glue *glue = container_of(mailbox_work,
- struct omap2430_glue, omap_musb_mailbox_work);
- omap_musb_set_mailbox(glue);
-}
-#endif
-
-static int omap2430_musb_init(struct musb *musb)
-{
- u32 l;
- int status = 0;
-#ifndef __UBOOT__
- struct device *dev = musb->controller;
- struct omap2430_glue *glue = dev_get_drvdata(dev->parent);
- struct musb_hdrc_platform_data *plat = dev->platform_data;
- struct omap_musb_board_data *data = plat->board_data;
-#else
- struct omap_musb_board_data *data =
- (struct omap_musb_board_data *)musb->controller;
-#endif
-
-
-#ifndef __UBOOT__
- /* We require some kind of external transceiver, hooked
- * up through ULPI. TWL4030-family PMICs include one,
- * which needs a driver, drivers aren't always needed.
- */
- musb->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
- if (IS_ERR_OR_NULL(musb->xceiv)) {
- pr_err("HS USB OTG: no transceiver configured\n");
- return -ENODEV;
- }
-
- status = pm_runtime_get_sync(dev);
- if (status < 0) {
- dev_err(dev, "pm_runtime_get_sync FAILED %d\n", status);
- goto err1;
- }
-#endif
-
- l = musb_readl(musb->mregs, OTG_INTERFSEL);
-
- if (data->interface_type == MUSB_INTERFACE_UTMI) {
- /* OMAP4 uses Internal PHY GS70 which uses UTMI interface */
- l &= ~ULPI_12PIN; /* Disable ULPI */
- l |= UTMI_8BIT; /* Enable UTMI */
- } else {
- l |= ULPI_12PIN;
- }
-
- musb_writel(musb->mregs, OTG_INTERFSEL, l);
-
- pr_debug("HS USB OTG: revision 0x%x, sysconfig 0x%02x, "
- "sysstatus 0x%x, intrfsel 0x%x, simenable 0x%x\n",
- musb_readl(musb->mregs, OTG_REVISION),
- musb_readl(musb->mregs, OTG_SYSCONFIG),
- musb_readl(musb->mregs, OTG_SYSSTATUS),
- musb_readl(musb->mregs, OTG_INTERFSEL),
- musb_readl(musb->mregs, OTG_SIMENABLE));
-
-#ifndef __UBOOT__
- setup_timer(&musb_idle_timer, musb_do_idle, (unsigned long) musb);
-
- if (glue->status != OMAP_MUSB_UNKNOWN)
- omap_musb_set_mailbox(glue);
-
- pm_runtime_put_noidle(musb->controller);
-#endif
- return 0;
-
-err1:
- return status;
-}
-
-static void omap2430_musb_enable(struct musb *musb)
-{
-#ifndef __UBOOT__
- u8 devctl;
- unsigned long timeout = jiffies + msecs_to_jiffies(1000);
- struct device *dev = musb->controller;
- struct omap2430_glue *glue = dev_get_drvdata(dev->parent);
- struct musb_hdrc_platform_data *pdata = dev->platform_data;
- struct omap_musb_board_data *data = pdata->board_data;
-
- switch (glue->status) {
-
- case OMAP_MUSB_ID_GROUND:
- usb_phy_init(musb->xceiv);
- if (data->interface_type != MUSB_INTERFACE_UTMI)
- break;
- devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
- /* start the session */
- devctl |= MUSB_DEVCTL_SESSION;
- musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
- while (musb_readb(musb->mregs, MUSB_DEVCTL) &
- MUSB_DEVCTL_BDEVICE) {
- cpu_relax();
-
- if (time_after(jiffies, timeout)) {
- dev_err(dev, "configured as A device timeout");
- break;
- }
- }
- break;
-
- case OMAP_MUSB_VBUS_VALID:
- usb_phy_init(musb->xceiv);
- break;
-
- default:
- break;
- }
-#else
-#ifdef CONFIG_TWL4030_USB
- if (twl4030_usb_ulpi_init()) {
- serial_printf("ERROR: %s Could not initialize PHY\n",
- __PRETTY_FUNCTION__);
- }
-#endif
-#endif
-}
-
-static void omap2430_musb_disable(struct musb *musb)
-{
-#ifndef __UBOOT__
- struct device *dev = musb->controller;
- struct omap2430_glue *glue = dev_get_drvdata(dev->parent);
-
- if (glue->status != OMAP_MUSB_UNKNOWN)
- usb_phy_shutdown(musb->xceiv);
-#endif
-}
-
-static int omap2430_musb_exit(struct musb *musb)
-{
- del_timer_sync(&musb_idle_timer);
-
- omap2430_low_level_exit(musb);
-
- return 0;
-}
-
-#ifndef __UBOOT__
-static const struct musb_platform_ops omap2430_ops = {
-#else
-const struct musb_platform_ops omap2430_ops = {
-#endif
- .init = omap2430_musb_init,
- .exit = omap2430_musb_exit,
-
-#ifndef __UBOOT__
- .set_mode = omap2430_musb_set_mode,
- .try_idle = omap2430_musb_try_idle,
-
- .set_vbus = omap2430_musb_set_vbus,
-#endif
-
- .enable = omap2430_musb_enable,
- .disable = omap2430_musb_disable,
-};
-
-#ifndef __UBOOT__
-static u64 omap2430_dmamask = DMA_BIT_MASK(32);
-
-static int __devinit omap2430_probe(struct platform_device *pdev)
-{
- struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data;
- struct platform_device *musb;
- struct omap2430_glue *glue;
- int ret = -ENOMEM;
-
- glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL);
- if (!glue) {
- dev_err(&pdev->dev, "failed to allocate glue context\n");
- goto err0;
- }
-
- musb = platform_device_alloc("musb-hdrc", -1);
- if (!musb) {
- dev_err(&pdev->dev, "failed to allocate musb device\n");
- goto err0;
- }
-
- musb->dev.parent = &pdev->dev;
- musb->dev.dma_mask = &omap2430_dmamask;
- musb->dev.coherent_dma_mask = omap2430_dmamask;
-
- glue->dev = &pdev->dev;
- glue->musb = musb;
- glue->status = OMAP_MUSB_UNKNOWN;
-
- pdata->platform_ops = &omap2430_ops;
-
- platform_set_drvdata(pdev, glue);
-
- /*
- * REVISIT if we ever have two instances of the wrapper, we will be
- * in big trouble
- */
- _glue = glue;
-
- INIT_WORK(&glue->omap_musb_mailbox_work, omap_musb_mailbox_work);
-
- ret = platform_device_add_resources(musb, pdev->resource,
- pdev->num_resources);
- if (ret) {
- dev_err(&pdev->dev, "failed to add resources\n");
- goto err1;
- }
-
- ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
- if (ret) {
- dev_err(&pdev->dev, "failed to add platform_data\n");
- goto err1;
- }
-
- pm_runtime_enable(&pdev->dev);
-
- ret = platform_device_add(musb);
- if (ret) {
- dev_err(&pdev->dev, "failed to register musb device\n");
- goto err1;
- }
-
- return 0;
-
-err1:
- platform_device_put(musb);
-
-err0:
- return ret;
-}
-
-static int __devexit omap2430_remove(struct platform_device *pdev)
-{
- struct omap2430_glue *glue = platform_get_drvdata(pdev);
-
- cancel_work_sync(&glue->omap_musb_mailbox_work);
- platform_device_del(glue->musb);
- platform_device_put(glue->musb);
-
- return 0;
-}
-
-#ifdef CONFIG_PM
-
-static int omap2430_runtime_suspend(struct device *dev)
-{
- struct omap2430_glue *glue = dev_get_drvdata(dev);
- struct musb *musb = glue_to_musb(glue);
-
- if (musb) {
- musb->context.otg_interfsel = musb_readl(musb->mregs,
- OTG_INTERFSEL);
-
- omap2430_low_level_exit(musb);
- usb_phy_set_suspend(musb->xceiv, 1);
- }
-
- return 0;
-}
-
-static int omap2430_runtime_resume(struct device *dev)
-{
- struct omap2430_glue *glue = dev_get_drvdata(dev);
- struct musb *musb = glue_to_musb(glue);
-
- if (musb) {
- omap2430_low_level_init(musb);
- musb_writel(musb->mregs, OTG_INTERFSEL,
- musb->context.otg_interfsel);
-
- usb_phy_set_suspend(musb->xceiv, 0);
- }
-
- return 0;
-}
-
-static struct dev_pm_ops omap2430_pm_ops = {
- .runtime_suspend = omap2430_runtime_suspend,
- .runtime_resume = omap2430_runtime_resume,
-};
-
-#define DEV_PM_OPS (&omap2430_pm_ops)
-#else
-#define DEV_PM_OPS NULL
-#endif
-
-static struct platform_driver omap2430_driver = {
- .probe = omap2430_probe,
- .remove = __devexit_p(omap2430_remove),
- .driver = {
- .name = "musb-omap2430",
- .pm = DEV_PM_OPS,
- },
-};
-
-MODULE_DESCRIPTION("OMAP2PLUS MUSB Glue Layer");
-MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
-MODULE_LICENSE("GPL v2");
-
-static int __init omap2430_init(void)
-{
- return platform_driver_register(&omap2430_driver);
-}
-subsys_initcall(omap2430_init);
-
-static void __exit omap2430_exit(void)
-{
- platform_driver_unregister(&omap2430_driver);
-}
-module_exit(omap2430_exit);
-#endif
diff --git a/drivers/usb/musb/omap2430.h b/drivers/usb/musb/omap2430.h
deleted file mode 100644
index 3b795c2..0000000
--- a/drivers/usb/musb/omap2430.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2005-2006 by Texas Instruments
- *
- * The Inventra Controller Driver for Linux is free software; you
- * can redistribute it and/or modify it under the terms of the GNU
- * General Public License version 2 as published by the Free Software
- * Foundation.
- */
-
-#ifndef __MUSB_OMAP243X_H__
-#define __MUSB_OMAP243X_H__
-
-#ifndef __UBOOT__
-#include <plat/usb.h>
-#else
-#undef RESETDONE
-#endif
-
-/*
- * OMAP2430-specific definitions
- */
-
-#define OTG_REVISION 0x400
-
-#define OTG_SYSCONFIG 0x404
-# define MIDLEMODE 12 /* bit position */
-# define FORCESTDBY (0 << MIDLEMODE)
-# define NOSTDBY (1 << MIDLEMODE)
-# define SMARTSTDBY (2 << MIDLEMODE)
-
-# define SIDLEMODE 3 /* bit position */
-# define FORCEIDLE (0 << SIDLEMODE)
-# define NOIDLE (1 << SIDLEMODE)
-# define SMARTIDLE (2 << SIDLEMODE)
-
-# define ENABLEWAKEUP (1 << 2)
-# define SOFTRST (1 << 1)
-# define AUTOIDLE (1 << 0)
-
-#define OTG_SYSSTATUS 0x408
-# define RESETDONE (1 << 0)
-
-#define OTG_INTERFSEL 0x40c
-# define EXTCP (1 << 2)
-# define PHYSEL 0 /* bit position */
-# define UTMI_8BIT (0 << PHYSEL)
-# define ULPI_12PIN (1 << PHYSEL)
-# define ULPI_8PIN (2 << PHYSEL)
-
-#define OTG_SIMENABLE 0x410
-# define TM1 (1 << 0)
-
-#define OTG_FORCESTDBY 0x414
-# define ENABLEFORCE (1 << 0)
-
-#endif /* __MUSB_OMAP243X_H__ */
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 08/18] musb: use __BAREBOX__ macro
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
` (5 preceding siblings ...)
2014-06-13 7:54 ` [PATCH 07/18] musb: drop gadget support - remove appropriate files Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 09/18] musb: adapt Kconfig and Makefiles Christoph Fritz
` (9 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
---
drivers/usb/musb/musb_core.c | 51 +++++++++++++++++++++---------------------
drivers/usb/musb/musb_core.h | 10 ++++-----
drivers/usb/musb/musb_dsps.c | 41 +++++++++++++++++----------------
drivers/usb/musb/musb_host.c | 31 +++++++++++++------------
drivers/usb/musb/musb_host.h | 4 ++--
drivers/usb/musb/musb_io.h | 2 +-
6 files changed, 68 insertions(+), 71 deletions(-)
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index 36681b6..546f656 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -89,8 +89,7 @@
* Most of the conditional compilation will (someday) vanish.
*/
-#define __UBOOT__
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
@@ -134,7 +133,7 @@ MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:" MUSB_DRIVER_NAME);
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
/*-------------------------------------------------------------------------*/
static inline struct musb *dev_to_musb(struct device *dev)
@@ -145,7 +144,7 @@ static inline struct musb *dev_to_musb(struct device *dev)
/*-------------------------------------------------------------------------*/
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
#ifndef CONFIG_BLACKFIN
static int musb_ulpi_read(struct usb_phy *phy, u32 offset)
{
@@ -360,7 +359,7 @@ void musb_load_testpacket(struct musb *musb)
musb_writew(regs, MUSB_CSR0, MUSB_CSR0_TXPKTRDY);
}
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
/*-------------------------------------------------------------------------*/
/*
@@ -450,7 +449,7 @@ void musb_hnp_stop(struct musb *musb)
static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
u8 devctl, u8 power)
{
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
struct usb_otg *otg = musb->xceiv->otg;
#endif
irqreturn_t handled = IRQ_NONE;
@@ -458,7 +457,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
dev_dbg(musb->controller, "<== Power=%02x, DevCtl=%02x, int_usb=0x%x\n", power, devctl,
int_usb);
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
/* in host mode, the peripheral may issue remote wakeup.
* in peripheral mode, the host may resume the link.
* spurious RESUME irqs happen too, paired with SUSPEND.
@@ -712,7 +711,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
musb_writew(musb->mregs, MUSB_INTRTXE, musb->epmask);
musb_writew(musb->mregs, MUSB_INTRRXE, musb->epmask & 0xfffe);
musb_writeb(musb->mregs, MUSB_INTRUSBE, 0xf7);
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
musb->port1_status &= ~(USB_PORT_STAT_LOW_SPEED
|USB_PORT_STAT_HIGH_SPEED
|USB_PORT_STAT_ENABLE
@@ -763,7 +762,7 @@ b_host:
#endif
}
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
if ((int_usb & MUSB_INTR_DISCONNECT) && !musb->ignore_disconnect) {
dev_dbg(musb->controller, "DISCONNECT (%s) as %s, devctl %02x\n",
otg_state_string(musb->xceiv->state),
@@ -955,7 +954,7 @@ void musb_start(struct musb *musb)
devctl &= ~MUSB_DEVCTL_SESSION;
if (is_otg_enabled(musb)) {
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
/* session started after:
* (a) ID-grounded irq, host mode;
* (b) vbus present/connect IRQ, peripheral mode;
@@ -1024,7 +1023,7 @@ void musb_stop(struct musb *musb)
musb_platform_try_idle(musb, 0);
}
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
static void musb_shutdown(struct platform_device *pdev)
{
struct musb *musb = dev_to_musb(&pdev->dev);
@@ -1818,7 +1817,7 @@ static const struct attribute_group musb_attr_group = {
#endif /* sysfs */
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
/* Only used to provide driver mode change events */
static void musb_irq_work(struct work_struct *data)
{
@@ -1843,7 +1842,7 @@ allocate_instance(struct device *dev,
struct musb *musb;
struct musb_hw_ep *ep;
int epnum;
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
struct usb_hcd *hcd;
hcd = usb_create_hcd(&musb_hc_driver, dev, dev_name(dev));
@@ -1861,7 +1860,7 @@ allocate_instance(struct device *dev,
INIT_LIST_HEAD(&musb->in_bulk);
INIT_LIST_HEAD(&musb->out_bulk);
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
hcd->uses_new_polling = 1;
hcd->has_tt = 1;
#endif
@@ -1920,7 +1919,7 @@ static void musb_free(struct musb *musb)
* @mregs: virtual address of controller registers,
* not yet corrected for platform-specific offsets
*/
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
static int __devinit
musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
#else
@@ -1931,7 +1930,7 @@ musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev,
{
int status;
struct musb *musb;
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
struct musb_hdrc_platform_data *plat = dev->platform_data;
#else
int nIrq = 0;
@@ -1984,7 +1983,7 @@ musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev,
goto fail2;
}
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
if (!musb->xceiv->io_ops) {
musb->xceiv->io_dev = musb->controller;
musb->xceiv->io_priv = musb->mregs;
@@ -2004,7 +2003,7 @@ musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev,
(void) c->start(c);
}
#endif
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
/* ideally this would be abstracted in platform setup */
if (!is_dma_capable() || !musb->dma_controller)
dev->dma_mask = NULL;
@@ -2041,7 +2040,7 @@ musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev,
musb->irq_wake = 0;
}
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
/* host side needs more setup */
if (is_host_enabled(musb)) {
struct usb_hcd *hcd = musb_to_hcd(musb);
@@ -2070,7 +2069,7 @@ musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev,
struct usb_hcd *hcd = musb_to_hcd(musb);
MUSB_HST_MODE(musb);
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
musb->xceiv->otg->default_a = 1;
musb->xceiv->state = OTG_STATE_A_IDLE;
@@ -2087,7 +2086,7 @@ musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev,
} else /* peripheral is enabled */ {
MUSB_DEV_MODE(musb);
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
musb->xceiv->otg->default_a = 0;
musb->xceiv->state = OTG_STATE_B_IDLE;
#endif
@@ -2095,7 +2094,7 @@ musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev,
if (is_peripheral_capable())
status = musb_gadget_setup(musb);
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
dev_dbg(musb->controller, "%s mode, status %d, dev%02x\n",
is_otg_enabled(musb) ? "OTG" : "PERIPHERAL",
status,
@@ -2130,7 +2129,7 @@ musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev,
? "DMA" : "PIO",
musb->nIrq);
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
return 0;
#else
return status == 0 ? musb : NULL;
@@ -2140,7 +2139,7 @@ fail5:
musb_exit_debugfs(musb);
fail4:
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
if (!is_otg_enabled(musb) && is_host_enabled(musb))
usb_remove_hcd(musb_to_hcd(musb));
else
@@ -2163,7 +2162,7 @@ fail1:
fail0:
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
return status;
#else
return status == 0 ? musb : NULL;
@@ -2181,7 +2180,7 @@ fail0:
static u64 *orig_dma_mask;
#endif
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
static int __devinit musb_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h
index 2695742..8f8d791 100644
--- a/drivers/usb/musb/musb_core.h
+++ b/drivers/usb/musb/musb_core.h
@@ -35,7 +35,7 @@
#ifndef __MUSB_CORE_H__
#define __MUSB_CORE_H__
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
#include <linux/slab.h>
#include <linux/list.h>
#include <linux/interrupt.h>
@@ -72,7 +72,7 @@ struct musb_ep;
#include "musb_regs.h"
#include "musb_gadget.h"
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
#include <linux/usb/hcd.h>
#endif
#include "musb_host.h"
@@ -94,7 +94,7 @@ struct musb_ep;
/****************************** PERIPHERAL ROLE *****************************/
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
#define is_peripheral_capable() (1)
#else
#ifdef CONFIG_MUSB_GADGET
@@ -115,7 +115,7 @@ extern void musb_g_disconnect(struct musb *);
/****************************** HOST ROLE ***********************************/
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
#define is_host_capable() (1)
#else
#ifdef CONFIG_MUSB_HOST
@@ -615,7 +615,7 @@ static inline int musb_platform_exit(struct musb *musb)
return musb->ops->exit(musb);
}
-#ifdef __UBOOT__
+#ifdef __BAREBOX__
struct musb *
musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev,
void *ctrl);
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index 9a03917..c1caf57 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -29,8 +29,7 @@
* da8xx.c would be merged to this file after testing.
*/
-#define __UBOOT__
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
#include <linux/init.h>
#include <linux/io.h>
#include <linux/err.h>
@@ -159,7 +158,7 @@ struct dsps_glue {
*/
static void dsps_musb_enable(struct musb *musb)
{
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
struct device *dev = musb->controller;
struct platform_device *pdev = to_platform_device(dev->parent);
struct dsps_glue *glue = platform_get_drvdata(pdev);
@@ -178,7 +177,7 @@ static void dsps_musb_enable(struct musb *musb)
dsps_writel(reg_base, wrp->epintr_set, epmask);
dsps_writel(reg_base, wrp->coreintr_set, coremask);
/* Force the DRVVBUS IRQ so we can start polling for ID change. */
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
if (is_otg_enabled(musb))
dsps_writel(reg_base, wrp->coreintr_set,
(1 << wrp->drvvbus) << wrp->usb_shift);
@@ -190,7 +189,7 @@ static void dsps_musb_enable(struct musb *musb)
*/
static void dsps_musb_disable(struct musb *musb)
{
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
struct device *dev = musb->controller;
struct platform_device *pdev = to_platform_device(dev->parent);
struct dsps_glue *glue = platform_get_drvdata(pdev);
@@ -205,7 +204,7 @@ static void dsps_musb_disable(struct musb *musb)
#endif
}
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
static void otg_timer(unsigned long _musb)
{
struct musb *musb = (void *)_musb;
@@ -303,7 +302,7 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
{
struct musb *musb = hci;
void __iomem *reg_base = musb->ctrl_base;
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
struct device *dev = musb->controller;
struct platform_device *pdev = to_platform_device(dev->parent);
struct dsps_glue *glue = platform_get_drvdata(pdev);
@@ -336,7 +335,7 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
dev_dbg(musb->controller, "usbintr (%x) epintr(%x)\n",
usbintr, epintr);
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
/*
* DRVVBUS IRQs are the only proxy we have (a very poor one!) for
* DSPS IP's missing ID change IRQ. We need an ID change IRQ to
@@ -404,7 +403,7 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
if (ret == IRQ_HANDLED || epintr || usbintr)
dsps_writel(reg_base, wrp->eoi, 1);
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
/* Poll for ID change */
if (is_otg_enabled(musb) && musb->xceiv->state == OTG_STATE_B_IDLE)
mod_timer(&glue->timer, jiffies + wrp->poll_seconds * HZ);
@@ -417,7 +416,7 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
static int dsps_musb_init(struct musb *musb)
{
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
struct device *dev = musb->controller;
struct musb_hdrc_platform_data *plat = dev->platform_data;
struct platform_device *pdev = to_platform_device(dev->parent);
@@ -436,7 +435,7 @@ static int dsps_musb_init(struct musb *musb)
/* mentor core register starts at offset of 0x400 from musb base */
musb->mregs += wrp->musb_core_offset;
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
/* NOP driver needs change if supporting dual instance */
usb_nop_xceiv_register();
musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
@@ -451,7 +450,7 @@ static int dsps_musb_init(struct musb *musb)
goto err0;
}
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
if (is_host_enabled(musb))
setup_timer(&glue->timer, otg_timer, (unsigned long) musb);
#endif
@@ -475,7 +474,7 @@ static int dsps_musb_init(struct musb *musb)
return 0;
err0:
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
usb_put_phy(musb->xceiv);
usb_nop_xceiv_unregister();
#endif
@@ -484,7 +483,7 @@ err0:
static int dsps_musb_exit(struct musb *musb)
{
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
struct device *dev = musb->controller;
struct musb_hdrc_platform_data *plat = dev->platform_data;
struct omap_musb_board_data *data = plat->board_data;
@@ -495,7 +494,7 @@ static int dsps_musb_exit(struct musb *musb)
(struct omap_musb_board_data *)musb->controller;
#endif
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
if (is_host_enabled(musb))
del_timer_sync(&glue->timer);
#endif
@@ -504,7 +503,7 @@ static int dsps_musb_exit(struct musb *musb)
if (data->set_phy_power)
data->set_phy_power(0);
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
/* NOP driver needs change if supporting dual instance */
usb_put_phy(musb->xceiv);
usb_nop_xceiv_unregister();
@@ -513,7 +512,7 @@ static int dsps_musb_exit(struct musb *musb)
return 0;
}
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
static struct musb_platform_ops dsps_ops = {
#else
struct musb_platform_ops musb_dsps_ops = {
@@ -524,16 +523,16 @@ struct musb_platform_ops musb_dsps_ops = {
.enable = dsps_musb_enable,
.disable = dsps_musb_disable,
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
.try_idle = dsps_musb_try_idle,
#endif
};
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
static u64 musb_dmamask = DMA_BIT_MASK(32);
#endif
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
{
struct device *dev = glue->dev;
@@ -723,7 +722,7 @@ static int dsps_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(dsps_pm_ops, dsps_suspend, dsps_resume);
#endif
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
static const struct platform_device_id musb_dsps_id_table[] __devinitconst = {
{
.name = "musb-ti81xx",
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
index 9a2cf59..120849d 100644
--- a/drivers/usb/musb/musb_host.c
+++ b/drivers/usb/musb/musb_host.c
@@ -33,8 +33,7 @@
*
*/
-#define __UBOOT__
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
@@ -237,7 +236,7 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh)
buf = urb->setup_packet;
len = 8;
break;
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
case USB_ENDPOINT_XFER_ISOC:
qh->iso_idx = 0;
qh->frame = 0;
@@ -257,7 +256,7 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh)
({char *s; switch (qh->type) {
case USB_ENDPOINT_XFER_CONTROL: s = ""; break;
case USB_ENDPOINT_XFER_BULK: s = "-bulk"; break;
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
case USB_ENDPOINT_XFER_ISOC: s = "-iso"; break;
#endif
default: s = "-intr"; break;
@@ -274,7 +273,7 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh)
/* determine if the time is right for a periodic transfer */
switch (qh->type) {
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
case USB_ENDPOINT_XFER_ISOC:
#endif
case USB_ENDPOINT_XFER_INT:
@@ -283,7 +282,7 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh)
/* FIXME this doesn't implement that scheduling policy ...
* or handle framecounter wrapping
*/
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
if ((urb->transfer_flags & URB_ISO_ASAP)
|| (frame >= urb->start_frame)) {
/* REVISIT the SOF irq handler shouldn't duplicate
@@ -299,7 +298,7 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh)
#if 1 /* ifndef CONFIG_ARCH_DAVINCI */
musb_writeb(mbase, MUSB_INTRUSBE, 0xff);
#endif
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
}
#endif
break;
@@ -378,7 +377,7 @@ static void musb_advance_schedule(struct musb *musb, struct urb *urb,
case USB_ENDPOINT_XFER_INT:
musb_save_toggle(qh, is_in, urb);
break;
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
case USB_ENDPOINT_XFER_ISOC:
if (status == 0 && urb->error_count)
status = -EXDEV;
@@ -493,7 +492,7 @@ musb_host_packet_rx(struct musb *musb, struct urb *urb, u8 epnum, u8 iso_err)
urb->transfer_buffer_length);
/* unload FIFO */
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
if (usb_pipeisoc(pipe)) {
int status = 0;
struct usb_iso_packet_descriptor *d;
@@ -547,7 +546,7 @@ musb_host_packet_rx(struct musb *musb, struct urb *urb, u8 epnum, u8 iso_err)
&& (urb->actual_length
< urb->transfer_buffer_length))
urb->status = -EREMOTEIO;
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
}
#endif
@@ -1288,7 +1287,7 @@ void musb_host_tx(struct musb *musb, u8 epnum)
qh->offset += length;
if (usb_pipeisoc(pipe)) {
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
struct usb_iso_packet_descriptor *d;
d = urb->iso_frame_desc + qh->iso_idx;
@@ -1921,7 +1920,7 @@ success:
return 0;
}
-#ifdef __UBOOT__
+#ifdef __BAREBOX__
/* check if transaction translator is needed for device */
static int tt_needed(struct musb *musb, struct usb_device *dev)
{
@@ -1932,7 +1931,7 @@ static int tt_needed(struct musb *musb, struct usb_device *dev)
}
#endif
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
static int musb_urb_enqueue(
#else
int musb_urb_enqueue(
@@ -2070,14 +2069,14 @@ int musb_urb_enqueue(
if (musb->is_multipoint) {
struct usb_device *parent = urb->dev->parent;
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
if (parent != hcd->self.root_hub) {
#else
if (parent) {
#endif
qh->h_addr_reg = (u8) parent->devnum;
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
/* set up tt info if needed */
if (urb->dev->tt) {
qh->h_port_reg = (u8) urb->dev->ttport;
@@ -2132,7 +2131,7 @@ done:
}
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
/*
* abort a transfer that's at the head of a hardware queue.
* called with controller locked, irqs blocked
diff --git a/drivers/usb/musb/musb_host.h b/drivers/usb/musb/musb_host.h
index ebebe0c..8792364 100644
--- a/drivers/usb/musb/musb_host.h
+++ b/drivers/usb/musb/musb_host.h
@@ -34,7 +34,7 @@
#ifndef _MUSB_HOST_H
#define _MUSB_HOST_H
-#ifdef __UBOOT__
+#ifdef __BAREBOX__
#include "usb-compat.h"
#endif
@@ -108,7 +108,7 @@ static inline struct urb *next_urb(struct musb_qh *qh)
return list_entry(queue->next, struct urb, urb_list);
}
-#ifdef __UBOOT__
+#ifdef __BAREBOX__
int musb_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags);
#endif
#endif /* _MUSB_HOST_H */
diff --git a/drivers/usb/musb/musb_io.h b/drivers/usb/musb/musb_io.h
index 51730ae..efc4ef9 100644
--- a/drivers/usb/musb/musb_io.h
+++ b/drivers/usb/musb/musb_io.h
@@ -35,7 +35,7 @@
#ifndef __MUSB_LINUX_PLATFORM_ARCH_H__
#define __MUSB_LINUX_PLATFORM_ARCH_H__
-#ifndef __UBOOT__
+#ifndef __BAREBOX__
#include <linux/io.h>
#else
#include <asm/io.h>
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 09/18] musb: adapt Kconfig and Makefiles
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
` (6 preceding siblings ...)
2014-06-13 7:54 ` [PATCH 08/18] musb: use __BAREBOX__ macro Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 10/18] arm: pcm051: enable musb in defconfig Christoph Fritz
` (8 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
---
drivers/usb/Kconfig | 2 ++
drivers/usb/Makefile | 1 +
drivers/usb/musb/Kconfig | 21 +++++++++++++++++++++
drivers/usb/musb/Makefile | 5 -----
4 files changed, 24 insertions(+), 5 deletions(-)
create mode 100644 drivers/usb/musb/Kconfig
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
index 0b349bf..15010f5 100644
--- a/drivers/usb/Kconfig
+++ b/drivers/usb/Kconfig
@@ -7,6 +7,8 @@ source drivers/usb/imx/Kconfig
source drivers/usb/host/Kconfig
+source drivers/usb/musb/Kconfig
+
source drivers/usb/otg/Kconfig
source drivers/usb/storage/Kconfig
diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile
index 3cefab7..25820eb 100644
--- a/drivers/usb/Makefile
+++ b/drivers/usb/Makefile
@@ -4,4 +4,5 @@ obj-$(CONFIG_USB_GADGET) += gadget/
obj-$(CONFIG_USB_STORAGE) += storage/
obj-y += host/
obj-y += otg/
+obj-y += musb/
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig
new file mode 100644
index 0000000..0a88355
--- /dev/null
+++ b/drivers/usb/musb/Kconfig
@@ -0,0 +1,21 @@
+config USB_MUSB_HOST
+ tristate 'Inventra Highspeed Dual Role Controller (TI, ADI, ...)'
+ depends on USB
+ select MUSB_PIO_ONLY
+ select USB_MUSB_DSPS
+ help
+ Say Y here if your system has a dual role high speed USB
+ controller based on the Mentor Graphics silicon IP. Then
+ configure options to match your silicon and the board
+ it's being used with, including the USB peripheral role,
+ or the USB host role, or both.
+
+if USB_MUSB_HOST
+
+config USB_MUSB_DSPS
+ bool USB_MUSB_DSPS
+
+config MUSB_PIO_ONLY
+ bool MUSB_PIO_ONLY
+
+endif # USB_MUSB_HOST
diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile
index 64ebe06..e6cc408 100644
--- a/drivers/usb/musb/Makefile
+++ b/drivers/usb/musb/Makefile
@@ -4,8 +4,3 @@
obj-$(CONFIG_USB_MUSB_HOST) += musb_host.o musb_core.o
obj-$(CONFIG_USB_MUSB_DSPS) += musb_dsps.o
-
-CFLAGS_NO_WARN := $(call cc-option,-Wno-unused-variable) \
- $(call cc-option,-Wno-unused-but-set-variable) \
- $(call cc-option,-Wno-unused-label)
-CFLAGS += $(CFLAGS_NO_WARN)
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 10/18] arm: pcm051: enable musb in defconfig
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
` (7 preceding siblings ...)
2014-06-13 7:54 ` [PATCH 09/18] musb: adapt Kconfig and Makefiles Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 11/18] musb: adapt driver to work on barebox Christoph Fritz
` (7 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
---
arch/arm/configs/am335x_defconfig | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/arm/configs/am335x_defconfig b/arch/arm/configs/am335x_defconfig
index 0c92c96..a9bf5e0 100644
--- a/arch/arm/configs/am335x_defconfig
+++ b/arch/arm/configs/am335x_defconfig
@@ -96,6 +96,8 @@ CONFIG_NAND=y
CONFIG_NAND_OMAP_GPMC=y
CONFIG_MTD_UBI=y
CONFIG_USB=y
+CONFIG_USB_MUSB_HOST=y
+CONFIG_USB_STORAGE=y
CONFIG_MCI=y
CONFIG_MCI_STARTUP=y
CONFIG_MCI_OMAP_HSMMC=y
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 11/18] musb: adapt driver to work on barebox
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
` (8 preceding siblings ...)
2014-06-13 7:54 ` [PATCH 10/18] arm: pcm051: enable musb in defconfig Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-14 20:53 ` Michael Grzeschik
2014-06-13 7:54 ` [PATCH 12/18] musb: only support USB_SPEED_HIGH devices Christoph Fritz
` (6 subsequent siblings)
16 siblings, 1 reply; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
---
drivers/usb/musb/linux-compat.h | 31 +-------
drivers/usb/musb/musb.h | 164 +++++++++++++++++++++++++++++++++++++++
drivers/usb/musb/musb_core.c | 20 +++--
drivers/usb/musb/musb_core.h | 42 +++-------
drivers/usb/musb/musb_dsps.c | 2 -
drivers/usb/musb/musb_host.c | 2 +-
drivers/usb/musb/musb_io.h | 19 -----
drivers/usb/musb/usb-compat.h | 2 +-
include/usb/musb.h | 162 --------------------------------------
9 files changed, 192 insertions(+), 252 deletions(-)
create mode 100644 drivers/usb/musb/musb.h
delete mode 100644 include/usb/musb.h
diff --git a/drivers/usb/musb/linux-compat.h b/drivers/usb/musb/linux-compat.h
index d7a5663..5cfa9d1 100644
--- a/drivers/usb/musb/linux-compat.h
+++ b/drivers/usb/musb/linux-compat.h
@@ -3,7 +3,7 @@
#include <malloc.h>
#include <linux/list.h>
-#include <linux/compat.h>
+#include <notifier.h>
#define __init
#define __devinit
@@ -16,21 +16,13 @@ struct unused {};
typedef struct unused unused_t;
typedef int irqreturn_t;
-typedef unused_t spinlock_t;
struct work_struct {};
struct timer_list {};
-struct notifier_block {};
typedef unsigned long dmaaddr_t;
-#define spin_lock_init(lock) do {} while (0)
-#define spin_lock(lock) do {} while (0)
-#define spin_unlock(lock) do {} while (0)
-#define spin_lock_irqsave(lock, flags) do {} while (0)
-#define spin_unlock_irqrestore(lock, flags) do {} while (0)
-
#define setup_timer(timer, func, data) do {} while (0)
#define del_timer_sync(timer) do {} while (0)
#define schedule_work(work) do {} while (0)
@@ -38,14 +30,6 @@ typedef unsigned long dmaaddr_t;
#define cpu_relax() do {} while (0)
-#define pr_debug(fmt, args...) debug(fmt, ##args)
-
-#define WARN(condition, fmt, args...) ({ \
- int ret_warn = !!condition; \
- if (ret_warn) \
- printf(fmt, ##args); \
- ret_warn; })
-
#define pm_runtime_get_sync(dev) do {} while (0)
#define pm_runtime_put(dev) do {} while (0)
#define pm_runtime_put_sync(dev) do {} while (0)
@@ -53,20 +37,9 @@ typedef unsigned long dmaaddr_t;
#define pm_runtime_set_autosuspend_delay(dev, delay) do {} while (0)
#define pm_runtime_enable(dev) do {} while (0)
-#define MODULE_DESCRIPTION(desc)
-#define MODULE_AUTHOR(author)
-#define MODULE_LICENSE(license)
#define MODULE_ALIAS(alias)
#define module_param(name, type, perm)
#define MODULE_PARM_DESC(name, desc)
-#define EXPORT_SYMBOL_GPL(name)
-
-#define writesl(a, d, s) __raw_writesl((unsigned long)a, d, s)
-#define readsl(a, d, s) __raw_readsl((unsigned long)a, d, s)
-#define writesw(a, d, s) __raw_writesw((unsigned long)a, d, s)
-#define readsw(a, d, s) __raw_readsw((unsigned long)a, d, s)
-#define writesb(a, d, s) __raw_writesb((unsigned long)a, d, s)
-#define readsb(a, d, s) __raw_readsb((unsigned long)a, d, s)
#define IRQ_NONE 0
#define IRQ_HANDLED 0
@@ -80,8 +53,6 @@ typedef unsigned long dmaaddr_t;
#define device_init_wakeup(dev, a) do {} while (0)
-#define platform_data device_data
-
#ifndef wmb
#define wmb() asm volatile ("" : : : "memory")
#endif
diff --git a/drivers/usb/musb/musb.h b/drivers/usb/musb/musb.h
new file mode 100644
index 0000000..2296a1b
--- /dev/null
+++ b/drivers/usb/musb/musb.h
@@ -0,0 +1,164 @@
+/*
+ * This is used to for host and peripheral modes of the driver for
+ * Inventra (Multidrop) Highspeed Dual-Role Controllers: (M)HDRC.
+ *
+ * Board initialization should put one of these into dev->platform_data,
+ * probably on some platform_device named "musb-hdrc". It encapsulates
+ * key configuration differences between boards.
+ */
+
+#ifndef __LINUX_USB_MUSB_H
+#define __LINUX_USB_MUSB_H
+
+#ifndef __deprecated
+#define __deprecated
+#endif
+
+/* The USB role is defined by the connector used on the board, so long as
+ * standards are being followed. (Developer boards sometimes won't.)
+ */
+enum musb_mode {
+ MUSB_UNDEFINED = 0,
+ MUSB_HOST, /* A or Mini-A connector */
+ MUSB_PERIPHERAL, /* B or Mini-B connector */
+ MUSB_OTG /* Mini-AB connector */
+};
+
+struct clk;
+
+enum musb_fifo_style {
+ FIFO_RXTX,
+ FIFO_TX,
+ FIFO_RX
+} __attribute__ ((packed));
+
+enum musb_buf_mode {
+ BUF_SINGLE,
+ BUF_DOUBLE
+} __attribute__ ((packed));
+
+struct musb_fifo_cfg {
+ u8 hw_ep_num;
+ enum musb_fifo_style style;
+ enum musb_buf_mode mode;
+ u16 maxpacket;
+};
+
+#define MUSB_EP_FIFO(ep, st, m, pkt) \
+{ \
+ .hw_ep_num = ep, \
+ .style = st, \
+ .mode = m, \
+ .maxpacket = pkt, \
+}
+
+#define MUSB_EP_FIFO_SINGLE(ep, st, pkt) \
+ MUSB_EP_FIFO(ep, st, BUF_SINGLE, pkt)
+
+#define MUSB_EP_FIFO_DOUBLE(ep, st, pkt) \
+ MUSB_EP_FIFO(ep, st, BUF_DOUBLE, pkt)
+
+struct musb_hdrc_eps_bits {
+ const char name[16];
+ u8 bits;
+};
+
+struct musb_hdrc_config {
+ struct musb_fifo_cfg *fifo_cfg; /* board fifo configuration */
+ unsigned fifo_cfg_size; /* size of the fifo configuration */
+
+ /* MUSB configuration-specific details */
+ unsigned multipoint:1; /* multipoint device */
+ unsigned dyn_fifo:1 __deprecated; /* supports dynamic fifo sizing */
+ unsigned soft_con:1 __deprecated; /* soft connect required */
+ unsigned utm_16:1 __deprecated; /* utm data witdh is 16 bits */
+ unsigned big_endian:1; /* true if CPU uses big-endian */
+ unsigned mult_bulk_tx:1; /* Tx ep required for multbulk pkts */
+ unsigned mult_bulk_rx:1; /* Rx ep required for multbulk pkts */
+ unsigned high_iso_tx:1; /* Tx ep required for HB iso */
+ unsigned high_iso_rx:1; /* Rx ep required for HD iso */
+ unsigned dma:1 __deprecated; /* supports DMA */
+ unsigned vendor_req:1 __deprecated; /* vendor registers required */
+
+ u8 num_eps; /* number of endpoints _with_ ep0 */
+ u8 dma_channels __deprecated; /* number of dma channels */
+ u8 dyn_fifo_size; /* dynamic size in bytes */
+ u8 vendor_ctrl __deprecated; /* vendor control reg width */
+ u8 vendor_stat __deprecated; /* vendor status reg witdh */
+ u8 dma_req_chan __deprecated; /* bitmask for required dma channels */
+ u8 ram_bits; /* ram address size */
+
+ struct musb_hdrc_eps_bits *eps_bits __deprecated;
+#ifdef CONFIG_BLACKFIN
+ /* A GPIO controlling VRSEL in Blackfin */
+ unsigned int gpio_vrsel;
+ unsigned int gpio_vrsel_active;
+ /* musb CLKIN in Blackfin in MHZ */
+ unsigned char clkin;
+#endif
+
+};
+
+struct musb_hdrc_platform_data {
+ /* MUSB_HOST, MUSB_PERIPHERAL, or MUSB_OTG */
+ u8 mode;
+
+ /* for clk_get() */
+ const char *clock;
+
+#ifndef __BAREBOX__
+ /* (HOST or OTG) switch VBUS on/off */
+ int (*set_vbus)(struct device *dev, int is_on);
+#endif
+
+ /* (HOST or OTG) mA/2 power supplied on (default = 8mA) */
+ u8 power;
+
+ /* (PERIPHERAL) mA/2 max power consumed (default = 100mA) */
+ u8 min_power;
+
+ /* (HOST or OTG) msec/2 after VBUS on till power good */
+ u8 potpgt;
+
+ /* (HOST or OTG) program PHY for external Vbus */
+ unsigned extvbus:1;
+
+ /* Power the device on or off */
+ int (*set_power)(int state);
+
+ /* MUSB configuration-specific details */
+ struct musb_hdrc_config *config;
+
+ /* Architecture specific board data */
+ void *board_data;
+
+ /* Platform specific struct musb_ops pointer */
+ const void *platform_ops;
+};
+
+
+/* TUSB 6010 support */
+
+#define TUSB6010_OSCCLK_60 16667 /* psec/clk @ 60.0 MHz */
+#define TUSB6010_REFCLK_24 41667 /* psec/clk @ 24.0 MHz XI */
+#define TUSB6010_REFCLK_19 52083 /* psec/clk @ 19.2 MHz CLKIN */
+
+#ifdef CONFIG_ARCH_OMAP2
+
+extern int __init tusb6010_setup_interface(
+ struct musb_hdrc_platform_data *data,
+ unsigned ps_refclk, unsigned waitpin,
+ unsigned async_cs, unsigned sync_cs,
+ unsigned irq, unsigned dmachan);
+
+extern int tusb6010_platform_retime(unsigned is_refclk);
+
+#endif /* OMAP2 */
+
+/*
+ * U-Boot specfic stuff
+ */
+int musb_register(struct musb_hdrc_platform_data *plat, void *bdata,
+ void *ctl_regs);
+
+#endif /* __LINUX_USB_MUSB_H */
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index 546f656..6dbf1cc 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -102,11 +102,13 @@
#include <linux/io.h>
#else
#include <common.h>
-#include <usb.h>
-#include <asm/errno.h>
-#include <linux/usb/ch9.h>
-#include <linux/usb/gadget.h>
-#include <linux/usb/musb.h>
+#include <usb/usb.h>
+#include <errno.h>
+#ifdef __BAREBOX__
+#include "musb.h"
+#else
+#include <usb/musb.h>
+#endif
#include <asm/io.h>
#include "linux-compat.h"
#include "usb-compat.h"
@@ -1836,7 +1838,7 @@ static void musb_irq_work(struct work_struct *data)
*/
static struct musb *__devinit
-allocate_instance(struct device *dev,
+allocate_instance(struct device_d *dev,
struct musb_hdrc_config *config, void __iomem *mbase)
{
struct musb *musb;
@@ -1924,7 +1926,7 @@ static int __devinit
musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
#else
struct musb *
-musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev,
+musb_init_controller(struct musb_hdrc_platform_data *plat, struct device_d *dev,
void *ctrl)
#endif
{
@@ -2091,8 +2093,10 @@ musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev,
musb->xceiv->state = OTG_STATE_B_IDLE;
#endif
+#ifdef CONFIG_MUSB_GADGET
if (is_peripheral_capable())
status = musb_gadget_setup(musb);
+#endif
#ifndef __BAREBOX__
dev_dbg(musb->controller, "%s mode, status %d, dev%02x\n",
@@ -2144,7 +2148,9 @@ fail4:
usb_remove_hcd(musb_to_hcd(musb));
else
#endif
+#ifdef CONFIG_MUSB_GADGET
musb_gadget_cleanup(musb);
+#endif
fail3:
pm_runtime_put_sync(musb->controller);
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h
index 8f8d791..5bf87f9 100644
--- a/drivers/usb/musb/musb_core.h
+++ b/drivers/usb/musb/musb_core.h
@@ -45,11 +45,14 @@
#include <linux/usb.h>
#include <linux/usb/otg.h>
#else
-#include <asm/errno.h>
+#include <errno.h>
#endif
-#include <linux/usb/ch9.h>
-#include <linux/usb/gadget.h>
-#include <linux/usb/musb.h>
+#ifdef __BAREBOX__
+#include "musb.h"
+#else
+#include <usb/musb.h>
+#endif
+#include <usb/usb.h>
struct musb;
struct musb_hw_ep;
@@ -71,7 +74,6 @@ struct musb_ep;
#include "musb_io.h"
#include "musb_regs.h"
-#include "musb_gadget.h"
#ifndef __BAREBOX__
#include <linux/usb/hcd.h>
#endif
@@ -118,7 +120,7 @@ extern void musb_g_disconnect(struct musb *);
#ifndef __BAREBOX__
#define is_host_capable() (1)
#else
-#ifdef CONFIG_MUSB_HOST
+#ifdef CONFIG_USB_MUSB_HOST
#define is_host_capable() (1)
#else
#define is_host_capable() (0)
@@ -168,7 +170,6 @@ enum musb_g_ep0_state {
#define OTG_TIME_A_AIDL_BDIS 200 /* min 200 msec */
#define OTG_TIME_B_ASE0_BRST 100 /* min 3.125 ms */
-
/*************************** REGISTER ACCESS ********************************/
/* Endpoint registers (other than dynfifo setup) can be accessed either
@@ -289,22 +290,8 @@ struct musb_hw_ep {
u8 rx_reinit;
u8 tx_reinit;
-
- /* peripheral side */
- struct musb_ep ep_in; /* TX */
- struct musb_ep ep_out; /* RX */
};
-static inline struct musb_request *next_in_request(struct musb_hw_ep *hw_ep)
-{
- return next_request(&hw_ep->ep_in);
-}
-
-static inline struct musb_request *next_out_request(struct musb_hw_ep *hw_ep)
-{
- return next_request(&hw_ep->ep_out);
-}
-
struct musb_csr_regs {
/* FIFO registers */
u16 txmaxp, txcsr, rxmaxp, rxcsr;
@@ -369,7 +356,7 @@ struct musb {
struct dma_controller *dma_controller;
- struct device *controller;
+ struct device_d *controller;
void __iomem *ctrl_base;
void __iomem *mregs;
@@ -447,8 +434,6 @@ struct musb {
u8 test_mode_nr;
u16 ackpend; /* ep0 */
enum musb_g_ep0_state ep0_state;
- struct usb_gadget g; /* the gadget */
- struct usb_gadget_driver *gadget_driver; /* its driver */
/*
* FIXME: Remove this flag.
@@ -465,16 +450,13 @@ struct musb {
struct musb_hdrc_config *config;
+ struct usb_host barebox_host;
+
#ifdef MUSB_CONFIG_PROC_FS
struct proc_dir_entry *proc_entry;
#endif
};
-static inline struct musb *gadget_to_musb(struct usb_gadget *g)
-{
- return container_of(g, struct musb, g);
-}
-
#ifdef CONFIG_BLACKFIN
static inline int musb_read_fifosize(struct musb *musb,
struct musb_hw_ep *hw_ep, u8 epnum)
@@ -617,7 +599,7 @@ static inline int musb_platform_exit(struct musb *musb)
#ifdef __BAREBOX__
struct musb *
-musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev,
+musb_init_controller(struct musb_hdrc_platform_data *plat, struct device_d *dev,
void *ctrl);
#endif
#endif /* __MUSB_CORE_H__ */
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index c1caf57..2aa2fbc 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -333,8 +333,6 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
if (usbintr)
dsps_writel(reg_base, wrp->coreintr_status, usbintr);
- dev_dbg(musb->controller, "usbintr (%x) epintr(%x)\n",
- usbintr, epintr);
#ifndef __BAREBOX__
/*
* DRVVBUS IRQs are the only proxy we have (a very poor one!) for
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
index 120849d..cc4a8f8 100644
--- a/drivers/usb/musb/musb_host.c
+++ b/drivers/usb/musb/musb_host.c
@@ -45,7 +45,7 @@
#include <linux/dma-mapping.h>
#else
#include <common.h>
-#include <usb.h>
+#include <usb/usb.h>
#include "linux-compat.h"
#include "usb-compat.h"
#endif
diff --git a/drivers/usb/musb/musb_io.h b/drivers/usb/musb/musb_io.h
index efc4ef9..0a06c5e 100644
--- a/drivers/usb/musb/musb_io.h
+++ b/drivers/usb/musb/musb_io.h
@@ -41,25 +41,6 @@
#include <asm/io.h>
#endif
-#if !defined(CONFIG_ARM) && !defined(CONFIG_SUPERH) \
- && !defined(CONFIG_AVR32) && !defined(CONFIG_PPC32) \
- && !defined(CONFIG_PPC64) && !defined(CONFIG_BLACKFIN) \
- && !defined(CONFIG_MIPS) && !defined(CONFIG_M68K)
-static inline void readsl(const void __iomem *addr, void *buf, int len)
- { insl((unsigned long)addr, buf, len); }
-static inline void readsw(const void __iomem *addr, void *buf, int len)
- { insw((unsigned long)addr, buf, len); }
-static inline void readsb(const void __iomem *addr, void *buf, int len)
- { insb((unsigned long)addr, buf, len); }
-
-static inline void writesl(const void __iomem *addr, const void *buf, int len)
- { outsl((unsigned long)addr, buf, len); }
-static inline void writesw(const void __iomem *addr, const void *buf, int len)
- { outsw((unsigned long)addr, buf, len); }
-static inline void writesb(const void __iomem *addr, const void *buf, int len)
- { outsb((unsigned long)addr, buf, len); }
-
-#endif
#ifndef CONFIG_BLACKFIN
diff --git a/drivers/usb/musb/usb-compat.h b/drivers/usb/musb/usb-compat.h
index 27f656f..01a4329 100644
--- a/drivers/usb/musb/usb-compat.h
+++ b/drivers/usb/musb/usb-compat.h
@@ -1,7 +1,7 @@
#ifndef __USB_COMPAT_H__
#define __USB_COMPAT_H__
-#include "usb.h"
+#include <usb/usb.h>
struct usb_hcd {
void *hcd_priv;
diff --git a/include/usb/musb.h b/include/usb/musb.h
deleted file mode 100644
index 9f65ef9..0000000
--- a/include/usb/musb.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * This is used to for host and peripheral modes of the driver for
- * Inventra (Multidrop) Highspeed Dual-Role Controllers: (M)HDRC.
- *
- * Board initialization should put one of these into dev->platform_data,
- * probably on some platform_device named "musb-hdrc". It encapsulates
- * key configuration differences between boards.
- */
-
-#ifndef __LINUX_USB_MUSB_H
-#define __LINUX_USB_MUSB_H
-
-#ifndef __deprecated
-#define __deprecated
-#endif
-
-/* The USB role is defined by the connector used on the board, so long as
- * standards are being followed. (Developer boards sometimes won't.)
- */
-enum musb_mode {
- MUSB_UNDEFINED = 0,
- MUSB_HOST, /* A or Mini-A connector */
- MUSB_PERIPHERAL, /* B or Mini-B connector */
- MUSB_OTG /* Mini-AB connector */
-};
-
-struct clk;
-
-enum musb_fifo_style {
- FIFO_RXTX,
- FIFO_TX,
- FIFO_RX
-} __attribute__ ((packed));
-
-enum musb_buf_mode {
- BUF_SINGLE,
- BUF_DOUBLE
-} __attribute__ ((packed));
-
-struct musb_fifo_cfg {
- u8 hw_ep_num;
- enum musb_fifo_style style;
- enum musb_buf_mode mode;
- u16 maxpacket;
-};
-
-#define MUSB_EP_FIFO(ep, st, m, pkt) \
-{ \
- .hw_ep_num = ep, \
- .style = st, \
- .mode = m, \
- .maxpacket = pkt, \
-}
-
-#define MUSB_EP_FIFO_SINGLE(ep, st, pkt) \
- MUSB_EP_FIFO(ep, st, BUF_SINGLE, pkt)
-
-#define MUSB_EP_FIFO_DOUBLE(ep, st, pkt) \
- MUSB_EP_FIFO(ep, st, BUF_DOUBLE, pkt)
-
-struct musb_hdrc_eps_bits {
- const char name[16];
- u8 bits;
-};
-
-struct musb_hdrc_config {
- struct musb_fifo_cfg *fifo_cfg; /* board fifo configuration */
- unsigned fifo_cfg_size; /* size of the fifo configuration */
-
- /* MUSB configuration-specific details */
- unsigned multipoint:1; /* multipoint device */
- unsigned dyn_fifo:1 __deprecated; /* supports dynamic fifo sizing */
- unsigned soft_con:1 __deprecated; /* soft connect required */
- unsigned utm_16:1 __deprecated; /* utm data witdh is 16 bits */
- unsigned big_endian:1; /* true if CPU uses big-endian */
- unsigned mult_bulk_tx:1; /* Tx ep required for multbulk pkts */
- unsigned mult_bulk_rx:1; /* Rx ep required for multbulk pkts */
- unsigned high_iso_tx:1; /* Tx ep required for HB iso */
- unsigned high_iso_rx:1; /* Rx ep required for HD iso */
- unsigned dma:1 __deprecated; /* supports DMA */
- unsigned vendor_req:1 __deprecated; /* vendor registers required */
-
- u8 num_eps; /* number of endpoints _with_ ep0 */
- u8 dma_channels __deprecated; /* number of dma channels */
- u8 dyn_fifo_size; /* dynamic size in bytes */
- u8 vendor_ctrl __deprecated; /* vendor control reg width */
- u8 vendor_stat __deprecated; /* vendor status reg witdh */
- u8 dma_req_chan __deprecated; /* bitmask for required dma channels */
- u8 ram_bits; /* ram address size */
-
- struct musb_hdrc_eps_bits *eps_bits __deprecated;
-#ifdef CONFIG_BLACKFIN
- /* A GPIO controlling VRSEL in Blackfin */
- unsigned int gpio_vrsel;
- unsigned int gpio_vrsel_active;
- /* musb CLKIN in Blackfin in MHZ */
- unsigned char clkin;
-#endif
-
-};
-
-struct musb_hdrc_platform_data {
- /* MUSB_HOST, MUSB_PERIPHERAL, or MUSB_OTG */
- u8 mode;
-
- /* for clk_get() */
- const char *clock;
-
- /* (HOST or OTG) switch VBUS on/off */
- int (*set_vbus)(struct device *dev, int is_on);
-
- /* (HOST or OTG) mA/2 power supplied on (default = 8mA) */
- u8 power;
-
- /* (PERIPHERAL) mA/2 max power consumed (default = 100mA) */
- u8 min_power;
-
- /* (HOST or OTG) msec/2 after VBUS on till power good */
- u8 potpgt;
-
- /* (HOST or OTG) program PHY for external Vbus */
- unsigned extvbus:1;
-
- /* Power the device on or off */
- int (*set_power)(int state);
-
- /* MUSB configuration-specific details */
- struct musb_hdrc_config *config;
-
- /* Architecture specific board data */
- void *board_data;
-
- /* Platform specific struct musb_ops pointer */
- const void *platform_ops;
-};
-
-
-/* TUSB 6010 support */
-
-#define TUSB6010_OSCCLK_60 16667 /* psec/clk @ 60.0 MHz */
-#define TUSB6010_REFCLK_24 41667 /* psec/clk @ 24.0 MHz XI */
-#define TUSB6010_REFCLK_19 52083 /* psec/clk @ 19.2 MHz CLKIN */
-
-#ifdef CONFIG_ARCH_OMAP2
-
-extern int __init tusb6010_setup_interface(
- struct musb_hdrc_platform_data *data,
- unsigned ps_refclk, unsigned waitpin,
- unsigned async_cs, unsigned sync_cs,
- unsigned irq, unsigned dmachan);
-
-extern int tusb6010_platform_retime(unsigned is_refclk);
-
-#endif /* OMAP2 */
-
-/*
- * U-Boot specfic stuff
- */
-int musb_register(struct musb_hdrc_platform_data *plat, void *bdata,
- void *ctl_regs);
-
-#endif /* __LINUX_USB_MUSB_H */
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 12/18] musb: only support USB_SPEED_HIGH devices
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
` (9 preceding siblings ...)
2014-06-13 7:54 ` [PATCH 11/18] musb: adapt driver to work on barebox Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 13/18] usb: add musb support Christoph Fritz
` (5 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
This patch enables usb high-speed power. To support full-speed or low-speed
devices, this patch needs to be reverted.
---
drivers/usb/musb/musb_core.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index 6dbf1cc..2847444 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -943,10 +943,7 @@ void musb_start(struct musb *musb)
musb_writeb(regs, MUSB_TESTMODE, 0);
/* put into basic highspeed mode and start session */
- musb_writeb(regs, MUSB_POWER, MUSB_POWER_ISOUPDATE
-#ifdef CONFIG_USB_GADGET_DUALSPEED
- | MUSB_POWER_HSENAB
-#endif
+ musb_writeb(regs, MUSB_POWER, MUSB_POWER_ISOUPDATE | MUSB_POWER_HSENAB
/* ENSUSPEND wedges tusb */
/* | MUSB_POWER_ENSUSPEND */
);
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 13/18] usb: add musb support
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
` (10 preceding siblings ...)
2014-06-13 7:54 ` [PATCH 12/18] musb: only support USB_SPEED_HIGH devices Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 14/18] arm: am33xx: add usb base addresses Christoph Fritz
` (4 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
---
include/usb/usb.h | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/include/usb/usb.h b/include/usb/usb.h
index 1a369d2..6e204b4 100644
--- a/include/usb/usb.h
+++ b/include/usb/usb.h
@@ -27,6 +27,7 @@
#include <driver.h>
#include <usb/usb_defs.h>
#include <asm/byteorder.h>
+#include <asm/unaligned.h>
/* Everything is aribtrary */
#define USB_ALTSETTINGALLOC 4
@@ -41,6 +42,31 @@
#define USB_CNTL_TIMEOUT 100 /* 100ms timeout */
+/**
+ * struct usb_ctrlrequest - SETUP data for a USB device control request
+ * @bRequestType: matches the USB bmRequestType field
+ * @bRequest: matches the USB bRequest field
+ * @wValue: matches the USB wValue field (le16 byte order)
+ * @wIndex: matches the USB wIndex field (le16 byte order)
+ * @wLength: matches the USB wLength field (le16 byte order)
+ *
+ * This structure is used to send control requests to a USB device. It matches
+ * the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the
+ * USB spec for a fuller description of the different fields, and what they are
+ * used for.
+ *
+ * Note that the driver for any interface can issue control requests.
+ * For most devices, interfaces don't coordinate with each other, so
+ * such requests may be made at any time.
+ */
+struct usb_ctrlrequest {
+ __u8 bRequestType;
+ __u8 bRequest;
+ __le16 wValue;
+ __le16 wIndex;
+ __le16 wLength;
+} __attribute__ ((packed));
+
/* String descriptor */
struct usb_string_descriptor {
unsigned char bLength;
@@ -539,4 +565,40 @@ enum usb_phy_interface {
USBPHY_INTERFACE_MODE_SERIAL,
USBPHY_INTERFACE_MODE_HSIC,
};
+
+
+/**
+ * usb_endpoint_maxp - get endpoint's max packet size
+ * @epd: endpoint to be checked
+ *
+ * Returns @epd's max packet
+ */
+static inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd)
+{
+ return __le16_to_cpu(get_unaligned(&epd->wMaxPacketSize));
+}
+
+/**
+ * usb_endpoint_type - get the endpoint's transfer type
+ * @epd: endpoint to be checked
+ *
+ * Returns one of USB_ENDPOINT_XFER_{CONTROL, ISOC, BULK, INT} according
+ * to @epd's transfer type.
+ */
+static inline int usb_endpoint_type(const struct usb_endpoint_descriptor *epd)
+{
+ return epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
+}
+
+/**
+ * usb_endpoint_num - get the endpoint's number
+ * @epd: endpoint to be checked
+ *
+ * Returns @epd's number: 0 to 15.
+ */
+static inline int usb_endpoint_num(const struct usb_endpoint_descriptor *epd)
+{
+ return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
+}
+
#endif /*_USB_H_ */
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 14/18] arm: am33xx: add usb base addresses
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
` (11 preceding siblings ...)
2014-06-13 7:54 ` [PATCH 13/18] usb: add musb support Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 15/18] arm: am33xx: add usb platform helper code Christoph Fritz
` (3 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
---
arch/arm/mach-omap/include/mach/am33xx-silicon.h | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/arch/arm/mach-omap/include/mach/am33xx-silicon.h b/arch/arm/mach-omap/include/mach/am33xx-silicon.h
index 20b8e81..bccae89 100644
--- a/arch/arm/mach-omap/include/mach/am33xx-silicon.h
+++ b/arch/arm/mach-omap/include/mach/am33xx-silicon.h
@@ -76,6 +76,16 @@
/* Watchdog Timer */
#define AM33XX_WDT_BASE 0x44E35000
+/* USB */
+#define AM33XX_USBSS_BASE 0x47400000
+#define AM33XX_USB0_BASE 0x47401000
+#define AM33XX_USB0_PHY_BASE 0x47401300
+#define AM33XX_USB0_CORE_BASE 0x47401400
+#define USB1_OFFSET 0x00000800
+#define AM33XX_USB1_BASE (AM33XX_USB0_BASE + USB1_OFFSET)
+#define AM33XX_USB1_PHY_BASE (AM33XX_USB0_PHY_BASE + USB1_OFFSET)
+#define AM33XX_USB1_CORE_BASE (AM33XX_USB0_CORE_BASE + USB1_OFFSET)
+
/* EMIF Base address */
#define AM33XX_EMIF4_0_CFG_BASE 0x4C000000
#define AM33XX_EMIF4_1_CFG_BASE 0x4D000000
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 15/18] arm: am33xx: add usb platform helper code
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
` (12 preceding siblings ...)
2014-06-13 7:54 ` [PATCH 14/18] arm: am33xx: add usb base addresses Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 16/18] musb: add barebox gluecode Christoph Fritz
` (2 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
---
arch/arm/mach-omap/Makefile | 2 +-
arch/arm/mach-omap/am33xx_usb.c | 65 ++++++++++++++++++++++++++
arch/arm/mach-omap/include/mach/am33xx-usb.h | 11 +++++
3 files changed, 77 insertions(+), 1 deletion(-)
create mode 100644 arch/arm/mach-omap/am33xx_usb.c
create mode 100644 arch/arm/mach-omap/include/mach/am33xx-usb.h
diff --git a/arch/arm/mach-omap/Makefile b/arch/arm/mach-omap/Makefile
index c9b6f4b..789f91b 100644
--- a/arch/arm/mach-omap/Makefile
+++ b/arch/arm/mach-omap/Makefile
@@ -23,7 +23,7 @@ obj-$(CONFIG_ARCH_OMAP3) += omap3_generic.o auxcr.o
pbl-$(CONFIG_ARCH_OMAP3) += omap3_generic.o auxcr.o
obj-$(CONFIG_ARCH_OMAP4) += omap4_generic.o omap4_clock.o
pbl-$(CONFIG_ARCH_OMAP4) += omap4_generic.o omap4_clock.o
-obj-pbl-$(CONFIG_ARCH_AM33XX) += am33xx_generic.o am33xx_clock.o am33xx_mux.o
+obj-pbl-$(CONFIG_ARCH_AM33XX) += am33xx_generic.o am33xx_clock.o am33xx_mux.o am33xx_usb.o
obj-$(CONFIG_OMAP3_CLOCK_CONFIG) += omap3_clock.o
pbl-$(CONFIG_OMAP3_CLOCK_CONFIG) += omap3_clock.o
obj-$(CONFIG_OMAP_GPMC) += gpmc.o devices-gpmc-nand.o
diff --git a/arch/arm/mach-omap/am33xx_usb.c b/arch/arm/mach-omap/am33xx_usb.c
new file mode 100644
index 0000000..b4d570e
--- /dev/null
+++ b/arch/arm/mach-omap/am33xx_usb.c
@@ -0,0 +1,65 @@
+#include <driver.h>
+#include <common.h>
+#include <linux/ioport.h>
+#include <mach/am33xx-silicon.h>
+#include <mach/am33xx-usb.h>
+
+#ifdef CONFIG_USB_MUSB_HOST
+static struct resource am33xx_usb_resources[] = {
+ {
+ .name = "am33xx_usbss",
+ .start = AM33XX_USBSS_BASE,
+ .end = AM33XX_USBSS_BASE + 1024 - 1,
+ .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT,
+ }, {
+ .name = "am33xx_usb0",
+ .start = AM33XX_USB0_BASE,
+ .end = AM33XX_USB0_BASE + 767 - 1,
+ .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT,
+ }, {
+ .name = "am33xx_usb1",
+ .start = AM33XX_USB1_BASE,
+ .end = AM33XX_USB1_BASE + 767 - 1,
+ .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT,
+ }, {
+ .name = "am33xx_usb0phy",
+ .start = AM33XX_USB0_PHY_BASE,
+ .end = AM33XX_USB0_PHY_BASE + 255 - 1,
+ .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT,
+ }, {
+ .name = "am33xx_usb1phy",
+ .start = AM33XX_USB1_PHY_BASE,
+ .end = AM33XX_USB1_PHY_BASE + 255 - 1,
+ .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT,
+ }, {
+ .name = "am33xx_usb0core",
+ .start = AM33XX_USB0_CORE_BASE,
+ .end = AM33XX_USB0_CORE_BASE + 1023 - 1,
+ .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT,
+ }, {
+ .name = "am33xx_usb1core",
+ .start = AM33XX_USB1_CORE_BASE,
+ .end = AM33XX_USB1_CORE_BASE + 1023 - 1,
+ .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT,
+ }, {
+ .name = "am33xx_ctrl_device_base",
+ .start = AM33XX_IDCODE_REG,
+ .end = AM33XX_IDCODE_REG + 128 - 1,
+ .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT,
+ },
+};
+
+struct device_d *am33xx_add_usb(struct am33xx_usb_pdata *a_pdata)
+{
+ return add_generic_device_res("am33xx_usb", -1,
+ am33xx_usb_resources,
+ ARRAY_SIZE(am33xx_usb_resources),
+ a_pdata);
+}
+#else
+struct device_d *am33xx_add_usb(struct am33xx_usb_pdata *a_pdata)
+{
+ return NULL;
+}
+#endif
+EXPORT_SYMBOL(am33xx_add_usb0);
diff --git a/arch/arm/mach-omap/include/mach/am33xx-usb.h b/arch/arm/mach-omap/include/mach/am33xx-usb.h
new file mode 100644
index 0000000..ff3b000
--- /dev/null
+++ b/arch/arm/mach-omap/include/mach/am33xx-usb.h
@@ -0,0 +1,11 @@
+#ifndef H_BAREBOX_ARCH_ARM_MACH_OMAP_MACH_AUSB_H
+#define H_BAREBOX_ARCH_ARM_MACH_OMAP_MACH_AUSB_H
+
+struct am33xx_usb_pdata {
+ unsigned int bus_number;
+};
+
+struct device_d;
+struct device_d *am33xx_add_usb(struct am33xx_usb_pdata *a_pdata);
+
+#endif /* H_BAREBOX_ARCH_ARM_MACH_OMAP_MACH_AUSB_H */
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 16/18] musb: add barebox gluecode
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
` (13 preceding siblings ...)
2014-06-13 7:54 ` [PATCH 15/18] arm: am33xx: add usb platform helper code Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 17/18] arm: pcm051: enable USB pinmux Christoph Fritz
2014-06-13 7:54 ` [PATCH 18/18] arm: pcm051: enable USB Christoph Fritz
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
---
drivers/usb/musb/Makefile | 2 +-
drivers/usb/musb/musb_barebox.c | 306 +++++++++++++++++++++++++++++++++++++++
2 files changed, 307 insertions(+), 1 deletion(-)
create mode 100644 drivers/usb/musb/musb_barebox.c
diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile
index e6cc408..6640e1c 100644
--- a/drivers/usb/musb/Makefile
+++ b/drivers/usb/musb/Makefile
@@ -2,5 +2,5 @@
# for USB OTG silicon based on Mentor Graphics INVENTRA designs
#
-obj-$(CONFIG_USB_MUSB_HOST) += musb_host.o musb_core.o
+obj-$(CONFIG_USB_MUSB_HOST) += musb_host.o musb_core.o musb_barebox.o
obj-$(CONFIG_USB_MUSB_DSPS) += musb_dsps.o
diff --git a/drivers/usb/musb/musb_barebox.c b/drivers/usb/musb/musb_barebox.c
new file mode 100644
index 0000000..ecf18fd
--- /dev/null
+++ b/drivers/usb/musb/musb_barebox.c
@@ -0,0 +1,306 @@
+#include <driver.h>
+#include <xfuncs.h>
+#include <common.h>
+#include <watchdog.h>
+#include <errno.h>
+#include <init.h>
+#include <stdio.h>
+#include <io.h>
+#include <malloc.h>
+#include <clock.h>
+
+#include <mach/am33xx-usb.h>
+#include <asm/omap_musb.h>
+
+#include <usb/usb.h>
+#include "linux-compat.h"
+#include "usb-compat.h"
+#include "musb_core.h"
+#include "musb_host.h"
+
+static struct musb *host;
+static struct usb_hcd hcd;
+static int host_speed;
+
+struct am33xxusb_device {
+ struct device_d *dev;
+
+ void __iomem *usbss;
+ void __iomem *usb;
+ void __iomem *usbphy;
+ void __iomem *usbcore;
+
+ void __iomem *ctrl_base;
+};
+
+static void musb_host_complete_urb(struct urb *urb)
+{
+ urb->dev->status &= ~USB_ST_NOT_PROC;
+ urb->dev->act_len = urb->actual_length;
+}
+
+static struct usb_host_endpoint hep;
+static struct urb urb;
+
+static struct urb *construct_urb(struct usb_device *dev, int endpoint_type,
+ unsigned long pipe, void *buffer, int len,
+ struct devrequest *setup, int interval)
+{
+ int epnum = usb_pipeendpoint(pipe);
+ int is_in = usb_pipein(pipe);
+
+ memset(&urb, 0, sizeof(struct urb));
+ memset(&hep, 0, sizeof(struct usb_host_endpoint));
+ INIT_LIST_HEAD(&hep.urb_list);
+ INIT_LIST_HEAD(&urb.urb_list);
+ urb.ep = &hep;
+ urb.complete = musb_host_complete_urb;
+ urb.status = -EINPROGRESS;
+ urb.dev = dev;
+ urb.pipe = pipe;
+ urb.transfer_buffer = buffer;
+ urb.transfer_dma = (unsigned long)buffer;
+ urb.transfer_buffer_length = len;
+ urb.setup_packet = (unsigned char *)setup;
+
+ urb.ep->desc.wMaxPacketSize =
+ __cpu_to_le16(is_in ? dev->epmaxpacketin[epnum] :
+ dev->epmaxpacketout[epnum]);
+ urb.ep->desc.bmAttributes = endpoint_type;
+ urb.ep->desc.bEndpointAddress =
+ (is_in ? USB_DIR_IN : USB_DIR_OUT) | epnum;
+ urb.ep->desc.bInterval = interval;
+
+ return &urb;
+}
+
+#define MUSB_HOST_TIMEOUT 0x3ffffff
+
+static int submit_urb(struct usb_hcd *hcd, struct urb *urb)
+{
+ struct musb *host = hcd->hcd_priv;
+ int ret;
+ int timeout;
+
+ ret = musb_urb_enqueue(hcd, urb, 0);
+ if (ret < 0) {
+ printf("Failed to enqueue URB to controller\n");
+ return ret;
+ }
+
+ timeout = MUSB_HOST_TIMEOUT;
+ do {
+ if (ctrlc())
+ return -EIO;
+ host->isr(0, host);
+ } while ((urb->dev->status & USB_ST_NOT_PROC) && --timeout);
+
+ return urb->status;
+}
+
+int submit_control_msg(struct usb_device *dev, unsigned long pipe,
+ void *buffer, int len, struct devrequest *setup,
+ int timeout)
+{
+ struct urb *urb = construct_urb(dev, USB_ENDPOINT_XFER_CONTROL, pipe,
+ buffer, len, setup, 0);
+
+ /* Fix speed for non hub-attached devices */
+ if (!dev->parent)
+ dev->speed = host_speed;
+
+ return submit_urb(&hcd, urb);
+}
+
+
+int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,
+ void *buffer, int len, int timeout)
+{
+ struct urb *urb = construct_urb(dev, USB_ENDPOINT_XFER_BULK, pipe,
+ buffer, len, NULL, 0);
+ return submit_urb(&hcd, urb);
+}
+
+int submit_int_msg(struct usb_device *dev, unsigned long pipe,
+ void *buffer, int len, int interval)
+{
+ struct urb *urb = construct_urb(dev, USB_ENDPOINT_XFER_INT, pipe,
+ buffer, len, NULL, interval);
+ return submit_urb(&hcd, urb);
+}
+
+int usb_lowlevel_init(struct usb_host *bb_host)
+{
+ u8 power;
+ void *mbase;
+ int timeout = MUSB_HOST_TIMEOUT;
+ int rc;
+
+ if (!host) {
+ printf("MUSB host is not registered\n");
+ return -ENODEV;
+ }
+
+ musb_start(host);
+ mbase = host->mregs;
+ do {
+ if (musb_readb(mbase, MUSB_DEVCTL) & MUSB_DEVCTL_HM)
+ break;
+ } while (--timeout);
+ if (!timeout)
+ return -ENODEV;
+
+ mdelay(200);
+ power = musb_readb(mbase, MUSB_POWER);
+ musb_writeb(mbase, MUSB_POWER, MUSB_POWER_RESET | power);
+ mdelay(200);
+ power = musb_readb(mbase, MUSB_POWER);
+ musb_writeb(mbase, MUSB_POWER, ~MUSB_POWER_RESET & power);
+ mdelay(10);
+ host->isr(0, host);
+ host_speed = (musb_readb(mbase, MUSB_POWER) & MUSB_POWER_HSMODE) ?
+ USB_SPEED_HIGH :
+ (musb_readb(mbase, MUSB_DEVCTL) & MUSB_DEVCTL_FSDEV) ?
+ USB_SPEED_FULL : USB_SPEED_LOW;
+ host->is_active = 1;
+ hcd.hcd_priv = host;
+
+ return 0;
+}
+
+int usb_lowlevel_stop(int index)
+{
+ if (!host) {
+ printf("MUSB host is not registered\n");
+ return -ENODEV;
+ }
+
+ musb_stop(host);
+ return 0;
+}
+
+int musb_register(struct musb_hdrc_platform_data *plat, void *bdata,
+ void *ctl_regs)
+{
+ struct musb **musbp;
+ struct usb_host *bb_host;
+
+ switch (plat->mode) {
+ case MUSB_HOST:
+ musbp = &host;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ *musbp = musb_init_controller(plat, (struct device_d *)bdata, ctl_regs);
+ if (!musbp) {
+ printf("Failed to init the controller\n");
+ return -EIO;
+ }
+
+ bb_host = &host->barebox_host;
+ bb_host->init = usb_lowlevel_init;
+ bb_host->submit_int_msg = submit_int_msg;
+ bb_host->submit_control_msg = submit_control_msg;
+ bb_host->submit_bulk_msg = submit_bulk_msg;
+
+ /* Is there more left that needs to get bonded to Barebox ? */
+ usb_register_host(bb_host);
+
+ return 0;
+}
+
+/* USB 2.0 PHY Control */
+#define CM_PHY_PWRDN (1 << 0)
+#define CM_PHY_OTG_PWRDN (1 << 1)
+#define OTGVDET_EN (1 << 19)
+#define OTGSESSENDEN (1 << 20)
+
+static u32 a3u_read(void __iomem *addr)
+{
+ return __raw_readl(addr);
+}
+
+static void a3u_write(u32 val, void __iomem *addr)
+{
+ __raw_writel(val, addr);
+}
+
+void a3u_clrsetbits(void __iomem *addr, u32 clr, u32 set)
+{
+ u32 x;
+ x = a3u_read(addr);
+ x &= ~clr;
+ x |= set;
+ a3u_write(x, addr);
+}
+
+void __iomem *reg_addr_phy_pwr;
+
+static void am33xx_usb_set_phy_power(u8 on)
+{
+ if (on) {
+ a3u_clrsetbits(reg_addr_phy_pwr, CM_PHY_PWRDN |
+ CM_PHY_OTG_PWRDN, OTGVDET_EN | OTGSESSENDEN);
+ } else {
+ a3u_clrsetbits(reg_addr_phy_pwr, 0, CM_PHY_PWRDN |
+ CM_PHY_OTG_PWRDN);
+ }
+}
+
+static struct musb_hdrc_config musb_config = {
+ .multipoint = 1,
+ .dyn_fifo = 1,
+ .num_eps = 16,
+ .ram_bits = 12,
+};
+
+struct omap_musb_board_data otg0_board_data = {
+ .set_phy_power = am33xx_usb_set_phy_power,
+};
+
+static struct musb_hdrc_platform_data otg0_plat = {
+ .mode = MUSB_HOST,
+ .config = &musb_config,
+ .power = 50,
+ .platform_ops = &musb_dsps_ops,
+ .board_data = &otg0_board_data,
+};
+
+static int am33xxusb_probe(struct device_d *dev)
+{
+ struct am33xx_usb_pdata const *pdata = dev->platform_data;
+ struct am33xxusb_device *a3dev;
+
+ a3dev = xzalloc(sizeof *a3dev);
+
+ a3dev->usbss = dev_request_mem_region_by_name(dev, "am33xx_usbss");
+ a3dev->ctrl_base = dev_request_mem_region_by_name(dev,
+ "am33xx_ctrl_device_base");
+ if (pdata->bus_number == 1)
+ a3dev->usb = dev_request_mem_region_by_name(dev, "am33xx_usb1");
+ else
+ a3dev->usb = dev_request_mem_region_by_name(dev, "am33xx_usb0");
+
+ reg_addr_phy_pwr = a3dev->ctrl_base + 0x28;
+
+ a3u_clrsetbits(a3dev->usbss + 0x10, 0, 1);
+
+ mdelay(20);
+
+ return musb_register(&otg0_plat, &otg0_board_data,
+ a3dev->usb);
+}
+
+static struct driver_d musb_driver = {
+ .name = "am33xx_usb",
+ .probe = am33xxusb_probe,
+};
+
+static int am33xx_usb_init(void)
+{
+ return platform_driver_register(&musb_driver);
+}
+
+device_initcall(am33xx_usb_init);
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 17/18] arm: pcm051: enable USB pinmux
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
` (14 preceding siblings ...)
2014-06-13 7:54 ` [PATCH 16/18] musb: add barebox gluecode Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 18/18] arm: pcm051: enable USB Christoph Fritz
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
---
arch/arm/boards/phytec-phycore-am335x/board.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/arch/arm/boards/phytec-phycore-am335x/board.c b/arch/arm/boards/phytec-phycore-am335x/board.c
index 9482b80..70b5db6 100644
--- a/arch/arm/boards/phytec-phycore-am335x/board.c
+++ b/arch/arm/boards/phytec-phycore-am335x/board.c
@@ -27,8 +27,10 @@
#include <asm/armlinux.h>
#include <generated/mach-types.h>
#include <linux/phy.h>
+#include <mach/am33xx-mux.h>
#include <mach/am33xx-generic.h>
#include <mach/am33xx-silicon.h>
+#include <mach/am33xx-clock.h>
#include <mach/bbu.h>
@@ -56,6 +58,12 @@ static char *xloadslots[] = {
"/dev/nand0.xload_backup3.bb"
};
+static void pcm051_usb_init(void)
+{
+ am33xx_enable_usb0_pin_mux();
+ am33xx_enable_usb1_pin_mux();
+}
+
static int pcm051_devices_init(void)
{
if (!of_machine_is_compatible("phytec,pcm051"))
@@ -81,6 +89,8 @@ static int pcm051_devices_init(void)
am33xx_bbu_nand_xloadslots_register_handler("MLO.nand",
xloadslots, ARRAY_SIZE(xloadslots));
+ pcm051_usb_init();
+
return 0;
}
device_initcall(pcm051_devices_init);
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 18/18] arm: pcm051: enable USB
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
` (15 preceding siblings ...)
2014-06-13 7:54 ` [PATCH 17/18] arm: pcm051: enable USB pinmux Christoph Fritz
@ 2014-06-13 7:54 ` Christoph Fritz
16 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-13 7:54 UTC (permalink / raw)
To: barebox
---
arch/arm/boards/phytec-phycore-am335x/board.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/arch/arm/boards/phytec-phycore-am335x/board.c b/arch/arm/boards/phytec-phycore-am335x/board.c
index 70b5db6..305c71b 100644
--- a/arch/arm/boards/phytec-phycore-am335x/board.c
+++ b/arch/arm/boards/phytec-phycore-am335x/board.c
@@ -31,6 +31,7 @@
#include <mach/am33xx-generic.h>
#include <mach/am33xx-silicon.h>
#include <mach/am33xx-clock.h>
+#include <mach/am33xx-usb.h>
#include <mach/bbu.h>
@@ -58,10 +59,15 @@ static char *xloadslots[] = {
"/dev/nand0.xload_backup3.bb"
};
+static struct am33xx_usb_pdata pcm051_usb_data = {
+ .bus_number = 1,
+};
+
static void pcm051_usb_init(void)
{
am33xx_enable_usb0_pin_mux();
am33xx_enable_usb1_pin_mux();
+ am33xx_add_usb(&pcm051_usb_data);
}
static int pcm051_devices_init(void)
--
1.7.10.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH 11/18] musb: adapt driver to work on barebox
2014-06-13 7:54 ` [PATCH 11/18] musb: adapt driver to work on barebox Christoph Fritz
@ 2014-06-14 20:53 ` Michael Grzeschik
2014-06-17 9:55 ` Christoph Fritz
0 siblings, 1 reply; 20+ messages in thread
From: Michael Grzeschik @ 2014-06-14 20:53 UTC (permalink / raw)
To: Christoph Fritz; +Cc: barebox
On Fri, Jun 13, 2014 at 09:54:28AM +0200, Christoph Fritz wrote:
> ---
> drivers/usb/musb/linux-compat.h | 31 +-------
> drivers/usb/musb/musb.h | 164 +++++++++++++++++++++++++++++++++++++++
> drivers/usb/musb/musb_core.c | 20 +++--
> drivers/usb/musb/musb_core.h | 42 +++-------
> drivers/usb/musb/musb_dsps.c | 2 -
> drivers/usb/musb/musb_host.c | 2 +-
> drivers/usb/musb/musb_io.h | 19 -----
> drivers/usb/musb/usb-compat.h | 2 +-
> include/usb/musb.h | 162 --------------------------------------
Why move musb.h in patch 6 first, when
it got moved here again?
> 9 files changed, 192 insertions(+), 252 deletions(-)
> create mode 100644 drivers/usb/musb/musb.h
> delete mode 100644 include/usb/musb.h
>
> diff --git a/drivers/usb/musb/linux-compat.h b/drivers/usb/musb/linux-compat.h
> index d7a5663..5cfa9d1 100644
> --- a/drivers/usb/musb/linux-compat.h
> +++ b/drivers/usb/musb/linux-compat.h
> @@ -3,7 +3,7 @@
>
> #include <malloc.h>
> #include <linux/list.h>
> -#include <linux/compat.h>
> +#include <notifier.h>
>
> #define __init
> #define __devinit
> @@ -16,21 +16,13 @@ struct unused {};
> typedef struct unused unused_t;
>
> typedef int irqreturn_t;
> -typedef unused_t spinlock_t;
>
> struct work_struct {};
>
> struct timer_list {};
> -struct notifier_block {};
>
> typedef unsigned long dmaaddr_t;
>
> -#define spin_lock_init(lock) do {} while (0)
> -#define spin_lock(lock) do {} while (0)
> -#define spin_unlock(lock) do {} while (0)
> -#define spin_lock_irqsave(lock, flags) do {} while (0)
> -#define spin_unlock_irqrestore(lock, flags) do {} while (0)
> -
> #define setup_timer(timer, func, data) do {} while (0)
> #define del_timer_sync(timer) do {} while (0)
> #define schedule_work(work) do {} while (0)
> @@ -38,14 +30,6 @@ typedef unsigned long dmaaddr_t;
>
> #define cpu_relax() do {} while (0)
>
> -#define pr_debug(fmt, args...) debug(fmt, ##args)
> -
> -#define WARN(condition, fmt, args...) ({ \
> - int ret_warn = !!condition; \
> - if (ret_warn) \
> - printf(fmt, ##args); \
> - ret_warn; })
> -
> #define pm_runtime_get_sync(dev) do {} while (0)
> #define pm_runtime_put(dev) do {} while (0)
> #define pm_runtime_put_sync(dev) do {} while (0)
> @@ -53,20 +37,9 @@ typedef unsigned long dmaaddr_t;
> #define pm_runtime_set_autosuspend_delay(dev, delay) do {} while (0)
> #define pm_runtime_enable(dev) do {} while (0)
>
> -#define MODULE_DESCRIPTION(desc)
> -#define MODULE_AUTHOR(author)
> -#define MODULE_LICENSE(license)
> #define MODULE_ALIAS(alias)
> #define module_param(name, type, perm)
> #define MODULE_PARM_DESC(name, desc)
> -#define EXPORT_SYMBOL_GPL(name)
> -
> -#define writesl(a, d, s) __raw_writesl((unsigned long)a, d, s)
> -#define readsl(a, d, s) __raw_readsl((unsigned long)a, d, s)
> -#define writesw(a, d, s) __raw_writesw((unsigned long)a, d, s)
> -#define readsw(a, d, s) __raw_readsw((unsigned long)a, d, s)
> -#define writesb(a, d, s) __raw_writesb((unsigned long)a, d, s)
> -#define readsb(a, d, s) __raw_readsb((unsigned long)a, d, s)
>
> #define IRQ_NONE 0
> #define IRQ_HANDLED 0
> @@ -80,8 +53,6 @@ typedef unsigned long dmaaddr_t;
>
> #define device_init_wakeup(dev, a) do {} while (0)
>
> -#define platform_data device_data
> -
> #ifndef wmb
> #define wmb() asm volatile ("" : : : "memory")
> #endif
> diff --git a/drivers/usb/musb/musb.h b/drivers/usb/musb/musb.h
> new file mode 100644
> index 0000000..2296a1b
> --- /dev/null
> +++ b/drivers/usb/musb/musb.h
> @@ -0,0 +1,164 @@
> +/*
> + * This is used to for host and peripheral modes of the driver for
> + * Inventra (Multidrop) Highspeed Dual-Role Controllers: (M)HDRC.
> + *
> + * Board initialization should put one of these into dev->platform_data,
> + * probably on some platform_device named "musb-hdrc". It encapsulates
> + * key configuration differences between boards.
> + */
> +
> +#ifndef __LINUX_USB_MUSB_H
> +#define __LINUX_USB_MUSB_H
> +
> +#ifndef __deprecated
> +#define __deprecated
> +#endif
> +
> +/* The USB role is defined by the connector used on the board, so long as
> + * standards are being followed. (Developer boards sometimes won't.)
> + */
> +enum musb_mode {
> + MUSB_UNDEFINED = 0,
> + MUSB_HOST, /* A or Mini-A connector */
> + MUSB_PERIPHERAL, /* B or Mini-B connector */
> + MUSB_OTG /* Mini-AB connector */
> +};
> +
> +struct clk;
> +
> +enum musb_fifo_style {
> + FIFO_RXTX,
> + FIFO_TX,
> + FIFO_RX
> +} __attribute__ ((packed));
> +
> +enum musb_buf_mode {
> + BUF_SINGLE,
> + BUF_DOUBLE
> +} __attribute__ ((packed));
> +
> +struct musb_fifo_cfg {
> + u8 hw_ep_num;
> + enum musb_fifo_style style;
> + enum musb_buf_mode mode;
> + u16 maxpacket;
> +};
> +
> +#define MUSB_EP_FIFO(ep, st, m, pkt) \
> +{ \
> + .hw_ep_num = ep, \
> + .style = st, \
> + .mode = m, \
> + .maxpacket = pkt, \
> +}
> +
> +#define MUSB_EP_FIFO_SINGLE(ep, st, pkt) \
> + MUSB_EP_FIFO(ep, st, BUF_SINGLE, pkt)
> +
> +#define MUSB_EP_FIFO_DOUBLE(ep, st, pkt) \
> + MUSB_EP_FIFO(ep, st, BUF_DOUBLE, pkt)
> +
> +struct musb_hdrc_eps_bits {
> + const char name[16];
> + u8 bits;
> +};
> +
> +struct musb_hdrc_config {
> + struct musb_fifo_cfg *fifo_cfg; /* board fifo configuration */
> + unsigned fifo_cfg_size; /* size of the fifo configuration */
> +
> + /* MUSB configuration-specific details */
> + unsigned multipoint:1; /* multipoint device */
> + unsigned dyn_fifo:1 __deprecated; /* supports dynamic fifo sizing */
> + unsigned soft_con:1 __deprecated; /* soft connect required */
> + unsigned utm_16:1 __deprecated; /* utm data witdh is 16 bits */
> + unsigned big_endian:1; /* true if CPU uses big-endian */
> + unsigned mult_bulk_tx:1; /* Tx ep required for multbulk pkts */
> + unsigned mult_bulk_rx:1; /* Rx ep required for multbulk pkts */
> + unsigned high_iso_tx:1; /* Tx ep required for HB iso */
> + unsigned high_iso_rx:1; /* Rx ep required for HD iso */
> + unsigned dma:1 __deprecated; /* supports DMA */
> + unsigned vendor_req:1 __deprecated; /* vendor registers required */
> +
> + u8 num_eps; /* number of endpoints _with_ ep0 */
> + u8 dma_channels __deprecated; /* number of dma channels */
> + u8 dyn_fifo_size; /* dynamic size in bytes */
> + u8 vendor_ctrl __deprecated; /* vendor control reg width */
> + u8 vendor_stat __deprecated; /* vendor status reg witdh */
> + u8 dma_req_chan __deprecated; /* bitmask for required dma channels */
> + u8 ram_bits; /* ram address size */
> +
> + struct musb_hdrc_eps_bits *eps_bits __deprecated;
> +#ifdef CONFIG_BLACKFIN
> + /* A GPIO controlling VRSEL in Blackfin */
> + unsigned int gpio_vrsel;
> + unsigned int gpio_vrsel_active;
> + /* musb CLKIN in Blackfin in MHZ */
> + unsigned char clkin;
> +#endif
> +
> +};
> +
> +struct musb_hdrc_platform_data {
> + /* MUSB_HOST, MUSB_PERIPHERAL, or MUSB_OTG */
> + u8 mode;
> +
> + /* for clk_get() */
> + const char *clock;
> +
> +#ifndef __BAREBOX__
> + /* (HOST or OTG) switch VBUS on/off */
> + int (*set_vbus)(struct device *dev, int is_on);
> +#endif
> +
> + /* (HOST or OTG) mA/2 power supplied on (default = 8mA) */
> + u8 power;
> +
> + /* (PERIPHERAL) mA/2 max power consumed (default = 100mA) */
> + u8 min_power;
> +
> + /* (HOST or OTG) msec/2 after VBUS on till power good */
> + u8 potpgt;
> +
> + /* (HOST or OTG) program PHY for external Vbus */
> + unsigned extvbus:1;
> +
> + /* Power the device on or off */
> + int (*set_power)(int state);
> +
> + /* MUSB configuration-specific details */
> + struct musb_hdrc_config *config;
> +
> + /* Architecture specific board data */
> + void *board_data;
> +
> + /* Platform specific struct musb_ops pointer */
> + const void *platform_ops;
> +};
> +
> +
> +/* TUSB 6010 support */
> +
> +#define TUSB6010_OSCCLK_60 16667 /* psec/clk @ 60.0 MHz */
> +#define TUSB6010_REFCLK_24 41667 /* psec/clk @ 24.0 MHz XI */
> +#define TUSB6010_REFCLK_19 52083 /* psec/clk @ 19.2 MHz CLKIN */
> +
> +#ifdef CONFIG_ARCH_OMAP2
> +
> +extern int __init tusb6010_setup_interface(
> + struct musb_hdrc_platform_data *data,
> + unsigned ps_refclk, unsigned waitpin,
> + unsigned async_cs, unsigned sync_cs,
> + unsigned irq, unsigned dmachan);
> +
> +extern int tusb6010_platform_retime(unsigned is_refclk);
> +
> +#endif /* OMAP2 */
> +
> +/*
> + * U-Boot specfic stuff
> + */
> +int musb_register(struct musb_hdrc_platform_data *plat, void *bdata,
> + void *ctl_regs);
> +
> +#endif /* __LINUX_USB_MUSB_H */
> diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
> index 546f656..6dbf1cc 100644
> --- a/drivers/usb/musb/musb_core.c
> +++ b/drivers/usb/musb/musb_core.c
> @@ -102,11 +102,13 @@
> #include <linux/io.h>
> #else
> #include <common.h>
> -#include <usb.h>
> -#include <asm/errno.h>
> -#include <linux/usb/ch9.h>
> -#include <linux/usb/gadget.h>
> -#include <linux/usb/musb.h>
> +#include <usb/usb.h>
> +#include <errno.h>
> +#ifdef __BAREBOX__
> +#include "musb.h"
> +#else
> +#include <usb/musb.h>
> +#endif
> #include <asm/io.h>
> #include "linux-compat.h"
> #include "usb-compat.h"
> @@ -1836,7 +1838,7 @@ static void musb_irq_work(struct work_struct *data)
> */
>
> static struct musb *__devinit
> -allocate_instance(struct device *dev,
> +allocate_instance(struct device_d *dev,
> struct musb_hdrc_config *config, void __iomem *mbase)
> {
> struct musb *musb;
> @@ -1924,7 +1926,7 @@ static int __devinit
> musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
> #else
> struct musb *
> -musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev,
> +musb_init_controller(struct musb_hdrc_platform_data *plat, struct device_d *dev,
> void *ctrl)
> #endif
> {
> @@ -2091,8 +2093,10 @@ musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev,
> musb->xceiv->state = OTG_STATE_B_IDLE;
> #endif
>
> +#ifdef CONFIG_MUSB_GADGET
> if (is_peripheral_capable())
> status = musb_gadget_setup(musb);
> +#endif
>
> #ifndef __BAREBOX__
> dev_dbg(musb->controller, "%s mode, status %d, dev%02x\n",
> @@ -2144,7 +2148,9 @@ fail4:
> usb_remove_hcd(musb_to_hcd(musb));
> else
> #endif
> +#ifdef CONFIG_MUSB_GADGET
> musb_gadget_cleanup(musb);
> +#endif
>
> fail3:
> pm_runtime_put_sync(musb->controller);
> diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h
> index 8f8d791..5bf87f9 100644
> --- a/drivers/usb/musb/musb_core.h
> +++ b/drivers/usb/musb/musb_core.h
> @@ -45,11 +45,14 @@
> #include <linux/usb.h>
> #include <linux/usb/otg.h>
> #else
> -#include <asm/errno.h>
> +#include <errno.h>
> #endif
> -#include <linux/usb/ch9.h>
> -#include <linux/usb/gadget.h>
> -#include <linux/usb/musb.h>
> +#ifdef __BAREBOX__
> +#include "musb.h"
> +#else
> +#include <usb/musb.h>
> +#endif
> +#include <usb/usb.h>
>
> struct musb;
> struct musb_hw_ep;
> @@ -71,7 +74,6 @@ struct musb_ep;
> #include "musb_io.h"
> #include "musb_regs.h"
>
> -#include "musb_gadget.h"
> #ifndef __BAREBOX__
> #include <linux/usb/hcd.h>
> #endif
> @@ -118,7 +120,7 @@ extern void musb_g_disconnect(struct musb *);
> #ifndef __BAREBOX__
> #define is_host_capable() (1)
> #else
> -#ifdef CONFIG_MUSB_HOST
> +#ifdef CONFIG_USB_MUSB_HOST
> #define is_host_capable() (1)
> #else
> #define is_host_capable() (0)
> @@ -168,7 +170,6 @@ enum musb_g_ep0_state {
> #define OTG_TIME_A_AIDL_BDIS 200 /* min 200 msec */
> #define OTG_TIME_B_ASE0_BRST 100 /* min 3.125 ms */
>
> -
> /*************************** REGISTER ACCESS ********************************/
>
> /* Endpoint registers (other than dynfifo setup) can be accessed either
> @@ -289,22 +290,8 @@ struct musb_hw_ep {
>
> u8 rx_reinit;
> u8 tx_reinit;
> -
> - /* peripheral side */
> - struct musb_ep ep_in; /* TX */
> - struct musb_ep ep_out; /* RX */
> };
>
> -static inline struct musb_request *next_in_request(struct musb_hw_ep *hw_ep)
> -{
> - return next_request(&hw_ep->ep_in);
> -}
> -
> -static inline struct musb_request *next_out_request(struct musb_hw_ep *hw_ep)
> -{
> - return next_request(&hw_ep->ep_out);
> -}
> -
> struct musb_csr_regs {
> /* FIFO registers */
> u16 txmaxp, txcsr, rxmaxp, rxcsr;
> @@ -369,7 +356,7 @@ struct musb {
>
> struct dma_controller *dma_controller;
>
> - struct device *controller;
> + struct device_d *controller;
> void __iomem *ctrl_base;
> void __iomem *mregs;
>
> @@ -447,8 +434,6 @@ struct musb {
> u8 test_mode_nr;
> u16 ackpend; /* ep0 */
> enum musb_g_ep0_state ep0_state;
> - struct usb_gadget g; /* the gadget */
> - struct usb_gadget_driver *gadget_driver; /* its driver */
>
> /*
> * FIXME: Remove this flag.
> @@ -465,16 +450,13 @@ struct musb {
>
> struct musb_hdrc_config *config;
>
> + struct usb_host barebox_host;
> +
> #ifdef MUSB_CONFIG_PROC_FS
> struct proc_dir_entry *proc_entry;
> #endif
> };
>
> -static inline struct musb *gadget_to_musb(struct usb_gadget *g)
> -{
> - return container_of(g, struct musb, g);
> -}
> -
> #ifdef CONFIG_BLACKFIN
> static inline int musb_read_fifosize(struct musb *musb,
> struct musb_hw_ep *hw_ep, u8 epnum)
> @@ -617,7 +599,7 @@ static inline int musb_platform_exit(struct musb *musb)
>
> #ifdef __BAREBOX__
> struct musb *
> -musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev,
> +musb_init_controller(struct musb_hdrc_platform_data *plat, struct device_d *dev,
> void *ctrl);
> #endif
> #endif /* __MUSB_CORE_H__ */
> diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
> index c1caf57..2aa2fbc 100644
> --- a/drivers/usb/musb/musb_dsps.c
> +++ b/drivers/usb/musb/musb_dsps.c
> @@ -333,8 +333,6 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
> if (usbintr)
> dsps_writel(reg_base, wrp->coreintr_status, usbintr);
>
> - dev_dbg(musb->controller, "usbintr (%x) epintr(%x)\n",
> - usbintr, epintr);
> #ifndef __BAREBOX__
> /*
> * DRVVBUS IRQs are the only proxy we have (a very poor one!) for
> diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
> index 120849d..cc4a8f8 100644
> --- a/drivers/usb/musb/musb_host.c
> +++ b/drivers/usb/musb/musb_host.c
> @@ -45,7 +45,7 @@
> #include <linux/dma-mapping.h>
> #else
> #include <common.h>
> -#include <usb.h>
> +#include <usb/usb.h>
> #include "linux-compat.h"
> #include "usb-compat.h"
> #endif
> diff --git a/drivers/usb/musb/musb_io.h b/drivers/usb/musb/musb_io.h
> index efc4ef9..0a06c5e 100644
> --- a/drivers/usb/musb/musb_io.h
> +++ b/drivers/usb/musb/musb_io.h
> @@ -41,25 +41,6 @@
> #include <asm/io.h>
> #endif
>
> -#if !defined(CONFIG_ARM) && !defined(CONFIG_SUPERH) \
> - && !defined(CONFIG_AVR32) && !defined(CONFIG_PPC32) \
> - && !defined(CONFIG_PPC64) && !defined(CONFIG_BLACKFIN) \
> - && !defined(CONFIG_MIPS) && !defined(CONFIG_M68K)
> -static inline void readsl(const void __iomem *addr, void *buf, int len)
> - { insl((unsigned long)addr, buf, len); }
> -static inline void readsw(const void __iomem *addr, void *buf, int len)
> - { insw((unsigned long)addr, buf, len); }
> -static inline void readsb(const void __iomem *addr, void *buf, int len)
> - { insb((unsigned long)addr, buf, len); }
> -
> -static inline void writesl(const void __iomem *addr, const void *buf, int len)
> - { outsl((unsigned long)addr, buf, len); }
> -static inline void writesw(const void __iomem *addr, const void *buf, int len)
> - { outsw((unsigned long)addr, buf, len); }
> -static inline void writesb(const void __iomem *addr, const void *buf, int len)
> - { outsb((unsigned long)addr, buf, len); }
> -
> -#endif
>
> #ifndef CONFIG_BLACKFIN
>
> diff --git a/drivers/usb/musb/usb-compat.h b/drivers/usb/musb/usb-compat.h
> index 27f656f..01a4329 100644
> --- a/drivers/usb/musb/usb-compat.h
> +++ b/drivers/usb/musb/usb-compat.h
> @@ -1,7 +1,7 @@
> #ifndef __USB_COMPAT_H__
> #define __USB_COMPAT_H__
>
> -#include "usb.h"
> +#include <usb/usb.h>
>
> struct usb_hcd {
> void *hcd_priv;
> diff --git a/include/usb/musb.h b/include/usb/musb.h
> deleted file mode 100644
> index 9f65ef9..0000000
> --- a/include/usb/musb.h
> +++ /dev/null
> @@ -1,162 +0,0 @@
> -/*
> - * This is used to for host and peripheral modes of the driver for
> - * Inventra (Multidrop) Highspeed Dual-Role Controllers: (M)HDRC.
> - *
> - * Board initialization should put one of these into dev->platform_data,
> - * probably on some platform_device named "musb-hdrc". It encapsulates
> - * key configuration differences between boards.
> - */
> -
> -#ifndef __LINUX_USB_MUSB_H
> -#define __LINUX_USB_MUSB_H
> -
> -#ifndef __deprecated
> -#define __deprecated
> -#endif
> -
> -/* The USB role is defined by the connector used on the board, so long as
> - * standards are being followed. (Developer boards sometimes won't.)
> - */
> -enum musb_mode {
> - MUSB_UNDEFINED = 0,
> - MUSB_HOST, /* A or Mini-A connector */
> - MUSB_PERIPHERAL, /* B or Mini-B connector */
> - MUSB_OTG /* Mini-AB connector */
> -};
> -
> -struct clk;
> -
> -enum musb_fifo_style {
> - FIFO_RXTX,
> - FIFO_TX,
> - FIFO_RX
> -} __attribute__ ((packed));
> -
> -enum musb_buf_mode {
> - BUF_SINGLE,
> - BUF_DOUBLE
> -} __attribute__ ((packed));
> -
> -struct musb_fifo_cfg {
> - u8 hw_ep_num;
> - enum musb_fifo_style style;
> - enum musb_buf_mode mode;
> - u16 maxpacket;
> -};
> -
> -#define MUSB_EP_FIFO(ep, st, m, pkt) \
> -{ \
> - .hw_ep_num = ep, \
> - .style = st, \
> - .mode = m, \
> - .maxpacket = pkt, \
> -}
> -
> -#define MUSB_EP_FIFO_SINGLE(ep, st, pkt) \
> - MUSB_EP_FIFO(ep, st, BUF_SINGLE, pkt)
> -
> -#define MUSB_EP_FIFO_DOUBLE(ep, st, pkt) \
> - MUSB_EP_FIFO(ep, st, BUF_DOUBLE, pkt)
> -
> -struct musb_hdrc_eps_bits {
> - const char name[16];
> - u8 bits;
> -};
> -
> -struct musb_hdrc_config {
> - struct musb_fifo_cfg *fifo_cfg; /* board fifo configuration */
> - unsigned fifo_cfg_size; /* size of the fifo configuration */
> -
> - /* MUSB configuration-specific details */
> - unsigned multipoint:1; /* multipoint device */
> - unsigned dyn_fifo:1 __deprecated; /* supports dynamic fifo sizing */
> - unsigned soft_con:1 __deprecated; /* soft connect required */
> - unsigned utm_16:1 __deprecated; /* utm data witdh is 16 bits */
> - unsigned big_endian:1; /* true if CPU uses big-endian */
> - unsigned mult_bulk_tx:1; /* Tx ep required for multbulk pkts */
> - unsigned mult_bulk_rx:1; /* Rx ep required for multbulk pkts */
> - unsigned high_iso_tx:1; /* Tx ep required for HB iso */
> - unsigned high_iso_rx:1; /* Rx ep required for HD iso */
> - unsigned dma:1 __deprecated; /* supports DMA */
> - unsigned vendor_req:1 __deprecated; /* vendor registers required */
> -
> - u8 num_eps; /* number of endpoints _with_ ep0 */
> - u8 dma_channels __deprecated; /* number of dma channels */
> - u8 dyn_fifo_size; /* dynamic size in bytes */
> - u8 vendor_ctrl __deprecated; /* vendor control reg width */
> - u8 vendor_stat __deprecated; /* vendor status reg witdh */
> - u8 dma_req_chan __deprecated; /* bitmask for required dma channels */
> - u8 ram_bits; /* ram address size */
> -
> - struct musb_hdrc_eps_bits *eps_bits __deprecated;
> -#ifdef CONFIG_BLACKFIN
> - /* A GPIO controlling VRSEL in Blackfin */
> - unsigned int gpio_vrsel;
> - unsigned int gpio_vrsel_active;
> - /* musb CLKIN in Blackfin in MHZ */
> - unsigned char clkin;
> -#endif
> -
> -};
> -
> -struct musb_hdrc_platform_data {
> - /* MUSB_HOST, MUSB_PERIPHERAL, or MUSB_OTG */
> - u8 mode;
> -
> - /* for clk_get() */
> - const char *clock;
> -
> - /* (HOST or OTG) switch VBUS on/off */
> - int (*set_vbus)(struct device *dev, int is_on);
> -
> - /* (HOST or OTG) mA/2 power supplied on (default = 8mA) */
> - u8 power;
> -
> - /* (PERIPHERAL) mA/2 max power consumed (default = 100mA) */
> - u8 min_power;
> -
> - /* (HOST or OTG) msec/2 after VBUS on till power good */
> - u8 potpgt;
> -
> - /* (HOST or OTG) program PHY for external Vbus */
> - unsigned extvbus:1;
> -
> - /* Power the device on or off */
> - int (*set_power)(int state);
> -
> - /* MUSB configuration-specific details */
> - struct musb_hdrc_config *config;
> -
> - /* Architecture specific board data */
> - void *board_data;
> -
> - /* Platform specific struct musb_ops pointer */
> - const void *platform_ops;
> -};
> -
> -
> -/* TUSB 6010 support */
> -
> -#define TUSB6010_OSCCLK_60 16667 /* psec/clk @ 60.0 MHz */
> -#define TUSB6010_REFCLK_24 41667 /* psec/clk @ 24.0 MHz XI */
> -#define TUSB6010_REFCLK_19 52083 /* psec/clk @ 19.2 MHz CLKIN */
> -
> -#ifdef CONFIG_ARCH_OMAP2
> -
> -extern int __init tusb6010_setup_interface(
> - struct musb_hdrc_platform_data *data,
> - unsigned ps_refclk, unsigned waitpin,
> - unsigned async_cs, unsigned sync_cs,
> - unsigned irq, unsigned dmachan);
> -
> -extern int tusb6010_platform_retime(unsigned is_refclk);
> -
> -#endif /* OMAP2 */
> -
> -/*
> - * U-Boot specfic stuff
> - */
> -int musb_register(struct musb_hdrc_platform_data *plat, void *bdata,
> - void *ctl_regs);
> -
> -#endif /* __LINUX_USB_MUSB_H */
> --
> 1.7.10.4
>
>
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
>
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 11/18] musb: adapt driver to work on barebox
2014-06-14 20:53 ` Michael Grzeschik
@ 2014-06-17 9:55 ` Christoph Fritz
0 siblings, 0 replies; 20+ messages in thread
From: Christoph Fritz @ 2014-06-17 9:55 UTC (permalink / raw)
To: Michael Grzeschik; +Cc: barebox
Hi Michael
On Sat, 2014-06-14 at 22:53 +0200, Michael Grzeschik wrote:
> On Fri, Jun 13, 2014 at 09:54:28AM +0200, Christoph Fritz wrote:
> > ---
> > drivers/usb/musb/linux-compat.h | 31 +-------
> > drivers/usb/musb/musb.h | 164 +++++++++++++++++++++++++++++++++++++++
> > drivers/usb/musb/musb_core.c | 20 +++--
> > drivers/usb/musb/musb_core.h | 42 +++-------
> > drivers/usb/musb/musb_dsps.c | 2 -
> > drivers/usb/musb/musb_host.c | 2 +-
> > drivers/usb/musb/musb_io.h | 19 -----
> > drivers/usb/musb/usb-compat.h | 2 +-
> > include/usb/musb.h | 162 --------------------------------------
>
> Why move musb.h in patch 6 first, when
> it got moved here again?
It's a left over from my development branch. Thanks for the hint.
-- Christoph
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2014-06-17 9:55 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-06-13 7:54 [RFC][PATCH 00/18] am33x: add musb Christoph Fritz
2014-06-13 7:54 ` [PATCH 01/18] arm: am33xx: add USB clocks Christoph Fritz
2014-06-13 7:54 ` [PATCH 02/18] arm: am33xx: add pinmux config for USB Christoph Fritz
2014-06-13 7:54 ` [PATCH 03/18] linux wrapper: add more dummy spin_lock stubs Christoph Fritz
2014-06-13 7:54 ` [PATCH 05/18] musb: delete unused include files Christoph Fritz
2014-06-13 7:54 ` [PATCH 06/18] musb: move musb.h to path include/usb Christoph Fritz
2014-06-13 7:54 ` [PATCH 07/18] musb: drop gadget support - remove appropriate files Christoph Fritz
2014-06-13 7:54 ` [PATCH 08/18] musb: use __BAREBOX__ macro Christoph Fritz
2014-06-13 7:54 ` [PATCH 09/18] musb: adapt Kconfig and Makefiles Christoph Fritz
2014-06-13 7:54 ` [PATCH 10/18] arm: pcm051: enable musb in defconfig Christoph Fritz
2014-06-13 7:54 ` [PATCH 11/18] musb: adapt driver to work on barebox Christoph Fritz
2014-06-14 20:53 ` Michael Grzeschik
2014-06-17 9:55 ` Christoph Fritz
2014-06-13 7:54 ` [PATCH 12/18] musb: only support USB_SPEED_HIGH devices Christoph Fritz
2014-06-13 7:54 ` [PATCH 13/18] usb: add musb support Christoph Fritz
2014-06-13 7:54 ` [PATCH 14/18] arm: am33xx: add usb base addresses Christoph Fritz
2014-06-13 7:54 ` [PATCH 15/18] arm: am33xx: add usb platform helper code Christoph Fritz
2014-06-13 7:54 ` [PATCH 16/18] musb: add barebox gluecode Christoph Fritz
2014-06-13 7:54 ` [PATCH 17/18] arm: pcm051: enable USB pinmux Christoph Fritz
2014-06-13 7:54 ` [PATCH 18/18] arm: pcm051: enable USB Christoph Fritz
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.