^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * gadget.h - DesignWare USB3 DRD Gadget Header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2010-2011 Texas Instruments Incorporated - https://www.ti.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Authors: Felipe Balbi <balbi@ti.com>,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Sebastian Andrzej Siewior <bigeasy@linutronix.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #ifndef __DRIVERS_USB_DWC3_GADGET_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define __DRIVERS_USB_DWC3_GADGET_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/usb/gadget.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include "io.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) struct dwc3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define to_dwc3_ep(ep) (container_of(ep, struct dwc3_ep, endpoint))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define gadget_to_dwc(g) (dev_get_platdata(&g->dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /* DEPCFG parameter 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define DWC3_DEPCFG_INT_NUM(n) (((n) & 0x1f) << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define DWC3_DEPCFG_XFER_COMPLETE_EN BIT(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define DWC3_DEPCFG_XFER_IN_PROGRESS_EN BIT(9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define DWC3_DEPCFG_XFER_NOT_READY_EN BIT(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define DWC3_DEPCFG_FIFO_ERROR_EN BIT(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define DWC3_DEPCFG_STREAM_EVENT_EN BIT(13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define DWC3_DEPCFG_BINTERVAL_M1(n) (((n) & 0xff) << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define DWC3_DEPCFG_STREAM_CAPABLE BIT(24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define DWC3_DEPCFG_EP_NUMBER(n) (((n) & 0x1f) << 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define DWC3_DEPCFG_BULK_BASED BIT(30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define DWC3_DEPCFG_FIFO_BASED BIT(31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /* DEPCFG parameter 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define DWC3_DEPCFG_EP_TYPE(n) (((n) & 0x3) << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define DWC3_DEPCFG_MAX_PACKET_SIZE(n) (((n) & 0x7ff) << 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define DWC3_DEPCFG_FIFO_NUMBER(n) (((n) & 0x1f) << 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define DWC3_DEPCFG_BURST_SIZE(n) (((n) & 0xf) << 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define DWC3_DEPCFG_DATA_SEQ_NUM(n) ((n) << 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) /* This applies for core versions earlier than 1.94a */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define DWC3_DEPCFG_IGN_SEQ_NUM BIT(31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) /* These apply for core versions 1.94a and later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define DWC3_DEPCFG_ACTION_INIT (0 << 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define DWC3_DEPCFG_ACTION_RESTORE BIT(30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define DWC3_DEPCFG_ACTION_MODIFY (2 << 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) /* DEPXFERCFG parameter 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define DWC3_DEPXFERCFG_NUM_XFER_RES(n) ((n) & 0xffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) /* U1 Device exit Latency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define DWC3_DEFAULT_U1_DEV_EXIT_LAT 0x0A /* Less then 10 microsec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) /* U2 Device exit Latency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define DWC3_DEFAULT_U2_DEV_EXIT_LAT 0x1FF /* Less then 511 microsec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) /* Frame/Microframe Number Mask */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define DWC3_FRNUMBER_MASK 0x3fff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /* -------------------------------------------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define to_dwc3_request(r) (container_of(r, struct dwc3_request, request))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * next_request - gets the next request on the given list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * @list: the request list to operate on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * Caller should take care of locking. This function return %NULL or the first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * request available on @list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) static inline struct dwc3_request *next_request(struct list_head *list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) return list_first_entry_or_null(list, struct dwc3_request, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * dwc3_gadget_move_started_request - move @req to the started_list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * @req: the request to be moved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) * Caller should take care of locking. This function will move @req from its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) * current list to the endpoint's started_list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) static inline void dwc3_gadget_move_started_request(struct dwc3_request *req)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) struct dwc3_ep *dep = req->dep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) req->status = DWC3_REQUEST_STATUS_STARTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) list_move_tail(&req->list, &dep->started_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) * dwc3_gadget_move_cancelled_request - move @req to the cancelled_list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) * @req: the request to be moved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) * @reason: cancelled reason for the dwc3 request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) * Caller should take care of locking. This function will move @req from its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * current list to the endpoint's cancelled_list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) static inline void dwc3_gadget_move_cancelled_request(struct dwc3_request *req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) unsigned int reason)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) struct dwc3_ep *dep = req->dep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) req->status = reason;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) list_move_tail(&req->list, &dep->cancelled_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) * dwc3_gadget_move_queued_request - move @req to the pending_list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) * @req: the request to be moved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) * Caller should take care of locking. This function will move @req from its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) * current list to the endpoint's pending_list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) static inline void dwc3_gadget_move_queued_request(struct dwc3_request *req)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) struct dwc3_ep *dep = req->dep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) req->status = DWC3_REQUEST_STATUS_QUEUED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) list_move_tail(&req->list, &dep->pending_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) int status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) void dwc3_ep0_interrupt(struct dwc3 *dwc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) const struct dwc3_event_depevt *event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) void dwc3_ep0_out_start(struct dwc3 *dwc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) void dwc3_ep0_end_control_data(struct dwc3 *dwc, struct dwc3_ep *dep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) void dwc3_ep0_stall_and_restart(struct dwc3 *dwc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) int __dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) int dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) gfp_t gfp_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) void dwc3_ep0_send_delayed_status(struct dwc3 *dwc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, bool interrupt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) * dwc3_gadget_ep_get_transfer_index - Gets transfer index from HW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) * @dep: dwc3 endpoint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) * Caller should take care of locking. Returns the transfer resource
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) * index for a given endpoint.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) static inline void dwc3_gadget_ep_get_transfer_index(struct dwc3_ep *dep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) u32 res_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) res_id = dwc3_readl(dep->regs, DWC3_DEPCMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) dep->resource_index = DWC3_DEPCMD_GET_RSC_IDX(res_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) * dwc3_gadget_dctl_write_safe - write to DCTL safe from link state change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) * @dwc: pointer to our context structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) * @value: value to write to DCTL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) * Use this function when doing read-modify-write to DCTL. It will not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) * send link state change request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) static inline void dwc3_gadget_dctl_write_safe(struct dwc3 *dwc, u32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) value &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) dwc3_writel(dwc->regs, DWC3_DCTL, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #endif /* __DRIVERS_USB_DWC3_GADGET_H */