1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2011 Marvell International Ltd. All rights reserved. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef __MV_UDC_H 7*4882a593Smuzhiyun #define __MV_UDC_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #define VUSBHS_MAX_PORTS 8 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define DQH_ALIGNMENT 2048 12*4882a593Smuzhiyun #define DTD_ALIGNMENT 64 13*4882a593Smuzhiyun #define DMA_BOUNDARY 4096 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define EP_DIR_IN 1 16*4882a593Smuzhiyun #define EP_DIR_OUT 0 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define DMA_ADDR_INVALID (~(dma_addr_t)0) 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define EP0_MAX_PKT_SIZE 64 21*4882a593Smuzhiyun /* ep0 transfer state */ 22*4882a593Smuzhiyun #define WAIT_FOR_SETUP 0 23*4882a593Smuzhiyun #define DATA_STATE_XMIT 1 24*4882a593Smuzhiyun #define DATA_STATE_NEED_ZLP 2 25*4882a593Smuzhiyun #define WAIT_FOR_OUT_STATUS 3 26*4882a593Smuzhiyun #define DATA_STATE_RECV 4 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define CAPLENGTH_MASK (0xff) 29*4882a593Smuzhiyun #define DCCPARAMS_DEN_MASK (0x1f) 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define HCSPARAMS_PPC (0x10) 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* Frame Index Register Bit Masks */ 34*4882a593Smuzhiyun #define USB_FRINDEX_MASKS 0x3fff 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* Command Register Bit Masks */ 37*4882a593Smuzhiyun #define USBCMD_RUN_STOP (0x00000001) 38*4882a593Smuzhiyun #define USBCMD_CTRL_RESET (0x00000002) 39*4882a593Smuzhiyun #define USBCMD_SETUP_TRIPWIRE_SET (0x00002000) 40*4882a593Smuzhiyun #define USBCMD_SETUP_TRIPWIRE_CLEAR (~USBCMD_SETUP_TRIPWIRE_SET) 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define USBCMD_ATDTW_TRIPWIRE_SET (0x00004000) 43*4882a593Smuzhiyun #define USBCMD_ATDTW_TRIPWIRE_CLEAR (~USBCMD_ATDTW_TRIPWIRE_SET) 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* bit 15,3,2 are for frame list size */ 46*4882a593Smuzhiyun #define USBCMD_FRAME_SIZE_1024 (0x00000000) /* 000 */ 47*4882a593Smuzhiyun #define USBCMD_FRAME_SIZE_512 (0x00000004) /* 001 */ 48*4882a593Smuzhiyun #define USBCMD_FRAME_SIZE_256 (0x00000008) /* 010 */ 49*4882a593Smuzhiyun #define USBCMD_FRAME_SIZE_128 (0x0000000C) /* 011 */ 50*4882a593Smuzhiyun #define USBCMD_FRAME_SIZE_64 (0x00008000) /* 100 */ 51*4882a593Smuzhiyun #define USBCMD_FRAME_SIZE_32 (0x00008004) /* 101 */ 52*4882a593Smuzhiyun #define USBCMD_FRAME_SIZE_16 (0x00008008) /* 110 */ 53*4882a593Smuzhiyun #define USBCMD_FRAME_SIZE_8 (0x0000800C) /* 111 */ 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define EPCTRL_TX_ALL_MASK (0xFFFF0000) 56*4882a593Smuzhiyun #define EPCTRL_RX_ALL_MASK (0x0000FFFF) 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define EPCTRL_TX_DATA_TOGGLE_RST (0x00400000) 59*4882a593Smuzhiyun #define EPCTRL_TX_EP_STALL (0x00010000) 60*4882a593Smuzhiyun #define EPCTRL_RX_EP_STALL (0x00000001) 61*4882a593Smuzhiyun #define EPCTRL_RX_DATA_TOGGLE_RST (0x00000040) 62*4882a593Smuzhiyun #define EPCTRL_RX_ENABLE (0x00000080) 63*4882a593Smuzhiyun #define EPCTRL_TX_ENABLE (0x00800000) 64*4882a593Smuzhiyun #define EPCTRL_CONTROL (0x00000000) 65*4882a593Smuzhiyun #define EPCTRL_ISOCHRONOUS (0x00040000) 66*4882a593Smuzhiyun #define EPCTRL_BULK (0x00080000) 67*4882a593Smuzhiyun #define EPCTRL_INT (0x000C0000) 68*4882a593Smuzhiyun #define EPCTRL_TX_TYPE (0x000C0000) 69*4882a593Smuzhiyun #define EPCTRL_RX_TYPE (0x0000000C) 70*4882a593Smuzhiyun #define EPCTRL_DATA_TOGGLE_INHIBIT (0x00000020) 71*4882a593Smuzhiyun #define EPCTRL_TX_EP_TYPE_SHIFT (18) 72*4882a593Smuzhiyun #define EPCTRL_RX_EP_TYPE_SHIFT (2) 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define EPCOMPLETE_MAX_ENDPOINTS (16) 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* endpoint list address bit masks */ 77*4882a593Smuzhiyun #define USB_EP_LIST_ADDRESS_MASK 0xfffff800 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun #define PORTSCX_W1C_BITS 0x2a 80*4882a593Smuzhiyun #define PORTSCX_PORT_RESET 0x00000100 81*4882a593Smuzhiyun #define PORTSCX_PORT_POWER 0x00001000 82*4882a593Smuzhiyun #define PORTSCX_FORCE_FULL_SPEED_CONNECT 0x01000000 83*4882a593Smuzhiyun #define PORTSCX_PAR_XCVR_SELECT 0xC0000000 84*4882a593Smuzhiyun #define PORTSCX_PORT_FORCE_RESUME 0x00000040 85*4882a593Smuzhiyun #define PORTSCX_PORT_SUSPEND 0x00000080 86*4882a593Smuzhiyun #define PORTSCX_PORT_SPEED_FULL 0x00000000 87*4882a593Smuzhiyun #define PORTSCX_PORT_SPEED_LOW 0x04000000 88*4882a593Smuzhiyun #define PORTSCX_PORT_SPEED_HIGH 0x08000000 89*4882a593Smuzhiyun #define PORTSCX_PORT_SPEED_MASK 0x0C000000 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* USB MODE Register Bit Masks */ 92*4882a593Smuzhiyun #define USBMODE_CTRL_MODE_IDLE 0x00000000 93*4882a593Smuzhiyun #define USBMODE_CTRL_MODE_DEVICE 0x00000002 94*4882a593Smuzhiyun #define USBMODE_CTRL_MODE_HOST 0x00000003 95*4882a593Smuzhiyun #define USBMODE_CTRL_MODE_RSV 0x00000001 96*4882a593Smuzhiyun #define USBMODE_SETUP_LOCK_OFF 0x00000008 97*4882a593Smuzhiyun #define USBMODE_STREAM_DISABLE 0x00000010 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /* USB STS Register Bit Masks */ 100*4882a593Smuzhiyun #define USBSTS_INT 0x00000001 101*4882a593Smuzhiyun #define USBSTS_ERR 0x00000002 102*4882a593Smuzhiyun #define USBSTS_PORT_CHANGE 0x00000004 103*4882a593Smuzhiyun #define USBSTS_FRM_LST_ROLL 0x00000008 104*4882a593Smuzhiyun #define USBSTS_SYS_ERR 0x00000010 105*4882a593Smuzhiyun #define USBSTS_IAA 0x00000020 106*4882a593Smuzhiyun #define USBSTS_RESET 0x00000040 107*4882a593Smuzhiyun #define USBSTS_SOF 0x00000080 108*4882a593Smuzhiyun #define USBSTS_SUSPEND 0x00000100 109*4882a593Smuzhiyun #define USBSTS_HC_HALTED 0x00001000 110*4882a593Smuzhiyun #define USBSTS_RCL 0x00002000 111*4882a593Smuzhiyun #define USBSTS_PERIODIC_SCHEDULE 0x00004000 112*4882a593Smuzhiyun #define USBSTS_ASYNC_SCHEDULE 0x00008000 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun /* Interrupt Enable Register Bit Masks */ 116*4882a593Smuzhiyun #define USBINTR_INT_EN (0x00000001) 117*4882a593Smuzhiyun #define USBINTR_ERR_INT_EN (0x00000002) 118*4882a593Smuzhiyun #define USBINTR_PORT_CHANGE_DETECT_EN (0x00000004) 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun #define USBINTR_ASYNC_ADV_AAE (0x00000020) 121*4882a593Smuzhiyun #define USBINTR_ASYNC_ADV_AAE_ENABLE (0x00000020) 122*4882a593Smuzhiyun #define USBINTR_ASYNC_ADV_AAE_DISABLE (0xFFFFFFDF) 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun #define USBINTR_RESET_EN (0x00000040) 125*4882a593Smuzhiyun #define USBINTR_SOF_UFRAME_EN (0x00000080) 126*4882a593Smuzhiyun #define USBINTR_DEVICE_SUSPEND (0x00000100) 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun #define USB_DEVICE_ADDRESS_MASK (0xfe000000) 129*4882a593Smuzhiyun #define USB_DEVICE_ADDRESS_BIT_SHIFT (25) 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun struct mv_cap_regs { 132*4882a593Smuzhiyun u32 caplength_hciversion; 133*4882a593Smuzhiyun u32 hcsparams; /* HC structural parameters */ 134*4882a593Smuzhiyun u32 hccparams; /* HC Capability Parameters*/ 135*4882a593Smuzhiyun u32 reserved[5]; 136*4882a593Smuzhiyun u32 dciversion; /* DC version number and reserved 16 bits */ 137*4882a593Smuzhiyun u32 dccparams; /* DC Capability Parameters */ 138*4882a593Smuzhiyun }; 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun struct mv_op_regs { 141*4882a593Smuzhiyun u32 usbcmd; /* Command register */ 142*4882a593Smuzhiyun u32 usbsts; /* Status register */ 143*4882a593Smuzhiyun u32 usbintr; /* Interrupt enable */ 144*4882a593Smuzhiyun u32 frindex; /* Frame index */ 145*4882a593Smuzhiyun u32 reserved1[1]; 146*4882a593Smuzhiyun u32 deviceaddr; /* Device Address */ 147*4882a593Smuzhiyun u32 eplistaddr; /* Endpoint List Address */ 148*4882a593Smuzhiyun u32 ttctrl; /* HOST TT status and control */ 149*4882a593Smuzhiyun u32 burstsize; /* Programmable Burst Size */ 150*4882a593Smuzhiyun u32 txfilltuning; /* Host Transmit Pre-Buffer Packet Tuning */ 151*4882a593Smuzhiyun u32 reserved[4]; 152*4882a593Smuzhiyun u32 epnak; /* Endpoint NAK */ 153*4882a593Smuzhiyun u32 epnaken; /* Endpoint NAK Enable */ 154*4882a593Smuzhiyun u32 configflag; /* Configured Flag register */ 155*4882a593Smuzhiyun u32 portsc[VUSBHS_MAX_PORTS]; /* Port Status/Control x, x = 1..8 */ 156*4882a593Smuzhiyun u32 otgsc; 157*4882a593Smuzhiyun u32 usbmode; /* USB Host/Device mode */ 158*4882a593Smuzhiyun u32 epsetupstat; /* Endpoint Setup Status */ 159*4882a593Smuzhiyun u32 epprime; /* Endpoint Initialize */ 160*4882a593Smuzhiyun u32 epflush; /* Endpoint De-initialize */ 161*4882a593Smuzhiyun u32 epstatus; /* Endpoint Status */ 162*4882a593Smuzhiyun u32 epcomplete; /* Endpoint Interrupt On Complete */ 163*4882a593Smuzhiyun u32 epctrlx[16]; /* Endpoint Control, where x = 0.. 15 */ 164*4882a593Smuzhiyun u32 mcr; /* Mux Control */ 165*4882a593Smuzhiyun u32 isr; /* Interrupt Status */ 166*4882a593Smuzhiyun u32 ier; /* Interrupt Enable */ 167*4882a593Smuzhiyun }; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun struct mv_udc { 170*4882a593Smuzhiyun struct usb_gadget gadget; 171*4882a593Smuzhiyun struct usb_gadget_driver *driver; 172*4882a593Smuzhiyun spinlock_t lock; 173*4882a593Smuzhiyun struct completion *done; 174*4882a593Smuzhiyun struct platform_device *dev; 175*4882a593Smuzhiyun int irq; 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun struct mv_cap_regs __iomem *cap_regs; 178*4882a593Smuzhiyun struct mv_op_regs __iomem *op_regs; 179*4882a593Smuzhiyun void __iomem *phy_regs; 180*4882a593Smuzhiyun unsigned int max_eps; 181*4882a593Smuzhiyun struct mv_dqh *ep_dqh; 182*4882a593Smuzhiyun size_t ep_dqh_size; 183*4882a593Smuzhiyun dma_addr_t ep_dqh_dma; 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun struct dma_pool *dtd_pool; 186*4882a593Smuzhiyun struct mv_ep *eps; 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun struct mv_dtd *dtd_head; 189*4882a593Smuzhiyun struct mv_dtd *dtd_tail; 190*4882a593Smuzhiyun unsigned int dtd_entries; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun struct mv_req *status_req; 193*4882a593Smuzhiyun struct usb_ctrlrequest local_setup_buff; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun unsigned int resume_state; /* USB state to resume */ 196*4882a593Smuzhiyun unsigned int usb_state; /* USB current state */ 197*4882a593Smuzhiyun unsigned int ep0_state; /* Endpoint zero state */ 198*4882a593Smuzhiyun unsigned int ep0_dir; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun unsigned int dev_addr; 201*4882a593Smuzhiyun unsigned int test_mode; 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun int errors; 204*4882a593Smuzhiyun unsigned softconnect:1, 205*4882a593Smuzhiyun vbus_active:1, 206*4882a593Smuzhiyun remote_wakeup:1, 207*4882a593Smuzhiyun softconnected:1, 208*4882a593Smuzhiyun force_fs:1, 209*4882a593Smuzhiyun clock_gating:1, 210*4882a593Smuzhiyun active:1, 211*4882a593Smuzhiyun stopped:1; /* stop bit is setted */ 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun struct work_struct vbus_work; 214*4882a593Smuzhiyun struct workqueue_struct *qwork; 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun struct usb_phy *transceiver; 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun struct mv_usb_platform_data *pdata; 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun /* some SOC has mutiple clock sources for USB*/ 221*4882a593Smuzhiyun struct clk *clk; 222*4882a593Smuzhiyun }; 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun /* endpoint data structure */ 225*4882a593Smuzhiyun struct mv_ep { 226*4882a593Smuzhiyun struct usb_ep ep; 227*4882a593Smuzhiyun struct mv_udc *udc; 228*4882a593Smuzhiyun struct list_head queue; 229*4882a593Smuzhiyun struct mv_dqh *dqh; 230*4882a593Smuzhiyun u32 direction; 231*4882a593Smuzhiyun char name[14]; 232*4882a593Smuzhiyun unsigned stopped:1, 233*4882a593Smuzhiyun wedge:1, 234*4882a593Smuzhiyun ep_type:2, 235*4882a593Smuzhiyun ep_num:8; 236*4882a593Smuzhiyun }; 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun /* request data structure */ 239*4882a593Smuzhiyun struct mv_req { 240*4882a593Smuzhiyun struct usb_request req; 241*4882a593Smuzhiyun struct mv_dtd *dtd, *head, *tail; 242*4882a593Smuzhiyun struct mv_ep *ep; 243*4882a593Smuzhiyun struct list_head queue; 244*4882a593Smuzhiyun unsigned int test_mode; 245*4882a593Smuzhiyun unsigned dtd_count; 246*4882a593Smuzhiyun unsigned mapped:1; 247*4882a593Smuzhiyun }; 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun #define EP_QUEUE_HEAD_MULT_POS 30 250*4882a593Smuzhiyun #define EP_QUEUE_HEAD_ZLT_SEL 0x20000000 251*4882a593Smuzhiyun #define EP_QUEUE_HEAD_MAX_PKT_LEN_POS 16 252*4882a593Smuzhiyun #define EP_QUEUE_HEAD_MAX_PKT_LEN(ep_info) (((ep_info)>>16)&0x07ff) 253*4882a593Smuzhiyun #define EP_QUEUE_HEAD_IOS 0x00008000 254*4882a593Smuzhiyun #define EP_QUEUE_HEAD_NEXT_TERMINATE 0x00000001 255*4882a593Smuzhiyun #define EP_QUEUE_HEAD_IOC 0x00008000 256*4882a593Smuzhiyun #define EP_QUEUE_HEAD_MULTO 0x00000C00 257*4882a593Smuzhiyun #define EP_QUEUE_HEAD_STATUS_HALT 0x00000040 258*4882a593Smuzhiyun #define EP_QUEUE_HEAD_STATUS_ACTIVE 0x00000080 259*4882a593Smuzhiyun #define EP_QUEUE_CURRENT_OFFSET_MASK 0x00000FFF 260*4882a593Smuzhiyun #define EP_QUEUE_HEAD_NEXT_POINTER_MASK 0xFFFFFFE0 261*4882a593Smuzhiyun #define EP_QUEUE_FRINDEX_MASK 0x000007FF 262*4882a593Smuzhiyun #define EP_MAX_LENGTH_TRANSFER 0x4000 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun struct mv_dqh { 265*4882a593Smuzhiyun /* Bits 16..26 Bit 15 is Interrupt On Setup */ 266*4882a593Smuzhiyun u32 max_packet_length; 267*4882a593Smuzhiyun u32 curr_dtd_ptr; /* Current dTD Pointer */ 268*4882a593Smuzhiyun u32 next_dtd_ptr; /* Next dTD Pointer */ 269*4882a593Smuzhiyun /* Total bytes (16..30), IOC (15), INT (8), STS (0-7) */ 270*4882a593Smuzhiyun u32 size_ioc_int_sts; 271*4882a593Smuzhiyun u32 buff_ptr0; /* Buffer pointer Page 0 (12-31) */ 272*4882a593Smuzhiyun u32 buff_ptr1; /* Buffer pointer Page 1 (12-31) */ 273*4882a593Smuzhiyun u32 buff_ptr2; /* Buffer pointer Page 2 (12-31) */ 274*4882a593Smuzhiyun u32 buff_ptr3; /* Buffer pointer Page 3 (12-31) */ 275*4882a593Smuzhiyun u32 buff_ptr4; /* Buffer pointer Page 4 (12-31) */ 276*4882a593Smuzhiyun u32 reserved1; 277*4882a593Smuzhiyun /* 8 bytes of setup data that follows the Setup PID */ 278*4882a593Smuzhiyun u8 setup_buffer[8]; 279*4882a593Smuzhiyun u32 reserved2[4]; 280*4882a593Smuzhiyun }; 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun #define DTD_NEXT_TERMINATE (0x00000001) 284*4882a593Smuzhiyun #define DTD_IOC (0x00008000) 285*4882a593Smuzhiyun #define DTD_STATUS_ACTIVE (0x00000080) 286*4882a593Smuzhiyun #define DTD_STATUS_HALTED (0x00000040) 287*4882a593Smuzhiyun #define DTD_STATUS_DATA_BUFF_ERR (0x00000020) 288*4882a593Smuzhiyun #define DTD_STATUS_TRANSACTION_ERR (0x00000008) 289*4882a593Smuzhiyun #define DTD_RESERVED_FIELDS (0x00007F00) 290*4882a593Smuzhiyun #define DTD_ERROR_MASK (0x68) 291*4882a593Smuzhiyun #define DTD_ADDR_MASK (0xFFFFFFE0) 292*4882a593Smuzhiyun #define DTD_PACKET_SIZE 0x7FFF0000 293*4882a593Smuzhiyun #define DTD_LENGTH_BIT_POS (16) 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun struct mv_dtd { 296*4882a593Smuzhiyun u32 dtd_next; 297*4882a593Smuzhiyun u32 size_ioc_sts; 298*4882a593Smuzhiyun u32 buff_ptr0; /* Buffer pointer Page 0 */ 299*4882a593Smuzhiyun u32 buff_ptr1; /* Buffer pointer Page 1 */ 300*4882a593Smuzhiyun u32 buff_ptr2; /* Buffer pointer Page 2 */ 301*4882a593Smuzhiyun u32 buff_ptr3; /* Buffer pointer Page 3 */ 302*4882a593Smuzhiyun u32 buff_ptr4; /* Buffer pointer Page 4 */ 303*4882a593Smuzhiyun u32 scratch_ptr; 304*4882a593Smuzhiyun /* 32 bytes */ 305*4882a593Smuzhiyun dma_addr_t td_dma; /* dma address for this td */ 306*4882a593Smuzhiyun struct mv_dtd *next_dtd_virt; 307*4882a593Smuzhiyun }; 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun #endif 310