linux/drivers/usb/gadget/udc/mv_u3d.h
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (C) 2011 Marvell International Ltd. All rights reserved.
   4 */
   5
   6#ifndef __MV_U3D_H
   7#define __MV_U3D_H
   8
   9#define MV_U3D_EP_CONTEXT_ALIGNMENT     32
  10#define MV_U3D_TRB_ALIGNMENT    16
  11#define MV_U3D_DMA_BOUNDARY     4096
  12#define MV_U3D_EP0_MAX_PKT_SIZE 512
  13
  14/* ep0 transfer state */
  15#define MV_U3D_WAIT_FOR_SETUP           0
  16#define MV_U3D_DATA_STATE_XMIT          1
  17#define MV_U3D_DATA_STATE_NEED_ZLP      2
  18#define MV_U3D_WAIT_FOR_OUT_STATUS      3
  19#define MV_U3D_DATA_STATE_RECV          4
  20#define MV_U3D_STATUS_STAGE             5
  21
  22#define MV_U3D_EP_MAX_LENGTH_TRANSFER   0x10000
  23
  24/* USB3 Interrupt Status */
  25#define MV_U3D_USBINT_SETUP             0x00000001
  26#define MV_U3D_USBINT_RX_COMPLETE       0x00000002
  27#define MV_U3D_USBINT_TX_COMPLETE       0x00000004
  28#define MV_U3D_USBINT_UNDER_RUN 0x00000008
  29#define MV_U3D_USBINT_RXDESC_ERR        0x00000010
  30#define MV_U3D_USBINT_TXDESC_ERR        0x00000020
  31#define MV_U3D_USBINT_RX_TRB_COMPLETE   0x00000040
  32#define MV_U3D_USBINT_TX_TRB_COMPLETE   0x00000080
  33#define MV_U3D_USBINT_VBUS_VALID        0x00010000
  34#define MV_U3D_USBINT_STORAGE_CMD_FULL  0x00020000
  35#define MV_U3D_USBINT_LINK_CHG          0x01000000
  36
  37/* USB3 Interrupt Enable */
  38#define MV_U3D_INTR_ENABLE_SETUP                0x00000001
  39#define MV_U3D_INTR_ENABLE_RX_COMPLETE          0x00000002
  40#define MV_U3D_INTR_ENABLE_TX_COMPLETE          0x00000004
  41#define MV_U3D_INTR_ENABLE_UNDER_RUN            0x00000008
  42#define MV_U3D_INTR_ENABLE_RXDESC_ERR           0x00000010
  43#define MV_U3D_INTR_ENABLE_TXDESC_ERR           0x00000020
  44#define MV_U3D_INTR_ENABLE_RX_TRB_COMPLETE      0x00000040
  45#define MV_U3D_INTR_ENABLE_TX_TRB_COMPLETE      0x00000080
  46#define MV_U3D_INTR_ENABLE_RX_BUFFER_ERR        0x00000100
  47#define MV_U3D_INTR_ENABLE_VBUS_VALID           0x00010000
  48#define MV_U3D_INTR_ENABLE_STORAGE_CMD_FULL     0x00020000
  49#define MV_U3D_INTR_ENABLE_LINK_CHG             0x01000000
  50#define MV_U3D_INTR_ENABLE_PRIME_STATUS 0x02000000
  51
  52/* USB3 Link Change */
  53#define MV_U3D_LINK_CHANGE_LINK_UP              0x00000001
  54#define MV_U3D_LINK_CHANGE_SUSPEND              0x00000002
  55#define MV_U3D_LINK_CHANGE_RESUME               0x00000004
  56#define MV_U3D_LINK_CHANGE_WRESET               0x00000008
  57#define MV_U3D_LINK_CHANGE_HRESET               0x00000010
  58#define MV_U3D_LINK_CHANGE_VBUS_INVALID 0x00000020
  59#define MV_U3D_LINK_CHANGE_INACT                0x00000040
  60#define MV_U3D_LINK_CHANGE_DISABLE_AFTER_U0     0x00000080
  61#define MV_U3D_LINK_CHANGE_U1                   0x00000100
  62#define MV_U3D_LINK_CHANGE_U2                   0x00000200
  63#define MV_U3D_LINK_CHANGE_U3                   0x00000400
  64
  65/* bridge setting */
  66#define MV_U3D_BRIDGE_SETTING_VBUS_VALID        (1 << 16)
  67
  68/* Command Register Bit Masks */
  69#define MV_U3D_CMD_RUN_STOP             0x00000001
  70#define MV_U3D_CMD_CTRL_RESET           0x00000002
  71
  72/* ep control register */
  73#define MV_U3D_EPXCR_EP_TYPE_CONTROL            0
  74#define MV_U3D_EPXCR_EP_TYPE_ISOC               1
  75#define MV_U3D_EPXCR_EP_TYPE_BULK               2
  76#define MV_U3D_EPXCR_EP_TYPE_INT                3
  77#define MV_U3D_EPXCR_EP_ENABLE_SHIFT            4
  78#define MV_U3D_EPXCR_MAX_BURST_SIZE_SHIFT       12
  79#define MV_U3D_EPXCR_MAX_PACKET_SIZE_SHIFT      16
  80#define MV_U3D_USB_BULK_BURST_OUT               6
  81#define MV_U3D_USB_BULK_BURST_IN                14
  82
  83#define MV_U3D_EPXCR_EP_FLUSH           (1 << 7)
  84#define MV_U3D_EPXCR_EP_HALT            (1 << 1)
  85#define MV_U3D_EPXCR_EP_INIT            (1)
  86
  87/* TX/RX Status Register */
  88#define MV_U3D_XFERSTATUS_COMPLETE_SHIFT        24
  89#define MV_U3D_COMPLETE_INVALID 0
  90#define MV_U3D_COMPLETE_SUCCESS 1
  91#define MV_U3D_COMPLETE_BUFF_ERR        2
  92#define MV_U3D_COMPLETE_SHORT_PACKET    3
  93#define MV_U3D_COMPLETE_TRB_ERR 5
  94#define MV_U3D_XFERSTATUS_TRB_LENGTH_MASK       (0xFFFFFF)
  95
  96#define MV_U3D_USB_LINK_BYPASS_VBUS     0x8
  97
  98#define MV_U3D_LTSSM_PHY_INIT_DONE              0x80000000
  99#define MV_U3D_LTSSM_NEVER_GO_COMPLIANCE        0x40000000
 100
 101#define MV_U3D_USB3_OP_REGS_OFFSET      0x100
 102#define MV_U3D_USB3_PHY_OFFSET          0xB800
 103
 104#define DCS_ENABLE      0x1
 105
 106/* timeout */
 107#define MV_U3D_RESET_TIMEOUT            10000
 108#define MV_U3D_FLUSH_TIMEOUT            100000
 109#define MV_U3D_OWN_TIMEOUT              10000
 110#define LOOPS_USEC_SHIFT        4
 111#define LOOPS_USEC              (1 << LOOPS_USEC_SHIFT)
 112#define LOOPS(timeout)          ((timeout) >> LOOPS_USEC_SHIFT)
 113
 114/* ep direction */
 115#define MV_U3D_EP_DIR_IN                1
 116#define MV_U3D_EP_DIR_OUT               0
 117#define mv_u3d_ep_dir(ep)       (((ep)->ep_num == 0) ? \
 118                                ((ep)->u3d->ep0_dir) : ((ep)->direction))
 119
 120/* usb capability registers */
 121struct mv_u3d_cap_regs {
 122        u32     rsvd[5];
 123        u32     dboff;  /* doorbell register offset */
 124        u32     rtsoff; /* runtime register offset */
 125        u32     vuoff;  /* vendor unique register offset */
 126};
 127
 128/* operation registers */
 129struct mv_u3d_op_regs {
 130        u32     usbcmd;         /* Command register */
 131        u32     rsvd1[11];
 132        u32     dcbaapl;        /* Device Context Base Address low register */
 133        u32     dcbaaph;        /* Device Context Base Address high register */
 134        u32     rsvd2[243];
 135        u32     portsc;         /* port status and control register*/
 136        u32     portlinkinfo;   /* port link info register*/
 137        u32     rsvd3[9917];
 138        u32     doorbell;       /* doorbell register */
 139};
 140
 141/* control endpoint enable registers */
 142struct epxcr {
 143        u32     epxoutcr0;      /* ep out control 0 register */
 144        u32     epxoutcr1;      /* ep out control 1 register */
 145        u32     epxincr0;       /* ep in control 0 register */
 146        u32     epxincr1;       /* ep in control 1 register */
 147};
 148
 149/* transfer status registers */
 150struct xferstatus {
 151        u32     curdeqlo;       /* current TRB pointer low */
 152        u32     curdeqhi;       /* current TRB pointer high */
 153        u32     statuslo;       /* transfer status low */
 154        u32     statushi;       /* transfer status high */
 155};
 156
 157/* vendor unique control registers */
 158struct mv_u3d_vuc_regs {
 159        u32     ctrlepenable;   /* control endpoint enable register */
 160        u32     setuplock;      /* setup lock register */
 161        u32     endcomplete;    /* endpoint transfer complete register */
 162        u32     intrcause;      /* interrupt cause register */
 163        u32     intrenable;     /* interrupt enable register */
 164        u32     trbcomplete;    /* TRB complete register */
 165        u32     linkchange;     /* link change register */
 166        u32     rsvd1[5];
 167        u32     trbunderrun;    /* TRB underrun register */
 168        u32     rsvd2[43];
 169        u32     bridgesetting;  /* bridge setting register */
 170        u32     rsvd3[7];
 171        struct xferstatus       txst[16];       /* TX status register */
 172        struct xferstatus       rxst[16];       /* RX status register */
 173        u32     ltssm;          /* LTSSM control register */
 174        u32     pipe;           /* PIPE control register */
 175        u32     linkcr0;        /* link control 0 register */
 176        u32     linkcr1;        /* link control 1 register */
 177        u32     rsvd6[60];
 178        u32     mib0;           /* MIB0 counter register */
 179        u32     usblink;        /* usb link control register */
 180        u32     ltssmstate;     /* LTSSM state register */
 181        u32     linkerrorcause; /* link error cause register */
 182        u32     rsvd7[60];
 183        u32     devaddrtiebrkr; /* device address and tie breaker */
 184        u32     itpinfo0;       /* ITP info 0 register */
 185        u32     itpinfo1;       /* ITP info 1 register */
 186        u32     rsvd8[61];
 187        struct epxcr    epcr[16];       /* ep control register */
 188        u32     rsvd9[64];
 189        u32     phyaddr;        /* PHY address register */
 190        u32     phydata;        /* PHY data register */
 191};
 192
 193/* Endpoint context structure */
 194struct mv_u3d_ep_context {
 195        u32     rsvd0;
 196        u32     rsvd1;
 197        u32     trb_addr_lo;            /* TRB address low 32 bit */
 198        u32     trb_addr_hi;            /* TRB address high 32 bit */
 199        u32     rsvd2;
 200        u32     rsvd3;
 201        struct usb_ctrlrequest setup_buffer;    /* setup data buffer */
 202};
 203
 204/* TRB control data structure */
 205struct mv_u3d_trb_ctrl {
 206        u32     own:1;          /* owner of TRB */
 207        u32     rsvd1:3;
 208        u32     chain:1;        /* associate this TRB with the
 209                                next TRB on the Ring */
 210        u32     ioc:1;          /* interrupt on complete */
 211        u32     rsvd2:4;
 212        u32     type:6;         /* TRB type */
 213#define TYPE_NORMAL     1
 214#define TYPE_DATA       3
 215#define TYPE_LINK       6
 216        u32     dir:1;          /* Working at data stage of control endpoint
 217                                operation. 0 is OUT and 1 is IN. */
 218        u32     rsvd3:15;
 219};
 220
 221/* TRB data structure
 222 * For multiple TRB, all the TRBs' physical address should be continuous.
 223 */
 224struct mv_u3d_trb_hw {
 225        u32     buf_addr_lo;    /* data buffer address low 32 bit */
 226        u32     buf_addr_hi;    /* data buffer address high 32 bit */
 227        u32     trb_len;        /* transfer length */
 228        struct mv_u3d_trb_ctrl  ctrl;   /* TRB control data */
 229};
 230
 231/* TRB structure */
 232struct mv_u3d_trb {
 233        struct mv_u3d_trb_hw *trb_hw;   /* point to the trb_hw structure */
 234        dma_addr_t trb_dma;             /* dma address for this trb_hw */
 235        struct list_head trb_list;      /* trb list */
 236};
 237
 238/* device data structure */
 239struct mv_u3d {
 240        struct usb_gadget               gadget;
 241        struct usb_gadget_driver        *driver;
 242        spinlock_t                      lock;   /* device lock */
 243        struct completion               *done;
 244        struct device                   *dev;
 245        int                             irq;
 246
 247        /* usb controller registers */
 248        struct mv_u3d_cap_regs __iomem  *cap_regs;
 249        struct mv_u3d_op_regs __iomem   *op_regs;
 250        struct mv_u3d_vuc_regs __iomem  *vuc_regs;
 251        void __iomem                    *phy_regs;
 252
 253        unsigned int                    max_eps;
 254        struct mv_u3d_ep_context        *ep_context;
 255        size_t                          ep_context_size;
 256        dma_addr_t                      ep_context_dma;
 257
 258        struct dma_pool                 *trb_pool; /* for TRB data structure */
 259        struct mv_u3d_ep                *eps;
 260
 261        struct mv_u3d_req               *status_req; /* ep0 status request */
 262        struct usb_ctrlrequest          local_setup_buff; /* store setup data*/
 263
 264        unsigned int            resume_state;   /* USB state to resume */
 265        unsigned int            usb_state;      /* USB current state */
 266        unsigned int            ep0_state;      /* Endpoint zero state */
 267        unsigned int            ep0_dir;
 268
 269        unsigned int            dev_addr;       /* device address */
 270
 271        unsigned int            errors;
 272
 273        unsigned                softconnect:1;
 274        unsigned                vbus_active:1;  /* vbus is active or not */
 275        unsigned                remote_wakeup:1; /* support remote wakeup */
 276        unsigned                clock_gating:1; /* clock gating or not */
 277        unsigned                active:1;       /* udc is active or not */
 278        unsigned                vbus_valid_detect:1; /* udc vbus detection */
 279
 280        struct mv_usb_addon_irq *vbus;
 281        unsigned int            power;
 282
 283        struct clk              *clk;
 284};
 285
 286/* endpoint data structure */
 287struct mv_u3d_ep {
 288        struct usb_ep           ep;
 289        struct mv_u3d           *u3d;
 290        struct list_head        queue;  /* ep request queued hardware */
 291        struct list_head        req_list; /* list of ep request */
 292        struct mv_u3d_ep_context        *ep_context; /* ep context */
 293        u32                     direction;
 294        char                    name[14];
 295        u32                     processing; /* there is ep request
 296                                                queued on haredware */
 297        spinlock_t              req_lock; /* ep lock */
 298        unsigned                wedge:1;
 299        unsigned                enabled:1;
 300        unsigned                ep_type:2;
 301        unsigned                ep_num:8;
 302};
 303
 304/* request data structure */
 305struct mv_u3d_req {
 306        struct usb_request      req;
 307        struct mv_u3d_ep        *ep;
 308        struct list_head        queue;  /* ep requst queued on hardware */
 309        struct list_head        list;   /* ep request list */
 310        struct list_head        trb_list; /* trb list of a request */
 311
 312        struct mv_u3d_trb       *trb_head; /* point to first trb of a request */
 313        unsigned                trb_count; /* TRB number in the chain */
 314        unsigned                chain;     /* TRB chain or not */
 315};
 316
 317#endif
 318