summaryrefslogtreecommitdiff
path: root/drivers/usb/usb_ehci.h
diff options
context:
space:
mode:
authormichael <michael@panicking.retis>2008-12-10 17:55:19 +0100
committerRemy Bohmer <linux@bohmer.net>2009-01-28 19:57:27 +0100
commitdb63299b1dd2894ade542278210bccd046de6435 (patch)
treed811e83054a80054099c702d8006d2b6a87b0253 /drivers/usb/usb_ehci.h
parent6b92487dcf9afe83a3570153d66940fdb293be76 (diff)
downloadu-boot-imx-db63299b1dd2894ade542278210bccd046de6435.zip
u-boot-imx-db63299b1dd2894ade542278210bccd046de6435.tar.gz
u-boot-imx-db63299b1dd2894ade542278210bccd046de6435.tar.bz2
[PATCH] Fix EHCI usb. I start to test on a
IXP465 board and I find some errors in the code. This patch fix: - descriptor initizialization (config, interface and endpoint must be one next-to the other when the USB_DT_CONFIG message is send. - FIX little/endian bigendian (introduce the CONFIG_EHCI_DESC_BIG_ENDIAN and the CONFIG_EHCI_MMIO_BIG_ENDIAN) - Introduce the linux version of the usb_config_descriptor and usb_interface descriptor. This descriptor does't contains u-boot extension. Signed-off-by: Michael Trimarchi <trimarchimichael@yahoo.it> Signed-off-by: Remy Böhmer <linux@bohmer.net>
Diffstat (limited to 'drivers/usb/usb_ehci.h')
-rw-r--r--drivers/usb/usb_ehci.h50
1 files changed, 48 insertions, 2 deletions
diff --git a/drivers/usb/usb_ehci.h b/drivers/usb/usb_ehci.h
index ebffb44..3e7a2ab 100644
--- a/drivers/usb/usb_ehci.h
+++ b/drivers/usb/usb_ehci.h
@@ -24,6 +24,7 @@
/* (shifted) direction/type/recipient from the USB 2.0 spec, table 9.2 */
#define DeviceRequest \
((USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE) << 8)
+
#define DeviceOutRequest \
((USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE) << 8)
@@ -32,6 +33,7 @@
#define EndpointRequest \
((USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_INTERFACE) << 8)
+
#define EndpointOutRequest \
((USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_INTERFACE) << 8)
@@ -39,8 +41,9 @@
* Register Space.
*/
struct ehci_hccr {
- uint8_t cr_caplength;
- uint16_t cr_hciversion;
+ uint32_t cr_capbase;
+#define HC_LENGTH(p) (((p) >> 0) & 0x00ff)
+#define HC_VERSION(p) (((p) >> 16) & 0xffff)
uint32_t cr_hcsparams;
uint32_t cr_hccparams;
uint8_t cr_hcsp_portrt[8];
@@ -48,7 +51,9 @@ struct ehci_hccr {
struct ehci_hcor {
uint32_t or_usbcmd;
+#define CMD_ASE (1 << 5)
uint32_t or_usbsts;
+#define STD_ASS (1 << 15)
uint32_t or_usbintr;
uint32_t or_frindex;
uint32_t or_ctrldssegment;
@@ -60,6 +65,47 @@ struct ehci_hcor {
uint32_t or_systune;
};
+/* Interface descriptor */
+struct usb_linux_interface_descriptor {
+ unsigned char bLength;
+ unsigned char bDescriptorType;
+ unsigned char bInterfaceNumber;
+ unsigned char bAlternateSetting;
+ unsigned char bNumEndpoints;
+ unsigned char bInterfaceClass;
+ unsigned char bInterfaceSubClass;
+ unsigned char bInterfaceProtocol;
+ unsigned char iInterface;
+} __attribute__ ((packed));
+
+/* Configuration descriptor information.. */
+struct usb_linux_config_descriptor {
+ unsigned char bLength;
+ unsigned char bDescriptorType;
+ unsigned short wTotalLength;
+ unsigned char bNumInterfaces;
+ unsigned char bConfigurationValue;
+ unsigned char iConfiguration;
+ unsigned char bmAttributes;
+ unsigned char MaxPower;
+} __attribute__ ((packed));
+
+#if defined CONFIG_EHCI_DESC_BIG_ENDIAN
+#define ehci_readl(x) (x)
+#define ehci_writel(a, b) (a) = (b)
+#else
+#define ehci_readl(x) cpu_to_le32((x))
+#define ehci_writel(a, b) (a) = cpu_to_le32((b))
+#endif
+
+#if defined CONFIG_EHCI_MMIO_BIG_ENDIAN
+#define hc32_to_cpu(x) be32_to_cpu((x))
+#define cpu_to_hc32(x) cpu_to_be32((x))
+#else
+#define hc32_to_cpu(x) le32_to_cpu((x))
+#define cpu_to_hc32(x) cpu_to_le32((x))
+#endif
+
#define EHCI_PS_WKOC_E 0x00400000 /* RW wake on over current */
#define EHCI_PS_WKDSCNNT_E 0x00200000 /* RW wake on disconnect */
#define EHCI_PS_WKCNNT_E 0x00100000 /* RW wake on connect */