15fd54aceSGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 290fccb52SAndrzej Pietrasiewicz /* 390fccb52SAndrzej Pietrasiewicz * Copyright (C) 2011 Marvell International Ltd. All rights reserved. 490fccb52SAndrzej Pietrasiewicz */ 590fccb52SAndrzej Pietrasiewicz 690fccb52SAndrzej Pietrasiewicz #ifndef __MV_U3D_H 790fccb52SAndrzej Pietrasiewicz #define __MV_U3D_H 890fccb52SAndrzej Pietrasiewicz 990fccb52SAndrzej Pietrasiewicz #define MV_U3D_EP_CONTEXT_ALIGNMENT 32 1090fccb52SAndrzej Pietrasiewicz #define MV_U3D_TRB_ALIGNMENT 16 1190fccb52SAndrzej Pietrasiewicz #define MV_U3D_DMA_BOUNDARY 4096 1290fccb52SAndrzej Pietrasiewicz #define MV_U3D_EP0_MAX_PKT_SIZE 512 1390fccb52SAndrzej Pietrasiewicz 1490fccb52SAndrzej Pietrasiewicz /* ep0 transfer state */ 1590fccb52SAndrzej Pietrasiewicz #define MV_U3D_WAIT_FOR_SETUP 0 1690fccb52SAndrzej Pietrasiewicz #define MV_U3D_DATA_STATE_XMIT 1 1790fccb52SAndrzej Pietrasiewicz #define MV_U3D_DATA_STATE_NEED_ZLP 2 1890fccb52SAndrzej Pietrasiewicz #define MV_U3D_WAIT_FOR_OUT_STATUS 3 1990fccb52SAndrzej Pietrasiewicz #define MV_U3D_DATA_STATE_RECV 4 2090fccb52SAndrzej Pietrasiewicz #define MV_U3D_STATUS_STAGE 5 2190fccb52SAndrzej Pietrasiewicz 2290fccb52SAndrzej Pietrasiewicz #define MV_U3D_EP_MAX_LENGTH_TRANSFER 0x10000 2390fccb52SAndrzej Pietrasiewicz 2490fccb52SAndrzej Pietrasiewicz /* USB3 Interrupt Status */ 2590fccb52SAndrzej Pietrasiewicz #define MV_U3D_USBINT_SETUP 0x00000001 2690fccb52SAndrzej Pietrasiewicz #define MV_U3D_USBINT_RX_COMPLETE 0x00000002 2790fccb52SAndrzej Pietrasiewicz #define MV_U3D_USBINT_TX_COMPLETE 0x00000004 2890fccb52SAndrzej Pietrasiewicz #define MV_U3D_USBINT_UNDER_RUN 0x00000008 2990fccb52SAndrzej Pietrasiewicz #define MV_U3D_USBINT_RXDESC_ERR 0x00000010 3090fccb52SAndrzej Pietrasiewicz #define MV_U3D_USBINT_TXDESC_ERR 0x00000020 3190fccb52SAndrzej Pietrasiewicz #define MV_U3D_USBINT_RX_TRB_COMPLETE 0x00000040 3290fccb52SAndrzej Pietrasiewicz #define MV_U3D_USBINT_TX_TRB_COMPLETE 0x00000080 3390fccb52SAndrzej Pietrasiewicz #define MV_U3D_USBINT_VBUS_VALID 0x00010000 3490fccb52SAndrzej Pietrasiewicz #define MV_U3D_USBINT_STORAGE_CMD_FULL 0x00020000 3590fccb52SAndrzej Pietrasiewicz #define MV_U3D_USBINT_LINK_CHG 0x01000000 3690fccb52SAndrzej Pietrasiewicz 3790fccb52SAndrzej Pietrasiewicz /* USB3 Interrupt Enable */ 3890fccb52SAndrzej Pietrasiewicz #define MV_U3D_INTR_ENABLE_SETUP 0x00000001 3990fccb52SAndrzej Pietrasiewicz #define MV_U3D_INTR_ENABLE_RX_COMPLETE 0x00000002 4090fccb52SAndrzej Pietrasiewicz #define MV_U3D_INTR_ENABLE_TX_COMPLETE 0x00000004 4190fccb52SAndrzej Pietrasiewicz #define MV_U3D_INTR_ENABLE_UNDER_RUN 0x00000008 4290fccb52SAndrzej Pietrasiewicz #define MV_U3D_INTR_ENABLE_RXDESC_ERR 0x00000010 4390fccb52SAndrzej Pietrasiewicz #define MV_U3D_INTR_ENABLE_TXDESC_ERR 0x00000020 4490fccb52SAndrzej Pietrasiewicz #define MV_U3D_INTR_ENABLE_RX_TRB_COMPLETE 0x00000040 4590fccb52SAndrzej Pietrasiewicz #define MV_U3D_INTR_ENABLE_TX_TRB_COMPLETE 0x00000080 4690fccb52SAndrzej Pietrasiewicz #define MV_U3D_INTR_ENABLE_RX_BUFFER_ERR 0x00000100 4790fccb52SAndrzej Pietrasiewicz #define MV_U3D_INTR_ENABLE_VBUS_VALID 0x00010000 4890fccb52SAndrzej Pietrasiewicz #define MV_U3D_INTR_ENABLE_STORAGE_CMD_FULL 0x00020000 4990fccb52SAndrzej Pietrasiewicz #define MV_U3D_INTR_ENABLE_LINK_CHG 0x01000000 5090fccb52SAndrzej Pietrasiewicz #define MV_U3D_INTR_ENABLE_PRIME_STATUS 0x02000000 5190fccb52SAndrzej Pietrasiewicz 5290fccb52SAndrzej Pietrasiewicz /* USB3 Link Change */ 5390fccb52SAndrzej Pietrasiewicz #define MV_U3D_LINK_CHANGE_LINK_UP 0x00000001 5490fccb52SAndrzej Pietrasiewicz #define MV_U3D_LINK_CHANGE_SUSPEND 0x00000002 5590fccb52SAndrzej Pietrasiewicz #define MV_U3D_LINK_CHANGE_RESUME 0x00000004 5690fccb52SAndrzej Pietrasiewicz #define MV_U3D_LINK_CHANGE_WRESET 0x00000008 5790fccb52SAndrzej Pietrasiewicz #define MV_U3D_LINK_CHANGE_HRESET 0x00000010 5890fccb52SAndrzej Pietrasiewicz #define MV_U3D_LINK_CHANGE_VBUS_INVALID 0x00000020 5990fccb52SAndrzej Pietrasiewicz #define MV_U3D_LINK_CHANGE_INACT 0x00000040 6090fccb52SAndrzej Pietrasiewicz #define MV_U3D_LINK_CHANGE_DISABLE_AFTER_U0 0x00000080 6190fccb52SAndrzej Pietrasiewicz #define MV_U3D_LINK_CHANGE_U1 0x00000100 6290fccb52SAndrzej Pietrasiewicz #define MV_U3D_LINK_CHANGE_U2 0x00000200 6390fccb52SAndrzej Pietrasiewicz #define MV_U3D_LINK_CHANGE_U3 0x00000400 6490fccb52SAndrzej Pietrasiewicz 6590fccb52SAndrzej Pietrasiewicz /* bridge setting */ 6690fccb52SAndrzej Pietrasiewicz #define MV_U3D_BRIDGE_SETTING_VBUS_VALID (1 << 16) 6790fccb52SAndrzej Pietrasiewicz 6890fccb52SAndrzej Pietrasiewicz /* Command Register Bit Masks */ 6990fccb52SAndrzej Pietrasiewicz #define MV_U3D_CMD_RUN_STOP 0x00000001 7090fccb52SAndrzej Pietrasiewicz #define MV_U3D_CMD_CTRL_RESET 0x00000002 7190fccb52SAndrzej Pietrasiewicz 7290fccb52SAndrzej Pietrasiewicz /* ep control register */ 7390fccb52SAndrzej Pietrasiewicz #define MV_U3D_EPXCR_EP_TYPE_CONTROL 0 7490fccb52SAndrzej Pietrasiewicz #define MV_U3D_EPXCR_EP_TYPE_ISOC 1 7590fccb52SAndrzej Pietrasiewicz #define MV_U3D_EPXCR_EP_TYPE_BULK 2 7690fccb52SAndrzej Pietrasiewicz #define MV_U3D_EPXCR_EP_TYPE_INT 3 7790fccb52SAndrzej Pietrasiewicz #define MV_U3D_EPXCR_EP_ENABLE_SHIFT 4 7890fccb52SAndrzej Pietrasiewicz #define MV_U3D_EPXCR_MAX_BURST_SIZE_SHIFT 12 7990fccb52SAndrzej Pietrasiewicz #define MV_U3D_EPXCR_MAX_PACKET_SIZE_SHIFT 16 8090fccb52SAndrzej Pietrasiewicz #define MV_U3D_USB_BULK_BURST_OUT 6 8190fccb52SAndrzej Pietrasiewicz #define MV_U3D_USB_BULK_BURST_IN 14 8290fccb52SAndrzej Pietrasiewicz 8390fccb52SAndrzej Pietrasiewicz #define MV_U3D_EPXCR_EP_FLUSH (1 << 7) 8490fccb52SAndrzej Pietrasiewicz #define MV_U3D_EPXCR_EP_HALT (1 << 1) 8590fccb52SAndrzej Pietrasiewicz #define MV_U3D_EPXCR_EP_INIT (1) 8690fccb52SAndrzej Pietrasiewicz 8790fccb52SAndrzej Pietrasiewicz /* TX/RX Status Register */ 8890fccb52SAndrzej Pietrasiewicz #define MV_U3D_XFERSTATUS_COMPLETE_SHIFT 24 8990fccb52SAndrzej Pietrasiewicz #define MV_U3D_COMPLETE_INVALID 0 9090fccb52SAndrzej Pietrasiewicz #define MV_U3D_COMPLETE_SUCCESS 1 9190fccb52SAndrzej Pietrasiewicz #define MV_U3D_COMPLETE_BUFF_ERR 2 9290fccb52SAndrzej Pietrasiewicz #define MV_U3D_COMPLETE_SHORT_PACKET 3 9390fccb52SAndrzej Pietrasiewicz #define MV_U3D_COMPLETE_TRB_ERR 5 9490fccb52SAndrzej Pietrasiewicz #define MV_U3D_XFERSTATUS_TRB_LENGTH_MASK (0xFFFFFF) 9590fccb52SAndrzej Pietrasiewicz 9690fccb52SAndrzej Pietrasiewicz #define MV_U3D_USB_LINK_BYPASS_VBUS 0x8 9790fccb52SAndrzej Pietrasiewicz 9890fccb52SAndrzej Pietrasiewicz #define MV_U3D_LTSSM_PHY_INIT_DONE 0x80000000 9990fccb52SAndrzej Pietrasiewicz #define MV_U3D_LTSSM_NEVER_GO_COMPLIANCE 0x40000000 10090fccb52SAndrzej Pietrasiewicz 10190fccb52SAndrzej Pietrasiewicz #define MV_U3D_USB3_OP_REGS_OFFSET 0x100 10290fccb52SAndrzej Pietrasiewicz #define MV_U3D_USB3_PHY_OFFSET 0xB800 10390fccb52SAndrzej Pietrasiewicz 10490fccb52SAndrzej Pietrasiewicz #define DCS_ENABLE 0x1 10590fccb52SAndrzej Pietrasiewicz 10690fccb52SAndrzej Pietrasiewicz /* timeout */ 10790fccb52SAndrzej Pietrasiewicz #define MV_U3D_RESET_TIMEOUT 10000 10890fccb52SAndrzej Pietrasiewicz #define MV_U3D_FLUSH_TIMEOUT 100000 10990fccb52SAndrzej Pietrasiewicz #define MV_U3D_OWN_TIMEOUT 10000 11090fccb52SAndrzej Pietrasiewicz #define LOOPS_USEC_SHIFT 4 11190fccb52SAndrzej Pietrasiewicz #define LOOPS_USEC (1 << LOOPS_USEC_SHIFT) 11290fccb52SAndrzej Pietrasiewicz #define LOOPS(timeout) ((timeout) >> LOOPS_USEC_SHIFT) 11390fccb52SAndrzej Pietrasiewicz 11490fccb52SAndrzej Pietrasiewicz /* ep direction */ 11590fccb52SAndrzej Pietrasiewicz #define MV_U3D_EP_DIR_IN 1 11690fccb52SAndrzej Pietrasiewicz #define MV_U3D_EP_DIR_OUT 0 11790fccb52SAndrzej Pietrasiewicz #define mv_u3d_ep_dir(ep) (((ep)->ep_num == 0) ? \ 11890fccb52SAndrzej Pietrasiewicz ((ep)->u3d->ep0_dir) : ((ep)->direction)) 11990fccb52SAndrzej Pietrasiewicz 12090fccb52SAndrzej Pietrasiewicz /* usb capability registers */ 12190fccb52SAndrzej Pietrasiewicz struct mv_u3d_cap_regs { 12290fccb52SAndrzej Pietrasiewicz u32 rsvd[5]; 12390fccb52SAndrzej Pietrasiewicz u32 dboff; /* doorbell register offset */ 12490fccb52SAndrzej Pietrasiewicz u32 rtsoff; /* runtime register offset */ 12590fccb52SAndrzej Pietrasiewicz u32 vuoff; /* vendor unique register offset */ 12690fccb52SAndrzej Pietrasiewicz }; 12790fccb52SAndrzej Pietrasiewicz 12890fccb52SAndrzej Pietrasiewicz /* operation registers */ 12990fccb52SAndrzej Pietrasiewicz struct mv_u3d_op_regs { 13090fccb52SAndrzej Pietrasiewicz u32 usbcmd; /* Command register */ 13190fccb52SAndrzej Pietrasiewicz u32 rsvd1[11]; 13290fccb52SAndrzej Pietrasiewicz u32 dcbaapl; /* Device Context Base Address low register */ 13390fccb52SAndrzej Pietrasiewicz u32 dcbaaph; /* Device Context Base Address high register */ 13490fccb52SAndrzej Pietrasiewicz u32 rsvd2[243]; 13590fccb52SAndrzej Pietrasiewicz u32 portsc; /* port status and control register*/ 13690fccb52SAndrzej Pietrasiewicz u32 portlinkinfo; /* port link info register*/ 13790fccb52SAndrzej Pietrasiewicz u32 rsvd3[9917]; 13890fccb52SAndrzej Pietrasiewicz u32 doorbell; /* doorbell register */ 13990fccb52SAndrzej Pietrasiewicz }; 14090fccb52SAndrzej Pietrasiewicz 141*c1aa81daSGeert Uytterhoeven /* control endpoint enable registers */ 14290fccb52SAndrzej Pietrasiewicz struct epxcr { 14390fccb52SAndrzej Pietrasiewicz u32 epxoutcr0; /* ep out control 0 register */ 14490fccb52SAndrzej Pietrasiewicz u32 epxoutcr1; /* ep out control 1 register */ 14590fccb52SAndrzej Pietrasiewicz u32 epxincr0; /* ep in control 0 register */ 14690fccb52SAndrzej Pietrasiewicz u32 epxincr1; /* ep in control 1 register */ 14790fccb52SAndrzej Pietrasiewicz }; 14890fccb52SAndrzej Pietrasiewicz 14990fccb52SAndrzej Pietrasiewicz /* transfer status registers */ 15090fccb52SAndrzej Pietrasiewicz struct xferstatus { 15190fccb52SAndrzej Pietrasiewicz u32 curdeqlo; /* current TRB pointer low */ 15290fccb52SAndrzej Pietrasiewicz u32 curdeqhi; /* current TRB pointer high */ 15390fccb52SAndrzej Pietrasiewicz u32 statuslo; /* transfer status low */ 15490fccb52SAndrzej Pietrasiewicz u32 statushi; /* transfer status high */ 15590fccb52SAndrzej Pietrasiewicz }; 15690fccb52SAndrzej Pietrasiewicz 15790fccb52SAndrzej Pietrasiewicz /* vendor unique control registers */ 15890fccb52SAndrzej Pietrasiewicz struct mv_u3d_vuc_regs { 15990fccb52SAndrzej Pietrasiewicz u32 ctrlepenable; /* control endpoint enable register */ 16090fccb52SAndrzej Pietrasiewicz u32 setuplock; /* setup lock register */ 16190fccb52SAndrzej Pietrasiewicz u32 endcomplete; /* endpoint transfer complete register */ 16290fccb52SAndrzej Pietrasiewicz u32 intrcause; /* interrupt cause register */ 16390fccb52SAndrzej Pietrasiewicz u32 intrenable; /* interrupt enable register */ 16490fccb52SAndrzej Pietrasiewicz u32 trbcomplete; /* TRB complete register */ 16590fccb52SAndrzej Pietrasiewicz u32 linkchange; /* link change register */ 16690fccb52SAndrzej Pietrasiewicz u32 rsvd1[5]; 16790fccb52SAndrzej Pietrasiewicz u32 trbunderrun; /* TRB underrun register */ 16890fccb52SAndrzej Pietrasiewicz u32 rsvd2[43]; 16990fccb52SAndrzej Pietrasiewicz u32 bridgesetting; /* bridge setting register */ 17090fccb52SAndrzej Pietrasiewicz u32 rsvd3[7]; 17190fccb52SAndrzej Pietrasiewicz struct xferstatus txst[16]; /* TX status register */ 17290fccb52SAndrzej Pietrasiewicz struct xferstatus rxst[16]; /* RX status register */ 17390fccb52SAndrzej Pietrasiewicz u32 ltssm; /* LTSSM control register */ 17490fccb52SAndrzej Pietrasiewicz u32 pipe; /* PIPE control register */ 17590fccb52SAndrzej Pietrasiewicz u32 linkcr0; /* link control 0 register */ 17690fccb52SAndrzej Pietrasiewicz u32 linkcr1; /* link control 1 register */ 17790fccb52SAndrzej Pietrasiewicz u32 rsvd6[60]; 17890fccb52SAndrzej Pietrasiewicz u32 mib0; /* MIB0 counter register */ 17990fccb52SAndrzej Pietrasiewicz u32 usblink; /* usb link control register */ 18090fccb52SAndrzej Pietrasiewicz u32 ltssmstate; /* LTSSM state register */ 18190fccb52SAndrzej Pietrasiewicz u32 linkerrorcause; /* link error cause register */ 18290fccb52SAndrzej Pietrasiewicz u32 rsvd7[60]; 18390fccb52SAndrzej Pietrasiewicz u32 devaddrtiebrkr; /* device address and tie breaker */ 18490fccb52SAndrzej Pietrasiewicz u32 itpinfo0; /* ITP info 0 register */ 18590fccb52SAndrzej Pietrasiewicz u32 itpinfo1; /* ITP info 1 register */ 18690fccb52SAndrzej Pietrasiewicz u32 rsvd8[61]; 18790fccb52SAndrzej Pietrasiewicz struct epxcr epcr[16]; /* ep control register */ 18890fccb52SAndrzej Pietrasiewicz u32 rsvd9[64]; 18990fccb52SAndrzej Pietrasiewicz u32 phyaddr; /* PHY address register */ 19090fccb52SAndrzej Pietrasiewicz u32 phydata; /* PHY data register */ 19190fccb52SAndrzej Pietrasiewicz }; 19290fccb52SAndrzej Pietrasiewicz 19390fccb52SAndrzej Pietrasiewicz /* Endpoint context structure */ 19490fccb52SAndrzej Pietrasiewicz struct mv_u3d_ep_context { 19590fccb52SAndrzej Pietrasiewicz u32 rsvd0; 19690fccb52SAndrzej Pietrasiewicz u32 rsvd1; 19790fccb52SAndrzej Pietrasiewicz u32 trb_addr_lo; /* TRB address low 32 bit */ 19890fccb52SAndrzej Pietrasiewicz u32 trb_addr_hi; /* TRB address high 32 bit */ 19990fccb52SAndrzej Pietrasiewicz u32 rsvd2; 20090fccb52SAndrzej Pietrasiewicz u32 rsvd3; 20190fccb52SAndrzej Pietrasiewicz struct usb_ctrlrequest setup_buffer; /* setup data buffer */ 20290fccb52SAndrzej Pietrasiewicz }; 20390fccb52SAndrzej Pietrasiewicz 20490fccb52SAndrzej Pietrasiewicz /* TRB control data structure */ 20590fccb52SAndrzej Pietrasiewicz struct mv_u3d_trb_ctrl { 20690fccb52SAndrzej Pietrasiewicz u32 own:1; /* owner of TRB */ 20790fccb52SAndrzej Pietrasiewicz u32 rsvd1:3; 20890fccb52SAndrzej Pietrasiewicz u32 chain:1; /* associate this TRB with the 20990fccb52SAndrzej Pietrasiewicz next TRB on the Ring */ 21090fccb52SAndrzej Pietrasiewicz u32 ioc:1; /* interrupt on complete */ 21190fccb52SAndrzej Pietrasiewicz u32 rsvd2:4; 21290fccb52SAndrzej Pietrasiewicz u32 type:6; /* TRB type */ 21390fccb52SAndrzej Pietrasiewicz #define TYPE_NORMAL 1 21490fccb52SAndrzej Pietrasiewicz #define TYPE_DATA 3 21590fccb52SAndrzej Pietrasiewicz #define TYPE_LINK 6 21690fccb52SAndrzej Pietrasiewicz u32 dir:1; /* Working at data stage of control endpoint 21790fccb52SAndrzej Pietrasiewicz operation. 0 is OUT and 1 is IN. */ 21890fccb52SAndrzej Pietrasiewicz u32 rsvd3:15; 21990fccb52SAndrzej Pietrasiewicz }; 22090fccb52SAndrzej Pietrasiewicz 22190fccb52SAndrzej Pietrasiewicz /* TRB data structure 22290fccb52SAndrzej Pietrasiewicz * For multiple TRB, all the TRBs' physical address should be continuous. 22390fccb52SAndrzej Pietrasiewicz */ 22490fccb52SAndrzej Pietrasiewicz struct mv_u3d_trb_hw { 22590fccb52SAndrzej Pietrasiewicz u32 buf_addr_lo; /* data buffer address low 32 bit */ 22690fccb52SAndrzej Pietrasiewicz u32 buf_addr_hi; /* data buffer address high 32 bit */ 22790fccb52SAndrzej Pietrasiewicz u32 trb_len; /* transfer length */ 22890fccb52SAndrzej Pietrasiewicz struct mv_u3d_trb_ctrl ctrl; /* TRB control data */ 22990fccb52SAndrzej Pietrasiewicz }; 23090fccb52SAndrzej Pietrasiewicz 23190fccb52SAndrzej Pietrasiewicz /* TRB structure */ 23290fccb52SAndrzej Pietrasiewicz struct mv_u3d_trb { 23390fccb52SAndrzej Pietrasiewicz struct mv_u3d_trb_hw *trb_hw; /* point to the trb_hw structure */ 23490fccb52SAndrzej Pietrasiewicz dma_addr_t trb_dma; /* dma address for this trb_hw */ 23590fccb52SAndrzej Pietrasiewicz struct list_head trb_list; /* trb list */ 23690fccb52SAndrzej Pietrasiewicz }; 23790fccb52SAndrzej Pietrasiewicz 23890fccb52SAndrzej Pietrasiewicz /* device data structure */ 23990fccb52SAndrzej Pietrasiewicz struct mv_u3d { 24090fccb52SAndrzej Pietrasiewicz struct usb_gadget gadget; 24190fccb52SAndrzej Pietrasiewicz struct usb_gadget_driver *driver; 24290fccb52SAndrzej Pietrasiewicz spinlock_t lock; /* device lock */ 24390fccb52SAndrzej Pietrasiewicz struct completion *done; 24490fccb52SAndrzej Pietrasiewicz struct device *dev; 24590fccb52SAndrzej Pietrasiewicz int irq; 24690fccb52SAndrzej Pietrasiewicz 24790fccb52SAndrzej Pietrasiewicz /* usb controller registers */ 24890fccb52SAndrzej Pietrasiewicz struct mv_u3d_cap_regs __iomem *cap_regs; 24990fccb52SAndrzej Pietrasiewicz struct mv_u3d_op_regs __iomem *op_regs; 25090fccb52SAndrzej Pietrasiewicz struct mv_u3d_vuc_regs __iomem *vuc_regs; 25190fccb52SAndrzej Pietrasiewicz void __iomem *phy_regs; 25290fccb52SAndrzej Pietrasiewicz 25390fccb52SAndrzej Pietrasiewicz unsigned int max_eps; 25490fccb52SAndrzej Pietrasiewicz struct mv_u3d_ep_context *ep_context; 25590fccb52SAndrzej Pietrasiewicz size_t ep_context_size; 25690fccb52SAndrzej Pietrasiewicz dma_addr_t ep_context_dma; 25790fccb52SAndrzej Pietrasiewicz 25890fccb52SAndrzej Pietrasiewicz struct dma_pool *trb_pool; /* for TRB data structure */ 25990fccb52SAndrzej Pietrasiewicz struct mv_u3d_ep *eps; 26090fccb52SAndrzej Pietrasiewicz 26190fccb52SAndrzej Pietrasiewicz struct mv_u3d_req *status_req; /* ep0 status request */ 26290fccb52SAndrzej Pietrasiewicz struct usb_ctrlrequest local_setup_buff; /* store setup data*/ 26390fccb52SAndrzej Pietrasiewicz 26490fccb52SAndrzej Pietrasiewicz unsigned int resume_state; /* USB state to resume */ 26590fccb52SAndrzej Pietrasiewicz unsigned int usb_state; /* USB current state */ 26690fccb52SAndrzej Pietrasiewicz unsigned int ep0_state; /* Endpoint zero state */ 26790fccb52SAndrzej Pietrasiewicz unsigned int ep0_dir; 26890fccb52SAndrzej Pietrasiewicz 26990fccb52SAndrzej Pietrasiewicz unsigned int dev_addr; /* device address */ 27090fccb52SAndrzej Pietrasiewicz 27190fccb52SAndrzej Pietrasiewicz unsigned int errors; 27290fccb52SAndrzej Pietrasiewicz 27390fccb52SAndrzej Pietrasiewicz unsigned softconnect:1; 27490fccb52SAndrzej Pietrasiewicz unsigned vbus_active:1; /* vbus is active or not */ 27590fccb52SAndrzej Pietrasiewicz unsigned remote_wakeup:1; /* support remote wakeup */ 27690fccb52SAndrzej Pietrasiewicz unsigned clock_gating:1; /* clock gating or not */ 27790fccb52SAndrzej Pietrasiewicz unsigned active:1; /* udc is active or not */ 27890fccb52SAndrzej Pietrasiewicz unsigned vbus_valid_detect:1; /* udc vbus detection */ 27990fccb52SAndrzej Pietrasiewicz 28090fccb52SAndrzej Pietrasiewicz struct mv_usb_addon_irq *vbus; 28190fccb52SAndrzej Pietrasiewicz unsigned int power; 28290fccb52SAndrzej Pietrasiewicz 28390fccb52SAndrzej Pietrasiewicz struct clk *clk; 28490fccb52SAndrzej Pietrasiewicz }; 28590fccb52SAndrzej Pietrasiewicz 28690fccb52SAndrzej Pietrasiewicz /* endpoint data structure */ 28790fccb52SAndrzej Pietrasiewicz struct mv_u3d_ep { 28890fccb52SAndrzej Pietrasiewicz struct usb_ep ep; 28990fccb52SAndrzej Pietrasiewicz struct mv_u3d *u3d; 29090fccb52SAndrzej Pietrasiewicz struct list_head queue; /* ep request queued hardware */ 29190fccb52SAndrzej Pietrasiewicz struct list_head req_list; /* list of ep request */ 29290fccb52SAndrzej Pietrasiewicz struct mv_u3d_ep_context *ep_context; /* ep context */ 29390fccb52SAndrzej Pietrasiewicz u32 direction; 29490fccb52SAndrzej Pietrasiewicz char name[14]; 29590fccb52SAndrzej Pietrasiewicz u32 processing; /* there is ep request 29690fccb52SAndrzej Pietrasiewicz queued on haredware */ 29790fccb52SAndrzej Pietrasiewicz spinlock_t req_lock; /* ep lock */ 29890fccb52SAndrzej Pietrasiewicz unsigned wedge:1; 29990fccb52SAndrzej Pietrasiewicz unsigned enabled:1; 30090fccb52SAndrzej Pietrasiewicz unsigned ep_type:2; 30190fccb52SAndrzej Pietrasiewicz unsigned ep_num:8; 30290fccb52SAndrzej Pietrasiewicz }; 30390fccb52SAndrzej Pietrasiewicz 30490fccb52SAndrzej Pietrasiewicz /* request data structure */ 30590fccb52SAndrzej Pietrasiewicz struct mv_u3d_req { 30690fccb52SAndrzej Pietrasiewicz struct usb_request req; 30790fccb52SAndrzej Pietrasiewicz struct mv_u3d_ep *ep; 30890fccb52SAndrzej Pietrasiewicz struct list_head queue; /* ep requst queued on hardware */ 30990fccb52SAndrzej Pietrasiewicz struct list_head list; /* ep request list */ 31090fccb52SAndrzej Pietrasiewicz struct list_head trb_list; /* trb list of a request */ 31190fccb52SAndrzej Pietrasiewicz 31290fccb52SAndrzej Pietrasiewicz struct mv_u3d_trb *trb_head; /* point to first trb of a request */ 31390fccb52SAndrzej Pietrasiewicz unsigned trb_count; /* TRB number in the chain */ 31490fccb52SAndrzej Pietrasiewicz unsigned chain; /* TRB chain or not */ 31590fccb52SAndrzej Pietrasiewicz }; 31690fccb52SAndrzej Pietrasiewicz 31790fccb52SAndrzej Pietrasiewicz #endif 318