GNU Linux-libre 4.19.286-gnu1
[releases.git] / include / linux / usb / renesas_usbhs.h
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 */