[lantiq] move files/ -> files-3.3/
[openwrt.git] / target / linux / lantiq / files-3.3 / drivers / usb / ifxhcd / 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     : 1.0
6  **   DATE            : 1/Jan/2009
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  *****************************************************************************/
15
16 /*!
17  \file ifxusb_driver.c
18  \brief This file contains the loading/unloading interface to the Linux driver.
19 */
20
21 #include <linux/version.h>
22 #include "ifxusb_version.h"
23
24 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/moduleparam.h>
27 #include <linux/init.h>
28
29 #include <linux/device.h>
30 #include <linux/platform_device.h>
31
32 #include <linux/errno.h>
33 #include <linux/types.h>
34 #include <linux/stat.h>  /* permission constants */
35 #include <linux/gpio.h>
36 #include <lantiq_soc.h>
37
38 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
39         #include <linux/irq.h>
40 #endif
41
42 #include <asm/io.h>
43
44 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
45         #include <asm/irq.h>
46 #endif
47
48 #include "ifxusb_plat.h"
49
50 #include "ifxusb_cif.h"
51
52 #ifdef __IS_HOST__
53         #include "ifxhcd.h"
54
55         #define    USB_DRIVER_DESC              "IFX USB HCD driver"
56         const char ifxusb_driver_name[]    = "ifxusb_hcd";
57
58         #ifdef __IS_DUAL__
59                 ifxhcd_hcd_t ifxusb_hcd_1;
60                 ifxhcd_hcd_t ifxusb_hcd_2;
61                 const char ifxusb_hcd_name_1[] = "ifxusb_hcd_1";
62                 const char ifxusb_hcd_name_2[] = "ifxusb_hcd_2";
63         #else
64                 ifxhcd_hcd_t ifxusb_hcd;
65                 const char ifxusb_hcd_name[]   = "ifxusb_hcd";
66         #endif
67
68         #if defined(__DO_OC_INT__)
69                 static unsigned int  oc_int_installed=0;
70                 static ifxhcd_hcd_t *oc_int_id=NULL;
71         #endif
72 #endif
73
74 #ifdef __IS_DEVICE__
75         #include "ifxpcd.h"
76
77         #define    USB_DRIVER_DESC              "IFX USB PCD driver"
78         const char ifxusb_driver_name[] = "ifxusb_pcd";
79
80         ifxpcd_pcd_t ifxusb_pcd;
81         const char ifxusb_pcd_name[]    = "ifxusb_pcd";
82 #endif
83
84 /* Global Debug Level Mask. */
85 #ifdef __IS_HOST__
86         uint32_t h_dbg_lvl = 0x00;
87 #endif
88
89 #ifdef __IS_DEVICE__
90         uint32_t d_dbg_lvl = 0x00;
91 #endif
92
93 ifxusb_params_t ifxusb_module_params;
94
95 static void parse_parms(void);
96
97
98 #include <lantiq_irq.h>
99 #define IFX_USB0_IR                     (INT_NUM_IM1_IRL0 + 22)
100 #define IFX_USB1_IR                     (INT_NUM_IM2_IRL0 + 19)
101
102 /*!
103    \brief This function is called when a driver is unregistered. This happens when
104   the rmmod command is executed. The device may or may not be electrically
105   present. If it is present, the driver stops device processing. Any resources
106   used on behalf of this device are freed.
107 */
108 static int ifxusb_driver_remove(struct platform_device *_dev)
109 {
110         IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
111         #ifdef __IS_HOST__
112                 #if defined(__DO_OC_INT__)
113                         #if defined(__DO_OC_INT_ENABLE__)
114                                 ifxusb_oc_int_off();
115                         #endif
116
117                         if(oc_int_installed && oc_int_id)
118                                 free_irq((unsigned int)IFXUSB_OC_IRQ, oc_int_id );
119                         oc_int_installed=0;
120                         oc_int_id=NULL;
121                 #endif
122
123                 #if defined(__IS_DUAL__)
124                         ifxhcd_remove(&ifxusb_hcd_1);
125                         ifxusb_core_if_remove(&ifxusb_hcd_1.core_if );
126                         ifxhcd_remove(&ifxusb_hcd_2);
127                         ifxusb_core_if_remove(&ifxusb_hcd_2.core_if );
128                 #else
129                         ifxhcd_remove(&ifxusb_hcd);
130                         ifxusb_core_if_remove(&ifxusb_hcd.core_if );
131                 #endif
132         #endif
133
134         #ifdef __IS_DEVICE__
135                 ifxpcd_remove();
136                 ifxusb_core_if_remove(&ifxusb_pcd.core_if );
137         #endif
138
139         /* Remove the device attributes */
140
141         ifxusb_attr_remove(&_dev->dev);
142
143         return 0;
144 }
145
146
147 /* Function to setup the structures to control one usb core running as host*/
148 #ifdef __IS_HOST__
149 /*!
150    \brief inlined by ifxusb_driver_probe(), handling host mode probing. Run at each host core.
151 */
152         static inline int ifxusb_driver_probe_h(ifxhcd_hcd_t *_hcd,
153                                                 int           _irq,
154                                                 uint32_t      _iobase,
155                                                 uint32_t      _fifomem,
156                                                 uint32_t      _fifodbg
157                                                 )
158         {
159                 int retval = 0;
160
161                 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
162
163 #ifdef __DEV_NEW__
164                 ifxusb_power_off  (&_hcd->core_if);
165                 ifxusb_phy_power_off  (&_hcd->core_if); // Test
166                 mdelay(500);
167 #endif //__DEV_NEW__
168                 ifxusb_power_on  (&_hcd->core_if);
169                 mdelay(50);
170                 ifxusb_phy_power_on  (&_hcd->core_if); // Test
171                 mdelay(50);
172                 ifxusb_hard_reset(&_hcd->core_if);
173                 retval =ifxusb_core_if_init(&_hcd->core_if,
174                                              _irq,
175                                              _iobase,
176                                              _fifomem,
177                                              _fifodbg);
178                 if(retval)
179                         return retval;
180
181                 ifxusb_host_core_init(&_hcd->core_if,&ifxusb_module_params);
182
183                 ifxusb_disable_global_interrupts( &_hcd->core_if);
184
185                 /* The driver is now initialized and need to be registered into Linux USB sub-system */
186
187                 retval = ifxhcd_init(_hcd); // hook the hcd into usb ss
188
189                 if (retval != 0)
190                 {
191                         IFX_ERROR("_hcd_init failed\n");
192                         return retval;
193                 }
194
195                 //ifxusb_enable_global_interrupts( _hcd->core_if ); // this should be done at hcd_start , including hcd_interrupt
196                 return 0;
197         }
198 #endif //__IS_HOST__
199
200 #ifdef __IS_DEVICE__
201 /*!
202   \brief inlined by ifxusb_driver_probe(), handling device mode probing.
203 */
204         static inline int ifxusb_driver_probe_d(ifxpcd_pcd_t *_pcd,
205                                                 int           _irq,
206                                                 uint32_t      _iobase,
207                                                 uint32_t      _fifomem,
208                                                 uint32_t      _fifodbg
209                                                 )
210         {
211                 int retval = 0;
212
213                 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
214 #ifdef __DEV_NEW__
215                 ifxusb_power_off  (&_pcd->core_if);
216                 ifxusb_phy_power_off (&_pcd->core_if); // Test
217                 mdelay(500);
218 #endif // __DEV_NEW__
219                 ifxusb_power_on  (&_pcd->core_if);
220                 mdelay(50);
221                 ifxusb_phy_power_on  (&_pcd->core_if); // Test
222                 mdelay(50);
223                 ifxusb_hard_reset(&_pcd->core_if);
224                 retval =ifxusb_core_if_init(&_pcd->core_if,
225                                              _irq,
226                                              _iobase,
227                                              _fifomem,
228                                              _fifodbg);
229                 if(retval)
230                         return retval;
231
232                 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
233                 ifxusb_dev_core_init(&_pcd->core_if,&ifxusb_module_params);
234
235                 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
236                 ifxusb_disable_global_interrupts( &_pcd->core_if);
237
238                 /* The driver is now initialized and need to be registered into
239                    Linux USB Gadget sub-system
240                  */
241                 retval = ifxpcd_init();
242                 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
243
244                 if (retval != 0)
245                 {
246                         IFX_ERROR("_pcd_init failed\n");
247                         return retval;
248                 }
249                 //ifxusb_enable_global_interrupts( _pcd->core_if );  // this should be done at gadget bind or start
250                 return 0;
251         }
252 #endif //__IS_DEVICE__
253
254
255
256 /*!
257    \brief This function is called by module management in 2.6 kernel or by ifxusb_driver_init with 2.4 kernel
258   It is to probe and setup IFXUSB core(s).
259 */
260 static int ifxusb_driver_probe(struct platform_device *_dev)
261 {
262         int retval = 0;
263         int *pins = _dev->dev.platform_data;
264         if (ltq_is_vr9()) {
265                 gpio_request(6, "id1");
266                 gpio_request(9, "id2");
267                 gpio_direction_input(6);
268                 gpio_direction_input(9);
269         }
270         if (pins) {
271                 if (pins[0]) {
272                         gpio_request(pins[0], "vbus1");
273                         gpio_direction_output(pins[0], 1);
274                 }
275                 if (pins[1] && ltq_is_vr9()) {
276                         gpio_request(pins[1], "vbus2");
277                         gpio_direction_output(pins[1], 1);
278                 }
279         }
280         // Parsing and store the parameters
281         IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
282         parse_parms();
283
284         #ifdef __IS_HOST__
285                 #if   defined(__IS_DUAL__)
286                         memset(&ifxusb_hcd_1, 0, sizeof(ifxhcd_hcd_t));
287                         memset(&ifxusb_hcd_2, 0, sizeof(ifxhcd_hcd_t));
288
289                         ifxusb_hcd_1.core_if.core_no=0;
290                         ifxusb_hcd_2.core_if.core_no=1;
291                         ifxusb_hcd_1.core_if.core_name=(char *)ifxusb_hcd_name_1;
292                         ifxusb_hcd_2.core_if.core_name=(char *)ifxusb_hcd_name_2;
293
294                         ifxusb_hcd_1.dev=&_dev->dev;
295                         ifxusb_hcd_2.dev=&_dev->dev;
296
297                         retval = ifxusb_driver_probe_h(&ifxusb_hcd_1,
298                                                        IFX_USB0_IR,
299                                                        IFXUSB1_IOMEM_BASE,
300                                                        IFXUSB1_FIFOMEM_BASE,
301                                                        IFXUSB1_FIFODBG_BASE
302                                                        );
303                         if(retval)
304                                 goto ifxusb_driver_probe_fail;
305
306                         retval = ifxusb_driver_probe_h(&ifxusb_hcd_2,
307                                                        IFX_USB1_IR,
308                                                        IFXUSB2_IOMEM_BASE,
309                                                        IFXUSB2_FIFOMEM_BASE,
310                                                        IFXUSB2_FIFODBG_BASE
311                                                       );
312                         if(retval)
313                                 goto ifxusb_driver_probe_fail;
314
315                 #elif defined(__IS_FIRST__)
316                         memset(&ifxusb_hcd, 0, sizeof(ifxhcd_hcd_t));
317
318                         ifxusb_hcd.core_if.core_no=0;
319                         ifxusb_hcd.core_if.core_name=(char *)ifxusb_hcd_name;
320
321                         ifxusb_hcd.dev=&_dev->dev;
322
323                         retval = ifxusb_driver_probe_h(&ifxusb_hcd,
324                                                        IFX_USB0_IR,
325                                                        IFXUSB1_IOMEM_BASE,
326                                                        IFXUSB1_FIFOMEM_BASE,
327                                                        IFXUSB1_FIFODBG_BASE
328                                                       );
329                         if(retval)
330                                 goto ifxusb_driver_probe_fail;
331
332                 #elif defined(__IS_SECOND__)
333                         memset(&ifxusb_hcd, 0, sizeof(ifxhcd_hcd_t));
334
335                         ifxusb_hcd.core_if.core_no=1;
336                         ifxusb_hcd.core_if.core_name=(char *)ifxusb_hcd_name;
337
338                         ifxusb_hcd.dev=&_dev->dev;
339
340                         retval = ifxusb_driver_probe_h(&ifxusb_hcd,
341                                                        IFX_USB1_IR,
342                                                        IFXUSB2_IOMEM_BASE,
343                                                        IFXUSB2_FIFOMEM_BASE,
344                                                        IFXUSB2_FIFODBG_BASE
345                                                       );
346                         if(retval)
347                                 goto ifxusb_driver_probe_fail;
348
349                 #else
350                         memset(&ifxusb_hcd, 0, sizeof(ifxhcd_hcd_t));
351
352                         ifxusb_hcd.core_if.core_no=0;
353                         ifxusb_hcd.core_if.core_name=(char *)ifxusb_hcd_name;
354
355                         ifxusb_hcd.dev=&_dev->dev;
356
357                         retval = ifxusb_driver_probe_h(&ifxusb_hcd,
358                                                        IFXUSB_IRQ,
359                                                        IFXUSB_IOMEM_BASE,
360                                                        IFXUSB_FIFOMEM_BASE,
361                                                        IFXUSB_FIFODBG_BASE
362                                                       );
363                         if(retval)
364                                 goto ifxusb_driver_probe_fail;
365                 #endif
366
367                 #if defined(__DO_OC_INT__)
368                         IFXUSB_DEBUGPL( DBG_CIL, "registering (overcurrent) handler for irq%d\n", IFXUSB_OC_IRQ);
369                         #if   defined(__IS_DUAL__)
370                                 request_irq((unsigned int)IFXUSB_OC_IRQ, &ifx_hcd_oc_irq,
371 //                                SA_INTERRUPT|SA_SHIRQ, "ifxusb_oc", (void *)&ifxusb_hcd_1);
372                                   IRQF_DISABLED | IRQF_SHARED, "ifxusb_oc", (void *)&ifxusb_hcd_1);
373                                 oc_int_id=&ifxusb_hcd_1;
374                         #else
375                                 request_irq((unsigned int)IFXUSB_OC_IRQ, &ifx_hcd_oc_irq,
376 //                                SA_INTERRUPT|SA_SHIRQ, "ifxusb_oc", (void *)&ifxusb_hcd);
377                                   IRQF_DISABLED | IRQF_SHARED, "ifxusb_oc", (void *)&ifxusb_hcd);
378                                 oc_int_id=&ifxusb_hcd;
379                         #endif
380                         oc_int_installed=1;
381
382                         #if defined(__DO_OC_INT_ENABLE__)
383                                 ifxusb_oc_int_on();
384                         #endif
385                 #endif
386
387         #endif
388
389         #ifdef __IS_DEVICE__
390                 memset(&ifxusb_pcd, 0, sizeof(ifxpcd_pcd_t));
391                 ifxusb_pcd.core_if.core_name=(char *)&ifxusb_pcd_name[0];
392
393                 ifxusb_pcd.dev=&_dev->dev;
394
395                 #if   defined(__IS_FIRST__)
396                         ifxusb_pcd.core_if.core_no=0;
397                         retval = ifxusb_driver_probe_d(&ifxusb_pcd,
398                                                        IFXUSB1_IRQ,
399                                                        IFXUSB1_IOMEM_BASE,
400                                                        IFXUSB1_FIFOMEM_BASE,
401                                                        IFXUSB1_FIFODBG_BASE
402                                                       );
403                 #elif defined(__IS_SECOND__)
404                         ifxusb_pcd.core_if.core_no=1;
405                         retval = ifxusb_driver_probe_d(&ifxusb_pcd,
406                                                        IFXUSB2_IRQ,
407                                                        IFXUSB2_IOMEM_BASE,
408                                                        IFXUSB2_FIFOMEM_BASE,
409                                                        IFXUSB2_FIFODBG_BASE
410                                                       );
411                 #else
412                         ifxusb_pcd.core_if.core_no=0;
413                         retval = ifxusb_driver_probe_d(&ifxusb_pcd,
414                                                        IFXUSB_IRQ,
415                                                        IFXUSB_IOMEM_BASE,
416                                                        IFXUSB_FIFOMEM_BASE,
417                                                        IFXUSB_FIFODBG_BASE
418                                                       );
419                 #endif
420                 if(retval)
421                         goto ifxusb_driver_probe_fail;
422         #endif
423
424         ifxusb_attr_create(&_dev->dev);
425
426         return 0;
427
428 ifxusb_driver_probe_fail:
429         ifxusb_driver_remove(_dev);
430         return retval;
431 }
432
433
434
435 /*!
436    \brief This function is called when the ifxusb_driver is installed with the insmod command.
437 */
438
439
440 static struct platform_driver ifxusb_driver = {
441         .driver = {
442                 .name           = ifxusb_driver_name,
443                 .owner = THIS_MODULE,
444         },
445         .probe          = ifxusb_driver_probe,
446         .remove         = ifxusb_driver_remove,
447 };
448
449 int __init ifxusb_driver_init(void)
450 {
451         int retval = 0;
452
453         IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
454         IFX_PRINT("%s: version %s\n", ifxusb_driver_name, IFXUSB_VERSION);
455
456         retval = platform_driver_register(&ifxusb_driver);
457
458         if (retval < 0) {
459                 IFX_ERROR("%s retval=%d\n", __func__, retval);
460                 return retval;
461         }
462         return retval;
463 }
464
465 #if 0 // 2.4
466         int __init ifxusb_driver_init(void)
467         {
468                 int retval = 0;
469                 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
470                 IFX_PRINT("%s: version %s\n", ifxusb_driver_name, IFXUSB_VERSION);
471                 retval = ifxusb_driver_probe();
472
473                 if (retval < 0) {
474                         IFX_ERROR("%s retval=%d\n", __func__, retval);
475                         return retval;
476                 }
477
478                 return retval;
479         }
480 #endif
481
482 module_init(ifxusb_driver_init);
483
484
485 /*!
486    \brief This function is called when the driver is removed from the kernel
487   with the rmmod command. The driver unregisters itself with its bus
488   driver.
489 */
490
491 void __exit ifxusb_driver_cleanup(void)
492 {
493         IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
494
495         platform_driver_unregister(&ifxusb_driver);
496
497         IFX_PRINT("%s module removed\n", ifxusb_driver_name);
498 }
499 #if 0
500         void __exit ifxusb_driver_cleanup(void)
501         {
502                 IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
503                 ifxusb_driver_remove();
504                 IFX_PRINT("%s module removed\n", ifxusb_driver_name);
505         }
506 #endif
507 module_exit(ifxusb_driver_cleanup);
508
509
510
511 MODULE_DESCRIPTION(USB_DRIVER_DESC);
512 MODULE_AUTHOR("Infineon");
513 MODULE_LICENSE("GPL");
514
515
516
517 // Parameters set when loaded
518 //static long  dbg_lvl =0xFFFFFFFF;
519 static long  dbg_lvl =0;
520 static short dma_burst_size =-1;
521 static short speed =-1;
522 static long  data_fifo_size =-1;
523 #ifdef __IS_DEVICE__
524         static long   rx_fifo_size =-1;
525         #ifdef __DED_FIFO__
526                 static long  tx_fifo_size_00 =-1;
527                 static long  tx_fifo_size_01 =-1;
528                 static long  tx_fifo_size_02 =-1;
529                 static long  tx_fifo_size_03 =-1;
530                 static long  tx_fifo_size_04 =-1;
531                 static long  tx_fifo_size_05 =-1;
532                 static long  tx_fifo_size_06 =-1;
533                 static long  tx_fifo_size_07 =-1;
534                 static long  tx_fifo_size_08 =-1;
535                 static long  tx_fifo_size_09 =-1;
536                 static long  tx_fifo_size_10 =-1;
537                 static long  tx_fifo_size_11 =-1;
538                 static long  tx_fifo_size_12 =-1;
539                 static long  tx_fifo_size_13 =-1;
540                 static long  tx_fifo_size_14 =-1;
541                 static long  tx_fifo_size_15 =-1;
542                 static short thr_ctl=-1;
543                 static long  tx_thr_length =-1;
544                 static long  rx_thr_length =-1;
545         #else
546                 static long   nperio_tx_fifo_size =-1;
547                 static long   perio_tx_fifo_size_01 =-1;
548                 static long   perio_tx_fifo_size_02 =-1;
549                 static long   perio_tx_fifo_size_03 =-1;
550                 static long   perio_tx_fifo_size_04 =-1;
551                 static long   perio_tx_fifo_size_05 =-1;
552                 static long   perio_tx_fifo_size_06 =-1;
553                 static long   perio_tx_fifo_size_07 =-1;
554                 static long   perio_tx_fifo_size_08 =-1;
555                 static long   perio_tx_fifo_size_09 =-1;
556                 static long   perio_tx_fifo_size_10 =-1;
557                 static long   perio_tx_fifo_size_11 =-1;
558                 static long   perio_tx_fifo_size_12 =-1;
559                 static long   perio_tx_fifo_size_13 =-1;
560                 static long   perio_tx_fifo_size_14 =-1;
561                 static long   perio_tx_fifo_size_15 =-1;
562         #endif
563         static short   dev_endpoints =-1;
564 #endif
565
566 #ifdef __IS_HOST__
567         static long   rx_fifo_size =-1;
568         static long   nperio_tx_fifo_size =-1;
569         static long   perio_tx_fifo_size =-1;
570         static short  host_channels =-1;
571 #endif
572
573 static long   max_transfer_size =-1;
574 static long   max_packet_count =-1;
575 static long   phy_utmi_width =-1;
576 static long   turn_around_time_hs =-1;
577 static long   turn_around_time_fs =-1;
578 static long   timeout_cal_hs =-1;
579 static long   timeout_cal_fs =-1;
580
581 /*!
582    \brief Parsing the parameters taken when module load
583 */
584 static void parse_parms(void)
585 {
586
587         IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
588         #ifdef __IS_HOST__
589                 h_dbg_lvl=dbg_lvl;
590         #endif
591         #ifdef __IS_DEVICE__
592                 d_dbg_lvl=dbg_lvl;
593         #endif
594
595         switch(dma_burst_size)
596         {
597                 case 0:
598                 case 1:
599                 case 4:
600                 case 8:
601                 case 16:
602                         ifxusb_module_params.dma_burst_size=dma_burst_size;
603                         break;
604                 default:
605                         ifxusb_module_params.dma_burst_size=default_param_dma_burst_size;
606         }
607
608         if(speed==0 || speed==1)
609                 ifxusb_module_params.speed=speed;
610         else
611                 ifxusb_module_params.speed=default_param_speed;
612
613         if(max_transfer_size>=2048 && max_transfer_size<=65535)
614                 ifxusb_module_params.max_transfer_size=max_transfer_size;
615         else
616                 ifxusb_module_params.max_transfer_size=default_param_max_transfer_size;
617
618         if(max_packet_count>=15 && max_packet_count<=511)
619                 ifxusb_module_params.max_packet_count=max_packet_count;
620         else
621                 ifxusb_module_params.max_packet_count=default_param_max_packet_count;
622
623         switch(phy_utmi_width)
624         {
625                 case 8:
626                 case 16:
627                         ifxusb_module_params.phy_utmi_width=phy_utmi_width;
628                         break;
629                 default:
630                         ifxusb_module_params.phy_utmi_width=default_param_phy_utmi_width;
631         }
632
633         if(turn_around_time_hs>=0 && turn_around_time_hs<=7)
634                 ifxusb_module_params.turn_around_time_hs=turn_around_time_hs;
635         else
636                 ifxusb_module_params.turn_around_time_hs=default_param_turn_around_time_hs;
637
638         if(turn_around_time_fs>=0 && turn_around_time_fs<=7)
639                 ifxusb_module_params.turn_around_time_fs=turn_around_time_fs;
640         else
641                 ifxusb_module_params.turn_around_time_fs=default_param_turn_around_time_fs;
642
643         if(timeout_cal_hs>=0 && timeout_cal_hs<=7)
644                 ifxusb_module_params.timeout_cal_hs=timeout_cal_hs;
645         else
646                 ifxusb_module_params.timeout_cal_hs=default_param_timeout_cal_hs;
647
648         if(timeout_cal_fs>=0 && timeout_cal_fs<=7)
649                 ifxusb_module_params.timeout_cal_fs=timeout_cal_fs;
650         else
651                 ifxusb_module_params.timeout_cal_fs=default_param_timeout_cal_fs;
652
653         if(data_fifo_size>=32 && data_fifo_size<=32768)
654                 ifxusb_module_params.data_fifo_size=data_fifo_size;
655         else
656                 ifxusb_module_params.data_fifo_size=default_param_data_fifo_size;
657
658         #ifdef __IS_HOST__
659                 if(host_channels>=1 && host_channels<=16)
660                         ifxusb_module_params.host_channels=host_channels;
661                 else
662                         ifxusb_module_params.host_channels=default_param_host_channels;
663
664                 if(rx_fifo_size>=16 && rx_fifo_size<=32768)
665                         ifxusb_module_params.rx_fifo_size=rx_fifo_size;
666                 else
667                         ifxusb_module_params.rx_fifo_size=default_param_rx_fifo_size;
668
669                 if(nperio_tx_fifo_size>=16 && nperio_tx_fifo_size<=32768)
670                         ifxusb_module_params.nperio_tx_fifo_size=nperio_tx_fifo_size;
671                 else
672                         ifxusb_module_params.nperio_tx_fifo_size=default_param_nperio_tx_fifo_size;
673
674                 if(perio_tx_fifo_size>=16 && perio_tx_fifo_size<=32768)
675                         ifxusb_module_params.perio_tx_fifo_size=perio_tx_fifo_size;
676                 else
677                         ifxusb_module_params.perio_tx_fifo_size=default_param_perio_tx_fifo_size;
678         #endif //__IS_HOST__
679
680         #ifdef __IS_DEVICE__
681                 if(rx_fifo_size>=16 && rx_fifo_size<=32768)
682                         ifxusb_module_params.rx_fifo_size=rx_fifo_size;
683                 else
684                         ifxusb_module_params.rx_fifo_size=default_param_rx_fifo_size;
685                 #ifdef __DED_FIFO__
686                         if(tx_fifo_size_00>=16 && tx_fifo_size_00<=32768)
687                                 ifxusb_module_params.tx_fifo_size[ 0]=tx_fifo_size_00;
688                         else
689                                 ifxusb_module_params.tx_fifo_size[ 0]=default_param_tx_fifo_size_00;
690                         if(tx_fifo_size_01>=0 && tx_fifo_size_01<=32768)
691                                 ifxusb_module_params.tx_fifo_size[ 1]=tx_fifo_size_01;
692                         else
693                                 ifxusb_module_params.tx_fifo_size[ 1]=default_param_tx_fifo_size_01;
694                         if(tx_fifo_size_02>=0 && tx_fifo_size_02<=32768)
695                                 ifxusb_module_params.tx_fifo_size[ 2]=tx_fifo_size_02;
696                         else
697                                 ifxusb_module_params.tx_fifo_size[ 2]=default_param_tx_fifo_size_02;
698                         if(tx_fifo_size_03>=0 && tx_fifo_size_03<=32768)
699                                 ifxusb_module_params.tx_fifo_size[ 3]=tx_fifo_size_03;
700                         else
701                                 ifxusb_module_params.tx_fifo_size[ 3]=default_param_tx_fifo_size_03;
702                         if(tx_fifo_size_04>=0 && tx_fifo_size_04<=32768)
703                                 ifxusb_module_params.tx_fifo_size[ 4]=tx_fifo_size_04;
704                         else
705                                 ifxusb_module_params.tx_fifo_size[ 4]=default_param_tx_fifo_size_04;
706                         if(tx_fifo_size_05>=0 && tx_fifo_size_05<=32768)
707                                 ifxusb_module_params.tx_fifo_size[ 5]=tx_fifo_size_05;
708                         else
709                                 ifxusb_module_params.tx_fifo_size[ 5]=default_param_tx_fifo_size_05;
710                         if(tx_fifo_size_06>=0 && tx_fifo_size_06<=32768)
711                                 ifxusb_module_params.tx_fifo_size[ 6]=tx_fifo_size_06;
712                         else
713                                 ifxusb_module_params.tx_fifo_size[ 6]=default_param_tx_fifo_size_06;
714                         if(tx_fifo_size_07>=0 && tx_fifo_size_07<=32768)
715                                 ifxusb_module_params.tx_fifo_size[ 7]=tx_fifo_size_07;
716                         else
717                                 ifxusb_module_params.tx_fifo_size[ 7]=default_param_tx_fifo_size_07;
718                         if(tx_fifo_size_08>=0 && tx_fifo_size_08<=32768)
719                                 ifxusb_module_params.tx_fifo_size[ 8]=tx_fifo_size_08;
720                         else
721                                 ifxusb_module_params.tx_fifo_size[ 8]=default_param_tx_fifo_size_08;
722                         if(tx_fifo_size_09>=0 && tx_fifo_size_09<=32768)
723                                 ifxusb_module_params.tx_fifo_size[ 9]=tx_fifo_size_09;
724                         else
725                                 ifxusb_module_params.tx_fifo_size[ 9]=default_param_tx_fifo_size_09;
726                         if(tx_fifo_size_10>=0 && tx_fifo_size_10<=32768)
727                                 ifxusb_module_params.tx_fifo_size[10]=tx_fifo_size_10;
728                         else
729                                 ifxusb_module_params.tx_fifo_size[10]=default_param_tx_fifo_size_10;
730                         if(tx_fifo_size_11>=0 && tx_fifo_size_11<=32768)
731                                 ifxusb_module_params.tx_fifo_size[11]=tx_fifo_size_11;
732                         else
733                                 ifxusb_module_params.tx_fifo_size[11]=default_param_tx_fifo_size_11;
734                         if(tx_fifo_size_12>=0 && tx_fifo_size_12<=32768)
735                                 ifxusb_module_params.tx_fifo_size[12]=tx_fifo_size_12;
736                         else
737                                 ifxusb_module_params.tx_fifo_size[12]=default_param_tx_fifo_size_12;
738                         if(tx_fifo_size_13>=0 && tx_fifo_size_13<=32768)
739                                 ifxusb_module_params.tx_fifo_size[13]=tx_fifo_size_13;
740                         else
741                                 ifxusb_module_params.tx_fifo_size[13]=default_param_tx_fifo_size_13;
742                         if(tx_fifo_size_14>=0 && tx_fifo_size_14<=32768)
743                                 ifxusb_module_params.tx_fifo_size[14]=tx_fifo_size_14;
744                         else
745                                 ifxusb_module_params.tx_fifo_size[14]=default_param_tx_fifo_size_14;
746                         if(tx_fifo_size_15>=0 && tx_fifo_size_15<=32768)
747                                 ifxusb_module_params.tx_fifo_size[15]=tx_fifo_size_15;
748                         else
749                                 ifxusb_module_params.tx_fifo_size[15]=default_param_tx_fifo_size_15;
750                         if(thr_ctl==0 || thr_ctl==1)
751                                 ifxusb_module_params.thr_ctl=thr_ctl;
752                         else
753                                 ifxusb_module_params.thr_ctl=default_param_thr_ctl;
754                         if(tx_thr_length>=16 && tx_thr_length<=511)
755                                 ifxusb_module_params.tx_thr_length=tx_thr_length;
756                         else
757                                 ifxusb_module_params.tx_thr_length=default_param_tx_thr_length;
758                         if(rx_thr_length>=16 && rx_thr_length<=511)
759                                 ifxusb_module_params.rx_thr_length=rx_thr_length;
760                         else
761                                 ifxusb_module_params.rx_thr_length=default_param_rx_thr_length;
762                 #else  //__DED_FIFO__
763                         if(nperio_tx_fifo_size>=16 && nperio_tx_fifo_size<=32768)
764                                 ifxusb_module_params.tx_fifo_size[ 0]=nperio_tx_fifo_size;
765                         else
766                                 ifxusb_module_params.tx_fifo_size[ 0]=default_param_nperio_tx_fifo_size;
767                         if(perio_tx_fifo_size_01>=0 && perio_tx_fifo_size_01<=32768)
768                                 ifxusb_module_params.tx_fifo_size[ 1]=perio_tx_fifo_size_01;
769                         else
770                                 ifxusb_module_params.tx_fifo_size[ 1]=default_param_perio_tx_fifo_size_01;
771                         if(perio_tx_fifo_size_02>=0 && perio_tx_fifo_size_02<=32768)
772                                 ifxusb_module_params.tx_fifo_size[ 2]=perio_tx_fifo_size_02;
773                         else
774                                 ifxusb_module_params.tx_fifo_size[ 2]=default_param_perio_tx_fifo_size_02;
775                         if(perio_tx_fifo_size_03>=0 && perio_tx_fifo_size_03<=32768)
776                                 ifxusb_module_params.tx_fifo_size[ 3]=perio_tx_fifo_size_03;
777                         else
778                                 ifxusb_module_params.tx_fifo_size[ 3]=default_param_perio_tx_fifo_size_03;
779                         if(perio_tx_fifo_size_04>=0 && perio_tx_fifo_size_04<=32768)
780                                 ifxusb_module_params.tx_fifo_size[ 4]=perio_tx_fifo_size_04;
781                         else
782                                 ifxusb_module_params.tx_fifo_size[ 4]=default_param_perio_tx_fifo_size_04;
783                         if(perio_tx_fifo_size_05>=0 && perio_tx_fifo_size_05<=32768)
784                                 ifxusb_module_params.tx_fifo_size[ 5]=perio_tx_fifo_size_05;
785                         else
786                                 ifxusb_module_params.tx_fifo_size[ 5]=default_param_perio_tx_fifo_size_05;
787                         if(perio_tx_fifo_size_06>=0 && perio_tx_fifo_size_06<=32768)
788                                 ifxusb_module_params.tx_fifo_size[ 6]=perio_tx_fifo_size_06;
789                         else
790                                 ifxusb_module_params.tx_fifo_size[ 6]=default_param_perio_tx_fifo_size_06;
791                         if(perio_tx_fifo_size_07>=0 && perio_tx_fifo_size_07<=32768)
792                                 ifxusb_module_params.tx_fifo_size[ 7]=perio_tx_fifo_size_07;
793                         else
794                                 ifxusb_module_params.tx_fifo_size[ 7]=default_param_perio_tx_fifo_size_07;
795                         if(perio_tx_fifo_size_08>=0 && perio_tx_fifo_size_08<=32768)
796                                 ifxusb_module_params.tx_fifo_size[ 8]=perio_tx_fifo_size_08;
797                         else
798                                 ifxusb_module_params.tx_fifo_size[ 8]=default_param_perio_tx_fifo_size_08;
799                         if(perio_tx_fifo_size_09>=0 && perio_tx_fifo_size_09<=32768)
800                                 ifxusb_module_params.tx_fifo_size[ 9]=perio_tx_fifo_size_09;
801                         else
802                                 ifxusb_module_params.tx_fifo_size[ 9]=default_param_perio_tx_fifo_size_09;
803                         if(perio_tx_fifo_size_10>=0 && perio_tx_fifo_size_10<=32768)
804                                 ifxusb_module_params.tx_fifo_size[10]=perio_tx_fifo_size_10;
805                         else
806                                 ifxusb_module_params.tx_fifo_size[10]=default_param_perio_tx_fifo_size_10;
807                         if(perio_tx_fifo_size_11>=0 && perio_tx_fifo_size_11<=32768)
808                                 ifxusb_module_params.tx_fifo_size[11]=perio_tx_fifo_size_11;
809                         else
810                                 ifxusb_module_params.tx_fifo_size[11]=default_param_perio_tx_fifo_size_11;
811                         if(perio_tx_fifo_size_12>=0 && perio_tx_fifo_size_12<=32768)
812                                 ifxusb_module_params.tx_fifo_size[12]=perio_tx_fifo_size_12;
813                         else
814                                 ifxusb_module_params.tx_fifo_size[12]=default_param_perio_tx_fifo_size_12;
815                         if(perio_tx_fifo_size_13>=0 && perio_tx_fifo_size_13<=32768)
816                                 ifxusb_module_params.tx_fifo_size[13]=perio_tx_fifo_size_13;
817                         else
818                                 ifxusb_module_params.tx_fifo_size[13]=default_param_perio_tx_fifo_size_13;
819                         if(perio_tx_fifo_size_14>=0 && perio_tx_fifo_size_14<=32768)
820                                 ifxusb_module_params.tx_fifo_size[14]=perio_tx_fifo_size_14;
821                         else
822                                 ifxusb_module_params.tx_fifo_size[14]=default_param_perio_tx_fifo_size_14;
823                         if(perio_tx_fifo_size_15>=0 && perio_tx_fifo_size_15<=32768)
824                                 ifxusb_module_params.tx_fifo_size[15]=perio_tx_fifo_size_15;
825                         else
826                                 ifxusb_module_params.tx_fifo_size[15]=default_param_perio_tx_fifo_size_15;
827                 #endif //__DED_FIFO__
828         #endif //__IS_DEVICE__
829 }
830
831
832
833
834
835
836
837 module_param(dbg_lvl, long, 0444);
838 MODULE_PARM_DESC(dbg_lvl, "Debug level.");
839
840 module_param(dma_burst_size, short, 0444);
841 MODULE_PARM_DESC(dma_burst_size, "DMA Burst Size 0, 1, 4, 8, 16");
842
843 module_param(speed, short, 0444);
844 MODULE_PARM_DESC(speed, "Speed 0=High Speed 1=Full Speed");
845
846 module_param(data_fifo_size, long, 0444);
847 MODULE_PARM_DESC(data_fifo_size, "Total number of words in the data FIFO memory 32-32768");
848
849 #ifdef __IS_DEVICE__
850         module_param(rx_fifo_size, long, 0444);
851         MODULE_PARM_DESC(rx_fifo_size, "Number of words in the Rx FIFO 16-32768");
852
853         #ifdef __DED_FIFO__
854                 module_param(tx_fifo_size_00, long, 0444);
855                 MODULE_PARM_DESC(tx_fifo_size_00, "Number of words in the Tx FIFO #00 16-32768");
856                 module_param(tx_fifo_size_01, long, 0444);
857                 MODULE_PARM_DESC(tx_fifo_size_01, "Number of words in the Tx FIFO #01  0-32768");
858                 module_param(tx_fifo_size_02, long, 0444);
859                 MODULE_PARM_DESC(tx_fifo_size_02, "Number of words in the Tx FIFO #02  0-32768");
860                 module_param(tx_fifo_size_03, long, 0444);
861                 MODULE_PARM_DESC(tx_fifo_size_03, "Number of words in the Tx FIFO #03  0-32768");
862                 module_param(tx_fifo_size_04, long, 0444);
863                 MODULE_PARM_DESC(tx_fifo_size_04, "Number of words in the Tx FIFO #04  0-32768");
864                 module_param(tx_fifo_size_05, long, 0444);
865                 MODULE_PARM_DESC(tx_fifo_size_05, "Number of words in the Tx FIFO #05  0-32768");
866                 module_param(tx_fifo_size_06, long, 0444);
867                 MODULE_PARM_DESC(tx_fifo_size_06, "Number of words in the Tx FIFO #06  0-32768");
868                 module_param(tx_fifo_size_07, long, 0444);
869                 MODULE_PARM_DESC(tx_fifo_size_07, "Number of words in the Tx FIFO #07  0-32768");
870                 module_param(tx_fifo_size_08, long, 0444);
871                 MODULE_PARM_DESC(tx_fifo_size_08, "Number of words in the Tx FIFO #08  0-32768");
872                 module_param(tx_fifo_size_09, long, 0444);
873                 MODULE_PARM_DESC(tx_fifo_size_09, "Number of words in the Tx FIFO #09  0-32768");
874                 module_param(tx_fifo_size_10, long, 0444);
875                 MODULE_PARM_DESC(tx_fifo_size_10, "Number of words in the Tx FIFO #10  0-32768");
876                 module_param(tx_fifo_size_11, long, 0444);
877                 MODULE_PARM_DESC(tx_fifo_size_11, "Number of words in the Tx FIFO #11  0-32768");
878                 module_param(tx_fifo_size_12, long, 0444);
879                 MODULE_PARM_DESC(tx_fifo_size_12, "Number of words in the Tx FIFO #12  0-32768");
880                 module_param(tx_fifo_size_13, long, 0444);
881                 MODULE_PARM_DESC(tx_fifo_size_13, "Number of words in the Tx FIFO #13  0-32768");
882                 module_param(tx_fifo_size_14, long, 0444);
883                 MODULE_PARM_DESC(tx_fifo_size_14, "Number of words in the Tx FIFO #14  0-32768");
884                 module_param(tx_fifo_size_15, long, 0444);
885                 MODULE_PARM_DESC(tx_fifo_size_15, "Number of words in the Tx FIFO #15  0-32768");
886
887                 module_param(thr_ctl, short, 0444);
888                 MODULE_PARM_DESC(thr_ctl, "0=Without 1=With Theshold Ctrl");
889
890                 module_param(tx_thr_length, long, 0444);
891                 MODULE_PARM_DESC(tx_thr_length, "TX Threshold length");
892
893                 module_param(rx_thr_length, long, 0444);
894                 MODULE_PARM_DESC(rx_thr_length, "RX Threshold length");
895
896         #else
897                 module_param(nperio_tx_fifo_size, long, 0444);
898                 MODULE_PARM_DESC(nperio_tx_fifo_size, "Number of words in the non-periodic Tx FIFO 16-32768");
899
900                 module_param(perio_tx_fifo_size_01, long, 0444);
901                 MODULE_PARM_DESC(perio_tx_fifo_size_01, "Number of words in the periodic Tx FIFO #01  0-32768");
902                 module_param(perio_tx_fifo_size_02, long, 0444);
903                 MODULE_PARM_DESC(perio_tx_fifo_size_02, "Number of words in the periodic Tx FIFO #02  0-32768");
904                 module_param(perio_tx_fifo_size_03, long, 0444);
905                 MODULE_PARM_DESC(perio_tx_fifo_size_03, "Number of words in the periodic Tx FIFO #03  0-32768");
906                 module_param(perio_tx_fifo_size_04, long, 0444);
907                 MODULE_PARM_DESC(perio_tx_fifo_size_04, "Number of words in the periodic Tx FIFO #04  0-32768");
908                 module_param(perio_tx_fifo_size_05, long, 0444);
909                 MODULE_PARM_DESC(perio_tx_fifo_size_05, "Number of words in the periodic Tx FIFO #05  0-32768");
910                 module_param(perio_tx_fifo_size_06, long, 0444);
911                 MODULE_PARM_DESC(perio_tx_fifo_size_06, "Number of words in the periodic Tx FIFO #06  0-32768");
912                 module_param(perio_tx_fifo_size_07, long, 0444);
913                 MODULE_PARM_DESC(perio_tx_fifo_size_07, "Number of words in the periodic Tx FIFO #07  0-32768");
914                 module_param(perio_tx_fifo_size_08, long, 0444);
915                 MODULE_PARM_DESC(perio_tx_fifo_size_08, "Number of words in the periodic Tx FIFO #08  0-32768");
916                 module_param(perio_tx_fifo_size_09, long, 0444);
917                 MODULE_PARM_DESC(perio_tx_fifo_size_09, "Number of words in the periodic Tx FIFO #09  0-32768");
918                 module_param(perio_tx_fifo_size_10, long, 0444);
919                 MODULE_PARM_DESC(perio_tx_fifo_size_10, "Number of words in the periodic Tx FIFO #10  0-32768");
920                 module_param(perio_tx_fifo_size_11, long, 0444);
921                 MODULE_PARM_DESC(perio_tx_fifo_size_11, "Number of words in the periodic Tx FIFO #11  0-32768");
922                 module_param(perio_tx_fifo_size_12, long, 0444);
923                 MODULE_PARM_DESC(perio_tx_fifo_size_12, "Number of words in the periodic Tx FIFO #12  0-32768");
924                 module_param(perio_tx_fifo_size_13, long, 0444);
925                 MODULE_PARM_DESC(perio_tx_fifo_size_13, "Number of words in the periodic Tx FIFO #13  0-32768");
926                 module_param(perio_tx_fifo_size_14, long, 0444);
927                 MODULE_PARM_DESC(perio_tx_fifo_size_14, "Number of words in the periodic Tx FIFO #14  0-32768");
928                 module_param(perio_tx_fifo_size_15, long, 0444);
929                 MODULE_PARM_DESC(perio_tx_fifo_size_15, "Number of words in the periodic Tx FIFO #15  0-32768");
930         #endif//__DED_FIFO__
931         module_param(dev_endpoints, short, 0444);
932         MODULE_PARM_DESC(dev_endpoints, "The number of endpoints in addition to EP0 available for device mode 1-15");
933 #endif
934
935 #ifdef __IS_HOST__
936         module_param(rx_fifo_size, long, 0444);
937         MODULE_PARM_DESC(rx_fifo_size, "Number of words in the Rx FIFO 16-32768");
938
939         module_param(nperio_tx_fifo_size, long, 0444);
940         MODULE_PARM_DESC(nperio_tx_fifo_size, "Number of words in the non-periodic Tx FIFO 16-32768");
941
942         module_param(perio_tx_fifo_size, long, 0444);
943         MODULE_PARM_DESC(perio_tx_fifo_size, "Number of words in the host periodic Tx FIFO 16-32768");
944
945         module_param(host_channels, short, 0444);
946         MODULE_PARM_DESC(host_channels, "The number of host channel registers to use 1-16");
947 #endif
948
949 module_param(max_transfer_size, long, 0444);
950 MODULE_PARM_DESC(max_transfer_size, "The maximum transfer size supported in bytes 2047-65535");
951
952 module_param(max_packet_count, long, 0444);
953 MODULE_PARM_DESC(max_packet_count, "The maximum number of packets in a transfer 15-511");
954
955 module_param(phy_utmi_width, long, 0444);
956 MODULE_PARM_DESC(phy_utmi_width, "Specifies the UTMI+ Data Width 8 or 16 bits");
957
958 module_param(turn_around_time_hs, long, 0444);
959 MODULE_PARM_DESC(turn_around_time_hs, "Turn-Around time for HS");
960
961 module_param(turn_around_time_fs, long, 0444);
962 MODULE_PARM_DESC(turn_around_time_fs, "Turn-Around time for FS");
963
964 module_param(timeout_cal_hs, long, 0444);
965 MODULE_PARM_DESC(timeout_cal_hs, "Timeout Cal for HS");
966
967 module_param(timeout_cal_fs, long, 0444);
968 MODULE_PARM_DESC(timeout_cal_fs, "Timeout Cal for FS");
969
970