mod.h revision 034d7c13a79c67d3b52dd782d68e6c324613878a
1/*
2 * Renesas USB driver
3 *
4 * Copyright (C) 2011 Renesas Solutions Corp.
5 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
15 *
16 */
17#ifndef RENESAS_USB_MOD_H
18#define RENESAS_USB_MOD_H
19
20#include <linux/spinlock.h>
21#include <linux/usb/renesas_usbhs.h>
22#include "./common.h"
23
24/*
25 *	struct
26 */
27struct usbhs_irq_state {
28	u16 intsts0;
29	u16 intsts1;
30	u16 brdysts;
31	u16 nrdysts;
32	u16 bempsts;
33};
34
35struct usbhs_mod {
36	char *name;
37
38	/*
39	 * entry point from common.c
40	 */
41	int (*start)(struct usbhs_priv *priv);
42	int (*stop)(struct usbhs_priv *priv);
43
44	/*
45	 * INTSTS0
46	 */
47
48	/* DVST (DVSQ) */
49	int (*irq_dev_state)(struct usbhs_priv *priv,
50			     struct usbhs_irq_state *irq_state);
51
52	/* CTRT (CTSQ) */
53	int (*irq_ctrl_stage)(struct usbhs_priv *priv,
54			      struct usbhs_irq_state *irq_state);
55
56	/* BEMP / BEMPSTS */
57	int (*irq_empty)(struct usbhs_priv *priv,
58			 struct usbhs_irq_state *irq_state);
59	u16 irq_bempsts;
60
61	/* BRDY / BRDYSTS */
62	int (*irq_ready)(struct usbhs_priv *priv,
63			 struct usbhs_irq_state *irq_state);
64	u16 irq_brdysts;
65
66	/*
67	 * INTSTS1
68	 */
69
70	/* ATTCHE */
71	int (*irq_attch)(struct usbhs_priv *priv,
72			 struct usbhs_irq_state *irq_state);
73
74	/* DTCHE */
75	int (*irq_dtch)(struct usbhs_priv *priv,
76			struct usbhs_irq_state *irq_state);
77
78	/* SIGN */
79	int (*irq_sign)(struct usbhs_priv *priv,
80			struct usbhs_irq_state *irq_state);
81
82	/* SACK */
83	int (*irq_sack)(struct usbhs_priv *priv,
84			struct usbhs_irq_state *irq_state);
85
86	struct usbhs_priv *priv;
87};
88
89struct usbhs_mod_info {
90	struct usbhs_mod *mod[USBHS_MAX];
91	struct usbhs_mod *curt; /* current mod */
92
93	/*
94	 * INTSTS0 :: VBINT
95	 *
96	 * This function will be used as autonomy mode
97	 * when platform cannot call notify_hotplug.
98	 *
99	 * This callback cannot be member of "struct usbhs_mod"
100	 * because it will be used even though
101	 * host/gadget has not been selected.
102	 */
103	int (*irq_vbus)(struct usbhs_priv *priv,
104			struct usbhs_irq_state *irq_state);
105};
106
107/*
108 *		for host/gadget module
109 */
110struct usbhs_mod *usbhs_mod_get(struct usbhs_priv *priv, int id);
111struct usbhs_mod *usbhs_mod_get_current(struct usbhs_priv *priv);
112void usbhs_mod_register(struct usbhs_priv *priv, struct usbhs_mod *usb, int id);
113int usbhs_mod_is_host(struct usbhs_priv *priv);
114int usbhs_mod_change(struct usbhs_priv *priv, int id);
115int usbhs_mod_probe(struct usbhs_priv *priv);
116void usbhs_mod_remove(struct usbhs_priv *priv);
117
118void usbhs_mod_autonomy_mode(struct usbhs_priv *priv);
119
120/*
121 *		status functions
122 */
123int usbhs_status_get_device_state(struct usbhs_irq_state *irq_state);
124int usbhs_status_get_ctrl_stage(struct usbhs_irq_state *irq_state);
125
126/*
127 *		callback functions
128 */
129void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod);
130
131
132#define usbhs_mod_call(priv, func, param...)		\
133	({						\
134		struct usbhs_mod *mod;			\
135		mod = usbhs_mod_get_current(priv);	\
136		!mod		? -ENODEV :		\
137		!mod->func	? 0 :			\
138		 mod->func(param);			\
139	})
140
141/*
142 * host / gadget control
143 */
144#ifdef CONFIG_USB_RENESAS_USBHS_HCD
145extern int __devinit usbhs_mod_host_probe(struct usbhs_priv *priv);
146extern int __devexit usbhs_mod_host_remove(struct usbhs_priv *priv);
147#else
148static inline int usbhs_mod_host_probe(struct usbhs_priv *priv)
149{
150	return 0;
151}
152static inline void usbhs_mod_host_remove(struct usbhs_priv *priv)
153{
154}
155#endif
156
157#ifdef CONFIG_USB_RENESAS_USBHS_UDC
158extern int __devinit usbhs_mod_gadget_probe(struct usbhs_priv *priv);
159extern void __devexit usbhs_mod_gadget_remove(struct usbhs_priv *priv);
160#else
161static inline int usbhs_mod_gadget_probe(struct usbhs_priv *priv)
162{
163	return 0;
164}
165static inline void usbhs_mod_gadget_remove(struct usbhs_priv *priv)
166{
167}
168#endif
169
170#endif /* RENESAS_USB_MOD_H */
171