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