1
2
3
4
5
6
7
8#ifndef RENESAS_USB_MOD_H
9#define RENESAS_USB_MOD_H
10
11#include <linux/spinlock.h>
12#include <linux/usb/renesas_usbhs.h>
13#include "common.h"
14
15
16
17
18struct usbhs_irq_state {
19 u16 intsts0;
20 u16 intsts1;
21 u16 brdysts;
22 u16 nrdysts;
23 u16 bempsts;
24};
25
26struct usbhs_mod {
27 char *name;
28
29
30
31
32 int (*start)(struct usbhs_priv *priv);
33 int (*stop)(struct usbhs_priv *priv);
34
35
36
37
38
39
40 int (*irq_dev_state)(struct usbhs_priv *priv,
41 struct usbhs_irq_state *irq_state);
42
43
44 int (*irq_ctrl_stage)(struct usbhs_priv *priv,
45 struct usbhs_irq_state *irq_state);
46
47
48 int (*irq_empty)(struct usbhs_priv *priv,
49 struct usbhs_irq_state *irq_state);
50 u16 irq_bempsts;
51
52
53 int (*irq_ready)(struct usbhs_priv *priv,
54 struct usbhs_irq_state *irq_state);
55 u16 irq_brdysts;
56
57
58
59
60
61
62 int (*irq_attch)(struct usbhs_priv *priv,
63 struct usbhs_irq_state *irq_state);
64
65
66 int (*irq_dtch)(struct usbhs_priv *priv,
67 struct usbhs_irq_state *irq_state);
68
69
70 int (*irq_sign)(struct usbhs_priv *priv,
71 struct usbhs_irq_state *irq_state);
72
73
74 int (*irq_sack)(struct usbhs_priv *priv,
75 struct usbhs_irq_state *irq_state);
76
77 struct usbhs_priv *priv;
78};
79
80struct usbhs_mod_info {
81 struct usbhs_mod *mod[USBHS_MAX];
82 struct usbhs_mod *curt;
83
84
85
86
87
88
89
90
91
92
93
94 int (*irq_vbus)(struct usbhs_priv *priv,
95 struct usbhs_irq_state *irq_state);
96};
97
98
99
100
101struct usbhs_mod *usbhs_mod_get(struct usbhs_priv *priv, int id);
102struct usbhs_mod *usbhs_mod_get_current(struct usbhs_priv *priv);
103void usbhs_mod_register(struct usbhs_priv *priv, struct usbhs_mod *usb, int id);
104int usbhs_mod_is_host(struct usbhs_priv *priv);
105int usbhs_mod_change(struct usbhs_priv *priv, int id);
106int usbhs_mod_probe(struct usbhs_priv *priv);
107void usbhs_mod_remove(struct usbhs_priv *priv);
108
109void usbhs_mod_autonomy_mode(struct usbhs_priv *priv);
110
111
112
113
114int usbhs_status_get_device_state(struct usbhs_irq_state *irq_state);
115int usbhs_status_get_ctrl_stage(struct usbhs_irq_state *irq_state);
116
117
118
119
120void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod);
121
122
123#define usbhs_mod_call(priv, func, param...) \
124 ({ \
125 struct usbhs_mod *mod; \
126 mod = usbhs_mod_get_current(priv); \
127 !mod ? -ENODEV : \
128 !mod->func ? 0 : \
129 mod->func(param); \
130 })
131
132
133
134
135#if defined(CONFIG_USB_RENESAS_USBHS_HCD) || \
136 defined(CONFIG_USB_RENESAS_USBHS_HCD_MODULE)
137extern int usbhs_mod_host_probe(struct usbhs_priv *priv);
138extern int usbhs_mod_host_remove(struct usbhs_priv *priv);
139#else
140static inline int usbhs_mod_host_probe(struct usbhs_priv *priv)
141{
142 return 0;
143}
144static inline void usbhs_mod_host_remove(struct usbhs_priv *priv)
145{
146}
147#endif
148
149#if defined(CONFIG_USB_RENESAS_USBHS_UDC) || \
150 defined(CONFIG_USB_RENESAS_USBHS_UDC_MODULE)
151extern int usbhs_mod_gadget_probe(struct usbhs_priv *priv);
152extern void usbhs_mod_gadget_remove(struct usbhs_priv *priv);
153#else
154static inline int usbhs_mod_gadget_probe(struct usbhs_priv *priv)
155{
156 return 0;
157}
158static inline void usbhs_mod_gadget_remove(struct usbhs_priv *priv)
159{
160}
161#endif
162
163#endif
164