xref: /OK3568_Linux_fs/kernel/drivers/usb/renesas_usbhs/mod.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-1.0+ */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Renesas USB driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2011 Renesas Solutions Corp.
6*4882a593Smuzhiyun  * Copyright (C) 2019 Renesas Electronics Corporation
7*4882a593Smuzhiyun  * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun #ifndef RENESAS_USB_MOD_H
10*4882a593Smuzhiyun #define RENESAS_USB_MOD_H
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/spinlock.h>
13*4882a593Smuzhiyun #include <linux/usb/renesas_usbhs.h>
14*4882a593Smuzhiyun #include "common.h"
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /*
17*4882a593Smuzhiyun  *	struct
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun struct usbhs_irq_state {
20*4882a593Smuzhiyun 	u16 intsts0;
21*4882a593Smuzhiyun 	u16 intsts1;
22*4882a593Smuzhiyun 	u16 brdysts;
23*4882a593Smuzhiyun 	u16 nrdysts;
24*4882a593Smuzhiyun 	u16 bempsts;
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun struct usbhs_mod {
28*4882a593Smuzhiyun 	char *name;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	/*
31*4882a593Smuzhiyun 	 * entry point from common.c
32*4882a593Smuzhiyun 	 */
33*4882a593Smuzhiyun 	int (*start)(struct usbhs_priv *priv);
34*4882a593Smuzhiyun 	int (*stop)(struct usbhs_priv *priv);
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	/*
37*4882a593Smuzhiyun 	 * INTSTS0
38*4882a593Smuzhiyun 	 */
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun 	/* DVST (DVSQ) */
41*4882a593Smuzhiyun 	int (*irq_dev_state)(struct usbhs_priv *priv,
42*4882a593Smuzhiyun 			     struct usbhs_irq_state *irq_state);
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	/* CTRT (CTSQ) */
45*4882a593Smuzhiyun 	int (*irq_ctrl_stage)(struct usbhs_priv *priv,
46*4882a593Smuzhiyun 			      struct usbhs_irq_state *irq_state);
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	/* BEMP / BEMPSTS */
49*4882a593Smuzhiyun 	int (*irq_empty)(struct usbhs_priv *priv,
50*4882a593Smuzhiyun 			 struct usbhs_irq_state *irq_state);
51*4882a593Smuzhiyun 	u16 irq_bempsts;
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	/* BRDY / BRDYSTS */
54*4882a593Smuzhiyun 	int (*irq_ready)(struct usbhs_priv *priv,
55*4882a593Smuzhiyun 			 struct usbhs_irq_state *irq_state);
56*4882a593Smuzhiyun 	u16 irq_brdysts;
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun 	/*
59*4882a593Smuzhiyun 	 * INTSTS1
60*4882a593Smuzhiyun 	 */
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	/* ATTCHE */
63*4882a593Smuzhiyun 	int (*irq_attch)(struct usbhs_priv *priv,
64*4882a593Smuzhiyun 			 struct usbhs_irq_state *irq_state);
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	/* DTCHE */
67*4882a593Smuzhiyun 	int (*irq_dtch)(struct usbhs_priv *priv,
68*4882a593Smuzhiyun 			struct usbhs_irq_state *irq_state);
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	/* SIGN */
71*4882a593Smuzhiyun 	int (*irq_sign)(struct usbhs_priv *priv,
72*4882a593Smuzhiyun 			struct usbhs_irq_state *irq_state);
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 	/* SACK */
75*4882a593Smuzhiyun 	int (*irq_sack)(struct usbhs_priv *priv,
76*4882a593Smuzhiyun 			struct usbhs_irq_state *irq_state);
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	struct usbhs_priv *priv;
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun struct usbhs_mod_info {
82*4882a593Smuzhiyun 	struct usbhs_mod *mod[USBHS_MAX];
83*4882a593Smuzhiyun 	struct usbhs_mod *curt; /* current mod */
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 	/*
86*4882a593Smuzhiyun 	 * INTSTS0 :: VBINT
87*4882a593Smuzhiyun 	 *
88*4882a593Smuzhiyun 	 * This function will be used as autonomy mode (runtime_pwctrl == 0)
89*4882a593Smuzhiyun 	 * when the platform doesn't have own get_vbus function.
90*4882a593Smuzhiyun 	 *
91*4882a593Smuzhiyun 	 * This callback cannot be member of "struct usbhs_mod" because it
92*4882a593Smuzhiyun 	 * will be used even though host/gadget has not been selected.
93*4882a593Smuzhiyun 	 */
94*4882a593Smuzhiyun 	int (*irq_vbus)(struct usbhs_priv *priv,
95*4882a593Smuzhiyun 			struct usbhs_irq_state *irq_state);
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun 	/*
98*4882a593Smuzhiyun 	 * This function will be used on any gadget mode. To simplify the code,
99*4882a593Smuzhiyun 	 * this member is in here.
100*4882a593Smuzhiyun 	 */
101*4882a593Smuzhiyun 	int (*get_vbus)(struct platform_device *pdev);
102*4882a593Smuzhiyun };
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun /*
105*4882a593Smuzhiyun  *		for host/gadget module
106*4882a593Smuzhiyun  */
107*4882a593Smuzhiyun struct usbhs_mod *usbhs_mod_get(struct usbhs_priv *priv, int id);
108*4882a593Smuzhiyun struct usbhs_mod *usbhs_mod_get_current(struct usbhs_priv *priv);
109*4882a593Smuzhiyun void usbhs_mod_register(struct usbhs_priv *priv, struct usbhs_mod *usb, int id);
110*4882a593Smuzhiyun int usbhs_mod_is_host(struct usbhs_priv *priv);
111*4882a593Smuzhiyun int usbhs_mod_change(struct usbhs_priv *priv, int id);
112*4882a593Smuzhiyun int usbhs_mod_probe(struct usbhs_priv *priv);
113*4882a593Smuzhiyun void usbhs_mod_remove(struct usbhs_priv *priv);
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun void usbhs_mod_autonomy_mode(struct usbhs_priv *priv);
116*4882a593Smuzhiyun void usbhs_mod_non_autonomy_mode(struct usbhs_priv *priv);
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun /*
119*4882a593Smuzhiyun  *		status functions
120*4882a593Smuzhiyun  */
121*4882a593Smuzhiyun int usbhs_status_get_device_state(struct usbhs_irq_state *irq_state);
122*4882a593Smuzhiyun int usbhs_status_get_ctrl_stage(struct usbhs_irq_state *irq_state);
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun /*
125*4882a593Smuzhiyun  *		callback functions
126*4882a593Smuzhiyun  */
127*4882a593Smuzhiyun void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod);
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun #define usbhs_mod_call(priv, func, param...)		\
131*4882a593Smuzhiyun 	({						\
132*4882a593Smuzhiyun 		struct usbhs_mod *mod;			\
133*4882a593Smuzhiyun 		mod = usbhs_mod_get_current(priv);	\
134*4882a593Smuzhiyun 		!mod		? -ENODEV :		\
135*4882a593Smuzhiyun 		!mod->func	? 0 :			\
136*4882a593Smuzhiyun 		 mod->func(param);			\
137*4882a593Smuzhiyun 	})
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun #define usbhs_priv_to_modinfo(priv) (&priv->mod_info)
140*4882a593Smuzhiyun #define usbhs_mod_info_call(priv, func, param...)	\
141*4882a593Smuzhiyun ({							\
142*4882a593Smuzhiyun 	struct usbhs_mod_info *info;			\
143*4882a593Smuzhiyun 	info = usbhs_priv_to_modinfo(priv);		\
144*4882a593Smuzhiyun 	!info->func ? 0 :				\
145*4882a593Smuzhiyun 	 info->func(param);				\
146*4882a593Smuzhiyun })
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun /*
149*4882a593Smuzhiyun  * host / gadget control
150*4882a593Smuzhiyun  */
151*4882a593Smuzhiyun #if	defined(CONFIG_USB_RENESAS_USBHS_HCD) || \
152*4882a593Smuzhiyun 	defined(CONFIG_USB_RENESAS_USBHS_HCD_MODULE)
153*4882a593Smuzhiyun extern int usbhs_mod_host_probe(struct usbhs_priv *priv);
154*4882a593Smuzhiyun extern int usbhs_mod_host_remove(struct usbhs_priv *priv);
155*4882a593Smuzhiyun #else
usbhs_mod_host_probe(struct usbhs_priv * priv)156*4882a593Smuzhiyun static inline int usbhs_mod_host_probe(struct usbhs_priv *priv)
157*4882a593Smuzhiyun {
158*4882a593Smuzhiyun 	return 0;
159*4882a593Smuzhiyun }
usbhs_mod_host_remove(struct usbhs_priv * priv)160*4882a593Smuzhiyun static inline void usbhs_mod_host_remove(struct usbhs_priv *priv)
161*4882a593Smuzhiyun {
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun #endif
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun #if	defined(CONFIG_USB_RENESAS_USBHS_UDC) || \
166*4882a593Smuzhiyun 	defined(CONFIG_USB_RENESAS_USBHS_UDC_MODULE)
167*4882a593Smuzhiyun extern int usbhs_mod_gadget_probe(struct usbhs_priv *priv);
168*4882a593Smuzhiyun extern void usbhs_mod_gadget_remove(struct usbhs_priv *priv);
169*4882a593Smuzhiyun #else
usbhs_mod_gadget_probe(struct usbhs_priv * priv)170*4882a593Smuzhiyun static inline int usbhs_mod_gadget_probe(struct usbhs_priv *priv)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun 	return 0;
173*4882a593Smuzhiyun }
usbhs_mod_gadget_remove(struct usbhs_priv * priv)174*4882a593Smuzhiyun static inline void usbhs_mod_gadget_remove(struct usbhs_priv *priv)
175*4882a593Smuzhiyun {
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun #endif
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun #endif /* RENESAS_USB_MOD_H */
180