1f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto/*
2f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * Renesas USB driver
3f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto *
4f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * Copyright (C) 2011 Renesas Solutions Corp.
5f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto *
7f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * This program is distributed in the hope that it will be useful,
8f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * but WITHOUT ANY WARRANTY; without even the implied warranty of
9f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * GNU General Public License for more details.
11f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto *
12f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * You should have received a copy of the GNU General Public License
13f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * along with this program; if not, write to the Free Software
14f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
15f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto *
16f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto */
17f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto#ifndef RENESAS_USB_MOD_H
18f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto#define RENESAS_USB_MOD_H
19f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
20f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto#include <linux/spinlock.h>
21f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto#include <linux/usb/renesas_usbhs.h>
22f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto#include "./common.h"
23f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
24f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto/*
25f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto *	struct
26f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto */
27f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotostruct usbhs_irq_state {
28f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	u16 intsts0;
29f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	u16 intsts1;
30f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	u16 brdysts;
31f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	u16 nrdysts;
32f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	u16 bempsts;
33f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto};
34f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
35f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotostruct usbhs_mod {
36f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	char *name;
37f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
38f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	/*
39f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	 * entry point from common.c
40f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	 */
41f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	int (*start)(struct usbhs_priv *priv);
42f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	int (*stop)(struct usbhs_priv *priv);
43f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
4489c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	/*
4589c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	 * INTSTS0
4689c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	 */
4789c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto
4889c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	/* DVST (DVSQ) */
49f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	int (*irq_dev_state)(struct usbhs_priv *priv,
50f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto			     struct usbhs_irq_state *irq_state);
51f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
5289c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	/* CTRT (CTSQ) */
53f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	int (*irq_ctrl_stage)(struct usbhs_priv *priv,
54f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto			      struct usbhs_irq_state *irq_state);
55f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
5689c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	/* BEMP / BEMPSTS */
57f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	int (*irq_empty)(struct usbhs_priv *priv,
58f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto			 struct usbhs_irq_state *irq_state);
59f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	u16 irq_bempsts;
60f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
6189c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	/* BRDY / BRDYSTS */
62f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	int (*irq_ready)(struct usbhs_priv *priv,
63f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto			 struct usbhs_irq_state *irq_state);
64f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	u16 irq_brdysts;
65f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
6689c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	/*
6789c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	 * INTSTS1
6889c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	 */
6989c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto
7089c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	/* ATTCHE */
7189c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	int (*irq_attch)(struct usbhs_priv *priv,
7289c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto			 struct usbhs_irq_state *irq_state);
7389c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto
7489c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	/* DTCHE */
7589c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	int (*irq_dtch)(struct usbhs_priv *priv,
7689c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto			struct usbhs_irq_state *irq_state);
7789c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto
7889c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	/* SIGN */
7989c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	int (*irq_sign)(struct usbhs_priv *priv,
8089c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto			struct usbhs_irq_state *irq_state);
8189c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto
8289c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	/* SACK */
8389c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto	int (*irq_sack)(struct usbhs_priv *priv,
8489c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto			struct usbhs_irq_state *irq_state);
8589c1d2e7b5993db33805b42e3675289920812f6fKuninori Morimoto
86f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	struct usbhs_priv *priv;
87f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto};
88f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
89f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotostruct usbhs_mod_info {
90f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	struct usbhs_mod *mod[USBHS_MAX];
91f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	struct usbhs_mod *curt; /* current mod */
92b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto
93b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto	/*
94b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto	 * INTSTS0 :: VBINT
95b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto	 *
96b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto	 * This function will be used as autonomy mode
97b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto	 * when platform cannot call notify_hotplug.
98b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto	 *
99b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto	 * This callback cannot be member of "struct usbhs_mod"
100b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto	 * because it will be used even though
101b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto	 * host/gadget has not been selected.
102b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto	 */
103b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto	int (*irq_vbus)(struct usbhs_priv *priv,
104b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto			struct usbhs_irq_state *irq_state);
105f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto};
106f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
107f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto/*
108f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto *		for host/gadget module
109f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto */
110f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotostruct usbhs_mod *usbhs_mod_get(struct usbhs_priv *priv, int id);
111f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotostruct usbhs_mod *usbhs_mod_get_current(struct usbhs_priv *priv);
112f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotovoid usbhs_mod_register(struct usbhs_priv *priv, struct usbhs_mod *usb, int id);
1130deb3e77025688e0650e1af672d3e42e15cd8916Kuninori Morimotoint usbhs_mod_is_host(struct usbhs_priv *priv);
114f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotoint usbhs_mod_change(struct usbhs_priv *priv, int id);
115f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotoint usbhs_mod_probe(struct usbhs_priv *priv);
116f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotovoid usbhs_mod_remove(struct usbhs_priv *priv);
117f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
118b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimotovoid usbhs_mod_autonomy_mode(struct usbhs_priv *priv);
119b002ff6e268b6024d6927a1ce330a14ca162b6abKuninori Morimoto
120f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto/*
121f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto *		status functions
122f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto */
123f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotoint usbhs_status_get_device_state(struct usbhs_irq_state *irq_state);
124f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotoint usbhs_status_get_ctrl_stage(struct usbhs_irq_state *irq_state);
125f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
126f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto/*
127f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto *		callback functions
128f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto */
129f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimotovoid usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod);
130f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
131f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
132f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto#define usbhs_mod_call(priv, func, param...)		\
133f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	({						\
134f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto		struct usbhs_mod *mod;			\
135f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto		mod = usbhs_mod_get_current(priv);	\
136f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto		!mod		? -ENODEV :		\
137f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto		!mod->func	? 0 :			\
138f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto		 mod->func(param);			\
139f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto	})
140f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto
1412f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto/*
142034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto * host / gadget control
1432f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto */
144951fe829c73b89a2e4a5b1aaae4c0a43ffa7c68eKuninori Morimoto#if	defined(CONFIG_USB_RENESAS_USBHS_HCD) || \
145951fe829c73b89a2e4a5b1aaae4c0a43ffa7c68eKuninori Morimoto	defined(CONFIG_USB_RENESAS_USBHS_HCD_MODULE)
146b7a8d17db9a86db1040862600cf3a02848f83844Kuninori Morimotoextern int usbhs_mod_host_probe(struct usbhs_priv *priv);
147b7a8d17db9a86db1040862600cf3a02848f83844Kuninori Morimotoextern int usbhs_mod_host_remove(struct usbhs_priv *priv);
148034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto#else
149034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimotostatic inline int usbhs_mod_host_probe(struct usbhs_priv *priv)
150034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto{
151034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto	return 0;
152034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto}
153034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimotostatic inline void usbhs_mod_host_remove(struct usbhs_priv *priv)
154034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto{
155034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto}
156034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto#endif
157034d7c13a79c67d3b52dd782d68e6c324613878aKuninori Morimoto
158951fe829c73b89a2e4a5b1aaae4c0a43ffa7c68eKuninori Morimoto#if	defined(CONFIG_USB_RENESAS_USBHS_UDC) || \
159951fe829c73b89a2e4a5b1aaae4c0a43ffa7c68eKuninori Morimoto	defined(CONFIG_USB_RENESAS_USBHS_UDC_MODULE)
160b7a8d17db9a86db1040862600cf3a02848f83844Kuninori Morimotoextern int usbhs_mod_gadget_probe(struct usbhs_priv *priv);
161b7a8d17db9a86db1040862600cf3a02848f83844Kuninori Morimotoextern void usbhs_mod_gadget_remove(struct usbhs_priv *priv);
1622f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto#else
1632f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimotostatic inline int usbhs_mod_gadget_probe(struct usbhs_priv *priv)
1642f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto{
1652f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto	return 0;
1662f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto}
1672f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimotostatic inline void usbhs_mod_gadget_remove(struct usbhs_priv *priv)
1682f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto{
1692f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto}
1702f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto#endif
1712f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto
172f1407d5c66240b33d11a7f1a41d55ccf6a9d7647Kuninori Morimoto#endif /* RENESAS_USB_MOD_H */
173