Branch data Line data Source code
1 : : /* ==========================================================================
2 : : * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.h $
3 : : * $Revision: #48 $
4 : : * $Date: 2012/08/10 $
5 : : * $Change: 2047372 $
6 : : *
7 : : * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
8 : : * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless
9 : : * otherwise expressly agreed to in writing between Synopsys and you.
10 : : *
11 : : * The Software IS NOT an item of Licensed Software or Licensed Product under
12 : : * any End User Software License Agreement or Agreement for Licensed Product
13 : : * with Synopsys or any supplement thereto. You are permitted to use and
14 : : * redistribute this Software in source and binary forms, with or without
15 : : * modification, provided that redistributions of source code must retain this
16 : : * notice. You may not view, use, disclose, copy or distribute this file or
17 : : * any information contained herein except pursuant to this license grant from
18 : : * Synopsys. If you do not agree with this notice, including the disclaimer
19 : : * below, then you are not authorized to use the Software.
20 : : *
21 : : * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS
22 : : * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 : : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 : : * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS BE LIABLE FOR ANY DIRECT,
25 : : * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 : : * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 : : * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 : : * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 : : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 : : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31 : : * DAMAGE.
32 : : * ========================================================================== */
33 : : #ifndef DWC_HOST_ONLY
34 : : #if !defined(__DWC_PCD_H__)
35 : : #define __DWC_PCD_H__
36 : :
37 : : #include "dwc_otg_os_dep.h"
38 : : #include "usb.h"
39 : : #include "dwc_otg_cil.h"
40 : : #include "dwc_otg_pcd_if.h"
41 : : #include "dwc_otg_driver.h"
42 : :
43 : : struct cfiobject;
44 : :
45 : : /**
46 : : * @file
47 : : *
48 : : * This file contains the structures, constants, and interfaces for
49 : : * the Perpherial Contoller Driver (PCD).
50 : : *
51 : : * The Peripheral Controller Driver (PCD) for Linux will implement the
52 : : * Gadget API, so that the existing Gadget drivers can be used. For
53 : : * the Mass Storage Function driver the File-backed USB Storage Gadget
54 : : * (FBS) driver will be used. The FBS driver supports the
55 : : * Control-Bulk (CB), Control-Bulk-Interrupt (CBI), and Bulk-Only
56 : : * transports.
57 : : *
58 : : */
59 : :
60 : : /** Invalid DMA Address */
61 : : #define DWC_DMA_ADDR_INVALID (~(dwc_dma_t)0)
62 : :
63 : : /** Max Transfer size for any EP */
64 : : #define DDMA_MAX_TRANSFER_SIZE 65535
65 : :
66 : : /**
67 : : * Get the pointer to the core_if from the pcd pointer.
68 : : */
69 : : #define GET_CORE_IF( _pcd ) (_pcd->core_if)
70 : :
71 : : /**
72 : : * States of EP0.
73 : : */
74 : : typedef enum ep0_state {
75 : : EP0_DISCONNECT, /* no host */
76 : : EP0_IDLE,
77 : : EP0_IN_DATA_PHASE,
78 : : EP0_OUT_DATA_PHASE,
79 : : EP0_IN_STATUS_PHASE,
80 : : EP0_OUT_STATUS_PHASE,
81 : : EP0_STALL,
82 : : } ep0state_e;
83 : :
84 : : /** Fordward declaration.*/
85 : : struct dwc_otg_pcd;
86 : :
87 : : /** DWC_otg iso request structure.
88 : : *
89 : : */
90 : : typedef struct usb_iso_request dwc_otg_pcd_iso_request_t;
91 : :
92 : : #ifdef DWC_UTE_PER_IO
93 : :
94 : : /**
95 : : * This shall be the exact analogy of the same type structure defined in the
96 : : * usb_gadget.h. Each descriptor contains
97 : : */
98 : : struct dwc_iso_pkt_desc_port {
99 : : uint32_t offset;
100 : : uint32_t length; /* expected length */
101 : : uint32_t actual_length;
102 : : uint32_t status;
103 : : };
104 : :
105 : : struct dwc_iso_xreq_port {
106 : : /** transfer/submission flag */
107 : : uint32_t tr_sub_flags;
108 : : /** Start the request ASAP */
109 : : #define DWC_EREQ_TF_ASAP 0x00000002
110 : : /** Just enqueue the request w/o initiating a transfer */
111 : : #define DWC_EREQ_TF_ENQUEUE 0x00000004
112 : :
113 : : /**
114 : : * count of ISO packets attached to this request - shall
115 : : * not exceed the pio_alloc_pkt_count
116 : : */
117 : : uint32_t pio_pkt_count;
118 : : /** count of ISO packets allocated for this request */
119 : : uint32_t pio_alloc_pkt_count;
120 : : /** number of ISO packet errors */
121 : : uint32_t error_count;
122 : : /** reserved for future extension */
123 : : uint32_t res;
124 : : /** Will be allocated and freed in the UTE gadget and based on the CFC value */
125 : : struct dwc_iso_pkt_desc_port *per_io_frame_descs;
126 : : };
127 : : #endif
128 : : /** DWC_otg request structure.
129 : : * This structure is a list of requests.
130 : : */
131 : : typedef struct dwc_otg_pcd_request {
132 : : void *priv;
133 : : void *buf;
134 : : dwc_dma_t dma;
135 : : uint32_t length;
136 : : uint32_t actual;
137 : : unsigned sent_zlp:1;
138 : : /**
139 : : * Used instead of original buffer if
140 : : * it(physical address) is not dword-aligned.
141 : : **/
142 : : uint8_t *dw_align_buf;
143 : : dwc_dma_t dw_align_buf_dma;
144 : :
145 : : DWC_CIRCLEQ_ENTRY(dwc_otg_pcd_request) queue_entry;
146 : : #ifdef DWC_UTE_PER_IO
147 : : struct dwc_iso_xreq_port ext_req;
148 : : //void *priv_ereq_nport; /* */
149 : : #endif
150 : : } dwc_otg_pcd_request_t;
151 : :
152 : : DWC_CIRCLEQ_HEAD(req_list, dwc_otg_pcd_request);
153 : :
154 : : /** PCD EP structure.
155 : : * This structure describes an EP, there is an array of EPs in the PCD
156 : : * structure.
157 : : */
158 : : typedef struct dwc_otg_pcd_ep {
159 : : /** USB EP Descriptor */
160 : : const usb_endpoint_descriptor_t *desc;
161 : :
162 : : /** queue of dwc_otg_pcd_requests. */
163 : : struct req_list queue;
164 : : unsigned stopped:1;
165 : : unsigned disabling:1;
166 : : unsigned dma:1;
167 : : unsigned queue_sof:1;
168 : :
169 : : #ifdef DWC_EN_ISOC
170 : : /** ISOC req handle passed */
171 : : void *iso_req_handle;
172 : : #endif //_EN_ISOC_
173 : :
174 : : /** DWC_otg ep data. */
175 : : dwc_ep_t dwc_ep;
176 : :
177 : : /** Pointer to PCD */
178 : : struct dwc_otg_pcd *pcd;
179 : :
180 : : void *priv;
181 : : } dwc_otg_pcd_ep_t;
182 : :
183 : : /** DWC_otg PCD Structure.
184 : : * This structure encapsulates the data for the dwc_otg PCD.
185 : : */
186 : : struct dwc_otg_pcd {
187 : : const struct dwc_otg_pcd_function_ops *fops;
188 : : /** The DWC otg device pointer */
189 : : struct dwc_otg_device *otg_dev;
190 : : /** Core Interface */
191 : : dwc_otg_core_if_t *core_if;
192 : : /** State of EP0 */
193 : : ep0state_e ep0state;
194 : : /** EP0 Request is pending */
195 : : unsigned ep0_pending:1;
196 : : /** Indicates when SET CONFIGURATION Request is in process */
197 : : unsigned request_config:1;
198 : : /** The state of the Remote Wakeup Enable. */
199 : : unsigned remote_wakeup_enable:1;
200 : : /** The state of the B-Device HNP Enable. */
201 : : unsigned b_hnp_enable:1;
202 : : /** The state of A-Device HNP Support. */
203 : : unsigned a_hnp_support:1;
204 : : /** The state of the A-Device Alt HNP support. */
205 : : unsigned a_alt_hnp_support:1;
206 : : /** Count of pending Requests */
207 : : unsigned request_pending;
208 : :
209 : : /** SETUP packet for EP0
210 : : * This structure is allocated as a DMA buffer on PCD initialization
211 : : * with enough space for up to 3 setup packets.
212 : : */
213 : : union {
214 : : usb_device_request_t req;
215 : : uint32_t d32[2];
216 : : } *setup_pkt;
217 : :
218 : : dwc_dma_t setup_pkt_dma_handle;
219 : :
220 : : /* Additional buffer and flag for CTRL_WR premature case */
221 : : uint8_t *backup_buf;
222 : : unsigned data_terminated;
223 : :
224 : : /** 2-byte dma buffer used to return status from GET_STATUS */
225 : : uint16_t *status_buf;
226 : : dwc_dma_t status_buf_dma_handle;
227 : :
228 : : /** EP0 */
229 : : dwc_otg_pcd_ep_t ep0;
230 : :
231 : : /** Array of IN EPs. */
232 : : dwc_otg_pcd_ep_t in_ep[MAX_EPS_CHANNELS - 1];
233 : : /** Array of OUT EPs. */
234 : : dwc_otg_pcd_ep_t out_ep[MAX_EPS_CHANNELS - 1];
235 : : /** number of valid EPs in the above array. */
236 : : // unsigned num_eps : 4;
237 : : dwc_spinlock_t *lock;
238 : :
239 : : /** Tasklet to defer starting of TEST mode transmissions until
240 : : * Status Phase has been completed.
241 : : */
242 : : dwc_tasklet_t *test_mode_tasklet;
243 : :
244 : : /** Tasklet to delay starting of xfer in DMA mode */
245 : : dwc_tasklet_t *start_xfer_tasklet;
246 : :
247 : : /** The test mode to enter when the tasklet is executed. */
248 : : unsigned test_mode;
249 : : /** The cfi_api structure that implements most of the CFI API
250 : : * and OTG specific core configuration functionality
251 : : */
252 : : #ifdef DWC_UTE_CFI
253 : : struct cfiobject *cfi;
254 : : #endif
255 : :
256 : : };
257 : :
258 : : static inline struct device *dwc_otg_pcd_to_dev(struct dwc_otg_pcd *pcd)
259 : : {
260 : 404 : return &pcd->otg_dev->os_dep.platformdev->dev;
261 : : }
262 : :
263 : : //FIXME this functions should be static, and this prototypes should be removed
264 : : extern void dwc_otg_request_nuke(dwc_otg_pcd_ep_t * ep);
265 : : extern void dwc_otg_request_done(dwc_otg_pcd_ep_t * ep,
266 : : dwc_otg_pcd_request_t * req, int32_t status);
267 : :
268 : : void dwc_otg_iso_buffer_done(dwc_otg_pcd_t * pcd, dwc_otg_pcd_ep_t * ep,
269 : : void *req_handle);
270 : :
271 : : extern void do_test_mode(void *data);
272 : : #endif
273 : : #endif /* DWC_HOST_ONLY */
|