Branch data Line data Source code
1 : : /* ==========================================================================
2 : : * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.h $
3 : : * $Revision: #123 $
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 : :
34 : : #if !defined(__DWC_CIL_H__)
35 : : #define __DWC_CIL_H__
36 : :
37 : : #include "dwc_list.h"
38 : : #include "dwc_otg_dbg.h"
39 : : #include "dwc_otg_regs.h"
40 : :
41 : : #include "dwc_otg_core_if.h"
42 : : #include "dwc_otg_adp.h"
43 : :
44 : : /**
45 : : * @file
46 : : * This file contains the interface to the Core Interface Layer.
47 : : */
48 : :
49 : : #ifdef DWC_UTE_CFI
50 : :
51 : : #define MAX_DMA_DESCS_PER_EP 256
52 : :
53 : : /**
54 : : * Enumeration for the data buffer mode
55 : : */
56 : : typedef enum _data_buffer_mode {
57 : : BM_STANDARD = 0, /* data buffer is in normal mode */
58 : : BM_SG = 1, /* data buffer uses the scatter/gather mode */
59 : : BM_CONCAT = 2, /* data buffer uses the concatenation mode */
60 : : BM_CIRCULAR = 3, /* data buffer uses the circular DMA mode */
61 : : BM_ALIGN = 4 /* data buffer is in buffer alignment mode */
62 : : } data_buffer_mode_e;
63 : : #endif //DWC_UTE_CFI
64 : :
65 : : /** Macros defined for DWC OTG HW Release version */
66 : :
67 : : #define OTG_CORE_REV_2_60a 0x4F54260A
68 : : #define OTG_CORE_REV_2_71a 0x4F54271A
69 : : #define OTG_CORE_REV_2_72a 0x4F54272A
70 : : #define OTG_CORE_REV_2_80a 0x4F54280A
71 : : #define OTG_CORE_REV_2_81a 0x4F54281A
72 : : #define OTG_CORE_REV_2_90a 0x4F54290A
73 : : #define OTG_CORE_REV_2_91a 0x4F54291A
74 : : #define OTG_CORE_REV_2_92a 0x4F54292A
75 : : #define OTG_CORE_REV_2_93a 0x4F54293A
76 : : #define OTG_CORE_REV_2_94a 0x4F54294A
77 : : #define OTG_CORE_REV_3_00a 0x4F54300A
78 : :
79 : : /**
80 : : * Information for each ISOC packet.
81 : : */
82 : : typedef struct iso_pkt_info {
83 : : uint32_t offset;
84 : : uint32_t length;
85 : : int32_t status;
86 : : } iso_pkt_info_t;
87 : :
88 : : /**
89 : : * The <code>dwc_ep</code> structure represents the state of a single
90 : : * endpoint when acting in device mode. It contains the data items
91 : : * needed for an endpoint to be activated and transfer packets.
92 : : */
93 : : typedef struct dwc_ep {
94 : : /** EP number used for register address lookup */
95 : : uint8_t num;
96 : : /** EP direction 0 = OUT */
97 : : unsigned is_in:1;
98 : : /** EP active. */
99 : : unsigned active:1;
100 : :
101 : : /**
102 : : * Periodic Tx FIFO # for IN EPs For INTR EP set to 0 to use non-periodic
103 : : * Tx FIFO. If dedicated Tx FIFOs are enabled Tx FIFO # FOR IN EPs*/
104 : : unsigned tx_fifo_num:4;
105 : : /** EP type: 0 - Control, 1 - ISOC, 2 - BULK, 3 - INTR */
106 : : unsigned type:2;
107 : : #define DWC_OTG_EP_TYPE_CONTROL 0
108 : : #define DWC_OTG_EP_TYPE_ISOC 1
109 : : #define DWC_OTG_EP_TYPE_BULK 2
110 : : #define DWC_OTG_EP_TYPE_INTR 3
111 : :
112 : : /** DATA start PID for INTR and BULK EP */
113 : : unsigned data_pid_start:1;
114 : : /** Frame (even/odd) for ISOC EP */
115 : : unsigned even_odd_frame:1;
116 : : /** Max Packet bytes */
117 : : unsigned maxpacket:11;
118 : :
119 : : /** Max Transfer size */
120 : : uint32_t maxxfer;
121 : :
122 : : /** @name Transfer state */
123 : : /** @{ */
124 : :
125 : : /**
126 : : * Pointer to the beginning of the transfer buffer -- do not modify
127 : : * during transfer.
128 : : */
129 : :
130 : : dwc_dma_t dma_addr;
131 : :
132 : : dwc_dma_t dma_desc_addr;
133 : : dwc_otg_dev_dma_desc_t *desc_addr;
134 : :
135 : : uint8_t *start_xfer_buff;
136 : : /** pointer to the transfer buffer */
137 : : uint8_t *xfer_buff;
138 : : /** Number of bytes to transfer */
139 : : unsigned xfer_len:19;
140 : : /** Number of bytes transferred. */
141 : : unsigned xfer_count:19;
142 : : /** Sent ZLP */
143 : : unsigned sent_zlp:1;
144 : : /** Total len for control transfer */
145 : : unsigned total_len:19;
146 : :
147 : : /** stall clear flag */
148 : : unsigned stall_clear_flag:1;
149 : :
150 : : /** SETUP pkt cnt rollover flag for EP0 out*/
151 : : unsigned stp_rollover;
152 : :
153 : : #ifdef DWC_UTE_CFI
154 : : /* The buffer mode */
155 : : data_buffer_mode_e buff_mode;
156 : :
157 : : /* The chain of DMA descriptors.
158 : : * MAX_DMA_DESCS_PER_EP will be allocated for each active EP.
159 : : */
160 : : dwc_otg_dma_desc_t *descs;
161 : :
162 : : /* The DMA address of the descriptors chain start */
163 : : dma_addr_t descs_dma_addr;
164 : : /** This variable stores the length of the last enqueued request */
165 : : uint32_t cfi_req_len;
166 : : #endif //DWC_UTE_CFI
167 : :
168 : : /** Max DMA Descriptor count for any EP */
169 : : #define MAX_DMA_DESC_CNT 256
170 : : /** Allocated DMA Desc count */
171 : : uint32_t desc_cnt;
172 : :
173 : : /** bInterval */
174 : : uint32_t bInterval;
175 : : /** Next frame num to setup next ISOC transfer */
176 : : uint32_t frame_num;
177 : : /** Indicates SOF number overrun in DSTS */
178 : : uint8_t frm_overrun;
179 : :
180 : : #ifdef DWC_UTE_PER_IO
181 : : /** Next frame num for which will be setup DMA Desc */
182 : : uint32_t xiso_frame_num;
183 : : /** bInterval */
184 : : uint32_t xiso_bInterval;
185 : : /** Count of currently active transfers - shall be either 0 or 1 */
186 : : int xiso_active_xfers;
187 : : int xiso_queued_xfers;
188 : : #endif
189 : : #ifdef DWC_EN_ISOC
190 : : /**
191 : : * Variables specific for ISOC EPs
192 : : *
193 : : */
194 : : /** DMA addresses of ISOC buffers */
195 : : dwc_dma_t dma_addr0;
196 : : dwc_dma_t dma_addr1;
197 : :
198 : : dwc_dma_t iso_dma_desc_addr;
199 : : dwc_otg_dev_dma_desc_t *iso_desc_addr;
200 : :
201 : : /** pointer to the transfer buffers */
202 : : uint8_t *xfer_buff0;
203 : : uint8_t *xfer_buff1;
204 : :
205 : : /** number of ISOC Buffer is processing */
206 : : uint32_t proc_buf_num;
207 : : /** Interval of ISOC Buffer processing */
208 : : uint32_t buf_proc_intrvl;
209 : : /** Data size for regular frame */
210 : : uint32_t data_per_frame;
211 : :
212 : : /* todo - pattern data support is to be implemented in the future */
213 : : /** Data size for pattern frame */
214 : : uint32_t data_pattern_frame;
215 : : /** Frame number of pattern data */
216 : : uint32_t sync_frame;
217 : :
218 : : /** bInterval */
219 : : uint32_t bInterval;
220 : : /** ISO Packet number per frame */
221 : : uint32_t pkt_per_frm;
222 : : /** Next frame num for which will be setup DMA Desc */
223 : : uint32_t next_frame;
224 : : /** Number of packets per buffer processing */
225 : : uint32_t pkt_cnt;
226 : : /** Info for all isoc packets */
227 : : iso_pkt_info_t *pkt_info;
228 : : /** current pkt number */
229 : : uint32_t cur_pkt;
230 : : /** current pkt number */
231 : : uint8_t *cur_pkt_addr;
232 : : /** current pkt number */
233 : : uint32_t cur_pkt_dma_addr;
234 : : #endif /* DWC_EN_ISOC */
235 : :
236 : : /** @} */
237 : : } dwc_ep_t;
238 : :
239 : : /*
240 : : * Reasons for halting a host channel.
241 : : */
242 : : typedef enum dwc_otg_halt_status {
243 : : DWC_OTG_HC_XFER_NO_HALT_STATUS,
244 : : DWC_OTG_HC_XFER_COMPLETE,
245 : : DWC_OTG_HC_XFER_URB_COMPLETE,
246 : : DWC_OTG_HC_XFER_ACK,
247 : : DWC_OTG_HC_XFER_NAK,
248 : : DWC_OTG_HC_XFER_NYET,
249 : : DWC_OTG_HC_XFER_STALL,
250 : : DWC_OTG_HC_XFER_XACT_ERR,
251 : : DWC_OTG_HC_XFER_FRAME_OVERRUN,
252 : : DWC_OTG_HC_XFER_BABBLE_ERR,
253 : : DWC_OTG_HC_XFER_DATA_TOGGLE_ERR,
254 : : DWC_OTG_HC_XFER_AHB_ERR,
255 : : DWC_OTG_HC_XFER_PERIODIC_INCOMPLETE,
256 : : DWC_OTG_HC_XFER_URB_DEQUEUE
257 : : } dwc_otg_halt_status_e;
258 : :
259 : : /**
260 : : * Host channel descriptor. This structure represents the state of a single
261 : : * host channel when acting in host mode. It contains the data items needed to
262 : : * transfer packets to an endpoint via a host channel.
263 : : */
264 : : typedef struct dwc_hc {
265 : : /** Host channel number used for register address lookup */
266 : : uint8_t hc_num;
267 : :
268 : : /** Device to access */
269 : : unsigned dev_addr:7;
270 : :
271 : : /** EP to access */
272 : : unsigned ep_num:4;
273 : :
274 : : /** EP direction. 0: OUT, 1: IN */
275 : : unsigned ep_is_in:1;
276 : :
277 : : /**
278 : : * EP speed.
279 : : * One of the following values:
280 : : * - DWC_OTG_EP_SPEED_LOW
281 : : * - DWC_OTG_EP_SPEED_FULL
282 : : * - DWC_OTG_EP_SPEED_HIGH
283 : : */
284 : : unsigned speed:2;
285 : : #define DWC_OTG_EP_SPEED_LOW 0
286 : : #define DWC_OTG_EP_SPEED_FULL 1
287 : : #define DWC_OTG_EP_SPEED_HIGH 2
288 : :
289 : : /**
290 : : * Endpoint type.
291 : : * One of the following values:
292 : : * - DWC_OTG_EP_TYPE_CONTROL: 0
293 : : * - DWC_OTG_EP_TYPE_ISOC: 1
294 : : * - DWC_OTG_EP_TYPE_BULK: 2
295 : : * - DWC_OTG_EP_TYPE_INTR: 3
296 : : */
297 : : unsigned ep_type:2;
298 : :
299 : : /** Max packet size in bytes */
300 : : unsigned max_packet:11;
301 : :
302 : : /**
303 : : * PID for initial transaction.
304 : : * 0: DATA0,<br>
305 : : * 1: DATA2,<br>
306 : : * 2: DATA1,<br>
307 : : * 3: MDATA (non-Control EP),
308 : : * SETUP (Control EP)
309 : : */
310 : : unsigned data_pid_start:2;
311 : : #define DWC_OTG_HC_PID_DATA0 0
312 : : #define DWC_OTG_HC_PID_DATA2 1
313 : : #define DWC_OTG_HC_PID_DATA1 2
314 : : #define DWC_OTG_HC_PID_MDATA 3
315 : : #define DWC_OTG_HC_PID_SETUP 3
316 : :
317 : : /** Number of periodic transactions per (micro)frame */
318 : : unsigned multi_count:2;
319 : :
320 : : /** @name Transfer State */
321 : : /** @{ */
322 : :
323 : : /** Pointer to the current transfer buffer position. */
324 : : uint8_t *xfer_buff;
325 : : /**
326 : : * In Buffer DMA mode this buffer will be used
327 : : * if xfer_buff is not DWORD aligned.
328 : : */
329 : : dwc_dma_t align_buff;
330 : : /** Total number of bytes to transfer. */
331 : : uint32_t xfer_len;
332 : : /** Number of bytes transferred so far. */
333 : : uint32_t xfer_count;
334 : : /** Packet count at start of transfer.*/
335 : : uint16_t start_pkt_count;
336 : :
337 : : /**
338 : : * Flag to indicate whether the transfer has been started. Set to 1 if
339 : : * it has been started, 0 otherwise.
340 : : */
341 : : uint8_t xfer_started;
342 : :
343 : : /**
344 : : * Set to 1 to indicate that a PING request should be issued on this
345 : : * channel. If 0, process normally.
346 : : */
347 : : uint8_t do_ping;
348 : :
349 : : /**
350 : : * Set to 1 to indicate that the error count for this transaction is
351 : : * non-zero. Set to 0 if the error count is 0.
352 : : */
353 : : uint8_t error_state;
354 : :
355 : : /**
356 : : * Set to 1 to indicate that this channel should be halted the next
357 : : * time a request is queued for the channel. This is necessary in
358 : : * slave mode if no request queue space is available when an attempt
359 : : * is made to halt the channel.
360 : : */
361 : : uint8_t halt_on_queue;
362 : :
363 : : /**
364 : : * Set to 1 if the host channel has been halted, but the core is not
365 : : * finished flushing queued requests. Otherwise 0.
366 : : */
367 : : uint8_t halt_pending;
368 : :
369 : : /**
370 : : * Reason for halting the host channel.
371 : : */
372 : : dwc_otg_halt_status_e halt_status;
373 : :
374 : : /*
375 : : * Split settings for the host channel
376 : : */
377 : : uint8_t do_split; /**< Enable split for the channel */
378 : : uint8_t complete_split; /**< Enable complete split */
379 : : uint8_t hub_addr; /**< Address of high speed hub */
380 : :
381 : : uint8_t port_addr; /**< Port of the low/full speed device */
382 : : /** Split transaction position
383 : : * One of the following values:
384 : : * - DWC_HCSPLIT_XACTPOS_MID
385 : : * - DWC_HCSPLIT_XACTPOS_BEGIN
386 : : * - DWC_HCSPLIT_XACTPOS_END
387 : : * - DWC_HCSPLIT_XACTPOS_ALL */
388 : : uint8_t xact_pos;
389 : :
390 : : /** Set when the host channel does a short read. */
391 : : uint8_t short_read;
392 : :
393 : : /**
394 : : * Number of requests issued for this channel since it was assigned to
395 : : * the current transfer (not counting PINGs).
396 : : */
397 : : uint8_t requests;
398 : :
399 : : /**
400 : : * Queue Head for the transfer being processed by this channel.
401 : : */
402 : : struct dwc_otg_qh *qh;
403 : :
404 : : /** @} */
405 : :
406 : : /** Entry in list of host channels. */
407 : : DWC_CIRCLEQ_ENTRY(dwc_hc) hc_list_entry;
408 : :
409 : : /** @name Descriptor DMA support */
410 : : /** @{ */
411 : :
412 : : /** Number of Transfer Descriptors */
413 : : uint16_t ntd;
414 : :
415 : : /** Descriptor List DMA address */
416 : : dwc_dma_t desc_list_addr;
417 : :
418 : : /** Scheduling micro-frame bitmap. */
419 : : uint8_t schinfo;
420 : :
421 : : /** @} */
422 : : } dwc_hc_t;
423 : :
424 : : /**
425 : : * The following parameters may be specified when starting the module. These
426 : : * parameters define how the DWC_otg controller should be configured.
427 : : */
428 : : typedef struct dwc_otg_core_params {
429 : : int32_t opt;
430 : :
431 : : /**
432 : : * Specifies the OTG capabilities. The driver will automatically
433 : : * detect the value for this parameter if none is specified.
434 : : * 0 - HNP and SRP capable (default)
435 : : * 1 - SRP Only capable
436 : : * 2 - No HNP/SRP capable
437 : : */
438 : : int32_t otg_cap;
439 : :
440 : : /**
441 : : * Specifies whether to use slave or DMA mode for accessing the data
442 : : * FIFOs. The driver will automatically detect the value for this
443 : : * parameter if none is specified.
444 : : * 0 - Slave
445 : : * 1 - DMA (default, if available)
446 : : */
447 : : int32_t dma_enable;
448 : :
449 : : /**
450 : : * When DMA mode is enabled specifies whether to use address DMA or DMA
451 : : * Descriptor mode for accessing the data FIFOs in device mode. The driver
452 : : * will automatically detect the value for this if none is specified.
453 : : * 0 - address DMA
454 : : * 1 - DMA Descriptor(default, if available)
455 : : */
456 : : int32_t dma_desc_enable;
457 : : /** The DMA Burst size (applicable only for External DMA
458 : : * Mode). 1, 4, 8 16, 32, 64, 128, 256 (default 32)
459 : : */
460 : : int32_t dma_burst_size; /* Translate this to GAHBCFG values */
461 : :
462 : : /**
463 : : * Specifies the maximum speed of operation in host and device mode.
464 : : * The actual speed depends on the speed of the attached device and
465 : : * the value of phy_type. The actual speed depends on the speed of the
466 : : * attached device.
467 : : * 0 - High Speed (default)
468 : : * 1 - Full Speed
469 : : */
470 : : int32_t speed;
471 : : /** Specifies whether low power mode is supported when attached
472 : : * to a Full Speed or Low Speed device in host mode.
473 : : * 0 - Don't support low power mode (default)
474 : : * 1 - Support low power mode
475 : : */
476 : : int32_t host_support_fs_ls_low_power;
477 : :
478 : : /** Specifies the PHY clock rate in low power mode when connected to a
479 : : * Low Speed device in host mode. This parameter is applicable only if
480 : : * HOST_SUPPORT_FS_LS_LOW_POWER is enabled. If PHY_TYPE is set to FS
481 : : * then defaults to 6 MHZ otherwise 48 MHZ.
482 : : *
483 : : * 0 - 48 MHz
484 : : * 1 - 6 MHz
485 : : */
486 : : int32_t host_ls_low_power_phy_clk;
487 : :
488 : : /**
489 : : * 0 - Use cC FIFO size parameters
490 : : * 1 - Allow dynamic FIFO sizing (default)
491 : : */
492 : : int32_t enable_dynamic_fifo;
493 : :
494 : : /** Total number of 4-byte words in the data FIFO memory. This
495 : : * memory includes the Rx FIFO, non-periodic Tx FIFO, and periodic
496 : : * Tx FIFOs.
497 : : * 32 to 32768 (default 8192)
498 : : * Note: The total FIFO memory depth in the FPGA configuration is 8192.
499 : : */
500 : : int32_t data_fifo_size;
501 : :
502 : : /** Number of 4-byte words in the Rx FIFO in device mode when dynamic
503 : : * FIFO sizing is enabled.
504 : : * 16 to 32768 (default 1064)
505 : : */
506 : : int32_t dev_rx_fifo_size;
507 : :
508 : : /** Number of 4-byte words in the non-periodic Tx FIFO in device mode
509 : : * when dynamic FIFO sizing is enabled.
510 : : * 16 to 32768 (default 1024)
511 : : */
512 : : int32_t dev_nperio_tx_fifo_size;
513 : :
514 : : /** Number of 4-byte words in each of the periodic Tx FIFOs in device
515 : : * mode when dynamic FIFO sizing is enabled.
516 : : * 4 to 768 (default 256)
517 : : */
518 : : uint32_t dev_perio_tx_fifo_size[MAX_PERIO_FIFOS];
519 : :
520 : : /** Number of 4-byte words in the Rx FIFO in host mode when dynamic
521 : : * FIFO sizing is enabled.
522 : : * 16 to 32768 (default 1024)
523 : : */
524 : : int32_t host_rx_fifo_size;
525 : :
526 : : /** Number of 4-byte words in the non-periodic Tx FIFO in host mode
527 : : * when Dynamic FIFO sizing is enabled in the core.
528 : : * 16 to 32768 (default 1024)
529 : : */
530 : : int32_t host_nperio_tx_fifo_size;
531 : :
532 : : /** Number of 4-byte words in the host periodic Tx FIFO when dynamic
533 : : * FIFO sizing is enabled.
534 : : * 16 to 32768 (default 1024)
535 : : */
536 : : int32_t host_perio_tx_fifo_size;
537 : :
538 : : /** The maximum transfer size supported in bytes.
539 : : * 2047 to 65,535 (default 65,535)
540 : : */
541 : : int32_t max_transfer_size;
542 : :
543 : : /** The maximum number of packets in a transfer.
544 : : * 15 to 511 (default 511)
545 : : */
546 : : int32_t max_packet_count;
547 : :
548 : : /** The number of host channel registers to use.
549 : : * 1 to 16 (default 12)
550 : : * Note: The FPGA configuration supports a maximum of 12 host channels.
551 : : */
552 : : int32_t host_channels;
553 : :
554 : : /** The number of endpoints in addition to EP0 available for device
555 : : * mode operations.
556 : : * 1 to 15 (default 6 IN and OUT)
557 : : * Note: The FPGA configuration supports a maximum of 6 IN and OUT
558 : : * endpoints in addition to EP0.
559 : : */
560 : : int32_t dev_endpoints;
561 : :
562 : : /**
563 : : * Specifies the type of PHY interface to use. By default, the driver
564 : : * will automatically detect the phy_type.
565 : : *
566 : : * 0 - Full Speed PHY
567 : : * 1 - UTMI+ (default)
568 : : * 2 - ULPI
569 : : */
570 : : int32_t phy_type;
571 : :
572 : : /**
573 : : * Specifies the UTMI+ Data Width. This parameter is
574 : : * applicable for a PHY_TYPE of UTMI+ or ULPI. (For a ULPI
575 : : * PHY_TYPE, this parameter indicates the data width between
576 : : * the MAC and the ULPI Wrapper.) Also, this parameter is
577 : : * applicable only if the OTG_HSPHY_WIDTH cC parameter was set
578 : : * to "8 and 16 bits", meaning that the core has been
579 : : * configured to work at either data path width.
580 : : *
581 : : * 8 or 16 bits (default 16)
582 : : */
583 : : int32_t phy_utmi_width;
584 : :
585 : : /**
586 : : * Specifies whether the ULPI operates at double or single
587 : : * data rate. This parameter is only applicable if PHY_TYPE is
588 : : * ULPI.
589 : : *
590 : : * 0 - single data rate ULPI interface with 8 bit wide data
591 : : * bus (default)
592 : : * 1 - double data rate ULPI interface with 4 bit wide data
593 : : * bus
594 : : */
595 : : int32_t phy_ulpi_ddr;
596 : :
597 : : /**
598 : : * Specifies whether to use the internal or external supply to
599 : : * drive the vbus with a ULPI phy.
600 : : */
601 : : int32_t phy_ulpi_ext_vbus;
602 : :
603 : : /**
604 : : * Specifies whether to use the I2Cinterface for full speed PHY. This
605 : : * parameter is only applicable if PHY_TYPE is FS.
606 : : * 0 - No (default)
607 : : * 1 - Yes
608 : : */
609 : : int32_t i2c_enable;
610 : :
611 : : int32_t ulpi_fs_ls;
612 : :
613 : : int32_t ts_dline;
614 : :
615 : : /**
616 : : * Specifies whether dedicated transmit FIFOs are
617 : : * enabled for non periodic IN endpoints in device mode
618 : : * 0 - No
619 : : * 1 - Yes
620 : : */
621 : : int32_t en_multiple_tx_fifo;
622 : :
623 : : /** Number of 4-byte words in each of the Tx FIFOs in device
624 : : * mode when dynamic FIFO sizing is enabled.
625 : : * 4 to 768 (default 256)
626 : : */
627 : : uint32_t dev_tx_fifo_size[MAX_TX_FIFOS];
628 : :
629 : : /** Thresholding enable flag-
630 : : * bit 0 - enable non-ISO Tx thresholding
631 : : * bit 1 - enable ISO Tx thresholding
632 : : * bit 2 - enable Rx thresholding
633 : : */
634 : : uint32_t thr_ctl;
635 : :
636 : : /** Thresholding length for Tx
637 : : * FIFOs in 32 bit DWORDs
638 : : */
639 : : uint32_t tx_thr_length;
640 : :
641 : : /** Thresholding length for Rx
642 : : * FIFOs in 32 bit DWORDs
643 : : */
644 : : uint32_t rx_thr_length;
645 : :
646 : : /**
647 : : * Specifies whether LPM (Link Power Management) support is enabled
648 : : */
649 : : int32_t lpm_enable;
650 : :
651 : : /** Per Transfer Interrupt
652 : : * mode enable flag
653 : : * 1 - Enabled
654 : : * 0 - Disabled
655 : : */
656 : : int32_t pti_enable;
657 : :
658 : : /** Multi Processor Interrupt
659 : : * mode enable flag
660 : : * 1 - Enabled
661 : : * 0 - Disabled
662 : : */
663 : : int32_t mpi_enable;
664 : :
665 : : /** IS_USB Capability
666 : : * 1 - Enabled
667 : : * 0 - Disabled
668 : : */
669 : : int32_t ic_usb_cap;
670 : :
671 : : /** AHB Threshold Ratio
672 : : * 2'b00 AHB Threshold = MAC Threshold
673 : : * 2'b01 AHB Threshold = 1/2 MAC Threshold
674 : : * 2'b10 AHB Threshold = 1/4 MAC Threshold
675 : : * 2'b11 AHB Threshold = 1/8 MAC Threshold
676 : : */
677 : : int32_t ahb_thr_ratio;
678 : :
679 : : /** ADP Support
680 : : * 1 - Enabled
681 : : * 0 - Disabled
682 : : */
683 : : int32_t adp_supp_enable;
684 : :
685 : : /** HFIR Reload Control
686 : : * 0 - The HFIR cannot be reloaded dynamically.
687 : : * 1 - Allow dynamic reloading of the HFIR register during runtime.
688 : : */
689 : : int32_t reload_ctl;
690 : :
691 : : /** DCFG: Enable device Out NAK
692 : : * 0 - The core does not set NAK after Bulk Out transfer complete.
693 : : * 1 - The core sets NAK after Bulk OUT transfer complete.
694 : : */
695 : : int32_t dev_out_nak;
696 : :
697 : : /** DCFG: Enable Continue on BNA
698 : : * After receiving BNA interrupt the core disables the endpoint,when the
699 : : * endpoint is re-enabled by the application the core starts processing
700 : : * 0 - from the DOEPDMA descriptor
701 : : * 1 - from the descriptor which received the BNA.
702 : : */
703 : : int32_t cont_on_bna;
704 : :
705 : : /** GAHBCFG: AHB Single Support
706 : : * This bit when programmed supports SINGLE transfers for remainder
707 : : * data in a transfer for DMA mode of operation.
708 : : * 0 - in this case the remainder data will be sent using INCR burst size.
709 : : * 1 - in this case the remainder data will be sent using SINGLE burst size.
710 : : */
711 : : int32_t ahb_single;
712 : :
713 : : /** Core Power down mode
714 : : * 0 - No Power Down is enabled
715 : : * 1 - Reserved
716 : : * 2 - Complete Power Down (Hibernation)
717 : : */
718 : : int32_t power_down;
719 : :
720 : : /** OTG revision supported
721 : : * 0 - OTG 1.3 revision
722 : : * 1 - OTG 2.0 revision
723 : : */
724 : : int32_t otg_ver;
725 : :
726 : : } dwc_otg_core_params_t;
727 : :
728 : : #ifdef DEBUG
729 : : struct dwc_otg_core_if;
730 : : typedef struct hc_xfer_info {
731 : : struct dwc_otg_core_if *core_if;
732 : : dwc_hc_t *hc;
733 : : } hc_xfer_info_t;
734 : : #endif
735 : :
736 : : typedef struct ep_xfer_info {
737 : : struct dwc_otg_core_if *core_if;
738 : : dwc_ep_t *ep;
739 : : uint8_t state;
740 : : } ep_xfer_info_t;
741 : : /*
742 : : * Device States
743 : : */
744 : : typedef enum dwc_otg_lx_state {
745 : : /** On state */
746 : : DWC_OTG_L0,
747 : : /** LPM sleep state*/
748 : : DWC_OTG_L1,
749 : : /** USB suspend state*/
750 : : DWC_OTG_L2,
751 : : /** Off state*/
752 : : DWC_OTG_L3
753 : : } dwc_otg_lx_state_e;
754 : :
755 : : struct dwc_otg_global_regs_backup {
756 : : uint32_t gotgctl_local;
757 : : uint32_t gintmsk_local;
758 : : uint32_t gahbcfg_local;
759 : : uint32_t gusbcfg_local;
760 : : uint32_t grxfsiz_local;
761 : : uint32_t gnptxfsiz_local;
762 : : #ifdef CONFIG_USB_DWC_OTG_LPM
763 : : uint32_t glpmcfg_local;
764 : : #endif
765 : : uint32_t gi2cctl_local;
766 : : uint32_t hptxfsiz_local;
767 : : uint32_t pcgcctl_local;
768 : : uint32_t gdfifocfg_local;
769 : : uint32_t dtxfsiz_local[MAX_EPS_CHANNELS];
770 : : uint32_t gpwrdn_local;
771 : : uint32_t xhib_pcgcctl;
772 : : uint32_t xhib_gpwrdn;
773 : : };
774 : :
775 : : struct dwc_otg_host_regs_backup {
776 : : uint32_t hcfg_local;
777 : : uint32_t haintmsk_local;
778 : : uint32_t hcintmsk_local[MAX_EPS_CHANNELS];
779 : : uint32_t hprt0_local;
780 : : uint32_t hfir_local;
781 : : };
782 : :
783 : : struct dwc_otg_dev_regs_backup {
784 : : uint32_t dcfg;
785 : : uint32_t dctl;
786 : : uint32_t daintmsk;
787 : : uint32_t diepmsk;
788 : : uint32_t doepmsk;
789 : : uint32_t diepctl[MAX_EPS_CHANNELS];
790 : : uint32_t dieptsiz[MAX_EPS_CHANNELS];
791 : : uint32_t diepdma[MAX_EPS_CHANNELS];
792 : : };
793 : : /**
794 : : * The <code>dwc_otg_core_if</code> structure contains information needed to manage
795 : : * the DWC_otg controller acting in either host or device mode. It
796 : : * represents the programming view of the controller as a whole.
797 : : */
798 : : struct dwc_otg_core_if {
799 : : /** Parameters that define how the core should be configured.*/
800 : : dwc_otg_core_params_t *core_params;
801 : :
802 : : /** Core Global registers starting at offset 000h. */
803 : : dwc_otg_core_global_regs_t *core_global_regs;
804 : :
805 : : /** Device-specific information */
806 : : dwc_otg_dev_if_t *dev_if;
807 : : /** Host-specific information */
808 : : dwc_otg_host_if_t *host_if;
809 : :
810 : : /** Value from SNPSID register */
811 : : uint32_t snpsid;
812 : :
813 : : /*
814 : : * Set to 1 if the core PHY interface bits in USBCFG have been
815 : : * initialized.
816 : : */
817 : : uint8_t phy_init_done;
818 : :
819 : : /*
820 : : * SRP Success flag, set by srp success interrupt in FS I2C mode
821 : : */
822 : : uint8_t srp_success;
823 : : uint8_t srp_timer_started;
824 : : /** Timer for SRP. If it expires before SRP is successful
825 : : * clear the SRP. */
826 : : dwc_timer_t *srp_timer;
827 : :
828 : : #ifdef DWC_DEV_SRPCAP
829 : : /* This timer is needed to power on the hibernated host core if SRP is not
830 : : * initiated on connected SRP capable device for limited period of time
831 : : */
832 : : uint8_t pwron_timer_started;
833 : : dwc_timer_t *pwron_timer;
834 : : #endif
835 : : /* Common configuration information */
836 : : /** Power and Clock Gating Control Register */
837 : : volatile uint32_t *pcgcctl;
838 : : #define DWC_OTG_PCGCCTL_OFFSET 0xE00
839 : :
840 : : /** Push/pop addresses for endpoints or host channels.*/
841 : : uint32_t *data_fifo[MAX_EPS_CHANNELS];
842 : : #define DWC_OTG_DATA_FIFO_OFFSET 0x1000
843 : : #define DWC_OTG_DATA_FIFO_SIZE 0x1000
844 : :
845 : : /** Total RAM for FIFOs (Bytes) */
846 : : uint16_t total_fifo_size;
847 : : /** Size of Rx FIFO (Bytes) */
848 : : uint16_t rx_fifo_size;
849 : : /** Size of Non-periodic Tx FIFO (Bytes) */
850 : : uint16_t nperio_tx_fifo_size;
851 : :
852 : : /** 1 if DMA is enabled, 0 otherwise. */
853 : : uint8_t dma_enable;
854 : :
855 : : /** 1 if DMA descriptor is enabled, 0 otherwise. */
856 : : uint8_t dma_desc_enable;
857 : :
858 : : /** 1 if PTI Enhancement mode is enabled, 0 otherwise. */
859 : : uint8_t pti_enh_enable;
860 : :
861 : : /** 1 if MPI Enhancement mode is enabled, 0 otherwise. */
862 : : uint8_t multiproc_int_enable;
863 : :
864 : : /** 1 if dedicated Tx FIFOs are enabled, 0 otherwise. */
865 : : uint8_t en_multiple_tx_fifo;
866 : :
867 : : /** Set to 1 if multiple packets of a high-bandwidth transfer is in
868 : : * process of being queued */
869 : : uint8_t queuing_high_bandwidth;
870 : :
871 : : /** Hardware Configuration -- stored here for convenience.*/
872 : : hwcfg1_data_t hwcfg1;
873 : : hwcfg2_data_t hwcfg2;
874 : : hwcfg3_data_t hwcfg3;
875 : : hwcfg4_data_t hwcfg4;
876 : : fifosize_data_t hptxfsiz;
877 : :
878 : : /** Host and Device Configuration -- stored here for convenience.*/
879 : : hcfg_data_t hcfg;
880 : : dcfg_data_t dcfg;
881 : :
882 : : /** The operational State, during transations
883 : : * (a_host>>a_peripherial and b_device=>b_host) this may not
884 : : * match the core but allows the software to determine
885 : : * transitions.
886 : : */
887 : : uint8_t op_state;
888 : :
889 : : /**
890 : : * Set to 1 if the HCD needs to be restarted on a session request
891 : : * interrupt. This is required if no connector ID status change has
892 : : * occurred since the HCD was last disconnected.
893 : : */
894 : : uint8_t restart_hcd_on_session_req;
895 : :
896 : : /** HCD callbacks */
897 : : /** A-Device is a_host */
898 : : #define A_HOST (1)
899 : : /** A-Device is a_suspend */
900 : : #define A_SUSPEND (2)
901 : : /** A-Device is a_peripherial */
902 : : #define A_PERIPHERAL (3)
903 : : /** B-Device is operating as a Peripheral. */
904 : : #define B_PERIPHERAL (4)
905 : : /** B-Device is operating as a Host. */
906 : : #define B_HOST (5)
907 : :
908 : : /** HCD callbacks */
909 : : struct dwc_otg_cil_callbacks *hcd_cb;
910 : : /** PCD callbacks */
911 : : struct dwc_otg_cil_callbacks *pcd_cb;
912 : :
913 : : /** Device mode Periodic Tx FIFO Mask */
914 : : uint32_t p_tx_msk;
915 : : /** Device mode Periodic Tx FIFO Mask */
916 : : uint32_t tx_msk;
917 : :
918 : : /** Workqueue object used for handling several interrupts */
919 : : dwc_workq_t *wq_otg;
920 : :
921 : : /** Timer object used for handling "Wakeup Detected" Interrupt */
922 : : dwc_timer_t *wkp_timer;
923 : : /** This arrays used for debug purposes for DEV OUT NAK enhancement */
924 : : uint32_t start_doeptsiz_val[MAX_EPS_CHANNELS];
925 : : ep_xfer_info_t ep_xfer_info[MAX_EPS_CHANNELS];
926 : : dwc_timer_t *ep_xfer_timer[MAX_EPS_CHANNELS];
927 : : #ifdef DEBUG
928 : : uint32_t start_hcchar_val[MAX_EPS_CHANNELS];
929 : :
930 : : hc_xfer_info_t hc_xfer_info[MAX_EPS_CHANNELS];
931 : : dwc_timer_t *hc_xfer_timer[MAX_EPS_CHANNELS];
932 : :
933 : : uint32_t hfnum_7_samples;
934 : : uint64_t hfnum_7_frrem_accum;
935 : : uint32_t hfnum_0_samples;
936 : : uint64_t hfnum_0_frrem_accum;
937 : : uint32_t hfnum_other_samples;
938 : : uint64_t hfnum_other_frrem_accum;
939 : : #endif
940 : :
941 : : #ifdef DWC_UTE_CFI
942 : : uint16_t pwron_rxfsiz;
943 : : uint16_t pwron_gnptxfsiz;
944 : : uint16_t pwron_txfsiz[15];
945 : :
946 : : uint16_t init_rxfsiz;
947 : : uint16_t init_gnptxfsiz;
948 : : uint16_t init_txfsiz[15];
949 : : #endif
950 : :
951 : : /** Lx state of device */
952 : : dwc_otg_lx_state_e lx_state;
953 : :
954 : : /** Saved Core Global registers */
955 : : struct dwc_otg_global_regs_backup *gr_backup;
956 : : /** Saved Host registers */
957 : : struct dwc_otg_host_regs_backup *hr_backup;
958 : : /** Saved Device registers */
959 : : struct dwc_otg_dev_regs_backup *dr_backup;
960 : :
961 : : /** Power Down Enable */
962 : : uint32_t power_down;
963 : :
964 : : /** ADP support Enable */
965 : : uint32_t adp_enable;
966 : :
967 : : /** ADP structure object */
968 : : dwc_otg_adp_t adp;
969 : :
970 : : /** hibernation/suspend flag */
971 : : int hibernation_suspend;
972 : :
973 : : /** Device mode extended hibernation flag */
974 : : int xhib;
975 : :
976 : : /** OTG revision supported */
977 : : uint32_t otg_ver;
978 : :
979 : : /** OTG status flag used for HNP polling */
980 : : uint8_t otg_sts;
981 : :
982 : : /** Pointer to either hcd->lock or pcd->lock */
983 : : dwc_spinlock_t *lock;
984 : :
985 : : /** Start predict NextEP based on Learning Queue if equal 1,
986 : : * also used as counter of disabled NP IN EP's */
987 : : uint8_t start_predict;
988 : :
989 : : /** NextEp sequence, including EP0: nextep_seq[] = EP if non-periodic and
990 : : * active, 0xff otherwise */
991 : : uint8_t nextep_seq[MAX_EPS_CHANNELS];
992 : :
993 : : /** Index of fisrt EP in nextep_seq array which should be re-enabled **/
994 : : uint8_t first_in_nextep_seq;
995 : :
996 : : /** Frame number while entering to ISR - needed for ISOCs **/
997 : : uint32_t frame_num;
998 : :
999 : : };
1000 : :
1001 : : #ifdef DEBUG
1002 : : /*
1003 : : * This function is called when transfer is timed out.
1004 : : */
1005 : : extern void hc_xfer_timeout(void *ptr);
1006 : : #endif
1007 : :
1008 : : /*
1009 : : * This function is called when transfer is timed out on endpoint.
1010 : : */
1011 : : extern void ep_xfer_timeout(void *ptr);
1012 : :
1013 : : /*
1014 : : * The following functions are functions for works
1015 : : * using during handling some interrupts
1016 : : */
1017 : : extern void w_conn_id_status_change(void *p);
1018 : :
1019 : : extern void w_wakeup_detected(void *p);
1020 : :
1021 : : /** Saves global register values into system memory. */
1022 : : extern int dwc_otg_save_global_regs(dwc_otg_core_if_t * core_if);
1023 : : /** Saves device register values into system memory. */
1024 : : extern int dwc_otg_save_dev_regs(dwc_otg_core_if_t * core_if);
1025 : : /** Saves host register values into system memory. */
1026 : : extern int dwc_otg_save_host_regs(dwc_otg_core_if_t * core_if);
1027 : : /** Restore global register values. */
1028 : : extern int dwc_otg_restore_global_regs(dwc_otg_core_if_t * core_if);
1029 : : /** Restore host register values. */
1030 : : extern int dwc_otg_restore_host_regs(dwc_otg_core_if_t * core_if, int reset);
1031 : : /** Restore device register values. */
1032 : : extern int dwc_otg_restore_dev_regs(dwc_otg_core_if_t * core_if,
1033 : : int rem_wakeup);
1034 : : extern int restore_lpm_i2c_regs(dwc_otg_core_if_t * core_if);
1035 : : extern int restore_essential_regs(dwc_otg_core_if_t * core_if, int rmode,
1036 : : int is_host);
1037 : :
1038 : : extern int dwc_otg_host_hibernation_restore(dwc_otg_core_if_t * core_if,
1039 : : int restore_mode, int reset);
1040 : : extern int dwc_otg_device_hibernation_restore(dwc_otg_core_if_t * core_if,
1041 : : int rem_wakeup, int reset);
1042 : :
1043 : : /*
1044 : : * The following functions support initialization of the CIL driver component
1045 : : * and the DWC_otg controller.
1046 : : */
1047 : : extern void dwc_otg_core_host_init(dwc_otg_core_if_t * _core_if);
1048 : : extern void dwc_otg_core_dev_init(dwc_otg_core_if_t * _core_if);
1049 : :
1050 : : /** @name Device CIL Functions
1051 : : * The following functions support managing the DWC_otg controller in device
1052 : : * mode.
1053 : : */
1054 : : /**@{*/
1055 : : extern void dwc_otg_wakeup(dwc_otg_core_if_t * _core_if);
1056 : : extern void dwc_otg_read_setup_packet(dwc_otg_core_if_t * _core_if,
1057 : : uint32_t * _dest);
1058 : : extern uint32_t dwc_otg_get_frame_number(dwc_otg_core_if_t * _core_if);
1059 : : extern void dwc_otg_ep0_activate(dwc_otg_core_if_t * _core_if, dwc_ep_t * _ep);
1060 : : extern void dwc_otg_ep_activate(dwc_otg_core_if_t * _core_if, dwc_ep_t * _ep);
1061 : : extern void dwc_otg_ep_deactivate(dwc_otg_core_if_t * _core_if, dwc_ep_t * _ep);
1062 : : extern void dwc_otg_ep_start_transfer(dwc_otg_core_if_t * _core_if,
1063 : : dwc_ep_t * _ep);
1064 : : extern void dwc_otg_ep_start_zl_transfer(dwc_otg_core_if_t * _core_if,
1065 : : dwc_ep_t * _ep);
1066 : : extern void dwc_otg_ep0_start_transfer(dwc_otg_core_if_t * _core_if,
1067 : : dwc_ep_t * _ep);
1068 : : extern void dwc_otg_ep0_continue_transfer(dwc_otg_core_if_t * _core_if,
1069 : : dwc_ep_t * _ep);
1070 : : extern void dwc_otg_ep_write_packet(dwc_otg_core_if_t * _core_if,
1071 : : dwc_ep_t * _ep, int _dma);
1072 : : extern void dwc_otg_ep_set_stall(dwc_otg_core_if_t * _core_if, dwc_ep_t * _ep);
1073 : : extern void dwc_otg_ep_clear_stall(dwc_otg_core_if_t * _core_if,
1074 : : dwc_ep_t * _ep);
1075 : : extern void dwc_otg_enable_device_interrupts(dwc_otg_core_if_t * _core_if);
1076 : :
1077 : : #ifdef DWC_EN_ISOC
1078 : : extern void dwc_otg_iso_ep_start_frm_transfer(dwc_otg_core_if_t * core_if,
1079 : : dwc_ep_t * ep);
1080 : : extern void dwc_otg_iso_ep_start_buf_transfer(dwc_otg_core_if_t * core_if,
1081 : : dwc_ep_t * ep);
1082 : : #endif /* DWC_EN_ISOC */
1083 : : /**@}*/
1084 : :
1085 : : /** @name Host CIL Functions
1086 : : * The following functions support managing the DWC_otg controller in host
1087 : : * mode.
1088 : : */
1089 : : /**@{*/
1090 : : extern void dwc_otg_hc_init(dwc_otg_core_if_t * _core_if, dwc_hc_t * _hc);
1091 : : extern void dwc_otg_hc_halt(dwc_otg_core_if_t * _core_if,
1092 : : dwc_hc_t * _hc, dwc_otg_halt_status_e _halt_status);
1093 : : extern void dwc_otg_hc_cleanup(dwc_otg_core_if_t * _core_if, dwc_hc_t * _hc);
1094 : : extern void dwc_otg_hc_start_transfer(dwc_otg_core_if_t * _core_if,
1095 : : dwc_hc_t * _hc);
1096 : : extern int dwc_otg_hc_continue_transfer(dwc_otg_core_if_t * _core_if,
1097 : : dwc_hc_t * _hc);
1098 : : extern void dwc_otg_hc_do_ping(dwc_otg_core_if_t * _core_if, dwc_hc_t * _hc);
1099 : : extern void dwc_otg_hc_write_packet(dwc_otg_core_if_t * _core_if,
1100 : : dwc_hc_t * _hc);
1101 : : extern void dwc_otg_enable_host_interrupts(dwc_otg_core_if_t * _core_if);
1102 : : extern void dwc_otg_disable_host_interrupts(dwc_otg_core_if_t * _core_if);
1103 : :
1104 : : extern void dwc_otg_hc_start_transfer_ddma(dwc_otg_core_if_t * core_if,
1105 : : dwc_hc_t * hc);
1106 : :
1107 : : extern uint32_t calc_frame_interval(dwc_otg_core_if_t * core_if);
1108 : :
1109 : : /* Macro used to clear one channel interrupt */
1110 : : #define clear_hc_int(_hc_regs_, _intr_) \
1111 : : do { \
1112 : : hcint_data_t hcint_clear = {.d32 = 0}; \
1113 : : hcint_clear.b._intr_ = 1; \
1114 : : DWC_WRITE_REG32(&(_hc_regs_)->hcint, hcint_clear.d32); \
1115 : : } while (0)
1116 : :
1117 : : /*
1118 : : * Macro used to disable one channel interrupt. Channel interrupts are
1119 : : * disabled when the channel is halted or released by the interrupt handler.
1120 : : * There is no need to handle further interrupts of that type until the
1121 : : * channel is re-assigned. In fact, subsequent handling may cause crashes
1122 : : * because the channel structures are cleaned up when the channel is released.
1123 : : */
1124 : : #define disable_hc_int(_hc_regs_, _intr_) \
1125 : : do { \
1126 : : hcintmsk_data_t hcintmsk = {.d32 = 0}; \
1127 : : hcintmsk.b._intr_ = 1; \
1128 : : DWC_MODIFY_REG32(&(_hc_regs_)->hcintmsk, hcintmsk.d32, 0); \
1129 : : } while (0)
1130 : :
1131 : : /**
1132 : : * This function Reads HPRT0 in preparation to modify. It keeps the
1133 : : * WC bits 0 so that if they are read as 1, they won't clear when you
1134 : : * write it back
1135 : : */
1136 : 1035 : static inline uint32_t dwc_otg_read_hprt0(dwc_otg_core_if_t * _core_if)
1137 : : {
1138 : : hprt0_data_t hprt0;
1139 : 1035 : hprt0.d32 = DWC_READ_REG32(_core_if->host_if->hprt0);
1140 : 1035 : hprt0.b.prtena = 0;
1141 : 1035 : hprt0.b.prtconndet = 0;
1142 : 1035 : hprt0.b.prtenchng = 0;
1143 : 1035 : hprt0.b.prtovrcurrchng = 0;
1144 : 1035 : return hprt0.d32;
1145 : : }
1146 : :
1147 : : /**@}*/
1148 : :
1149 : : /** @name Common CIL Functions
1150 : : * The following functions support managing the DWC_otg controller in either
1151 : : * device or host mode.
1152 : : */
1153 : : /**@{*/
1154 : :
1155 : : extern void dwc_otg_read_packet(dwc_otg_core_if_t * core_if,
1156 : : uint8_t * dest, uint16_t bytes);
1157 : :
1158 : : extern void dwc_otg_flush_tx_fifo(dwc_otg_core_if_t * _core_if, const int _num);
1159 : : extern void dwc_otg_flush_rx_fifo(dwc_otg_core_if_t * _core_if);
1160 : : extern void dwc_otg_core_reset(dwc_otg_core_if_t * _core_if);
1161 : :
1162 : : /**
1163 : : * This function returns the Core Interrupt register.
1164 : : */
1165 : 0 : static inline uint32_t dwc_otg_read_core_intr(dwc_otg_core_if_t * core_if)
1166 : : {
1167 : 0 : return (DWC_READ_REG32(&core_if->core_global_regs->gintsts) &
1168 : 0 : DWC_READ_REG32(&core_if->core_global_regs->gintmsk));
1169 : : }
1170 : :
1171 : : /**
1172 : : * This function returns the OTG Interrupt register.
1173 : : */
1174 : : static inline uint32_t dwc_otg_read_otg_intr(dwc_otg_core_if_t * core_if)
1175 : : {
1176 : : return (DWC_READ_REG32(&core_if->core_global_regs->gotgint));
1177 : : }
1178 : :
1179 : : /**
1180 : : * This function reads the Device All Endpoints Interrupt register and
1181 : : * returns the IN endpoint interrupt bits.
1182 : : */
1183 : 0 : static inline uint32_t dwc_otg_read_dev_all_in_ep_intr(dwc_otg_core_if_t *
1184 : : core_if)
1185 : : {
1186 : :
1187 : : uint32_t v;
1188 : :
1189 [ # # ]: 0 : if (core_if->multiproc_int_enable) {
1190 : 0 : v = DWC_READ_REG32(&core_if->dev_if->
1191 : : dev_global_regs->deachint) &
1192 : 0 : DWC_READ_REG32(&core_if->
1193 : 0 : dev_if->dev_global_regs->deachintmsk);
1194 : : } else {
1195 : 0 : v = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daint) &
1196 : 0 : DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daintmsk);
1197 : : }
1198 : 0 : return (v & 0xffff);
1199 : : }
1200 : :
1201 : : /**
1202 : : * This function reads the Device All Endpoints Interrupt register and
1203 : : * returns the OUT endpoint interrupt bits.
1204 : : */
1205 : 0 : static inline uint32_t dwc_otg_read_dev_all_out_ep_intr(dwc_otg_core_if_t *
1206 : : core_if)
1207 : : {
1208 : : uint32_t v;
1209 : :
1210 [ # # ]: 0 : if (core_if->multiproc_int_enable) {
1211 : 0 : v = DWC_READ_REG32(&core_if->dev_if->
1212 : : dev_global_regs->deachint) &
1213 : 0 : DWC_READ_REG32(&core_if->
1214 : 0 : dev_if->dev_global_regs->deachintmsk);
1215 : : } else {
1216 : 0 : v = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daint) &
1217 : 0 : DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daintmsk);
1218 : : }
1219 : :
1220 : 0 : return ((v & 0xffff0000) >> 16);
1221 : : }
1222 : :
1223 : : /**
1224 : : * This function returns the Device IN EP Interrupt register
1225 : : */
1226 : 0 : static inline uint32_t dwc_otg_read_dev_in_ep_intr(dwc_otg_core_if_t * core_if,
1227 : : dwc_ep_t * ep)
1228 : : {
1229 : 0 : dwc_otg_dev_if_t *dev_if = core_if->dev_if;
1230 : : uint32_t v, msk, emp;
1231 : :
1232 [ # # ]: 0 : if (core_if->multiproc_int_enable) {
1233 : 0 : msk =
1234 : 0 : DWC_READ_REG32(&dev_if->
1235 : 0 : dev_global_regs->diepeachintmsk[ep->num]);
1236 : 0 : emp =
1237 : 0 : DWC_READ_REG32(&dev_if->
1238 : : dev_global_regs->dtknqr4_fifoemptymsk);
1239 : 0 : msk |= ((emp >> ep->num) & 0x1) << 7;
1240 : 0 : v = DWC_READ_REG32(&dev_if->in_ep_regs[ep->num]->diepint) & msk;
1241 : : } else {
1242 : 0 : msk = DWC_READ_REG32(&dev_if->dev_global_regs->diepmsk);
1243 : 0 : emp =
1244 : 0 : DWC_READ_REG32(&dev_if->
1245 : : dev_global_regs->dtknqr4_fifoemptymsk);
1246 : 0 : msk |= ((emp >> ep->num) & 0x1) << 7;
1247 : 0 : v = DWC_READ_REG32(&dev_if->in_ep_regs[ep->num]->diepint) & msk;
1248 : : }
1249 : :
1250 : 0 : return v;
1251 : : }
1252 : :
1253 : : /**
1254 : : * This function returns the Device OUT EP Interrupt register
1255 : : */
1256 : 0 : static inline uint32_t dwc_otg_read_dev_out_ep_intr(dwc_otg_core_if_t *
1257 : : _core_if, dwc_ep_t * _ep)
1258 : : {
1259 : 0 : dwc_otg_dev_if_t *dev_if = _core_if->dev_if;
1260 : : uint32_t v;
1261 : : doepmsk_data_t msk = {.d32 = 0 };
1262 : :
1263 [ # # ]: 0 : if (_core_if->multiproc_int_enable) {
1264 : 0 : msk.d32 =
1265 : 0 : DWC_READ_REG32(&dev_if->
1266 : 0 : dev_global_regs->doepeachintmsk[_ep->num]);
1267 [ # # ]: 0 : if (_core_if->pti_enh_enable) {
1268 : 0 : msk.b.pktdrpsts = 1;
1269 : : }
1270 : 0 : v = DWC_READ_REG32(&dev_if->
1271 : 0 : out_ep_regs[_ep->num]->doepint) & msk.d32;
1272 : : } else {
1273 : 0 : msk.d32 = DWC_READ_REG32(&dev_if->dev_global_regs->doepmsk);
1274 [ # # ]: 0 : if (_core_if->pti_enh_enable) {
1275 : 0 : msk.b.pktdrpsts = 1;
1276 : : }
1277 : 0 : v = DWC_READ_REG32(&dev_if->
1278 : 0 : out_ep_regs[_ep->num]->doepint) & msk.d32;
1279 : : }
1280 : 0 : return v;
1281 : : }
1282 : :
1283 : : /**
1284 : : * This function returns the Host All Channel Interrupt register
1285 : : */
1286 : : static inline uint32_t dwc_otg_read_host_all_channels_intr(dwc_otg_core_if_t *
1287 : : _core_if)
1288 : : {
1289 : 0 : return (DWC_READ_REG32(&_core_if->host_if->host_global_regs->haint));
1290 : : }
1291 : :
1292 : : static inline uint32_t dwc_otg_read_host_channel_intr(dwc_otg_core_if_t *
1293 : : _core_if, dwc_hc_t * _hc)
1294 : : {
1295 : : return (DWC_READ_REG32
1296 : : (&_core_if->host_if->hc_regs[_hc->hc_num]->hcint));
1297 : : }
1298 : :
1299 : : /**
1300 : : * This function returns the mode of the operation, host or device.
1301 : : *
1302 : : * @return 0 - Device Mode, 1 - Host Mode
1303 : : */
1304 : : static inline uint32_t dwc_otg_mode(dwc_otg_core_if_t * _core_if)
1305 : : {
1306 : 55095826 : return (DWC_READ_REG32(&_core_if->core_global_regs->gintsts) & 0x1);
1307 : : }
1308 : :
1309 : : /**@}*/
1310 : :
1311 : : /**
1312 : : * DWC_otg CIL callback structure. This structure allows the HCD and
1313 : : * PCD to register functions used for starting and stopping the PCD
1314 : : * and HCD for role change on for a DRD.
1315 : : */
1316 : : typedef struct dwc_otg_cil_callbacks {
1317 : : /** Start function for role change */
1318 : : int (*start) (void *_p);
1319 : : /** Stop Function for role change */
1320 : : int (*stop) (void *_p);
1321 : : /** Disconnect Function for role change */
1322 : : int (*disconnect) (void *_p);
1323 : : /** Resume/Remote wakeup Function */
1324 : : int (*resume_wakeup) (void *_p);
1325 : : /** Suspend function */
1326 : : int (*suspend) (void *_p);
1327 : : /** Session Start (SRP) */
1328 : : int (*session_start) (void *_p);
1329 : : #ifdef CONFIG_USB_DWC_OTG_LPM
1330 : : /** Sleep (switch to L0 state) */
1331 : : int (*sleep) (void *_p);
1332 : : #endif
1333 : : /** Pointer passed to start() and stop() */
1334 : : void *p;
1335 : : } dwc_otg_cil_callbacks_t;
1336 : :
1337 : : extern void dwc_otg_cil_register_pcd_callbacks(dwc_otg_core_if_t * _core_if,
1338 : : dwc_otg_cil_callbacks_t * _cb,
1339 : : void *_p);
1340 : : extern void dwc_otg_cil_register_hcd_callbacks(dwc_otg_core_if_t * _core_if,
1341 : : dwc_otg_cil_callbacks_t * _cb,
1342 : : void *_p);
1343 : :
1344 : : void dwc_otg_initiate_srp(dwc_otg_core_if_t * core_if);
1345 : :
1346 : : //////////////////////////////////////////////////////////////////////
1347 : : /** Start the HCD. Helper function for using the HCD callbacks.
1348 : : *
1349 : : * @param core_if Programming view of DWC_otg controller.
1350 : : */
1351 : : static inline void cil_hcd_start(dwc_otg_core_if_t * core_if)
1352 : : {
1353 [ # # # # : 0 : if (core_if->hcd_cb && core_if->hcd_cb->start) {
# # # # #
# # # # #
# # # # #
# # # # #
# # # # ]
1354 : 0 : core_if->hcd_cb->start(core_if->hcd_cb->p);
1355 : : }
1356 : : }
1357 : :
1358 : : /** Stop the HCD. Helper function for using the HCD callbacks.
1359 : : *
1360 : : * @param core_if Programming view of DWC_otg controller.
1361 : : */
1362 : : static inline void cil_hcd_stop(dwc_otg_core_if_t * core_if)
1363 : : {
1364 [ # # # # ]: 0 : if (core_if->hcd_cb && core_if->hcd_cb->stop) {
1365 : 0 : core_if->hcd_cb->stop(core_if->hcd_cb->p);
1366 : : }
1367 : : }
1368 : :
1369 : : /** Disconnect the HCD. Helper function for using the HCD callbacks.
1370 : : *
1371 : : * @param core_if Programming view of DWC_otg controller.
1372 : : */
1373 : : static inline void cil_hcd_disconnect(dwc_otg_core_if_t * core_if)
1374 : : {
1375 [ # # # # : 0 : if (core_if->hcd_cb && core_if->hcd_cb->disconnect) {
# # # # #
# # # # #
# # ]
1376 : 0 : core_if->hcd_cb->disconnect(core_if->hcd_cb->p);
1377 : : }
1378 : : }
1379 : :
1380 : : /** Inform the HCD the a New Session has begun. Helper function for
1381 : : * using the HCD callbacks.
1382 : : *
1383 : : * @param core_if Programming view of DWC_otg controller.
1384 : : */
1385 : : static inline void cil_hcd_session_start(dwc_otg_core_if_t * core_if)
1386 : : {
1387 [ # # # # ]: 0 : if (core_if->hcd_cb && core_if->hcd_cb->session_start) {
1388 : 0 : core_if->hcd_cb->session_start(core_if->hcd_cb->p);
1389 : : }
1390 : : }
1391 : :
1392 : : #ifdef CONFIG_USB_DWC_OTG_LPM
1393 : : /**
1394 : : * Inform the HCD about LPM sleep.
1395 : : * Helper function for using the HCD callbacks.
1396 : : *
1397 : : * @param core_if Programming view of DWC_otg controller.
1398 : : */
1399 : : static inline void cil_hcd_sleep(dwc_otg_core_if_t * core_if)
1400 : : {
1401 : : if (core_if->hcd_cb && core_if->hcd_cb->sleep) {
1402 : : core_if->hcd_cb->sleep(core_if->hcd_cb->p);
1403 : : }
1404 : : }
1405 : : #endif
1406 : :
1407 : : /** Resume the HCD. Helper function for using the HCD callbacks.
1408 : : *
1409 : : * @param core_if Programming view of DWC_otg controller.
1410 : : */
1411 : : static inline void cil_hcd_resume(dwc_otg_core_if_t * core_if)
1412 : : {
1413 [ # # # # ]: 0 : if (core_if->hcd_cb && core_if->hcd_cb->resume_wakeup) {
1414 : 0 : core_if->hcd_cb->resume_wakeup(core_if->hcd_cb->p);
1415 : : }
1416 : : }
1417 : :
1418 : : /** Start the PCD. Helper function for using the PCD callbacks.
1419 : : *
1420 : : * @param core_if Programming view of DWC_otg controller.
1421 : : */
1422 : : static inline void cil_pcd_start(dwc_otg_core_if_t * core_if)
1423 : : {
1424 [ # # # # : 0 : if (core_if->pcd_cb && core_if->pcd_cb->start) {
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # ]
1425 : 0 : core_if->pcd_cb->start(core_if->pcd_cb->p);
1426 : : }
1427 : : }
1428 : :
1429 : : /** Stop the PCD. Helper function for using the PCD callbacks.
1430 : : *
1431 : : * @param core_if Programming view of DWC_otg controller.
1432 : : */
1433 : : static inline void cil_pcd_stop(dwc_otg_core_if_t * core_if)
1434 : : {
1435 [ # # # # : 0 : if (core_if->pcd_cb && core_if->pcd_cb->stop) {
# # # # #
# # # # #
# # ]
1436 : 0 : core_if->pcd_cb->stop(core_if->pcd_cb->p);
1437 : : }
1438 : : }
1439 : :
1440 : : /** Suspend the PCD. Helper function for using the PCD callbacks.
1441 : : *
1442 : : * @param core_if Programming view of DWC_otg controller.
1443 : : */
1444 : : static inline void cil_pcd_suspend(dwc_otg_core_if_t * core_if)
1445 : : {
1446 [ # # # # ]: 0 : if (core_if->pcd_cb && core_if->pcd_cb->suspend) {
1447 : 0 : core_if->pcd_cb->suspend(core_if->pcd_cb->p);
1448 : : }
1449 : : }
1450 : :
1451 : : /** Resume the PCD. Helper function for using the PCD callbacks.
1452 : : *
1453 : : * @param core_if Programming view of DWC_otg controller.
1454 : : */
1455 : : static inline void cil_pcd_resume(dwc_otg_core_if_t * core_if)
1456 : : {
1457 [ # # # # ]: 0 : if (core_if->pcd_cb && core_if->pcd_cb->resume_wakeup) {
1458 : 0 : core_if->pcd_cb->resume_wakeup(core_if->pcd_cb->p);
1459 : : }
1460 : : }
1461 : :
1462 : : //////////////////////////////////////////////////////////////////////
1463 : :
1464 : : #endif
|