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
93ifxusb_params_t ifxusb_module_params;
94
95static 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*/
108static 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*/
260static 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
428ifxusb_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
440static 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
449int __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
482module_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
491void __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
507module_exit(ifxusb_driver_cleanup);
508
509
510
511MODULE_DESCRIPTION(USB_DRIVER_DESC);
512MODULE_AUTHOR("Infineon");
513MODULE_LICENSE("GPL");
514
515
516
517// Parameters set when loaded
518//static long  dbg_lvl =0xFFFFFFFF;
519static long  dbg_lvl =0;
520static short dma_burst_size =-1;
521static short speed =-1;
522static 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
573static long   max_transfer_size =-1;
574static long   max_packet_count =-1;
575static long   phy_utmi_width =-1;
576static long   turn_around_time_hs =-1;
577static long   turn_around_time_fs =-1;
578static long   timeout_cal_hs =-1;
579static long   timeout_cal_fs =-1;
580
581/*!
582   \brief Parsing the parameters taken when module load
583*/
584static 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
837module_param(dbg_lvl, long, 0444);
838MODULE_PARM_DESC(dbg_lvl, "Debug level.");
839
840module_param(dma_burst_size, short, 0444);
841MODULE_PARM_DESC(dma_burst_size, "DMA Burst Size 0, 1, 4, 8, 16");
842
843module_param(speed, short, 0444);
844MODULE_PARM_DESC(speed, "Speed 0=High Speed 1=Full Speed");
845
846module_param(data_fifo_size, long, 0444);
847MODULE_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
949module_param(max_transfer_size, long, 0444);
950MODULE_PARM_DESC(max_transfer_size, "The maximum transfer size supported in bytes 2047-65535");
951
952module_param(max_packet_count, long, 0444);
953MODULE_PARM_DESC(max_packet_count, "The maximum number of packets in a transfer 15-511");
954
955module_param(phy_utmi_width, long, 0444);
956MODULE_PARM_DESC(phy_utmi_width, "Specifies the UTMI+ Data Width 8 or 16 bits");
957
958module_param(turn_around_time_hs, long, 0444);
959MODULE_PARM_DESC(turn_around_time_hs, "Turn-Around time for HS");
960
961module_param(turn_around_time_fs, long, 0444);
962MODULE_PARM_DESC(turn_around_time_fs, "Turn-Around time for FS");
963
964module_param(timeout_cal_hs, long, 0444);
965MODULE_PARM_DESC(timeout_cal_hs, "Timeout Cal for HS");
966
967module_param(timeout_cal_fs, long, 0444);
968MODULE_PARM_DESC(timeout_cal_fs, "Timeout Cal for FS");
969
970
971