.. | .. |
---|
1 | | -// SPDX-License-Identifier: GPL-2.0 |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0 */ |
---|
2 | 2 | /* |
---|
3 | 3 | * gadget.h - DesignWare USB3 DRD Gadget Header |
---|
4 | 4 | * |
---|
5 | | - * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com |
---|
| 5 | + * Copyright (C) 2010-2011 Texas Instruments Incorporated - https://www.ti.com |
---|
6 | 6 | * |
---|
7 | 7 | * Authors: Felipe Balbi <balbi@ti.com>, |
---|
8 | 8 | * Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
---|
.. | .. |
---|
17 | 17 | |
---|
18 | 18 | struct dwc3; |
---|
19 | 19 | #define to_dwc3_ep(ep) (container_of(ep, struct dwc3_ep, endpoint)) |
---|
20 | | -#define gadget_to_dwc(g) (container_of(g, struct dwc3, gadget)) |
---|
| 20 | +#define gadget_to_dwc(g) (dev_get_platdata(&g->dev)) |
---|
21 | 21 | |
---|
22 | 22 | /* DEPCFG parameter 1 */ |
---|
23 | 23 | #define DWC3_DEPCFG_INT_NUM(n) (((n) & 0x1f) << 0) |
---|
.. | .. |
---|
48 | 48 | /* DEPXFERCFG parameter 0 */ |
---|
49 | 49 | #define DWC3_DEPXFERCFG_NUM_XFER_RES(n) ((n) & 0xffff) |
---|
50 | 50 | |
---|
| 51 | +/* U1 Device exit Latency */ |
---|
| 52 | +#define DWC3_DEFAULT_U1_DEV_EXIT_LAT 0x0A /* Less then 10 microsec */ |
---|
| 53 | + |
---|
| 54 | +/* U2 Device exit Latency */ |
---|
| 55 | +#define DWC3_DEFAULT_U2_DEV_EXIT_LAT 0x1FF /* Less then 511 microsec */ |
---|
| 56 | + |
---|
| 57 | +/* Frame/Microframe Number Mask */ |
---|
| 58 | +#define DWC3_FRNUMBER_MASK 0x3fff |
---|
51 | 59 | /* -------------------------------------------------------------------------- */ |
---|
52 | 60 | |
---|
53 | 61 | #define to_dwc3_request(r) (container_of(r, struct dwc3_request, request)) |
---|
.. | .. |
---|
62 | 70 | static inline struct dwc3_request *next_request(struct list_head *list) |
---|
63 | 71 | { |
---|
64 | 72 | return list_first_entry_or_null(list, struct dwc3_request, list); |
---|
65 | | -} |
---|
66 | | - |
---|
67 | | -/** |
---|
68 | | - * dwc3_gadget_move_queued_request - move @req to the pending_list |
---|
69 | | - * @req: the request to be moved |
---|
70 | | - * |
---|
71 | | - * Caller should take care of locking. This function will move @req from its |
---|
72 | | - * current list to the endpoint's pending_list. |
---|
73 | | - */ |
---|
74 | | -static inline void dwc3_gadget_move_queued_request(struct dwc3_request *req) |
---|
75 | | -{ |
---|
76 | | - struct dwc3_ep *dep = req->dep; |
---|
77 | | - |
---|
78 | | - req->status = DWC3_REQUEST_STATUS_QUEUED; |
---|
79 | | - list_move_tail(&req->list, &dep->pending_list); |
---|
80 | 73 | } |
---|
81 | 74 | |
---|
82 | 75 | /** |
---|
.. | .. |
---|
97 | 90 | /** |
---|
98 | 91 | * dwc3_gadget_move_cancelled_request - move @req to the cancelled_list |
---|
99 | 92 | * @req: the request to be moved |
---|
| 93 | + * @reason: cancelled reason for the dwc3 request |
---|
100 | 94 | * |
---|
101 | 95 | * Caller should take care of locking. This function will move @req from its |
---|
102 | 96 | * current list to the endpoint's cancelled_list. |
---|
103 | 97 | */ |
---|
104 | | -static inline void dwc3_gadget_move_cancelled_request(struct dwc3_request *req) |
---|
| 98 | +static inline void dwc3_gadget_move_cancelled_request(struct dwc3_request *req, |
---|
| 99 | + unsigned int reason) |
---|
105 | 100 | { |
---|
106 | 101 | struct dwc3_ep *dep = req->dep; |
---|
107 | 102 | |
---|
108 | | - req->status = DWC3_REQUEST_STATUS_CANCELLED; |
---|
| 103 | + req->status = reason; |
---|
109 | 104 | list_move_tail(&req->list, &dep->cancelled_list); |
---|
| 105 | +} |
---|
| 106 | + |
---|
| 107 | +/** |
---|
| 108 | + * dwc3_gadget_move_queued_request - move @req to the pending_list |
---|
| 109 | + * @req: the request to be moved |
---|
| 110 | + * |
---|
| 111 | + * Caller should take care of locking. This function will move @req from its |
---|
| 112 | + * current list to the endpoint's pending_list. |
---|
| 113 | + * |
---|
| 114 | + */ |
---|
| 115 | +static inline void dwc3_gadget_move_queued_request(struct dwc3_request *req) |
---|
| 116 | +{ |
---|
| 117 | + struct dwc3_ep *dep = req->dep; |
---|
| 118 | + |
---|
| 119 | + req->status = DWC3_REQUEST_STATUS_QUEUED; |
---|
| 120 | + list_move_tail(&req->list, &dep->pending_list); |
---|
110 | 121 | } |
---|
111 | 122 | |
---|
112 | 123 | void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, |
---|
.. | .. |
---|
115 | 126 | void dwc3_ep0_interrupt(struct dwc3 *dwc, |
---|
116 | 127 | const struct dwc3_event_depevt *event); |
---|
117 | 128 | void dwc3_ep0_out_start(struct dwc3 *dwc); |
---|
| 129 | +void dwc3_ep0_end_control_data(struct dwc3 *dwc, struct dwc3_ep *dep); |
---|
| 130 | +void dwc3_ep0_stall_and_restart(struct dwc3 *dwc); |
---|
118 | 131 | int __dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value); |
---|
119 | 132 | int dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value); |
---|
120 | 133 | int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, |
---|
121 | 134 | gfp_t gfp_flags); |
---|
122 | 135 | int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol); |
---|
| 136 | +void dwc3_ep0_send_delayed_status(struct dwc3 *dwc); |
---|
| 137 | +void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, bool interrupt); |
---|
123 | 138 | |
---|
124 | 139 | /** |
---|
125 | 140 | * dwc3_gadget_ep_get_transfer_index - Gets transfer index from HW |
---|
.. | .. |
---|
136 | 151 | dep->resource_index = DWC3_DEPCMD_GET_RSC_IDX(res_id); |
---|
137 | 152 | } |
---|
138 | 153 | |
---|
| 154 | +/** |
---|
| 155 | + * dwc3_gadget_dctl_write_safe - write to DCTL safe from link state change |
---|
| 156 | + * @dwc: pointer to our context structure |
---|
| 157 | + * @value: value to write to DCTL |
---|
| 158 | + * |
---|
| 159 | + * Use this function when doing read-modify-write to DCTL. It will not |
---|
| 160 | + * send link state change request. |
---|
| 161 | + */ |
---|
| 162 | +static inline void dwc3_gadget_dctl_write_safe(struct dwc3 *dwc, u32 value) |
---|
| 163 | +{ |
---|
| 164 | + value &= ~DWC3_DCTL_ULSTCHNGREQ_MASK; |
---|
| 165 | + dwc3_writel(dwc->regs, DWC3_DCTL, value); |
---|
| 166 | +} |
---|
| 167 | + |
---|
139 | 168 | #endif /* __DRIVERS_USB_DWC3_GADGET_H */ |
---|