usb: fix compliation warning without CONFIG_RK_DEBUG_UART
[firefly-linux-kernel-4.4.55.git] / drivers / usb / dwc_otg_310 / dwc_otg_driver.c
1 /* ==========================================================================
2  * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_driver.c $
3  * $Revision: #94 $
4  * $Date: 2012/12/21 $
5  * $Change: 2131568 $
6  *
7  * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
8  * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless
9  * otherwise expressly agreed to in writing between Synopsys and you.
10  *
11  * The Software IS NOT an item of Licensed Software or Licensed Product under
12  * any End User Software License Agreement or Agreement for Licensed Product
13  * with Synopsys or any supplement thereto. You are permitted to use and
14  * redistribute this Software in source and binary forms, with or without
15  * modification, provided that redistributions of source code must retain this
16  * notice. You may not view, use, disclose, copy or distribute this file or
17  * any information contained herein except pursuant to this license grant from
18  * Synopsys. If you do not agree with this notice, including the disclaimer
19  * below, then you are not authorized to use the Software.
20  *
21  * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS BE LIABLE FOR ANY DIRECT,
25  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31  * DAMAGE.
32  * ========================================================================== */
33
34 /** @file
35  * The dwc_otg_driver module provides the initialization and cleanup entry
36  * points for the DWC_otg driver. This module will be dynamically installed
37  * after Linux is booted using the insmod command. When the module is
38  * installed, the dwc_otg_driver_init function is called. When the module is
39  * removed (using rmmod), the dwc_otg_driver_cleanup function is called.
40  *
41  * This module also defines a data structure for the dwc_otg_driver, which is
42  * used in conjunction with the standard ARM lm_device structure. These
43  * structures allow the OTG driver to comply with the standard Linux driver
44  * model in which devices and drivers are registered with a bus driver. This
45  * has the benefit that Linux can expose attributes of the driver and device
46  * in its special sysfs file system. Users can then read or write files in
47  * this file system to perform diagnostics on the driver components or the
48  * device.
49  */
50
51 #include "dwc_otg_os_dep.h"
52 #include "common_port/dwc_os.h"
53 #include "dwc_otg_dbg.h"
54 #include "dwc_otg_driver.h"
55 #include "dwc_otg_attr.h"
56 #include "dwc_otg_core_if.h"
57 #include "dwc_otg_pcd_if.h"
58 #include "dwc_otg_hcd_if.h"
59 #include "dwc_otg_cil.h"
60 #include "dwc_otg_pcd.h"
61
62 #include "usbdev_rk.h"
63
64 #define DWC_DRIVER_VERSION      "3.10a 21-DEC-2012"
65 #define DWC_DRIVER_DESC         "HS OTG USB Controller driver"
66
67 static const char dwc_host20_driver_name[] = "usb20_host";
68 static const char dwc_otg20_driver_name[] = "usb20_otg";
69
70 dwc_otg_device_t *g_otgdev;
71
72 extern int pcd_init(struct platform_device *_dev);
73 extern int otg20_hcd_init(struct platform_device *_dev);
74 extern int host20_hcd_init(struct platform_device *_dev);
75 extern int pcd_remove(struct platform_device *_dev);
76 extern void hcd_remove(struct platform_device *_dev);
77 extern void dwc_otg_adp_start(dwc_otg_core_if_t *core_if, uint8_t is_host);
78
79
80 #ifdef CONFIG_RK_USB_UART
81 static u32 usb_to_uart_status;
82 #endif
83 /*-------------------------------------------------------------------------*/
84 /* Encapsulate the module parameter settings */
85
86 struct dwc_otg_driver_module_params {
87         int32_t opt;
88         int32_t otg_cap;
89         int32_t dma_enable;
90         int32_t dma_desc_enable;
91         int32_t dma_burst_size;
92         int32_t speed;
93         int32_t host_support_fs_ls_low_power;
94         int32_t host_ls_low_power_phy_clk;
95         int32_t enable_dynamic_fifo;
96         int32_t data_fifo_size;
97         int32_t dev_rx_fifo_size;
98         int32_t dev_nperio_tx_fifo_size;
99         uint32_t dev_perio_tx_fifo_size[MAX_PERIO_FIFOS];
100         int32_t host_rx_fifo_size;
101         int32_t host_nperio_tx_fifo_size;
102         int32_t host_perio_tx_fifo_size;
103         int32_t max_transfer_size;
104         int32_t max_packet_count;
105         int32_t host_channels;
106         int32_t dev_endpoints;
107         int32_t phy_type;
108         int32_t phy_utmi_width;
109         int32_t phy_ulpi_ddr;
110         int32_t phy_ulpi_ext_vbus;
111         int32_t i2c_enable;
112         int32_t ulpi_fs_ls;
113         int32_t ts_dline;
114         int32_t en_multiple_tx_fifo;
115         uint32_t dev_tx_fifo_size[MAX_TX_FIFOS];
116         uint32_t thr_ctl;
117         uint32_t tx_thr_length;
118         uint32_t rx_thr_length;
119         int32_t pti_enable;
120         int32_t mpi_enable;
121         int32_t lpm_enable;
122         int32_t besl_enable;
123         int32_t baseline_besl;
124         int32_t deep_besl;
125         int32_t ic_usb_cap;
126         int32_t ahb_thr_ratio;
127         int32_t power_down;
128         int32_t reload_ctl;
129         int32_t dev_out_nak;
130         int32_t cont_on_bna;
131         int32_t ahb_single;
132         int32_t otg_ver;
133         int32_t adp_enable;
134 };
135
136 static struct dwc_otg_driver_module_params dwc_otg_module_params = {
137         .opt = -1,
138         .otg_cap = DWC_OTG_CAP_PARAM_NO_HNP_SRP_CAPABLE,
139         .dma_enable = -1,
140         .dma_desc_enable = 0,
141         .dma_burst_size = -1,
142         .speed = -1,
143         .host_support_fs_ls_low_power = -1,
144         .host_ls_low_power_phy_clk = -1,
145         .enable_dynamic_fifo = 1,
146         .data_fifo_size = -1,
147         .dev_rx_fifo_size = 0x120,
148         .dev_nperio_tx_fifo_size = 0x10,
149         .dev_perio_tx_fifo_size = {
150                                    /* dev_perio_tx_fifo_size_1 */
151                                    -1,
152                                    -1,
153                                    -1,
154                                    -1,
155                                    -1,
156                                    -1,
157                                    -1,
158                                    -1,
159                                    -1,
160                                    -1,
161                                    -1,
162                                    -1,
163                                    -1,
164                                    -1,
165                                    -1
166                                    /* 15 */
167                                    },
168         .host_rx_fifo_size = -1,
169         .host_nperio_tx_fifo_size = -1,
170         .host_perio_tx_fifo_size = -1,
171         .max_transfer_size = -1,
172         .max_packet_count = -1,
173         .host_channels = -1,
174         .dev_endpoints = -1,
175         .phy_type = -1,
176         .phy_utmi_width = -1,
177         .phy_ulpi_ddr = -1,
178         .phy_ulpi_ext_vbus = -1,
179         .i2c_enable = -1,
180         .ulpi_fs_ls = -1,
181         .ts_dline = -1,
182         .en_multiple_tx_fifo = -1,
183         .dev_tx_fifo_size = {
184                              /* dev_tx_fifo_size */
185                              0x100,
186                              0x80,
187                              0x80,
188                              0x60,
189                              0x10,
190                              0x10,
191                              -1,
192                              -1,
193                              -1,
194                              -1,
195                              -1,
196                              -1,
197                              -1,
198                              -1,
199                              -1
200                              /* 15 */
201                              },
202         .thr_ctl = -1,
203         .tx_thr_length = -1,
204         .rx_thr_length = -1,
205         .pti_enable = -1,
206         .mpi_enable = -1,
207         .lpm_enable = -1,
208         .besl_enable = -1,
209         .baseline_besl = -1,
210         .deep_besl = -1,
211         .ic_usb_cap = -1,
212         .ahb_thr_ratio = -1,
213         .power_down = -1,
214         .reload_ctl = -1,
215         .dev_out_nak = -1,
216         .cont_on_bna = -1,
217         .ahb_single = -1,
218         .otg_ver = -1,
219         .adp_enable = 0,
220 };
221
222 #ifdef CONFIG_USB20_HOST
223 static struct dwc_otg_driver_module_params dwc_host_module_params = {
224         .opt = -1,
225         .otg_cap = DWC_OTG_CAP_PARAM_NO_HNP_SRP_CAPABLE,
226         .dma_enable = -1,
227         .dma_desc_enable = 0,
228         .dma_burst_size = -1,
229         .speed = -1,
230         .host_support_fs_ls_low_power = -1,
231         .host_ls_low_power_phy_clk = -1,
232         .enable_dynamic_fifo = -1,
233         .data_fifo_size = -1,
234         .dev_rx_fifo_size = -1,
235         .dev_nperio_tx_fifo_size = -1,
236         .dev_perio_tx_fifo_size = {
237                                    /* dev_perio_tx_fifo_size_1 */
238                                    -1,
239                                    -1,
240                                    -1,
241                                    -1,
242                                    -1,
243                                    -1,
244                                    -1,
245                                    -1,
246                                    -1,
247                                    -1,
248                                    -1,
249                                    -1,
250                                    -1,
251                                    -1,
252                                    -1
253                                    /* 15 */
254                                    },
255         .host_rx_fifo_size = -1,
256         .host_nperio_tx_fifo_size = -1,
257         .host_perio_tx_fifo_size = -1,
258         .max_transfer_size = -1,
259         .max_packet_count = -1,
260         .host_channels = -1,
261         .dev_endpoints = -1,
262         .phy_type = -1,
263         .phy_utmi_width = -1,
264         .phy_ulpi_ddr = -1,
265         .phy_ulpi_ext_vbus = -1,
266         .i2c_enable = -1,
267         .ulpi_fs_ls = -1,
268         .ts_dline = -1,
269         .en_multiple_tx_fifo = -1,
270         .dev_tx_fifo_size = {
271                              /* dev_tx_fifo_size */
272                              -1,
273                              -1,
274                              -1,
275                              -1,
276                              -1,
277                              -1,
278                              -1,
279                              -1,
280                              -1,
281                              -1,
282                              -1,
283                              -1,
284                              -1,
285                              -1,
286                              -1
287                              /* 15 */
288                              },
289         .thr_ctl = -1,
290         .tx_thr_length = -1,
291         .rx_thr_length = -1,
292         .pti_enable = -1,
293         .mpi_enable = -1,
294         .lpm_enable = -1,
295         .besl_enable = -1,
296         .baseline_besl = -1,
297         .deep_besl = -1,
298         .ic_usb_cap = -1,
299         .ahb_thr_ratio = -1,
300         .power_down = -1,
301         .reload_ctl = -1,
302         .dev_out_nak = -1,
303         .cont_on_bna = -1,
304         .ahb_single = -1,
305         .otg_ver = -1,
306         .adp_enable = 0,
307 };
308 #endif
309
310 /**
311  * This function shows the Driver Version.
312  */
313 static ssize_t version_show(struct device_driver *dev, char *buf)
314 {
315         return snprintf(buf, sizeof(DWC_DRIVER_VERSION) + 2, "%s\n",
316                         DWC_DRIVER_VERSION);
317 }
318
319 static DRIVER_ATTR(version, S_IRUGO, version_show, NULL);
320
321 /**
322  * Global Debug Level Mask.
323  */
324 uint32_t g_dbg_lvl = DBG_OFF;   /* OFF */
325
326 /**
327  * This function shows the driver Debug Level.
328  */
329 static ssize_t dbg_level_show(struct device_driver *drv, char *buf)
330 {
331         return sprintf(buf, "0x%0x\n", g_dbg_lvl);
332 }
333
334 /**
335  * This function stores the driver Debug Level.
336  */
337 static ssize_t dbg_level_store(struct device_driver *drv, const char *buf,
338                                size_t count)
339 {
340         g_dbg_lvl = simple_strtoul(buf, NULL, 16);
341         return count;
342 }
343
344 static DRIVER_ATTR(debuglevel, S_IRUGO | S_IWUSR, dbg_level_show,
345                    dbg_level_store);
346
347 extern void hcd_start(dwc_otg_core_if_t *core_if);
348 extern struct usb_hub *g_dwc_otg_root_hub20;
349 extern void dwc_otg_hub_disconnect_device(struct usb_hub *hub);
350
351 void dwc_otg_force_host(dwc_otg_core_if_t *core_if)
352 {
353         dwc_otg_device_t *otg_dev = core_if->otg_dev;
354         dctl_data_t dctl = {.d32 = 0 };
355         unsigned long flags;
356
357         if (core_if->op_state == A_HOST) {
358                 printk("dwc_otg_force_host,already in A_HOST mode,everest\n");
359                 return;
360         }
361         core_if->op_state = A_HOST;
362
363         cancel_delayed_work(&otg_dev->pcd->check_vbus_work);
364         dctl.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dctl);
365         dctl.b.sftdiscon = 1;
366         DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dctl, dctl.d32);
367
368         local_irq_save(flags);
369         cil_pcd_stop(core_if);
370         /*
371          * Initialize the Core for Host mode.
372          */
373
374         dwc_otg_core_init(core_if);
375         dwc_otg_enable_global_interrupts(core_if);
376         cil_hcd_start(core_if);
377         local_irq_restore(flags);
378 }
379
380 void dwc_otg_force_device(dwc_otg_core_if_t *core_if)
381 {
382         dwc_otg_device_t *otg_dev = core_if->otg_dev;
383         unsigned long flags;
384
385         local_irq_save(flags);
386
387         if (core_if->op_state == B_PERIPHERAL) {
388                 printk
389                     ("dwc_otg_force_device,already in B_PERIPHERAL,everest\n");
390                 return;
391         }
392         core_if->op_state = B_PERIPHERAL;
393         cil_hcd_stop(core_if);
394         /* dwc_otg_hub_disconnect_device(g_dwc_otg_root_hub20); */
395         otg_dev->pcd->phy_suspend = 1;
396         otg_dev->pcd->vbus_status = 0;
397         dwc_otg_pcd_start_check_vbus_work(otg_dev->pcd);
398
399         /* Reset the Controller */
400         dwc_otg_core_reset(core_if);
401
402         dwc_otg_core_init(core_if);
403         dwc_otg_disable_global_interrupts(core_if);
404         cil_pcd_start(core_if);
405
406         local_irq_restore(flags);
407 }
408
409 static ssize_t force_usb_mode_show(struct device_driver *drv, char *buf)
410 {
411         dwc_otg_device_t *otg_dev = g_otgdev;
412         dwc_otg_core_if_t *core_if = otg_dev->core_if;
413
414         return sprintf(buf, "%d\n", core_if->usb_mode);
415 }
416
417 static ssize_t force_usb_mode_store(struct device_driver *drv, const char *buf,
418                                     size_t count)
419 {
420         int new_mode = simple_strtoul(buf, NULL, 16);
421         dwc_otg_device_t *otg_dev = g_otgdev;
422         dwc_otg_core_if_t *core_if;
423         struct dwc_otg_platform_data *pldata;
424
425         if (!otg_dev)
426                 return -EINVAL;
427
428         core_if = otg_dev->core_if;
429         pldata = otg_dev->pldata;
430
431         DWC_PRINTF("%s %d->%d\n", __func__, core_if->usb_mode, new_mode);
432
433         if (core_if->usb_mode == new_mode) {
434                 return count;
435         }
436
437         if (pldata->phy_status == USB_PHY_SUSPEND) {
438                 pldata->clock_enable(pldata, 1);
439                 pldata->phy_suspend(pldata, USB_PHY_ENABLED);
440         }
441
442         switch (new_mode) {
443         case USB_MODE_FORCE_HOST:
444                 if (USB_MODE_FORCE_DEVICE == core_if->usb_mode) {
445                         /* device-->host */
446                         core_if->usb_mode = new_mode;
447                         dwc_otg_force_host(core_if);
448                 } else if (USB_MODE_NORMAL == core_if->usb_mode) {
449                         core_if->usb_mode = new_mode;
450                         if (dwc_otg_is_host_mode(core_if))
451                                 dwc_otg_set_force_mode(core_if, new_mode);
452                         else
453                                 dwc_otg_force_host(core_if);
454                 }
455                 break;
456
457         case USB_MODE_FORCE_DEVICE:
458                 if (USB_MODE_FORCE_HOST == core_if->usb_mode) {
459                         core_if->usb_mode = new_mode;
460                         dwc_otg_force_device(core_if);
461                 } else if (USB_MODE_NORMAL == core_if->usb_mode) {
462                         core_if->usb_mode = new_mode;
463                         if (dwc_otg_is_device_mode(core_if))
464                                 dwc_otg_set_force_mode(core_if, new_mode);
465                         else
466                                 dwc_otg_force_device(core_if);
467                 }
468                 break;
469
470         case USB_MODE_NORMAL:
471                 if (USB_MODE_FORCE_DEVICE == core_if->usb_mode) {
472                         core_if->usb_mode = new_mode;
473                         cancel_delayed_work(&otg_dev->pcd->check_vbus_work);
474                         dwc_otg_set_force_mode(core_if, new_mode);
475                         /* msleep(100); */
476                         if (dwc_otg_is_host_mode(core_if)) {
477                                 dwc_otg_force_host(core_if);
478                         } else {
479                                 dwc_otg_pcd_start_check_vbus_work(otg_dev->pcd);
480                         }
481                 } else if (USB_MODE_FORCE_HOST == core_if->usb_mode) {
482                         core_if->usb_mode = new_mode;
483                         dwc_otg_set_force_mode(core_if, new_mode);
484                         /* msleep(100); */
485                         if (dwc_otg_is_device_mode(core_if)) {
486                                 dwc_otg_force_device(core_if);
487                         }
488                 }
489                 break;
490
491         default:
492                 break;
493         }
494         return count;
495 }
496
497 static DRIVER_ATTR(force_usb_mode, S_IRUGO | S_IWUSR, force_usb_mode_show,
498                    force_usb_mode_store);
499
500 static ssize_t dwc_otg_conn_en_show(struct device_driver *_drv, char *_buf)
501 {
502
503         dwc_otg_device_t *otg_dev = g_otgdev;
504         dwc_otg_pcd_t *_pcd = otg_dev->pcd;
505         return sprintf(_buf, "%d\n", _pcd->conn_en);
506
507 }
508
509 static ssize_t dwc_otg_conn_en_store(struct device_driver *_drv,
510                                      const char *_buf, size_t _count)
511 {
512         int enable = simple_strtoul(_buf, NULL, 10);
513         dwc_otg_device_t *otg_dev = g_otgdev;
514         dwc_otg_pcd_t *_pcd = otg_dev->pcd;
515         DWC_PRINTF("%s %d->%d\n", __func__, _pcd->conn_en, enable);
516
517         _pcd->conn_en = enable;
518         return _count;
519 }
520
521 static DRIVER_ATTR(dwc_otg_conn_en, S_IRUGO | S_IWUSR, dwc_otg_conn_en_show,
522                    dwc_otg_conn_en_store);
523
524 /* used for product vbus power control, SDK not need.
525  * If dwc_otg is host mode, enable vbus power.
526  * If dwc_otg is device mode, disable vbus power.
527  * return 1 - host mode, 0 - device mode.
528  */
529 int dwc_otg_usb_state(void)
530 {
531         dwc_otg_device_t *otg_dev = g_otgdev;
532
533         if (otg_dev) {
534                 /* op_state is A_HOST */
535                 if (1 == otg_dev->core_if->op_state)
536                         return 1;
537                 /* op_state is B_PERIPHERAL */
538                 else if (4 == otg_dev->core_if->op_state)
539                         return 0;
540                 else
541                         return 0;
542         } else {
543                 DWC_WARN("g_otgdev is NULL, maybe otg probe is failed!\n");
544                 return 0;
545         }
546 }
547 EXPORT_SYMBOL(dwc_otg_usb_state);
548
549 static ssize_t dwc_otg_op_state_show(struct device_driver *_drv, char *_buf)
550 {
551         dwc_otg_device_t *otg_dev = g_otgdev;
552
553         if (otg_dev) {
554                 return sprintf(_buf, "%d\n", otg_dev->core_if->op_state);
555         } else {
556                 return sprintf(_buf, "%d\n", 0);
557         }
558 }
559 static DRIVER_ATTR(op_state, S_IRUGO, dwc_otg_op_state_show, NULL);
560
561 static ssize_t vbus_status_show(struct device_driver *_drv, char *_buf)
562 {
563         dwc_otg_device_t *otg_dev = g_otgdev;
564         dwc_otg_pcd_t *_pcd = otg_dev->pcd;
565         return sprintf(_buf, "%d\n", _pcd->vbus_status);
566 }
567
568 static DRIVER_ATTR(vbus_status, S_IRUGO, vbus_status_show, NULL);
569
570 /**
571  * This function is called during module intialization
572  * to pass module parameters to the DWC_OTG CORE.
573  */
574 static int set_parameters(dwc_otg_core_if_t *core_if,
575                           struct dwc_otg_driver_module_params module_params)
576 {
577         int retval = 0;
578         int i;
579
580         if (module_params.otg_cap != -1) {
581                 retval +=
582                     dwc_otg_set_param_otg_cap(core_if, module_params.otg_cap);
583         }
584         if (module_params.dma_enable != -1) {
585                 retval +=
586                     dwc_otg_set_param_dma_enable(core_if,
587                                                  module_params.dma_enable);
588         }
589         if (module_params.dma_desc_enable != -1) {
590                 retval +=
591                     dwc_otg_set_param_dma_desc_enable(core_if,
592                                                       module_params.dma_desc_enable);
593         }
594         if (module_params.opt != -1) {
595                 retval += dwc_otg_set_param_opt(core_if, module_params.opt);
596         }
597         if (module_params.dma_burst_size != -1) {
598                 retval +=
599                     dwc_otg_set_param_dma_burst_size(core_if,
600                                                      module_params.dma_burst_size);
601         }
602         if (module_params.host_support_fs_ls_low_power != -1) {
603                 retval +=
604                     dwc_otg_set_param_host_support_fs_ls_low_power(core_if,
605                                                                    module_params.host_support_fs_ls_low_power);
606         }
607         if (module_params.enable_dynamic_fifo != -1) {
608                 retval +=
609                     dwc_otg_set_param_enable_dynamic_fifo(core_if,
610                                                           module_params.enable_dynamic_fifo);
611         }
612         if (module_params.data_fifo_size != -1) {
613                 retval +=
614                     dwc_otg_set_param_data_fifo_size(core_if,
615                                                      module_params.data_fifo_size);
616         }
617         if (module_params.dev_rx_fifo_size != -1) {
618                 retval +=
619                     dwc_otg_set_param_dev_rx_fifo_size(core_if,
620                                                        module_params.dev_rx_fifo_size);
621         }
622         if (module_params.dev_nperio_tx_fifo_size != -1) {
623                 retval +=
624                     dwc_otg_set_param_dev_nperio_tx_fifo_size(core_if,
625                                                               module_params.dev_nperio_tx_fifo_size);
626         }
627         if (module_params.host_rx_fifo_size != -1) {
628                 retval +=
629                     dwc_otg_set_param_host_rx_fifo_size(core_if,
630                                                         module_params.
631                                                         host_rx_fifo_size);
632         }
633         if (module_params.host_nperio_tx_fifo_size != -1) {
634                 retval +=
635                     dwc_otg_set_param_host_nperio_tx_fifo_size(core_if,
636                                                                module_params.host_nperio_tx_fifo_size);
637         }
638         if (module_params.host_perio_tx_fifo_size != -1) {
639                 retval +=
640                     dwc_otg_set_param_host_perio_tx_fifo_size(core_if,
641                                                               module_params.host_perio_tx_fifo_size);
642         }
643         if (module_params.max_transfer_size != -1) {
644                 retval +=
645                     dwc_otg_set_param_max_transfer_size(core_if,
646                                                         module_params.max_transfer_size);
647         }
648         if (module_params.max_packet_count != -1) {
649                 retval +=
650                     dwc_otg_set_param_max_packet_count(core_if,
651                                                        module_params.max_packet_count);
652         }
653         if (module_params.host_channels != -1) {
654                 retval +=
655                     dwc_otg_set_param_host_channels(core_if,
656                                                     module_params.host_channels);
657         }
658         if (module_params.dev_endpoints != -1) {
659                 retval +=
660                     dwc_otg_set_param_dev_endpoints(core_if,
661                                                     module_params.dev_endpoints);
662         }
663         if (module_params.phy_type != -1) {
664                 retval +=
665                     dwc_otg_set_param_phy_type(core_if, module_params.phy_type);
666         }
667         if (module_params.speed != -1) {
668                 retval += dwc_otg_set_param_speed(core_if, module_params.speed);
669         }
670         if (module_params.host_ls_low_power_phy_clk != -1) {
671                 retval +=
672                     dwc_otg_set_param_host_ls_low_power_phy_clk(core_if,
673                                                                 module_params.host_ls_low_power_phy_clk);
674         }
675         if (module_params.phy_ulpi_ddr != -1) {
676                 retval +=
677                     dwc_otg_set_param_phy_ulpi_ddr(core_if,
678                                                    module_params.phy_ulpi_ddr);
679         }
680         if (module_params.phy_ulpi_ext_vbus != -1) {
681                 retval +=
682                     dwc_otg_set_param_phy_ulpi_ext_vbus(core_if,
683                                                         module_params.phy_ulpi_ext_vbus);
684         }
685         if (module_params.phy_utmi_width != -1) {
686                 retval +=
687                     dwc_otg_set_param_phy_utmi_width(core_if,
688                                                      module_params.phy_utmi_width);
689         }
690         if (module_params.ulpi_fs_ls != -1) {
691                 retval +=
692                     dwc_otg_set_param_ulpi_fs_ls(core_if,
693                                                  module_params.ulpi_fs_ls);
694         }
695         if (module_params.ts_dline != -1) {
696                 retval +=
697                     dwc_otg_set_param_ts_dline(core_if, module_params.ts_dline);
698         }
699         if (module_params.i2c_enable != -1) {
700                 retval +=
701                     dwc_otg_set_param_i2c_enable(core_if,
702                                                  module_params.i2c_enable);
703         }
704         if (module_params.en_multiple_tx_fifo != -1) {
705                 retval +=
706                     dwc_otg_set_param_en_multiple_tx_fifo(core_if,
707                                                           module_params.en_multiple_tx_fifo);
708         }
709         for (i = 0; i < 15; i++) {
710                 if (module_params.dev_perio_tx_fifo_size[i] != -1) {
711                         retval +=
712                             dwc_otg_set_param_dev_perio_tx_fifo_size(core_if,
713                                                                      module_params.dev_perio_tx_fifo_size
714                                                                      [i], i);
715                 }
716         }
717
718         for (i = 0; i < 15; i++) {
719                 if (module_params.dev_tx_fifo_size[i] != -1) {
720                         retval += dwc_otg_set_param_dev_tx_fifo_size(core_if,
721                                                                      module_params.dev_tx_fifo_size
722                                                                      [i], i);
723                 }
724         }
725         if (module_params.thr_ctl != -1) {
726                 retval +=
727                     dwc_otg_set_param_thr_ctl(core_if, module_params.thr_ctl);
728         }
729         if (module_params.mpi_enable != -1) {
730                 retval +=
731                     dwc_otg_set_param_mpi_enable(core_if,
732                                                  module_params.mpi_enable);
733         }
734         if (module_params.pti_enable != -1) {
735                 retval +=
736                     dwc_otg_set_param_pti_enable(core_if,
737                                                  module_params.pti_enable);
738         }
739         if (module_params.lpm_enable != -1) {
740                 retval +=
741                     dwc_otg_set_param_lpm_enable(core_if,
742                                                  module_params.lpm_enable);
743         }
744         if (module_params.besl_enable != -1) {
745                 retval +=
746                     dwc_otg_set_param_besl_enable(core_if,
747                                                   module_params.besl_enable);
748         }
749         if (module_params.baseline_besl != -1) {
750                 retval +=
751                     dwc_otg_set_param_baseline_besl(core_if,
752                                                     module_params.baseline_besl);
753         }
754         if (module_params.deep_besl != -1) {
755                 retval +=
756                     dwc_otg_set_param_deep_besl(core_if,
757                                                 module_params.deep_besl);
758         }
759         if (module_params.ic_usb_cap != -1) {
760                 retval +=
761                     dwc_otg_set_param_ic_usb_cap(core_if,
762                                                  module_params.ic_usb_cap);
763         }
764         if (module_params.tx_thr_length != -1) {
765                 retval +=
766                     dwc_otg_set_param_tx_thr_length(core_if,
767                                                     module_params.
768                                                     tx_thr_length);
769         }
770         if (module_params.rx_thr_length != -1) {
771                 retval +=
772                     dwc_otg_set_param_rx_thr_length(core_if,
773                                                     module_params.rx_thr_length);
774         }
775         if (module_params.ahb_thr_ratio != -1) {
776                 retval +=
777                     dwc_otg_set_param_ahb_thr_ratio(core_if,
778                                                     module_params.
779                                                     ahb_thr_ratio);
780         }
781         if (module_params.power_down != -1) {
782                 retval +=
783                     dwc_otg_set_param_power_down(core_if,
784                                                  module_params.power_down);
785         }
786         if (module_params.reload_ctl != -1) {
787                 retval +=
788                     dwc_otg_set_param_reload_ctl(core_if,
789                                                  module_params.reload_ctl);
790         }
791
792         if (module_params.dev_out_nak != -1) {
793                 retval +=
794                     dwc_otg_set_param_dev_out_nak(core_if,
795                                                   module_params.dev_out_nak);
796         }
797
798         if (module_params.cont_on_bna != -1) {
799                 retval +=
800                     dwc_otg_set_param_cont_on_bna(core_if,
801                                                   module_params.cont_on_bna);
802         }
803
804         if (module_params.ahb_single != -1) {
805                 retval +=
806                     dwc_otg_set_param_ahb_single(core_if,
807                                                  module_params.ahb_single);
808         }
809
810         if (module_params.otg_ver != -1) {
811                 retval +=
812                     dwc_otg_set_param_otg_ver(core_if, module_params.otg_ver);
813         }
814         if (module_params.adp_enable != -1) {
815                 retval +=
816                     dwc_otg_set_param_adp_enable(core_if,
817                                                  module_params.adp_enable);
818         }
819         return retval;
820 }
821
822 /**
823  * This function is the top level interrupt handler for the Common
824  * (Device and host modes) interrupts.
825  */
826 static irqreturn_t dwc_otg_common_irq(int irq, void *dev)
827 {
828         int32_t retval = IRQ_NONE;
829
830         retval = dwc_otg_handle_common_intr(dev);
831         if (retval != 0) {
832                 /* S3C2410X_CLEAR_EINTPEND(); */
833         }
834         return IRQ_RETVAL(retval);
835 }
836
837 #ifdef CONFIG_USB20_HOST
838 /**
839  * This function is called when a lm_device is unregistered with the
840  * dwc_otg_driver. This happens, for example, when the rmmod command is
841  * executed. The device may or may not be electrically present. If it is
842  * present, the driver stops device processing. Any resources used on behalf
843  * of this device are freed.
844  *
845  * @param _dev
846  */
847 static int host20_driver_remove(struct platform_device *_dev)
848 {
849
850         dwc_otg_device_t *otg_dev = dwc_get_device_platform_data(_dev);
851         DWC_DEBUGPL(DBG_ANY, "%s(%p)\n", __func__, _dev);
852
853         if (!otg_dev) {
854                 /* Memory allocation for the dwc_otg_device failed. */
855                 DWC_DEBUGPL(DBG_ANY, "%s: otg_dev NULL!\n", __func__);
856                 return 0;
857         }
858 #ifndef DWC_DEVICE_ONLY
859         if (otg_dev->hcd) {
860                 hcd_remove(_dev);
861         } else {
862                 DWC_DEBUGPL(DBG_ANY, "%s: otg_dev->hcd NULL!\n", __func__);
863                 return 0;
864         }
865 #endif
866
867 #ifndef DWC_HOST_ONLY
868         if (otg_dev->pcd) {
869                 pcd_remove(_dev);
870         } else {
871                 DWC_DEBUGPL(DBG_ANY, "%s: otg_dev->pcd NULL!\n", __func__);
872                 return 0;
873         }
874 #endif
875
876         /*
877          * Free the IRQ
878          */
879         if (otg_dev->common_irq_installed) {
880                 /* free_irq(_dev->irq, otg_dev); */
881                 free_irq(platform_get_irq(_dev, 0), otg_dev);
882         } else {
883                 DWC_DEBUGPL(DBG_ANY, "%s: There is no installed irq!\n",
884                             __func__);
885                 return 0;
886         }
887
888         if (otg_dev->core_if) {
889                 dwc_otg_cil_remove(otg_dev->core_if);
890         } else {
891                 DWC_DEBUGPL(DBG_ANY, "%s: otg_dev->core_if NULL!\n", __func__);
892                 return 0;
893         }
894
895         /*
896          * Remove the device attributes
897          */
898         dwc_otg_attr_remove(_dev);
899
900         /*
901          * Return the memory.
902          */
903         if (otg_dev->os_dep.base) {
904                 iounmap(otg_dev->os_dep.base);
905         }
906         DWC_FREE(otg_dev);
907
908         /*
909          * Clear the drvdata pointer.
910          */
911
912         dwc_set_device_platform_data(_dev, 0);
913
914         return 0;
915 }
916
917 static const struct of_device_id usb20_host_of_match[] = {
918         {
919          .compatible = "rockchip,rk3188_usb20_host",
920          .data = &usb20host_pdata_rk3188,
921          },
922         {
923          .compatible = "rockchip,rk3288_usb20_host",
924          .data = &usb20host_pdata_rk3288,
925          },
926         {
927          .compatible = "rockchip,rk3036_usb20_host",
928          .data = &usb20host_pdata_rk3036,
929          },
930         {
931          .compatible = "rockchip,rk3126_usb20_host",
932          .data = &usb20host_pdata_rk3126,
933          },
934         {},
935 };
936
937 MODULE_DEVICE_TABLE(of, usb20_host_of_match);
938
939 /**
940  * This function is called when an lm_device is bound to a
941  * dwc_otg_driver. It creates the driver components required to
942  * control the device (CIL, HCD, and PCD) and it initializes the
943  * device. The driver components are stored in a dwc_otg_device
944  * structure. A reference to the dwc_otg_device is saved in the
945  * lm_device. This allows the driver to access the dwc_otg_device
946  * structure on subsequent calls to driver methods for this device.
947  *
948  * @param _dev Bus device
949  */
950 static int host20_driver_probe(struct platform_device *_dev)
951 {
952         int retval = 0;
953         int irq;
954         struct resource *res_base;
955         dwc_otg_device_t *dwc_otg_device;
956         struct device *dev = &_dev->dev;
957         struct device_node *node = _dev->dev.of_node;
958         struct dwc_otg_platform_data *pldata;
959         const struct of_device_id *match =
960             of_match_device(of_match_ptr(usb20_host_of_match), &_dev->dev);
961
962         if (match && match->data) {
963                 dev->platform_data = (void *)match->data;
964         } else {
965                 dev_err(dev, "usb20host match failed\n");
966                 return -EINVAL;
967         }
968
969         pldata = dev->platform_data;
970         pldata->dev = dev;
971
972         if (!node) {
973                 dev_err(dev, "device node not found\n");
974                 return -EINVAL;
975         }
976
977         if (pldata->hw_init)
978                 pldata->hw_init();
979
980         if (pldata->clock_init) {
981                 pldata->clock_init(pldata);
982                 pldata->clock_enable(pldata, 1);
983         }
984
985         if (pldata->phy_suspend)
986                 pldata->phy_suspend(pldata, USB_PHY_ENABLED);
987
988         if (pldata->soft_reset)
989                 pldata->soft_reset(pldata, RST_POR);
990
991         res_base = platform_get_resource(_dev, IORESOURCE_MEM, 0);
992
993         dwc_otg_device = DWC_ALLOC(sizeof(dwc_otg_device_t));
994
995         if (!dwc_otg_device) {
996                 dev_err(&_dev->dev, "kmalloc of dwc_otg_device failed\n");
997                 retval = -ENOMEM;
998                 goto clk_disable;
999         }
1000
1001         memset(dwc_otg_device, 0, sizeof(*dwc_otg_device));
1002         dwc_otg_device->os_dep.reg_offset = 0xFFFFFFFF;
1003
1004         /*
1005          * Map the DWC_otg Core memory into virtual address space.
1006          */
1007
1008         dwc_otg_device->os_dep.base = devm_ioremap_resource(dev, res_base);
1009
1010         if (!dwc_otg_device->os_dep.base) {
1011                 dev_err(&_dev->dev, "ioremap() failed\n");
1012                 DWC_FREE(dwc_otg_device);
1013                 retval = -ENOMEM;
1014                 goto clk_disable;
1015         }
1016         dev_dbg(&_dev->dev, "base=0x%08x\n",
1017                 (unsigned)dwc_otg_device->os_dep.base);
1018
1019         /*
1020          * Initialize driver data to point to the global DWC_otg
1021          * Device structure.
1022          */
1023
1024         dwc_set_device_platform_data(_dev, dwc_otg_device);
1025         pldata->privdata = dwc_otg_device;
1026         dwc_otg_device->pldata = (void *)pldata;
1027
1028         dev_dbg(&_dev->dev, "dwc_otg_device=0x%p\n", dwc_otg_device);
1029
1030         dwc_otg_device->core_if = dwc_otg_cil_init(dwc_otg_device->os_dep.base);
1031
1032         if (!dwc_otg_device->core_if) {
1033                 dev_err(&_dev->dev, "CIL initialization failed!\n");
1034                 retval = -ENOMEM;
1035                 goto fail;
1036         }
1037
1038         dwc_otg_device->core_if->otg_dev = dwc_otg_device;
1039
1040         /*
1041          * Attempt to ensure this device is really a DWC_otg Controller.
1042          * Read and verify the SNPSID register contents. The value should be
1043          * 0x45F42XXX or 0x45F42XXX, which corresponds to either "OT2" or "OTG3",
1044          * as in "OTG version 2.XX" or "OTG version 3.XX".
1045          */
1046
1047         if (((dwc_otg_get_gsnpsid(dwc_otg_device->core_if) & 0xFFFFF000) !=
1048              0x4F542000)
1049             && ((dwc_otg_get_gsnpsid(dwc_otg_device->core_if) & 0xFFFFF000) !=
1050                 0x4F543000)) {
1051                 dev_err(&_dev->dev, "Bad value for SNPSID: 0x%08x\n",
1052                         dwc_otg_get_gsnpsid(dwc_otg_device->core_if));
1053                 retval = -EINVAL;
1054                 goto fail;
1055         }
1056
1057         /*
1058          * Validate parameter values.
1059          */
1060         if (set_parameters(dwc_otg_device->core_if, dwc_host_module_params)) {
1061                 retval = -EINVAL;
1062                 goto fail;
1063         }
1064
1065         /*
1066          * Create Device Attributes in sysfs
1067          */
1068         dwc_otg_attr_create(_dev);
1069
1070         /*
1071          * Disable the global interrupt until all the interrupt
1072          * handlers are installed.
1073          */
1074         dwc_otg_disable_global_interrupts(dwc_otg_device->core_if);
1075
1076         /*
1077          * Install the interrupt handler for the common interrupts before
1078          * enabling common interrupts in core_init below.
1079          */
1080         irq = platform_get_irq(_dev, 0);
1081         DWC_DEBUGPL(DBG_CIL, "registering (common) handler for irq%d\n", irq);
1082         retval = request_irq(irq, dwc_otg_common_irq,
1083                              IRQF_SHARED, "dwc_otg", dwc_otg_device);
1084         if (retval) {
1085                 DWC_ERROR("request of irq%d failed\n", irq);
1086                 retval = -EBUSY;
1087                 goto fail;
1088         } else {
1089                 dwc_otg_device->common_irq_installed = 1;
1090         }
1091
1092         /*
1093          * Initialize the DWC_otg core.
1094          * In order to reduce the time of initialization,
1095          * we do core soft reset after connection detected.
1096          */
1097         dwc_otg_core_init_no_reset(dwc_otg_device->core_if);
1098
1099         /*
1100          * Initialize the HCD
1101          */
1102         retval = host20_hcd_init(_dev);
1103         if (retval != 0) {
1104                 DWC_ERROR("hcd_init failed\n");
1105                 dwc_otg_device->hcd = NULL;
1106                 goto fail;
1107         }
1108
1109         clk_set_rate(pldata->phyclk_480m, 480000000);
1110         /*
1111          * Enable the global interrupt after all the interrupt
1112          * handlers are installed if there is no ADP support else
1113          * perform initial actions required for Internal ADP logic.
1114          */
1115         if (!dwc_otg_get_param_adp_enable(dwc_otg_device->core_if)) {
1116                 if (pldata->phy_status == USB_PHY_ENABLED) {
1117                         pldata->phy_suspend(pldata, USB_PHY_SUSPEND);
1118                         udelay(3);
1119                         pldata->clock_enable(pldata, 0);
1120                 }
1121                 /* dwc_otg_enable_global_interrupts(dwc_otg_device->core_if); */
1122         } else
1123                 dwc_otg_adp_start(dwc_otg_device->core_if,
1124                                   dwc_otg_is_host_mode(dwc_otg_device->
1125                                                        core_if));
1126
1127         return 0;
1128
1129 fail:
1130         host20_driver_remove(_dev);
1131 clk_disable:
1132         if (pldata->clock_enable)
1133                 pldata->clock_enable(pldata, 0);
1134
1135         return retval;
1136 }
1137 #endif
1138
1139 static int dwc_otg_driver_suspend(struct platform_device *_dev,
1140                                   pm_message_t state)
1141 {
1142         return 0;
1143 }
1144
1145 static int dwc_otg_driver_resume(struct platform_device *_dev)
1146 {
1147         return 0;
1148 }
1149
1150 static void dwc_otg_driver_shutdown(struct platform_device *_dev)
1151 {
1152         struct device *dev = &_dev->dev;
1153         struct dwc_otg_platform_data *pldata = dev->platform_data;
1154         dwc_otg_device_t *otg_dev = dev->platform_data;
1155         dwc_otg_core_if_t *core_if = otg_dev->core_if;
1156         dctl_data_t dctl = {.d32 = 0 };
1157
1158         DWC_PRINTF("%s: disconnect USB %s mode\n", __func__,
1159                    dwc_otg_is_host_mode(core_if) ? "host" : "device");
1160
1161     if( pldata->dwc_otg_uart_mode != NULL)
1162         pldata->dwc_otg_uart_mode( pldata, PHY_USB_MODE);
1163     if(pldata->phy_suspend != NULL)
1164         pldata->phy_suspend(pldata, USB_PHY_ENABLED);
1165         if (dwc_otg_is_host_mode(core_if)) {
1166                 if (core_if->hcd_cb && core_if->hcd_cb->stop)
1167                         core_if->hcd_cb->stop(core_if->hcd_cb_p);
1168         } else {
1169                 /* soft disconnect */
1170                 dctl.d32 =
1171                     DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dctl);
1172                 dctl.b.sftdiscon = 1;
1173                 DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dctl,
1174                                 dctl.d32);
1175         }
1176         /* Clear any pending interrupts */
1177         DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, 0xFFFFFFFF);
1178
1179 }
1180
1181 /**
1182  * This structure defines the methods to be called by a bus driver
1183  * during the lifecycle of a device on that bus. Both drivers and
1184  * devices are registered with a bus driver. The bus driver matches
1185  * devices to drivers based on information in the device and driver
1186  * structures.
1187  *
1188  * The probe function is called when the bus driver matches a device
1189  * to this driver. The remove function is called when a device is
1190  * unregistered with the bus driver.
1191  */
1192 #ifdef CONFIG_USB20_HOST
1193 static struct platform_driver dwc_host_driver = {
1194         .driver = {
1195                    .name = (char *)dwc_host20_driver_name,
1196                    .of_match_table = of_match_ptr(usb20_host_of_match),
1197                    },
1198         .probe = host20_driver_probe,
1199         .remove = host20_driver_remove,
1200         .suspend = dwc_otg_driver_suspend,
1201         .resume = dwc_otg_driver_resume,
1202 };
1203 #endif
1204
1205 #ifdef CONFIG_USB20_OTG
1206 /**
1207  * This function is called when a lm_device is unregistered with the
1208  * dwc_otg_driver. This happens, for example, when the rmmod command is
1209  * executed. The device may or may not be electrically present. If it is
1210  * present, the driver stops device processing. Any resources used on behalf
1211  * of this device are freed.
1212  *
1213  * @param _dev
1214  */
1215 static int otg20_driver_remove(struct platform_device *_dev)
1216 {
1217
1218         dwc_otg_device_t *otg_dev = dwc_get_device_platform_data(_dev);
1219         DWC_DEBUGPL(DBG_ANY, "%s(%p)\n", __func__, _dev);
1220
1221         if (!otg_dev) {
1222                 /* Memory allocation for the dwc_otg_device failed. */
1223                 DWC_DEBUGPL(DBG_ANY, "%s: otg_dev NULL!\n", __func__);
1224                 return 0;
1225         }
1226 #ifndef DWC_DEVICE_ONLY
1227         if (otg_dev->hcd) {
1228                 hcd_remove(_dev);
1229         } else {
1230                 DWC_DEBUGPL(DBG_ANY, "%s: otg_dev->hcd NULL!\n", __func__);
1231                 return 0;
1232         }
1233 #endif
1234
1235 #ifndef DWC_HOST_ONLY
1236         if (otg_dev->pcd) {
1237                 pcd_remove(_dev);
1238         } else {
1239                 DWC_DEBUGPL(DBG_ANY, "%s: otg_dev->pcd NULL!\n", __func__);
1240                 return 0;
1241         }
1242 #endif
1243         /*
1244          * Free the IRQ
1245          */
1246         if (otg_dev->common_irq_installed) {
1247                 /* free_irq(_dev->irq, otg_dev); */
1248                 free_irq(platform_get_irq(_dev, 0), otg_dev);
1249         } else {
1250                 DWC_DEBUGPL(DBG_ANY, "%s: There is no installed irq!\n",
1251                             __func__);
1252                 return 0;
1253         }
1254
1255         if (otg_dev->core_if) {
1256                 dwc_otg_cil_remove(otg_dev->core_if);
1257         } else {
1258                 DWC_DEBUGPL(DBG_ANY, "%s: otg_dev->core_if NULL!\n", __func__);
1259                 return 0;
1260         }
1261
1262         /*
1263          * Remove the device attributes
1264          */
1265         dwc_otg_attr_remove(_dev);
1266
1267         /*
1268          * Return the memory.
1269          */
1270         if (otg_dev->os_dep.base)
1271                 iounmap(otg_dev->os_dep.base);
1272         DWC_FREE(otg_dev);
1273
1274         /*
1275          * Clear the drvdata pointer.
1276          */
1277
1278         dwc_set_device_platform_data(_dev, 0);
1279
1280         return 0;
1281 }
1282
1283 static const struct of_device_id usb20_otg_of_match[] = {
1284         {
1285          .compatible = "rockchip,rk3188_usb20_otg",
1286          .data = &usb20otg_pdata_rk3188,
1287          },
1288         {
1289          .compatible = "rockchip,rk3288_usb20_otg",
1290          .data = &usb20otg_pdata_rk3288,
1291          },
1292         {
1293          .compatible = "rockchip,rk3036_usb20_otg",
1294          .data = &usb20otg_pdata_rk3036,
1295          },
1296         {
1297          .compatible = "rockchip,rk3126_usb20_otg",
1298          .data = &usb20otg_pdata_rk3126,
1299          },
1300         { },
1301 };
1302
1303 MODULE_DEVICE_TABLE(of, usb20_otg_of_match);
1304
1305 /**
1306  * This function is called when an lm_device is bound to a
1307  * dwc_otg_driver. It creates the driver components required to
1308  * control the device (CIL, HCD, and PCD) and it initializes the
1309  * device. The driver components are stored in a dwc_otg_device
1310  * structure. A reference to the dwc_otg_device is saved in the
1311  * lm_device. This allows the driver to access the dwc_otg_device
1312  * structure on subsequent calls to driver methods for this device.
1313  *
1314  * @param _dev Bus device
1315  */
1316 static int otg20_driver_probe(struct platform_device *_dev)
1317 {
1318         int retval = 0;
1319         int irq;
1320         uint32_t val;
1321         struct resource *res_base;
1322         dwc_otg_device_t *dwc_otg_device;
1323         struct device *dev = &_dev->dev;
1324         struct device_node *node = _dev->dev.of_node;
1325         struct dwc_otg_platform_data *pldata;
1326         const struct of_device_id *match =
1327             of_match_device(of_match_ptr(usb20_otg_of_match), &_dev->dev);
1328
1329         if (match) {
1330                 dev->platform_data = (void *)match->data;
1331         } else {
1332                 dev_err(dev, "usb20otg match failed\n");
1333                 return -EINVAL;
1334         }
1335
1336         pldata = dev->platform_data;
1337         pldata->dev = dev;
1338
1339         if (!node) {
1340                 dev_err(dev, "device node not found\n");
1341                 return -EINVAL;
1342         }
1343         /*todo : move to usbdev_rk-XX.c */
1344         if (pldata->hw_init)
1345                 pldata->hw_init();
1346
1347         if (pldata->clock_init) {
1348                 pldata->clock_init(pldata);
1349                 pldata->clock_enable(pldata, 1);
1350         }
1351
1352         if (pldata->phy_suspend)
1353                 pldata->phy_suspend(pldata, USB_PHY_ENABLED);
1354
1355         if (pldata->dwc_otg_uart_mode)
1356                 pldata->dwc_otg_uart_mode(pldata, PHY_USB_MODE);
1357
1358         /* do reset later, because reset need about
1359          * 100ms to ensure otg id state change.
1360          */
1361         /*
1362            if(pldata->soft_reset)
1363            pldata->soft_reset();
1364          */
1365         /*end todo */
1366
1367         res_base = platform_get_resource(_dev, IORESOURCE_MEM, 0);
1368
1369         dwc_otg_device = DWC_ALLOC(sizeof(dwc_otg_device_t));
1370
1371         if (!dwc_otg_device) {
1372                 dev_err(&_dev->dev, "kmalloc of dwc_otg_device failed\n");
1373                 retval = -ENOMEM;
1374                 goto clk_disable;
1375         }
1376
1377         memset(dwc_otg_device, 0, sizeof(*dwc_otg_device));
1378         dwc_otg_device->os_dep.reg_offset = 0xFFFFFFFF;
1379
1380         /*
1381          * Map the DWC_otg Core memory into virtual address space.
1382          */
1383
1384         dwc_otg_device->os_dep.base = devm_ioremap_resource(dev, res_base);
1385
1386         if (!dwc_otg_device->os_dep.base) {
1387                 dev_err(&_dev->dev, "ioremap() failed\n");
1388                 DWC_FREE(dwc_otg_device);
1389                 retval = -ENOMEM;
1390                 goto clk_disable;
1391         }
1392         dev_dbg(&_dev->dev, "base=0x%08x\n",
1393                 (unsigned)dwc_otg_device->os_dep.base);
1394
1395         /*
1396          * Initialize driver data to point to the global DWC_otg
1397          * Device structure.
1398          */
1399
1400         g_otgdev = dwc_otg_device;
1401         pldata->privdata = dwc_otg_device;
1402         dwc_otg_device->pldata = pldata;
1403
1404         dwc_set_device_platform_data(_dev, dwc_otg_device);
1405
1406         dev_dbg(&_dev->dev, "dwc_otg_device=0x%p\n", dwc_otg_device);
1407
1408         dwc_otg_device->core_if = dwc_otg_cil_init(dwc_otg_device->os_dep.base);
1409         if (!dwc_otg_device->core_if) {
1410                 dev_err(&_dev->dev, "CIL initialization failed!\n");
1411                 retval = -ENOMEM;
1412                 goto fail;
1413         }
1414
1415         dwc_otg_device->core_if->otg_dev = dwc_otg_device;
1416         /*
1417          * Attempt to ensure this device is really a DWC_otg Controller.
1418          * Read and verify the SNPSID register contents. The value should be
1419          * 0x45F42XXX or 0x45F42XXX, which corresponds to either "OT2" or "OTG3",
1420          * as in "OTG version 2.XX" or "OTG version 3.XX".
1421          */
1422
1423         if (((dwc_otg_get_gsnpsid(dwc_otg_device->core_if) & 0xFFFFF000) !=
1424              0x4F542000)
1425             && ((dwc_otg_get_gsnpsid(dwc_otg_device->core_if) & 0xFFFFF000) !=
1426                 0x4F543000)) {
1427                 dev_err(&_dev->dev, "Bad value for SNPSID: 0x%08x\n",
1428                         dwc_otg_get_gsnpsid(dwc_otg_device->core_if));
1429                 retval = -EINVAL;
1430                 goto fail;
1431         }
1432
1433         /*
1434          * Validate parameter values.
1435          */
1436         if (set_parameters(dwc_otg_device->core_if, dwc_otg_module_params)) {
1437                 retval = -EINVAL;
1438                 goto fail;
1439         }
1440
1441         /*
1442          * Create Device Attributes in sysfs
1443          */
1444         dwc_otg_attr_create(_dev);
1445
1446         /*
1447          * Disable the global interrupt until all the interrupt
1448          * handlers are installed.
1449          */
1450         dwc_otg_disable_global_interrupts(dwc_otg_device->core_if);
1451
1452         /*
1453          * Install the interrupt handler for the common interrupts before
1454          * enabling common interrupts in core_init below.
1455          */
1456         irq = platform_get_irq(_dev, 0);
1457         DWC_DEBUGPL(DBG_CIL, "registering (common) handler for irq%d\n", irq);
1458         retval = request_irq(irq, dwc_otg_common_irq,
1459                              IRQF_SHARED, "dwc_otg", dwc_otg_device);
1460         if (retval) {
1461                 DWC_ERROR("request of irq%d failed\n", irq);
1462                 retval = -EBUSY;
1463                 goto fail;
1464         } else {
1465                 dwc_otg_device->common_irq_installed = 1;
1466         }
1467
1468         /*
1469          * Initialize the DWC_otg core.
1470          * In order to reduce the time of initialization,
1471          * we do core soft reset after connection detected.
1472          */
1473         dwc_otg_core_init_no_reset(dwc_otg_device->core_if);
1474
1475         /* set otg mode
1476          * 0 - USB_MODE_NORMAL
1477          * 1 - USB_MODE_FORCE_HOST
1478          * 2 - USB_MODE_FORCE_DEVICE
1479          */
1480         of_property_read_u32(node, "rockchip,usb-mode", &val);
1481         dwc_otg_device->core_if->usb_mode = val;
1482
1483 #ifndef DWC_HOST_ONLY
1484         /*
1485          * Initialize the PCD
1486          */
1487         retval = pcd_init(_dev);
1488         if (retval != 0) {
1489                 DWC_ERROR("pcd_init failed\n");
1490                 dwc_otg_device->pcd = NULL;
1491                 goto fail;
1492         }
1493 #endif
1494 #ifndef DWC_DEVICE_ONLY
1495         /*
1496          * Initialize the HCD
1497          */
1498         retval = otg20_hcd_init(_dev);
1499         if (retval != 0) {
1500                 DWC_ERROR("hcd_init failed\n");
1501                 dwc_otg_device->hcd = NULL;
1502                 goto fail;
1503         }
1504 #endif
1505         /*
1506          * Enable the global interrupt after all the interrupt
1507          * handlers are installed if there is no ADP support else
1508          * perform initial actions required for Internal ADP logic.
1509          */
1510         if (!dwc_otg_get_param_adp_enable(dwc_otg_device->core_if)) {
1511                 if (pldata->phy_status == USB_PHY_ENABLED) {
1512                         pldata->phy_suspend(pldata, USB_PHY_SUSPEND);
1513                         udelay(3);
1514                         pldata->clock_enable(pldata, 0);
1515                 }
1516                 /* dwc_otg_enable_global_interrupts(dwc_otg_device->core_if); */
1517         } else
1518                 dwc_otg_adp_start(dwc_otg_device->core_if,
1519                                   dwc_otg_is_host_mode(dwc_otg_device->
1520                                                        core_if));
1521
1522         return 0;
1523
1524 fail:
1525         otg20_driver_remove(_dev);
1526
1527 clk_disable:
1528         if (pldata->clock_enable)
1529                 pldata->clock_enable(pldata, 0);
1530
1531         return retval;
1532 }
1533
1534 #ifdef CONFIG_PM
1535 static int dwc_otg_pm_suspend(struct device *dev)
1536 {
1537         dwc_otg_device_t *dwc_otg_device;
1538         struct dwc_otg_platform_data *pdata_otg;
1539
1540         dwc_otg_device = dev_get_platdata(dev);
1541
1542         dev_dbg(dev, "dwc_otg PM suspend\n");
1543
1544         if (dwc_otg_device->core_if->op_state == B_PERIPHERAL)
1545                 return 0;
1546
1547         pdata_otg = dwc_otg_device->pldata;
1548         pdata_otg->phy_suspend(pdata_otg, USB_PHY_SUSPEND);
1549
1550         return 0;
1551 }
1552
1553 static int dwc_otg_pm_resume(struct device *dev)
1554 {
1555         dwc_otg_device_t *dwc_otg_device;
1556         struct dwc_otg_platform_data *pdata_otg;
1557
1558         dwc_otg_device = dev_get_platdata(dev);
1559
1560         dev_dbg(dev, "dwc_otg PM resume\n");
1561
1562         if (dwc_otg_device->core_if->op_state == B_PERIPHERAL)
1563                 return 0;
1564
1565         pdata_otg = dwc_otg_device->pldata;
1566         pdata_otg->phy_suspend(pdata_otg, USB_PHY_ENABLED);
1567
1568         return 0;
1569 }
1570 #else
1571 #define dwc_otg_pm_suspend     NULL
1572 #define dwc_otg_pm_resume      NULL
1573 #endif
1574
1575 static const struct dev_pm_ops dwc_otg_dev_pm_ops = {
1576         .suspend = dwc_otg_pm_suspend,
1577         .resume = dwc_otg_pm_resume,
1578 };
1579
1580 static struct platform_driver dwc_otg_driver = {
1581         .driver = {
1582                    .name = (char *)dwc_otg20_driver_name,
1583                    .of_match_table = of_match_ptr(usb20_otg_of_match),
1584 #ifdef CONFIG_PM
1585                    .pm = &dwc_otg_dev_pm_ops,
1586 #endif
1587                    },
1588         .probe = otg20_driver_probe,
1589         .remove = otg20_driver_remove,
1590         .suspend = dwc_otg_driver_suspend,
1591         .resume = dwc_otg_driver_resume,
1592         .shutdown = dwc_otg_driver_shutdown,
1593 };
1594 #endif
1595
1596 void rk_usb_power_up(void)
1597 {
1598         struct dwc_otg_platform_data *pldata_otg;
1599         struct dwc_otg_platform_data *pldata_host;
1600         struct rkehci_platform_data *pldata_ehci;
1601
1602         if (cpu_is_rk3288()) {
1603 #ifdef CONFIG_RK_USB_UART
1604                 /* enable USB bypass UART function  */
1605                 writel_relaxed(0x00c00000 | usb_to_uart_status,
1606                                RK_GRF_VIRT + RK3288_GRF_UOC0_CON3);
1607
1608 #endif
1609                 /* unset siddq,the analog blocks are powered up */
1610 #ifdef CONFIG_USB20_OTG
1611                 pldata_otg = &usb20otg_pdata_rk3288;
1612                 if (pldata_otg) {
1613                         if (pldata_otg->phy_status == USB_PHY_SUSPEND)
1614                                 writel_relaxed((0x01 << 13) << 16,
1615                                                RK_GRF_VIRT +
1616                                                RK3288_GRF_UOC0_CON0);
1617                 }
1618 #endif
1619 #ifdef CONFIG_USB20_HOST
1620                 pldata_host = &usb20host_pdata_rk3288;
1621                 if (pldata_host) {
1622                         if (pldata_host->phy_status == USB_PHY_SUSPEND)
1623                                 writel_relaxed((0x01 << 13) << 16,
1624                                                RK_GRF_VIRT +
1625                                                RK3288_GRF_UOC2_CON0);
1626                 }
1627 #endif
1628 #ifdef CONFIG_USB_EHCI_RK
1629                 pldata_ehci = &rkehci_pdata_rk3288;
1630                 if (pldata_ehci) {
1631                         if (pldata_ehci->phy_status == USB_PHY_SUSPEND)
1632                                 writel_relaxed((0x01 << 13) << 16,
1633                                                RK_GRF_VIRT +
1634                                                RK3288_GRF_UOC1_CON0);
1635                 }
1636 #endif
1637
1638         } else {
1639                 dwc_otg_device_t *otg_dev = g_otgdev;
1640
1641                 if (!otg_dev)
1642                         return;
1643
1644                 pldata_otg = otg_dev->pldata;
1645                 if (pldata_otg && pldata_otg->phy_power_down)
1646                         pldata_otg->phy_power_down(PHY_POWER_UP);
1647         }
1648 }
1649
1650 void rk_usb_power_down(void)
1651 {
1652         struct dwc_otg_platform_data *pldata_otg;
1653         struct dwc_otg_platform_data *pldata_host;
1654         struct rkehci_platform_data *pldata_ehci;
1655
1656         if (cpu_is_rk3288()) {
1657 #ifdef CONFIG_RK_USB_UART
1658                 /* disable USB bypass UART function */
1659                 usb_to_uart_status =
1660                     readl_relaxed(RK_GRF_VIRT + RK3288_GRF_UOC0_CON3);
1661                 writel_relaxed(0x00c00000, RK_GRF_VIRT + RK3288_GRF_UOC0_CON3);
1662 #endif
1663                 /* set siddq,the analog blocks are powered down
1664                  * note:
1665                  * 1. Before asserting SIDDQ, ensure that VDATSRCENB0,
1666                  * VDATDETENB0, DCDENB0, BYPASSSEL0, ADPPRBENB0,
1667                  * and TESTBURNIN are set to 1'b0.
1668                  * 2. Before asserting SIDDQ, ensure that phy enter suspend.*/
1669 #ifdef CONFIG_USB20_OTG
1670                 pldata_otg = &usb20otg_pdata_rk3288;
1671                 if (pldata_otg) {
1672                         if (pldata_otg->phy_status == USB_PHY_SUSPEND)
1673                                 writel_relaxed((0x01 << 13) |
1674                                                ((0x01 << 13) << 16),
1675                                                RK_GRF_VIRT +
1676                                                RK3288_GRF_UOC0_CON0);
1677                 }
1678 #endif
1679 #ifdef CONFIG_USB20_HOST
1680                 pldata_host = &usb20host_pdata_rk3288;
1681                 if (pldata_host) {
1682                         if (pldata_host->phy_status == USB_PHY_SUSPEND)
1683                                 writel_relaxed((0x01 << 13) |
1684                                                ((0x01 << 13) << 16),
1685                                                RK_GRF_VIRT +
1686                                                RK3288_GRF_UOC2_CON0);
1687                 }
1688 #endif
1689 #ifdef CONFIG_USB_EHCI_RK
1690                 pldata_ehci = &rkehci_pdata_rk3288;
1691                 if (pldata_ehci) {
1692                         if (pldata_ehci->phy_status == USB_PHY_SUSPEND)
1693                                 writel_relaxed((0x01 << 13) |
1694                                                ((0x01 << 13) << 16),
1695                                                RK_GRF_VIRT +
1696                                                RK3288_GRF_UOC1_CON0);
1697                 }
1698 #endif
1699         } else {
1700                 dwc_otg_device_t *otg_dev = g_otgdev;
1701
1702                 if (!otg_dev)
1703                         return;
1704
1705                 pldata_otg = otg_dev->pldata;
1706                 if (pldata_otg && pldata_otg->phy_power_down)
1707                         pldata_otg->phy_power_down(PHY_POWER_DOWN);
1708         }
1709 }
1710
1711 EXPORT_SYMBOL(rk_usb_power_up);
1712 EXPORT_SYMBOL(rk_usb_power_down);
1713 /**
1714  * This function is called when the dwc_otg_driver is installed with the
1715  * insmod command. It registers the dwc_otg_driver structure with the
1716  * appropriate bus driver. This will cause the dwc_otg_driver_probe function
1717  * to be called. In addition, the bus driver will automatically expose
1718  * attributes defined for the device and driver in the special sysfs file
1719  * system.
1720  *
1721  * @return
1722  */
1723 static int __init dwc_otg_driver_init(void)
1724 {
1725         int retval = 0;
1726         int error;
1727
1728 #ifdef CONFIG_USB20_OTG
1729         /* register otg20 */
1730         printk(KERN_INFO "%s: version %s\n", dwc_otg20_driver_name,
1731                DWC_DRIVER_VERSION);
1732
1733         retval = platform_driver_register(&dwc_otg_driver);
1734         if (retval < 0) {
1735                 printk(KERN_ERR "%s retval=%d\n", __func__, retval);
1736                 return retval;
1737         }
1738
1739         error =
1740             driver_create_file(&dwc_otg_driver.driver, &driver_attr_version);
1741         error =
1742             driver_create_file(&dwc_otg_driver.driver, &driver_attr_debuglevel);
1743         error =
1744             driver_create_file(&dwc_otg_driver.driver,
1745                                &driver_attr_dwc_otg_conn_en);
1746         error =
1747             driver_create_file(&dwc_otg_driver.driver,
1748                                &driver_attr_vbus_status);
1749         error =
1750             driver_create_file(&dwc_otg_driver.driver,
1751                                &driver_attr_force_usb_mode);
1752         error =
1753             driver_create_file(&dwc_otg_driver.driver,
1754                                &driver_attr_op_state);
1755
1756 #endif
1757
1758         /* register host20 */
1759 #ifdef CONFIG_USB20_HOST
1760         printk(KERN_INFO "%s: version %s\n", dwc_host20_driver_name,
1761                DWC_DRIVER_VERSION);
1762
1763         retval = platform_driver_register(&dwc_host_driver);
1764         if (retval < 0) {
1765                 printk(KERN_ERR "%s retval=%d\n", __func__, retval);
1766                 return retval;
1767         }
1768
1769         error =
1770             driver_create_file(&dwc_host_driver.driver, &driver_attr_version);
1771         error =
1772             driver_create_file(&dwc_host_driver.driver,
1773                                &driver_attr_debuglevel);
1774 #endif
1775         return retval;
1776 }
1777
1778 module_init(dwc_otg_driver_init);
1779
1780 /**
1781  * This function is called when the driver is removed from the kernel
1782  * with the rmmod command. The driver unregisters itself with its bus
1783  * driver.
1784  *
1785  */
1786 static void __exit dwc_otg_driver_cleanup(void)
1787 {
1788         printk(KERN_DEBUG "dwc_otg_driver_cleanup()\n");
1789
1790 #ifdef CONFIG_USB20_HOST
1791         /*for host20 */
1792         driver_remove_file(&dwc_host_driver.driver, &driver_attr_debuglevel);
1793         driver_remove_file(&dwc_host_driver.driver, &driver_attr_version);
1794         platform_driver_unregister(&dwc_host_driver);
1795         printk(KERN_INFO "%s module removed\n", dwc_host20_driver_name);
1796 #endif
1797
1798 #ifdef CONFIG_USB20_OTG
1799         /*for otg */
1800         driver_remove_file(&dwc_otg_driver.driver,
1801                            &driver_attr_dwc_otg_conn_en);
1802         driver_remove_file(&dwc_otg_driver.driver, &driver_attr_debuglevel);
1803         driver_remove_file(&dwc_otg_driver.driver, &driver_attr_version);
1804         driver_remove_file(&dwc_otg_driver.driver, &driver_attr_vbus_status);
1805         driver_remove_file(&dwc_otg_driver.driver, &driver_attr_force_usb_mode);
1806         driver_remove_file(&dwc_otg_driver.driver, &driver_attr_op_state);
1807         platform_driver_unregister(&dwc_otg_driver);
1808         printk(KERN_INFO "%s module removed\n", dwc_otg20_driver_name);
1809 #endif
1810 }
1811
1812 module_exit(dwc_otg_driver_cleanup);
1813
1814 MODULE_DESCRIPTION(DWC_DRIVER_DESC);
1815 MODULE_AUTHOR("Synopsys Inc.");
1816 MODULE_LICENSE("GPL");
1817
1818 module_param_named(otg_cap, dwc_otg_module_params.otg_cap, int, 0444);
1819 MODULE_PARM_DESC(otg_cap, "OTG Capabilities 0=HNP&SRP 1=SRP Only 2=None");
1820 module_param_named(opt, dwc_otg_module_params.opt, int, 0444);
1821 MODULE_PARM_DESC(opt, "OPT Mode");
1822 module_param_named(dma_enable, dwc_otg_module_params.dma_enable, int, 0444);
1823 MODULE_PARM_DESC(dma_enable, "DMA Mode 0=Slave 1=DMA enabled");
1824
1825 module_param_named(dma_desc_enable, dwc_otg_module_params.dma_desc_enable, int,
1826                    0444);
1827 MODULE_PARM_DESC(dma_desc_enable,
1828                  "DMA Desc Mode 0=Address DMA 1=DMA Descriptor enabled");
1829
1830 module_param_named(dma_burst_size, dwc_otg_module_params.dma_burst_size, int,
1831                    0444);
1832 MODULE_PARM_DESC(dma_burst_size,
1833                  "DMA Burst Size 1, 4, 8, 16, 32, 64, 128, 256");
1834 module_param_named(speed, dwc_otg_module_params.speed, int, 0444);
1835 MODULE_PARM_DESC(speed, "Speed 0=High Speed 1=Full Speed");
1836 module_param_named(host_support_fs_ls_low_power,
1837                    dwc_otg_module_params.host_support_fs_ls_low_power, int,
1838                    0444);
1839 MODULE_PARM_DESC(host_support_fs_ls_low_power,
1840                  "Support Low Power w/FS or LS 0=Support 1=Don't Support");
1841 module_param_named(host_ls_low_power_phy_clk,
1842                    dwc_otg_module_params.host_ls_low_power_phy_clk, int, 0444);
1843 MODULE_PARM_DESC(host_ls_low_power_phy_clk,
1844                  "Low Speed Low Power Clock 0=48Mhz 1=6Mhz");
1845 module_param_named(enable_dynamic_fifo,
1846                    dwc_otg_module_params.enable_dynamic_fifo, int, 0444);
1847 MODULE_PARM_DESC(enable_dynamic_fifo, "0=cC Setting 1=Allow Dynamic Sizing");
1848 module_param_named(data_fifo_size, dwc_otg_module_params.data_fifo_size, int,
1849                    0444);
1850 MODULE_PARM_DESC(data_fifo_size,
1851                  "Total number of words in the data FIFO memory 32-32768");
1852 module_param_named(dev_rx_fifo_size, dwc_otg_module_params.dev_rx_fifo_size,
1853                    int, 0444);
1854 MODULE_PARM_DESC(dev_rx_fifo_size, "Number of words in the Rx FIFO 16-32768");
1855 module_param_named(dev_nperio_tx_fifo_size,
1856                    dwc_otg_module_params.dev_nperio_tx_fifo_size, int, 0444);
1857 MODULE_PARM_DESC(dev_nperio_tx_fifo_size,
1858                  "Number of words in the non-periodic Tx FIFO 16-32768");
1859 module_param_named(dev_perio_tx_fifo_size_1,
1860                    dwc_otg_module_params.dev_perio_tx_fifo_size[0], int, 0444);
1861 MODULE_PARM_DESC(dev_perio_tx_fifo_size_1,
1862                  "Number of words in the periodic Tx FIFO 4-768");
1863 module_param_named(dev_perio_tx_fifo_size_2,
1864                    dwc_otg_module_params.dev_perio_tx_fifo_size[1], int, 0444);
1865 MODULE_PARM_DESC(dev_perio_tx_fifo_size_2,
1866                  "Number of words in the periodic Tx FIFO 4-768");
1867 module_param_named(dev_perio_tx_fifo_size_3,
1868                    dwc_otg_module_params.dev_perio_tx_fifo_size[2], int, 0444);
1869 MODULE_PARM_DESC(dev_perio_tx_fifo_size_3,
1870                  "Number of words in the periodic Tx FIFO 4-768");
1871 module_param_named(dev_perio_tx_fifo_size_4,
1872                    dwc_otg_module_params.dev_perio_tx_fifo_size[3], int, 0444);
1873 MODULE_PARM_DESC(dev_perio_tx_fifo_size_4,
1874                  "Number of words in the periodic Tx FIFO 4-768");
1875 module_param_named(dev_perio_tx_fifo_size_5,
1876                    dwc_otg_module_params.dev_perio_tx_fifo_size[4], int, 0444);
1877 MODULE_PARM_DESC(dev_perio_tx_fifo_size_5,
1878                  "Number of words in the periodic Tx FIFO 4-768");
1879 module_param_named(dev_perio_tx_fifo_size_6,
1880                    dwc_otg_module_params.dev_perio_tx_fifo_size[5], int, 0444);
1881 MODULE_PARM_DESC(dev_perio_tx_fifo_size_6,
1882                  "Number of words in the periodic Tx FIFO 4-768");
1883 module_param_named(dev_perio_tx_fifo_size_7,
1884                    dwc_otg_module_params.dev_perio_tx_fifo_size[6], int, 0444);
1885 MODULE_PARM_DESC(dev_perio_tx_fifo_size_7,
1886                  "Number of words in the periodic Tx FIFO 4-768");
1887 module_param_named(dev_perio_tx_fifo_size_8,
1888                    dwc_otg_module_params.dev_perio_tx_fifo_size[7], int, 0444);
1889 MODULE_PARM_DESC(dev_perio_tx_fifo_size_8,
1890                  "Number of words in the periodic Tx FIFO 4-768");
1891 module_param_named(dev_perio_tx_fifo_size_9,
1892                    dwc_otg_module_params.dev_perio_tx_fifo_size[8], int, 0444);
1893 MODULE_PARM_DESC(dev_perio_tx_fifo_size_9,
1894                  "Number of words in the periodic Tx FIFO 4-768");
1895 module_param_named(dev_perio_tx_fifo_size_10,
1896                    dwc_otg_module_params.dev_perio_tx_fifo_size[9], int, 0444);
1897 MODULE_PARM_DESC(dev_perio_tx_fifo_size_10,
1898                  "Number of words in the periodic Tx FIFO 4-768");
1899 module_param_named(dev_perio_tx_fifo_size_11,
1900                    dwc_otg_module_params.dev_perio_tx_fifo_size[10], int, 0444);
1901 MODULE_PARM_DESC(dev_perio_tx_fifo_size_11,
1902                  "Number of words in the periodic Tx FIFO 4-768");
1903 module_param_named(dev_perio_tx_fifo_size_12,
1904                    dwc_otg_module_params.dev_perio_tx_fifo_size[11], int, 0444);
1905 MODULE_PARM_DESC(dev_perio_tx_fifo_size_12,
1906                  "Number of words in the periodic Tx FIFO 4-768");
1907 module_param_named(dev_perio_tx_fifo_size_13,
1908                    dwc_otg_module_params.dev_perio_tx_fifo_size[12], int, 0444);
1909 MODULE_PARM_DESC(dev_perio_tx_fifo_size_13,
1910                  "Number of words in the periodic Tx FIFO 4-768");
1911 module_param_named(dev_perio_tx_fifo_size_14,
1912                    dwc_otg_module_params.dev_perio_tx_fifo_size[13], int, 0444);
1913 MODULE_PARM_DESC(dev_perio_tx_fifo_size_14,
1914                  "Number of words in the periodic Tx FIFO 4-768");
1915 module_param_named(dev_perio_tx_fifo_size_15,
1916                    dwc_otg_module_params.dev_perio_tx_fifo_size[14], int, 0444);
1917 MODULE_PARM_DESC(dev_perio_tx_fifo_size_15,
1918                  "Number of words in the periodic Tx FIFO 4-768");
1919 module_param_named(host_rx_fifo_size, dwc_otg_module_params.host_rx_fifo_size,
1920                    int, 0444);
1921 MODULE_PARM_DESC(host_rx_fifo_size, "Number of words in the Rx FIFO 16-32768");
1922 module_param_named(host_nperio_tx_fifo_size,
1923                    dwc_otg_module_params.host_nperio_tx_fifo_size, int, 0444);
1924 MODULE_PARM_DESC(host_nperio_tx_fifo_size,
1925                  "Number of words in the non-periodic Tx FIFO 16-32768");
1926 module_param_named(host_perio_tx_fifo_size,
1927                    dwc_otg_module_params.host_perio_tx_fifo_size, int, 0444);
1928 MODULE_PARM_DESC(host_perio_tx_fifo_size,
1929                  "Number of words in the host periodic Tx FIFO 16-32768");
1930 module_param_named(max_transfer_size, dwc_otg_module_params.max_transfer_size,
1931                    int, 0444);
1932 /** @todo Set the max to 512K, modify checks */
1933 MODULE_PARM_DESC(max_transfer_size,
1934                  "The maximum transfer size supported in bytes 2047-65535");
1935 module_param_named(max_packet_count, dwc_otg_module_params.max_packet_count,
1936                    int, 0444);
1937 MODULE_PARM_DESC(max_packet_count,
1938                  "The maximum number of packets in a transfer 15-511");
1939 module_param_named(host_channels, dwc_otg_module_params.host_channels, int,
1940                    0444);
1941 MODULE_PARM_DESC(host_channels,
1942                  "The number of host channel registers to use 1-16");
1943 module_param_named(dev_endpoints, dwc_otg_module_params.dev_endpoints, int,
1944                    0444);
1945 MODULE_PARM_DESC(dev_endpoints,
1946                  "The number of endpoints in addition to EP0 available for device mode 1-15");
1947 module_param_named(phy_type, dwc_otg_module_params.phy_type, int, 0444);
1948 MODULE_PARM_DESC(phy_type, "0=Reserved 1=UTMI+ 2=ULPI");
1949 module_param_named(phy_utmi_width, dwc_otg_module_params.phy_utmi_width, int,
1950                    0444);
1951 MODULE_PARM_DESC(phy_utmi_width, "Specifies the UTMI+ Data Width 8 or 16 bits");
1952 module_param_named(phy_ulpi_ddr, dwc_otg_module_params.phy_ulpi_ddr, int, 0444);
1953 MODULE_PARM_DESC(phy_ulpi_ddr,
1954                  "ULPI at double or single data rate 0=Single 1=Double");
1955 module_param_named(phy_ulpi_ext_vbus, dwc_otg_module_params.phy_ulpi_ext_vbus,
1956                    int, 0444);
1957 MODULE_PARM_DESC(phy_ulpi_ext_vbus,
1958                  "ULPI PHY using internal or external vbus 0=Internal");
1959 module_param_named(i2c_enable, dwc_otg_module_params.i2c_enable, int, 0444);
1960 MODULE_PARM_DESC(i2c_enable, "FS PHY Interface");
1961 module_param_named(ulpi_fs_ls, dwc_otg_module_params.ulpi_fs_ls, int, 0444);
1962 MODULE_PARM_DESC(ulpi_fs_ls, "ULPI PHY FS/LS mode only");
1963 module_param_named(ts_dline, dwc_otg_module_params.ts_dline, int, 0444);
1964 MODULE_PARM_DESC(ts_dline, "Term select Dline pulsing for all PHYs");
1965 module_param_named(debug, g_dbg_lvl, int, 0444);
1966 MODULE_PARM_DESC(debug, "");
1967
1968 module_param_named(en_multiple_tx_fifo,
1969                    dwc_otg_module_params.en_multiple_tx_fifo, int, 0444);
1970 MODULE_PARM_DESC(en_multiple_tx_fifo,
1971                  "Dedicated Non Periodic Tx FIFOs 0=disabled 1=enabled");
1972 module_param_named(dev_tx_fifo_size_1,
1973                    dwc_otg_module_params.dev_tx_fifo_size[0], int, 0444);
1974 MODULE_PARM_DESC(dev_tx_fifo_size_1, "Number of words in the Tx FIFO 4-768");
1975 module_param_named(dev_tx_fifo_size_2,
1976                    dwc_otg_module_params.dev_tx_fifo_size[1], int, 0444);
1977 MODULE_PARM_DESC(dev_tx_fifo_size_2, "Number of words in the Tx FIFO 4-768");
1978 module_param_named(dev_tx_fifo_size_3,
1979                    dwc_otg_module_params.dev_tx_fifo_size[2], int, 0444);
1980 MODULE_PARM_DESC(dev_tx_fifo_size_3, "Number of words in the Tx FIFO 4-768");
1981 module_param_named(dev_tx_fifo_size_4,
1982                    dwc_otg_module_params.dev_tx_fifo_size[3], int, 0444);
1983 MODULE_PARM_DESC(dev_tx_fifo_size_4, "Number of words in the Tx FIFO 4-768");
1984 module_param_named(dev_tx_fifo_size_5,
1985                    dwc_otg_module_params.dev_tx_fifo_size[4], int, 0444);
1986 MODULE_PARM_DESC(dev_tx_fifo_size_5, "Number of words in the Tx FIFO 4-768");
1987 module_param_named(dev_tx_fifo_size_6,
1988                    dwc_otg_module_params.dev_tx_fifo_size[5], int, 0444);
1989 MODULE_PARM_DESC(dev_tx_fifo_size_6, "Number of words in the Tx FIFO 4-768");
1990 module_param_named(dev_tx_fifo_size_7,
1991                    dwc_otg_module_params.dev_tx_fifo_size[6], int, 0444);
1992 MODULE_PARM_DESC(dev_tx_fifo_size_7, "Number of words in the Tx FIFO 4-768");
1993 module_param_named(dev_tx_fifo_size_8,
1994                    dwc_otg_module_params.dev_tx_fifo_size[7], int, 0444);
1995 MODULE_PARM_DESC(dev_tx_fifo_size_8, "Number of words in the Tx FIFO 4-768");
1996 module_param_named(dev_tx_fifo_size_9,
1997                    dwc_otg_module_params.dev_tx_fifo_size[8], int, 0444);
1998 MODULE_PARM_DESC(dev_tx_fifo_size_9, "Number of words in the Tx FIFO 4-768");
1999 module_param_named(dev_tx_fifo_size_10,
2000                    dwc_otg_module_params.dev_tx_fifo_size[9], int, 0444);
2001 MODULE_PARM_DESC(dev_tx_fifo_size_10, "Number of words in the Tx FIFO 4-768");
2002 module_param_named(dev_tx_fifo_size_11,
2003                    dwc_otg_module_params.dev_tx_fifo_size[10], int, 0444);
2004 MODULE_PARM_DESC(dev_tx_fifo_size_11, "Number of words in the Tx FIFO 4-768");
2005 module_param_named(dev_tx_fifo_size_12,
2006                    dwc_otg_module_params.dev_tx_fifo_size[11], int, 0444);
2007 MODULE_PARM_DESC(dev_tx_fifo_size_12, "Number of words in the Tx FIFO 4-768");
2008 module_param_named(dev_tx_fifo_size_13,
2009                    dwc_otg_module_params.dev_tx_fifo_size[12], int, 0444);
2010 MODULE_PARM_DESC(dev_tx_fifo_size_13, "Number of words in the Tx FIFO 4-768");
2011 module_param_named(dev_tx_fifo_size_14,
2012                    dwc_otg_module_params.dev_tx_fifo_size[13], int, 0444);
2013 MODULE_PARM_DESC(dev_tx_fifo_size_14, "Number of words in the Tx FIFO 4-768");
2014 module_param_named(dev_tx_fifo_size_15,
2015                    dwc_otg_module_params.dev_tx_fifo_size[14], int, 0444);
2016 MODULE_PARM_DESC(dev_tx_fifo_size_15, "Number of words in the Tx FIFO 4-768");
2017
2018 module_param_named(thr_ctl, dwc_otg_module_params.thr_ctl, int, 0444);
2019 MODULE_PARM_DESC(thr_ctl,
2020                  "Thresholding enable flag bit 0 - non ISO Tx thr., 1 - ISO Tx thr., 2 - Rx thr.- bit 0=disabled 1=enabled");
2021 module_param_named(tx_thr_length, dwc_otg_module_params.tx_thr_length, int,
2022                    0444);
2023 MODULE_PARM_DESC(tx_thr_length, "Tx Threshold length in 32 bit DWORDs");
2024 module_param_named(rx_thr_length, dwc_otg_module_params.rx_thr_length, int,
2025                    0444);
2026 MODULE_PARM_DESC(rx_thr_length, "Rx Threshold length in 32 bit DWORDs");
2027
2028 module_param_named(pti_enable, dwc_otg_module_params.pti_enable, int, 0444);
2029 module_param_named(mpi_enable, dwc_otg_module_params.mpi_enable, int, 0444);
2030 module_param_named(lpm_enable, dwc_otg_module_params.lpm_enable, int, 0444);
2031 MODULE_PARM_DESC(lpm_enable, "LPM Enable 0=LPM Disabled 1=LPM Enabled");
2032
2033 module_param_named(besl_enable, dwc_otg_module_params.besl_enable, int, 0444);
2034 MODULE_PARM_DESC(besl_enable, "BESL Enable 0=BESL Disabled 1=BESL Enabled");
2035 module_param_named(baseline_besl, dwc_otg_module_params.baseline_besl, int,
2036                    0444);
2037 MODULE_PARM_DESC(baseline_besl, "Set the baseline besl value");
2038 module_param_named(deep_besl, dwc_otg_module_params.deep_besl, int, 0444);
2039 MODULE_PARM_DESC(deep_besl, "Set the deep besl value");
2040
2041 module_param_named(ic_usb_cap, dwc_otg_module_params.ic_usb_cap, int, 0444);
2042 MODULE_PARM_DESC(ic_usb_cap,
2043                  "IC_USB Capability 0=IC_USB Disabled 1=IC_USB Enabled");
2044 module_param_named(ahb_thr_ratio, dwc_otg_module_params.ahb_thr_ratio, int,
2045                    0444);
2046 MODULE_PARM_DESC(ahb_thr_ratio, "AHB Threshold Ratio");
2047 module_param_named(power_down, dwc_otg_module_params.power_down, int, 0444);
2048 MODULE_PARM_DESC(power_down, "Power Down Mode");
2049 module_param_named(reload_ctl, dwc_otg_module_params.reload_ctl, int, 0444);
2050 MODULE_PARM_DESC(reload_ctl, "HFIR Reload Control");
2051 module_param_named(dev_out_nak, dwc_otg_module_params.dev_out_nak, int, 0444);
2052 MODULE_PARM_DESC(dev_out_nak, "Enable Device OUT NAK");
2053 module_param_named(cont_on_bna, dwc_otg_module_params.cont_on_bna, int, 0444);
2054 MODULE_PARM_DESC(cont_on_bna, "Enable Enable Continue on BNA");
2055 module_param_named(ahb_single, dwc_otg_module_params.ahb_single, int, 0444);
2056 MODULE_PARM_DESC(ahb_single, "Enable AHB Single Support");
2057 module_param_named(adp_enable, dwc_otg_module_params.adp_enable, int, 0444);
2058 MODULE_PARM_DESC(adp_enable, "ADP Enable 0=ADP Disabled 1=ADP Enabled");
2059 module_param_named(otg_ver, dwc_otg_module_params.otg_ver, int, 0444);
2060 MODULE_PARM_DESC(otg_ver, "OTG revision supported 0=OTG 1.3 1=OTG 2.0");
2061
2062 /** @page "Module Parameters"
2063  *
2064  * The following parameters may be specified when starting the module.
2065  * These parameters define how the DWC_otg controller should be
2066  * configured. Parameter values are passed to the CIL initialization
2067  * function dwc_otg_cil_init
2068  *
2069  * Example: <code>modprobe dwc_otg speed=1 otg_cap=1</code>
2070  *
2071
2072  <table>
2073  <tr><td>Parameter Name</td><td>Meaning</td></tr>
2074
2075  <tr>
2076  <td>otg_cap</td>
2077  <td>Specifies the OTG capabilities. The driver will automatically detect the
2078  value for this parameter if none is specified.
2079  - 0: HNP and SRP capable (default, if available)
2080  - 1: SRP Only capable
2081  - 2: No HNP/SRP capable
2082  </td></tr>
2083
2084  <tr>
2085  <td>dma_enable</td>
2086  <td>Specifies whether to use slave or DMA mode for accessing the data FIFOs.
2087  The driver will automatically detect the value for this parameter if none is
2088  specified.
2089  - 0: Slave
2090  - 1: DMA (default, if available)
2091  </td></tr>
2092
2093  <tr>
2094  <td>dma_burst_size</td>
2095  <td>The DMA Burst size (applicable only for External DMA Mode).
2096  - Values: 1, 4, 8 16, 32, 64, 128, 256 (default 32)
2097  </td></tr>
2098
2099  <tr>
2100  <td>speed</td>
2101  <td>Specifies the maximum speed of operation in host and device mode. The
2102  actual speed depends on the speed of the attached device and the value of
2103  phy_type.
2104  - 0: High Speed (default)
2105  - 1: Full Speed
2106  </td></tr>
2107
2108  <tr>
2109  <td>host_support_fs_ls_low_power</td>
2110  <td>Specifies whether low power mode is supported when attached to a Full
2111  Speed or Low Speed device in host mode.
2112  - 0: Don't support low power mode (default)
2113  - 1: Support low power mode
2114  </td></tr>
2115
2116  <tr>
2117  <td>host_ls_low_power_phy_clk</td>
2118  <td>Specifies the PHY clock rate in low power mode when connected to a Low
2119  Speed device in host mode. This parameter is applicable only if
2120  HOST_SUPPORT_FS_LS_LOW_POWER is enabled.
2121  - 0: 48 MHz (default)
2122  - 1: 6 MHz
2123  </td></tr>
2124
2125  <tr>
2126  <td>enable_dynamic_fifo</td>
2127  <td> Specifies whether FIFOs may be resized by the driver software.
2128  - 0: Use cC FIFO size parameters
2129  - 1: Allow dynamic FIFO sizing (default)
2130  </td></tr>
2131
2132  <tr>
2133  <td>data_fifo_size</td>
2134  <td>Total number of 4-byte words in the data FIFO memory. This memory
2135  includes the Rx FIFO, non-periodic Tx FIFO, and periodic Tx FIFOs.
2136  - Values: 32 to 32768 (default 8192)
2137
2138  Note: The total FIFO memory depth in the FPGA configuration is 8192.
2139  </td></tr>
2140
2141  <tr>
2142  <td>dev_rx_fifo_size</td>
2143  <td>Number of 4-byte words in the Rx FIFO in device mode when dynamic
2144  FIFO sizing is enabled.
2145  - Values: 16 to 32768 (default 1064)
2146  </td></tr>
2147
2148  <tr>
2149  <td>dev_nperio_tx_fifo_size</td>
2150  <td>Number of 4-byte words in the non-periodic Tx FIFO in device mode when
2151  dynamic FIFO sizing is enabled.
2152  - Values: 16 to 32768 (default 1024)
2153  </td></tr>
2154
2155  <tr>
2156  <td>dev_perio_tx_fifo_size_n (n = 1 to 15)</td>
2157  <td>Number of 4-byte words in each of the periodic Tx FIFOs in device mode
2158  when dynamic FIFO sizing is enabled.
2159  - Values: 4 to 768 (default 256)
2160  </td></tr>
2161
2162  <tr>
2163  <td>host_rx_fifo_size</td>
2164  <td>Number of 4-byte words in the Rx FIFO in host mode when dynamic FIFO
2165  sizing is enabled.
2166  - Values: 16 to 32768 (default 1024)
2167  </td></tr>
2168
2169  <tr>
2170  <td>host_nperio_tx_fifo_size</td>
2171  <td>Number of 4-byte words in the non-periodic Tx FIFO in host mode when
2172  dynamic FIFO sizing is enabled in the core.
2173  - Values: 16 to 32768 (default 1024)
2174  </td></tr>
2175
2176  <tr>
2177  <td>host_perio_tx_fifo_size</td>
2178  <td>Number of 4-byte words in the host periodic Tx FIFO when dynamic FIFO
2179  sizing is enabled.
2180  - Values: 16 to 32768 (default 1024)
2181  </td></tr>
2182
2183  <tr>
2184  <td>max_transfer_size</td>
2185  <td>The maximum transfer size supported in bytes.
2186  - Values: 2047 to 65,535 (default 65,535)
2187  </td></tr>
2188
2189  <tr>
2190  <td>max_packet_count</td>
2191  <td>The maximum number of packets in a transfer.
2192  - Values: 15 to 511 (default 511)
2193  </td></tr>
2194
2195  <tr>
2196  <td>host_channels</td>
2197  <td>The number of host channel registers to use.
2198  - Values: 1 to 16 (default 12)
2199
2200  Note: The FPGA configuration supports a maximum of 12 host channels.
2201  </td></tr>
2202
2203  <tr>
2204  <td>dev_endpoints</td>
2205  <td>The number of endpoints in addition to EP0 available for device mode
2206  operations.
2207  - Values: 1 to 15 (default 6 IN and OUT)
2208
2209  Note: The FPGA configuration supports a maximum of 6 IN and OUT endpoints in
2210  addition to EP0.
2211  </td></tr>
2212
2213  <tr>
2214  <td>phy_type</td>
2215  <td>Specifies the type of PHY interface to use. By default, the driver will
2216  automatically detect the phy_type.
2217  - 0: Full Speed
2218  - 1: UTMI+ (default, if available)
2219  - 2: ULPI
2220  </td></tr>
2221
2222  <tr>
2223  <td>phy_utmi_width</td>
2224  <td>Specifies the UTMI+ Data Width. This parameter is applicable for a
2225  phy_type of UTMI+. Also, this parameter is applicable only if the
2226  OTG_HSPHY_WIDTH cC parameter was set to "8 and 16 bits", meaning that the
2227  core has been configured to work at either data path width.
2228  - Values: 8 or 16 bits (default 16)
2229  </td></tr>
2230
2231  <tr>
2232  <td>phy_ulpi_ddr</td>
2233  <td>Specifies whether the ULPI operates at double or single data rate. This
2234  parameter is only applicable if phy_type is ULPI.
2235  - 0: single data rate ULPI interface with 8 bit wide data bus (default)
2236  - 1: double data rate ULPI interface with 4 bit wide data bus
2237  </td></tr>
2238
2239  <tr>
2240  <td>i2c_enable</td>
2241  <td>Specifies whether to use the I2C interface for full speed PHY. This
2242  parameter is only applicable if PHY_TYPE is FS.
2243  - 0: Disabled (default)
2244  - 1: Enabled
2245  </td></tr>
2246
2247  <tr>
2248  <td>ulpi_fs_ls</td>
2249  <td>Specifies whether to use ULPI FS/LS mode only.
2250  - 0: Disabled (default)
2251  - 1: Enabled
2252  </td></tr>
2253
2254  <tr>
2255  <td>ts_dline</td>
2256  <td>Specifies whether term select D-Line pulsing for all PHYs is enabled.
2257  - 0: Disabled (default)
2258  - 1: Enabled
2259  </td></tr>
2260
2261  <tr>
2262  <td>en_multiple_tx_fifo</td>
2263  <td>Specifies whether dedicatedto tx fifos are enabled for non periodic IN EPs.
2264  The driver will automatically detect the value for this parameter if none is
2265  specified.
2266  - 0: Disabled
2267  - 1: Enabled (default, if available)
2268  </td></tr>
2269
2270  <tr>
2271  <td>dev_tx_fifo_size_n (n = 1 to 15)</td>
2272  <td>Number of 4-byte words in each of the Tx FIFOs in device mode
2273  when dynamic FIFO sizing is enabled.
2274  - Values: 4 to 768 (default 256)
2275  </td></tr>
2276
2277  <tr>
2278  <td>tx_thr_length</td>
2279  <td>Transmit Threshold length in 32 bit double words
2280  - Values: 8 to 128 (default 64)
2281  </td></tr>
2282
2283  <tr>
2284  <td>rx_thr_length</td>
2285  <td>Receive Threshold length in 32 bit double words
2286  - Values: 8 to 128 (default 64)
2287  </td></tr>
2288
2289 <tr>
2290  <td>thr_ctl</td>
2291  <td>Specifies whether to enable Thresholding for Device mode. Bits 0, 1, 2 of
2292  this parmater specifies if thresholding is enabled for non-Iso Tx, Iso Tx and
2293  Rx transfers accordingly.
2294  The driver will automatically detect the value for this parameter if none is
2295  specified.
2296  - Values: 0 to 7 (default 0)
2297  Bit values indicate:
2298  - 0: Thresholding disabled
2299  - 1: Thresholding enabled
2300  </td></tr>
2301
2302 <tr>
2303  <td>dma_desc_enable</td>
2304  <td>Specifies whether to enable Descriptor DMA mode.
2305  The driver will automatically detect the value for this parameter if none is
2306  specified.
2307  - 0: Descriptor DMA disabled
2308  - 1: Descriptor DMA (default, if available)
2309  </td></tr>
2310
2311 <tr>
2312  <td>mpi_enable</td>
2313  <td>Specifies whether to enable MPI enhancement mode.
2314  The driver will automatically detect the value for this parameter if none is
2315  specified.
2316  - 0: MPI disabled (default)
2317  - 1: MPI enable
2318  </td></tr>
2319
2320 <tr>
2321  <td>pti_enable</td>
2322  <td>Specifies whether to enable PTI enhancement support.
2323  The driver will automatically detect the value for this parameter if none is
2324  specified.
2325  - 0: PTI disabled (default)
2326  - 1: PTI enable
2327  </td></tr>
2328
2329 <tr>
2330  <td>lpm_enable</td>
2331  <td>Specifies whether to enable LPM support.
2332  The driver will automatically detect the value for this parameter if none is
2333  specified.
2334  - 0: LPM disabled
2335  - 1: LPM enable (default, if available)
2336  </td></tr>
2337
2338  <tr>
2339  <td>besl_enable</td>
2340  <td>Specifies whether to enable LPM Errata support.
2341  The driver will automatically detect the value for this parameter if none is
2342  specified.
2343  - 0: LPM Errata disabled (default)
2344  - 1: LPM Errata enable
2345  </td></tr>
2346
2347   <tr>
2348  <td>baseline_besl</td>
2349  <td>Specifies the baseline besl value.
2350  - Values: 0 to 15 (default 0)
2351  </td></tr>
2352
2353   <tr>
2354  <td>deep_besl</td>
2355  <td>Specifies the deep besl value.
2356  - Values: 0 to 15 (default 15)
2357  </td></tr>
2358
2359 <tr>
2360  <td>ic_usb_cap</td>
2361  <td>Specifies whether to enable IC_USB capability.
2362  The driver will automatically detect the value for this parameter if none is
2363  specified.
2364  - 0: IC_USB disabled (default, if available)
2365  - 1: IC_USB enable
2366  </td></tr>
2367
2368 <tr>
2369  <td>ahb_thr_ratio</td>
2370  <td>Specifies AHB Threshold ratio.
2371  - Values: 0 to 3 (default 0)
2372  </td></tr>
2373
2374 <tr>
2375  <td>power_down</td>
2376  <td>Specifies Power Down(Hibernation) Mode.
2377  The driver will automatically detect the value for this parameter if none is
2378  specified.
2379  - 0: Power Down disabled (default)
2380  - 2: Power Down enabled
2381  </td></tr>
2382
2383  <tr>
2384  <td>reload_ctl</td>
2385  <td>Specifies whether dynamic reloading of the HFIR register is allowed during
2386  run time. The driver will automatically detect the value for this parameter if
2387  none is specified. In case the HFIR value is reloaded when HFIR.RldCtrl == 1'b0
2388  the core might misbehave.
2389  - 0: Reload Control disabled (default)
2390  - 1: Reload Control enabled
2391  </td></tr>
2392
2393  <tr>
2394  <td>dev_out_nak</td>
2395  <td>Specifies whether  Device OUT NAK enhancement enabled or no.
2396  The driver will automatically detect the value for this parameter if
2397  none is specified. This parameter is valid only when OTG_EN_DESC_DMA == 1\92b1.
2398  - 0: The core does not set NAK after Bulk OUT transfer complete (default)
2399  - 1: The core sets NAK after Bulk OUT transfer complete
2400  </td></tr>
2401
2402  <tr>
2403  <td>cont_on_bna</td>
2404  <td>Specifies whether Enable Continue on BNA enabled or no.
2405  After receiving BNA interrupt the core disables the endpoint,when the
2406  endpoint is re-enabled by the application the
2407  - 0: Core starts processing from the DOEPDMA descriptor (default)
2408  - 1: Core starts processing from the descriptor which received the BNA.
2409  This parameter is valid only when OTG_EN_DESC_DMA == 1\92b1.
2410  </td></tr>
2411
2412  <tr>
2413  <td>ahb_single</td>
2414  <td>This bit when programmed supports SINGLE transfers for remainder data
2415  in a transfer for DMA mode of operation.
2416  - 0: The remainder data will be sent using INCR burst size (default)
2417  - 1: The remainder data will be sent using SINGLE burst size.
2418  </td></tr>
2419
2420 <tr>
2421  <td>adp_enable</td>
2422  <td>Specifies whether ADP feature is enabled.
2423  The driver will automatically detect the value for this parameter if none is
2424  specified.
2425  - 0: ADP feature disabled (default)
2426  - 1: ADP feature enabled
2427  </td></tr>
2428
2429   <tr>
2430  <td>otg_ver</td>
2431  <td>Specifies whether OTG is performing as USB OTG Revision 2.0 or Revision 1.3
2432  USB OTG device.
2433  - 0: OTG 2.0 support disabled (default)
2434  - 1: OTG 2.0 support enabled
2435  </td></tr>
2436
2437 */