2 * Freescale QUICC Engine USB Host Controller Driver
4 * Copyright (c) Freescale Semicondutor, Inc. 2006.
5 * Shlomi Gridish <gridish@freescale.com>
6 * Jerry Huang <Chang-Ming.Huang@freescale.com>
7 * Copyright (c) Logic Product Development, Inc. 2007
8 * Peter Barada <peterb@logicpd.com>
9 * Copyright (c) MontaVista Software, Inc. 2008.
10 * Anton Vorontsov <avorontsov@ru.mvista.com>
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the
14 * Free Software Foundation; either version 2 of the License, or (at your
15 * option) any later version.
18 #include <linux/module.h>
19 #include <linux/types.h>
20 #include <linux/spinlock.h>
21 #include <linux/kernel.h>
22 #include <linux/delay.h>
23 #include <linux/errno.h>
24 #include <linux/list.h>
25 #include <linux/interrupt.h>
27 #include <linux/usb.h>
28 #include <linux/of_platform.h>
29 #include <linux/of_gpio.h>
31 #include <asm/fsl_gtm.h>
32 #include "../core/hcd.h"
35 void fhci_start_sof_timer(struct fhci_hcd
*fhci
)
37 fhci_dbg(fhci
, "-> %s\n", __func__
);
40 out_be16(&fhci
->pram
->frame_num
, 0);
42 out_be16(&fhci
->regs
->usb_sof_tmr
, 0);
43 setbits8(&fhci
->regs
->usb_mod
, USB_MODE_SFTE
);
45 fhci_dbg(fhci
, "<- %s\n", __func__
);
48 void fhci_stop_sof_timer(struct fhci_hcd
*fhci
)
50 fhci_dbg(fhci
, "-> %s\n", __func__
);
52 clrbits8(&fhci
->regs
->usb_mod
, USB_MODE_SFTE
);
53 gtm_stop_timer16(fhci
->timer
);
55 fhci_dbg(fhci
, "<- %s\n", __func__
);
58 u16
fhci_get_sof_timer_count(struct fhci_usb
*usb
)
60 return be16_to_cpu(in_be16(&usb
->fhci
->regs
->usb_sof_tmr
) / 12);
63 /* initialize the endpoint zero */
64 static u32
endpoint_zero_init(struct fhci_usb
*usb
,
65 enum fhci_mem_alloc data_mem
,
70 rc
= fhci_create_ep(usb
, data_mem
, ring_len
);
74 /* inilialize endpoint registers */
75 fhci_init_ep_registers(usb
, usb
->ep0
, data_mem
);
80 /* enable the USB interrupts */
81 void fhci_usb_enable_interrupt(struct fhci_usb
*usb
)
83 struct fhci_hcd
*fhci
= usb
->fhci
;
85 if (usb
->intr_nesting_cnt
== 1) {
86 /* initialize the USB interrupt */
87 enable_irq(fhci_to_hcd(fhci
)->irq
);
89 /* initialize the event register and mask register */
90 out_be16(&usb
->fhci
->regs
->usb_event
, 0xffff);
91 out_be16(&usb
->fhci
->regs
->usb_mask
, usb
->saved_msk
);
93 /* enable the timer interrupts */
94 enable_irq(fhci
->timer
->irq
);
95 } else if (usb
->intr_nesting_cnt
> 1)
96 fhci_info(fhci
, "unbalanced USB interrupts nesting\n");
97 usb
->intr_nesting_cnt
--;
100 /* diable the usb interrupt */
101 void fhci_usb_disable_interrupt(struct fhci_usb
*usb
)
103 struct fhci_hcd
*fhci
= usb
->fhci
;
105 if (usb
->intr_nesting_cnt
== 0) {
106 /* diable the timer interrupt */
107 disable_irq_nosync(fhci
->timer
->irq
);
109 /* disable the usb interrupt */
110 disable_irq_nosync(fhci_to_hcd(fhci
)->irq
);
111 out_be16(&usb
->fhci
->regs
->usb_mask
, 0);
113 usb
->intr_nesting_cnt
++;
116 /* enable the USB controller */
117 static u32
fhci_usb_enable(struct fhci_hcd
*fhci
)
119 struct fhci_usb
*usb
= fhci
->usb_lld
;
121 out_be16(&usb
->fhci
->regs
->usb_event
, 0xffff);
122 out_be16(&usb
->fhci
->regs
->usb_mask
, usb
->saved_msk
);
123 setbits8(&usb
->fhci
->regs
->usb_mod
, USB_MODE_EN
);
130 /* disable the USB controller */
131 static u32
fhci_usb_disable(struct fhci_hcd
*fhci
)
133 struct fhci_usb
*usb
= fhci
->usb_lld
;
135 fhci_usb_disable_interrupt(usb
);
136 fhci_port_disable(fhci
);
138 /* disable the usb controller */
139 if (usb
->port_status
== FHCI_PORT_FULL
||
140 usb
->port_status
== FHCI_PORT_LOW
)
141 fhci_device_disconnected_interrupt(fhci
);
143 clrbits8(&usb
->fhci
->regs
->usb_mod
, USB_MODE_EN
);
148 /* check the bus state by polling the QE bit on the IO ports */
149 int fhci_ioports_check_bus_state(struct fhci_hcd
*fhci
)
153 /* check USBOE,if transmitting,exit */
154 if (!gpio_get_value(fhci
->gpios
[GPIO_USBOE
]))
158 if (gpio_get_value(fhci
->gpios
[GPIO_USBRP
]))
162 if (gpio_get_value(fhci
->gpios
[GPIO_USBRN
]))
168 static void fhci_mem_free(struct fhci_hcd
*fhci
)
175 list_for_each_entry_safe(ed
, next_ed
, &fhci
->empty_eds
, node
) {
180 list_for_each_entry_safe(td
, next_td
, &fhci
->empty_tds
, node
) {
185 kfree(fhci
->vroot_hub
);
186 fhci
->vroot_hub
= NULL
;
188 kfree(fhci
->hc_list
);
189 fhci
->hc_list
= NULL
;
192 static int fhci_mem_init(struct fhci_hcd
*fhci
)
196 fhci
->hc_list
= kzalloc(sizeof(*fhci
->hc_list
), GFP_KERNEL
);
200 INIT_LIST_HEAD(&fhci
->hc_list
->ctrl_list
);
201 INIT_LIST_HEAD(&fhci
->hc_list
->bulk_list
);
202 INIT_LIST_HEAD(&fhci
->hc_list
->iso_list
);
203 INIT_LIST_HEAD(&fhci
->hc_list
->intr_list
);
204 INIT_LIST_HEAD(&fhci
->hc_list
->done_list
);
206 fhci
->vroot_hub
= kzalloc(sizeof(*fhci
->vroot_hub
), GFP_KERNEL
);
207 if (!fhci
->vroot_hub
)
210 INIT_LIST_HEAD(&fhci
->empty_eds
);
211 INIT_LIST_HEAD(&fhci
->empty_tds
);
213 /* initialize work queue to handle done list */
214 fhci_tasklet
.data
= (unsigned long)fhci
;
215 fhci
->process_done_task
= &fhci_tasklet
;
217 for (i
= 0; i
< MAX_TDS
; i
++) {
220 td
= kmalloc(sizeof(*td
), GFP_KERNEL
);
223 fhci_recycle_empty_td(fhci
, td
);
225 for (i
= 0; i
< MAX_EDS
; i
++) {
228 ed
= kmalloc(sizeof(*ed
), GFP_KERNEL
);
231 fhci_recycle_empty_ed(fhci
, ed
);
234 fhci
->active_urbs
= 0;
241 /* destroy the fhci_usb structure */
242 static void fhci_usb_free(void *lld
)
244 struct fhci_usb
*usb
= lld
;
245 struct fhci_hcd
*fhci
= usb
->fhci
;
248 fhci_config_transceiver(fhci
, FHCI_PORT_POWER_OFF
);
250 kfree(usb
->actual_frame
);
255 /* initialize the USB */
256 static int fhci_usb_init(struct fhci_hcd
*fhci
)
258 struct fhci_usb
*usb
= fhci
->usb_lld
;
260 memset_io(usb
->fhci
->pram
, 0, FHCI_PRAM_SIZE
);
262 usb
->port_status
= FHCI_PORT_DISABLED
;
263 usb
->max_frame_usage
= FRAME_TIME_USAGE
;
264 usb
->sw_transaction_time
= SW_FIX_TIME_BETWEEN_TRANSACTION
;
266 usb
->actual_frame
= kzalloc(sizeof(*usb
->actual_frame
), GFP_KERNEL
);
267 if (!usb
->actual_frame
) {
272 INIT_LIST_HEAD(&usb
->actual_frame
->tds_list
);
274 /* initializing registers on chip, clear frame number */
275 out_be16(&fhci
->pram
->frame_num
, 0);
278 out_be32(&fhci
->pram
->rx_state
, 0);
280 /* set mask register */
281 usb
->saved_msk
= (USB_E_TXB_MASK
|
284 USB_E_RESET_MASK
| USB_E_SFT_MASK
| USB_E_MSF_MASK
);
286 out_8(&usb
->fhci
->regs
->usb_mod
, USB_MODE_HOST
| USB_MODE_EN
);
288 /* clearing the mask register */
289 out_be16(&usb
->fhci
->regs
->usb_mask
, 0);
291 /* initialing the event register */
292 out_be16(&usb
->fhci
->regs
->usb_event
, 0xffff);
294 if (endpoint_zero_init(usb
, DEFAULT_DATA_MEM
, DEFAULT_RING_LEN
) != 0) {
302 /* initialize the fhci_usb struct and the corresponding data staruct */
303 static struct fhci_usb
*fhci_create_lld(struct fhci_hcd
*fhci
)
305 struct fhci_usb
*usb
;
307 /* allocate memory for SCC data structure */
308 usb
= kzalloc(sizeof(*usb
), GFP_KERNEL
);
310 fhci_err(fhci
, "no memory for SCC data struct\n");
315 usb
->hc_list
= fhci
->hc_list
;
316 usb
->vroot_hub
= fhci
->vroot_hub
;
318 usb
->transfer_confirm
= fhci_transfer_confirm_callback
;
323 static int fhci_start(struct usb_hcd
*hcd
)
326 struct fhci_hcd
*fhci
= hcd_to_fhci(hcd
);
328 ret
= fhci_mem_init(fhci
);
330 fhci_err(fhci
, "failed to allocate memory\n");
334 fhci
->usb_lld
= fhci_create_lld(fhci
);
335 if (!fhci
->usb_lld
) {
336 fhci_err(fhci
, "low level driver config failed\n");
341 ret
= fhci_usb_init(fhci
);
343 fhci_err(fhci
, "low level driver initialize failed\n");
347 spin_lock_init(&fhci
->lock
);
349 /* connect the virtual root hub */
350 fhci
->vroot_hub
->dev_num
= 1; /* this field may be needed to fix */
351 fhci
->vroot_hub
->hub
.wHubStatus
= 0;
352 fhci
->vroot_hub
->hub
.wHubChange
= 0;
353 fhci
->vroot_hub
->port
.wPortStatus
= 0;
354 fhci
->vroot_hub
->port
.wPortChange
= 0;
356 hcd
->state
= HC_STATE_RUNNING
;
359 * From here on, khubd concurrently accesses the root
360 * hub; drivers will be talking to enumerated devices.
361 * (On restart paths, khubd already knows about the root
362 * hub and could find work as soon as we wrote FLAG_CF.)
364 * Before this point the HC was idle/ready. After, khubd
365 * and device drivers may start it running.
367 fhci_usb_enable(fhci
);
374 static void fhci_stop(struct usb_hcd
*hcd
)
376 struct fhci_hcd
*fhci
= hcd_to_fhci(hcd
);
378 fhci_usb_disable_interrupt(fhci
->usb_lld
);
379 fhci_usb_disable(fhci
);
381 fhci_usb_free(fhci
->usb_lld
);
382 fhci
->usb_lld
= NULL
;
386 static int fhci_urb_enqueue(struct usb_hcd
*hcd
, struct urb
*urb
,
389 struct fhci_hcd
*fhci
= hcd_to_fhci(hcd
);
390 u32 pipe
= urb
->pipe
;
394 struct urb_priv
*urb_priv
;
397 switch (usb_pipetype(pipe
)) {
399 /* 1 td fro setup,1 for ack */
402 /* one td for every 4096 bytes(can be upto 8k) */
403 size
+= urb
->transfer_buffer_length
/ 4096;
404 /* ...add for any remaining bytes... */
405 if ((urb
->transfer_buffer_length
% 4096) != 0)
407 /* ..and maybe a zero length packet to wrap it up */
410 else if ((urb
->transfer_flags
& URB_ZERO_PACKET
) != 0
411 && (urb
->transfer_buffer_length
412 % usb_maxpacket(urb
->dev
, pipe
,
413 usb_pipeout(pipe
))) != 0)
416 case PIPE_ISOCHRONOUS
:
417 size
= urb
->number_of_packets
;
420 for (i
= 0; i
< urb
->number_of_packets
; i
++) {
421 urb
->iso_frame_desc
[i
].actual_length
= 0;
422 urb
->iso_frame_desc
[i
].status
= (u32
) (-EXDEV
);
429 /* allocate the private part of the URB */
430 urb_priv
= kzalloc(sizeof(*urb_priv
), mem_flags
);
434 /* allocate the private part of the URB */
435 urb_priv
->tds
= kzalloc(size
* sizeof(struct td
), mem_flags
);
436 if (!urb_priv
->tds
) {
441 spin_lock_irqsave(&fhci
->lock
, flags
);
443 ret
= usb_hcd_link_urb_to_ep(hcd
, urb
);
447 /* fill the private part of the URB */
448 urb_priv
->num_of_tds
= size
;
450 urb
->status
= -EINPROGRESS
;
451 urb
->actual_length
= 0;
452 urb
->error_count
= 0;
453 urb
->hcpriv
= urb_priv
;
455 fhci_queue_urb(fhci
, urb
);
458 kfree(urb_priv
->tds
);
461 spin_unlock_irqrestore(&fhci
->lock
, flags
);
465 /* dequeue FHCI URB */
466 static int fhci_urb_dequeue(struct usb_hcd
*hcd
, struct urb
*urb
, int status
)
468 struct fhci_hcd
*fhci
= hcd_to_fhci(hcd
);
469 struct fhci_usb
*usb
= fhci
->usb_lld
;
473 if (!urb
|| !urb
->dev
|| !urb
->dev
->bus
)
476 spin_lock_irqsave(&fhci
->lock
, flags
);
478 ret
= usb_hcd_check_unlink_urb(hcd
, urb
, status
);
482 if (usb
->port_status
!= FHCI_PORT_DISABLED
) {
483 struct urb_priv
*urb_priv
;
486 * flag the urb's data for deletion in some upcoming
487 * SF interrupt's delete list processing
489 urb_priv
= urb
->hcpriv
;
491 if (!urb_priv
|| (urb_priv
->state
== URB_DEL
))
494 urb_priv
->state
= URB_DEL
;
496 /* already pending? */
497 urb_priv
->ed
->state
= FHCI_ED_URB_DEL
;
499 fhci_urb_complete_free(fhci
, urb
);
503 spin_unlock_irqrestore(&fhci
->lock
, flags
);
508 static void fhci_endpoint_disable(struct usb_hcd
*hcd
,
509 struct usb_host_endpoint
*ep
)
511 struct fhci_hcd
*fhci
;
515 fhci
= hcd_to_fhci(hcd
);
516 spin_lock_irqsave(&fhci
->lock
, flags
);
519 while (ed
->td_head
!= NULL
) {
520 struct td
*td
= fhci_remove_td_from_ed(ed
);
521 fhci_urb_complete_free(fhci
, td
->urb
);
523 fhci_recycle_empty_ed(fhci
, ed
);
526 spin_unlock_irqrestore(&fhci
->lock
, flags
);
529 static int fhci_get_frame_number(struct usb_hcd
*hcd
)
531 struct fhci_hcd
*fhci
= hcd_to_fhci(hcd
);
533 return get_frame_num(fhci
);
536 static const struct hc_driver fhci_driver
= {
537 .description
= "fsl,usb-fhci",
538 .product_desc
= "FHCI HOST Controller",
539 .hcd_priv_size
= sizeof(struct fhci_hcd
),
541 /* generic hardware linkage */
543 .flags
= HCD_USB11
| HCD_MEMORY
,
545 /* basic lifecycle operation */
549 /* managing i/o requests and associated device resources */
550 .urb_enqueue
= fhci_urb_enqueue
,
551 .urb_dequeue
= fhci_urb_dequeue
,
552 .endpoint_disable
= fhci_endpoint_disable
,
554 /* scheduling support */
555 .get_frame_number
= fhci_get_frame_number
,
557 /* root hub support */
558 .hub_status_data
= fhci_hub_status_data
,
559 .hub_control
= fhci_hub_control
,
562 static int __devinit
of_fhci_probe(struct of_device
*ofdev
,
563 const struct of_device_id
*ofid
)
565 struct device
*dev
= &ofdev
->dev
;
566 struct device_node
*node
= ofdev
->node
;
568 struct fhci_hcd
*fhci
;
569 struct resource usb_regs
;
570 unsigned long pram_addr
;
571 unsigned int usb_irq
;
582 sprop
= of_get_property(node
, "mode", NULL
);
583 if (sprop
&& strcmp(sprop
, "host"))
586 hcd
= usb_create_hcd(&fhci_driver
, dev
, dev_name(dev
));
588 dev_err(dev
, "could not create hcd\n");
592 fhci
= hcd_to_fhci(hcd
);
593 hcd
->self
.controller
= dev
;
594 dev_set_drvdata(dev
, hcd
);
596 iprop
= of_get_property(node
, "hub-power-budget", &size
);
597 if (iprop
&& size
== sizeof(*iprop
))
598 hcd
->power_budget
= *iprop
;
600 /* FHCI registers. */
601 ret
= of_address_to_resource(node
, 0, &usb_regs
);
603 dev_err(dev
, "could not get regs\n");
607 hcd
->regs
= ioremap(usb_regs
.start
, usb_regs
.end
- usb_regs
.start
+ 1);
609 dev_err(dev
, "could not ioremap regs\n");
613 fhci
->regs
= hcd
->regs
;
616 iprop
= of_get_property(node
, "reg", &size
);
617 if (!iprop
|| size
< sizeof(*iprop
) * 4) {
618 dev_err(dev
, "can't get pram offset\n");
623 pram_addr
= cpm_muram_alloc_fixed(iprop
[2], FHCI_PRAM_SIZE
);
624 if (IS_ERR_VALUE(pram_addr
)) {
625 dev_err(dev
, "failed to allocate usb pram\n");
629 fhci
->pram
= cpm_muram_addr(pram_addr
);
632 for (i
= 0; i
< NUM_GPIOS
; i
++) {
634 enum of_gpio_flags flags
;
636 gpio
= of_get_gpio_flags(node
, i
, &flags
);
637 fhci
->gpios
[i
] = gpio
;
638 fhci
->alow_gpios
[i
] = flags
& OF_GPIO_ACTIVE_LOW
;
640 if (!gpio_is_valid(gpio
)) {
641 if (i
< GPIO_SPEED
) {
642 dev_err(dev
, "incorrect GPIO%d: %d\n",
646 dev_info(dev
, "assuming board doesn't have "
647 "%s gpio\n", i
== GPIO_SPEED
?
653 ret
= gpio_request(gpio
, dev_name(dev
));
655 dev_err(dev
, "failed to request gpio %d", i
);
659 if (i
>= GPIO_SPEED
) {
660 ret
= gpio_direction_output(gpio
, 0);
662 dev_err(dev
, "failed to set gpio %d as "
670 for (j
= 0; j
< NUM_PINS
; j
++) {
671 fhci
->pins
[j
] = qe_pin_request(ofdev
->node
, j
);
672 if (IS_ERR(fhci
->pins
[j
])) {
673 ret
= PTR_ERR(fhci
->pins
[j
]);
674 dev_err(dev
, "can't get pin %d: %d\n", j
, ret
);
679 /* Frame limit timer and its interrupt. */
680 fhci
->timer
= gtm_get_timer16();
681 if (IS_ERR(fhci
->timer
)) {
682 ret
= PTR_ERR(fhci
->timer
);
683 dev_err(dev
, "failed to request qe timer: %i", ret
);
687 ret
= request_irq(fhci
->timer
->irq
, fhci_frame_limit_timer_irq
,
688 IRQF_DISABLED
, "qe timer (usb)", hcd
);
690 dev_err(dev
, "failed to request timer irq");
694 /* USB Host interrupt. */
695 usb_irq
= irq_of_parse_and_map(node
, 0);
696 if (usb_irq
== NO_IRQ
) {
697 dev_err(dev
, "could not get usb irq\n");
703 sprop
= of_get_property(node
, "fsl,fullspeed-clock", NULL
);
705 fhci
->fullspeed_clk
= qe_clock_source(sprop
);
706 if (fhci
->fullspeed_clk
== QE_CLK_DUMMY
) {
707 dev_err(dev
, "wrong fullspeed-clock\n");
713 sprop
= of_get_property(node
, "fsl,lowspeed-clock", NULL
);
715 fhci
->lowspeed_clk
= qe_clock_source(sprop
);
716 if (fhci
->lowspeed_clk
== QE_CLK_DUMMY
) {
717 dev_err(dev
, "wrong lowspeed-clock\n");
723 if (fhci
->fullspeed_clk
== QE_CLK_NONE
&&
724 fhci
->lowspeed_clk
== QE_CLK_NONE
) {
725 dev_err(dev
, "no clocks specified\n");
730 dev_info(dev
, "at 0x%p, irq %d\n", hcd
->regs
, usb_irq
);
732 fhci_config_transceiver(fhci
, FHCI_PORT_POWER_OFF
);
734 /* Start with full-speed, if possible. */
735 if (fhci
->fullspeed_clk
!= QE_CLK_NONE
) {
736 fhci_config_transceiver(fhci
, FHCI_PORT_FULL
);
737 qe_usb_clock_set(fhci
->fullspeed_clk
, USB_CLOCK
);
739 fhci_config_transceiver(fhci
, FHCI_PORT_LOW
);
740 qe_usb_clock_set(fhci
->lowspeed_clk
, USB_CLOCK
>> 3);
743 /* Clear and disable any pending interrupts. */
744 out_be16(&fhci
->regs
->usb_event
, 0xffff);
745 out_be16(&fhci
->regs
->usb_mask
, 0);
747 ret
= usb_add_hcd(hcd
, usb_irq
, IRQF_DISABLED
);
751 fhci_dfs_create(fhci
);
757 irq_dispose_mapping(usb_irq
);
759 free_irq(fhci
->timer
->irq
, hcd
);
761 gtm_put_timer16(fhci
->timer
);
765 qe_pin_free(fhci
->pins
[j
]);
768 if (gpio_is_valid(fhci
->gpios
[i
]))
769 gpio_free(fhci
->gpios
[i
]);
771 cpm_muram_free(pram_addr
);
779 static int __devexit
fhci_remove(struct device
*dev
)
781 struct usb_hcd
*hcd
= dev_get_drvdata(dev
);
782 struct fhci_hcd
*fhci
= hcd_to_fhci(hcd
);
787 free_irq(fhci
->timer
->irq
, hcd
);
788 gtm_put_timer16(fhci
->timer
);
789 cpm_muram_free(cpm_muram_offset(fhci
->pram
));
790 for (i
= 0; i
< NUM_GPIOS
; i
++) {
791 if (!gpio_is_valid(fhci
->gpios
[i
]))
793 gpio_free(fhci
->gpios
[i
]);
795 for (j
= 0; j
< NUM_PINS
; j
++)
796 qe_pin_free(fhci
->pins
[j
]);
797 fhci_dfs_destroy(fhci
);
802 static int __devexit
of_fhci_remove(struct of_device
*ofdev
)
804 return fhci_remove(&ofdev
->dev
);
807 static struct of_device_id of_fhci_match
[] = {
808 { .compatible
= "fsl,mpc8323-qe-usb", },
811 MODULE_DEVICE_TABLE(of
, of_fhci_match
);
813 static struct of_platform_driver of_fhci_driver
= {
814 .name
= "fsl,usb-fhci",
815 .match_table
= of_fhci_match
,
816 .probe
= of_fhci_probe
,
817 .remove
= __devexit_p(of_fhci_remove
),
820 static int __init
fhci_module_init(void)
822 return of_register_platform_driver(&of_fhci_driver
);
824 module_init(fhci_module_init
);
826 static void __exit
fhci_module_exit(void)
828 of_unregister_platform_driver(&of_fhci_driver
);
830 module_exit(fhci_module_exit
);
832 MODULE_DESCRIPTION("USB Freescale Host Controller Interface Driver");
833 MODULE_AUTHOR("Shlomi Gridish <gridish@freescale.com>, "
834 "Jerry Huang <Chang-Ming.Huang@freescale.com>, "
835 "Anton Vorontsov <avorontsov@ru.mvista.com>");
836 MODULE_LICENSE("GPL");