Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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 */