| .. | .. |
|---|
| 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 */ |
|---|