1 /* ==========================================================================
2 * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.h $
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.
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.
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
32 * ========================================================================== */
34 #if !defined(__DWC_CIL_H__)
37 #include <linux/scatterlist.h>
39 #include "dwc_otg_dbg.h"
40 #include "dwc_otg_regs.h"
42 #include "dwc_otg_core_if.h"
43 #include "dwc_otg_adp.h"
47 * This file contains the interface to the Core Interface Layer.
52 #define MAX_DMA_DESCS_PER_EP 256
55 * Enumeration for the data buffer mode
57 typedef enum _data_buffer_mode {
58 BM_STANDARD = 0, /* data buffer is in normal mode */
59 BM_SG = 1, /* data buffer uses the scatter/gather mode */
60 BM_CONCAT = 2, /* data buffer uses the concatenation mode */
61 BM_CIRCULAR = 3, /* data buffer uses the circular DMA mode */
62 BM_ALIGN = 4 /* data buffer is in buffer alignment mode */
66 /** Macros defined for DWC OTG HW Release version */
68 #define OTG_CORE_REV_2_60a 0x4F54260A
69 #define OTG_CORE_REV_2_71a 0x4F54271A
70 #define OTG_CORE_REV_2_72a 0x4F54272A
71 #define OTG_CORE_REV_2_80a 0x4F54280A
72 #define OTG_CORE_REV_2_81a 0x4F54281A
73 #define OTG_CORE_REV_2_90a 0x4F54290A
74 #define OTG_CORE_REV_2_91a 0x4F54291A
75 #define OTG_CORE_REV_2_92a 0x4F54292A
76 #define OTG_CORE_REV_2_93a 0x4F54293A
77 #define OTG_CORE_REV_2_94a 0x4F54294A
78 #define OTG_CORE_REV_3_00a 0x4F54300A
81 * Information for each ISOC packet.
83 typedef struct iso_pkt_info {
90 * The <code>dwc_ep</code> structure represents the state of a single
91 * endpoint when acting in device mode. It contains the data items
92 * needed for an endpoint to be activated and transfer packets.
94 typedef struct dwc_ep {
95 /** EP number used for register address lookup */
97 /** EP direction 0 = OUT */
103 * Periodic Tx FIFO # for IN EPs For INTR EP set to 0 to use non-periodic
104 * Tx FIFO. If dedicated Tx FIFOs are enabled Tx FIFO # FOR IN EPs*/
105 unsigned tx_fifo_num:4;
106 /** EP type: 0 - Control, 1 - ISOC, 2 - BULK, 3 - INTR */
108 #define DWC_OTG_EP_TYPE_CONTROL 0
109 #define DWC_OTG_EP_TYPE_ISOC 1
110 #define DWC_OTG_EP_TYPE_BULK 2
111 #define DWC_OTG_EP_TYPE_INTR 3
113 /** DATA start PID for INTR and BULK EP */
114 unsigned data_pid_start:1;
115 /** Frame (even/odd) for ISOC EP */
116 unsigned even_odd_frame:1;
117 /** Max Packet bytes */
118 unsigned maxpacket:11;
120 /** Max Transfer size */
123 /** @name Transfer state */
127 * Pointer to the beginning of the transfer buffer -- do not modify
133 dwc_dma_t dma_desc_addr;
134 dwc_otg_dev_dma_desc_t *desc_addr;
136 uint8_t *start_xfer_buff;
137 /** pointer to the transfer buffer */
139 /** Number of bytes to transfer */
140 unsigned xfer_len:19;
141 /** Number of bytes transferred. */
142 unsigned xfer_count:19;
145 /** Total len for control transfer */
146 unsigned total_len:19;
148 /** stall clear flag */
149 unsigned stall_clear_flag:1;
151 /** SETUP pkt cnt rollover flag for EP0 out*/
152 unsigned stp_rollover;
155 /* The buffer mode */
156 data_buffer_mode_e buff_mode;
158 /* The chain of DMA descriptors.
159 * MAX_DMA_DESCS_PER_EP will be allocated for each active EP.
161 dwc_otg_dma_desc_t *descs;
163 /* The DMA address of the descriptors chain start */
164 dma_addr_t descs_dma_addr;
165 /** This variable stores the length of the last enqueued request */
166 uint32_t cfi_req_len;
169 /** Max DMA Descriptor count for any EP */
170 #define MAX_DMA_DESC_CNT 256
171 /** Allocated DMA Desc count */
176 /** Next frame num to setup next ISOC transfer */
178 /** Indicates SOF number overrun in DSTS */
181 #ifdef DWC_UTE_PER_IO
182 /** Next frame num for which will be setup DMA Desc */
183 uint32_t xiso_frame_num;
185 uint32_t xiso_bInterval;
186 /** Count of currently active transfers - shall be either 0 or 1 */
187 int xiso_active_xfers;
188 int xiso_queued_xfers;
192 * Variables specific for ISOC EPs
195 /** DMA addresses of ISOC buffers */
199 dwc_dma_t iso_dma_desc_addr;
200 dwc_otg_dev_dma_desc_t *iso_desc_addr;
202 /** pointer to the transfer buffers */
206 /** number of ISOC Buffer is processing */
207 uint32_t proc_buf_num;
208 /** Interval of ISOC Buffer processing */
209 uint32_t buf_proc_intrvl;
210 /** Data size for regular frame */
211 uint32_t data_per_frame;
213 /* todo - pattern data support is to be implemented in the future */
214 /** Data size for pattern frame */
215 uint32_t data_pattern_frame;
216 /** Frame number of pattern data */
221 /** ISO Packet number per frame */
222 uint32_t pkt_per_frm;
223 /** Next frame num for which will be setup DMA Desc */
225 /** Number of packets per buffer processing */
227 /** Info for all isoc packets */
228 iso_pkt_info_t *pkt_info;
229 /** current pkt number */
231 /** current pkt number */
232 uint8_t *cur_pkt_addr;
233 /** current pkt number */
234 uint32_t cur_pkt_dma_addr;
235 #endif /* DWC_EN_ISOC */
241 * Reasons for halting a host channel.
243 typedef enum dwc_otg_halt_status {
244 DWC_OTG_HC_XFER_NO_HALT_STATUS,
245 DWC_OTG_HC_XFER_COMPLETE,
246 DWC_OTG_HC_XFER_URB_COMPLETE,
249 DWC_OTG_HC_XFER_NYET,
250 DWC_OTG_HC_XFER_STALL,
251 DWC_OTG_HC_XFER_XACT_ERR,
252 DWC_OTG_HC_XFER_FRAME_OVERRUN,
253 DWC_OTG_HC_XFER_BABBLE_ERR,
254 DWC_OTG_HC_XFER_DATA_TOGGLE_ERR,
255 DWC_OTG_HC_XFER_AHB_ERR,
256 DWC_OTG_HC_XFER_PERIODIC_INCOMPLETE,
257 DWC_OTG_HC_XFER_URB_DEQUEUE
258 } dwc_otg_halt_status_e;
261 * Host channel descriptor. This structure represents the state of a single
262 * host channel when acting in host mode. It contains the data items needed to
263 * transfer packets to an endpoint via a host channel.
265 typedef struct dwc_hc {
266 /** Host channel number used for register address lookup */
269 /** Device to access */
275 /** EP direction. 0: OUT, 1: IN */
280 * One of the following values:
281 * - DWC_OTG_EP_SPEED_LOW
282 * - DWC_OTG_EP_SPEED_FULL
283 * - DWC_OTG_EP_SPEED_HIGH
286 #define DWC_OTG_EP_SPEED_LOW 0
287 #define DWC_OTG_EP_SPEED_FULL 1
288 #define DWC_OTG_EP_SPEED_HIGH 2
292 * One of the following values:
293 * - DWC_OTG_EP_TYPE_CONTROL: 0
294 * - DWC_OTG_EP_TYPE_ISOC: 1
295 * - DWC_OTG_EP_TYPE_BULK: 2
296 * - DWC_OTG_EP_TYPE_INTR: 3
300 /** Max packet size in bytes */
301 unsigned max_packet:11;
304 * PID for initial transaction.
308 * 3: MDATA (non-Control EP),
311 unsigned data_pid_start:2;
312 #define DWC_OTG_HC_PID_DATA0 0
313 #define DWC_OTG_HC_PID_DATA2 1
314 #define DWC_OTG_HC_PID_DATA1 2
315 #define DWC_OTG_HC_PID_MDATA 3
316 #define DWC_OTG_HC_PID_SETUP 3
318 /** Number of periodic transactions per (micro)frame */
319 unsigned multi_count:2;
321 /** @name Transfer State */
324 /** Pointer to the current transfer buffer position. */
327 * In Buffer DMA mode this buffer will be used
328 * if xfer_buff is not DWORD aligned.
330 dwc_dma_t align_buff;
331 /** Total number of bytes to transfer. */
333 /** Number of bytes transferred so far. */
335 /** Packet count at start of transfer.*/
336 uint16_t start_pkt_count;
339 * Flag to indicate whether the transfer has been started. Set to 1 if
340 * it has been started, 0 otherwise.
342 uint8_t xfer_started;
345 * Set to 1 to indicate that a PING request should be issued on this
346 * channel. If 0, process normally.
351 * Set to 1 to indicate that the error count for this transaction is
352 * non-zero. Set to 0 if the error count is 0.
357 * Set to 1 to indicate that this channel should be halted the next
358 * time a request is queued for the channel. This is necessary in
359 * slave mode if no request queue space is available when an attempt
360 * is made to halt the channel.
362 uint8_t halt_on_queue;
365 * Set to 1 if the host channel has been halted, but the core is not
366 * finished flushing queued requests. Otherwise 0.
368 uint8_t halt_pending;
371 * Reason for halting the host channel.
373 dwc_otg_halt_status_e halt_status;
376 * Split settings for the host channel
378 uint8_t do_split; /**< Enable split for the channel */
379 uint8_t complete_split; /**< Enable complete split */
380 uint8_t hub_addr; /**< Address of high speed hub */
382 uint8_t port_addr; /**< Port of the low/full speed device */
383 /** Split transaction position
384 * One of the following values:
385 * - DWC_HCSPLIT_XACTPOS_MID
386 * - DWC_HCSPLIT_XACTPOS_BEGIN
387 * - DWC_HCSPLIT_XACTPOS_END
388 * - DWC_HCSPLIT_XACTPOS_ALL */
391 /** Set when the host channel does a short read. */
395 * Number of requests issued for this channel since it was assigned to
396 * the current transfer (not counting PINGs).
401 * Queue Head for the transfer being processed by this channel.
403 struct dwc_otg_qh *qh;
407 /** Entry in list of host channels. */
408 DWC_CIRCLEQ_ENTRY(dwc_hc) hc_list_entry;
410 /** @name Descriptor DMA support */
413 /** Number of Transfer Descriptors */
416 /** Descriptor List DMA address */
417 dwc_dma_t desc_list_addr;
419 /** Scheduling micro-frame bitmap. */
426 * The following parameters may be specified when starting the module. These
427 * parameters define how the DWC_otg controller should be configured.
429 typedef struct dwc_otg_core_params {
433 * Specifies the OTG capabilities. The driver will automatically
434 * detect the value for this parameter if none is specified.
435 * 0 - HNP and SRP capable (default)
436 * 1 - SRP Only capable
437 * 2 - No HNP/SRP capable
442 * Specifies whether to use slave or DMA mode for accessing the data
443 * FIFOs. The driver will automatically detect the value for this
444 * parameter if none is specified.
446 * 1 - DMA (default, if available)
451 * When DMA mode is enabled specifies whether to use address DMA or DMA
452 * Descriptor mode for accessing the data FIFOs in device mode. The driver
453 * will automatically detect the value for this if none is specified.
455 * 1 - DMA Descriptor(default, if available)
457 int32_t dma_desc_enable;
458 /** The DMA Burst size (applicable only for External DMA
459 * Mode). 1, 4, 8 16, 32, 64, 128, 256 (default 32)
461 int32_t dma_burst_size; /* Translate this to GAHBCFG values */
464 * Specifies the maximum speed of operation in host and device mode.
465 * The actual speed depends on the speed of the attached device and
466 * the value of phy_type. The actual speed depends on the speed of the
468 * 0 - High Speed (default)
472 /** Specifies whether low power mode is supported when attached
473 * to a Full Speed or Low Speed device in host mode.
474 * 0 - Don't support low power mode (default)
475 * 1 - Support low power mode
477 int32_t host_support_fs_ls_low_power;
479 /** Specifies the PHY clock rate in low power mode when connected to a
480 * Low Speed device in host mode. This parameter is applicable only if
481 * HOST_SUPPORT_FS_LS_LOW_POWER is enabled. If PHY_TYPE is set to FS
482 * then defaults to 6 MHZ otherwise 48 MHZ.
487 int32_t host_ls_low_power_phy_clk;
490 * 0 - Use cC FIFO size parameters
491 * 1 - Allow dynamic FIFO sizing (default)
493 int32_t enable_dynamic_fifo;
495 /** Total number of 4-byte words in the data FIFO memory. This
496 * memory includes the Rx FIFO, non-periodic Tx FIFO, and periodic
498 * 32 to 32768 (default 8192)
499 * Note: The total FIFO memory depth in the FPGA configuration is 8192.
501 int32_t data_fifo_size;
503 /** Number of 4-byte words in the Rx FIFO in device mode when dynamic
504 * FIFO sizing is enabled.
505 * 16 to 32768 (default 1064)
507 int32_t dev_rx_fifo_size;
509 /** Number of 4-byte words in the non-periodic Tx FIFO in device mode
510 * when dynamic FIFO sizing is enabled.
511 * 16 to 32768 (default 1024)
513 int32_t dev_nperio_tx_fifo_size;
515 /** Number of 4-byte words in each of the periodic Tx FIFOs in device
516 * mode when dynamic FIFO sizing is enabled.
517 * 4 to 768 (default 256)
519 uint32_t dev_perio_tx_fifo_size[MAX_PERIO_FIFOS];
521 /** Number of 4-byte words in the Rx FIFO in host mode when dynamic
522 * FIFO sizing is enabled.
523 * 16 to 32768 (default 1024)
525 int32_t host_rx_fifo_size;
527 /** Number of 4-byte words in the non-periodic Tx FIFO in host mode
528 * when Dynamic FIFO sizing is enabled in the core.
529 * 16 to 32768 (default 1024)
531 int32_t host_nperio_tx_fifo_size;
533 /** Number of 4-byte words in the host periodic Tx FIFO when dynamic
534 * FIFO sizing is enabled.
535 * 16 to 32768 (default 1024)
537 int32_t host_perio_tx_fifo_size;
539 /** The maximum transfer size supported in bytes.
540 * 2047 to 65,535 (default 65,535)
542 int32_t max_transfer_size;
544 /** The maximum number of packets in a transfer.
545 * 15 to 511 (default 511)
547 int32_t max_packet_count;
549 /** The number of host channel registers to use.
550 * 1 to 16 (default 12)
551 * Note: The FPGA configuration supports a maximum of 12 host channels.
553 int32_t host_channels;
555 /** The number of endpoints in addition to EP0 available for device
557 * 1 to 15 (default 6 IN and OUT)
558 * Note: The FPGA configuration supports a maximum of 6 IN and OUT
559 * endpoints in addition to EP0.
561 int32_t dev_endpoints;
564 * Specifies the type of PHY interface to use. By default, the driver
565 * will automatically detect the phy_type.
568 * 1 - UTMI+ (default)
574 * Specifies the UTMI+ Data Width. This parameter is
575 * applicable for a PHY_TYPE of UTMI+ or ULPI. (For a ULPI
576 * PHY_TYPE, this parameter indicates the data width between
577 * the MAC and the ULPI Wrapper.) Also, this parameter is
578 * applicable only if the OTG_HSPHY_WIDTH cC parameter was set
579 * to "8 and 16 bits", meaning that the core has been
580 * configured to work at either data path width.
582 * 8 or 16 bits (default 16)
584 int32_t phy_utmi_width;
587 * Specifies whether the ULPI operates at double or single
588 * data rate. This parameter is only applicable if PHY_TYPE is
591 * 0 - single data rate ULPI interface with 8 bit wide data
593 * 1 - double data rate ULPI interface with 4 bit wide data
596 int32_t phy_ulpi_ddr;
599 * Specifies whether to use the internal or external supply to
600 * drive the vbus with a ULPI phy.
602 int32_t phy_ulpi_ext_vbus;
605 * Specifies whether to use the I2Cinterface for full speed PHY. This
606 * parameter is only applicable if PHY_TYPE is FS.
617 * Specifies whether dedicated transmit FIFOs are
618 * enabled for non periodic IN endpoints in device mode
622 int32_t en_multiple_tx_fifo;
624 /** Number of 4-byte words in each of the Tx FIFOs in device
625 * mode when dynamic FIFO sizing is enabled.
626 * 4 to 768 (default 256)
628 uint32_t dev_tx_fifo_size[MAX_TX_FIFOS];
630 /** Thresholding enable flag-
631 * bit 0 - enable non-ISO Tx thresholding
632 * bit 1 - enable ISO Tx thresholding
633 * bit 2 - enable Rx thresholding
637 /** Thresholding length for Tx
638 * FIFOs in 32 bit DWORDs
640 uint32_t tx_thr_length;
642 /** Thresholding length for Rx
643 * FIFOs in 32 bit DWORDs
645 uint32_t rx_thr_length;
648 * Specifies whether LPM (Link Power Management) support is enabled
652 /** Per Transfer Interrupt
659 /** Multi Processor Interrupt
666 /** IS_USB Capability
672 /** AHB Threshold Ratio
673 * 2'b00 AHB Threshold = MAC Threshold
674 * 2'b01 AHB Threshold = 1/2 MAC Threshold
675 * 2'b10 AHB Threshold = 1/4 MAC Threshold
676 * 2'b11 AHB Threshold = 1/8 MAC Threshold
678 int32_t ahb_thr_ratio;
684 int32_t adp_supp_enable;
686 /** HFIR Reload Control
687 * 0 - The HFIR cannot be reloaded dynamically.
688 * 1 - Allow dynamic reloading of the HFIR register during runtime.
692 /** DCFG: Enable device Out NAK
693 * 0 - The core does not set NAK after Bulk Out transfer complete.
694 * 1 - The core sets NAK after Bulk OUT transfer complete.
698 /** DCFG: Enable Continue on BNA
699 * After receiving BNA interrupt the core disables the endpoint,when the
700 * endpoint is re-enabled by the application the core starts processing
701 * 0 - from the DOEPDMA descriptor
702 * 1 - from the descriptor which received the BNA.
706 /** GAHBCFG: AHB Single Support
707 * This bit when programmed supports SINGLE transfers for remainder
708 * data in a transfer for DMA mode of operation.
709 * 0 - in this case the remainder data will be sent using INCR burst size.
710 * 1 - in this case the remainder data will be sent using SINGLE burst size.
714 /** Core Power down mode
715 * 0 - No Power Down is enabled
717 * 2 - Complete Power Down (Hibernation)
721 /** OTG revision supported
722 * 0 - OTG 1.3 revision
723 * 1 - OTG 2.0 revision
727 } dwc_otg_core_params_t;
730 struct dwc_otg_core_if;
731 typedef struct hc_xfer_info {
732 struct dwc_otg_core_if *core_if;
737 typedef struct ep_xfer_info {
738 struct dwc_otg_core_if *core_if;
745 typedef enum dwc_otg_lx_state {
748 /** LPM sleep state*/
750 /** USB suspend state*/
754 } dwc_otg_lx_state_e;
756 struct dwc_otg_global_regs_backup {
757 uint32_t gotgctl_local;
758 uint32_t gintmsk_local;
759 uint32_t gahbcfg_local;
760 uint32_t gusbcfg_local;
761 uint32_t grxfsiz_local;
762 uint32_t gnptxfsiz_local;
763 #ifdef CONFIG_USB_DWC_OTG_LPM
764 uint32_t glpmcfg_local;
766 uint32_t gi2cctl_local;
767 uint32_t hptxfsiz_local;
768 uint32_t pcgcctl_local;
769 uint32_t gdfifocfg_local;
770 uint32_t dtxfsiz_local[MAX_EPS_CHANNELS];
771 uint32_t gpwrdn_local;
772 uint32_t xhib_pcgcctl;
773 uint32_t xhib_gpwrdn;
776 struct dwc_otg_host_regs_backup {
778 uint32_t haintmsk_local;
779 uint32_t hcintmsk_local[MAX_EPS_CHANNELS];
780 uint32_t hprt0_local;
784 struct dwc_otg_dev_regs_backup {
790 uint32_t diepctl[MAX_EPS_CHANNELS];
791 uint32_t dieptsiz[MAX_EPS_CHANNELS];
792 uint32_t diepdma[MAX_EPS_CHANNELS];
795 * The <code>dwc_otg_core_if</code> structure contains information needed to manage
796 * the DWC_otg controller acting in either host or device mode. It
797 * represents the programming view of the controller as a whole.
799 struct dwc_otg_core_if {
800 /** Parameters that define how the core should be configured.*/
801 dwc_otg_core_params_t *core_params;
803 /** Core Global registers starting at offset 000h. */
804 dwc_otg_core_global_regs_t *core_global_regs;
806 /** Device-specific information */
807 dwc_otg_dev_if_t *dev_if;
808 /** Host-specific information */
809 dwc_otg_host_if_t *host_if;
811 /** Value from SNPSID register */
815 * Set to 1 if the core PHY interface bits in USBCFG have been
818 uint8_t phy_init_done;
821 * SRP Success flag, set by srp success interrupt in FS I2C mode
824 uint8_t srp_timer_started;
825 /** Timer for SRP. If it expires before SRP is successful
827 dwc_timer_t *srp_timer;
829 #ifdef DWC_DEV_SRPCAP
830 /* This timer is needed to power on the hibernated host core if SRP is not
831 * initiated on connected SRP capable device for limited period of time
833 uint8_t pwron_timer_started;
834 dwc_timer_t *pwron_timer;
836 /* Common configuration information */
837 /** Power and Clock Gating Control Register */
838 volatile uint32_t *pcgcctl;
839 #define DWC_OTG_PCGCCTL_OFFSET 0xE00
841 /** Push/pop addresses for endpoints or host channels.*/
842 uint32_t *data_fifo[MAX_EPS_CHANNELS];
843 #define DWC_OTG_DATA_FIFO_OFFSET 0x1000
844 #define DWC_OTG_DATA_FIFO_SIZE 0x1000
846 /** Total RAM for FIFOs (Bytes) */
847 uint16_t total_fifo_size;
848 /** Size of Rx FIFO (Bytes) */
849 uint16_t rx_fifo_size;
850 /** Size of Non-periodic Tx FIFO (Bytes) */
851 uint16_t nperio_tx_fifo_size;
853 /** 1 if DMA is enabled, 0 otherwise. */
856 /** 1 if DMA descriptor is enabled, 0 otherwise. */
857 uint8_t dma_desc_enable;
859 /** 1 if PTI Enhancement mode is enabled, 0 otherwise. */
860 uint8_t pti_enh_enable;
862 /** 1 if MPI Enhancement mode is enabled, 0 otherwise. */
863 uint8_t multiproc_int_enable;
865 /** 1 if dedicated Tx FIFOs are enabled, 0 otherwise. */
866 uint8_t en_multiple_tx_fifo;
868 /** Set to 1 if multiple packets of a high-bandwidth transfer is in
869 * process of being queued */
870 uint8_t queuing_high_bandwidth;
872 /** Hardware Configuration -- stored here for convenience.*/
873 hwcfg1_data_t hwcfg1;
874 hwcfg2_data_t hwcfg2;
875 hwcfg3_data_t hwcfg3;
876 hwcfg4_data_t hwcfg4;
877 fifosize_data_t hptxfsiz;
879 /** Host and Device Configuration -- stored here for convenience.*/
883 /** The operational State, during transations
884 * (a_host>>a_peripherial and b_device=>b_host) this may not
885 * match the core but allows the software to determine
891 * Set to 1 if the HCD needs to be restarted on a session request
892 * interrupt. This is required if no connector ID status change has
893 * occurred since the HCD was last disconnected.
895 uint8_t restart_hcd_on_session_req;
898 /** A-Device is a_host */
900 /** A-Device is a_suspend */
901 #define A_SUSPEND (2)
902 /** A-Device is a_peripherial */
903 #define A_PERIPHERAL (3)
904 /** B-Device is operating as a Peripheral. */
905 #define B_PERIPHERAL (4)
906 /** B-Device is operating as a Host. */
910 struct dwc_otg_cil_callbacks *hcd_cb;
912 struct dwc_otg_cil_callbacks *pcd_cb;
914 /** Device mode Periodic Tx FIFO Mask */
916 /** Device mode Periodic Tx FIFO Mask */
919 /** Workqueue object used for handling several interrupts */
922 /** Timer object used for handling "Wakeup Detected" Interrupt */
923 dwc_timer_t *wkp_timer;
924 /** This arrays used for debug purposes for DEV OUT NAK enhancement */
925 uint32_t start_doeptsiz_val[MAX_EPS_CHANNELS];
926 ep_xfer_info_t ep_xfer_info[MAX_EPS_CHANNELS];
927 dwc_timer_t *ep_xfer_timer[MAX_EPS_CHANNELS];
929 uint32_t start_hcchar_val[MAX_EPS_CHANNELS];
931 hc_xfer_info_t hc_xfer_info[MAX_EPS_CHANNELS];
932 dwc_timer_t *hc_xfer_timer[MAX_EPS_CHANNELS];
934 uint32_t hfnum_7_samples;
935 uint64_t hfnum_7_frrem_accum;
936 uint32_t hfnum_0_samples;
937 uint64_t hfnum_0_frrem_accum;
938 uint32_t hfnum_other_samples;
939 uint64_t hfnum_other_frrem_accum;
943 uint16_t pwron_rxfsiz;
944 uint16_t pwron_gnptxfsiz;
945 uint16_t pwron_txfsiz[15];
947 uint16_t init_rxfsiz;
948 uint16_t init_gnptxfsiz;
949 uint16_t init_txfsiz[15];
952 /** Lx state of device */
953 dwc_otg_lx_state_e lx_state;
955 /** Saved Core Global registers */
956 struct dwc_otg_global_regs_backup *gr_backup;
957 /** Saved Host registers */
958 struct dwc_otg_host_regs_backup *hr_backup;
959 /** Saved Device registers */
960 struct dwc_otg_dev_regs_backup *dr_backup;
962 /** Power Down Enable */
965 /** ADP support Enable */
968 /** ADP structure object */
971 /** hibernation/suspend flag */
972 int hibernation_suspend;
974 /** Device mode extended hibernation flag */
977 /** OTG revision supported */
980 /** OTG status flag used for HNP polling */
983 /** Pointer to either hcd->lock or pcd->lock */
984 dwc_spinlock_t *lock;
986 /** Start predict NextEP based on Learning Queue if equal 1,
987 * also used as counter of disabled NP IN EP's */
988 uint8_t start_predict;
990 /** NextEp sequence, including EP0: nextep_seq[] = EP if non-periodic and
991 * active, 0xff otherwise */
992 uint8_t nextep_seq[MAX_EPS_CHANNELS];
994 /** Index of fisrt EP in nextep_seq array which should be re-enabled **/
995 uint8_t first_in_nextep_seq;
997 /** Frame number while entering to ISR - needed for ISOCs **/
1002 /** DWC_otg request structure.
1003 * This structure is a list of requests.
1006 typedef struct dwc_otg_pcd_request {
1010 uint32_t num_mapped_sgs;
1011 struct scatterlist *sg;
1015 unsigned short_packet:1;
1016 unsigned sent_zlp:1;
1017 unsigned mapped;//for DMA transfer lee
1019 * Used instead of original buffer if
1020 * it(physical address) is not dword-aligned.
1022 uint8_t *dw_align_buf;
1023 dwc_dma_t dw_align_buf_dma;
1025 DWC_CIRCLEQ_ENTRY(dwc_otg_pcd_request) queue_entry;
1026 #ifdef DWC_UTE_PER_IO
1027 struct dwc_iso_xreq_port ext_req;
1028 //void *priv_ereq_nport; /* */
1030 } dwc_otg_pcd_request_t;
1032 DWC_CIRCLEQ_HEAD(req_list, dwc_otg_pcd_request);
1037 * This function is called when transfer is timed out.
1039 extern void hc_xfer_timeout(void *ptr);
1043 * This function is called when transfer is timed out on endpoint.
1045 extern void ep_xfer_timeout(void *ptr);
1048 * The following functions are functions for works
1049 * using during handling some interrupts
1051 extern void w_conn_id_status_change(void *p);
1053 extern void w_wakeup_detected(void *p);
1055 /** Saves global register values into system memory. */
1056 extern int dwc_otg_save_global_regs(dwc_otg_core_if_t * core_if);
1057 /** Saves device register values into system memory. */
1058 extern int dwc_otg_save_dev_regs(dwc_otg_core_if_t * core_if);
1059 /** Saves host register values into system memory. */
1060 extern int dwc_otg_save_host_regs(dwc_otg_core_if_t * core_if);
1061 /** Restore global register values. */
1062 extern int dwc_otg_restore_global_regs(dwc_otg_core_if_t * core_if);
1063 /** Restore host register values. */
1064 extern int dwc_otg_restore_host_regs(dwc_otg_core_if_t * core_if, int reset);
1065 /** Restore device register values. */
1066 extern int dwc_otg_restore_dev_regs(dwc_otg_core_if_t * core_if,
1068 extern int restore_lpm_i2c_regs(dwc_otg_core_if_t * core_if);
1069 extern int restore_essential_regs(dwc_otg_core_if_t * core_if, int rmode,
1072 extern int dwc_otg_host_hibernation_restore(dwc_otg_core_if_t * core_if,
1073 int restore_mode, int reset);
1074 extern int dwc_otg_device_hibernation_restore(dwc_otg_core_if_t * core_if,
1075 int rem_wakeup, int reset);
1078 * The following functions support initialization of the CIL driver component
1079 * and the DWC_otg controller.
1081 extern void dwc_otg_core_host_init(dwc_otg_core_if_t * _core_if);
1082 extern void dwc_otg_core_dev_init(dwc_otg_core_if_t * _core_if);
1084 /** @name Device CIL Functions
1085 * The following functions support managing the DWC_otg controller in device
1089 extern void dwc_otg_wakeup(dwc_otg_core_if_t * _core_if);
1090 extern void dwc_otg_read_setup_packet(dwc_otg_core_if_t * _core_if,
1092 extern uint32_t dwc_otg_get_frame_number(dwc_otg_core_if_t * _core_if);
1093 extern void dwc_otg_ep0_activate(dwc_otg_core_if_t * _core_if, dwc_ep_t * _ep);
1094 extern void dwc_otg_ep_activate(dwc_otg_core_if_t * _core_if, dwc_ep_t * _ep);
1095 extern void dwc_otg_ep_deactivate(dwc_otg_core_if_t * _core_if, dwc_ep_t * _ep);
1096 extern void dwc_otg_ep_start_transfer(dwc_otg_core_if_t * core_if, dwc_ep_t * ep,
1097 dwc_otg_pcd_request_t *req);
1098 extern void dwc_otg_ep_start_zl_transfer(dwc_otg_core_if_t * _core_if,
1100 extern void dwc_otg_ep0_start_transfer(dwc_otg_core_if_t * _core_if,
1102 extern void dwc_otg_ep0_continue_transfer(dwc_otg_core_if_t * _core_if,
1104 extern void dwc_otg_ep_write_packet(dwc_otg_core_if_t * _core_if,
1105 dwc_ep_t * _ep, int _dma);
1106 extern void dwc_otg_ep_set_stall(dwc_otg_core_if_t * _core_if, dwc_ep_t * _ep);
1107 extern void dwc_otg_ep_clear_stall(dwc_otg_core_if_t * _core_if,
1109 extern void dwc_otg_enable_device_interrupts(dwc_otg_core_if_t * _core_if);
1112 extern void dwc_otg_iso_ep_start_frm_transfer(dwc_otg_core_if_t * core_if,
1114 extern void dwc_otg_iso_ep_start_buf_transfer(dwc_otg_core_if_t * core_if,
1116 #endif /* DWC_EN_ISOC */
1119 /** @name Host CIL Functions
1120 * The following functions support managing the DWC_otg controller in host
1124 extern void dwc_otg_hc_init(dwc_otg_core_if_t * _core_if, dwc_hc_t * _hc);
1125 extern void dwc_otg_hc_halt(dwc_otg_core_if_t * _core_if,
1126 dwc_hc_t * _hc, dwc_otg_halt_status_e _halt_status);
1127 extern void dwc_otg_hc_cleanup(dwc_otg_core_if_t * _core_if, dwc_hc_t * _hc);
1128 extern void dwc_otg_hc_start_transfer(dwc_otg_core_if_t * _core_if,
1130 extern int dwc_otg_hc_continue_transfer(dwc_otg_core_if_t * _core_if,
1132 extern void dwc_otg_hc_do_ping(dwc_otg_core_if_t * _core_if, dwc_hc_t * _hc);
1133 extern void dwc_otg_hc_write_packet(dwc_otg_core_if_t * _core_if,
1135 extern void dwc_otg_enable_host_interrupts(dwc_otg_core_if_t * _core_if);
1136 extern void dwc_otg_disable_host_interrupts(dwc_otg_core_if_t * _core_if);
1138 extern void dwc_otg_hc_start_transfer_ddma(dwc_otg_core_if_t * core_if,
1141 extern uint32_t calc_frame_interval(dwc_otg_core_if_t * core_if);
1143 /* Macro used to clear one channel interrupt */
1144 #define clear_hc_int(_hc_regs_, _intr_) \
1146 hcint_data_t hcint_clear = {.d32 = 0}; \
1147 hcint_clear.b._intr_ = 1; \
1148 DWC_WRITE_REG32(&(_hc_regs_)->hcint, hcint_clear.d32); \
1152 * Macro used to disable one channel interrupt. Channel interrupts are
1153 * disabled when the channel is halted or released by the interrupt handler.
1154 * There is no need to handle further interrupts of that type until the
1155 * channel is re-assigned. In fact, subsequent handling may cause crashes
1156 * because the channel structures are cleaned up when the channel is released.
1158 #define disable_hc_int(_hc_regs_, _intr_) \
1160 hcintmsk_data_t hcintmsk = {.d32 = 0}; \
1161 hcintmsk.b._intr_ = 1; \
1162 DWC_MODIFY_REG32(&(_hc_regs_)->hcintmsk, hcintmsk.d32, 0); \
1166 * This function Reads HPRT0 in preparation to modify. It keeps the
1167 * WC bits 0 so that if they are read as 1, they won't clear when you
1170 static inline uint32_t dwc_otg_read_hprt0(dwc_otg_core_if_t * _core_if)
1173 hprt0.d32 = DWC_READ_REG32(_core_if->host_if->hprt0);
1175 hprt0.b.prtconndet = 0;
1176 hprt0.b.prtenchng = 0;
1177 hprt0.b.prtovrcurrchng = 0;
1183 /** @name Common CIL Functions
1184 * The following functions support managing the DWC_otg controller in either
1185 * device or host mode.
1189 extern void dwc_otg_read_packet(dwc_otg_core_if_t * core_if,
1190 uint8_t * dest, uint16_t bytes);
1192 extern void dwc_otg_flush_tx_fifo(dwc_otg_core_if_t * _core_if, const int _num);
1193 extern void dwc_otg_flush_rx_fifo(dwc_otg_core_if_t * _core_if);
1194 extern void dwc_otg_core_reset(dwc_otg_core_if_t * _core_if);
1197 * This function returns the Core Interrupt register.
1199 static inline uint32_t dwc_otg_read_core_intr(dwc_otg_core_if_t * core_if)
1201 return (DWC_READ_REG32(&core_if->core_global_regs->gintsts) &
1202 DWC_READ_REG32(&core_if->core_global_regs->gintmsk));
1206 * This function returns the OTG Interrupt register.
1208 static inline uint32_t dwc_otg_read_otg_intr(dwc_otg_core_if_t * core_if)
1210 return (DWC_READ_REG32(&core_if->core_global_regs->gotgint));
1214 * This function reads the Device All Endpoints Interrupt register and
1215 * returns the IN endpoint interrupt bits.
1217 static inline uint32_t dwc_otg_read_dev_all_in_ep_intr(dwc_otg_core_if_t *
1223 if (core_if->multiproc_int_enable) {
1224 v = DWC_READ_REG32(&core_if->dev_if->
1225 dev_global_regs->deachint) &
1226 DWC_READ_REG32(&core_if->
1227 dev_if->dev_global_regs->deachintmsk);
1229 v = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daint) &
1230 DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daintmsk);
1232 return (v & 0xffff);
1236 * This function reads the Device All Endpoints Interrupt register and
1237 * returns the OUT endpoint interrupt bits.
1239 static inline uint32_t dwc_otg_read_dev_all_out_ep_intr(dwc_otg_core_if_t *
1244 if (core_if->multiproc_int_enable) {
1245 v = DWC_READ_REG32(&core_if->dev_if->
1246 dev_global_regs->deachint) &
1247 DWC_READ_REG32(&core_if->
1248 dev_if->dev_global_regs->deachintmsk);
1250 v = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daint) &
1251 DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daintmsk);
1254 return ((v & 0xffff0000) >> 16);
1258 * This function returns the Device IN EP Interrupt register
1260 static inline uint32_t dwc_otg_read_dev_in_ep_intr(dwc_otg_core_if_t * core_if,
1263 dwc_otg_dev_if_t *dev_if = core_if->dev_if;
1264 uint32_t v, msk, emp;
1266 if (core_if->multiproc_int_enable) {
1268 DWC_READ_REG32(&dev_if->
1269 dev_global_regs->diepeachintmsk[ep->num]);
1271 DWC_READ_REG32(&dev_if->
1272 dev_global_regs->dtknqr4_fifoemptymsk);
1273 msk |= ((emp >> ep->num) & 0x1) << 7;
1274 v = DWC_READ_REG32(&dev_if->in_ep_regs[ep->num]->diepint) & msk;
1276 msk = DWC_READ_REG32(&dev_if->dev_global_regs->diepmsk);
1278 DWC_READ_REG32(&dev_if->
1279 dev_global_regs->dtknqr4_fifoemptymsk);
1280 msk |= ((emp >> ep->num) & 0x1) << 7;
1281 v = DWC_READ_REG32(&dev_if->in_ep_regs[ep->num]->diepint) & msk;
1288 * This function returns the Device OUT EP Interrupt register
1290 static inline uint32_t dwc_otg_read_dev_out_ep_intr(dwc_otg_core_if_t *
1291 _core_if, dwc_ep_t * _ep)
1293 dwc_otg_dev_if_t *dev_if = _core_if->dev_if;
1295 doepmsk_data_t msk = {.d32 = 0 };
1297 if (_core_if->multiproc_int_enable) {
1299 DWC_READ_REG32(&dev_if->
1300 dev_global_regs->doepeachintmsk[_ep->num]);
1301 if (_core_if->pti_enh_enable) {
1302 msk.b.pktdrpsts = 1;
1304 v = DWC_READ_REG32(&dev_if->
1305 out_ep_regs[_ep->num]->doepint) & msk.d32;
1307 msk.d32 = DWC_READ_REG32(&dev_if->dev_global_regs->doepmsk);
1308 if (_core_if->pti_enh_enable) {
1309 msk.b.pktdrpsts = 1;
1311 v = DWC_READ_REG32(&dev_if->
1312 out_ep_regs[_ep->num]->doepint) & msk.d32;
1318 * This function returns the Host All Channel Interrupt register
1320 static inline uint32_t dwc_otg_read_host_all_channels_intr(dwc_otg_core_if_t *
1323 return (DWC_READ_REG32(&_core_if->host_if->host_global_regs->haint));
1326 static inline uint32_t dwc_otg_read_host_channel_intr(dwc_otg_core_if_t *
1327 _core_if, dwc_hc_t * _hc)
1329 return (DWC_READ_REG32
1330 (&_core_if->host_if->hc_regs[_hc->hc_num]->hcint));
1334 * This function returns the mode of the operation, host or device.
1336 * @return 0 - Device Mode, 1 - Host Mode
1338 static inline uint32_t dwc_otg_mode(dwc_otg_core_if_t * _core_if)
1340 return (DWC_READ_REG32(&_core_if->core_global_regs->gintsts) & 0x1);
1346 * DWC_otg CIL callback structure. This structure allows the HCD and
1347 * PCD to register functions used for starting and stopping the PCD
1348 * and HCD for role change on for a DRD.
1350 typedef struct dwc_otg_cil_callbacks {
1351 /** Start function for role change */
1352 int (*start) (void *_p);
1353 /** Stop Function for role change */
1354 int (*stop) (void *_p);
1355 /** Disconnect Function for role change */
1356 int (*disconnect) (void *_p);
1357 /** Resume/Remote wakeup Function */
1358 int (*resume_wakeup) (void *_p);
1359 /** Suspend function */
1360 int (*suspend) (void *_p);
1361 /** Session Start (SRP) */
1362 int (*session_start) (void *_p);
1363 #ifdef CONFIG_USB_DWC_OTG_LPM
1364 /** Sleep (switch to L0 state) */
1365 int (*sleep) (void *_p);
1367 /** Pointer passed to start() and stop() */
1369 } dwc_otg_cil_callbacks_t;
1371 extern void dwc_otg_cil_register_pcd_callbacks(dwc_otg_core_if_t * _core_if,
1372 dwc_otg_cil_callbacks_t * _cb,
1374 extern void dwc_otg_cil_register_hcd_callbacks(dwc_otg_core_if_t * _core_if,
1375 dwc_otg_cil_callbacks_t * _cb,
1378 void dwc_otg_initiate_srp(dwc_otg_core_if_t * core_if);
1380 //////////////////////////////////////////////////////////////////////
1381 /** Start the HCD. Helper function for using the HCD callbacks.
1383 * @param core_if Programming view of DWC_otg controller.
1385 static inline void cil_hcd_start(dwc_otg_core_if_t * core_if)
1387 if (core_if->hcd_cb && core_if->hcd_cb->start) {
1388 core_if->hcd_cb->start(core_if->hcd_cb->p);
1392 /** Stop the HCD. Helper function for using the HCD callbacks.
1394 * @param core_if Programming view of DWC_otg controller.
1396 static inline void cil_hcd_stop(dwc_otg_core_if_t * core_if)
1398 if (core_if->hcd_cb && core_if->hcd_cb->stop) {
1399 core_if->hcd_cb->stop(core_if->hcd_cb->p);
1403 /** Disconnect the HCD. Helper function for using the HCD callbacks.
1405 * @param core_if Programming view of DWC_otg controller.
1407 static inline void cil_hcd_disconnect(dwc_otg_core_if_t * core_if)
1409 if (core_if->hcd_cb && core_if->hcd_cb->disconnect) {
1410 core_if->hcd_cb->disconnect(core_if->hcd_cb->p);
1414 /** Inform the HCD the a New Session has begun. Helper function for
1415 * using the HCD callbacks.
1417 * @param core_if Programming view of DWC_otg controller.
1419 static inline void cil_hcd_session_start(dwc_otg_core_if_t * core_if)
1421 if (core_if->hcd_cb && core_if->hcd_cb->session_start) {
1422 core_if->hcd_cb->session_start(core_if->hcd_cb->p);
1426 #ifdef CONFIG_USB_DWC_OTG_LPM
1428 * Inform the HCD about LPM sleep.
1429 * Helper function for using the HCD callbacks.
1431 * @param core_if Programming view of DWC_otg controller.
1433 static inline void cil_hcd_sleep(dwc_otg_core_if_t * core_if)
1435 if (core_if->hcd_cb && core_if->hcd_cb->sleep) {
1436 core_if->hcd_cb->sleep(core_if->hcd_cb->p);
1441 /** Resume the HCD. Helper function for using the HCD callbacks.
1443 * @param core_if Programming view of DWC_otg controller.
1445 static inline void cil_hcd_resume(dwc_otg_core_if_t * core_if)
1447 if (core_if->hcd_cb && core_if->hcd_cb->resume_wakeup) {
1448 core_if->hcd_cb->resume_wakeup(core_if->hcd_cb->p);
1452 /** Start the PCD. Helper function for using the PCD callbacks.
1454 * @param core_if Programming view of DWC_otg controller.
1456 static inline void cil_pcd_start(dwc_otg_core_if_t * core_if)
1458 if (core_if->pcd_cb && core_if->pcd_cb->start) {
1459 core_if->pcd_cb->start(core_if->pcd_cb->p);
1463 /** Stop the PCD. Helper function for using the PCD callbacks.
1465 * @param core_if Programming view of DWC_otg controller.
1467 static inline void cil_pcd_stop(dwc_otg_core_if_t * core_if)
1469 if (core_if->pcd_cb && core_if->pcd_cb->stop) {
1470 core_if->pcd_cb->stop(core_if->pcd_cb->p);
1474 /** Suspend the PCD. Helper function for using the PCD callbacks.
1476 * @param core_if Programming view of DWC_otg controller.
1478 static inline void cil_pcd_suspend(dwc_otg_core_if_t * core_if)
1480 if (core_if->pcd_cb && core_if->pcd_cb->suspend) {
1481 core_if->pcd_cb->suspend(core_if->pcd_cb->p);
1485 /** Resume the PCD. Helper function for using the PCD callbacks.
1487 * @param core_if Programming view of DWC_otg controller.
1489 static inline void cil_pcd_resume(dwc_otg_core_if_t * core_if)
1491 if (core_if->pcd_cb && core_if->pcd_cb->resume_wakeup) {
1492 core_if->pcd_cb->resume_wakeup(core_if->pcd_cb->p);
1496 //////////////////////////////////////////////////////////////////////