1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * MUSB OTG driver peripheral defines
4 *
5 * Copyright 2005 Mentor Graphics Corporation
6 * Copyright (C) 2005-2006 by Texas Instruments
7 * Copyright (C) 2006-2007 Nokia Corporation
8 */
9
10#ifndef __MUSB_GADGET_H
11#define __MUSB_GADGET_H
12
13#include <linux/list.h>
14
15#if IS_ENABLED(CONFIG_USB_MUSB_GADGET) || IS_ENABLED(CONFIG_USB_MUSB_DUAL_ROLE)
16extern irqreturn_t musb_g_ep0_irq(struct musb *);
17extern void musb_g_tx(struct musb *, u8);
18extern void musb_g_rx(struct musb *, u8);
19extern void musb_g_reset(struct musb *);
20extern void musb_g_suspend(struct musb *);
21extern void musb_g_resume(struct musb *);
22extern void musb_g_wakeup(struct musb *);
23extern void musb_g_disconnect(struct musb *);
24extern void musb_gadget_cleanup(struct musb *);
25extern int musb_gadget_setup(struct musb *);
26
27#else
28static inline irqreturn_t musb_g_ep0_irq(struct musb *musb)
29{
30	return 0;
31}
32
33static inline void musb_g_tx(struct musb *musb, u8 epnum)	{}
34static inline void musb_g_rx(struct musb *musb, u8 epnum)	{}
35static inline void musb_g_reset(struct musb *musb)		{}
36static inline void musb_g_suspend(struct musb *musb)		{}
37static inline void musb_g_resume(struct musb *musb)		{}
38static inline void musb_g_wakeup(struct musb *musb)		{}
39static inline void musb_g_disconnect(struct musb *musb)		{}
40static inline void musb_gadget_cleanup(struct musb *musb)	{}
41static inline int musb_gadget_setup(struct musb *musb)
42{
43	return 0;
44}
45#endif
46
47enum buffer_map_state {
48	UN_MAPPED = 0,
49	PRE_MAPPED,
50	MUSB_MAPPED
51};
52
53struct musb_request {
54	struct usb_request	request;
55	struct list_head	list;
56	struct musb_ep		*ep;
57	struct musb		*musb;
58	u8 tx;			/* endpoint direction */
59	u8 epnum;
60	enum buffer_map_state map_state;
61};
62
63#define to_musb_request(r)	container_of((r), struct musb_request, request)
64
65extern struct usb_request *
66musb_alloc_request(struct usb_ep *ep, gfp_t gfp_flags);
67extern void musb_free_request(struct usb_ep *ep, struct usb_request *req);
68
69
70/*
71 * struct musb_ep - peripheral side view of endpoint rx or tx side
72 */
73struct musb_ep {
74	/* stuff towards the head is basically write-once. */
75	struct usb_ep			end_point;
76	char				name[12];
77	struct musb_hw_ep		*hw_ep;
78	struct musb			*musb;
79	u8				current_epnum;
80
81	/* ... when enabled/disabled ... */
82	u8				type;
83	u8				is_in;
84	u16				packet_sz;
85	const struct usb_endpoint_descriptor	*desc;
86	struct dma_channel		*dma;
87
88	/* later things are modified based on usage */
89	struct list_head		req_list;
90
91	u8				wedged;
92
93	/* true if lock must be dropped but req_list may not be advanced */
94	u8				busy;
95
96	u8				hb_mult;
97};
98
99#define to_musb_ep(ep)	container_of((ep), struct musb_ep, end_point)
100
101static inline struct musb_request *next_request(struct musb_ep *ep)
102{
103	struct list_head	*queue = &ep->req_list;
104
105	if (list_empty(queue))
106		return NULL;
107	return container_of(queue->next, struct musb_request, list);
108}
109
110extern const struct usb_ep_ops musb_g_ep0_ops;
111
112extern void musb_g_giveback(struct musb_ep *, struct usb_request *, int);
113
114extern void musb_ep_restart(struct musb *, struct musb_request *);
115
116#endif		/* __MUSB_GADGET_H */
117