1/*	$NetBSD: dwc2.h,v 1.12 2022/03/18 23:32:59 riastradh Exp $	*/
2
3/*-
4 * Copyright (c) 2013 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Nick Hudson
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#ifndef _EXTERNAL_BSD_DWC2_DWC2_H_
33#define _EXTERNAL_BSD_DWC2_DWC2_H_
34
35#include <sys/param.h>
36
37#include <sys/callout.h>
38#include <sys/kernel.h>
39#include <sys/proc.h>
40#include <sys/workqueue.h>
41
42#include <linux/list.h>
43#include <linux/workqueue.h>
44#include <linux/bug.h>
45
46#include "opt_usb.h"
47// #define VERBOSE_DEBUG
48// #define DWC2_DUMP_FRREM
49// #define CONFIG_USB_DWC2_TRACK_MISSED_SOFS
50
51#define CONFIG_USB_DWC2_HOST		1
52#define CONFIG_USB_DWC2_DUAL_ROLE	0
53#define CONFIG_USB_DWC2_PERIPHERAL	0
54
55typedef int irqreturn_t;
56#define	IRQ_NONE 0
57#define IRQ_HANDLED 1
58
59#define	u8	uint8_t
60#define	u16	uint16_t
61#define	s16	int16_t
62#define	u32	uint32_t
63#define	u64	uint64_t
64
65#define	dma_addr_t	bus_addr_t
66
67#define DWC2_READ_4(hsotg, reg) \
68    bus_space_read_4((hsotg)->hsotg_sc->sc_iot, (hsotg)->hsotg_sc->sc_ioh, (reg))
69#define DWC2_WRITE_4(hsotg, reg, data)  \
70    bus_space_write_4((hsotg)->hsotg_sc->sc_iot, (hsotg)->hsotg_sc->sc_ioh, (reg), (data));
71
72#ifdef DWC2_DEBUG
73extern int dwc2debug;
74
75#define	dev_info(d,fmt,...) do {			\
76	printf("%s: " fmt, device_xname(d), 		\
77	    ## __VA_ARGS__);				\
78} while (0)
79#define	dev_warn(d,fmt,...) do {			\
80	printf("%s: " fmt, device_xname(d), 		\
81	    ## __VA_ARGS__);				\
82} while (0)
83#define	dev_err(d,fmt,...) do {				\
84	printf("%s: " fmt, device_xname(d), 		\
85	    ## __VA_ARGS__);				\
86} while (0)
87#define	dev_dbg(d,fmt,...) do {				\
88	if (dwc2debug >= 1) {				\
89	    printf("%s: " fmt, device_xname(d), 	\
90		    ## __VA_ARGS__);			\
91	}						\
92} while (0)
93#define	dev_vdbg(d,fmt,...) do {			\
94	if (dwc2debug >= 2) {				\
95	    printf("%s: " fmt, device_xname(d), 	\
96		    ## __VA_ARGS__);			\
97	}						\
98} while (0)
99#else
100#define	dev_info(...) do { } while (0)
101#define	dev_warn(...) do { } while (0)
102#define	dev_err(...) do { } while (0)
103#define	dev_dbg(...) do { } while (0)
104#define	dev_vdbg(...) do { } while (0)
105#endif
106
107#define jiffies			getticks()
108#define msecs_to_jiffies	mstohz
109
110enum usb_otg_state {
111	OTG_STATE_RESERVED = 0,
112
113	OTG_STATE_A_HOST,
114	OTG_STATE_A_PERIPHERAL,
115	OTG_STATE_A_SUSPEND,
116	OTG_STATE_B_HOST,
117	OTG_STATE_B_PERIPHERAL,
118};
119
120#define usleep_range(l, u)	do { DELAY(u); } while (0)
121
122#define spinlock_t		kmutex_t
123#define spin_lock_init(lock)	mutex_init(lock, MUTEX_DEFAULT, IPL_VM)
124#define	spin_lock(l)		do { mutex_spin_enter(l); } while (0)
125#define	spin_unlock(l)		do { mutex_spin_exit(l); } while (0)
126
127#define	spin_lock_irqsave(l, f)		\
128	do { mutex_spin_enter(l); (void)(f); } while (0)
129
130#define	spin_unlock_irqrestore(l, f)	\
131	do { mutex_spin_exit(l); (void)(f); } while (0)
132
133#define	IRQ_RETVAL(r)	(r)
134
135#define	USB_ENDPOINT_XFER_CONTROL	UE_CONTROL		/* 0 */
136#define	USB_ENDPOINT_XFER_ISOC		UE_ISOCHRONOUS		/* 1 */
137#define	USB_ENDPOINT_XFER_BULK		UE_BULK			/* 2 */
138#define	USB_ENDPOINT_XFER_INT		UE_INTERRUPT		/* 3 */
139
140#define USB_DIR_IN			UE_DIR_IN
141#define USB_DIR_OUT			UE_DIR_OUT
142
143#define	USB_PORT_FEAT_CONNECTION	UHF_PORT_CONNECTION
144#define	USB_PORT_FEAT_ENABLE		UHF_PORT_ENABLE
145#define	USB_PORT_FEAT_SUSPEND		UHF_PORT_SUSPEND
146#define	USB_PORT_FEAT_OVER_CURRENT	UHF_PORT_OVER_CURRENT
147#define	USB_PORT_FEAT_RESET		UHF_PORT_RESET
148// #define	USB_PORT_FEAT_L1		5	/* L1 suspend */
149#define	USB_PORT_FEAT_POWER		UHF_PORT_POWER
150#define	USB_PORT_FEAT_LOWSPEED		UHF_PORT_LOW_SPEED
151#define	USB_PORT_FEAT_C_CONNECTION	UHF_C_PORT_CONNECTION
152#define	USB_PORT_FEAT_C_ENABLE		UHF_C_PORT_ENABLE
153#define	USB_PORT_FEAT_C_SUSPEND		UHF_C_PORT_SUSPEND
154#define	USB_PORT_FEAT_C_OVER_CURRENT	UHF_C_PORT_OVER_CURRENT
155#define	USB_PORT_FEAT_C_RESET		UHF_C_PORT_RESET
156#define	USB_PORT_FEAT_TEST              UHF_PORT_TEST
157#define	USB_PORT_FEAT_INDICATOR         UHF_PORT_INDICATOR
158#define	USB_PORT_FEAT_C_PORT_L1         UHF_C_PORT_L1
159
160#define	C_HUB_LOCAL_POWER		UHF_C_HUB_LOCAL_POWER
161#define	C_HUB_OVER_CURRENT		UHF_C_HUB_OVER_CURRENT
162
163#define USB_REQ_GET_STATUS		UR_GET_STATUS
164#define USB_REQ_CLEAR_FEATURE		UR_CLEAR_FEATURE
165#define USB_REQ_SET_FEATURE		UR_SET_FEATURE
166#define USB_REQ_GET_DESCRIPTOR		UR_GET_DESCRIPTOR
167
168#define	ClearHubFeature		((UT_WRITE_CLASS_DEVICE << 8) | USB_REQ_CLEAR_FEATURE)
169#define	ClearPortFeature	((UT_WRITE_CLASS_OTHER << 8) | USB_REQ_CLEAR_FEATURE)
170#define	GetHubDescriptor	((UT_READ_CLASS_DEVICE << 8) | USB_REQ_GET_DESCRIPTOR)
171#define	GetHubStatus		((UT_READ_CLASS_DEVICE << 8) | USB_REQ_GET_STATUS)
172#define	GetPortStatus		((UT_READ_CLASS_OTHER << 8) | USB_REQ_GET_STATUS)
173#define	SetHubFeature		((UT_WRITE_CLASS_DEVICE << 8) | USB_REQ_SET_FEATURE)
174#define	SetPortFeature		((UT_WRITE_CLASS_OTHER << 8) | USB_REQ_SET_FEATURE)
175
176#define	USB_PORT_STAT_CONNECTION	UPS_CURRENT_CONNECT_STATUS
177#define	USB_PORT_STAT_ENABLE		UPS_PORT_ENABLED
178#define	USB_PORT_STAT_SUSPEND		UPS_SUSPEND
179#define	USB_PORT_STAT_OVERCURRENT	UPS_OVERCURRENT_INDICATOR
180#define	USB_PORT_STAT_RESET		UPS_RESET
181#define	USB_PORT_STAT_L1		UPS_PORT_L1
182#define	USB_PORT_STAT_POWER		UPS_PORT_POWER
183#define	USB_PORT_STAT_LOW_SPEED		UPS_LOW_SPEED
184#define	USB_PORT_STAT_HIGH_SPEED        UPS_HIGH_SPEED
185#define	USB_PORT_STAT_TEST              UPS_PORT_TEST
186#define	USB_PORT_STAT_INDICATOR         UPS_PORT_INDICATOR
187
188#define	USB_PORT_STAT_C_CONNECTION	UPS_C_CONNECT_STATUS
189#define	USB_PORT_STAT_C_ENABLE		UPS_C_PORT_ENABLED
190#define	USB_PORT_STAT_C_SUSPEND		UPS_C_SUSPEND
191#define	USB_PORT_STAT_C_OVERCURRENT	UPS_C_OVERCURRENT_INDICATOR
192#define	USB_PORT_STAT_C_RESET		UPS_C_PORT_RESET
193#define	USB_PORT_STAT_C_L1		UPS_C_PORT_L1
194
195#define	USB_DT_HUB			UDESC_HUB
196
197/* See USB 2.0 spec Table 11-13, offset 3 */
198#define HUB_CHAR_LPSM		UHD_PWR
199#define HUB_CHAR_COMMON_LPSM	UHD_PWR_GANGED
200#define HUB_CHAR_INDV_PORT_LPSM	UHD_PWR_INDIVIDUAL
201#define HUB_CHAR_NO_LPSM	UHD_PWR_NO_SWITCH
202
203#define HUB_CHAR_COMPOUND	UHD_COMPOUND
204
205#define HUB_CHAR_OCPM		UHD_OC
206#define HUB_CHAR_COMMON_OCPM	UHD_OC_GLOBAL
207#define HUB_CHAR_INDV_PORT_OCPM	UHD_OC_INDIVIDUAL
208#define HUB_CHAR_NO_OCPM	UHD_OC_NONE
209
210#define HUB_CHAR_TTTT		UHD_TT_THINK
211#define HUB_CHAR_PORTIND	UHD_PORT_IND
212
213enum usb_dr_mode {
214	USB_DR_MODE_UNKNOWN,
215	USB_DR_MODE_HOST,
216	USB_DR_MODE_PERIPHERAL,
217	USB_DR_MODE_OTG,
218};
219
220struct usb_phy;
221struct usb_hcd;
222
223static inline int
224usb_phy_set_suspend(struct usb_phy *x, int suspend)
225{
226
227	return 0;
228}
229
230static inline void
231usb_hcd_resume_root_hub(struct usb_hcd *hcd)
232{
233
234	return;
235}
236
237static inline int
238usb_disabled(void)
239{
240
241	return 0;
242}
243
244static inline void
245udelay(unsigned long usecs)
246{
247
248	DELAY(usecs);
249}
250
251static inline void
252ndelay(unsigned long nsecs)
253{
254
255	DELAY(nsecs / 1000);
256}
257
258static inline void
259msleep(unsigned int msec)
260{
261	if (cold ||
262	    ((hz < 1000) && (msec < (1000/hz))))
263		udelay(msec * 1000);
264	else
265		(void)kpause("mdelay", false, mstohz(msec), NULL);
266}
267
268#define	EREMOTEIO	EIO
269#define	ECOMM		EIO
270#define	ENOTSUPP	ENOTSUP
271
272#define NS_TO_US(ns)	((ns + 500L) / 1000L)
273
274#define USB_RESUME_TIMEOUT	40 /* ms */
275
276#endif
277