c30cf449148b5ec6100745cf4fead56ef1c64af5
[openwrt.git] / package / platform / lantiq / ltq-hcd / src / ifxusb_driver.c
1 /*****************************************************************************
2  **   FILE NAME       : ifxusb_driver.c
3  **   PROJECT         : IFX USB sub-system V3
4  **   MODULES         : IFX USB sub-system Host and Device driver
5  **   SRC VERSION     : 3.2
6  **   DATE            : 1/Jan/2011
7  **   AUTHOR          : Chen, Howard
8  **   DESCRIPTION     : The provides the initialization and cleanup entry
9  **                     points for the IFX USB driver. This module can be
10  **                     dynamically loaded with insmod command or built-in
11  **                     with kernel. When loaded or executed the ifxusb_driver_init
12  **                     function is called. When the module is removed (using rmmod),
13  **                     the ifxusb_driver_cleanup function is called.
14  **   FUNCTIONS       :
15  **   COMPILER        : gcc
16  **   REFERENCE       : Synopsys DWC-OTG Driver 2.7
17  **   COPYRIGHT       :  Copyright (c) 2010
18  **                      LANTIQ DEUTSCHLAND GMBH,
19  **                      Am Campeon 3, 85579 Neubiberg, Germany
20  **
21  **    This program is free software; you can redistribute it and/or modify
22  **    it under the terms of the GNU General Public License as published by
23  **    the Free Software Foundation; either version 2 of the License, or
24  **    (at your option) any later version.
25  **
26  **  Version Control Section  **
27  **   $Author$
28  **   $Date$
29  **   $Revisions$
30  **   $Log$       Revision history
31  *****************************************************************************/
32
33 /*
34  * This file contains code fragments from Synopsys HS OTG Linux Software Driver.
35  * For this code the following notice is applicable:
36  *
37  * ==========================================================================
38  *
39  * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
40  * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless
41  * otherwise expressly agreed to in writing between Synopsys and you.
42  *
43  * The Software IS NOT an item of Licensed Software or Licensed Product under
44  * any End User Software License Agreement or Agreement for Licensed Product
45  * with Synopsys or any supplement thereto. You are permitted to use and
46  * redistribute this Software in source and binary forms, with or without
47  * modification, provided that redistributions of source code must retain this
48  * notice. You may not view, use, disclose, copy or distribute this file or
49  * any information contained herein except pursuant to this license grant from
50  * Synopsys. If you do not agree with this notice, including the disclaimer
51  * below, then you are not authorized to use the Software.
52  *
53  * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS
54  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
55  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
56  * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS BE LIABLE FOR ANY DIRECT,
57  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
58  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
59  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
60  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
61  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
62  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
63  * DAMAGE.
64  * ========================================================================== */
65
66 /*!
67  \file ifxusb_driver.c
68  \brief This file contains the loading/unloading interface to the Linux driver.
69 */
70
71 #include <linux/version.h>
72 #include "ifxusb_version.h"
73
74 #include <linux/kernel.h>
75 #include <linux/module.h>
76 #include <linux/moduleparam.h>
77 #include <linux/init.h>
78
79 #include <linux/device.h>
80 #include <linux/of_platform.h>
81 #include <linux/of_gpio.h>
82
83 #include <linux/errno.h>
84 #include <linux/types.h>
85 #include <linux/stat.h>  /* permission constants */
86
87 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
88         #include <linux/irq.h>
89 #endif
90
91 #include <asm/io.h>
92
93 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
94         #include <asm/irq.h>
95 #endif
96
97 #include "ifxusb_plat.h"
98
99 #include "ifxusb_cif.h"
100
101 #ifdef __IS_HOST__
102         #include "ifxhcd.h"
103
104         #define    USB_DRIVER_DESC              "IFX USB HCD driver"
105         const char ifxusb_hcd_driver_name[]    = "ifxusb_hcd";
106         #ifdef __IS_DUAL__
107                 ifxhcd_hcd_t ifxusb_hcd_1;
108                 ifxhcd_hcd_t ifxusb_hcd_2;
109                 const char ifxusb_hcd_name_1[] = "ifxusb_hcd_1";
110                 const char ifxusb_hcd_name_2[] = "ifxusb_hcd_2";
111         #else
112                 ifxhcd_hcd_t ifxusb_hcd;
113                 const char ifxusb_hcd_name[]   = "ifxusb_hcd";
114         #endif
115
116         #if defined(__DO_OC_INT__)
117                 ifxhcd_hcd_t *oc_int_id=NULL;
118                 #ifdef __IS_DUAL__
119                         ifxhcd_hcd_t *oc_int_id_1=NULL;
120                         ifxhcd_hcd_t *oc_int_id_2=NULL;
121                 #endif
122         #endif
123 #endif
124
125 #ifdef __IS_DEVICE__
126         #include "ifxpcd.h"
127
128         #define    USB_DRIVER_DESC              "IFX USB PCD driver"
129         const char ifxusb_pcd_driver_name[] = "ifxusb_pcd";
130         ifxpcd_pcd_t ifxusb_pcd;
131         const char ifxusb_pcd_name[]        = "ifxusb_pcd";
132 #endif
133
134 /* Global Debug Level Mask. */
135 #ifdef __IS_HOST__
136         uint32_t h_dbg_lvl = 0xff;
137 #endif
138
139 #ifdef __IS_DEVICE__
140         uint32_t d_dbg_lvl = 0x00;
141 #endif
142
143 #ifdef __IS_HOST__
144 ifxusb_params_t ifxusb_module_params_h;
145 #else
146 ifxusb_params_t ifxusb_module_params_d;
147 #endif
148
149 static void parse_parms(void);
150
151
152 #if defined(__IS_TWINPASS__)
153 #warning "Compiled as TWINPASS"
154 #elif defined(__IS_DANUBE__)
155 #warning "Compiled as DANUBE"
156 #elif defined(__IS_AMAZON_SE__)
157 #warning "Compiled as AMAZON_SE"
158 #elif defined(__IS_AR9__)
159 #warning "Compiled as AR9"
160 #elif defined(__IS_VR9__)
161 #warning "Compiled as VR9"
162 #elif defined(__IS_AR10__)
163 #warning "Compiled as AR10"
164 #else
165 #error "No Platform defined"
166 #endif
167
168
169 /* Function to setup the structures to control one usb core running as host*/
170 #ifdef __IS_HOST__
171 /*!
172    \brief inlined by ifxusb_driver_probe(), handling host mode probing. Run at each host core.
173 */
174         static inline int ifxusb_driver_probe_h(ifxhcd_hcd_t *_hcd,
175                                                 int           _irq,
176                                                 uint32_t      _iobase,
177                                                 uint32_t      _fifomem,
178                                                 uint32_t      _fifodbg
179                                                 )
180         {
181                 int retval = 0;
182
183                 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
184
185                 ifxusb_power_on_h (&_hcd->core_if);
186                 mdelay(50);
187                 ifxusb_phy_power_on_h  (&_hcd->core_if); // Test
188                 mdelay(50);
189                 ifxusb_hard_reset_h(&_hcd->core_if);
190                 retval =ifxusb_core_if_init_h(&_hcd->core_if,
191                                              _irq,
192                                              _iobase,
193                                              _fifomem,
194                                              _fifodbg);
195                 if(retval)
196                         return retval;
197
198                 ifxusb_host_core_init(&_hcd->core_if,&ifxusb_module_params_h);
199
200                 ifxusb_disable_global_interrupts_h( &_hcd->core_if);
201
202                 /* The driver is now initialized and need to be registered into Linux USB sub-system */
203
204                 retval = ifxhcd_init(_hcd); // hook the hcd into usb ss
205
206                 if (retval != 0)
207                 {
208                         IFX_ERROR("_hcd_init failed\n");
209                         return retval;
210                 }
211
212                 //ifxusb_enable_global_interrupts_h( _hcd->core_if ); // this should be done at hcd_start , including hcd_interrupt
213                 return 0;
214         }
215 #endif //__IS_HOST__
216
217 #ifdef __IS_DEVICE__
218 /*!
219   \brief inlined by ifxusb_driver_probe(), handling device mode probing.
220 */
221         static inline int ifxusb_driver_probe_d(ifxpcd_pcd_t *_pcd,
222                                                 int           _irq,
223                                                 uint32_t      _iobase,
224                                                 uint32_t      _fifomem,
225                                                 uint32_t      _fifodbg
226                                                 )
227         {
228                 int retval = 0;
229
230                 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
231                 ifxusb_power_on_d  (&_pcd->core_if);
232                 mdelay(50);
233                 ifxusb_phy_power_on_d  (&_pcd->core_if); // Test
234                 mdelay(50);
235                 ifxusb_hard_reset_d(&_pcd->core_if);
236                 retval =ifxusb_core_if_init_d(&_pcd->core_if,
237                                              _irq,
238                                              _iobase,
239                                              _fifomem,
240                                              _fifodbg);
241                 if(retval)
242                         return retval;
243
244                 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
245                 ifxusb_dev_core_init(&_pcd->core_if,&ifxusb_module_params_d);
246
247                 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
248                 ifxusb_disable_global_interrupts_d( &_pcd->core_if);
249
250                 /* The driver is now initialized and need to be registered into
251                    Linux USB Gadget sub-system
252                  */
253                 retval = ifxpcd_init();
254                 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
255
256                 if (retval != 0)
257                 {
258                         IFX_ERROR("_pcd_init failed\n");
259                         return retval;
260                 }
261                 //ifxusb_enable_global_interrupts_d( _pcd->core_if );  // this should be done at gadget bind or start
262                 return 0;
263         }
264 #endif //__IS_DEVICE__
265
266 /*!
267    \brief This function is called when a driver is unregistered. This happens when
268   the rmmod command is executed. The device may or may not be electrically
269   present. If it is present, the driver stops device processing. Any resources
270   used on behalf of this device are freed.
271 */
272 static int ifxusb_driver_remove(struct platform_device *_pdev)
273 {
274         IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
275         #ifdef __IS_HOST__
276                 #if defined(__IS_DUAL__)
277                         ifxhcd_remove(&ifxusb_hcd_1);
278                         ifxusb_core_if_remove_h(&ifxusb_hcd_1.core_if );
279                         ifxhcd_remove(&ifxusb_hcd_2);
280                         ifxusb_core_if_remove_h(&ifxusb_hcd_2.core_if );
281                 #else
282                         ifxhcd_remove(&ifxusb_hcd);
283                         ifxusb_core_if_remove_h(&ifxusb_hcd.core_if );
284                 #endif
285         #endif
286         #ifdef __IS_DEVICE__
287                 ifxpcd_remove();
288                 ifxusb_core_if_remove_d(&ifxusb_pcd.core_if );
289         #endif
290         /* Remove the device attributes */
291         #ifdef __IS_HOST__
292                 ifxusb_attr_remove_h(&_pdev->dev);
293         #else
294                 ifxusb_attr_remove_d(&_pdev->dev);
295         #endif
296         return 0;
297 }
298
299 /*!
300    \brief This function is called by module management in 2.6 kernel or by ifxusb_driver_init with 2.4 kernel
301   It is to probe and setup IFXUSB core(s).
302 */
303 static int ifxusb_driver_probe(struct platform_device *_pdev)
304 {
305         int retval = 0;
306         struct device_node *np;
307         int gpio_count;
308         u32 port_mask = 0x1;
309
310 #ifdef __IS_DANUBE__
311         np = of_find_compatible_node(NULL, NULL, "lantiq,ifxhcd-danube");
312 #elif defined __IS_AMAZON_SE__
313         np = of_find_compatible_node(NULL, NULL, "lantiq,ifxhcd-ase");
314 #elif defined __IS_AR9__
315         np = of_find_compatible_node(NULL, NULL, "lantiq,ifxhcd-arx100");
316 #elif defined __IS_VR9__
317         np = of_find_compatible_node(NULL, NULL, "lantiq,ifxhcd-xrx200");
318 #endif
319         if (!np) {
320                 dev_err(&_pdev->dev, "failed to find hcd device node\n");
321                 return -ENODEV;
322         }
323         of_property_read_u32(np, "lantiq,portmask", &port_mask);
324         // Parsing and store the parameters
325         IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
326         parse_parms();
327
328         #ifdef __IS_HOST__
329                 #if defined(__DO_OC_INT__)
330                         if(!oc_int_id)
331                         {
332                                 #if   defined(__IS_DUAL__)
333                                         oc_int_id=&ifxusb_hcd_1;
334                                         oc_int_id_1=&ifxusb_hcd_1;
335                                         oc_int_id_2=&ifxusb_hcd_2;
336                                 #else
337                                         oc_int_id=&ifxusb_hcd;
338                                 #endif
339                         }
340                 #endif
341
342                 #if   defined(__IS_DUAL__)
343                         memset(&ifxusb_hcd_1, 0, sizeof(ifxhcd_hcd_t));
344                         memset(&ifxusb_hcd_2, 0, sizeof(ifxhcd_hcd_t));
345
346                         ifxusb_hcd_1.core_if.core_no=0;
347                         ifxusb_hcd_2.core_if.core_no=1;
348                         ifxusb_hcd_1.core_if.core_name=(char *)ifxusb_hcd_name_1;
349                         ifxusb_hcd_2.core_if.core_name=(char *)ifxusb_hcd_name_2;
350
351                         ifxusb_hcd_1.dev=&_pdev->dev;
352                         ifxusb_hcd_2.dev=&_pdev->dev;
353
354                         if (port_mask & 0x1) {
355                                 retval = ifxusb_driver_probe_h(&ifxusb_hcd_1,
356                                                        IFXUSB1_IRQ,
357                                                        IFXUSB1_IOMEM_BASE,
358                                                        IFXUSB1_FIFOMEM_BASE,
359                                                        IFXUSB1_FIFODBG_BASE
360                                                        );
361                                 if(retval)
362                                         goto ifxusb_driver_probe_fail;
363                         }
364
365                         if (port_mask & 0x2) {
366                                 retval = ifxusb_driver_probe_h(&ifxusb_hcd_2,
367                                                        IFXUSB2_IRQ,
368                                                        IFXUSB2_IOMEM_BASE,
369                                                        IFXUSB2_FIFOMEM_BASE,
370                                                        IFXUSB2_FIFODBG_BASE
371                                                       );
372                                 if(retval)
373                                         goto ifxusb_driver_probe_fail;
374                         }
375                 #elif defined(__IS_FIRST__)
376                         memset(&ifxusb_hcd, 0, sizeof(ifxhcd_hcd_t));
377
378                         ifxusb_hcd.core_if.core_no=0;
379                         ifxusb_hcd.core_if.core_name=(char *)ifxusb_hcd_name;
380
381                         ifxusb_hcd.dev=&_pdev->dev;
382
383                         retval = ifxusb_driver_probe_h(&ifxusb_hcd,
384                                                        IFXUSB1_IRQ,
385                                                        IFXUSB1_IOMEM_BASE,
386                                                        IFXUSB1_FIFOMEM_BASE,
387                                                        IFXUSB1_FIFODBG_BASE
388                                                       );
389                         if(retval)
390                                 goto ifxusb_driver_probe_fail;
391
392                 #elif defined(__IS_SECOND__)
393                         memset(&ifxusb_hcd, 0, sizeof(ifxhcd_hcd_t));
394
395                         ifxusb_hcd.core_if.core_no=1;
396                         ifxusb_hcd.core_if.core_name=(char *)ifxusb_hcd_name;
397
398                         ifxusb_hcd.dev=&_pdev->dev;
399
400                         retval = ifxusb_driver_probe_h(&ifxusb_hcd,
401                                                        IFXUSB2_IRQ,
402                                                        IFXUSB2_IOMEM_BASE,
403                                                        IFXUSB2_FIFOMEM_BASE,
404                                                        IFXUSB2_FIFODBG_BASE
405                                                       );
406                         if(retval)
407                                 goto ifxusb_driver_probe_fail;
408
409                 #else
410                         memset(&ifxusb_hcd, 0, sizeof(ifxhcd_hcd_t));
411
412                         ifxusb_hcd.core_if.core_no=0;
413                         ifxusb_hcd.core_if.core_name=(char *)ifxusb_hcd_name;
414
415                         ifxusb_hcd.dev=&_pdev->dev;
416
417                         retval = ifxusb_driver_probe_h(&ifxusb_hcd,
418                                                        IFXUSB_IRQ,
419                                                        IFXUSB_IOMEM_BASE,
420                                                        IFXUSB_FIFOMEM_BASE,
421                                                        IFXUSB_FIFODBG_BASE
422                                                       );
423                         if(retval)
424                                 goto ifxusb_driver_probe_fail;
425                 #endif
426         #endif
427
428         #ifdef __IS_DEVICE__
429                 memset(&ifxusb_pcd, 0, sizeof(ifxpcd_pcd_t));
430                 ifxusb_pcd.core_if.core_name=(char *)&ifxusb_pcd_name[0];
431
432                 ifxusb_pcd.dev=&_pdev->dev;
433
434                 #if   defined(__IS_FIRST__)
435                         ifxusb_pcd.core_if.core_no=0;
436                         retval = ifxusb_driver_probe_d(&ifxusb_pcd,
437                                                        IFXUSB1_IRQ,
438                                                        IFXUSB1_IOMEM_BASE,
439                                                        IFXUSB1_FIFOMEM_BASE,
440                                                        IFXUSB1_FIFODBG_BASE
441                                                       );
442                 #elif defined(__IS_SECOND__)
443                         ifxusb_pcd.core_if.core_no=1;
444                         retval = ifxusb_driver_probe_d(&ifxusb_pcd,
445                                                        IFXUSB2_IRQ,
446                                                        IFXUSB2_IOMEM_BASE,
447                                                        IFXUSB2_FIFOMEM_BASE,
448                                                        IFXUSB2_FIFODBG_BASE
449                                                       );
450                 #else
451                         ifxusb_pcd.core_if.core_no=0;
452                         retval = ifxusb_driver_probe_d(&ifxusb_pcd,
453                                                        IFXUSB_IRQ,
454                                                        IFXUSB_IOMEM_BASE,
455                                                        IFXUSB_FIFOMEM_BASE,
456                                                        IFXUSB_FIFODBG_BASE
457                                                       );
458                 #endif
459                 if(retval)
460                         goto ifxusb_driver_probe_fail;
461         #endif
462
463         #ifdef __IS_HOST__
464                 ifxusb_attr_create_h(&_pdev->dev);
465         #else
466                 ifxusb_attr_create_d(&_pdev->dev);
467         #endif
468
469         gpio_count = of_gpio_count(np);
470         while (gpio_count) {
471                 enum of_gpio_flags flags;
472                 int gpio = of_get_gpio_flags(np, --gpio_count, &flags);
473                 if (gpio_request(gpio, "usb"))
474                         continue;
475                 dev_info(&_pdev->dev, "requested GPIO %d\n", gpio);
476                 gpio_direction_output(gpio, (flags & OF_GPIO_ACTIVE_LOW) ? (0) : (1));
477         }
478
479
480         return 0;
481
482 ifxusb_driver_probe_fail:
483         ifxusb_driver_remove(_pdev);
484         return retval;
485 }
486
487 static struct resource ifxusb_device_resources[] =
488 {
489         #if defined(__IS_DUAL__)
490                 [0] = { .start  = IFXUSB1_IRQ,
491                                 .flags  = IORESOURCE_IRQ,
492                 },
493                 [1] = { .start  = IFXUSB1_IOMEM_BASE,
494                                 .end    = IFXUSB1_IOMEM_BASE   + IFXUSB_IOMEM_SIZE-1,
495                                 .flags  = IORESOURCE_MEM,
496                 },
497                 [2] = { .start  = IFXUSB2_IRQ,
498                                 .flags  = IORESOURCE_IRQ,
499                 },
500                 [3] = { .start  = IFXUSB2_IOMEM_BASE,
501                                 .end    = IFXUSB2_IOMEM_BASE + IFXUSB_IOMEM_SIZE-1,
502                                 .flags  = IORESOURCE_MEM,
503                 },
504                 [4] = { .start  = IFXUSB1_FIFOMEM_BASE,
505                                 .end    = IFXUSB1_FIFOMEM_BASE + IFXUSB_FIFOMEM_SIZE-1,
506                                 .flags  = IORESOURCE_MEM,
507                 },
508                 [5] = { .start  = IFXUSB2_FIFOMEM_BASE,
509                                 .end    = IFXUSB2_FIFOMEM_BASE + IFXUSB_FIFOMEM_SIZE-1,
510                                 .flags  = IORESOURCE_MEM,
511                 },
512                 [6] = { .start  = IFXUSB1_FIFODBG_BASE,
513                                 .end    = IFXUSB1_FIFODBG_BASE + IFXUSB_FIFODBG_SIZE-1,
514                                 .flags  = IORESOURCE_MEM,
515                 },
516                 [7] = { .start  = IFXUSB2_FIFODBG_BASE,
517                                 .end    = IFXUSB2_FIFODBG_BASE + IFXUSB_FIFODBG_SIZE-1,
518                                 .flags  = IORESOURCE_MEM,
519                 },
520         #elif defined(__IS_FIRST__)
521                 [0] = { .start = IFXUSB1_IRQ,
522                                 .flags  = IORESOURCE_IRQ,
523                 },
524                 [1] = { .start  = IFXUSB1_IOMEM_BASE,
525                                 .end    = IFXUSB1_IOMEM_BASE + IFXUSB_IOMEM_SIZE-1,
526                                 .flags  = IORESOURCE_MEM,
527                 },
528                 [2] = { .start  = IFXUSB1_FIFOMEM_BASE,
529                                 .end    = IFXUSB1_FIFOMEM_BASE + IFXUSB_FIFOMEM_SIZE-1,
530                                 .flags  = IORESOURCE_MEM,
531                 },
532                 [3] = { .start  = IFXUSB1_FIFODBG_BASE,
533                                 .end    = IFXUSB1_FIFODBG_BASE + IFXUSB_FIFODBG_SIZE-1,
534                                 .flags  = IORESOURCE_MEM,
535                 },
536         #elif defined(__IS_SECOND__)
537                 [0] = { .start = IFXUSB2_IRQ,
538                                 .flags  = IORESOURCE_IRQ,
539                 },
540                 [1] = { .start  = IFXUSB2_IOMEM_BASE,
541                                 .end    = IFXUSB2_IOMEM_BASE + IFXUSB_IOMEM_SIZE-1,
542                                 .flags  = IORESOURCE_MEM,
543                 },
544                 [2] = { .start  = IFXUSB2_FIFOMEM_BASE,
545                                 .end    = IFXUSB2_FIFOMEM_BASE + IFXUSB_FIFOMEM_SIZE-1,
546                                 .flags  = IORESOURCE_MEM,
547                 },
548                 [3] = { .start  = IFXUSB2_FIFODBG_BASE,
549                                 .end    = IFXUSB2_FIFODBG_BASE + IFXUSB_FIFODBG_SIZE-1,
550                                 .flags  = IORESOURCE_MEM,
551                 },
552         #else
553                 [0] = { .start = IFXUSB_IRQ,
554                                 .flags  = IORESOURCE_IRQ,
555                 },
556                 [1] = { .start  = IFXUSB_IOMEM_BASE,
557                                 .end    = IFXUSB_IOMEM_BASE   + IFXUSB_IOMEM_SIZE-1,
558                                 .flags  = IORESOURCE_MEM,
559                 },
560                 [2] = { .start  = IFXUSB_FIFOMEM_BASE,
561                                 .end    = IFXUSB_FIFOMEM_BASE+IFXUSB_FIFOMEM_SIZE-1,
562                                 .flags  = IORESOURCE_MEM,
563                 },
564                 [3] = { .start  = IFXUSB_FIFODBG_BASE,
565                                 .end    = IFXUSB_FIFODBG_BASE+IFXUSB_FIFODBG_SIZE-1,
566                                 .flags  = IORESOURCE_MEM,
567                 },
568         #endif //__IS_DUAL__
569 };
570
571 static u64 ifxusb_dmamask = (u32)0x1fffffff;
572
573 static void ifxusb_device_release(struct device * dev)
574 {
575         IFX_PRINT("IFX USB platform_dev release\n");
576         dev->parent = NULL;
577 }
578
579 static struct platform_device ifxusb_device =
580 {
581         .id                     = -1,
582         .dev =
583         {
584                 .release       = ifxusb_device_release,
585                 .dma_mask      = &ifxusb_dmamask,
586         },
587         .resource               = ifxusb_device_resources,
588         .num_resources          = ARRAY_SIZE(ifxusb_device_resources),
589 };
590
591
592 /*!
593    \brief This function is called when the ifxusb_driver is installed with the insmod command.
594 */
595 static struct platform_driver ifxusb_driver = {
596         .probe          = ifxusb_driver_probe,
597         .remove         = ifxusb_driver_remove,
598         .driver ={
599                 .owner = THIS_MODULE,
600                 #ifdef __IS_HOST__
601                         .name = ifxusb_hcd_driver_name,
602                 #else
603                         .name = ifxusb_pcd_driver_name,
604                 #endif
605         },
606 };
607
608 #ifdef __IS_HOST__
609         int __init ifxusb_hcd_driver_init(void)
610 #else
611         int __init ifxusb_pcd_driver_init(void)
612 #endif
613 {
614         int retval = 0;
615         IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
616         #if defined(__IS_HOST__)
617                 IFX_PRINT("%s: version %s\n", ifxusb_hcd_driver_name, IFXUSB_VERSION);
618         #else
619                 IFX_PRINT("%s: version %s\n", ifxusb_pcd_driver_name, IFXUSB_VERSION);
620         #endif
621
622         #if 0
623                 #if   defined(__IS_TWINPASS__)
624                         IFX_PRINT("   OPTION: __IS_TWINPASS__\n");
625                 #elif defined(__IS_DANUBE__)
626                         IFX_PRINT("   OPTION: __IS_DANUBE__\n");
627                 #elif defined(__IS_AMAZON_SE__)
628                         IFX_PRINT("   OPTION: __IS_AMAZON_SE__\n");
629                 #elif defined(__IS_AR9__)
630                         IFX_PRINT("   OPTION: __IS_AR9__\n");
631                 #elif defined(__IS_VR9__)
632                         IFX_PRINT("   OPTION: __IS_VR9__\n");
633                 #elif defined(__IS_AR10__)
634                         IFX_PRINT("   OPTION: __IS_AR10__\n");
635                 #else
636                         IFX_PRINT("   OPTION: NO PLATFORM DEFINED\n");
637                 #endif
638
639                 #ifdef __UEIP__
640                         IFX_PRINT("   OPTION: __UEIP__\n");
641                 #endif
642
643                 #ifdef __PHY_LONG_PREEMP__
644                         IFX_PRINT("   OPTION: __PHY_LONG_PREEMP__\n");
645                 #endif
646                 #ifdef __FORCE_USB11__
647                         IFX_PRINT("   OPTION: __FORCE_USB11__\n");
648                 #endif
649                 #ifdef __UNALIGNED_BUF_ADJ__
650                         IFX_PRINT("   OPTION: __UNALIGNED_BUF_ADJ__\n");
651                 #endif
652                 #ifdef __UNALIGNED_BUF_CHK__
653                         IFX_PRINT("   OPTION: __UNALIGNED_BUF_CHK__\n");
654                 #endif
655                 #ifdef __UNALIGNED_BUF_BURST__
656                         IFX_PRINT("   OPTION: __UNALIGNED_BUF_BURST__\n");
657                 #endif
658                 #ifdef __DEBUG__
659                         IFX_PRINT("   OPTION: __DEBUG__\n");
660                 #endif
661                 #ifdef __ENABLE_DUMP__
662                         IFX_PRINT("   OPTION: __ENABLE_DUMP__\n");
663                 #endif
664
665                 #ifdef __IS_HOST__
666                         IFX_PRINT("   OPTION: __IS_HOST__\n");
667                         #ifdef __IS_DUAL__
668                                 IFX_PRINT("           __IS_DUAL__\n");
669                         #endif
670                         #ifdef __IS_FIRST__
671                                 IFX_PRINT("           __IS_FIRST__\n");
672                         #endif
673                         #ifdef __IS_SECOND__
674                                 IFX_PRINT("           __IS_SECOND__\n");
675                         #endif
676                         #ifdef __WITH_HS_ELECT_TST__
677                                 IFX_PRINT("           __WITH_HS_ELECT_TST__\n");
678                         #endif
679                         #ifdef __EN_ISOC__
680                                 IFX_PRINT("           __EN_ISOC__\n");
681                         #endif
682                         #ifdef __EN_ISOC_SPLIT__
683                                 IFX_PRINT("           __EN_ISOC_SPLIT__\n");
684                         #endif
685                         #ifdef __EPQD_DESTROY_TIMEOUT__
686                                 IFX_PRINT("           __EPQD_DESTROY_TIMEOUT__\n");
687                         #endif
688                         #ifdef __DYN_SOF_INTR__
689                                 IFX_PRINT("           __DYN_SOF_INTR__\n");
690                         #endif
691                 #else
692                         IFX_PRINT("   OPTION: __IS_DEVICE__\n");
693                         #ifdef __DED_INTR__
694                                 IFX_PRINT("           __DED_INTR__\n");
695                         #endif
696                         #ifdef __DED_FIFO__
697                                 IFX_PRINT("           __DED_FIFO__\n");
698                         #endif
699                         #ifdef __DESC_DMA__
700                                 IFX_PRINT("           __DESC_DMA__\n");
701                         #endif
702                         #ifdef __IS_FIRST__
703                                 IFX_PRINT("           __IS_FIRST__\n");
704                         #endif
705                         #ifdef __IS_SECOND__
706                                 IFX_PRINT("           __IS_SECOND__\n");
707                         #endif
708                         #ifdef __GADGET_TASKLET_TX__
709                                 IFX_PRINT("           __GADGET_TASKLET_TX__\n");
710                         #endif
711                         #ifdef __GADGET_TASKLET_RX__
712                                 IFX_PRINT("           __GADGET_TASKLET_RX__\n");
713                         #endif
714                         #ifdef __GADGET_TASKLET_HIGH__
715                                 IFX_PRINT("           __GADGET_TASKLET_HIGH__\n");
716                         #endif
717                         #ifdef __DO_PCD_UNLOCK__
718                                 IFX_PRINT("           __DO_PCD_UNLOCK__\n");
719                         #endif
720                         #ifdef __GADGET_LED__
721                                 IFX_PRINT("           __GADGET_LED__\n");
722                         #endif
723                         
724                         #ifdef __ECM_NO_INTR__
725                                 IFX_PRINT("           __ECM_NO_INTR__\n");
726                         #endif
727                         #ifdef __NOSWAPINCTRL__
728                                 IFX_PRINT("           __NOSWAPINCTRL__\n");
729                         #endif
730                         #ifdef __MAC_ECM_FIX__
731                                 IFX_PRINT("           __MAC_ECM_FIX__\n");
732                         #endif
733                         #ifdef __RETAIN_BUF_TX__
734                                 IFX_PRINT("           __RETAIN_BUF_TX__\n");
735                         #endif
736                         #ifdef __RETAIN_BUF_RX__
737                                 IFX_PRINT("           __RETAIN_BUF_RX__\n");
738                         #endif
739                         #ifdef __QUICKNAK__
740                                 IFX_PRINT("           __QUICKNAK__\n");
741                         #endif
742                 #endif
743         #endif
744
745         retval = platform_driver_register(&ifxusb_driver);
746
747         if (retval < 0) {
748                 IFX_ERROR("%s retval=%d\n", __func__, retval);
749                 return retval;
750         }
751
752         #ifdef __IS_HOST__
753                 ifxusb_device.name = ifxusb_hcd_driver_name;
754         #else
755                 ifxusb_device.name = ifxusb_pcd_driver_name;
756         #endif
757
758         if (ifxusb_device.dev.parent)
759                 retval = -EBUSY;
760         else
761                 retval = platform_device_register(&ifxusb_device);
762
763         if (retval < 0)
764         {
765                 IFX_ERROR("%s retval=%d\n", __func__, retval);
766                 platform_driver_unregister(&ifxusb_driver);
767                 return retval;
768         }
769         return retval;
770 }
771
772 #ifdef __IS_HOST__
773         module_init(ifxusb_hcd_driver_init);
774 #else
775         module_init(ifxusb_pcd_driver_init);
776 #endif
777
778 /*!
779    \brief This function is called when the driver is removed from the kernel
780   with the rmmod command. The driver unregisters itself with its bus
781   driver.
782 */
783 #ifdef __IS_HOST__
784         void __exit ifxusb_hcd_driver_cleanup(void)
785         {
786                 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
787                 platform_device_unregister(&ifxusb_device);
788                 platform_driver_unregister(&ifxusb_driver);
789                 IFX_PRINT("%s module removed\n", ifxusb_hcd_driver_name);
790         }
791         module_exit(ifxusb_hcd_driver_cleanup);
792 #else
793         void __exit ifxusb_pcd_driver_cleanup(void)
794         {
795                 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
796                 platform_device_unregister(&ifxusb_device);
797                 platform_driver_unregister(&ifxusb_driver);
798                 IFX_PRINT("%s module removed\n", ifxusb_pcd_driver_name);
799         }
800         module_exit(ifxusb_pcd_driver_cleanup);
801 #endif
802 MODULE_DESCRIPTION(USB_DRIVER_DESC);
803 MODULE_AUTHOR("Lantiq");
804 MODULE_LICENSE("GPL");
805
806
807
808 // Parameters set when loaded
809 //static long  dbg_lvl =0xFFFFFFFF;
810 static long  dbg_lvl =0;
811 static short dma_burst_size =-1;
812 static short speed =-1;
813 static long  data_fifo_size =-1;
814 #ifdef __IS_DEVICE__
815         static long   rx_fifo_size =-1;
816         #ifdef __DED_FIFO__
817                 static long  tx_fifo_size_00 =-1;
818                 static long  tx_fifo_size_01 =-1;
819                 static long  tx_fifo_size_02 =-1;
820                 static long  tx_fifo_size_03 =-1;
821                 static long  tx_fifo_size_04 =-1;
822                 static long  tx_fifo_size_05 =-1;
823                 static long  tx_fifo_size_06 =-1;
824                 static long  tx_fifo_size_07 =-1;
825                 static long  tx_fifo_size_08 =-1;
826                 static long  tx_fifo_size_09 =-1;
827                 static long  tx_fifo_size_10 =-1;
828                 static long  tx_fifo_size_11 =-1;
829                 static long  tx_fifo_size_12 =-1;
830                 static long  tx_fifo_size_13 =-1;
831                 static long  tx_fifo_size_14 =-1;
832                 static long  tx_fifo_size_15 =-1;
833                 static short thr_ctl=-1;
834                 static long  tx_thr_length =-1;
835                 static long  rx_thr_length =-1;
836         #else
837                 static long   nperio_tx_fifo_size =-1;
838                 static long   perio_tx_fifo_size_01 =-1;
839                 static long   perio_tx_fifo_size_02 =-1;
840                 static long   perio_tx_fifo_size_03 =-1;
841                 static long   perio_tx_fifo_size_04 =-1;
842                 static long   perio_tx_fifo_size_05 =-1;
843                 static long   perio_tx_fifo_size_06 =-1;
844                 static long   perio_tx_fifo_size_07 =-1;
845                 static long   perio_tx_fifo_size_08 =-1;
846                 static long   perio_tx_fifo_size_09 =-1;
847                 static long   perio_tx_fifo_size_10 =-1;
848                 static long   perio_tx_fifo_size_11 =-1;
849                 static long   perio_tx_fifo_size_12 =-1;
850                 static long   perio_tx_fifo_size_13 =-1;
851                 static long   perio_tx_fifo_size_14 =-1;
852                 static long   perio_tx_fifo_size_15 =-1;
853         #endif
854         static short   dev_endpoints =-1;
855 #endif
856
857 #ifdef __IS_HOST__
858         static long   rx_fifo_size =-1;
859         static long   nperio_tx_fifo_size =-1;
860         static long   perio_tx_fifo_size =-1;
861         static short  host_channels =-1;
862 #endif
863
864 static long   max_transfer_size =-1;
865 static long   max_packet_count =-1;
866 static long   phy_utmi_width =-1;
867 static long   turn_around_time_hs =-1;
868 static long   turn_around_time_fs =-1;
869 static long   timeout_cal_hs =-1;
870 static long   timeout_cal_fs =-1;
871
872 /*!
873    \brief Parsing the parameters taken when module load
874 */
875 static void parse_parms(void)
876 {
877
878         ifxusb_params_t *params;
879         IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
880         #ifdef __IS_HOST__
881                 h_dbg_lvl=dbg_lvl;
882                 params=&ifxusb_module_params_h;
883         #endif
884         #ifdef __IS_DEVICE__
885                 d_dbg_lvl=dbg_lvl;
886                 params=&ifxusb_module_params_d;
887         #endif
888
889         switch(dma_burst_size)
890         {
891                 case 0:
892                 case 1:
893                 case 4:
894                 case 8:
895                 case 16:
896                         params->dma_burst_size=dma_burst_size;
897                         break;
898                 default:
899                         #if defined(__IS_VR9__)
900                         {
901                                 unsigned int chipid;
902                                 unsigned int partnum;
903                                 chipid=*((volatile uint32_t *)IFX_MPS_CHIPID);
904                                 partnum=(chipid&0x0FFFF000)>>12;
905                                 switch(partnum)
906                                 {
907                                         case 0x000B: //VRX288_A2x
908                                         case 0x000E: //VRX282_A2x
909                                         case 0x000C: //VRX268_A2x
910                                         case 0x000D: //GRX288_A2x
911                                                 params->dma_burst_size=default_param_dma_burst_size_n;
912                                                 break;
913                                         default:
914                                                 params->dma_burst_size=default_param_dma_burst_size;
915                                 }
916                                 printk(KERN_INFO "Chip Version :%04x BurstSize=%d\n",partnum,params->dma_burst_size);
917                         }
918                         #else
919                                 params->dma_burst_size=default_param_dma_burst_size;
920                         #endif
921         }
922
923         if(speed==0 || speed==1)
924                 params->speed=speed;
925         else
926                 params->speed=default_param_speed;
927
928         if(max_transfer_size>=2048 && max_transfer_size<=65535)
929                 params->max_transfer_size=max_transfer_size;
930         else
931                 params->max_transfer_size=default_param_max_transfer_size;
932
933         if(max_packet_count>=15 && max_packet_count<=511)
934                 params->max_packet_count=max_packet_count;
935         else
936                 params->max_packet_count=default_param_max_packet_count;
937
938         switch(phy_utmi_width)
939         {
940                 case 8:
941                 case 16:
942                         params->phy_utmi_width=phy_utmi_width;
943                         break;
944                 default:
945                         params->phy_utmi_width=default_param_phy_utmi_width;
946         }
947
948         if(turn_around_time_hs>=0 && turn_around_time_hs<=7)
949                 params->turn_around_time_hs=turn_around_time_hs;
950         else
951                 params->turn_around_time_hs=default_param_turn_around_time_hs;
952
953         if(turn_around_time_fs>=0 && turn_around_time_fs<=7)
954                 params->turn_around_time_fs=turn_around_time_fs;
955         else
956                 params->turn_around_time_fs=default_param_turn_around_time_fs;
957
958         if(timeout_cal_hs>=0 && timeout_cal_hs<=7)
959                 params->timeout_cal_hs=timeout_cal_hs;
960         else
961                 params->timeout_cal_hs=default_param_timeout_cal_hs;
962
963         if(timeout_cal_fs>=0 && timeout_cal_fs<=7)
964                 params->timeout_cal_fs=timeout_cal_fs;
965         else
966                 params->timeout_cal_fs=default_param_timeout_cal_fs;
967
968         if(data_fifo_size>=32 && data_fifo_size<=32768)
969                 params->data_fifo_size=data_fifo_size;
970         else
971                 params->data_fifo_size=default_param_data_fifo_size;
972
973         #ifdef __IS_HOST__
974                 if(host_channels>=1 && host_channels<=16)
975                         params->host_channels=host_channels;
976                 else
977                         params->host_channels=default_param_host_channels;
978
979                 if(rx_fifo_size>=16 && rx_fifo_size<=32768)
980                         params->rx_fifo_size=rx_fifo_size;
981                 else
982                         params->rx_fifo_size=default_param_rx_fifo_size;
983
984                 if(nperio_tx_fifo_size>=16 && nperio_tx_fifo_size<=32768)
985                         params->nperio_tx_fifo_size=nperio_tx_fifo_size;
986                 else
987                         params->nperio_tx_fifo_size=default_param_nperio_tx_fifo_size;
988
989                 if(perio_tx_fifo_size>=16 && perio_tx_fifo_size<=32768)
990                         params->perio_tx_fifo_size=perio_tx_fifo_size;
991                 else
992                         params->perio_tx_fifo_size=default_param_perio_tx_fifo_size;
993         #endif //__IS_HOST__
994
995         #ifdef __IS_DEVICE__
996                 if(rx_fifo_size>=16 && rx_fifo_size<=32768)
997                         params->rx_fifo_size=rx_fifo_size;
998                 else
999                         params->rx_fifo_size=default_param_rx_fifo_size;
1000                 #ifdef __DED_FIFO__
1001                         if(tx_fifo_size_00>=16 && tx_fifo_size_00<=32768)
1002                                 params->tx_fifo_size[ 0]=tx_fifo_size_00;
1003                         else
1004                                 params->tx_fifo_size[ 0]=default_param_tx_fifo_size_00;
1005                         if(tx_fifo_size_01>=0 && tx_fifo_size_01<=32768)
1006                                 params->tx_fifo_size[ 1]=tx_fifo_size_01;
1007                         else
1008                                 params->tx_fifo_size[ 1]=default_param_tx_fifo_size_01;
1009                         if(tx_fifo_size_02>=0 && tx_fifo_size_02<=32768)
1010                                 params->tx_fifo_size[ 2]=tx_fifo_size_02;
1011                         else
1012                                 params->tx_fifo_size[ 2]=default_param_tx_fifo_size_02;
1013                         if(tx_fifo_size_03>=0 && tx_fifo_size_03<=32768)
1014                                 params->tx_fifo_size[ 3]=tx_fifo_size_03;
1015                         else
1016                                 params->tx_fifo_size[ 3]=default_param_tx_fifo_size_03;
1017                         if(tx_fifo_size_04>=0 && tx_fifo_size_04<=32768)
1018                                 params->tx_fifo_size[ 4]=tx_fifo_size_04;
1019                         else
1020                                 params->tx_fifo_size[ 4]=default_param_tx_fifo_size_04;
1021                         if(tx_fifo_size_05>=0 && tx_fifo_size_05<=32768)
1022                                 params->tx_fifo_size[ 5]=tx_fifo_size_05;
1023                         else
1024                                 params->tx_fifo_size[ 5]=default_param_tx_fifo_size_05;
1025                         if(tx_fifo_size_06>=0 && tx_fifo_size_06<=32768)
1026                                 params->tx_fifo_size[ 6]=tx_fifo_size_06;
1027                         else
1028                                 params->tx_fifo_size[ 6]=default_param_tx_fifo_size_06;
1029                         if(tx_fifo_size_07>=0 && tx_fifo_size_07<=32768)
1030                                 params->tx_fifo_size[ 7]=tx_fifo_size_07;
1031                         else
1032                                 params->tx_fifo_size[ 7]=default_param_tx_fifo_size_07;
1033                         if(tx_fifo_size_08>=0 && tx_fifo_size_08<=32768)
1034                                 params->tx_fifo_size[ 8]=tx_fifo_size_08;
1035                         else
1036                                 params->tx_fifo_size[ 8]=default_param_tx_fifo_size_08;
1037                         if(tx_fifo_size_09>=0 && tx_fifo_size_09<=32768)
1038                                 params->tx_fifo_size[ 9]=tx_fifo_size_09;
1039                         else
1040                                 params->tx_fifo_size[ 9]=default_param_tx_fifo_size_09;
1041                         if(tx_fifo_size_10>=0 && tx_fifo_size_10<=32768)
1042                                 params->tx_fifo_size[10]=tx_fifo_size_10;
1043                         else
1044                                 params->tx_fifo_size[10]=default_param_tx_fifo_size_10;
1045                         if(tx_fifo_size_11>=0 && tx_fifo_size_11<=32768)
1046                                 params->tx_fifo_size[11]=tx_fifo_size_11;
1047                         else
1048                                 params->tx_fifo_size[11]=default_param_tx_fifo_size_11;
1049                         if(tx_fifo_size_12>=0 && tx_fifo_size_12<=32768)
1050                                 params->tx_fifo_size[12]=tx_fifo_size_12;
1051                         else
1052                                 params->tx_fifo_size[12]=default_param_tx_fifo_size_12;
1053                         if(tx_fifo_size_13>=0 && tx_fifo_size_13<=32768)
1054                                 params->tx_fifo_size[13]=tx_fifo_size_13;
1055                         else
1056                                 params->tx_fifo_size[13]=default_param_tx_fifo_size_13;
1057                         if(tx_fifo_size_14>=0 && tx_fifo_size_14<=32768)
1058                                 params->tx_fifo_size[14]=tx_fifo_size_14;
1059                         else
1060                                 params->tx_fifo_size[14]=default_param_tx_fifo_size_14;
1061                         if(tx_fifo_size_15>=0 && tx_fifo_size_15<=32768)
1062                                 params->tx_fifo_size[15]=tx_fifo_size_15;
1063                         else
1064                                 params->tx_fifo_size[15]=default_param_tx_fifo_size_15;
1065                         if(thr_ctl==0 || thr_ctl==1)
1066                                 params->thr_ctl=thr_ctl;
1067                         else
1068                                 params->thr_ctl=default_param_thr_ctl;
1069                         if(tx_thr_length>=16 && tx_thr_length<=511)
1070                                 params->tx_thr_length=tx_thr_length;
1071                         else
1072                                 params->tx_thr_length=default_param_tx_thr_length;
1073                         if(rx_thr_length>=16 && rx_thr_length<=511)
1074                                 params->rx_thr_length=rx_thr_length;
1075                         else
1076                                 params->rx_thr_length=default_param_rx_thr_length;
1077                 #else  //__DED_FIFO__
1078                         if(nperio_tx_fifo_size>=16 && nperio_tx_fifo_size<=32768)
1079                                 params->tx_fifo_size[ 0]=nperio_tx_fifo_size;
1080                         else
1081                                 params->tx_fifo_size[ 0]=default_param_nperio_tx_fifo_size;
1082                         if(perio_tx_fifo_size_01>=0 && perio_tx_fifo_size_01<=32768)
1083                                 params->tx_fifo_size[ 1]=perio_tx_fifo_size_01;
1084                         else
1085                                 params->tx_fifo_size[ 1]=default_param_perio_tx_fifo_size_01;
1086                         if(perio_tx_fifo_size_02>=0 && perio_tx_fifo_size_02<=32768)
1087                                 params->tx_fifo_size[ 2]=perio_tx_fifo_size_02;
1088                         else
1089                                 params->tx_fifo_size[ 2]=default_param_perio_tx_fifo_size_02;
1090                         if(perio_tx_fifo_size_03>=0 && perio_tx_fifo_size_03<=32768)
1091                                 params->tx_fifo_size[ 3]=perio_tx_fifo_size_03;
1092                         else
1093                                 params->tx_fifo_size[ 3]=default_param_perio_tx_fifo_size_03;
1094                         if(perio_tx_fifo_size_04>=0 && perio_tx_fifo_size_04<=32768)
1095                                 params->tx_fifo_size[ 4]=perio_tx_fifo_size_04;
1096                         else
1097                                 params->tx_fifo_size[ 4]=default_param_perio_tx_fifo_size_04;
1098                         if(perio_tx_fifo_size_05>=0 && perio_tx_fifo_size_05<=32768)
1099                                 params->tx_fifo_size[ 5]=perio_tx_fifo_size_05;
1100                         else
1101                                 params->tx_fifo_size[ 5]=default_param_perio_tx_fifo_size_05;
1102                         if(perio_tx_fifo_size_06>=0 && perio_tx_fifo_size_06<=32768)
1103                                 params->tx_fifo_size[ 6]=perio_tx_fifo_size_06;
1104                         else
1105                                 params->tx_fifo_size[ 6]=default_param_perio_tx_fifo_size_06;
1106                         if(perio_tx_fifo_size_07>=0 && perio_tx_fifo_size_07<=32768)
1107                                 params->tx_fifo_size[ 7]=perio_tx_fifo_size_07;
1108                         else
1109                                 params->tx_fifo_size[ 7]=default_param_perio_tx_fifo_size_07;
1110                         if(perio_tx_fifo_size_08>=0 && perio_tx_fifo_size_08<=32768)
1111                                 params->tx_fifo_size[ 8]=perio_tx_fifo_size_08;
1112                         else
1113                                 params->tx_fifo_size[ 8]=default_param_perio_tx_fifo_size_08;
1114                         if(perio_tx_fifo_size_09>=0 && perio_tx_fifo_size_09<=32768)
1115                                 params->tx_fifo_size[ 9]=perio_tx_fifo_size_09;
1116                         else
1117                                 params->tx_fifo_size[ 9]=default_param_perio_tx_fifo_size_09;
1118                         if(perio_tx_fifo_size_10>=0 && perio_tx_fifo_size_10<=32768)
1119                                 params->tx_fifo_size[10]=perio_tx_fifo_size_10;
1120                         else
1121                                 params->tx_fifo_size[10]=default_param_perio_tx_fifo_size_10;
1122                         if(perio_tx_fifo_size_11>=0 && perio_tx_fifo_size_11<=32768)
1123                                 params->tx_fifo_size[11]=perio_tx_fifo_size_11;
1124                         else
1125                                 params->tx_fifo_size[11]=default_param_perio_tx_fifo_size_11;
1126                         if(perio_tx_fifo_size_12>=0 && perio_tx_fifo_size_12<=32768)
1127                                 params->tx_fifo_size[12]=perio_tx_fifo_size_12;
1128                         else
1129                                 params->tx_fifo_size[12]=default_param_perio_tx_fifo_size_12;
1130                         if(perio_tx_fifo_size_13>=0 && perio_tx_fifo_size_13<=32768)
1131                                 params->tx_fifo_size[13]=perio_tx_fifo_size_13;
1132                         else
1133                                 params->tx_fifo_size[13]=default_param_perio_tx_fifo_size_13;
1134                         if(perio_tx_fifo_size_14>=0 && perio_tx_fifo_size_14<=32768)
1135                                 params->tx_fifo_size[14]=perio_tx_fifo_size_14;
1136                         else
1137                                 params->tx_fifo_size[14]=default_param_perio_tx_fifo_size_14;
1138                         if(perio_tx_fifo_size_15>=0 && perio_tx_fifo_size_15<=32768)
1139                                 params->tx_fifo_size[15]=perio_tx_fifo_size_15;
1140                         else
1141                                 params->tx_fifo_size[15]=default_param_perio_tx_fifo_size_15;
1142                 #endif //__DED_FIFO__
1143         #endif //__IS_DEVICE__
1144 }
1145
1146
1147
1148
1149
1150
1151
1152 module_param(dbg_lvl, long, 0444);
1153 MODULE_PARM_DESC(dbg_lvl, "Debug level.");
1154
1155 module_param(dma_burst_size, short, 0444);
1156 MODULE_PARM_DESC(dma_burst_size, "DMA Burst Size 0, 1, 4, 8, 16");
1157
1158 module_param(speed, short, 0444);
1159 MODULE_PARM_DESC(speed, "Speed 0=High Speed 1=Full Speed");
1160
1161 module_param(data_fifo_size, long, 0444);
1162 MODULE_PARM_DESC(data_fifo_size, "Total number of words in the data FIFO memory 32-32768");
1163
1164 #ifdef __IS_DEVICE__
1165         module_param(rx_fifo_size, long, 0444);
1166         MODULE_PARM_DESC(rx_fifo_size, "Number of words in the Rx FIFO 16-32768");
1167
1168         #ifdef __DED_FIFO__
1169                 module_param(tx_fifo_size_00, long, 0444);
1170                 MODULE_PARM_DESC(tx_fifo_size_00, "Number of words in the Tx FIFO #00 16-32768");
1171                 module_param(tx_fifo_size_01, long, 0444);
1172                 MODULE_PARM_DESC(tx_fifo_size_01, "Number of words in the Tx FIFO #01  0-32768");
1173                 module_param(tx_fifo_size_02, long, 0444);
1174                 MODULE_PARM_DESC(tx_fifo_size_02, "Number of words in the Tx FIFO #02  0-32768");
1175                 module_param(tx_fifo_size_03, long, 0444);
1176                 MODULE_PARM_DESC(tx_fifo_size_03, "Number of words in the Tx FIFO #03  0-32768");
1177                 module_param(tx_fifo_size_04, long, 0444);
1178                 MODULE_PARM_DESC(tx_fifo_size_04, "Number of words in the Tx FIFO #04  0-32768");
1179                 module_param(tx_fifo_size_05, long, 0444);
1180                 MODULE_PARM_DESC(tx_fifo_size_05, "Number of words in the Tx FIFO #05  0-32768");
1181                 module_param(tx_fifo_size_06, long, 0444);
1182                 MODULE_PARM_DESC(tx_fifo_size_06, "Number of words in the Tx FIFO #06  0-32768");
1183                 module_param(tx_fifo_size_07, long, 0444);
1184                 MODULE_PARM_DESC(tx_fifo_size_07, "Number of words in the Tx FIFO #07  0-32768");
1185                 module_param(tx_fifo_size_08, long, 0444);
1186                 MODULE_PARM_DESC(tx_fifo_size_08, "Number of words in the Tx FIFO #08  0-32768");
1187                 module_param(tx_fifo_size_09, long, 0444);
1188                 MODULE_PARM_DESC(tx_fifo_size_09, "Number of words in the Tx FIFO #09  0-32768");
1189                 module_param(tx_fifo_size_10, long, 0444);
1190                 MODULE_PARM_DESC(tx_fifo_size_10, "Number of words in the Tx FIFO #10  0-32768");
1191                 module_param(tx_fifo_size_11, long, 0444);
1192                 MODULE_PARM_DESC(tx_fifo_size_11, "Number of words in the Tx FIFO #11  0-32768");
1193                 module_param(tx_fifo_size_12, long, 0444);
1194                 MODULE_PARM_DESC(tx_fifo_size_12, "Number of words in the Tx FIFO #12  0-32768");
1195                 module_param(tx_fifo_size_13, long, 0444);
1196                 MODULE_PARM_DESC(tx_fifo_size_13, "Number of words in the Tx FIFO #13  0-32768");
1197                 module_param(tx_fifo_size_14, long, 0444);
1198                 MODULE_PARM_DESC(tx_fifo_size_14, "Number of words in the Tx FIFO #14  0-32768");
1199                 module_param(tx_fifo_size_15, long, 0444);
1200                 MODULE_PARM_DESC(tx_fifo_size_15, "Number of words in the Tx FIFO #15  0-32768");
1201
1202                 module_param(thr_ctl, short, 0444);
1203                 MODULE_PARM_DESC(thr_ctl, "0=Without 1=With Theshold Ctrl");
1204
1205                 module_param(tx_thr_length, long, 0444);
1206                 MODULE_PARM_DESC(tx_thr_length, "TX Threshold length");
1207
1208                 module_param(rx_thr_length, long, 0444);
1209                 MODULE_PARM_DESC(rx_thr_length, "RX Threshold length");
1210
1211         #else
1212                 module_param(nperio_tx_fifo_size, long, 0444);
1213                 MODULE_PARM_DESC(nperio_tx_fifo_size, "Number of words in the non-periodic Tx FIFO 16-32768");
1214
1215                 module_param(perio_tx_fifo_size_01, long, 0444);
1216                 MODULE_PARM_DESC(perio_tx_fifo_size_01, "Number of words in the periodic Tx FIFO #01  0-32768");
1217                 module_param(perio_tx_fifo_size_02, long, 0444);
1218                 MODULE_PARM_DESC(perio_tx_fifo_size_02, "Number of words in the periodic Tx FIFO #02  0-32768");
1219                 module_param(perio_tx_fifo_size_03, long, 0444);
1220                 MODULE_PARM_DESC(perio_tx_fifo_size_03, "Number of words in the periodic Tx FIFO #03  0-32768");
1221                 module_param(perio_tx_fifo_size_04, long, 0444);
1222                 MODULE_PARM_DESC(perio_tx_fifo_size_04, "Number of words in the periodic Tx FIFO #04  0-32768");
1223                 module_param(perio_tx_fifo_size_05, long, 0444);
1224                 MODULE_PARM_DESC(perio_tx_fifo_size_05, "Number of words in the periodic Tx FIFO #05  0-32768");
1225                 module_param(perio_tx_fifo_size_06, long, 0444);
1226                 MODULE_PARM_DESC(perio_tx_fifo_size_06, "Number of words in the periodic Tx FIFO #06  0-32768");
1227                 module_param(perio_tx_fifo_size_07, long, 0444);
1228                 MODULE_PARM_DESC(perio_tx_fifo_size_07, "Number of words in the periodic Tx FIFO #07  0-32768");
1229                 module_param(perio_tx_fifo_size_08, long, 0444);
1230                 MODULE_PARM_DESC(perio_tx_fifo_size_08, "Number of words in the periodic Tx FIFO #08  0-32768");
1231                 module_param(perio_tx_fifo_size_09, long, 0444);
1232                 MODULE_PARM_DESC(perio_tx_fifo_size_09, "Number of words in the periodic Tx FIFO #09  0-32768");
1233                 module_param(perio_tx_fifo_size_10, long, 0444);
1234                 MODULE_PARM_DESC(perio_tx_fifo_size_10, "Number of words in the periodic Tx FIFO #10  0-32768");
1235                 module_param(perio_tx_fifo_size_11, long, 0444);
1236                 MODULE_PARM_DESC(perio_tx_fifo_size_11, "Number of words in the periodic Tx FIFO #11  0-32768");
1237                 module_param(perio_tx_fifo_size_12, long, 0444);
1238                 MODULE_PARM_DESC(perio_tx_fifo_size_12, "Number of words in the periodic Tx FIFO #12  0-32768");
1239                 module_param(perio_tx_fifo_size_13, long, 0444);
1240                 MODULE_PARM_DESC(perio_tx_fifo_size_13, "Number of words in the periodic Tx FIFO #13  0-32768");
1241                 module_param(perio_tx_fifo_size_14, long, 0444);
1242                 MODULE_PARM_DESC(perio_tx_fifo_size_14, "Number of words in the periodic Tx FIFO #14  0-32768");
1243                 module_param(perio_tx_fifo_size_15, long, 0444);
1244                 MODULE_PARM_DESC(perio_tx_fifo_size_15, "Number of words in the periodic Tx FIFO #15  0-32768");
1245         #endif//__DED_FIFO__
1246         module_param(dev_endpoints, short, 0444);
1247         MODULE_PARM_DESC(dev_endpoints, "The number of endpoints in addition to EP0 available for device mode 1-15");
1248 #endif
1249
1250 #ifdef __IS_HOST__
1251         module_param(rx_fifo_size, long, 0444);
1252         MODULE_PARM_DESC(rx_fifo_size, "Number of words in the Rx FIFO 16-32768");
1253
1254         module_param(nperio_tx_fifo_size, long, 0444);
1255         MODULE_PARM_DESC(nperio_tx_fifo_size, "Number of words in the non-periodic Tx FIFO 16-32768");
1256
1257         module_param(perio_tx_fifo_size, long, 0444);
1258         MODULE_PARM_DESC(perio_tx_fifo_size, "Number of words in the host periodic Tx FIFO 16-32768");
1259
1260         module_param(host_channels, short, 0444);
1261         MODULE_PARM_DESC(host_channels, "The number of host channel registers to use 1-16");
1262 #endif
1263
1264 module_param(max_transfer_size, long, 0444);
1265 MODULE_PARM_DESC(max_transfer_size, "The maximum transfer size supported in bytes 2047-65535");
1266
1267 module_param(max_packet_count, long, 0444);
1268 MODULE_PARM_DESC(max_packet_count, "The maximum number of packets in a transfer 15-511");
1269
1270 module_param(phy_utmi_width, long, 0444);
1271 MODULE_PARM_DESC(phy_utmi_width, "Specifies the UTMI+ Data Width 8 or 16 bits");
1272
1273 module_param(turn_around_time_hs, long, 0444);
1274 MODULE_PARM_DESC(turn_around_time_hs, "Turn-Around time for HS");
1275
1276 module_param(turn_around_time_fs, long, 0444);
1277 MODULE_PARM_DESC(turn_around_time_fs, "Turn-Around time for FS");
1278
1279 module_param(timeout_cal_hs, long, 0444);
1280 MODULE_PARM_DESC(timeout_cal_hs, "Timeout Cal for HS");
1281
1282 module_param(timeout_cal_fs, long, 0444);
1283 MODULE_PARM_DESC(timeout_cal_fs, "Timeout Cal for FS");
1284