linux/drivers/usb/dwc3/gadget.h
<<
>>
Prefs
   1/**
   2 * gadget.h - DesignWare USB3 DRD Gadget Header
   3 *
   4 * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com
   5 *
   6 * Authors: Felipe Balbi <balbi@ti.com>,
   7 *          Sebastian Andrzej Siewior <bigeasy@linutronix.de>
   8 *
   9 * Redistribution and use in source and binary forms, with or without
  10 * modification, are permitted provided that the following conditions
  11 * are met:
  12 * 1. Redistributions of source code must retain the above copyright
  13 *    notice, this list of conditions, and the following disclaimer,
  14 *    without modification.
  15 * 2. Redistributions in binary form must reproduce the above copyright
  16 *    notice, this list of conditions and the following disclaimer in the
  17 *    documentation and/or other materials provided with the distribution.
  18 * 3. The names of the above-listed copyright holders may not be used
  19 *    to endorse or promote products derived from this software without
  20 *    specific prior written permission.
  21 *
  22 * ALTERNATIVELY, this software may be distributed under the terms of the
  23 * GNU General Public License ("GPL") version 2, as published by the Free
  24 * Software Foundation.
  25 *
  26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  27 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  28 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  30 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  31 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  32 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  33 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  34 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  35 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  36 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  37 */
  38
  39#ifndef __DRIVERS_USB_DWC3_GADGET_H
  40#define __DRIVERS_USB_DWC3_GADGET_H
  41
  42#include <linux/list.h>
  43#include <linux/usb/gadget.h>
  44#include "io.h"
  45
  46struct dwc3;
  47#define to_dwc3_ep(ep)          (container_of(ep, struct dwc3_ep, endpoint))
  48#define gadget_to_dwc(g)        (container_of(g, struct dwc3, gadget))
  49
  50/* DEPCFG parameter 1 */
  51#define DWC3_DEPCFG_INT_NUM(n)          ((n) << 0)
  52#define DWC3_DEPCFG_XFER_COMPLETE_EN    (1 << 8)
  53#define DWC3_DEPCFG_XFER_IN_PROGRESS_EN (1 << 9)
  54#define DWC3_DEPCFG_XFER_NOT_READY_EN   (1 << 10)
  55#define DWC3_DEPCFG_FIFO_ERROR_EN       (1 << 11)
  56#define DWC3_DEPCFG_STREAM_EVENT_EN     (1 << 13)
  57#define DWC3_DEPCFG_BINTERVAL_M1(n)     ((n) << 16)
  58#define DWC3_DEPCFG_STREAM_CAPABLE      (1 << 24)
  59#define DWC3_DEPCFG_EP_NUMBER(n)        ((n) << 25)
  60#define DWC3_DEPCFG_BULK_BASED          (1 << 30)
  61#define DWC3_DEPCFG_FIFO_BASED          (1 << 31)
  62
  63/* DEPCFG parameter 0 */
  64#define DWC3_DEPCFG_EP_TYPE(n)          ((n) << 1)
  65#define DWC3_DEPCFG_MAX_PACKET_SIZE(n)  ((n) << 3)
  66#define DWC3_DEPCFG_FIFO_NUMBER(n)      ((n) << 17)
  67#define DWC3_DEPCFG_BURST_SIZE(n)       ((n) << 22)
  68#define DWC3_DEPCFG_DATA_SEQ_NUM(n)     ((n) << 26)
  69/* This applies for core versions earlier than 1.94a */
  70#define DWC3_DEPCFG_IGN_SEQ_NUM         (1 << 31)
  71/* These apply for core versions 1.94a and later */
  72#define DWC3_DEPCFG_ACTION_INIT         (0 << 30)
  73#define DWC3_DEPCFG_ACTION_RESTORE      (1 << 30)
  74#define DWC3_DEPCFG_ACTION_MODIFY       (2 << 30)
  75
  76/* DEPXFERCFG parameter 0 */
  77#define DWC3_DEPXFERCFG_NUM_XFER_RES(n) ((n) & 0xffff)
  78
  79struct dwc3_gadget_ep_cmd_params {
  80        u32     param2;
  81        u32     param1;
  82        u32     param0;
  83};
  84
  85/* -------------------------------------------------------------------------- */
  86
  87#define to_dwc3_request(r)      (container_of(r, struct dwc3_request, request))
  88
  89static inline struct dwc3_request *next_request(struct list_head *list)
  90{
  91        if (list_empty(list))
  92                return NULL;
  93
  94        return list_first_entry(list, struct dwc3_request, list);
  95}
  96
  97static inline void dwc3_gadget_move_request_queued(struct dwc3_request *req)
  98{
  99        struct dwc3_ep          *dep = req->dep;
 100
 101        req->queued = true;
 102        list_move_tail(&req->list, &dep->req_queued);
 103}
 104
 105void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
 106                int status);
 107
 108int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode);
 109int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state);
 110
 111void dwc3_ep0_interrupt(struct dwc3 *dwc,
 112                const struct dwc3_event_depevt *event);
 113void dwc3_ep0_out_start(struct dwc3 *dwc);
 114int dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value);
 115int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request,
 116                gfp_t gfp_flags);
 117int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value);
 118int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep,
 119                unsigned cmd, struct dwc3_gadget_ep_cmd_params *params);
 120int dwc3_send_gadget_generic_command(struct dwc3 *dwc, int cmd, u32 param);
 121
 122/**
 123 * dwc3_gadget_ep_get_transfer_index - Gets transfer index from HW
 124 * @dwc: DesignWare USB3 Pointer
 125 * @number: DWC endpoint number
 126 *
 127 * Caller should take care of locking
 128 */
 129static inline u32 dwc3_gadget_ep_get_transfer_index(struct dwc3 *dwc, u8 number)
 130{
 131        u32                     res_id;
 132
 133        res_id = dwc3_readl(dwc->regs, DWC3_DEPCMD(number));
 134
 135        return DWC3_DEPCMD_GET_RSC_IDX(res_id);
 136}
 137
 138/**
 139 * dwc3_gadget_event_string - returns event name
 140 * @event: the event code
 141 */
 142static inline const char *dwc3_gadget_event_string(u8 event)
 143{
 144        switch (event) {
 145        case DWC3_DEVICE_EVENT_DISCONNECT:
 146                return "Disconnect";
 147        case DWC3_DEVICE_EVENT_RESET:
 148                return "Reset";
 149        case DWC3_DEVICE_EVENT_CONNECT_DONE:
 150                return "Connection Done";
 151        case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
 152                return "Link Status Change";
 153        case DWC3_DEVICE_EVENT_WAKEUP:
 154                return "WakeUp";
 155        case DWC3_DEVICE_EVENT_EOPF:
 156                return "End-Of-Frame";
 157        case DWC3_DEVICE_EVENT_SOF:
 158                return "Start-Of-Frame";
 159        case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
 160                return "Erratic Error";
 161        case DWC3_DEVICE_EVENT_CMD_CMPL:
 162                return "Command Complete";
 163        case DWC3_DEVICE_EVENT_OVERFLOW:
 164                return "Overflow";
 165        }
 166
 167        return "UNKNOWN";
 168}
 169
 170/**
 171 * dwc3_ep_event_string - returns event name
 172 * @event: then event code
 173 */
 174static inline const char *dwc3_ep_event_string(u8 event)
 175{
 176        switch (event) {
 177        case DWC3_DEPEVT_XFERCOMPLETE:
 178                return "Transfer Complete";
 179        case DWC3_DEPEVT_XFERINPROGRESS:
 180                return "Transfer In-Progress";
 181        case DWC3_DEPEVT_XFERNOTREADY:
 182                return "Transfer Not Ready";
 183        case DWC3_DEPEVT_RXTXFIFOEVT:
 184                return "FIFO";
 185        case DWC3_DEPEVT_STREAMEVT:
 186                return "Stream";
 187        case DWC3_DEPEVT_EPCMDCMPLT:
 188                return "Endpoint Command Complete";
 189        }
 190
 191        return "UNKNOWN";
 192}
 193
 194#endif /* __DRIVERS_USB_DWC3_GADGET_H */
 195