2 * Intel Langwell USB Device Controller driver
3 * Copyright (C) 2008-2009, Intel Corporation.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
10 #include <linux/usb/langwell_udc.h>
12 /*-------------------------------------------------------------------------*/
14 /* driver data structures and utilities */
17 * dTD: Device Endpoint Transfer Descriptor
18 * describe to the device controller the location and quantity of
19 * data to be send/received for given transfer
23 /* bits 31:5, next transfer element pointer */
24 #define DTD_NEXT(d) (((d)>>5)&0x7ffffff)
25 #define DTD_NEXT_MASK (0x7ffffff << 5)
27 #define DTD_TERM BIT(0)
28 /* bits 7:0, execution back states */
30 #define DTD_STATUS(d) (((d)>>0)&0xff)
31 #define DTD_STS_ACTIVE BIT(7) /* active */
32 #define DTD_STS_HALTED BIT(6) /* halted */
33 #define DTD_STS_DBE BIT(5) /* data buffer error */
34 #define DTD_STS_TRE BIT(3) /* transaction error */
37 /* bits 11:10, multipier override */
39 #define DTD_MULTO (BIT(11) | BIT(10))
42 /* bit 15, interrupt on complete */
44 #define DTD_IOC BIT(15)
45 /* bits 30:16, total bytes */
47 #define DTD_TOTAL(d) (((d)>>16)&0x7fff)
48 #define DTD_MAX_TRANSFER_LENGTH 0x4000
51 /* dTD buffer pointer page 0 to 4 */
53 #define DTD_OFFSET_MASK 0xfff
54 /* bits 31:12, buffer pointer */
55 #define DTD_BUFFER(d) (((d)>>12)&0x3ff)
56 /* bits 11:0, current offset */
57 #define DTD_C_OFFSET(d) (((d)>>0)&0xfff)
58 /* bits 10:0, frame number */
59 #define DTD_FRAME(d) (((d)>>0)&0x7ff)
61 /* driver-private parts */
65 /* next dtd virtual address */
66 struct langwell_dtd
*next_dtd_virt
;
71 * dQH: Device Endpoint Queue Head
72 * describe where all transfers are managed
73 * 48-byte data structure, aligned on 64-byte boundary
75 * These are associated with dTD structure
78 /* endpoint capabilities and characteristics */
79 u32 dqh_res0
:15; /* bits 14:0 */
80 u32 dqh_ios
:1; /* bit 15, interrupt on setup */
81 #define DQH_IOS BIT(15)
82 u32 dqh_mpl
:11; /* bits 26:16, maximum packet length */
83 #define DQH_MPL (0x7ff << 16)
84 u32 dqh_res1
:2; /* bits 28:27 */
85 u32 dqh_zlt
:1; /* bit 29, zero length termination */
86 #define DQH_ZLT BIT(29)
87 u32 dqh_mult
:2; /* bits 31:30 */
88 #define DQH_MULT (BIT(30) | BIT(31))
90 /* current dTD pointer */
91 u32 dqh_current
; /* locate the transfer in progress */
92 #define DQH_C_DTD(e) \
93 (((e)>>5)&0x7ffffff) /* bits 31:5, current dTD pointer */
95 /* transfer overlay, hardware parts of a struct langwell_dtd */
97 u32 dtd_status
:8; /* bits 7:0, execution back states */
98 u32 dtd_res0
:2; /* bits 9:8 */
99 u32 dtd_multo
:2; /* bits 11:10, multipier override */
100 u32 dtd_res1
:3; /* bits 14:12 */
101 u32 dtd_ioc
:1; /* bit 15, interrupt on complete */
102 u32 dtd_total
:15; /* bits 30:16, total bytes */
103 u32 dtd_res2
:1; /* bit 31 */
104 u32 dtd_buf
[5]; /* dTD buffer pointer page 0 to 4 */
107 struct usb_ctrlrequest dqh_setup
; /* setup packet buffer */
108 } __attribute__ ((aligned(64)));
111 /* endpoint data structure */
115 struct langwell_udc
*dev
;
117 struct list_head queue
;
118 struct langwell_dqh
*dqh
;
119 const struct usb_endpoint_descriptor
*desc
;
127 /* request data structure */
128 struct langwell_request
{
129 struct usb_request req
;
130 struct langwell_dtd
*dtd
, *head
, *tail
;
131 struct langwell_ep
*ep
;
133 struct list_head queue
;
139 /* ep0 transfer state */
149 /* device suspend state */
152 LPM_L1
, /* LPM L1 sleep */
153 LPM_L2
, /* suspend */
158 /* device data structure */
159 struct langwell_udc
{
160 /* each pci device provides one gadget, several endpoints */
161 struct usb_gadget gadget
;
162 spinlock_t lock
; /* device lock */
163 struct langwell_ep
*ep
;
164 struct usb_gadget_driver
*driver
;
165 struct otg_transceiver
*transceiver
;
170 enum lpm_state lpm_state
;
171 enum ep0_state ep0_state
;
187 lpm
:1, /* LPM capability */
188 has_sram
:1, /* SRAM caching */
191 /* pci state used to access those endpoints */
192 struct pci_dev
*pdev
;
194 /* Langwell otg transceiver */
195 struct langwell_otg
*lotg
;
197 /* control registers */
198 struct langwell_cap_regs __iomem
*cap_regs
;
199 struct langwell_op_regs __iomem
*op_regs
;
201 struct usb_ctrlrequest local_setup_buff
;
202 struct langwell_dqh
*ep_dqh
;
204 dma_addr_t ep_dqh_dma
;
206 /* ep0 status request */
207 struct langwell_request
*status_req
;
210 struct dma_pool
*dtd_pool
;
212 /* make sure release() is done */
213 struct completion
*done
;
215 /* for private SRAM caching */
216 unsigned int sram_addr
;
217 unsigned int sram_size
;
219 /* device status data for get_status request */
223 #define gadget_to_langwell(g) container_of((g), struct langwell_udc, gadget)