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