[lantiq] prepare Makefile for 3.6
[openwrt/svn-archive/archive.git] / target / linux / lantiq / files / 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