1/*****************************************************************************
2 **   FILE NAME       : ifxusb_ctl.c
3 **   PROJECT         : IFX USB sub-system V3
4 **   MODULES         : IFX USB sub-system Host and Device driver
5 **   SRC VERSION     : 1.0
6 **   SRC VERSION     : 3.2
7 **   DATE            : 1/Jan/2011
8 **   DESCRIPTION     : Implementing the procfs and sysfs for IFX USB driver
9 **   FUNCTIONS       :
10 **   COMPILER        : gcc
11 **   REFERENCE       : Synopsys DWC-OTG Driver 2.7
12 **   COPYRIGHT       :  Copyright (c) 2010
13 **                      LANTIQ DEUTSCHLAND GMBH,
14 **                      Am Campeon 3, 85579 Neubiberg, Germany
15 **
16 **    This program is free software; you can redistribute it and/or modify
17 **    it under the terms of the GNU General Public License as published by
18 **    the Free Software Foundation; either version 2 of the License, or
19 **    (at your option) any later version.
20 **
21 **  Version Control Section  **
22 **   $Author$
23 **   $Date$
24 **   $Revisions$
25 **   $Log$       Revision history
26 *****************************************************************************/
27
28/*
29 * This file contains code fragments from Synopsys HS OTG Linux Software Driver.
30 * For this code the following notice is applicable:
31 *
32 * ==========================================================================
33 *
34 * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
35 * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless
36 * otherwise expressly agreed to in writing between Synopsys and you.
37 *
38 * The Software IS NOT an item of Licensed Software or Licensed Product under
39 * any End User Software License Agreement or Agreement for Licensed Product
40 * with Synopsys or any supplement thereto. You are permitted to use and
41 * redistribute this Software in source and binary forms, with or without
42 * modification, provided that redistributions of source code must retain this
43 * notice. You may not view, use, disclose, copy or distribute this file or
44 * any information contained herein except pursuant to this license grant from
45 * Synopsys. If you do not agree with this notice, including the disclaimer
46 * below, then you are not authorized to use the Software.
47 *
48 * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS
49 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51 * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS BE LIABLE FOR ANY DIRECT,
52 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
53 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
54 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
55 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
58 * DAMAGE.
59 * ========================================================================== */
60
61/*! \file ifxusb_ctl.c
62  \ingroup IFXUSB_DRIVER_V3
63    \brief Implementing the procfs and sysfs for IFX USB driver
64*/
65
66#include <linux/version.h>
67#include "ifxusb_version.h"
68
69
70#include <linux/proc_fs.h>
71#include <asm/byteorder.h>
72#include <asm/unaligned.h>
73#include <asm/uaccess.h>
74
75#include "ifxusb_plat.h"
76#include "ifxusb_regs.h"
77#include "ifxusb_cif.h"
78
79#ifdef __IS_DEVICE__
80	#include "ifxpcd.h"
81	#ifdef __GADGET_COC__
82		#include <asm/ifx/ifx_types.h>
83		#include <asm/ifx/ifx_pmcu.h>
84		IFX_PMCU_REGISTER_t pmcuRegisterUSBGadget;
85	#endif
86#endif
87
88#ifdef __IS_HOST__
89	#include "ifxhcd.h"
90	#ifdef __HOST_COC__
91		#include <asm/ifx/ifx_types.h>
92		#include <asm/ifx/ifx_pmcu.h>
93		#ifdef __IS_DUAL__
94		   IFX_PMCU_REGISTER_t pmcuRegisterUSBHost_1;
95		   IFX_PMCU_REGISTER_t pmcuRegisterUSBHost_2;
96		#else
97		   IFX_PMCU_REGISTER_t pmcuRegisterUSBHost;
98		#endif
99	#endif
100#endif
101
102#include <linux/device.h>
103#include <linux/platform_device.h>
104#include <linux/gfp.h>
105
106#ifdef __IS_HOST__
107	extern char ifxusb_hcd_driver_name[];
108
109	#ifdef __IS_DUAL__
110		extern ifxhcd_hcd_t ifxusb_hcd_1;
111		extern ifxhcd_hcd_t ifxusb_hcd_2;
112		extern char ifxusb_hcd_name_1[];
113		extern char ifxusb_hcd_name_2[];
114	#else
115		extern ifxhcd_hcd_t ifxusb_hcd;
116		extern char ifxusb_hcd_name[];
117	#endif
118
119#endif
120
121#ifdef __IS_DEVICE__
122	extern char ifxusb_pcd_driver_name[];
123
124	extern ifxpcd_pcd_t ifxusb_pcd;
125	extern char ifxusb_pcd_name[];
126#endif
127
128
129//Attributes for sysfs (for 2.6 only)
130
131#ifdef __IS_HOST__
132extern struct device_attribute dev_attr_version_h;
133#else
134extern struct device_attribute dev_attr_version_d;
135#endif
136#ifdef __IS_HOST__
137extern struct device_attribute dev_attr_dbglevel_h;
138#else
139extern struct device_attribute dev_attr_dbglevel_d;
140#endif
141#ifdef __IS_HOST__
142	#ifdef __IS_DUAL__
143		extern struct device_attribute dev_attr_suspend_host_1;
144		extern struct device_attribute dev_attr_suspend_host_2;
145		extern struct device_attribute dev_attr_probe_host_1;
146		extern struct device_attribute dev_attr_probe_host_2;
147		extern struct device_attribute dev_attr_probe_timer1_val_h;
148		extern struct device_attribute dev_attr_probe_timer2_val_h;
149		extern struct device_attribute dev_attr_autoprobe_timer1_val_h;
150		extern struct device_attribute dev_attr_autoprobe_timer2_val_h;
151	#else
152		extern struct device_attribute dev_attr_suspend_host;
153		extern struct device_attribute dev_attr_probe_host;
154		extern struct device_attribute dev_attr_probe_timer_val_h;
155		extern struct device_attribute dev_attr_autoprobe_timer_val_h;
156	#endif
157#endif
158
159#ifdef __IS_DEVICE__
160	extern struct device_attribute dev_attr_suspend_device;
161	extern struct device_attribute dev_attr_probe_device;
162	extern struct device_attribute dev_attr_probe_timer_val_d;
163	extern struct device_attribute dev_attr_autoprobe_timer_val_d;
164#endif
165
166#ifdef __IS_HOST__
167	#ifdef __IS_DUAL__
168		extern struct device_attribute dev_attr_dump_params_h_1;
169		extern struct device_attribute dev_attr_dump_params_h_2;
170		extern struct device_attribute dev_attr_mode_h_1;
171		extern struct device_attribute dev_attr_mode_h_2;
172	#else
173		extern struct device_attribute dev_attr_dump_params_h;
174		extern struct device_attribute dev_attr_mode_h;
175	#endif
176#else
177	extern struct device_attribute dev_attr_dump_params_d;
178	extern struct device_attribute dev_attr_mode_d;
179#endif
180
181#ifdef __IS_HOST__
182	#ifdef __IS_DUAL__
183		extern struct device_attribute dev_attr_pkt_count_limit_bi_1;
184		extern struct device_attribute dev_attr_pkt_count_limit_bo_1;
185		extern struct device_attribute dev_attr_pkt_count_limit_bi_2;
186		extern struct device_attribute dev_attr_pkt_count_limit_bo_2;
187		extern struct device_attribute dev_attr_bandwidth_fs_1;
188		extern struct device_attribute dev_attr_bandwidth_ls_1;
189		extern struct device_attribute dev_attr_bandwidth_hs_2;
190		extern struct device_attribute dev_attr_bandwidth_fs_2;
191		extern struct device_attribute dev_attr_bandwidth_ls_2;
192		extern struct device_attribute dev_attr_buspower_1;
193		extern struct device_attribute dev_attr_buspower_2;
194		extern struct device_attribute dev_attr_bussuspend_1;
195		extern struct device_attribute dev_attr_bussuspend_2;
196		extern struct device_attribute dev_attr_busconnected_1;
197		extern struct device_attribute dev_attr_busconnected_2;
198		extern struct device_attribute dev_attr_connectspeed_1;
199		extern struct device_attribute dev_attr_connectspeed_1;
200	#else
201		extern struct device_attribute dev_attr_pkt_count_limit_bi;
202		extern struct device_attribute dev_attr_pkt_count_limit_bo;
203		extern struct device_attribute dev_attr_bandwidth_hs;
204		extern struct device_attribute dev_attr_bandwidth_fs;
205		extern struct device_attribute dev_attr_bandwidth_ls;
206		extern struct device_attribute dev_attr_buspower;
207		extern struct device_attribute dev_attr_bussuspend;
208		extern struct device_attribute dev_attr_busconnected;
209		extern struct device_attribute dev_attr_connectspeed;
210	#endif
211#endif //__IS_HOST__
212
213#ifdef __IS_DEVICE__
214	extern struct device_attribute dev_attr_devspeed;
215	extern struct device_attribute dev_attr_enumspeed;
216#endif //__IS_DEVICE__
217
218#ifdef __ENABLE_DUMP__
219	#ifdef __IS_HOST__
220		#ifdef __IS_DUAL__
221			extern struct device_attribute dev_attr_dump_reg_h_1;
222			extern struct device_attribute dev_attr_dump_reg_h_2;
223			extern struct device_attribute dev_attr_dump_spram_h_1;
224			extern struct device_attribute dev_attr_dump_spram_h_2;
225			extern struct device_attribute dev_attr_dump_host_state_1;
226			extern struct device_attribute dev_attr_dump_host_state_2;
227		#else
228			extern struct device_attribute dev_attr_dump_reg_h;
229			extern struct device_attribute dev_attr_dump_spram_h;
230			extern struct device_attribute dev_attr_dump_host_state;
231		#endif
232	#else
233		extern struct device_attribute dev_attr_dump_reg_d;
234		extern struct device_attribute dev_attr_dump_spram_d;
235	#endif
236#endif //__ENABLE_DUMP__
237
238
239/////////////////////////////////////////////////////////////////////////////////////////////////////
240/////////////////////////////////////////////////////////////////////////////////////////////////////
241/////////////////////////////////////////////////////////////////////////////////////////////////////
242
243static ssize_t procfs_version_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
244{
245	return sprintf( buf, "%s\n",IFXUSB_VERSION );
246}
247
248#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
249	static ssize_t sysfs_version_show( struct device *_dev, struct device_attribute *attr,char *buf)
250#else
251	static ssize_t sysfs_version_show( struct device *_dev,                               char *buf)
252#endif
253{
254	return sprintf( buf, "%s\n",IFXUSB_VERSION );
255}
256
257#ifdef __IS_HOST__
258DEVICE_ATTR(version_h, S_IRUGO|S_IWUSR, sysfs_version_show, NULL);
259#else
260DEVICE_ATTR(version_d, S_IRUGO|S_IWUSR, sysfs_version_show, NULL);
261#endif
262
263
264/////////////////////////////////////////////////////////////////////////////////////////////////////
265/////////////////////////////////////////////////////////////////////////////////////////////////////
266/////////////////////////////////////////////////////////////////////////////////////////////////////
267/////////////////////////////////////////////////////////////////////////////////////////////////////
268/////////////////////////////////////////////////////////////////////////////////////////////////////
269/////////////////////////////////////////////////////////////////////////////////////////////////////
270
271static ssize_t procfs_dbglevel_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
272{
273	#ifdef __IS_HOST__
274		return sprintf( buf, "%08X\n",h_dbg_lvl );
275	#else
276		return sprintf( buf, "%08X\n",d_dbg_lvl );
277	#endif
278}
279
280static ssize_t procfs_dbglevel_store(struct file *file, const char *buffer, unsigned long count, void *data)
281{
282	char buf[10];
283	int i = 0;
284	uint32_t value;
285	if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
286		return -EFAULT;
287	value = simple_strtoul(buf, NULL, 16);
288	#ifdef __IS_HOST__
289		h_dbg_lvl =value;
290	#else
291		d_dbg_lvl =value;
292	#endif
293		//turn on and off power
294	return count;
295}
296
297#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
298	static ssize_t sysfs_dbglevel_show( struct device *_dev, struct device_attribute *attr,char *buf)
299#else
300	static ssize_t sysfs_dbglevel_show( struct device *_dev,                               char *buf)
301#endif
302{
303	#ifdef __IS_HOST__
304		return sprintf( buf, "%08X\n",h_dbg_lvl );
305	#else
306		return sprintf( buf, "%08X\n",d_dbg_lvl );
307	#endif
308}
309
310#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
311	static ssize_t sysfs_dbglevel_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
312#else
313    static ssize_t sysfs_dbglevel_store( struct device *_dev,                               const char *buffer, size_t count )
314#endif
315{
316	char buf[10];
317	int i = 0;
318	uint32_t value;
319	if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
320		return -EFAULT;
321	value = simple_strtoul(buf, NULL, 16);
322	#ifdef __IS_HOST__
323		h_dbg_lvl =value;
324	#else
325		d_dbg_lvl =value;
326	#endif
327		//turn on and off power
328	return count;
329}
330
331#ifdef __IS_HOST__
332DEVICE_ATTR(dbglevel_h, S_IRUGO|S_IWUSR, sysfs_dbglevel_show, sysfs_dbglevel_store);
333#else
334DEVICE_ATTR(dbglevel_d, S_IRUGO|S_IWUSR, sysfs_dbglevel_show, sysfs_dbglevel_store);
335#endif
336
337
338/////////////////////////////////////////////////////////////////////////////////////////////////////
339/////////////////////////////////////////////////////////////////////////////////////////////////////
340/////////////////////////////////////////////////////////////////////////////////////////////////////
341
342static void ifxusb_dump_params(ifxusb_core_if_t *_core_if);
343
344#ifdef __IS_DUAL__
345	static void dump_params_1(void)
346	{
347		ifxusb_dump_params(&ifxusb_hcd_1.core_if);
348	}
349	static void dump_params_2(void)
350	{
351		ifxusb_dump_params(&ifxusb_hcd_2.core_if);
352	}
353
354	static ssize_t procfs_dump_params_show_1(char *buf, char **start, off_t offset, int count, int *eof, void *data)
355	{
356		dump_params_1();
357		return 0;
358	}
359	static ssize_t procfs_dump_params_show_2(char *buf, char **start, off_t offset, int count, int *eof, void *data)
360	{
361		dump_params_2();
362		return 0;
363	}
364
365	#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
366		static ssize_t sysfs_dump_params_show_1( struct device *_dev, struct device_attribute *attr,char *buf)
367	#else
368		static ssize_t sysfs_dump_params_show_1( struct device *_dev,char *buf)
369	#endif
370	{
371		dump_params_1();
372		return 0;
373	}
374	DEVICE_ATTR(dump_params_h_1, S_IRUGO|S_IWUSR, sysfs_dump_params_show_1, NULL);
375
376	#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
377		static ssize_t sysfs_dump_params_show_2( struct device *_dev, struct device_attribute *attr,char *buf)
378	#else
379		static ssize_t sysfs_dump_params_show_2( struct device *_dev,char *buf)
380	#endif
381	{
382		dump_params_2();
383		return 0;
384	}
385
386	DEVICE_ATTR(dump_params_h_2, S_IRUGO|S_IWUSR, sysfs_dump_params_show_2, NULL);
387#else
388	static void dump_params(void)
389	{
390		#ifdef __IS_HOST__
391			ifxusb_dump_params(&ifxusb_hcd.core_if);
392		#else
393			ifxusb_dump_params(&ifxusb_pcd.core_if);
394		#endif
395	}
396
397	static ssize_t procfs_dump_params_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
398	{
399		dump_params();
400		return 0;
401	}
402
403	#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
404		static ssize_t sysfs_dump_params_show( struct device *_dev, struct device_attribute *attr,char *buf)
405	#else
406		static ssize_t sysfs_dump_params_show( struct device *_dev,char *buf)
407	#endif
408	{
409		dump_params();
410		return 0;
411	}
412
413	#ifdef __IS_HOST__
414	DEVICE_ATTR(dump_params_h, S_IRUGO|S_IWUSR, sysfs_dump_params_show, NULL);
415	#else
416	DEVICE_ATTR(dump_params_d, S_IRUGO|S_IWUSR, sysfs_dump_params_show, NULL);
417	#endif
418#endif
419
420/////////////////////////////////////////////////////////////////////////////////////////////////////
421/////////////////////////////////////////////////////////////////////////////////////////////////////
422/////////////////////////////////////////////////////////////////////////////////////////////////////
423
424#ifdef __IS_DUAL__
425	static ssize_t mode_show_1(char *buf)
426	{
427		if((ifxusb_rreg(&ifxusb_hcd_1.core_if.core_global_regs->gintsts ) & 0x1) == 1)
428			return sprintf( buf, "HOST\n" );
429		else
430			return sprintf( buf, "DEVICE(INCORRECT!)\n" );
431	}
432
433	static ssize_t mode_show_2(char *buf)
434	{
435		if((ifxusb_rreg(&ifxusb_hcd_2.core_if.core_global_regs->gintsts ) & 0x1) == 1)
436			return sprintf( buf, "HOST\n" );
437		else
438			return sprintf( buf, "DEVICE(INCORRECT!)\n" );
439	}
440
441	static ssize_t procfs_mode_show_1(char *buf, char **start, off_t offset, int count, int *eof, void *data)
442	{
443		return mode_show_1(buf);
444	}
445	static ssize_t procfs_mode_show_2(char *buf, char **start, off_t offset, int count, int *eof, void *data)
446	{
447		return mode_show_2(buf);
448	}
449
450	#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
451		static ssize_t sysfs_mode_show_1( struct device *_dev, struct device_attribute *attr,char *buf)
452	#else
453		static ssize_t sysfs_mode_show_1( struct device *_dev,char *buf)
454	#endif
455	{
456		return mode_show_1(buf);
457	}
458
459	DEVICE_ATTR(mode_h_1, S_IRUGO|S_IWUSR, sysfs_mode_show_1, 0);
460
461	#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
462		static ssize_t sysfs_mode_show_2( struct device *_dev, struct device_attribute *attr,char *buf)
463	#else
464		static ssize_t sysfs_mode_show_2( struct device *_dev,char *buf)
465	#endif
466	{
467		return mode_show_2(buf);
468	}
469	DEVICE_ATTR(mode_h_2, S_IRUGO|S_IWUSR, sysfs_mode_show_2, NULL);
470#else
471	static ssize_t mode_show(char *buf)
472	{
473		#ifdef __IS_HOST__
474			if((ifxusb_rreg(&ifxusb_hcd.core_if.core_global_regs->gintsts ) & 0x1) == 1)
475				return sprintf( buf, "HOST\n" );
476			else
477				return sprintf( buf, "DEVICE(INCORRECT!)\n" );
478		#else
479			if((ifxusb_rreg(&ifxusb_pcd.core_if.core_global_regs->gintsts ) & 0x1) != 1)
480				return sprintf( buf, "DEVICE\n" );
481			else
482				return sprintf( buf, "HOST(INCORRECT!)\n" );
483		#endif
484	}
485	static ssize_t procfs_mode_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
486	{
487		return mode_show(buf);
488	}
489	#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
490		static ssize_t sysfs_mode_show( struct device *_dev, struct device_attribute *attr,char *buf)
491	#else
492		static ssize_t sysfs_mode_show( struct device *_dev,                               char *buf)
493	#endif
494	{
495		return mode_show(buf);
496	}
497	#ifdef __IS_HOST__
498	DEVICE_ATTR(mode_h, S_IRUGO|S_IWUSR, sysfs_mode_show, NULL);
499	#else
500	DEVICE_ATTR(mode_d, S_IRUGO|S_IWUSR, sysfs_mode_show, NULL);
501	#endif
502#endif
503
504/////////////////////////////////////////////////////////////////////////////////////////////////////
505/////////////////////////////////////////////////////////////////////////////////////////////////////
506/////////////////////////////////////////////////////////////////////////////////////////////////////
507
508#ifdef __IS_HOST__
509/////////////////////////////////////////////////////////////////////////////////////////////////////
510/////////////////////////////////////////////////////////////////////////////////////////////////////
511/////////////////////////////////////////////////////////////////////////////////////////////////////
512	#ifdef __IS_DUAL__
513		static ssize_t bandwidth_hs_show_1(char *buf)
514		{
515			return sprintf( buf, "%d\n",ifxusb_hcd_1.pkt_remaining_reload_hs );
516		}
517		static ssize_t bandwidth_fs_show_1(char *buf)
518		{
519			return sprintf( buf, "%d\n",ifxusb_hcd_1.pkt_remaining_reload_fs );
520		}
521		static ssize_t bandwidth_ls_show_1(char *buf)
522		{
523			return sprintf( buf, "%d\n",ifxusb_hcd_1.pkt_remaining_reload_ls );
524		}
525		static void bandwidth_hs_store_1(uint32_t value)
526		{
527			if(value>16 && value<120)
528			{
529				hprt0_data_t hprt0;
530				ifxusb_hcd_1.pkt_remaining_reload_hs = value;
531				hprt0.d32 = ifxusb_rreg(ifxusb_hcd_1.core_if.hprt0);
532				if(hprt0.b.prtspd == IFXUSB_HPRT0_PRTSPD_HIGH_SPEED)
533					ifxusb_hcd_1.pkt_remaining_reload=value;
534			}
535		}
536		static void bandwidth_fs_store_1(uint32_t value)
537		{
538			if     (value>2 && value<30)
539			{
540				hprt0_data_t hprt0;
541				ifxusb_hcd_1.pkt_remaining_reload_fs = value;
542				hprt0.d32 = ifxusb_rreg(ifxusb_hcd_1.core_if.hprt0);
543				if(hprt0.b.prtspd != IFXUSB_HPRT0_PRTSPD_LOW_SPEED && hprt0.b.prtspd != IFXUSB_HPRT0_PRTSPD_HIGH_SPEED)
544					ifxusb_hcd_1.pkt_remaining_reload=value;
545			}
546		}
547		static void bandwidth_ls_store_1(uint32_t value)
548		{
549			if     (value>2 && value<30)
550			{
551				hprt0_data_t hprt0;
552				ifxusb_hcd_1.pkt_remaining_reload_ls = value;
553				hprt0.d32 = ifxusb_rreg(ifxusb_hcd_1.core_if.hprt0);
554				if(hprt0.b.prtspd == IFXUSB_HPRT0_PRTSPD_LOW_SPEED)
555					ifxusb_hcd_1.pkt_remaining_reload=value;
556			}
557		}
558		static ssize_t bandwidth_hs_show_2(char *buf)
559		{
560			return sprintf( buf, "%d\n",ifxusb_hcd_2.pkt_remaining_reload_hs );
561		}
562		static ssize_t bandwidth_fs_show_2(char *buf)
563		{
564			return sprintf( buf, "%d\n",ifxusb_hcd_2.pkt_remaining_reload_fs );
565		}
566		static ssize_t bandwidth_ls_show_2(char *buf)
567		{
568			return sprintf( buf, "%d\n",ifxusb_hcd_2.pkt_remaining_reload_ls );
569		}
570		static void bandwidth_hs_store_2(uint32_t value)
571		{
572			if(value>16 && value<120)
573			{
574				hprt0_data_t hprt0;
575				ifxusb_hcd_2.pkt_remaining_reload_hs = value;
576				hprt0.d32 = ifxusb_rreg(ifxusb_hcd_2.core_if.hprt0);
577				if(hprt0.b.prtspd == IFXUSB_HPRT0_PRTSPD_HIGH_SPEED)
578					ifxusb_hcd_2.pkt_remaining_reload=value;
579			}
580		}
581		static void bandwidth_fs_store_2(uint32_t value)
582		{
583			if     (value>2 && value<30)
584			{
585				hprt0_data_t hprt0;
586				ifxusb_hcd_2.pkt_remaining_reload_fs = value;
587				hprt0.d32 = ifxusb_rreg(ifxusb_hcd_2.core_if.hprt0);
588				if(hprt0.b.prtspd != IFXUSB_HPRT0_PRTSPD_LOW_SPEED && hprt0.b.prtspd != IFXUSB_HPRT0_PRTSPD_HIGH_SPEED)
589					ifxusb_hcd_2.pkt_remaining_reload=value;
590			}
591		}
592		static void bandwidth_ls_store_2(uint32_t value)
593		{
594			if     (value>2 && value<30)
595			{
596				hprt0_data_t hprt0;
597				ifxusb_hcd_2.pkt_remaining_reload_ls = value;
598				hprt0.d32 = ifxusb_rreg(ifxusb_hcd_2.core_if.hprt0);
599				if(hprt0.b.prtspd == IFXUSB_HPRT0_PRTSPD_LOW_SPEED)
600					ifxusb_hcd_2.pkt_remaining_reload=value;
601			}
602		}
603		static ssize_t procfs_bandwidth_hs_show_1(char *buf, char **start, off_t offset, int count, int *eof, void *data)
604		{
605			return bandwidth_hs_show_1(buf);
606		}
607		static ssize_t procfs_bandwidth_fs_show_1(char *buf, char **start, off_t offset, int count, int *eof, void *data)
608		{
609			return bandwidth_fs_show_1(buf);
610		}
611		static ssize_t procfs_bandwidth_ls_show_1(char *buf, char **start, off_t offset, int count, int *eof, void *data)
612		{
613			return bandwidth_ls_show_1(buf);
614		}
615		static ssize_t procfs_bandwidth_hs_store_1(struct file *file, const char *buffer, unsigned long count, void *data)
616		{
617			char buf[10];
618			int i = 0;
619			uint32_t value;
620			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
621				return -EFAULT;
622			value = simple_strtoul(buf, NULL, 10);
623			bandwidth_hs_store_1(value);
624			return count;
625		}
626		static ssize_t procfs_bandwidth_fs_store_1(struct file *file, const char *buffer, unsigned long count, void *data)
627		{
628			char buf[10];
629			int i = 0;
630			uint32_t value;
631			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
632				return -EFAULT;
633			value = simple_strtoul(buf, NULL, 10);
634			bandwidth_fs_store_1(value);
635			return count;
636		}
637		static ssize_t procfs_bandwidth_ls_store_1(struct file *file, const char *buffer, unsigned long count, void *data)
638		{
639			char buf[10];
640			int i = 0;
641			uint32_t value;
642			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
643				return -EFAULT;
644			value = simple_strtoul(buf, NULL, 10);
645			bandwidth_ls_store_1(value);
646			return count;
647		}
648		static ssize_t procfs_bandwidth_hs_show_2(char *buf, char **start, off_t offset, int count, int *eof, void *data)
649		{
650			return bandwidth_hs_show_2(buf);
651		}
652		static ssize_t procfs_bandwidth_fs_show_2(char *buf, char **start, off_t offset, int count, int *eof, void *data)
653		{
654			return bandwidth_fs_show_2(buf);
655		}
656		static ssize_t procfs_bandwidth_ls_show_2(char *buf, char **start, off_t offset, int count, int *eof, void *data)
657		{
658			return bandwidth_ls_show_2(buf);
659		}
660		static ssize_t procfs_bandwidth_hs_store_2(struct file *file, const char *buffer, unsigned long count, void *data)
661		{
662			char buf[10];
663			int i = 0;
664			uint32_t value;
665			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
666				return -EFAULT;
667			value = simple_strtoul(buf, NULL, 10);
668			bandwidth_hs_store_2(value);
669			return count;
670		}
671		static ssize_t procfs_bandwidth_fs_store_2(struct file *file, const char *buffer, unsigned long count, void *data)
672		{
673			char buf[10];
674			int i = 0;
675			uint32_t value;
676			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
677				return -EFAULT;
678			value = simple_strtoul(buf, NULL, 10);
679			bandwidth_fs_store_2(value);
680			return count;
681		}
682		static ssize_t procfs_bandwidth_ls_store_2(struct file *file, const char *buffer, unsigned long count, void *data)
683		{
684			char buf[10];
685			int i = 0;
686			uint32_t value;
687			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
688				return -EFAULT;
689			value = simple_strtoul(buf, NULL, 10);
690			bandwidth_ls_store_2(value);
691			return count;
692		}
693
694		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
695			static ssize_t sysfs_bandwidth_hs_show_1( struct device *_dev, struct device_attribute *attr,char *buf)
696		#else
697			static ssize_t sysfs_bandwidth_hs_show_1( struct device *_dev,char *buf)
698		#endif
699		{
700			return bandwidth_hs_show_1(buf);
701		}
702		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
703			static ssize_t sysfs_bandwidth_hs_store_1( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
704		#else
705		        static ssize_t sysfs_bandwidth_hs_store_1( struct device *_dev,                               const char *buffer, size_t count )
706		#endif
707		{
708			char buf[10];
709			int i = 0;
710			uint32_t value;
711			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
712				return -EFAULT;
713			value = simple_strtoul(buf, NULL, 10);
714			bandwidth_hs_store_1(value);
715			return count;
716		}
717		DEVICE_ATTR(bandwidth_hs_1, S_IRUGO|S_IWUSR, sysfs_bandwidth_hs_show_1, sysfs_bandwidth_hs_store_1);
718
719		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
720			static ssize_t sysfs_bandwidth_fs_show_1( struct device *_dev, struct device_attribute *attr,char *buf)
721		#else
722			static ssize_t sysfs_bandwidth_fs_show_1( struct device *_dev,char *buf)
723		#endif
724		{
725			return bandwidth_fs_show_1(buf);
726		}
727		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
728			static ssize_t sysfs_bandwidth_fs_store_1( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
729		#else
730		        static ssize_t sysfs_bandwidth_fs_store_1( struct device *_dev,                               const char *buffer, size_t count )
731		#endif
732		{
733			char buf[10];
734			int i = 0;
735			uint32_t value;
736			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
737				return -EFAULT;
738			value = simple_strtoul(buf, NULL, 10);
739			bandwidth_fs_store_1(value);
740			return count;
741		}
742		DEVICE_ATTR(bandwidth_fs_1, S_IRUGO|S_IWUSR, sysfs_bandwidth_fs_show_1, sysfs_bandwidth_fs_store_1);
743
744		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
745			static ssize_t sysfs_bandwidth_ls_show_1( struct device *_dev, struct device_attribute *attr,char *buf)
746		#else
747			static ssize_t sysfs_bandwidth_ls_show_1( struct device *_dev,char *buf)
748		#endif
749		{
750			return bandwidth_ls_show_1(buf);
751		}
752		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
753			static ssize_t sysfs_bandwidth_ls_store_1( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
754		#else
755		        static ssize_t sysfs_bandwidth_ls_store_1( struct device *_dev,                               const char *buffer, size_t count )
756		#endif
757		{
758			char buf[10];
759			int i = 0;
760			uint32_t value;
761			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
762				return -EFAULT;
763			value = simple_strtoul(buf, NULL, 10);
764			bandwidth_ls_store_1(value);
765			return count;
766		}
767		DEVICE_ATTR(bandwidth_ls_1, S_IRUGO|S_IWUSR, sysfs_bandwidth_ls_show_1, sysfs_bandwidth_ls_store_1);
768
769		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
770			static ssize_t sysfs_bandwidth_hs_show_2( struct device *_dev, struct device_attribute *attr,char *buf)
771		#else
772			static ssize_t sysfs_bandwidth_hs_show_2( struct device *_dev,char *buf)
773		#endif
774		{
775			return bandwidth_hs_show_2(buf);
776		}
777		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
778			static ssize_t sysfs_bandwidth_hs_store_2( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
779		#else
780		        static ssize_t sysfs_bandwidth_hs_store_2( struct device *_dev,                               const char *buffer, size_t count )
781		#endif
782		{
783			char buf[10];
784			int i = 0;
785			uint32_t value;
786			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
787				return -EFAULT;
788			value = simple_strtoul(buf, NULL, 10);
789			bandwidth_hs_store_2(value);
790			return count;
791		}
792		DEVICE_ATTR(bandwidth_hs_2, S_IRUGO|S_IWUSR, sysfs_bandwidth_hs_show_2, sysfs_bandwidth_hs_store_2);
793
794		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
795			static ssize_t sysfs_bandwidth_fs_show_2( struct device *_dev, struct device_attribute *attr,char *buf)
796		#else
797			static ssize_t sysfs_bandwidth_fs_show_2( struct device *_dev,char *buf)
798		#endif
799		{
800			return bandwidth_fs_show_2(buf);
801		}
802		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
803			static ssize_t sysfs_bandwidth_fs_store_2( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
804		#else
805		        static ssize_t sysfs_bandwidth_fs_store_2( struct device *_dev,                               const char *buffer, size_t count )
806		#endif
807		{
808			char buf[10];
809			int i = 0;
810			uint32_t value;
811			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
812				return -EFAULT;
813			value = simple_strtoul(buf, NULL, 10);
814			bandwidth_fs_store_2(value);
815			return count;
816		}
817		DEVICE_ATTR(bandwidth_fs_2, S_IRUGO|S_IWUSR, sysfs_bandwidth_fs_show_2, sysfs_bandwidth_fs_store_2);
818
819		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
820			static ssize_t sysfs_bandwidth_ls_show_2( struct device *_dev, struct device_attribute *attr,char *buf)
821		#else
822			static ssize_t sysfs_bandwidth_ls_show_2( struct device *_dev,char *buf)
823		#endif
824		{
825			return bandwidth_ls_show_2(buf);
826		}
827		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
828			static ssize_t sysfs_bandwidth_ls_store_2( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
829		#else
830		        static ssize_t sysfs_bandwidth_ls_store_2( struct device *_dev,                               const char *buffer, size_t count )
831		#endif
832		{
833			char buf[10];
834			int i = 0;
835			uint32_t value;
836			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
837				return -EFAULT;
838			value = simple_strtoul(buf, NULL, 10);
839			bandwidth_ls_store_2(value);
840			return count;
841		}
842		DEVICE_ATTR(bandwidth_ls_2, S_IRUGO|S_IWUSR, sysfs_bandwidth_ls_show_2, sysfs_bandwidth_ls_store_2);
843	#else
844		static ssize_t bandwidth_hs_show(char *buf)
845		{
846			return sprintf( buf, "%d\n",ifxusb_hcd.pkt_remaining_reload_hs );
847		}
848		static ssize_t bandwidth_fs_show(char *buf)
849		{
850			return sprintf( buf, "%d\n",ifxusb_hcd.pkt_remaining_reload_fs );
851		}
852		static ssize_t bandwidth_ls_show(char *buf)
853		{
854			return sprintf( buf, "%d\n",ifxusb_hcd.pkt_remaining_reload_ls );
855		}
856		static void bandwidth_hs_store(uint32_t value)
857		{
858			if     (value>16 && value<120)
859			{
860				hprt0_data_t hprt0;
861				ifxusb_hcd.pkt_remaining_reload_hs = value;
862				hprt0.d32 = ifxusb_rreg(ifxusb_hcd.core_if.hprt0);
863				if(hprt0.b.prtspd == IFXUSB_HPRT0_PRTSPD_HIGH_SPEED)
864					ifxusb_hcd.pkt_remaining_reload=value;
865			}
866		}
867		static void bandwidth_fs_store(uint32_t value)
868		{
869			if     (value>2 && value<30)
870			{
871				hprt0_data_t hprt0;
872				ifxusb_hcd.pkt_remaining_reload_fs = value;
873				hprt0.d32 = ifxusb_rreg(ifxusb_hcd.core_if.hprt0);
874				if(hprt0.b.prtspd != IFXUSB_HPRT0_PRTSPD_LOW_SPEED && hprt0.b.prtspd != IFXUSB_HPRT0_PRTSPD_HIGH_SPEED)
875					ifxusb_hcd.pkt_remaining_reload=value;
876			}
877		}
878		static void bandwidth_ls_store(uint32_t value)
879		{
880			if     (value>2 && value<30)
881			{
882				hprt0_data_t hprt0;
883				ifxusb_hcd.pkt_remaining_reload_hs = value;
884				hprt0.d32 = ifxusb_rreg(ifxusb_hcd.core_if.hprt0);
885				if(hprt0.b.prtspd == IFXUSB_HPRT0_PRTSPD_LOW_SPEED)
886					ifxusb_hcd.pkt_remaining_reload=value;
887			}
888		}
889		static ssize_t procfs_bandwidth_hs_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
890		{
891			return bandwidth_hs_show(buf);
892		}
893		static ssize_t procfs_bandwidth_fs_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
894		{
895			return bandwidth_fs_show(buf);
896		}
897		static ssize_t procfs_bandwidth_ls_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
898		{
899			return bandwidth_ls_show(buf);
900		}
901		static ssize_t procfs_bandwidth_hs_store(struct file *file, const char *buffer, unsigned long count, void *data)
902		{
903			char buf[10];
904			int i = 0;
905			uint32_t value;
906			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
907				return -EFAULT;
908			value = simple_strtoul(buf, NULL, 10);
909			bandwidth_hs_store(value);
910			return count;
911		}
912		static ssize_t procfs_bandwidth_fs_store(struct file *file, const char *buffer, unsigned long count, void *data)
913		{
914			char buf[10];
915			int i = 0;
916			uint32_t value;
917			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
918				return -EFAULT;
919			value = simple_strtoul(buf, NULL, 10);
920			bandwidth_fs_store(value);
921			return count;
922		}
923		static ssize_t procfs_bandwidth_ls_store(struct file *file, const char *buffer, unsigned long count, void *data)
924		{
925			char buf[10];
926			int i = 0;
927			uint32_t value;
928			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
929				return -EFAULT;
930			value = simple_strtoul(buf, NULL, 10);
931			bandwidth_ls_store(value);
932			return count;
933		}
934
935		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
936			static ssize_t sysfs_bandwidth_hs_show( struct device *_dev, struct device_attribute *attr,char *buf)
937		#else
938			static ssize_t sysfs_bandwidth_hs_show( struct device *_dev,char *buf)
939		#endif
940		{
941			return bandwidth_hs_show(buf);
942		}
943		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
944			static ssize_t sysfs_bandwidth_hs_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
945		#else
946		        static ssize_t sysfs_bandwidth_hs_store( struct device *_dev,                               const char *buffer, size_t count )
947		#endif
948		{
949			char buf[10];
950			int i = 0;
951			uint32_t value;
952			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
953				return -EFAULT;
954			value = simple_strtoul(buf, NULL, 10);
955			bandwidth_hs_store(value);
956			return count;
957		}
958		DEVICE_ATTR(bandwidth_hs, S_IRUGO|S_IWUSR, sysfs_bandwidth_hs_show, sysfs_bandwidth_hs_store);
959
960		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
961			static ssize_t sysfs_bandwidth_fs_show( struct device *_dev, struct device_attribute *attr,char *buf)
962		#else
963			static ssize_t sysfs_bandwidth_fs_show( struct device *_dev,char *buf)
964		#endif
965		{
966			return bandwidth_fs_show(buf);
967		}
968		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
969			static ssize_t sysfs_bandwidth_fs_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
970		#else
971		        static ssize_t sysfs_bandwidth_fs_store( struct device *_dev,                               const char *buffer, size_t count )
972		#endif
973		{
974			char buf[10];
975			int i = 0;
976			uint32_t value;
977			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
978				return -EFAULT;
979			value = simple_strtoul(buf, NULL, 10);
980			bandwidth_fs_store(value);
981			return count;
982		}
983		DEVICE_ATTR(bandwidth_fs, S_IRUGO|S_IWUSR, sysfs_bandwidth_fs_show, sysfs_bandwidth_fs_store);
984
985		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
986			static ssize_t sysfs_bandwidth_ls_show( struct device *_dev, struct device_attribute *attr,char *buf)
987		#else
988			static ssize_t sysfs_bandwidth_ls_show( struct device *_dev,char *buf)
989		#endif
990		{
991			return bandwidth_ls_show(buf);
992		}
993		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
994			static ssize_t sysfs_bandwidth_ls_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
995		#else
996		        static ssize_t sysfs_bandwidth_ls_store( struct device *_dev,                               const char *buffer, size_t count )
997		#endif
998		{
999			char buf[10];
1000			int i = 0;
1001			uint32_t value;
1002			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1003				return -EFAULT;
1004			value = simple_strtoul(buf, NULL, 10);
1005			bandwidth_ls_store(value);
1006			return count;
1007		}
1008		DEVICE_ATTR(bandwidth_ls, S_IRUGO|S_IWUSR, sysfs_bandwidth_ls_show, sysfs_bandwidth_ls_store);
1009	#endif
1010
1011/////////////////////////////////////////////////////////////////////////////////////////////////////
1012/////////////////////////////////////////////////////////////////////////////////////////////////////
1013	#ifdef __IS_DUAL__
1014		static ssize_t pkt_count_limit_bi_show_1(char *buf)
1015		{
1016			return sprintf( buf, "%d\n",ifxusb_hcd_1.pkt_count_limit_bi );
1017		}
1018		static ssize_t pkt_count_limit_bo_show_1(char *buf)
1019		{
1020			return sprintf( buf, "%d\n",ifxusb_hcd_1.pkt_count_limit_bo );
1021		}
1022		static void pkt_count_limit_bi_store_1(uint32_t value)
1023		{
1024			if(value<=13)
1025				ifxusb_hcd_1.pkt_count_limit_bi = value;
1026		}
1027		static void pkt_count_limit_bo_store_1(uint32_t value)
1028		{
1029			if     (value<=13)
1030				ifxusb_hcd_1.pkt_count_limit_bo = value;
1031		}
1032		static ssize_t pkt_count_limit_bi_show_2(char *buf)
1033		{
1034			return sprintf( buf, "%d\n",ifxusb_hcd_2.pkt_count_limit_bi );
1035		}
1036		static ssize_t pkt_count_limit_bo_show_2(char *buf)
1037		{
1038			return sprintf( buf, "%d\n",ifxusb_hcd_2.pkt_count_limit_bo );
1039		}
1040		static void pkt_count_limit_bi_store_2(uint32_t value)
1041		{
1042			if(value<=13)
1043				ifxusb_hcd_2.pkt_count_limit_bi = value;
1044		}
1045		static void pkt_count_limit_bo_store_2(uint32_t value)
1046		{
1047			if(value<=13)
1048				ifxusb_hcd_2.pkt_count_limit_bo = value;
1049		}
1050		static ssize_t procfs_pkt_count_limit_bi_show_1(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1051		{
1052			return pkt_count_limit_bi_show_1(buf);
1053		}
1054		static ssize_t procfs_pkt_count_limit_bo_show_1(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1055		{
1056			return pkt_count_limit_bo_show_1(buf);
1057		}
1058		static ssize_t procfs_pkt_count_limit_bi_store_1(struct file *file, const char *buffer, unsigned long count, void *data)
1059		{
1060			char buf[10];
1061			int i = 0;
1062			uint32_t value;
1063			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1064				return -EFAULT;
1065			value = simple_strtoul(buf, NULL, 10);
1066			pkt_count_limit_bi_store_1(value);
1067			return count;
1068		}
1069		static ssize_t procfs_pkt_count_limit_bo_store_1(struct file *file, const char *buffer, unsigned long count, void *data)
1070		{
1071			char buf[10];
1072			int i = 0;
1073			uint32_t value;
1074			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1075				return -EFAULT;
1076			value = simple_strtoul(buf, NULL, 10);
1077			pkt_count_limit_bo_store_1(value);
1078			return count;
1079		}
1080		static ssize_t procfs_pkt_count_limit_bi_show_2(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1081		{
1082			return pkt_count_limit_bi_show_2(buf);
1083		}
1084		static ssize_t procfs_pkt_count_limit_bo_show_2(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1085		{
1086			return pkt_count_limit_bo_show_2(buf);
1087		}
1088		static ssize_t procfs_pkt_count_limit_bi_store_2(struct file *file, const char *buffer, unsigned long count, void *data)
1089		{
1090			char buf[10];
1091			int i = 0;
1092			uint32_t value;
1093			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1094				return -EFAULT;
1095			value = simple_strtoul(buf, NULL, 10);
1096			pkt_count_limit_bi_store_2(value);
1097			return count;
1098		}
1099		static ssize_t procfs_pkt_count_limit_bo_store_2(struct file *file, const char *buffer, unsigned long count, void *data)
1100		{
1101			char buf[10];
1102			int i = 0;
1103			uint32_t value;
1104			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1105				return -EFAULT;
1106			value = simple_strtoul(buf, NULL, 10);
1107			pkt_count_limit_bo_store_2(value);
1108			return count;
1109		}
1110
1111		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1112			static ssize_t sysfs_pkt_count_limit_bi_show_1( struct device *_dev, struct device_attribute *attr,char *buf)
1113		#else
1114			static ssize_t sysfs_pkt_count_limit_bi_show_1( struct device *_dev,char *buf)
1115		#endif
1116		{
1117			return pkt_count_limit_bi_show_1(buf);
1118		}
1119		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1120			static ssize_t sysfs_pkt_count_limit_bi_store_1( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
1121		#else
1122		        static ssize_t sysfs_pkt_count_limit_bi_store_1( struct device *_dev,                               const char *buffer, size_t count )
1123		#endif
1124		{
1125			char buf[10];
1126			int i = 0;
1127			uint32_t value;
1128			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1129				return -EFAULT;
1130			value = simple_strtoul(buf, NULL, 10);
1131			pkt_count_limit_bi_store_1(value);
1132			return count;
1133		}
1134		DEVICE_ATTR(pkt_count_limit_bi_1, S_IRUGO|S_IWUSR, sysfs_pkt_count_limit_bi_show_1, sysfs_pkt_count_limit_bi_store_1);
1135
1136		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1137			static ssize_t sysfs_pkt_count_limit_bo_show_1( struct device *_dev, struct device_attribute *attr,char *buf)
1138		#else
1139			static ssize_t sysfs_pkt_count_limit_bo_show_1( struct device *_dev,char *buf)
1140		#endif
1141		{
1142			return pkt_count_limit_bo_show_1(buf);
1143		}
1144		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1145			static ssize_t sysfs_pkt_count_limit_bo_store_1( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
1146		#else
1147		        static ssize_t sysfs_pkt_count_limit_bo_store_1( struct device *_dev,                               const char *buffer, size_t count )
1148		#endif
1149		{
1150			char buf[10];
1151			int i = 0;
1152			uint32_t value;
1153			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1154				return -EFAULT;
1155			value = simple_strtoul(buf, NULL, 10);
1156			pkt_count_limit_bo_store_1(value);
1157			return count;
1158		}
1159		DEVICE_ATTR(pkt_count_limit_bo_1, S_IRUGO|S_IWUSR, sysfs_pkt_count_limit_bo_show_1, sysfs_pkt_count_limit_bo_store_1);
1160
1161		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1162			static ssize_t sysfs_pkt_count_limit_bi_show_2( struct device *_dev, struct device_attribute *attr,char *buf)
1163		#else
1164			static ssize_t sysfs_pkt_count_limit_bi_show_2( struct device *_dev,char *buf)
1165		#endif
1166		{
1167			return pkt_count_limit_bi_show_2(buf);
1168		}
1169		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1170			static ssize_t sysfs_pkt_count_limit_bi_store_2( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
1171		#else
1172		        static ssize_t sysfs_pkt_count_limit_bi_2( struct device *_dev,                               const char *buffer, size_t count )
1173		#endif
1174		{
1175			char buf[10];
1176			int i = 0;
1177			uint32_t value;
1178			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1179				return -EFAULT;
1180			value = simple_strtoul(buf, NULL, 10);
1181			pkt_count_limit_bi_store_2(value);
1182			return count;
1183		}
1184		DEVICE_ATTR(pkt_count_limit_bi_2, S_IRUGO|S_IWUSR, sysfs_pkt_count_limit_bi_show_2, sysfs_pkt_count_limit_bi_store_2);
1185
1186		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1187			static ssize_t sysfs_pkt_count_limit_bo_show_2( struct device *_dev, struct device_attribute *attr,char *buf)
1188		#else
1189			static ssize_t sysfs_pkt_count_limit_bo_show_2( struct device *_dev,char *buf)
1190		#endif
1191		{
1192			return pkt_count_limit_bo_show_2(buf);
1193		}
1194		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1195			static ssize_t sysfs_pkt_count_limit_bo_store_2( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
1196		#else
1197		        static ssize_t sysfs_pkt_count_limit_bo_store_2( struct device *_dev,                               const char *buffer, size_t count )
1198		#endif
1199		{
1200			char buf[10];
1201			int i = 0;
1202			uint32_t value;
1203			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1204				return -EFAULT;
1205			value = simple_strtoul(buf, NULL, 10);
1206			pkt_count_limit_bo_store_2(value);
1207			return count;
1208		}
1209		DEVICE_ATTR(pkt_count_limit_bo_2, S_IRUGO|S_IWUSR, sysfs_pkt_count_limit_bo_show_2, sysfs_pkt_count_limit_bo_store_2);
1210	#else
1211		static ssize_t pkt_count_limit_bi_show(char *buf)
1212		{
1213			return sprintf( buf, "%d\n",ifxusb_hcd.pkt_count_limit_bi );
1214		}
1215		static ssize_t pkt_count_limit_bo_show(char *buf)
1216		{
1217			return sprintf( buf, "%d\n",ifxusb_hcd.pkt_count_limit_bo );
1218		}
1219		static void pkt_count_limit_bi_store(uint32_t value)
1220		{
1221			if     (value<=13)
1222				ifxusb_hcd.pkt_count_limit_bi = value;
1223		}
1224		static void pkt_count_limit_bo_store(uint32_t value)
1225		{
1226			if     (value<=13)
1227				ifxusb_hcd.pkt_count_limit_bo = value;
1228		}
1229		static ssize_t procfs_pkt_count_limit_bi_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1230		{
1231			return pkt_count_limit_bi_show(buf);
1232		}
1233		static ssize_t procfs_pkt_count_limit_bo_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1234		{
1235			return pkt_count_limit_bo_show(buf);
1236		}
1237		static ssize_t procfs_pkt_count_limit_bi_store(struct file *file, const char *buffer, unsigned long count, void *data)
1238		{
1239			char buf[10];
1240			int i = 0;
1241			uint32_t value;
1242			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1243				return -EFAULT;
1244			value = simple_strtoul(buf, NULL, 10);
1245			pkt_count_limit_bi_store(value);
1246			return count;
1247		}
1248		static ssize_t procfs_pkt_count_limit_bo_store(struct file *file, const char *buffer, unsigned long count, void *data)
1249		{
1250			char buf[10];
1251			int i = 0;
1252			uint32_t value;
1253			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1254				return -EFAULT;
1255			value = simple_strtoul(buf, NULL, 10);
1256			pkt_count_limit_bo_store(value);
1257			return count;
1258		}
1259
1260		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1261			static ssize_t sysfs_pkt_count_limit_bi_show( struct device *_dev, struct device_attribute *attr,char *buf)
1262		#else
1263			static ssize_t sysfs_pkt_count_limit_bi_show( struct device *_dev,char *buf)
1264		#endif
1265		{
1266			return pkt_count_limit_bi_show(buf);
1267		}
1268		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1269			static ssize_t sysfs_pkt_count_limit_bi_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
1270		#else
1271		        static ssize_t sysfs_pkt_count_limit_bi_store( struct device *_dev,                               const char *buffer, size_t count )
1272		#endif
1273		{
1274			char buf[10];
1275			int i = 0;
1276			uint32_t value;
1277			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1278				return -EFAULT;
1279			value = simple_strtoul(buf, NULL, 10);
1280			pkt_count_limit_bi_store(value);
1281			return count;
1282		}
1283		DEVICE_ATTR(pkt_count_limit_bi, S_IRUGO|S_IWUSR, sysfs_pkt_count_limit_bi_show, sysfs_pkt_count_limit_bi_store);
1284
1285		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1286			static ssize_t sysfs_pkt_count_limit_bo_show( struct device *_dev, struct device_attribute *attr,char *buf)
1287		#else
1288			static ssize_t sysfs_pkt_count_limit_bo_show( struct device *_dev,char *buf)
1289		#endif
1290		{
1291			return pkt_count_limit_bo_show(buf);
1292		}
1293		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1294			static ssize_t sysfs_pkt_count_limit_bo_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
1295		#else
1296		        static ssize_t sysfs_pkt_count_limit_bo_store( struct device *_dev,                               const char *buffer, size_t count )
1297		#endif
1298		{
1299			char buf[10];
1300			int i = 0;
1301			uint32_t value;
1302			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1303				return -EFAULT;
1304			value = simple_strtoul(buf, NULL, 10);
1305			pkt_count_limit_bo_store(value);
1306			return count;
1307		}
1308		DEVICE_ATTR(pkt_count_limit_bo, S_IRUGO|S_IWUSR, sysfs_pkt_count_limit_bo_show, sysfs_pkt_count_limit_bo_store);
1309	#endif
1310
1311/////////////////////////////////////////////////////////////////////////////////////////////////////
1312/////////////////////////////////////////////////////////////////////////////////////////////////////
1313/////////////////////////////////////////////////////////////////////////////////////////////////////
1314
1315	#ifdef __IS_DUAL__
1316		static ssize_t buspower_show_1(char *buf)
1317		{
1318			if(ifxusb_vbus (&ifxusb_hcd_1.core_if)==1) return sprintf( buf, "1\n" );
1319			if(ifxusb_vbus (&ifxusb_hcd_1.core_if)==0) return sprintf( buf, "0\n" );
1320			return sprintf( buf, "UNKNOWN\n" );
1321		}
1322		static void buspower_store_1(uint32_t value)
1323		{
1324			if     (value==1)  ifxusb_vbus_on (&ifxusb_hcd_1.core_if);
1325			else if(value==0)  ifxusb_vbus_off(&ifxusb_hcd_1.core_if);
1326		}
1327		static ssize_t buspower_show_2(char *buf)
1328		{
1329			if(ifxusb_vbus (&ifxusb_hcd_2.core_if)==1) return sprintf( buf, "1\n" );
1330			if(ifxusb_vbus (&ifxusb_hcd_2.core_if)==0) return sprintf( buf, "0\n" );
1331			return sprintf( buf, "UNKNOWN\n" );
1332		}
1333		static void buspower_store_2(uint32_t value)
1334		{
1335			if     (value==1)  ifxusb_vbus_on (&ifxusb_hcd_2.core_if);
1336			else if(value==0)  ifxusb_vbus_off(&ifxusb_hcd_2.core_if);
1337		}
1338		static ssize_t procfs_buspower_show_1(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1339		{
1340			return buspower_show_1(buf);
1341		}
1342		static ssize_t procfs_buspower_store_1(struct file *file, const char *buffer, unsigned long count, void *data)
1343		{
1344			char buf[10];
1345			int i = 0;
1346			uint32_t value;
1347			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1348				return -EFAULT;
1349			value = simple_strtoul(buf, NULL, 10);
1350			buspower_store_1(value);
1351			return count;
1352		}
1353		static ssize_t procfs_buspower_show_2(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1354		{
1355			return buspower_show_2(buf);
1356		}
1357		static ssize_t procfs_buspower_store_2(struct file *file, const char *buffer, unsigned long count, void *data)
1358		{
1359			char buf[10];
1360			int i = 0;
1361			uint32_t value;
1362			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1363				return -EFAULT;
1364			value = simple_strtoul(buf, NULL, 10);
1365			buspower_store_2(value);
1366			return count;
1367		}
1368
1369		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1370			static ssize_t sysfs_buspower_show_1( struct device *_dev, struct device_attribute *attr,char *buf)
1371		#else
1372			static ssize_t sysfs_buspower_show_1( struct device *_dev,char *buf)
1373		#endif
1374		{
1375			return buspower_show_1(buf);
1376		}
1377		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1378			static ssize_t sysfs_buspower_store_1( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
1379		#else
1380		    static ssize_t sysfs_buspower_store_1( struct device *_dev,                               const char *buffer, size_t count )
1381		#endif
1382		{
1383			char buf[10];
1384			int i = 0;
1385			uint32_t value;
1386			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1387				return -EFAULT;
1388			value = simple_strtoul(buf, NULL, 10);
1389			buspower_store_1(value);
1390			return count;
1391		}
1392		DEVICE_ATTR(buspower_1, S_IRUGO|S_IWUSR, sysfs_buspower_show_1, sysfs_buspower_store_1);
1393
1394		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1395			static ssize_t sysfs_buspower_show_2( struct device *_dev, struct device_attribute *attr,char *buf)
1396		#else
1397			static ssize_t sysfs_buspower_show_2( struct device *_dev,char *buf)
1398		#endif
1399		{
1400			return buspower_show_2(buf);
1401		}
1402		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1403			static ssize_t sysfs_buspower_store_2( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
1404		#else
1405		    static ssize_t sysfs_buspower_store_2( struct device *_dev,                               const char *buffer, size_t count )
1406		#endif
1407		{
1408			char buf[10];
1409			int i = 0;
1410			uint32_t value;
1411			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1412				return -EFAULT;
1413			value = simple_strtoul(buf, NULL, 10);
1414			buspower_store_2(value);
1415			return count;
1416		}
1417		DEVICE_ATTR(buspower_2, S_IRUGO|S_IWUSR, sysfs_buspower_show_2, sysfs_buspower_store_2);
1418	#else
1419		static ssize_t buspower_show(char *buf)
1420		{
1421			if(ifxusb_vbus (&ifxusb_hcd.core_if)==1) return sprintf( buf, "1\n" );
1422			if(ifxusb_vbus (&ifxusb_hcd.core_if)==0) return sprintf( buf, "0\n" );
1423			return sprintf( buf, "UNKNOWN\n" );
1424		}
1425		static void buspower_store(uint32_t value)
1426		{
1427			if     (value==1)  ifxusb_vbus_on (&ifxusb_hcd.core_if);
1428			else if(value==0)  ifxusb_vbus_off(&ifxusb_hcd.core_if);
1429		}
1430		static ssize_t procfs_buspower_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1431		{
1432			return buspower_show(buf);
1433		}
1434		static ssize_t procfs_buspower_store(struct file *file, const char *buffer, unsigned long count, void *data)
1435		{
1436			char buf[10];
1437			int i = 0;
1438			uint32_t value;
1439			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1440				return -EFAULT;
1441			value = simple_strtoul(buf, NULL, 10);
1442			buspower_store(value);
1443			return count;
1444		}
1445		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1446			static ssize_t sysfs_buspower_show( struct device *_dev, struct device_attribute *attr,char *buf)
1447		#else
1448			static ssize_t sysfs_buspower_show( struct device *_dev,                               char *buf)
1449		#endif
1450		{
1451			return buspower_show(buf);
1452		}
1453		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1454			static ssize_t sysfs_buspower_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
1455		#else
1456		    static ssize_t sysfs_buspower_store( struct device *_dev,                               const char *buffer, size_t count )
1457		#endif
1458		{
1459			char buf[10];
1460			int i = 0;
1461			uint32_t value;
1462			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
1463				return -EFAULT;
1464			value = simple_strtoul(buf, NULL, 10);
1465			buspower_store(value);
1466			return count;
1467		}
1468		DEVICE_ATTR(buspower, S_IRUGO|S_IWUSR, sysfs_buspower_show, sysfs_buspower_store);
1469	#endif
1470
1471/////////////////////////////////////////////////////////////////////////////////////////////////////
1472/////////////////////////////////////////////////////////////////////////////////////////////////////
1473/////////////////////////////////////////////////////////////////////////////////////////////////////
1474
1475
1476	#ifdef __IS_DUAL__
1477		static ssize_t bussuspend_show_1(char *buf)
1478		{
1479			hprt0_data_t val;
1480			val.d32 = ifxusb_rreg(ifxusb_hcd_1.core_if.hprt0);
1481			return sprintf (buf, "Bus Suspend = 0x%x\n", val.b.prtsusp);
1482		}
1483		static ssize_t bussuspend_show_2(char *buf)
1484		{
1485			hprt0_data_t val;
1486			val.d32 = ifxusb_rreg(ifxusb_hcd_2.core_if.hprt0);
1487			return sprintf (buf, "Bus Suspend = 0x%x\n", val.b.prtsusp);
1488		}
1489
1490		static ssize_t procfs_bussuspend_show_1(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1491		{
1492			return bussuspend_show_1(buf);
1493		}
1494		static ssize_t procfs_bussuspend_show_2(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1495		{
1496			return bussuspend_show_2(buf);
1497		}
1498		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1499			static ssize_t sysfs_bussuspend_show_1( struct device *_dev, struct device_attribute *attr,char *buf)
1500		#else
1501			static ssize_t sysfs_bussuspend_show_1( struct device *_dev,char *buf)
1502		#endif
1503		{
1504			return bussuspend_show_1(buf);
1505		}
1506		DEVICE_ATTR(bussuspend_1, S_IRUGO|S_IWUSR, sysfs_bussuspend_show_1, 0);
1507		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1508			static ssize_t sysfs_bussuspend_show_2( struct device *_dev, struct device_attribute *attr,char *buf)
1509		#else
1510			static ssize_t sysfs_bussuspend_show_2( struct device *_dev,char *buf)
1511		#endif
1512		{
1513			return bussuspend_show_2(buf);
1514		}
1515		DEVICE_ATTR(bussuspend_2, S_IRUGO|S_IWUSR, sysfs_bussuspend_show_2, 0);
1516	#else
1517		static ssize_t bussuspend_show(char *buf)
1518		{
1519			hprt0_data_t val;
1520			val.d32 = ifxusb_rreg(ifxusb_hcd.core_if.hprt0);
1521			return sprintf (buf, "Bus Suspend = 0x%x\n", val.b.prtsusp);
1522		}
1523		static ssize_t procfs_bussuspend_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1524		{
1525			return bussuspend_show(buf);
1526		}
1527
1528		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1529			static ssize_t sysfs_bussuspend_show( struct device *_dev, struct device_attribute *attr,char *buf)
1530		#else
1531			static ssize_t sysfs_bussuspend_show( struct device *_dev,                               char *buf)
1532		#endif
1533		{
1534			return bussuspend_show(buf);
1535		}
1536		DEVICE_ATTR(bussuspend, S_IRUGO|S_IWUSR, sysfs_bussuspend_show, 0);
1537	#endif
1538
1539/////////////////////////////////////////////////////////////////////////////////////////////////////
1540/////////////////////////////////////////////////////////////////////////////////////////////////////
1541/////////////////////////////////////////////////////////////////////////////////////////////////////
1542
1543	#ifdef __IS_DUAL__
1544		static ssize_t busconnected_show_1(char *buf)
1545		{
1546			hprt0_data_t val;
1547			val.d32 = ifxusb_rreg(ifxusb_hcd_1.core_if.hprt0);
1548			return sprintf (buf, "Bus Connected = 0x%x\n", val.b.prtconnsts);
1549		}
1550		static ssize_t busconnected_show_2(char *buf)
1551		{
1552			hprt0_data_t val;
1553			val.d32 = ifxusb_rreg(ifxusb_hcd_2.core_if.hprt0);
1554			return sprintf (buf, "Bus Connected = 0x%x\n", val.b.prtconnsts);
1555		}
1556
1557		static ssize_t procfs_busconnected_show_1(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1558		{
1559			return busconnected_show_1(buf);
1560		}
1561		static ssize_t procfs_busconnected_show_2(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1562		{
1563			return busconnected_show_2(buf);
1564		}
1565		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1566			static ssize_t sysfs_busconnected_show_1( struct device *_dev, struct device_attribute *attr,char *buf)
1567		#else
1568			static ssize_t sysfs_busconnected_show_1( struct device *_dev,char *buf)
1569		#endif
1570		{
1571			return busconnected_show_1(buf);
1572		}
1573		DEVICE_ATTR(busconnected_1, S_IRUGO|S_IWUSR, sysfs_busconnected_show_1, 0);
1574		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1575			static ssize_t sysfs_busconnected_show_2( struct device *_dev, struct device_attribute *attr,char *buf)
1576		#else
1577			static ssize_t sysfs_busconnected_show_2( struct device *_dev,char *buf)
1578		#endif
1579		{
1580			return busconnected_show_2(buf);
1581		}
1582		DEVICE_ATTR(busconnected_2, S_IRUGO|S_IWUSR, sysfs_busconnected_show_2, 0);
1583	#else
1584		static ssize_t busconnected_show(char *buf)
1585		{
1586			hprt0_data_t val;
1587			val.d32 = ifxusb_rreg(ifxusb_hcd.core_if.hprt0);
1588			return sprintf (buf, "Bus Connected = 0x%x\n", val.b.prtconnsts);
1589		}
1590		static ssize_t procfs_busconnected_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1591		{
1592			return busconnected_show(buf);
1593		}
1594
1595		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1596			static ssize_t sysfs_busconnected_show( struct device *_dev, struct device_attribute *attr,char *buf)
1597		#else
1598			static ssize_t sysfs_busconnected_show( struct device *_dev,                               char *buf)
1599		#endif
1600		{
1601			return busconnected_show(buf);
1602		}
1603		DEVICE_ATTR(busconnected, S_IRUGO|S_IWUSR, sysfs_busconnected_show, 0);
1604	#endif
1605
1606/////////////////////////////////////////////////////////////////////////////////////////////////////
1607/////////////////////////////////////////////////////////////////////////////////////////////////////
1608/////////////////////////////////////////////////////////////////////////////////////////////////////
1609
1610	#ifdef __IS_DUAL__
1611		static ssize_t connectspeed_show_1(char *buf)
1612		{
1613			hprt0_data_t val;
1614			val.d32 = ifxusb_rreg(ifxusb_hcd_1.core_if.hprt0);
1615			if( val.b.prtspd ==0) return sprintf (buf, "Bus Speed = High (%d)\n", val.b.prtspd);
1616			if( val.b.prtspd ==1) return sprintf (buf, "Bus Speed = Full (%d)\n", val.b.prtspd);
1617			if( val.b.prtspd ==2) return sprintf (buf, "Bus Speed = Low  (%d)\n", val.b.prtspd);
1618			                      return sprintf (buf, "Bus Speed = Unknown (%d)\n", val.b.prtspd);
1619		}
1620		static ssize_t connectspeed_show_2(char *buf)
1621		{
1622			hprt0_data_t val;
1623			val.d32 = ifxusb_rreg(ifxusb_hcd_2.core_if.hprt0);
1624			if( val.b.prtspd ==0) return sprintf (buf, "Bus Speed = High (%d)\n", val.b.prtspd);
1625			if( val.b.prtspd ==1) return sprintf (buf, "Bus Speed = Full (%d)\n", val.b.prtspd);
1626			if( val.b.prtspd ==2) return sprintf (buf, "Bus Speed = Low  (%d)\n", val.b.prtspd);
1627			                      return sprintf (buf, "Bus Speed = Unknown (%d)\n", val.b.prtspd);
1628		}
1629
1630		static ssize_t procfs_connectspeed_show_1(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1631		{
1632			return connectspeed_show_1(buf);
1633		}
1634		static ssize_t procfs_connectspeed_show_2(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1635		{
1636			return connectspeed_show_2(buf);
1637		}
1638		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1639			static ssize_t sysfs_connectspeed_show_1( struct device *_dev, struct device_attribute *attr,char *buf)
1640		#else
1641			static ssize_t sysfs_connectspeed_show_1( struct device *_dev,char *buf)
1642		#endif
1643		{
1644			return connectspeed_show_1(buf);
1645		}
1646		DEVICE_ATTR(connectspeed_1, S_IRUGO|S_IWUSR, sysfs_connectspeed_show_1, 0);
1647		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1648			static ssize_t sysfs_connectspeed_show_2( struct device *_dev, struct device_attribute *attr,char *buf)
1649		#else
1650			static ssize_t sysfs_connectspeed_show_2( struct device *_dev,char *buf)
1651		#endif
1652		{
1653			return connectspeed_show_2(buf);
1654		}
1655		DEVICE_ATTR(connectspeed_2, S_IRUGO|S_IWUSR, sysfs_connectspeed_show_2, 0);
1656	#else
1657		static ssize_t connectspeed_show(char *buf)
1658		{
1659			hprt0_data_t val;
1660			val.d32 = ifxusb_rreg(ifxusb_hcd.core_if.hprt0);
1661			if( val.b.prtspd ==0) return sprintf (buf, "Bus Speed = High (%d)\n", val.b.prtspd);
1662			if( val.b.prtspd ==1) return sprintf (buf, "Bus Speed = Full (%d)\n", val.b.prtspd);
1663			if( val.b.prtspd ==2) return sprintf (buf, "Bus Speed = Low  (%d)\n", val.b.prtspd);
1664			                      return sprintf (buf, "Bus Speed = Unknown (%d)\n", val.b.prtspd);
1665		}
1666
1667		static ssize_t procfs_connectspeed_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1668		{
1669			return connectspeed_show(buf);
1670		}
1671
1672		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1673			static ssize_t sysfs_connectspeed_show( struct device *_dev, struct device_attribute *attr,char *buf)
1674		#else
1675			static ssize_t sysfs_connectspeed_show( struct device *_dev,                               char *buf)
1676		#endif
1677		{
1678			return connectspeed_show(buf);
1679		}
1680		DEVICE_ATTR(connectspeed, S_IRUGO|S_IWUSR, sysfs_connectspeed_show, 0);
1681	#endif
1682/////////////////////////////////////////////////////////////////////////////////////////////////////
1683/////////////////////////////////////////////////////////////////////////////////////////////////////
1684/////////////////////////////////////////////////////////////////////////////////////////////////////
1685#endif
1686
1687
1688#ifdef __IS_DEVICE__
1689/////////////////////////////////////////////////////////////////////////////////////////////////////
1690/////////////////////////////////////////////////////////////////////////////////////////////////////
1691/////////////////////////////////////////////////////////////////////////////////////////////////////
1692	static ssize_t devspeed_show(char *buf)
1693	{
1694		dcfg_data_t val;
1695		val.d32 = ifxusb_rreg(&ifxusb_pcd.core_if.dev_global_regs->dcfg);
1696		if( val.b.devspd ==0) return sprintf (buf, "Dev Speed = High (%d)\n", val.b.devspd);
1697		if( val.b.devspd ==1) return sprintf (buf, "Dev Speed = Full (%d)\n", val.b.devspd);
1698		if( val.b.devspd ==3) return sprintf (buf, "Dev Speed = Full (%d)\n", val.b.devspd);
1699		                      return sprintf (buf, "Dev Speed = Unknown (%d)\n", val.b.devspd);
1700	}
1701
1702	static ssize_t procfs_devspeed_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1703	{
1704		return devspeed_show(buf);
1705	}
1706
1707	#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1708		static ssize_t sysfs_devspeed_show( struct device *_dev, struct device_attribute *attr,char *buf)
1709	#else
1710		static ssize_t sysfs_devspeed_show( struct device *_dev,                               char *buf)
1711	#endif
1712	{
1713		return devspeed_show(buf);
1714	}
1715	DEVICE_ATTR(devspeed, S_IRUGO|S_IWUSR, sysfs_devspeed_show, 0);
1716
1717	static ssize_t enumspeed_show(char *buf)
1718	{
1719		dsts_data_t val;
1720		val.d32 = ifxusb_rreg(&ifxusb_pcd.core_if.dev_global_regs->dsts);
1721		if( val.b.enumspd ==0) return sprintf (buf, "Enum Speed = High (%d)\n", val.b.enumspd);
1722		if( val.b.enumspd ==1) return sprintf (buf, "Enum Speed = Full (%d)\n", val.b.enumspd);
1723		if( val.b.enumspd ==2) return sprintf (buf, "Enum Speed = Low  (%d)\n", val.b.enumspd);
1724		return sprintf (buf, "Enum Speed = invalid(%d)\n", val.b.enumspd);
1725	}
1726
1727	static ssize_t procfs_enumspeed_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1728	{
1729		return enumspeed_show(buf);
1730	}
1731
1732	#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1733		static ssize_t sysfs_enumspeed_show( struct device *_dev, struct device_attribute *attr,char *buf)
1734	#else
1735		static ssize_t sysfs_enumspeed_show( struct device *_dev,                               char *buf)
1736	#endif
1737	{
1738		return enumspeed_show(buf);
1739	}
1740	DEVICE_ATTR(enumspeed, S_IRUGO|S_IWUSR, sysfs_enumspeed_show, 0);
1741/////////////////////////////////////////////////////////////////////////////////////////////////////
1742/////////////////////////////////////////////////////////////////////////////////////////////////////
1743/////////////////////////////////////////////////////////////////////////////////////////////////////
1744#endif
1745
1746
1747//////////////////////////////////////////////////////////////////////////////////
1748#ifdef __ENABLE_DUMP__
1749
1750	#ifdef __IS_DUAL__
1751		static void dump_reg_1(void)
1752		{
1753			ifxusb_dump_registers_h(&ifxusb_hcd_1.core_if);
1754		}
1755		static void dump_reg_2(void)
1756		{
1757			ifxusb_dump_registers_h(&ifxusb_hcd_2.core_if);
1758		}
1759
1760		static ssize_t procfs_dump_reg_show_1(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1761		{
1762			dump_reg_1();
1763			return 0;
1764		}
1765		static ssize_t procfs_dump_reg_show_2(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1766		{
1767			dump_reg_2();
1768			return 0;
1769		}
1770		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1771			static ssize_t sysfs_dump_reg_show_1( struct device *_dev, struct device_attribute *attr,char *buf)
1772		#else
1773			static ssize_t sysfs_dump_reg_show_1( struct device *_dev,char *buf)
1774		#endif
1775		{
1776			dump_reg_1();
1777			return 0;
1778		}
1779		DEVICE_ATTR(dump_reg_h_1, S_IRUGO|S_IWUSR, sysfs_dump_reg_show_1, 0);
1780		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1781			static ssize_t sysfs_dump_reg_show_2( struct device *_dev, struct device_attribute *attr,char *buf)
1782		#else
1783			static ssize_t sysfs_dump_reg_show_2( struct device *_dev,char *buf)
1784		#endif
1785		{
1786			dump_reg_2();
1787			return 0;
1788		}
1789		DEVICE_ATTR(dump_reg_h_2, S_IRUGO|S_IWUSR, sysfs_dump_reg_show_2, 0);
1790	#else
1791		static void dump_reg(void)
1792		{
1793			#ifdef __IS_HOST__
1794				ifxusb_dump_registers_h(&ifxusb_hcd.core_if);
1795			#endif
1796			#ifdef __IS_DEVICE__
1797				ifxusb_dump_registers_d(&ifxusb_pcd.core_if);
1798			#endif
1799		}
1800		static ssize_t procfs_dump_reg_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1801		{
1802			dump_reg();
1803			return 0;
1804		}
1805		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1806			static ssize_t sysfs_dump_reg_show( struct device *_dev, struct device_attribute *attr,char *buf)
1807		#else
1808			static ssize_t sysfs_dump_reg_show( struct device *_dev,char *buf)
1809		#endif
1810		{
1811			dump_reg();
1812			return 0;
1813		}
1814		#ifdef __IS_HOST__
1815		DEVICE_ATTR(dump_reg_h, S_IRUGO|S_IWUSR, sysfs_dump_reg_show, 0);
1816		#else
1817		DEVICE_ATTR(dump_reg_d, S_IRUGO|S_IWUSR, sysfs_dump_reg_show, 0);
1818		#endif
1819	#endif
1820
1821
1822/////////////////////////////////////////////////////////////////////////////////////////////////////
1823/////////////////////////////////////////////////////////////////////////////////////////////////////
1824/////////////////////////////////////////////////////////////////////////////////////////////////////
1825
1826	#ifdef __IS_DUAL__
1827		static void dump_spram_1(void)
1828		{
1829			ifxusb_dump_spram_h(&ifxusb_hcd_1.core_if);
1830		}
1831		static void dump_spram_2(void)
1832		{
1833			ifxusb_dump_spram_h(&ifxusb_hcd_2.core_if);
1834		}
1835
1836		static ssize_t procfs_dump_spram_show_1(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1837		{
1838			dump_spram_1();
1839			return 0;
1840		}
1841		static ssize_t procfs_dump_spram_show_2(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1842		{
1843			dump_spram_2();
1844			return 0;
1845		}
1846		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1847			static ssize_t sysfs_dump_spram_show_1( struct device *_dev, struct device_attribute *attr,char *buf)
1848		#else
1849			static ssize_t sysfs_dump_spram_show_1( struct device *_dev,char *buf)
1850		#endif
1851		{
1852			dump_spram_1();
1853			return 0;
1854		}
1855		DEVICE_ATTR(dump_spram_h_1, S_IRUGO|S_IWUSR, sysfs_dump_spram_show_1, 0);
1856
1857		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1858			static ssize_t sysfs_dump_spram_show_2( struct device *_dev, struct device_attribute *attr,char *buf)
1859		#else
1860			static ssize_t sysfs_dump_spram_show_2( struct device *_dev,char *buf)
1861		#endif
1862		{
1863			dump_spram_2();
1864			return 0;
1865		}
1866		DEVICE_ATTR(dump_spram_h_2, S_IRUGO|S_IWUSR, sysfs_dump_spram_show_2, 0);
1867	#else
1868		static void dump_spram(void)
1869		{
1870			#ifdef __IS_HOST__
1871				ifxusb_dump_spram_h(&ifxusb_hcd.core_if);
1872			#endif
1873			#ifdef __IS_DEVICE__
1874				ifxusb_dump_spram_d(&ifxusb_pcd.core_if);
1875			#endif
1876		}
1877		static ssize_t procfs_dump_spram_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1878		{
1879			dump_spram();
1880			return 0;
1881		}
1882		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1883			static ssize_t sysfs_dump_spram_show( struct device *_dev, struct device_attribute *attr,char *buf)
1884		#else
1885			static ssize_t sysfs_dump_spram_show( struct device *_dev,char *buf)
1886		#endif
1887		{
1888			dump_spram();
1889			return 0;
1890		}
1891		#ifdef __IS_HOST__
1892		DEVICE_ATTR(dump_spram_h, S_IRUGO|S_IWUSR, sysfs_dump_spram_show, 0);
1893		#else
1894		DEVICE_ATTR(dump_spram_d, S_IRUGO|S_IWUSR, sysfs_dump_spram_show, 0);
1895		#endif
1896
1897	#endif
1898/////////////////////////////////////////////////////////////////////////////////////////////////////
1899/////////////////////////////////////////////////////////////////////////////////////////////////////
1900/////////////////////////////////////////////////////////////////////////////////////////////////////
1901
1902	#ifdef __IS_HOST__
1903		#ifdef __IS_DUAL__
1904			static ssize_t procfs_dump_host_state_show_1(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1905			{
1906				ifxhcd_dump_state(&ifxusb_hcd_1);
1907				return 0;
1908			}
1909			static ssize_t procfs_dump_host_state_show_2(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1910			{
1911				ifxhcd_dump_state(&ifxusb_hcd_2);
1912				return 0;
1913			}
1914			#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1915				static ssize_t sysfs_dump_host_state_show_1( struct device *_dev, struct device_attribute *attr,char *buf)
1916			#else
1917				static ssize_t sysfs_dump_host_state_show_1( struct device *_dev,char *buf)
1918			#endif
1919			{
1920				ifxhcd_dump_state(&ifxusb_hcd_1);
1921				return 0;
1922			}
1923			DEVICE_ATTR(dump_host_state_1, S_IRUGO|S_IWUSR, sysfs_dump_host_state_show_1, 0);
1924			#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1925				static ssize_t sysfs_dump_host_state_show_2( struct device *_dev, struct device_attribute *attr,char *buf)
1926			#else
1927				static ssize_t sysfs_dump_host_state_show_2( struct device *_dev,char *buf)
1928			#endif
1929			{
1930				ifxhcd_dump_state(&ifxusb_hcd_2);
1931				return 0;
1932			}
1933			DEVICE_ATTR(dump_host_state_2, S_IRUGO|S_IWUSR, sysfs_dump_host_state_show_2, 0);
1934		#else
1935			static ssize_t procfs_dump_host_state_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
1936			{
1937				ifxhcd_dump_state(&ifxusb_hcd);
1938				return 0;
1939			}
1940			#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1941				static ssize_t sysfs_dump_host_state_show( struct device *_dev, struct device_attribute *attr,char *buf)
1942			#else
1943				static ssize_t sysfs_dump_host_state_show( struct device *_dev,char *buf)
1944			#endif
1945			{
1946				ifxhcd_dump_state(&ifxusb_hcd);
1947				return 0;
1948			}
1949			DEVICE_ATTR(dump_host_state, S_IRUGO|S_IWUSR, sysfs_dump_host_state_show, 0);
1950		#endif
1951
1952/////////////////////////////////////////////////////////////////////////////////////////////////////
1953/////////////////////////////////////////////////////////////////////////////////////////////////////
1954/////////////////////////////////////////////////////////////////////////////////////////////////////
1955
1956	#endif //IS_HOST_
1957
1958#endif //__ENABLE_DUMP__
1959/////////////////////////////////////////////////////////////////////////////////////////////////////
1960/////////////////////////////////////////////////////////////////////////////////////////////////////
1961#ifdef __IS_HOST__
1962	static void host_probe(unsigned long _ptr)
1963	{
1964		ifxhcd_hcd_t *ifxhcd = (ifxhcd_hcd_t *)_ptr;
1965
1966		if(ifxhcd->flags.b.port_connect_status)
1967		{
1968			del_timer(&ifxhcd->host_probe_timer);
1969			del_timer(&ifxhcd->autoprobe_timer);
1970			ifxhcd->power_status = 0;
1971		}
1972		else
1973		{
1974			del_timer(&ifxhcd->autoprobe_timer);
1975			ifxhcd->autoprobe_timer.expires = jiffies + (HZ*ifxhcd->autoprobe_sec);
1976			add_timer(&ifxhcd->autoprobe_timer);
1977			ifxhcd->power_status = 2;
1978			del_timer(&ifxhcd->host_probe_timer);
1979			do_suspend_h(&ifxhcd->core_if);
1980		}
1981	}
1982
1983	static void host_autoprobe(unsigned long _ptr)
1984	{
1985		ifxhcd_hcd_t *ifxhcd = (ifxhcd_hcd_t *)_ptr;
1986		del_timer(&ifxhcd->host_probe_timer);
1987		ifxhcd->host_probe_timer.function = host_probe;
1988		ifxhcd->host_probe_timer.expires = jiffies + (HZ*ifxhcd->probe_sec);
1989		ifxhcd->host_probe_timer.data = (unsigned long)ifxhcd;
1990		add_timer(&ifxhcd->host_probe_timer);
1991		do_resume_h(&ifxhcd->core_if);
1992	}
1993
1994	static void suspend_host_store(ifxhcd_hcd_t *ifxhcd , uint32_t value)
1995	{
1996		if(value==2)
1997		{
1998			del_timer(&ifxhcd->autoprobe_timer);
1999			ifxhcd->autoprobe_timer.function = host_autoprobe;
2000			ifxhcd->autoprobe_timer.expires = jiffies + (HZ*ifxhcd->autoprobe_sec);
2001			ifxhcd->autoprobe_timer.data = (unsigned long)ifxhcd;
2002			add_timer(&ifxhcd->autoprobe_timer);
2003			ifxhcd->power_status = 2;
2004		}
2005		else if(value==1)
2006		{
2007			do_suspend_h(&ifxhcd->core_if);
2008			ifxhcd->power_status = 1;
2009			del_timer(&ifxhcd->host_probe_timer);
2010			del_timer(&ifxhcd->autoprobe_timer);
2011		}
2012		else if(value==0)
2013		{
2014			do_resume_h(&ifxhcd->core_if);
2015			ifxhcd->power_status = 0;
2016			del_timer(&ifxhcd->host_probe_timer);
2017			del_timer(&ifxhcd->autoprobe_timer);
2018		}
2019	}
2020	#ifdef __IS_DUAL__
2021		static ssize_t procfs_suspend_host_2_store(struct file *file, const char *buffer, unsigned long count, void *data)
2022		{
2023			char buf[10];
2024			int i = 0;
2025			uint32_t value;
2026			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2027				return -EFAULT;
2028			value = simple_strtoul(buf, NULL, 10);
2029			suspend_host_store(&ifxusb_hcd_2,value);
2030			return count;
2031		}
2032
2033		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2034			static ssize_t sysfs_suspend_host_2_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2035		#else
2036			static ssize_t sysfs_suspend_host_2_store( struct device *_dev,                               const char *buffer, size_t count )
2037		#endif
2038		{
2039			char buf[10];
2040			int i = 0;
2041			uint32_t value;
2042			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2043				return -EFAULT;
2044			value = simple_strtoul(buf, NULL, 10);
2045			suspend_host_store(&ifxusb_hcd_2,value);
2046			return count;
2047		}
2048
2049		static ssize_t procfs_suspend_host_1_store(struct file *file, const char *buffer, unsigned long count, void *data)
2050		{
2051			char buf[10];
2052			int i = 0;
2053			uint32_t value;
2054			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2055				return -EFAULT;
2056			value = simple_strtoul(buf, NULL, 10);
2057			suspend_host_store(&ifxusb_hcd_1,value);
2058			return count;
2059		}
2060
2061		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2062			static ssize_t sysfs_suspend_host_1_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2063		#else
2064			static ssize_t sysfs_suspend_host_1_store( struct device *_dev,                               const char *buffer, size_t count )
2065		#endif
2066		{
2067			char buf[10];
2068			int i = 0;
2069			uint32_t value;
2070			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2071				return -EFAULT;
2072			value = simple_strtoul(buf, NULL, 10);
2073			suspend_host_store(&ifxusb_hcd_1,value);
2074			return count;
2075		}
2076		DEVICE_ATTR(suspend_host_2, S_IWUSR,NULL, sysfs_suspend_host_2_store);
2077		DEVICE_ATTR(suspend_host_1, S_IWUSR,NULL, sysfs_suspend_host_1_store);
2078/////////////////////////////////////////////////////////////////////////////////////////////////////
2079	#else
2080		static ssize_t procfs_suspend_host_store(struct file *file, const char *buffer, unsigned long count, void *data)
2081		{
2082			char buf[10];
2083			int i = 0;
2084			uint32_t value;
2085			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2086				return -EFAULT;
2087			value = simple_strtoul(buf, NULL, 10);
2088			suspend_host_store(&ifxusb_hcd,value);
2089			return count;
2090		}
2091
2092		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2093			static ssize_t sysfs_suspend_host_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2094		#else
2095			static ssize_t sysfs_suspend_host_store( struct device *_dev,                               const char *buffer, size_t count )
2096		#endif
2097		{
2098			char buf[10];
2099			int i = 0;
2100			uint32_t value;
2101			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2102				return -EFAULT;
2103			value = simple_strtoul(buf, NULL, 10);
2104			suspend_host_store(&ifxusb_hcd,value);
2105			return count;
2106		}
2107		DEVICE_ATTR(suspend_host, S_IWUSR,NULL, sysfs_suspend_host_store);
2108	#endif
2109#endif
2110
2111/////////////////////////////////////////////////////////////////////////////////////////////////////
2112/////////////////////////////////////////////////////////////////////////////////////////////////////
2113#ifdef __IS_HOST__
2114	static void probe_host_store(ifxhcd_hcd_t *ifxhcd, uint32_t value)
2115	{
2116		if(ifxhcd->power_status == 1)
2117		{
2118			del_timer(&ifxhcd->host_probe_timer);
2119			ifxhcd->host_probe_timer.function = host_probe;
2120			ifxhcd->host_probe_timer.expires = jiffies + (HZ*ifxhcd->probe_sec);
2121			ifxhcd->host_probe_timer.data = (unsigned long) ifxhcd;
2122			add_timer(&ifxhcd->host_probe_timer);
2123			do_resume_h(&ifxhcd->core_if);
2124		}
2125	}
2126	#ifdef __IS_DUAL__
2127		static ssize_t probe_host_2_show(char *buf)
2128		{
2129			if(ifxusb_hcd_2.power_status == 0)
2130				return sprintf (buf,"Host 2 power status is ON\n");
2131			else if(ifxusb_hcd_2.power_status == 1)
2132				return sprintf (buf,"Host 2 power status is Suspend\n");
2133			else
2134				return sprintf (buf,"Host 2 power status is Auto-probing\n");
2135		}
2136		static ssize_t probe_host_1_show(char *buf)
2137		{
2138			if(ifxusb_hcd_1.power_status == 0)
2139				return sprintf (buf,"Host 1 power status is ON\n");
2140			else if(ifxusb_hcd_1.power_status == 1)
2141				return sprintf (buf,"Host 1 power status is Suspend\n");
2142			else
2143				return sprintf (buf,"Host 1 power status is Auto-probing\n");
2144		}
2145		static ssize_t procfs_probe_host_2_store(struct file *file, const char *buffer, unsigned long count, void *data)
2146		{
2147			char buf[10];
2148			int i = 0;
2149			uint32_t value;
2150			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2151				return -EFAULT;
2152			value = simple_strtoul(buf, NULL, 10);
2153			probe_host_store(&ifxusb_hcd_2,value);
2154			return count;
2155		}
2156		static ssize_t procfs_probe_host_2_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
2157		{
2158			return probe_host_2_show(buf);
2159		}
2160		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2161			static ssize_t sysfs_probe_host_2_show( struct device *_dev, struct device_attribute *attr,char *buf)
2162		#else
2163			static ssize_t sysfs_probe_host_2_show( struct device *_dev,                               char *buf)
2164		#endif
2165		{
2166			return probe_host_2_show(buf);
2167		}
2168		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2169			static ssize_t sysfs_probe_host_2_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2170		#else
2171			static ssize_t sysfs_probe_host_2_store( struct device *_dev,                               const char *buffer, size_t count )
2172		#endif
2173		{
2174			char buf[10];
2175			int i = 0;
2176			uint32_t value;
2177			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2178				return -EFAULT;
2179			value = simple_strtoul(buf, NULL, 10);
2180			probe_host_store(&ifxusb_hcd_2,value);
2181			return count;
2182		}
2183
2184		static ssize_t procfs_probe_host_1_store(struct file *file, const char *buffer, unsigned long count, void *data)
2185		{
2186			char buf[10];
2187			int i = 0;
2188			uint32_t value;
2189			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2190				return -EFAULT;
2191			value = simple_strtoul(buf, NULL, 10);
2192			probe_host_store(&ifxusb_hcd_1,value);
2193			return count;
2194		}
2195		static ssize_t procfs_probe_host_1_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
2196		{
2197			return probe_host_1_show(buf);
2198		}
2199		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2200			static ssize_t sysfs_probe_host_1_show( struct device *_dev, struct device_attribute *attr,char *buf)
2201		#else
2202			static ssize_t sysfs_probe_host_1_show( struct device *_dev,                               char *buf)
2203		#endif
2204		{
2205			return probe_host_1_show(buf);
2206		}
2207		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2208			static ssize_t sysfs_probe_host_1_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2209		#else
2210			static ssize_t sysfs_probe_host_1_store( struct device *_dev,                               const char *buffer, size_t count )
2211		#endif
2212		{
2213			char buf[10];
2214			int i = 0;
2215			uint32_t value;
2216			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2217				return -EFAULT;
2218			value = simple_strtoul(buf, NULL, 10);
2219			probe_host_store(&ifxusb_hcd_1,value);
2220			return count;
2221		}
2222		DEVICE_ATTR(probe_host_2, S_IRUGO|S_IWUSR, sysfs_probe_host_2_show, sysfs_probe_host_2_store);
2223		DEVICE_ATTR(probe_host_1, S_IRUGO|S_IWUSR, sysfs_probe_host_1_show, sysfs_probe_host_1_store);
2224/////////////////////////////////////////////////////////////////////////////////////////////////////
2225	#else
2226		static ssize_t probe_host_show(char *buf)
2227		{
2228			if(ifxusb_hcd.power_status == 0)
2229				return sprintf (buf,"Host power status is ON\n");
2230			else if(ifxusb_hcd.power_status == 1)
2231				return sprintf (buf,"Host power status is Suspend\n");
2232			else
2233				return sprintf (buf,"Host power status is Auto-probing\n");
2234		}
2235		static ssize_t procfs_probe_host_store(struct file *file, const char *buffer, unsigned long count, void *data)
2236		{
2237			char buf[10];
2238			int i = 0;
2239			uint32_t value;
2240			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2241				return -EFAULT;
2242			value = simple_strtoul(buf, NULL, 10);
2243			probe_host_store(&ifxusb_hcd,value);
2244			return count;
2245		}
2246		static ssize_t procfs_probe_host_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
2247		{
2248			return probe_host_show(buf);
2249		}
2250		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2251			static ssize_t sysfs_probe_host_show( struct device *_dev, struct device_attribute *attr,char *buf)
2252		#else
2253			static ssize_t sysfs_probe_host_show( struct device *_dev,                               char *buf)
2254		#endif
2255		{
2256			return probe_host_show(buf);
2257		}
2258		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2259			static ssize_t sysfs_probe_host_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2260		#else
2261			static ssize_t sysfs_probe_host_store( struct device *_dev,                               const char *buffer, size_t count )
2262		#endif
2263		{
2264			char buf[10];
2265			int i = 0;
2266			uint32_t value;
2267			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2268				return -EFAULT;
2269			value = simple_strtoul(buf, NULL, 10);
2270			probe_host_store(&ifxusb_hcd,value);
2271			return count;
2272		}
2273		DEVICE_ATTR(probe_host, S_IRUGO|S_IWUSR, sysfs_probe_host_show, sysfs_probe_host_store);
2274	#endif
2275#endif
2276/////////////////////////////////////////////////////////////////////////////////////////////////////
2277/////////////////////////////////////////////////////////////////////////////////////////////////////
2278#ifdef __IS_DEVICE__
2279	static void device_probe(unsigned long _ptr)
2280	{
2281		if(ifxusb_pcd.power_status == 2)
2282		{
2283			del_timer(&ifxusb_pcd.device_autoprobe_timer);
2284			ifxusb_pcd.device_autoprobe_timer.expires = jiffies + (HZ*ifxusb_pcd.autoprobe_sec);
2285			add_timer(&ifxusb_pcd.device_autoprobe_timer);
2286			ifxusb_pcd.power_status = 2;
2287			do_suspend_d(&ifxusb_pcd.core_if);
2288		}
2289		else if(ifxusb_pcd.power_status == 1)
2290		{
2291			do_suspend_d(&ifxusb_pcd.core_if);
2292			ifxusb_pcd.power_status = 1;
2293		}
2294	}
2295	static void device_autoprobe(unsigned long _ptr)
2296	{
2297		init_timer(&ifxusb_pcd.device_probe_timer);
2298		ifxusb_pcd.device_probe_timer.function = device_probe;
2299		ifxusb_pcd.device_probe_timer.expires = jiffies + (HZ*ifxusb_pcd.probe_sec);
2300		add_timer(&ifxusb_pcd.device_probe_timer);
2301		do_resume_d(&ifxusb_pcd.core_if);
2302	}
2303	static void suspend_device_store(uint32_t value)
2304	{
2305		if(value==2)
2306		{
2307			del_timer(&ifxusb_pcd.device_autoprobe_timer);
2308			ifxusb_pcd.device_autoprobe_timer.function = device_autoprobe;
2309			ifxusb_pcd.device_autoprobe_timer.expires = jiffies + (HZ*ifxusb_pcd.autoprobe_sec);
2310			add_timer(&ifxusb_pcd.device_autoprobe_timer);
2311			ifxusb_pcd.power_status = 2;
2312		}
2313		else if(value==1)
2314		{
2315			do_suspend_d(&ifxusb_pcd.core_if);
2316			ifxusb_pcd.power_status = 1;
2317			del_timer(&ifxusb_pcd.device_autoprobe_timer);
2318			del_timer(&ifxusb_pcd.device_probe_timer);
2319		}
2320		else if(value==0)
2321		{
2322			do_resume_d(&ifxusb_pcd.core_if);
2323			ifxusb_pcd.power_status = 0;
2324			del_timer(&ifxusb_pcd.device_autoprobe_timer);
2325			del_timer(&ifxusb_pcd.device_probe_timer);
2326		}
2327	}
2328	static ssize_t procfs_suspend_device_store(struct file *file, const char *buffer, unsigned long count, void *data)
2329	{
2330		char buf[10];
2331		int i = 0;
2332		uint32_t value;
2333		if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2334			return -EFAULT;
2335		value = simple_strtoul(buf, NULL, 10);
2336		suspend_device_store(value);
2337		return count;
2338	}
2339	#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2340		static ssize_t sysfs_suspend_device_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2341	#else
2342		static ssize_t sysfs_suspend_device_store( struct device *_dev,                               const char *buffer, size_t count )
2343	#endif
2344	{
2345		char buf[10];
2346		int i = 0;
2347		uint32_t value;
2348		if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2349			return -EFAULT;
2350		value = simple_strtoul(buf, NULL, 10);
2351		suspend_device_store(value);
2352		return count;
2353	}
2354	DEVICE_ATTR(suspend_device, S_IWUSR,NULL,sysfs_suspend_device_store);
2355#endif
2356/////////////////////////////////////////////////////////////////////////////////////////////////////
2357#ifdef __IS_DEVICE__
2358	static ssize_t probe_device_show(char *buf)
2359	{
2360		if(ifxusb_pcd.power_status == 0)
2361			return sprintf (buf,"Device power status is ON\n");
2362		else if(ifxusb_pcd.power_status == 1)
2363			return sprintf (buf,"Device power status is Suspend\n");
2364		else
2365			return printk(buf,"Device power status is Auto-probing\n");
2366	}
2367	static void probe_device_store(uint32_t value)
2368	{
2369
2370		if(ifxusb_pcd.power_status == 1)
2371		{
2372			del_timer(&ifxusb_pcd.device_probe_timer);
2373			ifxusb_pcd.device_probe_timer.function = device_probe;
2374			ifxusb_pcd.device_probe_timer.expires = jiffies + (HZ*ifxusb_pcd.probe_sec);
2375			add_timer(&ifxusb_pcd.device_probe_timer);
2376			do_resume_d(&ifxusb_pcd.core_if);
2377		}
2378	}
2379	static ssize_t procfs_probe_device_store(struct file *file, const char *buffer, unsigned long count, void *data)
2380	{
2381		char buf[10];
2382		int i = 0;
2383		uint32_t value;
2384		if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2385			return -EFAULT;
2386		value = simple_strtoul(buf, NULL, 10);
2387		probe_device_store(value);
2388		return count;
2389	}
2390	static ssize_t procfs_probe_device_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
2391	{
2392		return probe_device_show(buf);
2393	}
2394	#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2395		static ssize_t sysfs_probe_device_show( struct device *_dev, struct device_attribute *attr,char *buf)
2396	#else
2397		static ssize_t sysfs_probe_device_show( struct device *_dev,                               char *buf)
2398	#endif
2399	{
2400		return probe_device_show(buf);
2401	}
2402	#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2403		static ssize_t sysfs_probe_device_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2404	#else
2405		static ssize_t sysfs_probe_device_store( struct device *_dev,                               const char *buffer, size_t count )
2406	#endif
2407	{
2408		char buf[10];
2409		int i = 0;
2410		uint32_t value;
2411		if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2412			return -EFAULT;
2413		value = simple_strtoul(buf, NULL, 10);
2414		probe_device_store(value);
2415		return count;
2416	}
2417	DEVICE_ATTR(probe_device, S_IRUGO|S_IWUSR, sysfs_probe_device_show, sysfs_probe_device_store);
2418#endif
2419/////////////////////////////////////////////////////////////////////////////////////////////////////
2420/////////////////////////////////////////////////////////////////////////////////////////////////////
2421#ifdef __IS_HOST__
2422	#ifdef __IS_DUAL__
2423		static ssize_t autoprobe_timer2_val_show(char *buf)
2424		{
2425			return sprintf (buf,"Host 2 auto-probe timer is %d second\n",ifxusb_hcd_2.autoprobe_sec);
2426		}
2427		static ssize_t procfs_autoprobe_timer2_val_store(struct file *file, const char *buffer, unsigned long count, void *data)
2428		{
2429			char buf[10];
2430			int i = 0;
2431			uint32_t value;
2432			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2433				return -EFAULT;
2434			value = simple_strtoul(buf, NULL, 10);
2435			if((value > 0)&&(value < 300))
2436				ifxusb_hcd_2.autoprobe_sec = value;
2437			return count;
2438		}
2439		static ssize_t procfs_autoprobe_timer2_val_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
2440		{
2441			return autoprobe_timer2_val_show(buf);
2442		}
2443		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2444			static ssize_t sysfs_autoprobe_timer2_val_show( struct device *_dev, struct device_attribute *attr,char *buf)
2445		#else
2446			static ssize_t sysfs_autoprobe_timer2_val_show( struct device *_dev,                               char *buf)
2447		#endif
2448		{
2449			return autoprobe_timer2_val_show(buf);
2450		}
2451		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2452			static ssize_t sysfs_autoprobe_timer2_val_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2453		#else
2454			static ssize_t sysfs_autoprobe_timer2_val_store( struct device *_dev,                               const char *buffer, size_t count )
2455		#endif
2456		{
2457			char buf[10];
2458			int i = 0;
2459			uint32_t value;
2460			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2461				return -EFAULT;
2462			value = simple_strtoul(buf, NULL, 10);
2463			if((value > 0)&&(value < 300))
2464				ifxusb_hcd_2.autoprobe_sec = value;
2465			return count;
2466		}
2467
2468		static ssize_t autoprobe_timer1_val_show(char *buf)
2469		{
2470			return sprintf (buf,"Host 1 auto-probe timer is %d second\n",ifxusb_hcd_1.autoprobe_sec);
2471		}
2472		static ssize_t procfs_autoprobe_timer1_val_store(struct file *file, const char *buffer, unsigned long count, void *data)
2473		{
2474			char buf[10];
2475			int i = 0;
2476			uint32_t value;
2477			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2478				return -EFAULT;
2479			value = simple_strtoul(buf, NULL, 10);
2480			if((value > 0)&&(value < 300))
2481				ifxusb_hcd_1.autoprobe_sec = value;
2482			return count;
2483		}
2484		static ssize_t procfs_autoprobe_timer1_val_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
2485		{
2486			return autoprobe_timer1_val_show(buf);
2487		}
2488		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2489			static ssize_t sysfs_autoprobe_timer1_val_show( struct device *_dev, struct device_attribute *attr,char *buf)
2490		#else
2491			static ssize_t sysfs_autoprobe_timer1_val_show( struct device *_dev,                               char *buf)
2492		#endif
2493		{
2494			return autoprobe_timer1_val_show(buf);
2495		}
2496		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2497			static ssize_t sysfs_autoprobe_timer1_val_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2498		#else
2499			static ssize_t sysfs_autoautoprobe_timer1_val_store( struct device *_dev,                               const char *buffer, size_t count )
2500		#endif
2501		{
2502			char buf[10];
2503			int i = 0;
2504			uint32_t value;
2505			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2506				return -EFAULT;
2507			value = simple_strtoul(buf, NULL, 10);
2508			if((value > 0)&&(value < 300))
2509				ifxusb_hcd_1.autoprobe_sec = value;
2510			return count;
2511		}
2512
2513		static ssize_t probe_timer2_val_show(char *buf)
2514		{
2515			return sprintf (buf,"Host 2 probe timer is %d second\n",ifxusb_hcd_2.probe_sec);
2516		}
2517		static ssize_t procfs_probe_timer2_val_store(struct file *file, const char *buffer, unsigned long count, void *data)
2518		{
2519			char buf[10];
2520			int i = 0;
2521			uint32_t value;
2522			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2523				return -EFAULT;
2524			value = simple_strtoul(buf, NULL, 10);
2525			if((value > 0)&&(value < 10))
2526				ifxusb_hcd_2.probe_sec = value;
2527			return count;
2528		}
2529		static ssize_t procfs_probe_timer2_val_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
2530		{
2531			return probe_timer2_val_show(buf);
2532		}
2533		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2534			static ssize_t sysfs_probe_timer2_val_show( struct device *_dev, struct device_attribute *attr,char *buf)
2535		#else
2536			static ssize_t sysfs_probe_timer2_val_show( struct device *_dev,                               char *buf)
2537		#endif
2538		{
2539			return probe_timer2_val_show(buf);
2540		}
2541		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2542			static ssize_t sysfs_probe_timer2_val_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2543		#else
2544			static ssize_t sysfs_probe_timer2_val_store( struct device *_dev,                               const char *buffer, size_t count )
2545		#endif
2546		{
2547			char buf[10];
2548			int i = 0;
2549			uint32_t value;
2550			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2551				return -EFAULT;
2552			value = simple_strtoul(buf, NULL, 10);
2553			if((value > 0)&&(value < 10))
2554				ifxusb_hcd_2.probe_sec = value;
2555			return count;
2556		}
2557
2558		static ssize_t probe_timer1_val_show(char *buf)
2559		{
2560			return sprintf (buf,"Host 1 probe timer is %d second\n",ifxusb_hcd_1.probe_sec);
2561		}
2562		static ssize_t procfs_probe_timer1_val_store(struct file *file, const char *buffer, unsigned long count, void *data)
2563		{
2564			char buf[10];
2565			int i = 0;
2566			uint32_t value;
2567			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2568				return -EFAULT;
2569			value = simple_strtoul(buf, NULL, 10);
2570			if((value > 0)&&(value < 10))
2571				ifxusb_hcd_1.probe_sec = value;
2572			return count;
2573		}
2574		static ssize_t procfs_probe_timer1_val_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
2575		{
2576			return probe_timer1_val_show(buf);
2577		}
2578		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2579			static ssize_t sysfs_probe_timer1_val_show( struct device *_dev, struct device_attribute *attr,char *buf)
2580		#else
2581			static ssize_t sysfs_probe_timer1_val_show( struct device *_dev,                               char *buf)
2582		#endif
2583		{
2584			return probe_timer1_val_show(buf);
2585		}
2586		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2587			static ssize_t sysfs_probe_timer1_val_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2588		#else
2589			static ssize_t sysfs_probe_timer1_val_store( struct device *_dev,                               const char *buffer, size_t count )
2590		#endif
2591		{
2592			char buf[10];
2593			int i = 0;
2594			uint32_t value;
2595			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2596				return -EFAULT;
2597			value = simple_strtoul(buf, NULL, 10);
2598			if((value > 0)&&(value < 10))
2599				ifxusb_hcd_1.probe_sec = value;
2600			return count;
2601		}
2602		DEVICE_ATTR(probe_timer1_val_h, S_IRUGO|S_IWUSR, sysfs_probe_timer1_val_show, sysfs_probe_timer1_val_store);
2603		DEVICE_ATTR(probe_timer2_val_h, S_IRUGO|S_IWUSR, sysfs_probe_timer2_val_show, sysfs_probe_timer2_val_store);
2604		DEVICE_ATTR(autoprobe_timer1_val_h, S_IRUGO|S_IWUSR, sysfs_autoprobe_timer1_val_show, sysfs_autoprobe_timer1_val_store);
2605		DEVICE_ATTR(autoprobe_timer2_val_h, S_IRUGO|S_IWUSR, sysfs_autoprobe_timer2_val_show, sysfs_autoprobe_timer2_val_store);
2606	#else
2607		static ssize_t autoprobe_timer_val_show(char *buf)
2608		{
2609			return sprintf (buf,"Host auto-probe timer is %d second\n",ifxusb_hcd.autoprobe_sec);
2610		}
2611		static ssize_t procfs_autoprobe_timer_val_store(struct file *file, const char *buffer, unsigned long count, void *data)
2612		{
2613			char buf[10];
2614			int i = 0;
2615			uint32_t value;
2616			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2617				return -EFAULT;
2618			value = simple_strtoul(buf, NULL, 10);
2619			if((value > 0)&&(value < 300))
2620				ifxusb_hcd.autoprobe_sec = value;
2621			return count;
2622		}
2623		static ssize_t procfs_autoprobe_timer_val_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
2624		{
2625			return autoprobe_timer_val_show(buf);
2626		}
2627		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2628			static ssize_t sysfs_autoprobe_timer_val_show( struct device *_dev, struct device_attribute *attr,char *buf)
2629		#else
2630			static ssize_t sysfs_autoprobe_timer_val_show( struct device *_dev,                               char *buf)
2631		#endif
2632		{
2633			return autoprobe_timer_val_show(buf);
2634		}
2635		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2636			static ssize_t sysfs_autoprobe_timer_val_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2637		#else
2638			static ssize_t sysfs_autoautoprobe_timer_val_store( struct device *_dev,                               const char *buffer, size_t count )
2639		#endif
2640		{
2641			char buf[10];
2642			int i = 0;
2643			uint32_t value;
2644			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2645				return -EFAULT;
2646			value = simple_strtoul(buf, NULL, 10);
2647			if((value > 0)&&(value < 300))
2648				ifxusb_hcd.autoprobe_sec = value;
2649			return count;
2650		}
2651		static ssize_t probe_timer_val_show(char *buf)
2652		{
2653			return sprintf (buf,"Host probe timer is %d second\n",ifxusb_hcd.probe_sec);
2654		}
2655		static ssize_t procfs_probe_timer_val_store(struct file *file, const char *buffer, unsigned long count, void *data)
2656		{
2657			char buf[10];
2658			int i = 0;
2659			uint32_t value;
2660			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2661				return -EFAULT;
2662			value = simple_strtoul(buf, NULL, 10);
2663			if((value > 0)&&(value < 10))
2664				ifxusb_hcd.probe_sec = value;
2665			return count;
2666		}
2667		static ssize_t procfs_probe_timer_val_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
2668		{
2669			return probe_timer_val_show(buf);
2670		}
2671		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2672			static ssize_t sysfs_probe_timer_val_show( struct device *_dev, struct device_attribute *attr,char *buf)
2673		#else
2674			static ssize_t sysfs_probe_timer_val_show( struct device *_dev,                               char *buf)
2675		#endif
2676		{
2677			return probe_timer_val_show(buf);
2678		}
2679		#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2680			static ssize_t sysfs_probe_timer_val_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2681		#else
2682			static ssize_t sysfs_probe_timer_val_store( struct device *_dev,                               const char *buffer, size_t count )
2683		#endif
2684		{
2685			char buf[10];
2686			int i = 0;
2687			uint32_t value;
2688			if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2689				return -EFAULT;
2690			value = simple_strtoul(buf, NULL, 10);
2691			if((value > 0)&&(value < 10))
2692				ifxusb_hcd.probe_sec = value;
2693			return count;
2694		}
2695		DEVICE_ATTR(probe_timer_val_h, S_IRUGO|S_IWUSR, sysfs_probe_timer_val_show, sysfs_probe_timer_val_store);
2696		DEVICE_ATTR(autoprobe_timer_val_h, S_IRUGO|S_IWUSR, sysfs_autoprobe_timer_val_show, sysfs_autoprobe_timer_val_store);
2697	#endif
2698#endif
2699/////////////////////////////////////////////////////////////////////////////////////////////////////
2700/////////////////////////////////////////////////////////////////////////////////////////////////////
2701#ifdef __IS_DEVICE__
2702	static ssize_t autoprobe_timer_val_show(char *buf)
2703	{
2704		return sprintf (buf,"Device auto-probe timer is %d second\n",ifxusb_pcd.autoprobe_sec);
2705	}
2706	static ssize_t procfs_autoprobe_timer_val_store(struct file *file, const char *buffer, unsigned long count, void *data)
2707	{
2708		char buf[10];
2709		int i = 0;
2710		uint32_t value;
2711		if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2712			return -EFAULT;
2713		value = simple_strtoul(buf, NULL, 10);
2714		if((value > 0)&&(value < 300))
2715			ifxusb_pcd.autoprobe_sec = value;
2716		return count;
2717	}
2718	static ssize_t procfs_autoprobe_timer_val_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
2719	{
2720		return autoprobe_timer_val_show(buf);
2721	}
2722	#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2723		static ssize_t sysfs_autoprobe_timer_val_show( struct device *_dev, struct device_attribute *attr,char *buf)
2724	#else
2725		static ssize_t sysfs_autoprobe_timer_val_show( struct device *_dev,                               char *buf)
2726	#endif
2727	{
2728		return autoprobe_timer_val_show(buf);
2729	}
2730	#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2731		static ssize_t sysfs_autoprobe_timer_val_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2732	#else
2733		static ssize_t sysfs_autoautoprobe_timer_val_store( struct device *_dev,                               const char *buffer, size_t count )
2734	#endif
2735	{
2736		char buf[10];
2737		int i = 0;
2738		uint32_t value;
2739		if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2740			return -EFAULT;
2741		value = simple_strtoul(buf, NULL, 10);
2742		if((value > 0)&&(value < 300))
2743			ifxusb_pcd.autoprobe_sec = value;
2744		return count;
2745	}
2746	static ssize_t probe_timer_val_show(char *buf)
2747	{
2748		return sprintf (buf,"Device probe timer is %d second\n",ifxusb_pcd.probe_sec);
2749	}
2750	static ssize_t procfs_probe_timer_val_store(struct file *file, const char *buffer, unsigned long count, void *data)
2751	{
2752		char buf[10];
2753		int i = 0;
2754		uint32_t value;
2755		if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2756			return -EFAULT;
2757		value = simple_strtoul(buf, NULL, 10);
2758		if((value > 0)&&(value < 10))
2759			ifxusb_pcd.probe_sec = value;
2760		return count;
2761	}
2762	static ssize_t procfs_probe_timer_val_show(char *buf, char **start, off_t offset, int count, int *eof, void *data)
2763	{
2764		return probe_timer_val_show(buf);
2765	}
2766	#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2767		static ssize_t sysfs_probe_timer_val_show( struct device *_dev, struct device_attribute *attr,char *buf)
2768	#else
2769		static ssize_t sysfs_probe_timer_val_show( struct device *_dev,                               char *buf)
2770	#endif
2771	{
2772		return probe_timer_val_show(buf);
2773	}
2774	#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2775		static ssize_t sysfs_probe_timer_val_store( struct device *_dev, struct device_attribute *attr,const char *buffer, size_t count )
2776	#else
2777		static ssize_t sysfs_probe_timer_val_store( struct device *_dev,                               const char *buffer, size_t count )
2778	#endif
2779	{
2780		char buf[10];
2781		int i = 0;
2782		uint32_t value;
2783		if (copy_from_user(buf, &buffer[i], sizeof("0xFFFFFFFF\n")+1))
2784			return -EFAULT;
2785		value = simple_strtoul(buf, NULL, 10);
2786		if((value > 0)&&(value < 10))
2787			ifxusb_pcd.probe_sec = value;
2788		return count;
2789	}
2790	DEVICE_ATTR(probe_timer_val_d, S_IRUGO|S_IWUSR, sysfs_probe_timer_val_show, sysfs_probe_timer_val_store);
2791	DEVICE_ATTR(autoprobe_timer_val_d, S_IRUGO|S_IWUSR, sysfs_autoprobe_timer_val_show, sysfs_autoprobe_timer_val_store);
2792#endif
2793//////////////////////////////////////////////////////////////////////////////////
2794//////////////////////////////////////////////////////////////////////////////////
2795
2796static int  ifx_proc_addproc(char *funcname, read_proc_t *hookfuncr, write_proc_t *hookfuncw);
2797static void ifx_proc_delproc(char *funcname);
2798
2799//////////////////////////////////////////////////////////////////////////////////
2800
2801#if defined(__IS_HOST__) && defined(__HOST_COC__)
2802	#ifdef __IS_DUAL__
2803		static IFX_PMCU_MODULE_DEP_t depListUSBHost_1=
2804		{
2805		     1,
2806		     {
2807		         {IFX_PMCU_MODULE_CPU, IFX_PMCU_STATE_D0, IFX_PMCU_STATE_D0D3, IFX_PMCU_STATE_D0D3, IFX_PMCU_STATE_D0D3}
2808		     }
2809		};
2810		static IFX_PMCU_MODULE_DEP_t depListUSBHost_2=
2811		{
2812		     1,
2813		     {
2814		         {IFX_PMCU_MODULE_CPU, IFX_PMCU_STATE_D0, IFX_PMCU_STATE_D0D3, IFX_PMCU_STATE_D0D3, IFX_PMCU_STATE_D0D3}
2815		     }
2816		};
2817		// This functions returns the current power state of the module
2818		static IFX_PMCU_RETURN_t
2819		ifx_usbhost_stateGet_1(IFX_PMCU_STATE_t *pmcuModState) {
2820		    printk(KERN_DEBUG "ifx_usbhost_stateGet_1 is called\n");
2821		    if(ifxusb_hcd_1.power_status == 0){
2822		        printk(KERN_DEBUG "current power state of USB Host #1 is D0\n");
2823		        *pmcuModState = IFX_PMCU_STATE_D0; // set here the right value
2824		    }
2825		    else if(ifxusb_hcd_1.power_status == 1){
2826		        printk(KERN_DEBUG "current power state of USB Host #1 is D3 (Suspend)\n");
2827		        *pmcuModState = IFX_PMCU_STATE_D3; // set here the right value
2828		    }
2829		    else if(ifxusb_hcd_1.power_status == 2){
2830		        printk(KERN_DEBUG "current power state of USB Host #1 is D3 (Auto-Probing)\n");
2831		        *pmcuModState = IFX_PMCU_STATE_D3; // set here the right value
2832		    }
2833		    else{
2834		        printk(KERN_DEBUG "current power state of USB Host #1 is unknown (%d)\n",ifxusb_hcd_1.power_status);
2835		        *pmcuModState = IFX_PMCU_STATE_INVALID; // must be set to INVALID
2836		    }
2837		    return IFX_PMCU_RETURN_SUCCESS;
2838		}
2839		static IFX_PMCU_RETURN_t
2840		ifx_usbhost_stateGet_2(IFX_PMCU_STATE_t *pmcuModState) {
2841		    printk(KERN_DEBUG "ifx_usbhost_stateGet_2 is called\n");
2842		    if(ifxusb_hcd_2.power_status == 0){
2843		        printk(KERN_DEBUG "current power state of USB Host #2 is D0\n");
2844		        *pmcuModState = IFX_PMCU_STATE_D0; // set here the right value
2845		    }
2846		    else if(ifxusb_hcd_2.power_status == 1){
2847		        printk(KERN_DEBUG "current power state of USB Host #2 is D3 (Suspend)\n");
2848		        *pmcuModState = IFX_PMCU_STATE_D3; // set here the right value
2849		    }
2850		    else if(ifxusb_hcd_2.power_status == 2){
2851		        printk(KERN_DEBUG "current power state of USB Host #2 is D3 (Auto-Probing)\n");
2852		        *pmcuModState = IFX_PMCU_STATE_D3; // set here the right value
2853		    }
2854		    else{
2855		        printk(KERN_DEBUG "current power state of USB Host #2 is unknown (%d)\n",ifxusb_hcd_2.power_status);
2856		        *pmcuModState = IFX_PMCU_STATE_INVALID; // must be set to INVALID
2857		    }
2858		    return IFX_PMCU_RETURN_SUCCESS;
2859		}
2860
2861
2862		// The function should be used to enable/disable the module specific power saving methods
2863		static IFX_PMCU_RETURN_t
2864		ifx_usbhost_pwrFeatureSwitch_1(IFX_PMCU_PWR_STATE_ENA_t pmcuPwrStateEna)
2865		{
2866		    if (pmcuPwrStateEna == IFX_PMCU_PWR_STATE_ON) {
2867			    suspend_host_store(&ifxusb_hcd_1, 0);
2868		        return IFX_PMCU_RETURN_SUCCESS;
2869		    }
2870		    if (pmcuPwrStateEna == IFX_PMCU_PWR_STATE_OFF) {
2871			    suspend_host_store(&ifxusb_hcd_1, 1);
2872		        return IFX_PMCU_RETURN_SUCCESS;
2873		    }
2874		    return IFX_PMCU_RETURN_SUCCESS;
2875		}
2876		static IFX_PMCU_RETURN_t
2877		ifx_usbhost_pwrFeatureSwitch_2(IFX_PMCU_PWR_STATE_ENA_t pmcuPwrStateEna)
2878		{
2879		    if (pmcuPwrStateEna == IFX_PMCU_PWR_STATE_ON) {
2880			    suspend_host_store(&ifxusb_hcd_2, 0);
2881		        return IFX_PMCU_RETURN_SUCCESS;
2882		    }
2883		    if (pmcuPwrStateEna == IFX_PMCU_PWR_STATE_OFF) {
2884			    suspend_host_store(&ifxusb_hcd_2, 1);
2885		        return IFX_PMCU_RETURN_SUCCESS;
2886		    }
2887		    return IFX_PMCU_RETURN_SUCCESS;
2888		}
2889
2890		// This function should be used to do all the necessary clean-up's before a the real
2891		// power state change is initiated; e.g. flush all serial buffers inside the UART  before
2892		// the frequency will be changed.
2893		static IFX_PMCU_RETURN_t
2894		ifx_usbhost_preChange_1(IFX_PMCU_MODULE_t pmcuModule, IFX_PMCU_STATE_t newState, IFX_PMCU_STATE_t oldState)
2895		{
2896		    printk(KERN_DEBUG "ifx_usbhost_preChange_1 is called\n");
2897		    return IFX_PMCU_RETURN_SUCCESS;
2898		}
2899		static IFX_PMCU_RETURN_t
2900		ifx_usbhost_preChange_2(IFX_PMCU_MODULE_t pmcuModule, IFX_PMCU_STATE_t newState, IFX_PMCU_STATE_t oldState)
2901		{
2902		    printk(KERN_DEBUG "ifx_usbhost_preChange_2 is called\n");
2903		    return IFX_PMCU_RETURN_SUCCESS;
2904		}
2905
2906
2907		// This function initiate the real power state change. The module should do all the necessary
2908		//   adpations to the new state.
2909		static IFX_PMCU_RETURN_t
2910		ifx_usbhost_stateChange_1(IFX_PMCU_STATE_t newState)
2911		{
2912		    printk(KERN_DEBUG "ifx_usbhost_stateChange_1 is called\n");
2913		    if (newState == IFX_PMCU_STATE_D0) {
2914			    suspend_host_store(&ifxusb_hcd_1, 0);
2915		        return IFX_PMCU_RETURN_SUCCESS;
2916		    }
2917		    if (newState == IFX_PMCU_STATE_D1) {
2918			    suspend_host_store(&ifxusb_hcd_1, 1);
2919		        return IFX_PMCU_RETURN_SUCCESS;
2920		    }
2921		    if (newState == IFX_PMCU_STATE_D2) {
2922			    suspend_host_store(&ifxusb_hcd_1, 1);
2923		        return IFX_PMCU_RETURN_SUCCESS;
2924		    }
2925		    if (newState == IFX_PMCU_STATE_D3) {
2926			    suspend_host_store(&ifxusb_hcd_1, 1);
2927		        return IFX_PMCU_RETURN_SUCCESS;
2928		    }
2929		    return IFX_PMCU_RETURN_SUCCESS;
2930		}
2931		static IFX_PMCU_RETURN_t
2932		ifx_usbhost_stateChange_2(IFX_PMCU_STATE_t newState)
2933		{
2934		    printk(KERN_DEBUG "ifx_usbhost_stateChange_2 is called\n");
2935		    if (newState == IFX_PMCU_STATE_D0) {
2936			    suspend_host_store(&ifxusb_hcd_2, 0);
2937		        return IFX_PMCU_RETURN_SUCCESS;
2938		    }
2939		    if (newState == IFX_PMCU_STATE_D1) {
2940			    suspend_host_store(&ifxusb_hcd_2, 1);
2941		        return IFX_PMCU_RETURN_SUCCESS;
2942		    }
2943		    if (newState == IFX_PMCU_STATE_D2) {
2944			    suspend_host_store(&ifxusb_hcd_2, 1);
2945		        return IFX_PMCU_RETURN_SUCCESS;
2946		    }
2947		    if (newState == IFX_PMCU_STATE_D3) {
2948			    suspend_host_store(&ifxusb_hcd_2, 1);
2949		        return IFX_PMCU_RETURN_SUCCESS;
2950		    }
2951		    return IFX_PMCU_RETURN_SUCCESS;
2952		}
2953
2954		// This function should be used to do all the necessary post processing after a the real
2955		//   power state change was initiated.
2956		static IFX_PMCU_RETURN_t
2957		ifx_usbhost_postChange_1(IFX_PMCU_MODULE_t pmcuModule, IFX_PMCU_STATE_t newState, IFX_PMCU_STATE_t oldState)
2958		{
2959		    printk(KERN_DEBUG "ifx_usbhost_postChange_1 is called\n");
2960		    return IFX_PMCU_RETURN_SUCCESS;
2961		}
2962		static IFX_PMCU_RETURN_t
2963		ifx_usbhost_postChange_2(IFX_PMCU_MODULE_t pmcuModule, IFX_PMCU_STATE_t newState, IFX_PMCU_STATE_t oldState)
2964		{
2965		    printk(KERN_DEBUG "ifx_usbhost_postChange_2 is called\n");
2966		    return IFX_PMCU_RETURN_SUCCESS;
2967		}
2968	#else
2969		static IFX_PMCU_MODULE_DEP_t depListUSBHost=
2970		{
2971		     1,
2972		     {
2973		         {IFX_PMCU_MODULE_CPU, IFX_PMCU_STATE_D0, IFX_PMCU_STATE_D0D3, IFX_PMCU_STATE_D0D3, IFX_PMCU_STATE_D0D3}
2974		     }
2975		};
2976		// This functions returns the current power state of the module
2977		static IFX_PMCU_RETURN_t
2978		ifx_usbhost_stateGet(IFX_PMCU_STATE_t *pmcuModState) {
2979		    printk(KERN_DEBUG "ifx_usbhost_stateGet is called\n");
2980		    if(ifxusb_hcd.power_status == 0){
2981		        printk(KERN_DEBUG "current power state of USB Host is D0\n");
2982		        *pmcuModState = IFX_PMCU_STATE_D0; // set here the right value
2983		    }
2984		    else if(ifxusb_hcd.power_status == 1){
2985		        printk(KERN_DEBUG "current power state of USB Host is D3 (Suspend)\n");
2986		        *pmcuModState = IFX_PMCU_STATE_D3; // set here the right value
2987		    }
2988		    else if(ifxusb_hcd.power_status == 2){
2989		        printk(KERN_DEBUG "current power state of USB Host is D3 (Auto-Probing)\n");
2990		        *pmcuModState = IFX_PMCU_STATE_D3; // set here the right value
2991		    }
2992		    else{
2993		        printk(KERN_DEBUG "current power state of USB Host is unknown (%d)\n",ifxusb_hcd.power_status);
2994		        *pmcuModState = IFX_PMCU_STATE_INVALID; // must be set to INVALID
2995		    }
2996		    return IFX_PMCU_RETURN_SUCCESS;
2997		}
2998		// The function should be used to enable/disable the module specific power saving methods
2999		static IFX_PMCU_RETURN_t
3000		ifx_usbhost_pwrFeatureSwitch(IFX_PMCU_PWR_STATE_ENA_t pmcuPwrStateEna)
3001		{
3002		    if (pmcuPwrStateEna == IFX_PMCU_PWR_STATE_ON) {
3003			    suspend_host_store(&ifxusb_hcd, 0);
3004		        return IFX_PMCU_RETURN_SUCCESS;
3005		    }
3006		    if (pmcuPwrStateEna == IFX_PMCU_PWR_STATE_OFF) {
3007			    suspend_host_store(&ifxusb_hcd, 1);
3008		        return IFX_PMCU_RETURN_SUCCESS;
3009		    }
3010		    return IFX_PMCU_RETURN_SUCCESS;
3011		}
3012
3013		// This function should be used to do all the necessary clean-up's before a the real
3014		// power state change is initiated; e.g. flush all serial buffers inside the UART  before
3015		// the frequency will be changed.
3016		static IFX_PMCU_RETURN_t
3017		ifx_usbhost_preChange(IFX_PMCU_MODULE_t pmcuModule, IFX_PMCU_STATE_t newState, IFX_PMCU_STATE_t oldState)
3018		{
3019		    printk(KERN_DEBUG "ifx_usbhost_preChange is called\n");
3020		    return IFX_PMCU_RETURN_SUCCESS;
3021		}
3022
3023
3024		// This function initiate the real power state change. The module should do all the necessary
3025		//   adpations to the new state.
3026		static IFX_PMCU_RETURN_t
3027		ifx_usbhost_stateChange(IFX_PMCU_STATE_t newState)
3028		{
3029		    printk(KERN_DEBUG "ifx_usbhost_stateChange is called\n");
3030		    if (newState == IFX_PMCU_STATE_D0) {
3031			    suspend_host_store(&ifxusb_hcd, 0);
3032		        return IFX_PMCU_RETURN_SUCCESS;
3033		    }
3034		    if (newState == IFX_PMCU_STATE_D1) {
3035			    suspend_host_store(&ifxusb_hcd, 1);
3036		        return IFX_PMCU_RETURN_SUCCESS;
3037		    }
3038		    if (newState == IFX_PMCU_STATE_D2) {
3039			    suspend_host_store(&ifxusb_hcd, 1);
3040		        return IFX_PMCU_RETURN_SUCCESS;
3041		    }
3042		    if (newState == IFX_PMCU_STATE_D3) {
3043			    suspend_host_store(&ifxusb_hcd, 1);
3044		        return IFX_PMCU_RETURN_SUCCESS;
3045		    }
3046		    return IFX_PMCU_RETURN_SUCCESS;
3047		}
3048
3049		// This function should be used to do all the necessary post processing after a the real
3050		//   power state change was initiated.
3051		static IFX_PMCU_RETURN_t
3052		ifx_usbhost_postChange(IFX_PMCU_MODULE_t pmcuModule, IFX_PMCU_STATE_t newState, IFX_PMCU_STATE_t oldState)
3053		{
3054		    printk(KERN_DEBUG "ifx_usbhost_postChange is called\n");
3055		    return IFX_PMCU_RETURN_SUCCESS;
3056		}
3057	#endif
3058#endif
3059#if defined(__IS_DEVICE__) && defined(__GADGET_COC__)
3060	static IFX_PMCU_MODULE_DEP_t depListUSBGadget=
3061	{
3062	     1,
3063	     {
3064	         {IFX_PMCU_MODULE_CPU, IFX_PMCU_STATE_D0, IFX_PMCU_STATE_D0D3, IFX_PMCU_STATE_D0D3, IFX_PMCU_STATE_D0D3}
3065	     }
3066	};
3067		// This functions returns the current power state of the module
3068		static IFX_PMCU_RETURN_t
3069		ifx_usbgadget_stateGet(IFX_PMCU_STATE_t *pmcuModState) {
3070		    printk(KERN_DEBUG "ifx_usbgadget_stateGet is called\n");
3071		    if(ifxusb_pcd.power_status == 0){
3072		        printk(KERN_DEBUG "current power state of USB Gadget is D0\n");
3073		        *pmcuModState = IFX_PMCU_STATE_D0; // set here the right value
3074		    }
3075		    else if(ifxusb_pcd.power_status == 1){
3076		        printk(KERN_DEBUG "current power state of USB Gadget is D3 (Suspend)\n");
3077		        *pmcuModState = IFX_PMCU_STATE_D3; // set here the right value
3078		    }
3079		    else if(ifxusb_pcd.power_status == 2){
3080		        printk(KERN_DEBUG "current power state of USB Gadget is D3 (Auto-Probing)\n");
3081		        *pmcuModState = IFX_PMCU_STATE_D3; // set here the right value
3082		    }
3083		    else{
3084		        printk(KERN_DEBUG "current power state of USB Gadget is unknown (%d)\n",ifxusb_pcd.power_status);
3085		        *pmcuModState = IFX_PMCU_STATE_INVALID; // must be set to INVALID
3086		    }
3087		    return IFX_PMCU_RETURN_SUCCESS;
3088		}
3089		// The function should be used to enable/disable the module specific power saving methods
3090		static IFX_PMCU_RETURN_t
3091		ifx_usbgadget_pwrFeatureSwitch(IFX_PMCU_PWR_STATE_ENA_t pmcuPwrStateEna)
3092		{
3093		    if (pmcuPwrStateEna == IFX_PMCU_PWR_STATE_ON) {
3094			    suspend_device_store(0);
3095		        return IFX_PMCU_RETURN_SUCCESS;
3096		    }
3097		    if (pmcuPwrStateEna == IFX_PMCU_PWR_STATE_OFF) {
3098			    suspend_device_store(1);
3099		        return IFX_PMCU_RETURN_SUCCESS;
3100		    }
3101		    return IFX_PMCU_RETURN_SUCCESS;
3102		}
3103
3104		// This function should be used to do all the necessary clean-up's before a the real
3105		// power state change is initiated; e.g. flush all serial buffers inside the UART  before
3106		// the frequency will be changed.
3107		static IFX_PMCU_RETURN_t
3108		ifx_usbgadget_preChange(IFX_PMCU_MODULE_t pmcuModule, IFX_PMCU_STATE_t newState, IFX_PMCU_STATE_t oldState)
3109		{
3110		    printk(KERN_DEBUG "ifx_usbgadget_preChange is called\n");
3111		    return IFX_PMCU_RETURN_SUCCESS;
3112		}
3113
3114
3115		// This function initiate the real power state change. The module should do all the necessary
3116		//   adpations to the new state.
3117		static IFX_PMCU_RETURN_t
3118		ifx_usbgadget_stateChange(IFX_PMCU_STATE_t newState)
3119		{
3120		    printk(KERN_DEBUG "ifx_usbgadget_stateChange is called\n");
3121		    if (newState == IFX_PMCU_STATE_D0) {
3122			    suspend_device_store(0);
3123		        return IFX_PMCU_RETURN_SUCCESS;
3124		    }
3125		    if (newState == IFX_PMCU_STATE_D1) {
3126			    suspend_device_store(1);
3127		        return IFX_PMCU_RETURN_SUCCESS;
3128		    }
3129		    if (newState == IFX_PMCU_STATE_D2) {
3130			    suspend_device_store(1);
3131		        return IFX_PMCU_RETURN_SUCCESS;
3132		    }
3133		    if (newState == IFX_PMCU_STATE_D3) {
3134			    suspend_device_store(1);
3135		        return IFX_PMCU_RETURN_SUCCESS;
3136		    }
3137		    return IFX_PMCU_RETURN_SUCCESS;
3138		}
3139
3140		// This function should be used to do all the necessary post processing after a the real
3141		//   power state change was initiated.
3142		static IFX_PMCU_RETURN_t
3143		ifx_usbgadget_postChange(IFX_PMCU_MODULE_t pmcuModule, IFX_PMCU_STATE_t newState, IFX_PMCU_STATE_t oldState)
3144		{
3145		    printk(KERN_DEBUG "ifx_usbgadget_postChange is called\n");
3146		    return IFX_PMCU_RETURN_SUCCESS;
3147		}
3148#endif
3149
3150
3151/*!
3152  \brief This function create the sysfs and procfs entries
3153  \param[in] _dev Pointer of device structure, if applied
3154 */
3155#ifdef __IS_HOST__
3156void ifxusb_attr_create_h (void *_dev)
3157#else
3158void ifxusb_attr_create_d (void *_dev)
3159#endif
3160{
3161	int error;
3162
3163	struct device *dev = (struct device *) _dev;
3164
3165	IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
3166
3167	error = ifx_proc_addproc("dbglevel", procfs_dbglevel_show, procfs_dbglevel_store);
3168	#ifdef __IS_HOST__
3169	error = device_create_file(dev, &dev_attr_dbglevel_h);
3170	#else
3171	error = device_create_file(dev, &dev_attr_dbglevel_d);
3172	#endif
3173
3174	#ifdef __IS_HOST__
3175		#ifdef __IS_DUAL__
3176			error = ifx_proc_addproc("dump_params_1", procfs_dump_params_show_1, NULL);
3177			error = ifx_proc_addproc("dump_params_2", procfs_dump_params_show_2, NULL);
3178			error = device_create_file(dev, &dev_attr_dump_params_h_1);
3179			error = device_create_file(dev, &dev_attr_dump_params_h_2);
3180
3181			error = ifx_proc_addproc("mode_1", procfs_mode_show_1, NULL);
3182			error = ifx_proc_addproc("mode_2", procfs_mode_show_2, NULL);
3183			error = device_create_file(dev, &dev_attr_mode_h_1);
3184			error = device_create_file(dev, &dev_attr_mode_h_2);
3185		#else
3186			error = ifx_proc_addproc("dump_params", procfs_dump_params_show, NULL);
3187			error = device_create_file(dev, &dev_attr_dump_params_h);
3188			error = ifx_proc_addproc("mode", procfs_mode_show, NULL);
3189			error = device_create_file(dev, &dev_attr_mode_h);
3190		#endif
3191	#else
3192		error = ifx_proc_addproc("dump_params", procfs_dump_params_show, NULL);
3193		error = device_create_file(dev, &dev_attr_dump_params_d);
3194
3195		error = ifx_proc_addproc("mode", procfs_mode_show, NULL);
3196		error = device_create_file(dev, &dev_attr_mode_d);
3197	#endif
3198
3199	#ifdef __IS_HOST__
3200		error = ifx_proc_addproc("version", procfs_version_show, NULL);
3201		error = device_create_file(dev, &dev_attr_version_h);
3202	#else
3203		error = ifx_proc_addproc("version", procfs_version_show, NULL);
3204		error = device_create_file(dev, &dev_attr_version_d);
3205	#endif
3206
3207
3208	#ifdef __IS_HOST__
3209		#ifdef __IS_DUAL__
3210			error = ifx_proc_addproc("pkt_count_limit_bi_1", procfs_pkt_count_limit_bi_show_1, procfs_pkt_count_limit_bi_store_1);
3211			error = ifx_proc_addproc("pkt_count_limit_bo_1", procfs_pkt_count_limit_bo_show_1, procfs_pkt_count_limit_bo_store_1);
3212			error = ifx_proc_addproc("pkt_count_limit_bi_2", procfs_pkt_count_limit_bi_show_2, procfs_pkt_count_limit_bi_store_2);
3213			error = ifx_proc_addproc("pkt_count_limit_bo_2", procfs_pkt_count_limit_bo_show_2, procfs_pkt_count_limit_bo_store_2);
3214			error = ifx_proc_addproc("bandwidth_hs_1", procfs_bandwidth_hs_show_1, procfs_bandwidth_hs_store_1);
3215			error = ifx_proc_addproc("bandwidth_fs_1", procfs_bandwidth_fs_show_1, procfs_bandwidth_fs_store_1);
3216			error = ifx_proc_addproc("bandwidth_ls_1", procfs_bandwidth_ls_show_1, procfs_bandwidth_ls_store_1);
3217			error = ifx_proc_addproc("bandwidth_hs_2", procfs_bandwidth_hs_show_2, procfs_bandwidth_hs_store_2);
3218			error = ifx_proc_addproc("bandwidth_fs_2", procfs_bandwidth_fs_show_2, procfs_bandwidth_fs_store_2);
3219			error = ifx_proc_addproc("bandwidth_ls_2", procfs_bandwidth_ls_show_2, procfs_bandwidth_ls_store_2);
3220			error = device_create_file(dev, &dev_attr_pkt_count_limit_bi_1);
3221			error = device_create_file(dev, &dev_attr_pkt_count_limit_bo_1);
3222			error = device_create_file(dev, &dev_attr_pkt_count_limit_bi_2);
3223			error = device_create_file(dev, &dev_attr_pkt_count_limit_bo_2);
3224			error = device_create_file(dev, &dev_attr_bandwidth_hs_1);
3225			error = device_create_file(dev, &dev_attr_bandwidth_fs_1);
3226			error = device_create_file(dev, &dev_attr_bandwidth_ls_1);
3227			error = device_create_file(dev, &dev_attr_bandwidth_hs_2);
3228			error = device_create_file(dev, &dev_attr_bandwidth_fs_2);
3229			error = device_create_file(dev, &dev_attr_bandwidth_ls_2);
3230		#else
3231			error = ifx_proc_addproc("pkt_count_limit_bi", procfs_pkt_count_limit_bi_show, procfs_pkt_count_limit_bi_store);
3232			error = ifx_proc_addproc("pkt_count_limit_bo", procfs_pkt_count_limit_bo_show, procfs_pkt_count_limit_bo_store);
3233			error = ifx_proc_addproc("bandwidth_hs", procfs_bandwidth_hs_show, procfs_bandwidth_hs_store);
3234			error = ifx_proc_addproc("bandwidth_fs", procfs_bandwidth_fs_show, procfs_bandwidth_fs_store);
3235			error = ifx_proc_addproc("bandwidth_ls", procfs_bandwidth_ls_show, procfs_bandwidth_ls_store);
3236			error = device_create_file(dev, &dev_attr_pkt_count_limit_bi);
3237			error = device_create_file(dev, &dev_attr_pkt_count_limit_bo);
3238			error = device_create_file(dev, &dev_attr_bandwidth_hs);
3239			error = device_create_file(dev, &dev_attr_bandwidth_fs);
3240			error = device_create_file(dev, &dev_attr_bandwidth_ls);
3241		#endif
3242
3243		#ifdef __IS_DUAL__
3244			error = ifx_proc_addproc("buspower_1", procfs_buspower_show_1, procfs_buspower_store_1);
3245			error = ifx_proc_addproc("buspower_2", procfs_buspower_show_2, procfs_buspower_store_2);
3246			error = device_create_file(dev, &dev_attr_buspower_1);
3247			error = device_create_file(dev, &dev_attr_buspower_2);
3248		#else
3249			error = ifx_proc_addproc("buspower", procfs_buspower_show, procfs_buspower_store);
3250			error = device_create_file(dev, &dev_attr_buspower);
3251		#endif
3252
3253		#ifdef __IS_DUAL__
3254			error = ifx_proc_addproc("bussuspend_1", procfs_bussuspend_show_1, NULL);
3255			error = ifx_proc_addproc("bussuspend_2", procfs_bussuspend_show_2, NULL);
3256			error = device_create_file(dev, &dev_attr_bussuspend_1);
3257			error = device_create_file(dev, &dev_attr_bussuspend_2);
3258		#else
3259			error = ifx_proc_addproc("bussuspend", procfs_bussuspend_show, NULL);
3260			error = device_create_file(dev, &dev_attr_bussuspend);
3261		#endif
3262
3263		#ifdef __IS_DUAL__
3264			error = ifx_proc_addproc("busconnected_1", procfs_busconnected_show_1, NULL);
3265			error = ifx_proc_addproc("busconnected_2", procfs_busconnected_show_2, NULL);
3266			error = device_create_file(dev, &dev_attr_busconnected_1);
3267			error = device_create_file(dev, &dev_attr_busconnected_2);
3268		#else
3269			error = ifx_proc_addproc("busconnected", procfs_busconnected_show, NULL);
3270			error = device_create_file(dev, &dev_attr_busconnected);
3271		#endif
3272
3273		#ifdef __IS_DUAL__
3274			error = ifx_proc_addproc("connectspeed_1", procfs_connectspeed_show_1, NULL);
3275			error = ifx_proc_addproc("connectspeed_2", procfs_connectspeed_show_2, NULL);
3276			error = device_create_file(dev, &dev_attr_connectspeed_1);
3277			error = device_create_file(dev, &dev_attr_connectspeed_2);
3278		#else
3279			error = ifx_proc_addproc("connectspeed", procfs_connectspeed_show, NULL);
3280			error = device_create_file(dev, &dev_attr_connectspeed);
3281		#endif
3282	#endif
3283
3284	#ifdef __IS_DEVICE__
3285		error = ifx_proc_addproc("devspeed", procfs_devspeed_show, NULL);
3286		error = device_create_file(dev, &dev_attr_devspeed);
3287		error = ifx_proc_addproc("enumspeed", procfs_enumspeed_show, NULL);
3288		error = device_create_file(dev, &dev_attr_enumspeed);
3289	#endif
3290
3291	//////////////////////////////////////////////////////
3292	#ifdef __ENABLE_DUMP__
3293
3294		#ifdef __IS_HOST__
3295			#ifdef __IS_DUAL__
3296				error = ifx_proc_addproc("dump_reg_1", procfs_dump_reg_show_1, NULL);
3297				error = ifx_proc_addproc("dump_reg_2", procfs_dump_reg_show_2, NULL);
3298				error = device_create_file(dev, &dev_attr_dump_reg_h_1);
3299				error = device_create_file(dev, &dev_attr_dump_reg_h_2);
3300			#else
3301				error = ifx_proc_addproc("dump_reg", procfs_dump_reg_show, NULL);
3302				error = device_create_file(dev, &dev_attr_dump_reg_h);
3303			#endif
3304
3305			#ifdef __IS_DUAL__
3306				error = ifx_proc_addproc("dump_spram_1", procfs_dump_spram_show_1, NULL);
3307				error = ifx_proc_addproc("dump_spram_2", procfs_dump_spram_show_2, NULL);
3308				error = device_create_file(dev, &dev_attr_dump_spram_h_1);
3309				error = device_create_file(dev, &dev_attr_dump_spram_h_2);
3310			#else
3311				error = ifx_proc_addproc("dump_spram", procfs_dump_spram_show, NULL);
3312				error = device_create_file(dev, &dev_attr_dump_spram_h);
3313			#endif
3314
3315			#ifdef __IS_DUAL__
3316				error = ifx_proc_addproc("dump_host_state_1", procfs_dump_host_state_show_1, NULL);
3317				error = ifx_proc_addproc("dump_host_state_2", procfs_dump_host_state_show_2, NULL);
3318				error = device_create_file(dev, &dev_attr_dump_host_state_1);
3319				error = device_create_file(dev, &dev_attr_dump_host_state_2);
3320			#else
3321				error = ifx_proc_addproc("dump_host_state", procfs_dump_host_state_show, NULL);
3322				error = device_create_file(dev, &dev_attr_dump_host_state);
3323			#endif
3324		#else
3325			error = ifx_proc_addproc("dump_reg", procfs_dump_reg_show, NULL);
3326			error = device_create_file(dev, &dev_attr_dump_reg_d);
3327			error = ifx_proc_addproc("dump_spram", procfs_dump_spram_show, NULL);
3328			error = device_create_file(dev, &dev_attr_dump_spram_d);
3329		#endif
3330	#endif //__ENABLE_DUMP__
3331	//////////////////////////////////////////////////////
3332#ifdef __IS_HOST__
3333	#ifdef __IS_DUAL__
3334		error = ifx_proc_addproc("suspend_host_1",NULL, procfs_suspend_host_1_store);
3335		error = device_create_file(dev, &dev_attr_suspend_host_1);
3336
3337		error = ifx_proc_addproc("probe_host_1", procfs_probe_host_1_show, procfs_probe_host_1_store);
3338		error = device_create_file(dev, &dev_attr_probe_host_1);
3339
3340		error = ifx_proc_addproc("suspend_host_2",NULL, procfs_suspend_host_2_store);
3341		error = device_create_file(dev, &dev_attr_suspend_host_2);
3342
3343		error = ifx_proc_addproc("probe_host_2", procfs_probe_host_2_show, procfs_probe_host_2_store);
3344		error = device_create_file(dev, &dev_attr_probe_host_2);
3345
3346		error = ifx_proc_addproc("probe_timer1", procfs_probe_timer1_val_show, procfs_probe_timer1_val_store);
3347		error = device_create_file(dev, &dev_attr_probe_timer1_val_h);
3348
3349		error = ifx_proc_addproc("probe_timer2", procfs_probe_timer2_val_show, procfs_probe_timer2_val_store);
3350		error = device_create_file(dev, &dev_attr_probe_timer2_val_h);
3351
3352		error = ifx_proc_addproc("autoprobe_timer1", procfs_autoprobe_timer1_val_show, procfs_autoprobe_timer1_val_store);
3353		error = device_create_file(dev, &dev_attr_autoprobe_timer1_val_h);
3354
3355		error = ifx_proc_addproc("autoprobe_timer2", procfs_autoprobe_timer2_val_show, procfs_autoprobe_timer2_val_store);
3356		error = device_create_file(dev, &dev_attr_autoprobe_timer2_val_h);
3357	#else
3358		error = ifx_proc_addproc("suspend_host",NULL, procfs_suspend_host_store);
3359		error = device_create_file(dev, &dev_attr_suspend_host);
3360
3361		error = ifx_proc_addproc("probe_host", procfs_probe_host_show, procfs_probe_host_store);
3362		error = device_create_file(dev, &dev_attr_probe_host);
3363
3364		error = ifx_proc_addproc("probe_timer", procfs_probe_timer_val_show, procfs_probe_timer_val_store);
3365		error = device_create_file(dev, &dev_attr_probe_timer_val_h);
3366
3367		error = ifx_proc_addproc("autoprobe_timer", procfs_autoprobe_timer_val_show, procfs_autoprobe_timer_val_store);
3368		error = device_create_file(dev, &dev_attr_autoprobe_timer_val_h);
3369	#endif
3370#endif
3371
3372#ifdef __IS_DEVICE__
3373	error = ifx_proc_addproc("suspend_device",NULL, procfs_suspend_device_store);
3374	error = device_create_file(dev, &dev_attr_suspend_device);
3375
3376	error = ifx_proc_addproc("probe_device", procfs_probe_device_show, procfs_probe_device_store);
3377	error = device_create_file(dev, &dev_attr_probe_device);
3378
3379	error = ifx_proc_addproc("probe_timer", procfs_probe_timer_val_show, procfs_probe_timer_val_store);
3380	error = device_create_file(dev, &dev_attr_probe_timer_val_d);
3381
3382	error = ifx_proc_addproc("autoprobe_timer", procfs_autoprobe_timer_val_show, procfs_autoprobe_timer_val_store);
3383	error = device_create_file(dev, &dev_attr_autoprobe_timer_val_d);
3384#endif
3385#if defined(__IS_HOST__) && defined(__HOST_COC__)
3386	#ifdef __IS_DUAL__
3387	   memset (&pmcuRegisterUSBHost_1, 0, sizeof(pmcuRegisterUSBHost_1));
3388	   memset (&pmcuRegisterUSBHost_2, 0, sizeof(pmcuRegisterUSBHost_2));
3389	   pmcuRegisterUSBHost_1.pmcuModule=
3390	   pmcuRegisterUSBHost_2.pmcuModule=IFX_PMCU_MODULE_USB;
3391	   pmcuRegisterUSBHost_1.pmcuModuleNr=1;
3392	   pmcuRegisterUSBHost_2.pmcuModuleNr=2;
3393	   pmcuRegisterUSBHost_1.pmcuModuleDep = &depListUSBHost_1;
3394	   pmcuRegisterUSBHost_2.pmcuModuleDep = &depListUSBHost_2;
3395	   pmcuRegisterUSBHost_1.pre = ifx_usbhost_preChange_1;
3396	   pmcuRegisterUSBHost_2.pre = ifx_usbhost_preChange_2;
3397	   pmcuRegisterUSBHost_1.post = ifx_usbhost_postChange_1;
3398	   pmcuRegisterUSBHost_2.post = ifx_usbhost_postChange_2;
3399	   pmcuRegisterUSBHost_1.ifx_pmcu_state_change = ifx_usbhost_stateChange_1;
3400	   pmcuRegisterUSBHost_2.ifx_pmcu_state_change = ifx_usbhost_stateChange_2;
3401	   pmcuRegisterUSBHost_1.ifx_pmcu_state_get = ifx_usbhost_stateGet_1;
3402	   pmcuRegisterUSBHost_2.ifx_pmcu_state_get = ifx_usbhost_stateGet_2;
3403	   pmcuRegisterUSBHost_1.ifx_pmcu_pwr_feature_switch = ifx_usbhost_pwrFeatureSwitch_1;
3404	   pmcuRegisterUSBHost_2.ifx_pmcu_pwr_feature_switch = ifx_usbhost_pwrFeatureSwitch_2;
3405	   ifx_pmcu_register ( &pmcuRegisterUSBHost_1 );
3406	   ifx_pmcu_register ( &pmcuRegisterUSBHost_2 );
3407	#else
3408	   memset (&pmcuRegisterUSBHost, 0, sizeof(pmcuRegisterUSBHost));
3409	   pmcuRegisterUSBHost.pmcuModule=IFX_PMCU_MODULE_USB;
3410	   pmcuRegisterUSBHost.pmcuModuleNr=1;
3411	   pmcuRegisterUSBHost.pmcuModuleDep = &depListUSBHost;
3412	   pmcuRegisterUSBHost.pre = ifx_usbhost_preChange;
3413	   pmcuRegisterUSBHost.post = ifx_usbhost_postChange;
3414	   pmcuRegisterUSBHost.ifx_pmcu_state_change = ifx_usbhost_stateChange;
3415	   pmcuRegisterUSBHost.ifx_pmcu_state_get = ifx_usbhost_stateGet;
3416	   pmcuRegisterUSBHost.ifx_pmcu_pwr_feature_switch = ifx_usbhost_pwrFeatureSwitch;
3417	   ifx_pmcu_register ( &pmcuRegisterUSBHost );
3418	#endif
3419#endif
3420#if defined(__IS_DEVICE__) && defined(__GADGET_COC__)
3421	   memset (&pmcuRegisterUSBGadget, 0, sizeof(pmcuRegisterUSBGadget));
3422	   pmcuRegisterUSBGadget.pmcuModule=IFX_PMCU_MODULE_USB;
3423	   pmcuRegisterUSBGadget.pmcuModuleNr=0;
3424	   pmcuRegisterUSBGadget.pmcuModuleDep = &depListUSBGadget;
3425	   pmcuRegisterUSBGadget.pre = ifx_usbgadget_preChange;
3426	   pmcuRegisterUSBGadget.post = ifx_usbgadget_postChange;
3427	   pmcuRegisterUSBGadget.ifx_pmcu_state_change = ifx_usbgadget_stateChange;
3428	   pmcuRegisterUSBGadget.ifx_pmcu_state_get = ifx_usbgadget_stateGet;
3429	   pmcuRegisterUSBGadget.ifx_pmcu_pwr_feature_switch = ifx_usbgadget_pwrFeatureSwitch;
3430	   ifx_pmcu_register ( &pmcuRegisterUSBGadget );
3431#endif
3432}
3433
3434
3435/*!
3436  \brief This function remove the sysfs and procfs entries
3437  \param[in] _dev Pointer of device structure, if applied
3438 */
3439#ifdef __IS_HOST__
3440void ifxusb_attr_remove_h (void *_dev)
3441#else
3442void ifxusb_attr_remove_d (void *_dev)
3443#endif
3444{
3445	struct device *dev = (struct device *) _dev;
3446
3447	IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
3448	ifx_proc_delproc("dbglevel");
3449	#ifdef __IS_HOST__
3450	device_remove_file(dev, &dev_attr_dbglevel_h);
3451	#else
3452	device_remove_file(dev, &dev_attr_dbglevel_d);
3453	#endif
3454
3455	#ifdef __IS_HOST__
3456		#ifdef __IS_DUAL__
3457			ifx_proc_delproc("dump_params_1");
3458			ifx_proc_delproc("dump_params_2");
3459			device_remove_file(dev, &dev_attr_dump_params_h_1);
3460			device_remove_file(dev, &dev_attr_dump_params_h_2);
3461		#else
3462			ifx_proc_delproc("dump_params");
3463			device_remove_file(dev, &dev_attr_dump_params_h);
3464		#endif
3465
3466		#ifdef __IS_DUAL__
3467			ifx_proc_delproc("mode_1");
3468			ifx_proc_delproc("mode_2");
3469			device_remove_file(dev, &dev_attr_mode_h_1);
3470			device_remove_file(dev, &dev_attr_mode_h_2);
3471		#else
3472			ifx_proc_delproc("mode");
3473			device_remove_file(dev, &dev_attr_mode_h);
3474		#endif
3475	#else
3476		ifx_proc_delproc("dump_params");
3477		device_remove_file(dev, &dev_attr_dump_params_d);
3478		ifx_proc_delproc("mode");
3479		device_remove_file(dev, &dev_attr_mode_d);
3480	#endif
3481
3482	#ifdef __IS_HOST__
3483		ifx_proc_delproc("version");
3484		device_remove_file(dev, &dev_attr_version_h);
3485	#else
3486		ifx_proc_delproc("version");
3487		device_remove_file(dev, &dev_attr_version_d);
3488	#endif
3489
3490
3491	#ifdef __IS_HOST__
3492		#ifdef __IS_DUAL__
3493			ifx_proc_delproc("pkt_count_limit_bi_1");
3494			ifx_proc_delproc("pkt_count_limit_bo_1");
3495			ifx_proc_delproc("pkt_count_limit_bi_2");
3496			ifx_proc_delproc("pkt_count_limit_bo_2");
3497			ifx_proc_delproc("bandwidth_hs_1");
3498			ifx_proc_delproc("bandwidth_fs_1");
3499			ifx_proc_delproc("bandwidth_ls_1");
3500			ifx_proc_delproc("bandwidth_hs_2");
3501			ifx_proc_delproc("bandwidth_fs_2");
3502			ifx_proc_delproc("bandwidth_ls_2");
3503			device_remove_file(dev, &dev_attr_pkt_count_limit_bi_1);
3504			device_remove_file(dev, &dev_attr_pkt_count_limit_bo_1);
3505			device_remove_file(dev, &dev_attr_pkt_count_limit_bi_2);
3506			device_remove_file(dev, &dev_attr_pkt_count_limit_bo_2);
3507			device_remove_file(dev, &dev_attr_bandwidth_hs_1);
3508			device_remove_file(dev, &dev_attr_bandwidth_fs_1);
3509			device_remove_file(dev, &dev_attr_bandwidth_ls_1);
3510			device_remove_file(dev, &dev_attr_bandwidth_hs_2);
3511			device_remove_file(dev, &dev_attr_bandwidth_fs_2);
3512			device_remove_file(dev, &dev_attr_bandwidth_ls_2);
3513		#else
3514			ifx_proc_delproc("pkt_count_limit_bi");
3515			ifx_proc_delproc("pkt_count_limit_bo");
3516			ifx_proc_delproc("bandwidth_hs");
3517			ifx_proc_delproc("bandwidth_fs");
3518			ifx_proc_delproc("bandwidth_ls");
3519			device_remove_file(dev, &dev_attr_pkt_count_limit_bi);
3520			device_remove_file(dev, &dev_attr_pkt_count_limit_bo);
3521			device_remove_file(dev, &dev_attr_bandwidth_hs);
3522			device_remove_file(dev, &dev_attr_bandwidth_fs);
3523			device_remove_file(dev, &dev_attr_bandwidth_ls);
3524		#endif
3525	#endif
3526
3527	#ifdef __IS_HOST__
3528		#ifdef __IS_DUAL__
3529			ifx_proc_delproc("buspower_1");
3530			ifx_proc_delproc("buspower_2");
3531			device_remove_file(dev, &dev_attr_buspower_1);
3532			device_remove_file(dev, &dev_attr_buspower_2);
3533		#else
3534			ifx_proc_delproc("buspower");
3535			device_remove_file(dev, &dev_attr_buspower);
3536		#endif
3537
3538		#ifdef __IS_DUAL__
3539			ifx_proc_delproc("bussuspend_1");
3540			ifx_proc_delproc("bussuspend_2");
3541			device_remove_file(dev, &dev_attr_bussuspend_1);
3542			device_remove_file(dev, &dev_attr_bussuspend_2);
3543		#else
3544			ifx_proc_delproc("bussuspend");
3545			device_remove_file(dev, &dev_attr_bussuspend);
3546		#endif
3547
3548		#ifdef __IS_DUAL__
3549			ifx_proc_delproc("busconnected_1");
3550			ifx_proc_delproc("busconnected_2");
3551			device_remove_file(dev, &dev_attr_busconnected_1);
3552			device_remove_file(dev, &dev_attr_busconnected_2);
3553		#else
3554			ifx_proc_delproc("busconnected");
3555			device_remove_file(dev, &dev_attr_busconnected);
3556		#endif
3557
3558		#ifdef __IS_DUAL__
3559			ifx_proc_delproc("connectspeed_1");
3560			ifx_proc_delproc("connectspeed_2");
3561			device_remove_file(dev, &dev_attr_connectspeed_1);
3562			device_remove_file(dev, &dev_attr_connectspeed_2);
3563		#else
3564			ifx_proc_delproc("connectspeed");
3565			device_remove_file(dev, &dev_attr_connectspeed);
3566		#endif
3567	#endif
3568
3569	#ifdef __IS_DEVICE__
3570		ifx_proc_delproc("devspeed");
3571		device_remove_file(dev, &dev_attr_devspeed);
3572		ifx_proc_delproc("enumspeed");
3573		device_remove_file(dev, &dev_attr_enumspeed);
3574	#endif
3575
3576	#ifdef __ENABLE_DUMP__
3577		#ifdef __IS_HOST__
3578			#ifdef __IS_DUAL__
3579				ifx_proc_delproc("dump_reg_1");
3580				ifx_proc_delproc("dump_reg_2");
3581				device_remove_file(dev, &dev_attr_dump_reg_h_1);
3582				device_remove_file(dev, &dev_attr_dump_reg_h_2);
3583			#else
3584				ifx_proc_delproc("dump_reg");
3585				device_remove_file(dev, &dev_attr_dump_reg_h);
3586			#endif
3587
3588			#ifdef __IS_DUAL__
3589				ifx_proc_delproc("dump_spram_1");
3590				ifx_proc_delproc("dump_spram_2");
3591				device_remove_file(dev, &dev_attr_dump_spram_h_1);
3592				device_remove_file(dev, &dev_attr_dump_spram_h_2);
3593			#else
3594				ifx_proc_delproc("dump_spram");
3595				device_remove_file(dev, &dev_attr_dump_spram_h);
3596			#endif
3597
3598			#ifdef __IS_DUAL__
3599				ifx_proc_delproc("dump_host_state_1");
3600				ifx_proc_delproc("dump_host_state_2");
3601				device_remove_file(dev, &dev_attr_dump_host_state_1);
3602				device_remove_file(dev, &dev_attr_dump_host_state_2);
3603			#else
3604				ifx_proc_delproc("dump_host_state");
3605				device_remove_file(dev, &dev_attr_dump_host_state);
3606			#endif
3607		#else
3608			ifx_proc_delproc("dump_reg");
3609			device_remove_file(dev, &dev_attr_dump_reg_d);
3610			ifx_proc_delproc("dump_spram");
3611			device_remove_file(dev, &dev_attr_dump_spram_d);
3612		#endif
3613
3614		#ifdef __IS_HOST__
3615		#endif
3616	#endif //__ENABLE_DUMP__
3617#ifdef __IS_HOST__
3618	#ifdef __IS_DUAL__
3619		ifx_proc_delproc("suspend_host_1");
3620		ifx_proc_delproc("probe_host_1");
3621		device_remove_file(dev, &dev_attr_suspend_host_1);
3622		device_remove_file(dev, &dev_attr_probe_host_1);
3623		ifx_proc_delproc("suspend_host_2");
3624		ifx_proc_delproc("probe_host_2");
3625		device_remove_file(dev, &dev_attr_suspend_host_2);
3626		device_remove_file(dev, &dev_attr_probe_host_2);
3627		ifx_proc_delproc("probe_timer1");
3628		ifx_proc_delproc("autoprobe_timer1");
3629		device_remove_file(dev, &dev_attr_probe_timer1_val_h);
3630		device_remove_file(dev, &dev_attr_autoprobe_timer1_val_h);
3631		ifx_proc_delproc("probe_timer2");
3632		ifx_proc_delproc("autoprobe_timer2");
3633		device_remove_file(dev, &dev_attr_probe_timer2_val_h);
3634		device_remove_file(dev, &dev_attr_autoprobe_timer2_val_h);
3635	#else
3636		ifx_proc_delproc("suspend_host");
3637		ifx_proc_delproc("probe_host");
3638		device_remove_file(dev, &dev_attr_suspend_host);
3639		device_remove_file(dev, &dev_attr_probe_host);
3640		ifx_proc_delproc("probe_timer");
3641		ifx_proc_delproc("autoprobe_timer");
3642		device_remove_file(dev, &dev_attr_probe_timer_val_h);
3643		device_remove_file(dev, &dev_attr_autoprobe_timer_val_h);
3644	#endif
3645	remove_proc_entry(ifxusb_hcd_driver_name, (void *)0);
3646#endif
3647
3648#ifdef __IS_DEVICE__
3649	ifx_proc_delproc("suspend_device");
3650	ifx_proc_delproc("probe_device");
3651	device_remove_file(dev, &dev_attr_suspend_device);
3652	device_remove_file(dev, &dev_attr_probe_device);
3653	ifx_proc_delproc("probe_timer");
3654	ifx_proc_delproc("autoprobe_timer");
3655	device_remove_file(dev, &dev_attr_probe_timer_val_d);
3656	device_remove_file(dev, &dev_attr_autoprobe_timer_val_d);
3657	remove_proc_entry(ifxusb_pcd_driver_name, (void *)0);
3658#endif
3659#if defined(__IS_HOST__) && defined(__HOST_COC__)
3660	#ifdef __IS_DUAL__
3661	   ifx_pmcu_unregister ( &pmcuRegisterUSBHost_1 );
3662	   ifx_pmcu_unregister ( &pmcuRegisterUSBHost_2 );
3663	#else
3664	   ifx_pmcu_unregister ( &pmcuRegisterUSBHost );
3665	#endif
3666#endif
3667#if defined(__IS_DEVICE__) && defined(__GADGET_COC__)
3668	   ifx_pmcu_unregister ( &pmcuRegisterUSBGadget );
3669#endif
3670
3671}
3672
3673static struct proc_dir_entry * proc_ifx_root = NULL;
3674
3675/* initialize the proc file system and make a dir named /proc/[name] */
3676static void ifx_proc_init(void)
3677{
3678	IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
3679#ifdef __IS_HOST__
3680	proc_ifx_root = proc_mkdir(ifxusb_hcd_driver_name, (void *)0);
3681	if (!proc_ifx_root){
3682		IFX_PRINT("%s proc initialization failed! \n", ifxusb_hcd_driver_name);
3683		return;
3684	}
3685#else
3686	proc_ifx_root = proc_mkdir(ifxusb_pcd_driver_name, (void *)0);
3687	if (!proc_ifx_root){
3688		IFX_PRINT("%s proc initialization failed! \n", ifxusb_pcd_driver_name);
3689		return;
3690	}
3691#endif
3692}
3693
3694/* proc file system add function for debugging. */
3695static int ifx_proc_addproc(char *funcname, read_proc_t *hookfuncr, write_proc_t *hookfuncw)
3696{
3697	struct proc_dir_entry *pe;
3698	IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
3699	if (!proc_ifx_root)
3700		ifx_proc_init();
3701
3702	if (hookfuncw == NULL)
3703	{
3704		pe = create_proc_read_entry(funcname, S_IRUGO, proc_ifx_root, hookfuncr, NULL);
3705		if (!pe)
3706		{
3707			IFX_PRINT("ERROR in creating read proc entry (%s)! \n", funcname);
3708			return -1;
3709		}
3710	}
3711	else
3712	{
3713		pe = create_proc_entry(funcname, S_IRUGO | S_IWUGO, proc_ifx_root);
3714		if (pe)
3715		{
3716			pe->read_proc = hookfuncr;
3717			pe->write_proc = hookfuncw;
3718		}
3719		else
3720		{
3721			IFX_PRINT("ERROR in creating proc entry (%s)! \n", funcname);
3722			return -1;
3723		}
3724	}
3725	return 0;
3726}
3727
3728
3729/* proc file system del function for removing module. */
3730static void ifx_proc_delproc(char *funcname)
3731{
3732	char pname[30];
3733	IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ );
3734	sprintf(pname, "%s", funcname);
3735
3736	remove_proc_entry(pname, proc_ifx_root);
3737
3738}
3739
3740static void ifxusb_dump_params(ifxusb_core_if_t *_core_if)
3741{
3742	ifxusb_params_t *params=&_core_if->params;
3743
3744	#ifdef __IS_HOST__
3745		IFX_PRINT("IFXUSB Dump Parameters ( Host Mode) \n");
3746	#endif //__IS_HOST__
3747	#ifdef __IS_DEVICE__
3748		IFX_PRINT("IFXUSB Dump Parameters ( Device Mode) \n");
3749	#endif //__IS_DEVICE__
3750
3751	#ifdef __DESC_DMA__
3752		IFX_PRINT("DMA: Hermes DMA\n");
3753	#else
3754		IFX_PRINT("DMA: Non-Desc DMA\n");
3755	#endif
3756	IFX_PRINT("     Burst size: %d\n",params->dma_burst_size);
3757
3758	if     (params->speed==1)
3759		IFX_PRINT("Full Speed only\n");
3760	else if(params->speed==0)
3761		IFX_PRINT("Full/Hign Speed\n");
3762	else
3763		IFX_PRINT("Unkonwn setting (%d) for Speed\n",params->speed);
3764
3765	IFX_PRINT("Total Data FIFO size: %d(0x%06X) DWord, %d(0x%06X) Bytes\n",
3766		params->data_fifo_size,params->data_fifo_size,
3767		params->data_fifo_size*4, params->data_fifo_size*4
3768	);
3769
3770	#ifdef __IS_DEVICE__
3771		IFX_PRINT("Rx FIFO size: %d(0x%06X) DWord, %d(0x%06X) Bytes\n",
3772			params->rx_fifo_size,params->rx_fifo_size,
3773			params->rx_fifo_size*4, params->rx_fifo_size*4
3774		);
3775		{
3776			int i;
3777			for(i=0;i<MAX_EPS_CHANNELS;i++)
3778			{
3779				IFX_PRINT("Tx FIFO #%d size: %d(0x%06X) DWord, %d(0x%06X) Bytes\n",i,
3780					params->tx_fifo_size[i],params->tx_fifo_size[i],
3781					params->tx_fifo_size[i]*4, params->tx_fifo_size[i]*4
3782				);
3783			}
3784		}
3785		#ifdef __DED_FIFO__
3786			IFX_PRINT("Treshold : %s Rx:%d Tx:%d \n",
3787				(params->thr_ctl)?"On":"Off",params->tx_thr_length,params->rx_thr_length);
3788		#endif
3789	#else //__IS_HOST__
3790		IFX_PRINT("Host Channels: %d\n",params->host_channels);
3791
3792		IFX_PRINT("Rx FIFO size: %d(0x%06X) DWord, %d(0x%06X) Bytes\n",
3793			params->data_fifo_size,params->data_fifo_size,
3794			params->data_fifo_size*4, params->data_fifo_size*4
3795		);
3796
3797		IFX_PRINT("NP Tx FIFO size: %d(0x%06X) DWord, %d(0x%06X) Bytes\n",
3798			params->nperio_tx_fifo_size,params->nperio_tx_fifo_size,
3799			params->nperio_tx_fifo_size*4, params->nperio_tx_fifo_size*4
3800		);
3801
3802		IFX_PRINT(" P Tx FIFO size: %d(0x%06X) DWord, %d(0x%06X) Bytes\n",
3803			params->perio_tx_fifo_size,params->perio_tx_fifo_size,
3804			params->perio_tx_fifo_size*4, params->perio_tx_fifo_size*4
3805		);
3806	#endif //__IS_HOST__
3807
3808	IFX_PRINT("Max Transfer size: %d(0x%06X) Bytes\n",
3809		params->max_transfer_size,params->max_transfer_size
3810	);
3811	IFX_PRINT("Max Packet Count: %d(0x%06X)\n",
3812		params->max_packet_count,params->max_packet_count
3813	);
3814
3815	IFX_PRINT("PHY UTMI Width: %d\n",params->phy_utmi_width);
3816
3817	IFX_PRINT("Turn Around Time: HS:%d FS:%d\n",params->turn_around_time_hs,params->turn_around_time_fs);
3818	IFX_PRINT("Timeout Calibration: HS:%d FS:%d\n",params->timeout_cal_hs,params->timeout_cal_fs);
3819
3820
3821	IFX_PRINT("==================================================\n");
3822	IFX_PRINT("End of Parameters Dump\n");
3823	IFX_PRINT("==================================================\n");
3824}
3825
3826