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