1 // SPDX-License-Identifier: GPL-1.0+
2 /*
3  * Renesas USB
4  *
5  * Copyright (C) 2011 Renesas Solutions Corp.
6  * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
16  *
17  */
18 #ifndef RENESAS_USB_H
19 #define RENESAS_USB_H
20 #include <linux/notifier.h>
21 #include <linux/platform_device.h>
22 #include <linux/usb/ch9.h>
23 
24 /*
25  * module type
26  *
27  * it will be return value from get_id
28  */
29 enum {
30 	USBHS_HOST = 0,
31 	USBHS_GADGET,
32 	USBHS_MAX,
33 };
34 
35 /*
36  * callback functions table for driver
37  *
38  * These functions are called from platform for driver.
39  * Callback function's pointer will be set before
40  * renesas_usbhs_platform_callback :: hardware_init was called
41  */
42 struct renesas_usbhs_driver_callback {
43 	int (*notify_hotplug)(struct platform_device *pdev);
44 };
45 
46 /*
47  * callback functions for platform
48  *
49  * These functions are called from driver for platform
50  */
51 struct renesas_usbhs_platform_callback {
52 
53 	/*
54 	 * option:
55 	 *
56 	 * Hardware init function for platform.
57 	 * it is called when driver was probed.
58 	 */
59 	int (*hardware_init)(struct platform_device *pdev);
60 
61 	/*
62 	 * option:
63 	 *
64 	 * Hardware exit function for platform.
65 	 * it is called when driver was removed
66 	 */
67 	int (*hardware_exit)(struct platform_device *pdev);
68 
69 	/*
70 	 * option:
71 	 *
72 	 * for board specific clock control
73 	 */
74 	int (*power_ctrl)(struct platform_device *pdev,
75 			   void __iomem *base, int enable);
76 
77 	/*
78 	 * option:
79 	 *
80 	 * Phy reset for platform
81 	 */
82 	int (*phy_reset)(struct platform_device *pdev);
83 
84 	/*
85 	 * get USB ID function
86 	 *  - USBHS_HOST
87 	 *  - USBHS_GADGET
88 	 */
89 	int (*get_id)(struct platform_device *pdev);
90 
91 	/*
92 	 * get VBUS status function.
93 	 */
94 	int (*get_vbus)(struct platform_device *pdev);
95 
96 	/*
97 	 * option:
98 	 *
99 	 * VBUS control is needed for Host
100 	 */
101 	int (*set_vbus)(struct platform_device *pdev, int enable);
102 
103 	/*
104 	 * option:
105 	 * extcon notifier to set host/peripheral mode.
106 	 */
107 	int (*notifier)(struct notifier_block *nb, unsigned long event,
108 			void *data);
109 };
110 
111 /*
112  * parameters for renesas usbhs
113  *
114  * some register needs USB chip specific parameters.
115  * This struct show it to driver
116  */
117 
118 struct renesas_usbhs_driver_pipe_config {
119 	u8 type;	/* USB_ENDPOINT_XFER_xxx */
120 	u16 bufsize;
121 	u8 bufnum;
122 	bool double_buf;
123 };
124 #define RENESAS_USBHS_PIPE(_type, _size, _num, _double_buf)	{	\
125 			.type = (_type),		\
126 			.bufsize = (_size),		\
127 			.bufnum = (_num),		\
128 			.double_buf = (_double_buf),	\
129 	}
130 
131 struct renesas_usbhs_driver_param {
132 	/*
133 	 * pipe settings
134 	 */
135 	struct renesas_usbhs_driver_pipe_config *pipe_configs;
136 	int pipe_size; /* pipe_configs array size */
137 
138 	/*
139 	 * option:
140 	 *
141 	 * for BUSWAIT :: BWAIT
142 	 * see
143 	 *	renesas_usbhs/common.c :: usbhsc_set_buswait()
144 	 * */
145 	int buswait_bwait;
146 
147 	/*
148 	 * option:
149 	 *
150 	 * delay time from notify_hotplug callback
151 	 */
152 	int detection_delay; /* msec */
153 
154 	/*
155 	 * option:
156 	 *
157 	 * dma id for dmaengine
158 	 * The data transfer direction on D0FIFO/D1FIFO should be
159 	 * fixed for keeping consistency.
160 	 * So, the platform id settings will be..
161 	 *	.d0_tx_id = xx_TX,
162 	 *	.d1_rx_id = xx_RX,
163 	 * or
164 	 *	.d1_tx_id = xx_TX,
165 	 *	.d0_rx_id = xx_RX,
166 	 */
167 	int d0_tx_id;
168 	int d0_rx_id;
169 	int d1_tx_id;
170 	int d1_rx_id;
171 	int d2_tx_id;
172 	int d2_rx_id;
173 	int d3_tx_id;
174 	int d3_rx_id;
175 
176 	/*
177 	 * option:
178 	 *
179 	 * pio <--> dma border.
180 	 */
181 	int pio_dma_border; /* default is 64byte */
182 
183 	uintptr_t type;
184 	u32 enable_gpio;
185 
186 	/*
187 	 * option:
188 	 */
189 	u32 has_otg:1; /* for controlling PWEN/EXTLP */
190 	u32 has_sudmac:1; /* for SUDMAC */
191 	u32 has_usb_dmac:1; /* for USB-DMAC */
192 #define USBHS_USB_DMAC_XFER_SIZE	32	/* hardcode the xfer size */
193 };
194 
195 #define USBHS_TYPE_RCAR_GEN2		1
196 #define USBHS_TYPE_RCAR_GEN3		2
197 #define USBHS_TYPE_RCAR_GEN3_WITH_PLL	3
198 #define USBHS_TYPE_RZA1			4
199 
200 /*
201  * option:
202  *
203  * platform information for renesas_usbhs driver.
204  */
205 struct renesas_usbhs_platform_info {
206 	/*
207 	 * option:
208 	 *
209 	 * platform set these functions before
210 	 * call platform_add_devices if needed
211 	 */
212 	struct renesas_usbhs_platform_callback	platform_callback;
213 
214 	/*
215 	 * driver set these callback functions pointer.
216 	 * platform can use it on callback functions
217 	 */
218 	struct renesas_usbhs_driver_callback	driver_callback;
219 
220 	/*
221 	 * option:
222 	 *
223 	 * driver use these param for some register
224 	 */
225 	struct renesas_usbhs_driver_param	driver_param;
226 };
227 
228 /*
229  * macro for platform
230  */
231 #define renesas_usbhs_get_info(pdev)\
232 	((struct renesas_usbhs_platform_info *)(pdev)->dev.platform_data)
233 
234 #define renesas_usbhs_call_notify_hotplug(pdev)				\
235 	({								\
236 		struct renesas_usbhs_driver_callback *dc;		\
237 		dc = &(renesas_usbhs_get_info(pdev)->driver_callback);	\
238 		if (dc && dc->notify_hotplug)				\
239 			dc->notify_hotplug(pdev);			\
240 	})
241 #endif /* RENESAS_USB_H */
242