1 --- kernel-power-2.6.28.orig/drivers/usb/core/generic.c
2 +++ kernel-power-2.6.28/drivers/usb/core/generic.c
6 /* Rule out configs that draw too much bus current */
7 - if (c->desc.bMaxPower * 2 > udev->bus_mA) {
8 + /*if (c->desc.bMaxPower * 2 > udev->bus_mA) {
14 /* When the first config's first interface is one of Microsoft's
15 * pet nonstandard Ethernet-over-USB protocols, ignore it unless
20 - if (insufficient_power > 0)
21 + /*if (insufficient_power > 0)
22 dev_info(&udev->dev, "rejected %d configuration%s "
23 "due to insufficient available bus power\n",
24 - insufficient_power, plural(insufficient_power));
25 + insufficient_power, plural(insufficient_power));*/
28 i = best->desc.bConfigurationValue;
29 --- kernel-power-2.6.28.orig/drivers/usb/core/otg_whitelist.h
30 +++ kernel-power-2.6.28/drivers/usb/core/otg_whitelist.h
33 static inline int is_targeted(struct usb_device *d)
40 --- kernel-power-2.6.28.orig/drivers/usb/gadget/ether.c
41 +++ kernel-power-2.6.28/drivers/usb/gadget/ether.c
43 .bind = rndis_do_config,
44 .bConfigurationValue = 2,
45 /* .iConfiguration = DYNAMIC */
46 - .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
47 + .bmAttributes = USB_CONFIG_ATT_ONE,
48 + .bMaxPower = 250, /* 500mA */
51 /*-------------------------------------------------------------------------*/
53 .bind = eth_do_config,
54 .bConfigurationValue = 1,
55 /* .iConfiguration = DYNAMIC */
56 - .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
57 + .bmAttributes = USB_CONFIG_ATT_ONE,
58 + .bMaxPower = 250, /* 500mA */
61 /*-------------------------------------------------------------------------*/
62 --- kernel-power-2.6.28.orig/drivers/usb/musb/isp1704.h
63 +++ kernel-power-2.6.28/drivers/usb/musb/isp1704.h
65 #define ISP1704_PRODUCT_ID_HIGH 0x03
66 #define ISP1704_FUNC_CTRL 0x04
67 #define ISP1704_OTG_CTRL 0x0a
68 -#define ISP1704_USB_INTRISE 0x0d
69 -#define ISP1704_USB_INTFALL 0x10
70 +#define ISP1704_USB_INTRISE 0x0d /* interrupt enable rising register (ds p. 35 ff)*/
71 +#define ISP1704_USB_INTFALL 0x10 /* interrupt enable falling register */
72 +#define ISP1704_USB_INTSTAT 0x13 /* interrupt status register */
73 #define ISP1704_DEBUG 0x15
74 #define ISP1704_SCRATCH 0x16
75 #define ISP1704_PWR_CTRL 0x3d
77 /* Function control */
78 -#define ISP1704_FUNC_CTRL_FULL_SPEED (1 << 0)
79 -#define ISP1704_FUNC_CTRL_XCVRSELECT 0x3
80 -#define ISP1704_FUNC_CTRL_XCVRSELECT_SHIFT (1 << 0)
81 -#define ISP1704_FUNC_CTRL_TERMSELECT (1 << 2)
82 -#define ISP1704_FUNC_CTRL_OPMODE (1 << 3)
83 -#define ISP1704_FUNC_CTRL_OPMODE_SHIFT 3
84 -#define ISP1704_FUNC_CTRL_RESET (1 << 5)
85 -#define ISP1704_FUNC_CTRL_SUSPENDM (1 << 6)
86 +#define ISP1704_FUNC_CTRL_XCVRSELECT_SHIFT 0
87 +#define ISP1704_FUNC_CTRL_XCVRSELECT_MASK (3 << 0)
88 +#define ISP1704_FUNC_CTRL_HIGH_SPEED (0 << 0)
89 +#define ISP1704_FUNC_CTRL_FULL_SPEED (1 << 0)
90 +#define ISP1704_FUNC_CTRL_LOW_SPEED (2 << 0)
91 +#define ISP1704_FUNC_CTRL_TERMSELECT (1 << 2)
92 +#define ISP1704_FUNC_CTRL_OPMODE (1 << 3)
93 +#define ISP1704_FUNC_CTRL_OPMODE_SHIFT 3
94 +#define ISP1704_FUNC_CTRL_RESET (1 << 5)
95 +#define ISP1704_FUNC_CTRL_SUSPENDM (1 << 6)
98 #define ISP1704_OTG_CTRL_IDPULLUP (1 << 0)
99 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_core.c
100 +++ kernel-power-2.6.28/drivers/usb/musb/musb_core.c
102 MODULE_LICENSE("GPL");
103 MODULE_ALIAS("platform:" MUSB_DRIVER_NAME);
106 +void musb_force_term(void __iomem *addr, enum musb_term term)
110 + /* activate pulldown resistors on datalines */
111 + r = musb_ulpi_readb(addr, ISP1704_OTG_CTRL);
112 + r |= ISP1704_OTG_CTRL_DP_PULLDOWN | ISP1704_OTG_CTRL_DM_PULLDOWN;
113 + musb_ulpi_writeb(addr, ISP1704_OTG_CTRL, r);
115 + r = musb_ulpi_readb(addr, ISP1704_FUNC_CTRL);
116 + /* clear speed-selection bits */
117 + r &= ~ISP1704_FUNC_CTRL_XCVRSELECT_MASK;
118 + /* set new speed-selection bits */
121 + case MUSB_TERM_HOST_HIGHSPEED:
122 + r |= ISP1704_FUNC_CTRL_HIGH_SPEED;
123 + r &= ~ISP1704_FUNC_CTRL_TERMSELECT;
124 + r &= ~ISP1704_FUNC_CTRL_OPMODE;
127 + case MUSB_TERM_HOST_FULLSPEED:
128 + r |= ISP1704_FUNC_CTRL_FULL_SPEED;
129 + r |= ISP1704_FUNC_CTRL_TERMSELECT;
130 + r &= ~ISP1704_FUNC_CTRL_OPMODE;
133 + case MUSB_TERM_HOST_LOWSPEED:
134 + r |= ISP1704_FUNC_CTRL_LOW_SPEED;
135 + r |= ISP1704_FUNC_CTRL_TERMSELECT;
136 + r &= ~ISP1704_FUNC_CTRL_OPMODE;
140 + ERR("Unknown musb termination\n");
144 + musb_ulpi_writeb(addr, ISP1704_FUNC_CTRL, r);
150 static inline int musb_verify_charger(void __iomem *addr)
158 + testmode = musb_readb(musb->mregs,MUSB_TESTMODE);
167 + if (vdat && !(testmode & MUSB_TEST_FORCE_HOST)) {
168 /* REVISIT: This code works only with dedicated chargers!
169 * When support for HOST/HUB chargers is added, don't
175 - DBG(4, "%cX ep%d fifo %p count %d buf %p\n",
176 + DBG(6, "%cX ep%d fifo %p count %d buf %p\n",
177 'T', hw_ep->epnum, fifo, len, src);
179 /* we can't assume unaligned reads work */
182 void __iomem *fifo = hw_ep->fifo;
184 - DBG(4, "%cX ep%d fifo %p count %d buf %p\n",
185 + DBG(6, "%cX ep%d fifo %p count %d buf %p\n",
186 'R', hw_ep->epnum, fifo, len, dst);
188 /* we can't assume unaligned writes work */
191 struct musb *musb = (struct musb *)data;
194 spin_lock_irqsave(&musb->lock, flags);
195 switch (musb->xceiv->state) {
196 case OTG_STATE_B_WAIT_ACON:
197 @@ -572,10 +618,19 @@
198 static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
202 irqreturn_t handled = IRQ_NONE;
203 void __iomem *mbase = musb->mregs;
206 + testmode = musb_readb(mbase,MUSB_TESTMODE);
207 + if(testmode & MUSB_TEST_FORCE_HOST) {
208 + if(int_usb & MUSB_INTR_SESSREQ) {
209 + DBG(1,"Piggybacking CONNECT on SESS REQ\n");
210 + musb->int_usb |= MUSB_INTR_CONNECT;
214 DBG(3, "<== Power=%02x, DevCtl=%02x, int_usb=0x%x\n", power, devctl,
219 switch (musb->xceiv->state) {
220 #ifdef CONFIG_USB_MUSB_HDRC_HCD
221 + case OTG_STATE_A_WAIT_BCON:
222 + case OTG_STATE_A_HOST:
223 case OTG_STATE_A_SUSPEND:
224 /* possibly DISCONNECT is upcoming */
225 musb->xceiv->state = OTG_STATE_A_HOST;
227 * be discarded silently.
229 if ((devctl & MUSB_DEVCTL_VBUS)
230 - && !(devctl & MUSB_DEVCTL_BDEVICE)) {
231 + && host_mode(musb->mregs)) {
232 musb_writeb(mbase, MUSB_DEVCTL, MUSB_DEVCTL_SESSION);
233 musb->ep0_stage = MUSB_EP0_START;
234 musb->xceiv->state = OTG_STATE_A_IDLE;
236 + msecs_to_jiffies(musb->a_wait_bcon));
238 case OTG_STATE_A_HOST:
239 + if(testmode & MUSB_TEST_FORCE_HOST) {
240 + // musb->int_usb |= MUSB_INTR_RESUME;
244 musb->xceiv->state = OTG_STATE_A_SUSPEND;
245 musb->is_active = is_otg_enabled(musb)
246 && musb->xceiv->host->b_hnp_enable;
249 case OTG_STATE_B_HOST:
250 /* Transition to B_PERIPHERAL, see 6.8.2.6 p 44 */
253 set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
256 musb->ep0_stage = MUSB_EP0_START;
258 #ifdef CONFIG_USB_MUSB_OTG
260 musb->port1_status |= USB_PORT_STAT_CONNECTION
261 |(USB_PORT_STAT_C_CONNECTION << 16);
263 - /* high vs full speed is just a guess until after reset */
264 - if (devctl & MUSB_DEVCTL_LSDEV)
265 - musb->port1_status |= USB_PORT_STAT_LOW_SPEED;
266 + if (testmode & MUSB_TEST_FORCE_HOST) {
268 + void __iomem *mbase = musb->mregs;
270 + musb_force_term(musb->mregs,MUSB_TERM_HOST_HIGHSPEED);
272 + r = musb_ulpi_readb(mbase, ISP1704_DEBUG);
273 + DBG(1,"Linestate %x\n",r);
276 + musb->port1_status |= USB_PORT_STAT_LOW_SPEED;
277 + reg = musb_readb(mbase, MUSB_TESTMODE);
278 + reg &= ~MUSB_TEST_FORCE_FS;
279 + reg &= ~MUSB_TEST_FORCE_HS;
280 + musb_writeb(mbase, MUSB_TESTMODE, reg);
282 + reg = musb_readb(mbase, MUSB_POWER);
283 + reg &= ~MUSB_POWER_HSENAB;
284 + musb_writeb(mbase, MUSB_POWER, reg);
286 + musb_force_term(musb->mregs,MUSB_TERM_HOST_LOWSPEED);
289 + /*High or full speed*/
290 + reg = musb_readb(mbase, MUSB_TESTMODE);
291 + if(reg & MUSB_TEST_FORCE_HS) {
293 + reg &= ~MUSB_TEST_FORCE_FS;
294 + musb_writeb(mbase, MUSB_TESTMODE, reg);
296 + reg = musb_readb(mbase, MUSB_POWER);
297 + reg |= MUSB_POWER_HSENAB;
298 + musb_writeb(mbase, MUSB_POWER, reg);
301 + reg |= MUSB_TEST_FORCE_FS;
302 + musb_writeb(mbase, MUSB_TESTMODE, reg);
304 + reg = musb_readb(mbase, MUSB_POWER);
305 + reg &= ~MUSB_POWER_HSENAB;
306 + musb_writeb(mbase, MUSB_POWER, reg);
309 + musb_force_term(mbase,MUSB_TERM_HOST_FULLSPEED);
315 + WARNING("Invalid line state of %d\n",r);
321 + /* high vs full speed is just a guess until after reset */
322 + if (devctl & MUSB_DEVCTL_LSDEV)
323 + musb->port1_status |= USB_PORT_STAT_LOW_SPEED;
327 usb_hcd_poll_rh_status(hcd);
329 musb->ignore_disconnect = 1;
332 + case OTG_STATE_A_HOST:
333 + musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
334 case OTG_STATE_A_WAIT_BCON: /* OPT TD.4.7-900ms */
335 DBG(1, "HNP: Setting timer as %s\n",
336 otg_state_string(musb));
337 @@ -2421,8 +2543,7 @@
338 DBG(1, "%s mode, status %d, devctl %02x %c\n",
340 musb_readb(musb->mregs, MUSB_DEVCTL),
341 - (musb_readb(musb->mregs, MUSB_DEVCTL)
342 - & MUSB_DEVCTL_BDEVICE
343 + (!host_mode(musb->mregs)
346 } else /* peripheral is enabled */ {
347 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_core.h
348 +++ kernel-power-2.6.28/drivers/usb/musb/musb_core.h
350 #define is_host_active(musb) is_host_capable()
353 +static inline int host_mode(void __iomem *addr)
355 + u8 devctl,testmode;
356 + devctl = musb_readb(addr, MUSB_DEVCTL);
357 + testmode = musb_readb(addr,MUSB_TESTMODE);
359 + return (testmode & MUSB_TEST_FORCE_HOST) || !(devctl & MUSB_DEVCTL_BDEVICE);
363 #if defined(CONFIG_USB_MUSB_OTG) || defined(CONFIG_USB_MUSB_PERIPHERAL)
364 /* for some reason, the "select USB_GADGET_MUSB_HDRC" doesn't always
365 * override that choice selection (often USB_GADGET_DUMMY_HCD).
368 extern int musb_platform_set_mode(struct musb *musb, u8 musb_mode);
371 + MUSB_TERM_HOST_HIGHSPEED,
372 + MUSB_TERM_HOST_FULLSPEED,
373 + MUSB_TERM_HOST_LOWSPEED,
376 +extern void musb_force_term(void __iomem *addr, enum musb_term term);
378 #if defined(CONFIG_USB_TUSB6010) || defined(CONFIG_BLACKFIN) || \
379 defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP34XX)
380 extern void musb_platform_try_idle(struct musb *musb, unsigned long timeout);
381 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_gadget.c
382 +++ kernel-power-2.6.28/drivers/usb/musb/musb_gadget.c
383 @@ -1957,7 +1957,7 @@
386 DBG(3, "<== %s addr=%x driver '%s'\n",
387 - (devctl & MUSB_DEVCTL_BDEVICE)
388 + !host_mode(musb->mregs)
389 ? "B-Device" : "A-Device",
390 musb_readb(mbase, MUSB_FADDR),
392 @@ -1994,7 +1994,7 @@
393 /* Normal reset, as B-Device;
394 * or else after HNP, as A-Device
396 - if (devctl & MUSB_DEVCTL_BDEVICE) {
397 + if (!host_mode(musb->mregs)) {
398 musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
399 musb->g.is_a_peripheral = 0;
400 } else if (is_otg_enabled(musb)) {
401 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_host.c
402 +++ kernel-power-2.6.28/drivers/usb/musb/musb_host.c
403 @@ -1863,8 +1863,10 @@
406 /* host role must be active */
407 - if (!is_host_active(musb) || !musb->is_active)
408 + if (!is_host_active(musb) || !musb->is_active) {
409 + printk(KERN_ERR "musb is_host_active %d is_active %d\n",is_host_active(musb),musb->is_active);
413 spin_lock_irqsave(&musb->lock, flags);
414 ret = usb_hcd_link_urb_to_ep(hcd, urb);
415 @@ -2275,6 +2277,7 @@
420 const struct hc_driver musb_hc_driver = {
421 .description = "musb-hcd",
422 .product_desc = "MUSB HDRC host driver",
423 @@ -2298,6 +2301,5 @@
424 .hub_control = musb_hub_control,
425 .bus_suspend = musb_bus_suspend,
426 .bus_resume = musb_bus_resume,
427 - /* .start_port_reset = NULL, */
428 /* .hub_irq_enable = NULL, */
430 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_procfs.c
431 +++ kernel-power-2.6.28/drivers/usb/musb/musb_procfs.c
433 #include <linux/seq_file.h>
434 #include <linux/uaccess.h> /* FIXME remove procfs writes */
435 #include <mach/hardware.h>
436 +#include <asm/mach-types.h>
438 #include "musb_core.h"
444 - code = sprintf(buffer, "OTG state: %s; %sactive\n",
445 - otg_state_string(musb),
446 + code = sprintf(buffer, "OTG state: %s:%d; %sactive\n",
447 + otg_state_string(musb),musb->xceiv->state,
448 musb->is_active ? "" : "in");
451 @@ -591,16 +592,33 @@
458 - * F force session (OTG-unfriendly)
459 + * D<num> set/query the debug level
460 * E rElinquish bus (OTG)
462 + * F force session (OTG-unfriendly)
463 * H request host mode
464 * h cancel host request
467 + * J set HS test mode
468 + * j clear HS test mode
469 + * K set FS test mode
470 + * k clear FS test mode
471 + * M set host test mode
472 + * m clear host test mode
473 + * R reset peripheral
474 + * r resume root hub
476 * T start sending TEST_PACKET
477 - * D<num> set/query the debug level
484 +extern void musb_port_reset(struct musb *musb, bool do_reset);
485 +extern void musb_port_suspend(struct musb *musb, bool do_suspend);
487 static int musb_proc_write(struct file *file, const char __user *buffer,
488 unsigned long count, void *data)
490 @@ -608,49 +626,63 @@
492 struct musb *musb = (struct musb *)data;
493 void __iomem *mbase = musb->mregs;
494 + unsigned long flags;
495 + struct usb_hcd *hcd = musb_to_hcd(musb);
496 + struct usb_bus *bus = hcd_to_bus(hcd);
498 /* MOD_INC_USE_COUNT; */
500 if (unlikely(copy_from_user(&cmd, buffer, 1)))
507 - reg = musb_readb(mbase, MUSB_POWER)
508 - | MUSB_POWER_SOFTCONN;
509 + reg = musb_readb(mbase, MUSB_POWER);
510 + reg |= MUSB_POWER_SOFTCONN;
511 musb_writeb(mbase, MUSB_POWER, reg);
517 - reg = musb_readb(mbase, MUSB_POWER)
518 - & ~MUSB_POWER_SOFTCONN;
519 + reg = musb_readb(mbase, MUSB_POWER);
520 + reg &= ~MUSB_POWER_SOFTCONN;
521 musb_writeb(mbase, MUSB_POWER, reg);
527 - reg = musb_readb(mbase, MUSB_POWER)
528 - | MUSB_POWER_HSENAB;
529 + reg = musb_readb(mbase, MUSB_POWER);
530 + reg |= MUSB_POWER_HSENAB;
531 musb_writeb(mbase, MUSB_POWER, reg);
537 - reg = musb_readb(mbase, MUSB_POWER)
538 - & ~MUSB_POWER_HSENAB;
539 + reg = musb_readb(mbase, MUSB_POWER);
540 + reg &= ~MUSB_POWER_HSENAB;
541 musb_writeb(mbase, MUSB_POWER, reg);
546 - reg = musb_readb(mbase, MUSB_DEVCTL);
547 - reg |= MUSB_DEVCTL_SESSION;
548 - musb_writeb(mbase, MUSB_DEVCTL, reg);
550 + reg = musb_readb(mbase, MUSB_DEVCTL);
551 + reg |= MUSB_DEVCTL_SESSION;
552 + musb_writeb(mbase, MUSB_DEVCTL, reg);
558 + reg = musb_readb(mbase, MUSB_DEVCTL);
559 + reg &= ~MUSB_DEVCTL_SESSION;
560 + musb_writeb(mbase, MUSB_DEVCTL, reg);
565 @@ -679,6 +711,114 @@
571 + reg = musb_readb(mbase, MUSB_TESTMODE);
572 + reg |= MUSB_TEST_FORCE_HOST;
573 + musb_writeb(mbase, MUSB_TESTMODE, reg);
579 + reg = musb_readb(mbase, MUSB_TESTMODE);
580 + reg &= ~MUSB_TEST_FORCE_HOST;
581 + musb_writeb(mbase, MUSB_TESTMODE, reg);
582 + MUSB_DEV_MODE(musb);
583 + musb->xceiv->state = OTG_STATE_B_IDLE;
588 + musb->xceiv->state = OTG_STATE_A_HOST;
589 + MUSB_HST_MODE(musb);
593 + musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
594 + MUSB_HST_MODE(musb);
599 + reg = musb_readb(mbase, MUSB_TESTMODE);
600 + reg |= MUSB_TEST_FORCE_HS;
601 + musb_writeb(mbase, MUSB_TESTMODE, reg);
607 + reg = musb_readb(mbase, MUSB_TESTMODE);
608 + reg &= ~MUSB_TEST_FORCE_HS;
609 + musb_writeb(mbase, MUSB_TESTMODE, reg);
615 + reg = musb_readb(mbase, MUSB_TESTMODE);
616 + reg |= MUSB_TEST_FORCE_FS;
617 + musb_writeb(mbase, MUSB_TESTMODE, reg);
623 + reg = musb_readb(mbase, MUSB_TESTMODE);
624 + reg &= ~MUSB_TEST_FORCE_FS;
625 + musb_writeb(mbase, MUSB_TESTMODE, reg);
631 + musb_force_term(mbase,MUSB_TERM_HOST_HIGHSPEED);
636 + musb_force_term(mbase,MUSB_TERM_HOST_FULLSPEED);
641 + musb_force_term(mbase,MUSB_TERM_HOST_LOWSPEED);
645 + musb_port_reset(musb, true);
646 + while (time_before(jiffies, musb->rh_timer))
648 + musb_port_reset(musb, false);
653 + usb_hcd_resume_root_hub(hcd);
658 + usb_bus_start_enum(bus,bus->otg_port);
663 + musb_port_suspend(musb, true);
668 + musb_port_suspend(musb, false);
669 + /*How to end sanely? */
670 + musb_port_reset(musb, true);
671 + while (time_before(jiffies, musb->rh_timer))
673 + musb_port_reset(musb, false);
678 INFO("?: you are seeing it\n");
679 INFO("C/c: soft connect enable/disable\n");
682 musb_platform_try_idle(musb, 0);
691 count -= 1; /* for NUL at end */
692 + count -= 20; /* Padding */
704 /* generate the report for the end points */
705 /* REVISIT ... not unless something's connected! */
706 for (epnum = 0; count >= 0 && epnum < musb->nr_endpoints;
707 @@ -728,14 +874,22 @@
719 musb_platform_try_idle(musb, 0);
721 spin_unlock_irqrestore(&musb->lock, flags);
727 return buffer - page;
730 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_virthub.c
731 +++ kernel-power-2.6.28/drivers/usb/musb/musb_virthub.c
733 #include "musb_core.h"
736 -static void musb_port_suspend(struct musb *musb, bool do_suspend)
737 +void musb_port_suspend(struct musb *musb, bool do_suspend)
740 void __iomem *mbase = musb->mregs;
741 @@ -106,11 +106,13 @@
743 /* later, GetPortStatus will stop RESUME signaling */
744 musb->port1_status |= MUSB_PORT_STAT_RESUME;
745 - musb->rh_timer = jiffies + msecs_to_jiffies(20);
746 + /*OMAP documentation states range of 10-15 ms */
747 + musb->rh_timer = jiffies + msecs_to_jiffies(13);
748 + // musb->rh_timer = jiffies + msecs_to_jiffies(20);
752 -static void musb_port_reset(struct musb *musb, bool do_reset)
753 +void musb_port_reset(struct musb *musb, bool do_reset)
756 void __iomem *mbase = musb->mregs;
759 power = musb_readb(mbase, MUSB_POWER);
762 + DBG(4, "root port reset started\n");
764 * If RESUME is set, we must make sure it stays minimum 20 ms.
765 * Then we must clear RESUME and wait a bit to let musb start
766 --- kernel-power-2.6.28.orig/drivers/usb/musb/omap2430.c
767 +++ kernel-power-2.6.28/drivers/usb/musb/omap2430.c
770 switch (musb->xceiv->state) {
771 case OTG_STATE_A_WAIT_BCON:
772 + if(host_mode(musb->mregs))
773 + break; /*Don't time out*/
775 devctl &= ~MUSB_DEVCTL_SESSION;
776 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
778 devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
779 - if (devctl & MUSB_DEVCTL_BDEVICE) {
780 + if (!host_mode(musb->mregs)) {
781 musb->xceiv->state = OTG_STATE_B_IDLE;
784 @@ -109,11 +112,14 @@
786 #ifdef CONFIG_USB_MUSB_HDRC_HCD
787 case OTG_STATE_A_HOST:
790 devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
791 - if (devctl & MUSB_DEVCTL_BDEVICE)
792 + if (!host_mode(musb->mregs))
793 musb->xceiv->state = OTG_STATE_B_IDLE;
795 - musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
796 + /*Don't time out if host*/
798 + // musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
803 /* Never idle if active, or when VBUS timeout is not set as host */
804 if (musb->is_active || ((musb->a_wait_bcon == 0)
805 && (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) {
806 - DBG(4, "%s active, deleting timer\n", otg_state_string(musb));
807 + DBG(6, "%s active, deleting timer\n", otg_state_string(musb));
808 del_timer(&musb_idle_timer);
809 last_timer = jiffies;
811 @@ -143,13 +149,13 @@
812 if (!timer_pending(&musb_idle_timer))
813 last_timer = timeout;
815 - DBG(4, "Longer idle timer already pending, ignoring\n");
816 + DBG(6, "Longer idle timer already pending, ignoring\n");
820 last_timer = timeout;
822 - DBG(4, "%s inactive, for idle timer for %lu ms\n",
823 + DBG(6, "%s inactive, for idle timer for %lu ms\n",
824 otg_state_string(musb),
825 (unsigned long)jiffies_to_msecs(timeout - jiffies));
826 mod_timer(&musb_idle_timer, timeout);
828 musb->xceiv->default_a = 1;
829 musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
830 devctl |= MUSB_DEVCTL_SESSION;
834 + if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS) {
835 + /*Power is already applied. Skip VRISE and go directly to BCON.*/
836 + musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
847 - DBG(3, "restoring register context\n");
848 + DBG(3, "restoring register context for %s\n","musb_restore_ctx_and_resume");
850 if (musb->board && musb->board->xceiv_power)
851 musb->board->xceiv_power(1);
852 @@ -431,13 +443,17 @@
854 clk_enable(musb->clock);
856 - /* Recover OTG control */
857 - r = musb_ulpi_readb(musb->mregs, ISP1704_OTG_CTRL);
858 - r |= ISP1704_OTG_CTRL_IDPULLUP | ISP1704_OTG_CTRL_DP_PULLDOWN;
859 - musb_ulpi_writeb(musb->mregs, ISP1704_OTG_CTRL, r);
861 + if(host_mode(musb->mregs)) {
862 + musb_force_term(musb->mregs,MUSB_TERM_HOST_FULLSPEED);
863 + r = musb_ulpi_readb(musb->mregs,ISP1704_FUNC_CTRL);
865 + /* Recover OTG control */
866 + r = musb_ulpi_readb(musb->mregs, ISP1704_OTG_CTRL);
867 + r |= ISP1704_OTG_CTRL_IDPULLUP | ISP1704_OTG_CTRL_DP_PULLDOWN;
868 + musb_ulpi_writeb(musb->mregs, ISP1704_OTG_CTRL, r);
869 + r = ISP1704_FUNC_CTRL_FULL_SPEED;
871 /* Recover FUNC control */
872 - r = ISP1704_FUNC_CTRL_FULL_SPEED;
873 r |= ISP1704_FUNC_CTRL_SUSPENDM | ISP1704_FUNC_CTRL_RESET;
874 musb_ulpi_writeb(musb->mregs, ISP1704_FUNC_CTRL, r);
876 --- kernel-power-2.6.28.orig/drivers/usb/otg/otg.c
877 +++ kernel-power-2.6.28/drivers/usb/otg/otg.c
880 /* add other match criteria here ... */
885 /* OTG MESSAGE: report errors here, customize to match your product */
886 dev_err(&dev->dev, "device v%04x p%04x is not supported\n",
887 le16_to_cpu(dev->descriptor.idVendor),
888 --- kernel-power-2.6.28.orig/drivers/usb/otg/twl4030-usb.c
889 +++ kernel-power-2.6.28/drivers/usb/otg/twl4030-usb.c
893 USB_LINK_UNKNOWN = 0,