kernel-power v42 -> kernel-bfs
authorDennis Groenen <dennis_groenen@hotmail.com>
Tue, 11 Jan 2011 15:12:50 +0000 (16:12 +0100)
committerDennis Groenen <dennis_groenen@hotmail.com>
Tue, 11 Jan 2011 15:12:50 +0000 (16:12 +0100)
14 files changed:
kernel-bfs-2.6.28/debian/changelog
kernel-bfs-2.6.28/debian/control
kernel-bfs-2.6.28/debian/patches/nokia-20103103+0m5.diff
kernel-bfs-2.6.28/debian/patches/nootg.diff [deleted file]
kernel-bfs-2.6.28/debian/patches/series
kernel-bfs-2.6.28/debian/patches/strip_cfs_nokia_pr13.diff
kernel-bfs-2.6.28/debian/patches/usbhost.diff [deleted file]
kernel-bfs-2.6.28/debian/patches/usbhost2.diff [deleted file]
kernel-bfs-2.6.28/debian/patches/usbhost3.diff [deleted file]
kernel-bfs-2.6.28/debian/patches/usbhost4.diff [deleted file]
kernel-bfs-2.6.28/debian/patches/usbhost_egoshin.diff [deleted file]
kernel-bfs-2.6.28/debian/patches/usbhostmode.diff
kernel-bfs-2.6.28/debian/patches/usbignpower.diff [deleted file]
kernel-bfs-2.6.28/debian/rules

index 5484184..3b21081 100644 (file)
@@ -1,3 +1,9 @@
+kernel-bfs (2.6.28-bfs3) fremantle; urgency=low
+
+  * Added kernel-power 2.6.28-maemo42 changes to kernel-bfs
+
+ -- Dennis Groenen <dennis_groenen@hotmail.com>  Wed,  10 Nov 2010 00:40:00 +0100
+
 kernel-bfs (2.6.28-bfs2) fremantle; urgency=low
 
   * Added kernel-power 2.6.28-maemo41 changes to kernel-bfs
index 9d910e2..5798e32 100644 (file)
@@ -18,7 +18,7 @@ Provides: kernel-feature-netfilter, kernel-feature-ipv6, kernel-feature-ext4, ke
   kernel-feature-unionfs, kernel-feature-crypto, kernel-feature-dmloop, kernel-feature-utf8, kernel-feature-mousejoy,
   kernel-feature-usbip, kernel-feature-ppp, kernel-feature-qos, kernel-feature-block2mtd, kernel-feature-kexec,
   kernel-feature-overclock, kernel-feature-joikuspot, kernel-feature-slip, kernel-feature-battery, kernel-feature-pptp,
-  kernel-feature-wlan-monitor
+  kernel-feature-wlan-monitor, kernel-feature-radiords, kernel-feature-ioacct
 XB-Maemo-Display-Name: Enhanced Linux kernel for power users
 Description: Linux kernel updater for an enhanced Maemo 5 kernel 2.6.28.10
  This package will flash the kernel image upon installation.
index a493b7d..ced2b28 100644 (file)
        }
  
        wl1251_debug(DEBUG_BOOT, "tx %s cmd channel %d",
---- kernel-power-2.6.28.orig/drivers/usb/musb/musb_core.c
-+++ kernel-power-2.6.28/drivers/usb/musb/musb_core.c
-@@ -297,28 +297,23 @@
-                       break;
-       }
--      if (vdat) {
--              /* REVISIT: This code works only with dedicated chargers!
--               * When support for HOST/HUB chargers is added, don't
--               * forget this.
--               */
-+      /* enable interrupts */
-+      musb_writeb(musb->mregs, MUSB_INTRUSBE, ctx.intrusbe);
-+
-+      /* Make sure the communication starts normally */
-+      r = musb_readb(musb->mregs, MUSB_POWER);
-+      musb_writeb(musb->mregs, MUSB_POWER,
-+                      r | MUSB_POWER_RESUME);
-+      msleep(10);
-+      musb_writeb(musb->mregs, MUSB_POWER,
-+                      r & ~MUSB_POWER_RESUME);
-+      if (vdat && musb->xceiv->state != OTG_STATE_B_IDLE) {
-               musb_stop(musb);
-               /* Regulators off */
-               otg_set_suspend(musb->xceiv, 1);
--              musb->is_charger = 1;
--      } else {
--              /* enable interrupts */
--              musb_writeb(musb->mregs, MUSB_INTRUSBE, ctx.intrusbe);
--
--              /* Make sure the communication starts normally */
--              r = musb_readb(musb->mregs, MUSB_POWER);
--              musb_writeb(musb->mregs, MUSB_POWER,
--                              r | MUSB_POWER_RESUME);
--              msleep(10);
--              musb_writeb(musb->mregs, MUSB_POWER,
--                              r & ~MUSB_POWER_RESUME);
-       }
-+      musb->is_charger = vdat;
-       check_charger = 0;
-       return vdat;
 --- kernel-power-2.6.28.orig/include/linux/sched.h
 +++ kernel-power-2.6.28/include/linux/sched.h
 @@ -1665,11 +1665,11 @@
diff --git a/kernel-bfs-2.6.28/debian/patches/nootg.diff b/kernel-bfs-2.6.28/debian/patches/nootg.diff
deleted file mode 100644 (file)
index 065e824..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
---- kernel-power-2.6.28.orig/drivers/usb/musb/musb_core.c
-+++ kernel-power-2.6.28/drivers/usb/musb/musb_core.c
-@@ -241,8 +241,10 @@
-                       r = musb_readb(musb->mregs, MUSB_DEVCTL);
-                       if ((r & MUSB_DEVCTL_VBUS)
-                                       == (3 << MUSB_DEVCTL_VBUS_SHIFT)) {
-+#ifdef        CONFIG_USB_MUSB_OTG
-                               musb_save_ctx_and_suspend(&musb->g, 0);
-                               musb_restore_ctx_and_resume(&musb->g);
-+#endif
-                               if (musb->board && musb->board->set_pm_limits)
-                                       musb->board->set_pm_limits(
-                                                       musb->controller, 1);
-@@ -1980,7 +1982,11 @@
-       int             ret = -EINVAL;
-       spin_lock_irqsave(&musb->lock, flags);
-+#ifdef        CONFIG_USB_MUSB_OTG
-       ret = sprintf(buf, "%d\n", musb->softconnect);
-+#else
-+        ret = 0;
-+#endif
-       spin_unlock_irqrestore(&musb->lock, flags);
-       return ret;
-@@ -2003,6 +2009,7 @@
-       }
-       spin_lock_irqsave(&musb->lock, flags);
-+#ifdef        CONFIG_USB_MUSB_OTG
-       power = musb_readb(musb->mregs, MUSB_POWER);
-@@ -2013,7 +2020,7 @@
-       musb->softconnect = !!val;
-       musb_writeb(musb->mregs, MUSB_POWER, power);
--
-+#endif
-       spin_unlock_irqrestore(&musb->lock, flags);
-       return n;
-@@ -2462,8 +2469,10 @@
-       /* Resets the controller. Has to be done. Without this, most likely
-        * the state machine inside the transceiver doesn't get fixed properly
-        */
-+#ifdef        CONFIG_USB_MUSB_OTG
-       musb_save_ctx_and_suspend(&musb->g, 0);
-       musb_restore_ctx_and_resume(&musb->g);
-+#endif
-       return 0;
---- kernel-power-2.6.28.orig/drivers/usb/musb/omap2430.c
-+++ kernel-power-2.6.28/drivers/usb/musb/omap2430.c
-@@ -161,7 +161,9 @@
- }
- void musb_platform_disable(struct musb *musb)
- {
-+#ifdef CONFIG_USB_MUSB_OTG
-       twl4030_upd_usb_suspended(musb->is_suspended);
-+#endif
- }
- static void omap_vbus_power(struct musb *musb, int is_on, int sleeping)
- {
-@@ -364,6 +366,7 @@
- }
- #ifdef CONFIG_PM
-+#ifdef CONFIG_USB_MUSB_OTG
- void musb_save_ctx_and_suspend(struct usb_gadget *gadget, int overwrite)
- {
-@@ -471,3 +474,4 @@
- }
- EXPORT_SYMBOL_GPL(musb_restore_ctx_and_resume);
- #endif
-+#endif
---- kernel-power-2.6.28.orig/drivers/usb/otg/twl4030-usb.c
-+++ kernel-power-2.6.28/drivers/usb/otg/twl4030-usb.c
-@@ -475,8 +475,11 @@
-       }
- }
-+#ifdef CONFIG_USB_MUSB_OTG
-+
- extern void musb_save_ctx_and_suspend(struct usb_gadget *gadget, int overwrite);
- extern void musb_restore_ctx_and_resume(struct usb_gadget *gadget);
-+#endif
- static void twl4030_phy_suspend(struct twl4030_usb *twl, int controller_off)
- {
-@@ -487,8 +490,10 @@
-       if (!controller_off)
-               twl->asleep = 1;
-+#ifdef CONFIG_USB_MUSB_OTG
-       if (twl->otg.gadget)
-               musb_save_ctx_and_suspend(twl->otg.gadget, 0);
-+#endif
- }
- static void twl4030_phy_resume(struct twl4030_usb *twl)
-@@ -502,9 +507,10 @@
-       if (twl->usb_mode == T2_USB_MODE_ULPI)
-               twl4030_i2c_access(twl, 0);
-       twl->asleep = 0;
--
-+#ifdef CONFIG_USB_MUSB_OTG
-       if (twl->otg.gadget)
-               musb_restore_ctx_and_resume(twl->otg.gadget);
-+#endif
- }
- static int twl4030_usb_ldo_init(struct twl4030_usb *twl)
index 9376b4f..e92c3e4 100644 (file)
@@ -27,11 +27,7 @@ gethercharge.diff
 ondemand-avoid.diff
 overclock.diff
 #usbwhitelist.diff
-#usbignpower.diff
-#nootg.diff
 #bq24150-sniff.diff
-#usbhost4.diff
-#usbhostmode.diff
 bfs.patch
 bfs-316-to-318.patch
 bfs-318-to-330.patch
@@ -43,3 +39,6 @@ voltage_scaling_0.diff
 armthumb.diff
 wl12xx_rohar.diff
 #issue_12309_0.diff
+fmtx.unlock.diff
+radio-bcm2048.diff
+#usbhostmode.diff
index 983805a..71d1d65 100644 (file)
@@ -1,9 +1,9 @@
---- kernel-2.6.28.orig/debian/patches/nokia-20103103+0m5.diff  2010-11-09 22:25:45.000000000 +0100
-+++ kernel-2.6.28/debian/patches/nokia-20103103+0m5.diff       2010-11-09 23:26:15.586667441 +0100
-@@ -1174,21 +1174,6 @@
-       check_charger = 0;
+--- kernel-2.6.28.orig/debian/patches/nokia-20103103+0m5.diff  2010-11-10 00:55:39.000000000 +0100
++++ kernel-2.6.28/debian/patches/nokia-20103103+0m5.diff       2010-11-10 01:07:22.996667558 +0100
+@@ -1131,21 +1131,6 @@
+       }
   
-       return vdat;
+       wl1251_debug(DEBUG_BOOT, "tx %s cmd channel %d",
 ---- kernel-power-2.6.28.orig/include/linux/sched.h
 -+++ kernel-power-2.6.28/include/linux/sched.h
 -@@ -1665,11 +1665,11 @@
  --- kernel-power-2.6.28.orig/include/linux/swap.h
  +++ kernel-power-2.6.28/include/linux/swap.h
  @@ -130,6 +130,17 @@
-@@ -1230,53 +1215,6 @@
-  #define SCO_DISCONN_TIMEOUT  (HZ * 2)
-  #define SCO_CONN_IDLE_TIMEOUT        (HZ * 60)
+@@ -1189,51 +1174,7 @@
   
----- kernel-power-2.6.28.orig/kernel/sched_fair.c
--+++ kernel-power-2.6.28/kernel/sched_fair.c
+ --- kernel-power-2.6.28.orig/kernel/sched_fair.c
+ +++ kernel-power-2.6.28/kernel/sched_fair.c
 -@@ -48,10 +48,10 @@
 - static unsigned int sched_nr_latency = 5;
 - 
@@ -73,6 +71,7 @@
 -              .procname       = "sched_features",
 -              .data           = &sysctl_sched_features,
 -              .maxlen         = sizeof(unsigned int),
++
  --- kernel-power-2.6.28.orig/mm/swapfile.c
  +++ kernel-power-2.6.28/mm/swapfile.c
  @@ -996,11 +996,55 @@
diff --git a/kernel-bfs-2.6.28/debian/patches/usbhost.diff b/kernel-bfs-2.6.28/debian/patches/usbhost.diff
deleted file mode 100644 (file)
index e24324d..0000000
+++ /dev/null
@@ -1,902 +0,0 @@
---- kernel-power-2.6.28.orig/drivers/usb/core/generic.c
-+++ kernel-power-2.6.28/drivers/usb/core/generic.c
-@@ -97,10 +97,10 @@
-                */
-               /* Rule out configs that draw too much bus current */
--              if (c->desc.bMaxPower * 2 > udev->bus_mA) {
-+              /*if (c->desc.bMaxPower * 2 > udev->bus_mA) {
-                       insufficient_power++;
-                       continue;
--              }
-+              }*/
-               /* When the first config's first interface is one of Microsoft's
-                * pet nonstandard Ethernet-over-USB protocols, ignore it unless
-@@ -132,10 +132,10 @@
-                       best = c;
-       }
--      if (insufficient_power > 0)
-+      /*if (insufficient_power > 0)
-               dev_info(&udev->dev, "rejected %d configuration%s "
-                       "due to insufficient available bus power\n",
--                      insufficient_power, plural(insufficient_power));
-+                      insufficient_power, plural(insufficient_power));*/
-       if (best) {
-               i = best->desc.bConfigurationValue;
---- kernel-power-2.6.28.orig/drivers/usb/core/otg_whitelist.h
-+++ kernel-power-2.6.28/drivers/usb/core/otg_whitelist.h
-@@ -14,7 +14,7 @@
- #else
- static inline int is_targeted(struct usb_device *d)
- {
--      return 0;
-+      return 1;
- }
- #endif
---- kernel-power-2.6.28.orig/drivers/usb/gadget/ether.c
-+++ kernel-power-2.6.28/drivers/usb/gadget/ether.c
-@@ -241,7 +241,8 @@
-       .bind                   = rndis_do_config,
-       .bConfigurationValue    = 2,
-       /* .iConfiguration = DYNAMIC */
--      .bmAttributes           = USB_CONFIG_ATT_SELFPOWER,
-+      .bmAttributes   = USB_CONFIG_ATT_ONE,
-+      .bMaxPower      = 250, /* 500mA */
- };
- /*-------------------------------------------------------------------------*/
-@@ -269,7 +270,8 @@
-       .bind                   = eth_do_config,
-       .bConfigurationValue    = 1,
-       /* .iConfiguration = DYNAMIC */
--      .bmAttributes           = USB_CONFIG_ATT_SELFPOWER,
-+      .bmAttributes   = USB_CONFIG_ATT_ONE,
-+      .bMaxPower      = 250, /* 500mA */
- };
- /*-------------------------------------------------------------------------*/
---- kernel-power-2.6.28.orig/drivers/usb/musb/isp1704.h
-+++ kernel-power-2.6.28/drivers/usb/musb/isp1704.h
-@@ -39,21 +39,24 @@
- #define ISP1704_PRODUCT_ID_HIGH               0x03
- #define ISP1704_FUNC_CTRL             0x04
- #define ISP1704_OTG_CTRL              0x0a
--#define ISP1704_USB_INTRISE           0x0d
--#define ISP1704_USB_INTFALL           0x10
-+#define ISP1704_USB_INTRISE           0x0d /* interrupt enable rising register (ds p. 35 ff)*/
-+#define ISP1704_USB_INTFALL           0x10 /* interrupt enable falling register */
-+#define ISP1704_USB_INTSTAT           0x13 /* interrupt status register */
- #define ISP1704_DEBUG                 0x15
- #define ISP1704_SCRATCH                       0x16
- #define ISP1704_PWR_CTRL              0x3d
- /* Function control */
--#define ISP1704_FUNC_CTRL_FULL_SPEED  (1 << 0)
--#define ISP1704_FUNC_CTRL_XCVRSELECT  0x3
--#define ISP1704_FUNC_CTRL_XCVRSELECT_SHIFT    (1 << 0)
--#define ISP1704_FUNC_CTRL_TERMSELECT  (1 << 2)
--#define ISP1704_FUNC_CTRL_OPMODE      (1 << 3)
--#define ISP1704_FUNC_CTRL_OPMODE_SHIFT        3
--#define ISP1704_FUNC_CTRL_RESET               (1 << 5)
--#define ISP1704_FUNC_CTRL_SUSPENDM    (1 << 6)
-+#define ISP1704_FUNC_CTRL_XCVRSELECT_SHIFT    0
-+#define ISP1704_FUNC_CTRL_XCVRSELECT_MASK     (3 << 0)
-+#define ISP1704_FUNC_CTRL_HIGH_SPEED          (0 << 0)
-+#define ISP1704_FUNC_CTRL_FULL_SPEED          (1 << 0)
-+#define ISP1704_FUNC_CTRL_LOW_SPEED           (2 << 0)
-+#define ISP1704_FUNC_CTRL_TERMSELECT          (1 << 2)
-+#define ISP1704_FUNC_CTRL_OPMODE              (1 << 3)
-+#define ISP1704_FUNC_CTRL_OPMODE_SHIFT                3
-+#define ISP1704_FUNC_CTRL_RESET                       (1 << 5)
-+#define ISP1704_FUNC_CTRL_SUSPENDM            (1 << 6)
- /* OTG Control */
- #define ISP1704_OTG_CTRL_IDPULLUP     (1 << 0)
---- kernel-power-2.6.28.orig/drivers/usb/musb/musb_core.c
-+++ kernel-power-2.6.28/drivers/usb/musb/musb_core.c
-@@ -142,6 +142,51 @@
- MODULE_LICENSE("GPL");
- MODULE_ALIAS("platform:" MUSB_DRIVER_NAME);
-+
-+void musb_force_term(void __iomem *addr, enum musb_term term)
-+{
-+      u8 r;
-+
-+      /* activate pulldown resistors on datalines */
-+      r = musb_ulpi_readb(addr, ISP1704_OTG_CTRL);
-+      r |= ISP1704_OTG_CTRL_DP_PULLDOWN | ISP1704_OTG_CTRL_DM_PULLDOWN;
-+      musb_ulpi_writeb(addr, ISP1704_OTG_CTRL, r);
-+
-+      r = musb_ulpi_readb(addr, ISP1704_FUNC_CTRL);
-+      /* clear speed-selection  bits */
-+      r &= ~ISP1704_FUNC_CTRL_XCVRSELECT_MASK;
-+      /* set new speed-selection bits */
-+      switch(term) {
-+
-+      case MUSB_TERM_HOST_HIGHSPEED:
-+              r |= ISP1704_FUNC_CTRL_HIGH_SPEED;
-+              r &= ~ISP1704_FUNC_CTRL_TERMSELECT;
-+              r &= ~ISP1704_FUNC_CTRL_OPMODE;
-+              break;
-+
-+      case MUSB_TERM_HOST_FULLSPEED:
-+              r |= ISP1704_FUNC_CTRL_FULL_SPEED;
-+              r |= ISP1704_FUNC_CTRL_TERMSELECT;
-+              r &= ~ISP1704_FUNC_CTRL_OPMODE;
-+              break;
-+
-+      case MUSB_TERM_HOST_LOWSPEED:
-+              r |= ISP1704_FUNC_CTRL_LOW_SPEED;
-+              r |= ISP1704_FUNC_CTRL_TERMSELECT;
-+              r &= ~ISP1704_FUNC_CTRL_OPMODE;
-+              break;
-+
-+      default:
-+              ERR("Unknown musb termination\n");
-+              return;
-+      }
-+
-+      musb_ulpi_writeb(addr, ISP1704_FUNC_CTRL, r);
-+
-+}
-+
-+
-+
- static inline int musb_verify_charger(void __iomem *addr)
- {
-       u8 r, ret = 0;
-@@ -220,6 +265,8 @@
-       u8              vdat = 0;
-       u8              r;
-+      u8 testmode;
-+      testmode = musb_readb(musb->mregs,MUSB_TESTMODE);
-       msleep(5);
-@@ -297,7 +344,7 @@
-                       break;
-       }
--      if (vdat) {
-+      if (vdat && !(testmode & MUSB_TEST_FORCE_HOST)) {
-               /* REVISIT: This code works only with dedicated chargers!
-                * When support for HOST/HUB chargers is added, don't
-                * forget this.
-@@ -349,7 +396,7 @@
-       prefetch((u8 *)src);
--      DBG(4, "%cX ep%d fifo %p count %d buf %p\n",
-+      DBG(6, "%cX ep%d fifo %p count %d buf %p\n",
-                       'T', hw_ep->epnum, fifo, len, src);
-       /* we can't assume unaligned reads work */
-@@ -387,7 +434,7 @@
- {
-       void __iomem *fifo = hw_ep->fifo;
--      DBG(4, "%cX ep%d fifo %p count %d buf %p\n",
-+      DBG(6, "%cX ep%d fifo %p count %d buf %p\n",
-                       'R', hw_ep->epnum, fifo, len, dst);
-       /* we can't assume unaligned writes work */
-@@ -490,7 +537,6 @@
- {
-       struct musb     *musb = (struct musb *)data;
-       unsigned long   flags;
--
-       spin_lock_irqsave(&musb->lock, flags);
-       switch (musb->xceiv->state) {
-       case OTG_STATE_B_WAIT_ACON:
-@@ -572,10 +618,19 @@
- static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
-                               u8 devctl, u8 power)
- {
-+      u8 testmode;
-       irqreturn_t handled = IRQ_NONE;
-       void __iomem *mbase = musb->mregs;
-       u8 r;
-+      testmode = musb_readb(mbase,MUSB_TESTMODE);
-+  if(testmode & MUSB_TEST_FORCE_HOST) {
-+              if(int_usb & MUSB_INTR_SESSREQ) {
-+                      DBG(1,"Piggybacking CONNECT on SESS REQ\n");
-+                      musb->int_usb |= MUSB_INTR_CONNECT;
-+              } 
-+      }
-+
-       DBG(3, "<== Power=%02x, DevCtl=%02x, int_usb=0x%x\n", power, devctl,
-               int_usb);
-@@ -630,6 +685,8 @@
-               } else {
-                       switch (musb->xceiv->state) {
- #ifdef CONFIG_USB_MUSB_HDRC_HCD
-+                      case OTG_STATE_A_WAIT_BCON:
-+                      case OTG_STATE_A_HOST:
-                       case OTG_STATE_A_SUSPEND:
-                               /* possibly DISCONNECT is upcoming */
-                               musb->xceiv->state = OTG_STATE_A_HOST;
-@@ -678,7 +735,7 @@
-                * be discarded silently.
-                */
-               if ((devctl & MUSB_DEVCTL_VBUS)
--                  && !(devctl & MUSB_DEVCTL_BDEVICE)) {
-+                  && host_mode(musb->mregs)) {
-                       musb_writeb(mbase, MUSB_DEVCTL, MUSB_DEVCTL_SESSION);
-                       musb->ep0_stage = MUSB_EP0_START;
-                       musb->xceiv->state = OTG_STATE_A_IDLE;
-@@ -796,9 +853,15 @@
-                                       + msecs_to_jiffies(musb->a_wait_bcon));
-                       break;
-               case OTG_STATE_A_HOST:
-+                      if(testmode & MUSB_TEST_FORCE_HOST) {
-+                              //                              musb->int_usb |= MUSB_INTR_RESUME;
-+                              break;
-+                      }
-+
-                       musb->xceiv->state = OTG_STATE_A_SUSPEND;
-                       musb->is_active = is_otg_enabled(musb)
-                                       && musb->xceiv->host->b_hnp_enable;
-+
-                       break;
-               case OTG_STATE_B_HOST:
-                       /* Transition to B_PERIPHERAL, see 6.8.2.6 p 44 */
-@@ -818,6 +881,7 @@
-               musb->is_active = 1;
-               set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
-+
-               musb->ep0_stage = MUSB_EP0_START;
- #ifdef CONFIG_USB_MUSB_OTG
-@@ -836,9 +900,65 @@
-               musb->port1_status |= USB_PORT_STAT_CONNECTION
-                                       |(USB_PORT_STAT_C_CONNECTION << 16);
--              /* high vs full speed is just a guess until after reset */
--              if (devctl & MUSB_DEVCTL_LSDEV)
--                      musb->port1_status |= USB_PORT_STAT_LOW_SPEED;
-+              if (testmode & MUSB_TEST_FORCE_HOST) {
-+                      u8 r,reg;
-+      void __iomem *mbase = musb->mregs;
-+
-+                      musb_force_term(musb->mregs,MUSB_TERM_HOST_HIGHSPEED);
-+
-+                      r = musb_ulpi_readb(mbase, ISP1704_DEBUG);
-+                      DBG(1,"Linestate %x\n",r);
-+                      switch(r) {
-+                      case 2:
-+                              musb->port1_status |= USB_PORT_STAT_LOW_SPEED;
-+                              reg = musb_readb(mbase, MUSB_TESTMODE);
-+                              reg &= ~MUSB_TEST_FORCE_FS;
-+                              reg &= ~MUSB_TEST_FORCE_HS;
-+                              musb_writeb(mbase, MUSB_TESTMODE, reg);
-+
-+                              reg = musb_readb(mbase, MUSB_POWER);
-+                              reg &= ~MUSB_POWER_HSENAB;
-+                              musb_writeb(mbase, MUSB_POWER, reg);
-+
-+                              musb_force_term(musb->mregs,MUSB_TERM_HOST_LOWSPEED);
-+                              break;
-+                      case 1:
-+                              /*High or full speed*/
-+                              reg = musb_readb(mbase, MUSB_TESTMODE);
-+                              if(reg &  MUSB_TEST_FORCE_HS) {
-+                                      /*High speed*/
-+                                      reg &= ~MUSB_TEST_FORCE_FS;
-+                                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+
-+                                      reg = musb_readb(mbase, MUSB_POWER);
-+                                      reg |= MUSB_POWER_HSENAB;
-+                                      musb_writeb(mbase, MUSB_POWER, reg);
-+                              } else {
-+                                      /*Full speed*/
-+                                      reg |= MUSB_TEST_FORCE_FS;
-+                                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+
-+                                      reg = musb_readb(mbase, MUSB_POWER);
-+                                      reg &= ~MUSB_POWER_HSENAB;
-+                                      musb_writeb(mbase, MUSB_POWER, reg);
-+                              }
-+
-+                              musb_force_term(mbase,MUSB_TERM_HOST_FULLSPEED);
-+
-+                              break;
-+                      case 0:
-+                      case 3:
-+                              /*invalid*/
-+                              WARNING("Invalid line state of %d\n",r);
-+                              break;
-+                              
-+                      }
-+              } else {
-+
-+                      /* high vs full speed is just a guess until after reset */
-+                      if (devctl & MUSB_DEVCTL_LSDEV)
-+                              musb->port1_status |= USB_PORT_STAT_LOW_SPEED;
-+              }
-               if (hcd->status_urb)
-                       usb_hcd_poll_rh_status(hcd);
-@@ -974,6 +1094,8 @@
-                               musb->ignore_disconnect = 1;
-                               musb_g_reset(musb);
-                               /* FALLTHROUGH */
-+                      case OTG_STATE_A_HOST:
-+                              musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
-                       case OTG_STATE_A_WAIT_BCON:     /* OPT TD.4.7-900ms */
-                               DBG(1, "HNP: Setting timer as %s\n",
-                                               otg_state_string(musb));
-@@ -2421,8 +2543,7 @@
-               DBG(1, "%s mode, status %d, devctl %02x %c\n",
-                       "HOST", status,
-                       musb_readb(musb->mregs, MUSB_DEVCTL),
--                      (musb_readb(musb->mregs, MUSB_DEVCTL)
--                                      & MUSB_DEVCTL_BDEVICE
-+                              (!host_mode(musb->mregs)
-                               ? 'B' : 'A'));
-       } else /* peripheral is enabled */ {
---- kernel-power-2.6.28.orig/drivers/usb/musb/musb_core.h
-+++ kernel-power-2.6.28/drivers/usb/musb/musb_core.h
-@@ -85,6 +85,16 @@
- #define       is_host_active(musb)            is_host_capable()
- #endif
-+static inline int host_mode(void __iomem *addr) 
-+{
-+      u8              devctl,testmode;
-+      devctl = musb_readb(addr, MUSB_DEVCTL);
-+      testmode = musb_readb(addr,MUSB_TESTMODE);
-+
-+      return (testmode & MUSB_TEST_FORCE_HOST) || !(devctl & MUSB_DEVCTL_BDEVICE);
-+}
-+
-+
- #if defined(CONFIG_USB_MUSB_OTG) || defined(CONFIG_USB_MUSB_PERIPHERAL)
- /* for some reason, the "select USB_GADGET_MUSB_HDRC" doesn't always
-  * override that choice selection (often USB_GADGET_DUMMY_HCD).
-@@ -593,6 +603,14 @@
- extern int musb_platform_set_mode(struct musb *musb, u8 musb_mode);
-+enum musb_term {
-+      MUSB_TERM_HOST_HIGHSPEED,
-+      MUSB_TERM_HOST_FULLSPEED,
-+      MUSB_TERM_HOST_LOWSPEED,
-+};
-+
-+extern void musb_force_term(void __iomem *addr, enum musb_term term);
-+
- #if defined(CONFIG_USB_TUSB6010) || defined(CONFIG_BLACKFIN) || \
-       defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP34XX)
- extern void musb_platform_try_idle(struct musb *musb, unsigned long timeout);
---- kernel-power-2.6.28.orig/drivers/usb/musb/musb_gadget.c
-+++ kernel-power-2.6.28/drivers/usb/musb/musb_gadget.c
-@@ -1957,7 +1957,7 @@
-       u8              power;
-       DBG(3, "<== %s addr=%x driver '%s'\n",
--                      (devctl & MUSB_DEVCTL_BDEVICE)
-+                      !host_mode(musb->mregs)
-                               ? "B-Device" : "A-Device",
-                       musb_readb(mbase, MUSB_FADDR),
-                       musb->gadget_driver
-@@ -1994,7 +1994,7 @@
-       /* Normal reset, as B-Device;
-        * or else after HNP, as A-Device
-        */
--      if (devctl & MUSB_DEVCTL_BDEVICE) {
-+      if (!host_mode(musb->mregs)) {
-               musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
-               musb->g.is_a_peripheral = 0;
-       } else if (is_otg_enabled(musb)) {
---- kernel-power-2.6.28.orig/drivers/usb/musb/musb_host.c
-+++ kernel-power-2.6.28/drivers/usb/musb/musb_host.c
-@@ -1863,8 +1863,10 @@
-       unsigned                        interval;
-       /* host role must be active */
--      if (!is_host_active(musb) || !musb->is_active)
-+      if (!is_host_active(musb) || !musb->is_active) {
-+              printk(KERN_ERR "musb is_host_active %d is_active %d\n",is_host_active(musb),musb->is_active);
-               return -ENODEV;
-+      }
-       spin_lock_irqsave(&musb->lock, flags);
-       ret = usb_hcd_link_urb_to_ep(hcd, urb);
-@@ -2275,6 +2277,7 @@
-       return 0;
- }
-+
- const struct hc_driver musb_hc_driver = {
-       .description            = "musb-hcd",
-       .product_desc           = "MUSB HDRC host driver",
-@@ -2298,6 +2301,5 @@
-       .hub_control            = musb_hub_control,
-       .bus_suspend            = musb_bus_suspend,
-       .bus_resume             = musb_bus_resume,
--      /* .start_port_reset    = NULL, */
-       /* .hub_irq_enable      = NULL, */
- };
---- kernel-power-2.6.28.orig/drivers/usb/musb/musb_procfs.c
-+++ kernel-power-2.6.28/drivers/usb/musb/musb_procfs.c
-@@ -37,6 +37,7 @@
- #include <linux/seq_file.h>
- #include <linux/uaccess.h>    /* FIXME remove procfs writes */
- #include <mach/hardware.h>
-+#include <asm/mach-types.h>
- #include "musb_core.h"
-@@ -450,8 +451,8 @@
-               return 0;
-       buffer += count;
--      code = sprintf(buffer, "OTG state: %s; %sactive\n",
--                      otg_state_string(musb),
-+      code = sprintf(buffer, "OTG state: %s:%d; %sactive\n",
-+                                                               otg_state_string(musb),musb->xceiv->state,
-                       musb->is_active ? "" : "in");
-       if (code <= 0)
-               goto done;
-@@ -591,16 +592,33 @@
-  *
-  * C soft-connect
-  * c soft-disconnect
-- * I enable HS
-- * i disable HS
-- * s stop session
-- * F force session (OTG-unfriendly)
-+ * D<num> set/query the debug level
-  * E rElinquish bus (OTG)
-+ * e enumerate
-+ * F force session (OTG-unfriendly)
-  * H request host mode
-  * h cancel host request
-+ * I enable HS
-+ * i disable HS
-+ * J set HS test mode
-+ * j clear HS test mode
-+ * K set FS test mode
-+ * k clear FS test mode
-+ * M set host test mode
-+ * m clear host test mode
-+ * R reset peripheral
-+ * r resume root hub
-+ * s stop session
-  * T start sending TEST_PACKET
-- * D<num> set/query the debug level
-+ * X term highspeed
-+ * Y term fullspeed
-+ * Z term lowspeed
-+ * 
-  */
-+
-+extern        void musb_port_reset(struct musb *musb, bool do_reset);
-+extern void musb_port_suspend(struct musb *musb, bool do_suspend);
-+
- static int musb_proc_write(struct file *file, const char __user *buffer,
-                       unsigned long count, void *data)
- {
-@@ -608,49 +626,63 @@
-       u8 reg;
-       struct musb *musb = (struct musb *)data;
-       void __iomem *mbase = musb->mregs;
-+      unsigned long   flags;
-+      struct usb_hcd *hcd = musb_to_hcd(musb);
-+      struct usb_bus *bus = hcd_to_bus(hcd);
-       /* MOD_INC_USE_COUNT; */
-       if (unlikely(copy_from_user(&cmd, buffer, 1)))
-               return -EFAULT;
-+
-       switch (cmd) {
-       case 'C':
-               if (mbase) {
--                      reg = musb_readb(mbase, MUSB_POWER)
--                                      | MUSB_POWER_SOFTCONN;
-+                      reg = musb_readb(mbase, MUSB_POWER);
-+                      reg |= MUSB_POWER_SOFTCONN;
-                       musb_writeb(mbase, MUSB_POWER, reg);
-               }
-               break;
-       case 'c':
-               if (mbase) {
--                      reg = musb_readb(mbase, MUSB_POWER)
--                                      & ~MUSB_POWER_SOFTCONN;
-+                      reg = musb_readb(mbase, MUSB_POWER);
-+                      reg &= ~MUSB_POWER_SOFTCONN;
-                       musb_writeb(mbase, MUSB_POWER, reg);
-               }
-               break;
-       case 'I':
-               if (mbase) {
--                      reg = musb_readb(mbase, MUSB_POWER)
--                                      | MUSB_POWER_HSENAB;
-+                      reg = musb_readb(mbase, MUSB_POWER);
-+                      reg |= MUSB_POWER_HSENAB;
-                       musb_writeb(mbase, MUSB_POWER, reg);
-               }
-               break;
-       case 'i':
-               if (mbase) {
--                      reg = musb_readb(mbase, MUSB_POWER)
--                                      & ~MUSB_POWER_HSENAB;
-+                      reg = musb_readb(mbase, MUSB_POWER);
-+                      reg &= ~MUSB_POWER_HSENAB;
-                       musb_writeb(mbase, MUSB_POWER, reg);
-               }
-               break;
-       case 'F':
--              reg = musb_readb(mbase, MUSB_DEVCTL);
--              reg |= MUSB_DEVCTL_SESSION;
--              musb_writeb(mbase, MUSB_DEVCTL, reg);
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_DEVCTL);
-+                      reg |= MUSB_DEVCTL_SESSION;
-+                      musb_writeb(mbase, MUSB_DEVCTL, reg);
-+              }
-+              break;
-+
-+      case 's':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_DEVCTL);
-+                      reg &= ~MUSB_DEVCTL_SESSION;
-+                      musb_writeb(mbase, MUSB_DEVCTL, reg);
-+              }
-               break;
-       case 'H':
-@@ -679,6 +711,114 @@
-               }
-               break;
-+      case 'M':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_TESTMODE);
-+                      reg |= MUSB_TEST_FORCE_HOST;
-+                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+              }
-+              break;
-+      
-+      case 'm':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_TESTMODE);
-+                      reg &= ~MUSB_TEST_FORCE_HOST;
-+                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+                      MUSB_DEV_MODE(musb);
-+                      musb->xceiv->state = OTG_STATE_B_IDLE;
-+              }
-+              break;
-+
-+  case 'L':
-+                      musb->xceiv->state = OTG_STATE_A_HOST;
-+                      MUSB_HST_MODE(musb);
-+              break;
-+
-+  case 'l':
-+                      musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
-+                      MUSB_HST_MODE(musb);
-+              break;
-+
-+      case 'J':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_TESTMODE);
-+                      reg |= MUSB_TEST_FORCE_HS;
-+                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+              }
-+              break;
-+
-+      case 'j':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_TESTMODE);
-+                      reg &= ~MUSB_TEST_FORCE_HS;
-+                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+              }
-+              break;
-+
-+      case 'K':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_TESTMODE);
-+                      reg |= MUSB_TEST_FORCE_FS;
-+                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+              }
-+              break;
-+
-+      case 'k':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_TESTMODE);
-+                      reg &= ~MUSB_TEST_FORCE_FS;
-+                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+              }
-+              break;
-+
-+  case 'X':
-+    if (mbase)
-+                      musb_force_term(mbase,MUSB_TERM_HOST_HIGHSPEED);
-+              break;
-+
-+  case 'Y':
-+    if (mbase)
-+                      musb_force_term(mbase,MUSB_TERM_HOST_FULLSPEED);
-+              break;
-+
-+  case 'Z':
-+    if (mbase)
-+                      musb_force_term(mbase,MUSB_TERM_HOST_LOWSPEED);
-+              break;
-+
-+      case 'R':
-+              musb_port_reset(musb, true);
-+              while (time_before(jiffies, musb->rh_timer))
-+                      msleep(1);
-+              musb_port_reset(musb, false);
-+
-+              break;
-+              
-+  case 'r':
-+              usb_hcd_resume_root_hub(hcd);
-+              break;
-+
-+  case 'e':
-+              if(bus) 
-+                      usb_bus_start_enum(bus,bus->otg_port);
-+              break;
-+
-+      case 'U':
-+              /*Suspend*/
-+              musb_port_suspend(musb, true);
-+              break;
-+
-+      case 'u':
-+              /*Resume*/
-+              musb_port_suspend(musb, false);
-+              /*How to end sanely? */
-+              musb_port_reset(musb, true);
-+              while (time_before(jiffies, musb->rh_timer))
-+                      msleep(1);
-+              musb_port_reset(musb, false);
-+
-+      break;
-+
-       case '?':
-               INFO("?: you are seeing it\n");
-               INFO("C/c: soft connect enable/disable\n");
-@@ -695,6 +835,7 @@
-       musb_platform_try_idle(musb, 0);
-+
-       return count;
- }
-@@ -709,6 +850,8 @@
-       count -= off;
-       count -= 1;             /* for NUL at end */
-+      count -= 20; /* Padding */
-+
-       if (count <= 0)
-               return -EINVAL;
-@@ -720,6 +863,9 @@
-               count -= code;
-       }
-+      if (count < 0)
-+              goto done;
-+
-       /* generate the report for the end points */
-       /* REVISIT ... not unless something's connected! */
-       for (epnum = 0; count >= 0 && epnum < musb->nr_endpoints;
-@@ -728,14 +874,22 @@
-               if (code > 0) {
-                       buffer += code;
-                       count -= code;
-+                      if (count < 0)
-+                              goto done;
-               }
-       }
-+
-+ done:
-+
-       musb_platform_try_idle(musb, 0);
-       spin_unlock_irqrestore(&musb->lock, flags);
-       *eof = 1;
-+      if(count < 0)
-+              return -EINVAL;
-+
-       return buffer - page;
- }
---- kernel-power-2.6.28.orig/drivers/usb/musb/musb_virthub.c
-+++ kernel-power-2.6.28/drivers/usb/musb/musb_virthub.c
-@@ -46,7 +46,7 @@
- #include "musb_core.h"
--static void musb_port_suspend(struct musb *musb, bool do_suspend)
-+void musb_port_suspend(struct musb *musb, bool do_suspend)
- {
-       u8              power;
-       void __iomem    *mbase = musb->mregs;
-@@ -106,11 +106,13 @@
-               /* later, GetPortStatus will stop RESUME signaling */
-               musb->port1_status |= MUSB_PORT_STAT_RESUME;
--              musb->rh_timer = jiffies + msecs_to_jiffies(20);
-+              /*OMAP documentation states range of 10-15 ms */
-+              musb->rh_timer = jiffies + msecs_to_jiffies(13);
-+              //              musb->rh_timer = jiffies + msecs_to_jiffies(20);
-       }
- }
--static void musb_port_reset(struct musb *musb, bool do_reset)
-+void musb_port_reset(struct musb *musb, bool do_reset)
- {
-       u8              power;
-       void __iomem    *mbase = musb->mregs;
-@@ -131,7 +133,7 @@
-        */
-       power = musb_readb(mbase, MUSB_POWER);
-       if (do_reset) {
--
-+              DBG(4, "root port reset started\n");
-               /*
-                * If RESUME is set, we must make sure it stays minimum 20 ms.
-                * Then we must clear RESUME and wait a bit to let musb start
---- kernel-power-2.6.28.orig/drivers/usb/musb/omap2430.c
-+++ kernel-power-2.6.28/drivers/usb/musb/omap2430.c
-@@ -77,11 +77,14 @@
-       switch (musb->xceiv->state) {
-       case OTG_STATE_A_WAIT_BCON:
-+              if(host_mode(musb->mregs))
-+                      break; /*Don't time out*/
-+
-               devctl &= ~MUSB_DEVCTL_SESSION;
-               musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
-               devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
--              if (devctl & MUSB_DEVCTL_BDEVICE) {
-+              if (!host_mode(musb->mregs)) {
-                       musb->xceiv->state = OTG_STATE_B_IDLE;
-                       MUSB_DEV_MODE(musb);
-               } else {
-@@ -109,11 +112,14 @@
- #endif
- #ifdef CONFIG_USB_MUSB_HDRC_HCD
-       case OTG_STATE_A_HOST:
-+
-+
-               devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
--              if (devctl &  MUSB_DEVCTL_BDEVICE)
-+              if (!host_mode(musb->mregs))
-                       musb->xceiv->state = OTG_STATE_B_IDLE;
--              else
--                      musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
-+              /*Don't time out if host*/
-+              //              else
-+              //      musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
- #endif
-       default:
-               break;
-@@ -133,7 +139,7 @@
-       /* Never idle if active, or when VBUS timeout is not set as host */
-       if (musb->is_active || ((musb->a_wait_bcon == 0)
-                       && (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) {
--              DBG(4, "%s active, deleting timer\n", otg_state_string(musb));
-+              DBG(6, "%s active, deleting timer\n", otg_state_string(musb));
-               del_timer(&musb_idle_timer);
-               last_timer = jiffies;
-               return;
-@@ -143,13 +149,13 @@
-               if (!timer_pending(&musb_idle_timer))
-                       last_timer = timeout;
-               else {
--                      DBG(4, "Longer idle timer already pending, ignoring\n");
-+                      DBG(6, "Longer idle timer already pending, ignoring\n");
-                       return;
-               }
-       }
-       last_timer = timeout;
--      DBG(4, "%s inactive, for idle timer for %lu ms\n",
-+      DBG(6, "%s inactive, for idle timer for %lu ms\n",
-               otg_state_string(musb),
-               (unsigned long)jiffies_to_msecs(timeout - jiffies));
-       mod_timer(&musb_idle_timer, timeout);
-@@ -182,8 +188,14 @@
-               musb->xceiv->default_a = 1;
-               musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
-               devctl |= MUSB_DEVCTL_SESSION;
--
-               MUSB_HST_MODE(musb);
-+              
-+              if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS) {
-+                      /*Power is already applied. Skip VRISE and go directly to BCON.*/
-+                      musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
-+              }
-+
-+
-       } else {
-               musb->is_active = 0;
-@@ -420,7 +432,7 @@
-       u8 r;
-       unsigned long   flags;
--      DBG(3, "restoring register context\n");
-+      DBG(3, "restoring register context for %s\n","musb_restore_ctx_and_resume");
-       if (musb->board && musb->board->xceiv_power)
-               musb->board->xceiv_power(1);
-@@ -431,13 +443,17 @@
-       else
-               clk_enable(musb->clock);
--      /* Recover OTG control */
--      r = musb_ulpi_readb(musb->mregs, ISP1704_OTG_CTRL);
--      r |= ISP1704_OTG_CTRL_IDPULLUP | ISP1704_OTG_CTRL_DP_PULLDOWN;
--      musb_ulpi_writeb(musb->mregs, ISP1704_OTG_CTRL, r);
--
-+      if(host_mode(musb->mregs)) {
-+              musb_force_term(musb->mregs,MUSB_TERM_HOST_FULLSPEED);
-+              r = musb_ulpi_readb(musb->mregs,ISP1704_FUNC_CTRL);
-+      } else {
-+              /* Recover OTG control */
-+              r = musb_ulpi_readb(musb->mregs, ISP1704_OTG_CTRL);
-+              r |= ISP1704_OTG_CTRL_IDPULLUP | ISP1704_OTG_CTRL_DP_PULLDOWN;
-+              musb_ulpi_writeb(musb->mregs, ISP1704_OTG_CTRL, r);
-+              r = ISP1704_FUNC_CTRL_FULL_SPEED;
-+      }
-       /* Recover FUNC control */
--      r = ISP1704_FUNC_CTRL_FULL_SPEED;
-       r |= ISP1704_FUNC_CTRL_SUSPENDM | ISP1704_FUNC_CTRL_RESET;
-       musb_ulpi_writeb(musb->mregs, ISP1704_FUNC_CTRL, r);
---- kernel-power-2.6.28.orig/drivers/usb/otg/otg.c
-+++ kernel-power-2.6.28/drivers/usb/otg/otg.c
-@@ -160,7 +160,8 @@
-       /* add other match criteria here ... */
--
-+      return 1;
-+      
-       /* OTG MESSAGE: report errors here, customize to match your product */
-       dev_err(&dev->dev, "device v%04x p%04x is not supported\n",
-               le16_to_cpu(dev->descriptor.idVendor),
---- kernel-power-2.6.28.orig/drivers/usb/otg/twl4030-usb.c
-+++ kernel-power-2.6.28/drivers/usb/otg/twl4030-usb.c
-@@ -239,9 +239,9 @@
- enum linkstat {
-       USB_LINK_UNKNOWN = 0,
--      USB_LINK_NONE,
--      USB_LINK_VBUS,
--      USB_LINK_ID,
-+      USB_LINK_NONE = 1,
-+      USB_LINK_VBUS = 2,
-+      USB_LINK_ID = 3,
- };
- struct twl4030_usb {
diff --git a/kernel-bfs-2.6.28/debian/patches/usbhost2.diff b/kernel-bfs-2.6.28/debian/patches/usbhost2.diff
deleted file mode 100644 (file)
index 6a593ce..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
---- kernel-power-2.6.28.orig/arch/arm/mach-omap2/prcm.c
-+++ kernel-power-2.6.28/arch/arm/mach-omap2/prcm.c
-@@ -131,7 +131,7 @@
-  * HACK for RX51 boards previous to B3 which
-  * doesn't have a reset line to isp1707 transceiver
-  */
--extern void musb_emergency_stop(void);
-+/*extern void musb_emergency_stop(void);*/
- /* Resets clock rates and reboots the system. Only called from system.h */
- void omap_prcm_arch_reset(char mode)
-@@ -156,7 +156,7 @@
-        * HACK for RX51 boards previous to B3 which
-        * doesn't have a reset line to isp1707 transceiver
-        */
--      musb_emergency_stop();
-+      /*musb_emergency_stop();*/
-       prm_set_mod_reg_bits(OMAP_RST_GS, prcm_offs, RM_RSTCTRL);
- }
---- kernel-power-2.6.28.orig/drivers/i2c/chips/twl4030-poweroff.c
-+++ kernel-power-2.6.28/drivers/i2c/chips/twl4030-poweroff.c
-@@ -39,6 +39,7 @@
- {
-       twl4030_usb_suspended = suspended;
- }
-+EXPORT_SYMBOL(twl4030_upd_usb_suspended);
- static void twl4030_poweroff(void)
- {
diff --git a/kernel-bfs-2.6.28/debian/patches/usbhost3.diff b/kernel-bfs-2.6.28/debian/patches/usbhost3.diff
deleted file mode 100644 (file)
index 1239e5b..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
---- kernel-power-2.6.28.orig/drivers/usb/gadget/nokia.c
-+++ kernel-power-2.6.28/drivers/usb/gadget/nokia.c
-@@ -142,8 +142,7 @@
-       .bind           = nokia_bind_config,
-       .bConfigurationValue = 1,
-       /* .iConfiguration = DYNAMIC */
--      .bmAttributes   = USB_CONFIG_ATT_ONE,
--      .bMaxPower      = 250, /* 500mA */
-+      .bmAttributes           = USB_CONFIG_ATT_SELFPOWER
- };
- static struct usb_configuration nokia_config_100ma_driver = {
-@@ -151,8 +150,7 @@
-       .bind           = nokia_bind_config,
-       .bConfigurationValue = 2,
-       /* .iConfiguration = DYNAMIC */
--      .bmAttributes   = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
--      .bMaxPower      = 50, /* 100 mA */
-+      .bmAttributes           = USB_CONFIG_ATT_SELFPOWER
- };
- static int __init nokia_bind(struct usb_composite_dev *cdev)
---- kernel-power-2.6.28.orig/arch/arm/mach-omap2/Makefile
-+++ kernel-power-2.6.28/arch/arm/mach-omap2/Makefile
-@@ -100,7 +100,8 @@
-                                          board-rx51-peripherals.o \
-                                          mmc-twl4030.o \
-                                          ssi.o \
--                                         usb-musb.o
-+                                         usb-ehci.o \
-+                                         usb-musb.o 
- obj-$(CONFIG_MACH_NOKIA_RX71)         += board-rx71.o \
-                                          board-rx71-peripherals.o
diff --git a/kernel-bfs-2.6.28/debian/patches/usbhost4.diff b/kernel-bfs-2.6.28/debian/patches/usbhost4.diff
deleted file mode 100644 (file)
index 02d644c..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
---- kernel-power-2.6.28.orig/drivers/usb/musb/musb_procfs.c
-+++ kernel-power-2.6.28/drivers/usb/musb/musb_procfs.c
-@@ -656,15 +656,50 @@
-       case 'H':
-               if (mbase) {
-                       reg = musb_readb(mbase, MUSB_DEVCTL);
-+                        printk(KERN_WARNING "usb devctl before=0x%0x\n",reg);
-                       reg |= MUSB_DEVCTL_HR;
-                       musb_writeb(mbase, MUSB_DEVCTL, reg);
--                      /* MUSB_HST_MODE( ((struct musb*)data) ); */
--                      /* WARNING("Host Mode\n"); */
-+                      MUSB_HST_MODE( ((struct musb*)data) );
-+                      WARNING("Host Mode\n");
-+                      reg = musb_readb(mbase, MUSB_DEVCTL);
-+                        printk(KERN_WARNING "usb devctl after set=0x%0x\n",reg);
-+              }
-+              break;
-+
-+      case 'K':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_DEVCTL);
-+                        printk(KERN_WARNING "usb devctl before=0x%0x\n",reg);
-+                      DBG(1, "entering FORCE_HOSTMODE\n");
-+                      musb_writeb(mbase, MUSB_TESTMODE,MUSB_TEST_FORCE_HOST);
-+                      reg = musb_readb(mbase, MUSB_DEVCTL);
-+                        printk(KERN_WARNING "usb devctl after force=0x%0x\n",reg);
-+                      reg |= MUSB_DEVCTL_HR |  MUSB_DEVCTL_HM | MUSB_DEVCTL_SESSION;
-+                      ctx.devctl |= MUSB_DEVCTL_HR |  MUSB_DEVCTL_HM | MUSB_DEVCTL_SESSION;
-+                      musb_writeb(mbase, MUSB_DEVCTL, reg);
-+                      MUSB_HST_MODE( ((struct musb*)data) );
-+                      WARNING("Host Mode\n");
-+                      reg = musb_readb(mbase, MUSB_DEVCTL);
-+                        printk(KERN_WARNING "usb devctl after set=0x%0x\n",reg);
-+              }
-+              break;
-+
-+      case 'k':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_DEVCTL);
-+                        printk(KERN_WARNING "usb devctl before=0x%0x\n",reg);
-+                      DBG(1, "entering FORCE_HOSTMODE\n");
-+                      musb_writeb(mbase, MUSB_TESTMODE,MUSB_TEST_FORCE_HOST);
-+                      reg = musb_readb(mbase, MUSB_DEVCTL);
-+                        printk(KERN_WARNING "usb devctl after force=0x%0x\n",reg);
-+                      MUSB_HST_MODE( ((struct musb*)data) );
-+                      WARNING("Host Mode\n");
-               }
-               break;
-       case 'h':
-               if (mbase) {
-+                      musb_writeb(mbase, MUSB_TESTMODE,0);
-                       reg = musb_readb(mbase, MUSB_DEVCTL);
-                       reg &= ~MUSB_DEVCTL_HR;
-                       musb_writeb(mbase, MUSB_DEVCTL, reg);
---- kernel-power-2.6.28.orig/drivers/usb/musb/musb_core.c
-+++ kernel-power-2.6.28/drivers/usb/musb/musb_core.c
-@@ -113,7 +113,7 @@
- #endif
- static struct musb *the_musb;
--static struct musb_ctx ctx;
-+struct musb_ctx ctx;
- #ifndef CONFIG_MUSB_PIO_ONLY
- static int __initdata use_dma = 1;
---- kernel-power-2.6.28.orig/drivers/usb/musb/musb_core.h
-+++ kernel-power-2.6.28/drivers/usb/musb/musb_core.h
-@@ -350,6 +350,8 @@
-       u8      naklimit0;
- };
-+extern struct musb_ctx ctx;
-+
- /*
-  * struct musb - Driver instance data.
-  */
diff --git a/kernel-bfs-2.6.28/debian/patches/usbhost_egoshin.diff b/kernel-bfs-2.6.28/debian/patches/usbhost_egoshin.diff
deleted file mode 100644 (file)
index d11ca50..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
---- kernel-power-2.6.28.orig/drivers/usb/otg/twl4030-usb.c
-+++ kernel-power-2.6.28/drivers/usb/otg/twl4030-usb.c
-@@ -621,6 +621,7 @@
- #endif
-       status = twl4030_usb_linkstat(twl);
-+printk(KERN_WARNING "twl4030_usb_irq: status=0x%0x\n",status);
-       if (status != USB_LINK_UNKNOWN) {
-               /* FIXME add a set_power() method so that B-devices can
-@@ -669,6 +670,9 @@
-       twl = xceiv_to_twl(x);
-       twl->otg.gadget = gadget;
-+printk(KERN_WARNING "twl4030_set_peripheral() 4030 OTG_CTRL=0x%0x\n",twl4030_usb_read(twl,TWL4030_OTG_CTRL));
-+      twl4030_usb_clear_bits(twl,TWL4030_OTG_CTRL,TWL4030_OTG_CTRL_DRVVBUS);
-+printk(KERN_WARNING "twl4030_set_peripheral() after 4030 OTG_CTRL=0x%0x\n",twl4030_usb_read(twl,TWL4030_OTG_CTRL));
-       if (!gadget)
-               twl->otg.state = OTG_STATE_UNDEFINED;
-@@ -684,6 +688,9 @@
-       twl = xceiv_to_twl(x);
-       twl->otg.host = host;
-+printk(KERN_WARNING "twl4030_set_host() 4030 OTG_CTRL=0x%0x\n",twl4030_usb_read(twl,TWL4030_OTG_CTRL));
-+      twl4030_usb_set_bits(twl,TWL4030_OTG_CTRL,TWL4030_OTG_CTRL_DRVVBUS);
-+printk(KERN_WARNING "twl4030_set_host() after 4030 OTG_CTRL=0x%0x\n",twl4030_usb_read(twl,TWL4030_OTG_CTRL));
-       if (!host)
-               twl->otg.state = OTG_STATE_UNDEFINED;
index 511e0e4..3cc93dd 100644 (file)
---- kernel-power-2.6.28.orig/arch/arm/mach-omap2/board-rx51.c
-+++ kernel-power-2.6.28/arch/arm/mach-omap2/board-rx51.c
-@@ -108,6 +108,7 @@
+--- kernel-power-2.6.28.orig/arch/arm/mach-omap2/usb-musb.c
++++ kernel-power-2.6.28/arch/arm/mach-omap2/usb-musb.c
+@@ -141,10 +141,13 @@
+       .config         = &musb_config,
+       /* REVISIT charge pump on TWL4030 can supply up to
+-       * 100 mA ... but this value is board-specific, like
++       * 200 mA ... but this value is board-specific, like
+        * "mode", and should be passed to usb_musb_init().
++         *
++         * Since the power can come from a Y-cable, let the user
++         * decide on power constraints and not limit anything here.
+        */
+-      .power          = 50,                   /* up to 100 mA */
++      .power          = 0,                    /* use default of 500 mA */
+ };
  
- static int rx51_xceiv_reset(void)
- {
-+      printk(KERN_ERR "rx51_xceiv_reset\n");
-       /* make sure the transceiver is awake */
-       msleep(15);
-       /* only reset powered transceivers */
-@@ -125,6 +126,7 @@
+ static u64 musb_dmamask = DMA_32BIT_MASK;
+--- kernel-power-2.6.28.orig/drivers/usb/core/otg_whitelist.h
++++ kernel-power-2.6.28/drivers/usb/core/otg_whitelist.h
+@@ -14,7 +14,7 @@
+ #else
+ static inline int is_targeted(struct usb_device *d)
  {
-       unsigned long   timeout;
-+      printk(KERN_ERR "rx51_xceiv_power %d\n",power);
-       if (!power) {
-               /* Let musb go stdby before powering down the transceiver */
-               timeout = jiffies + msecs_to_jiffies(100);
---- kernel-power-2.6.28.orig/drivers/usb/musb/isp1704.h
-+++ kernel-power-2.6.28/drivers/usb/musb/isp1704.h
-@@ -41,6 +41,7 @@
- #define ISP1704_OTG_CTRL              0x0a
- #define ISP1704_USB_INTRISE           0x0d
- #define ISP1704_USB_INTFALL           0x10
-+#define ISP1704_USB_INTSTAT   0x13
- #define ISP1704_DEBUG                 0x15
- #define ISP1704_SCRATCH                       0x16
- #define ISP1704_PWR_CTRL              0x3d
+-      return 0;
++      return 1;
+ }
+ #endif
 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_core.c
 +++ kernel-power-2.6.28/drivers/usb/musb/musb_core.c
-@@ -142,6 +142,59 @@
- MODULE_LICENSE("GPL");
- MODULE_ALIAS("platform:" MUSB_DRIVER_NAME);
+@@ -230,6 +230,8 @@
+        * change it unless you really know what you're doing
+        */
  
++      DBG(4, "Some asshole called musb_charger_detect!");
 +
-+
-+inline void mbusywait(int ms)
-+{
-+      unsigned long end_time = jiffies + msecs_to_jiffies(ms);
-+      while(time_before(jiffies,end_time))
-+              cpu_relax();
-+
-+}
-+
-+void musb_force_term(void __iomem *addr, enum musb_term term)
-+{
-+      u8 r;
-+
-+
-+      r = musb_ulpi_readb(addr, ISP1704_OTG_CTRL);
-+      r |= ISP1704_OTG_CTRL_DP_PULLDOWN | ISP1704_OTG_CTRL_DM_PULLDOWN;
-+      musb_ulpi_writeb(addr, ISP1704_OTG_CTRL, r);
-+
-+      r = musb_ulpi_readb(addr, ISP1704_FUNC_CTRL);
-+
-+      switch(term) {
-+
-+      case MUSB_TERM_HOST_HIGHSPEED:
-+              r &= ~ISP1704_FUNC_CTRL_XCVRSELECT;
-+              r &= ~ISP1704_FUNC_CTRL_TERMSELECT;
-+              r &= ~ISP1704_FUNC_CTRL_OPMODE;
-+              break;
-+
-+      case MUSB_TERM_HOST_FULLSPEED:
-+              r |= 1 << ISP1704_FUNC_CTRL_XCVRSELECT_SHIFT;
-+              r |= ISP1704_FUNC_CTRL_TERMSELECT;
-+              r &= ~ISP1704_FUNC_CTRL_OPMODE;
-+              break;
-+
-+      case MUSB_TERM_HOST_LOWSPEED:
-+              r |= 2 << ISP1704_FUNC_CTRL_XCVRSELECT_SHIFT;
-+              r |= ISP1704_FUNC_CTRL_TERMSELECT;
-+              r &= ~ISP1704_FUNC_CTRL_OPMODE;
-+              break;
-+
-+      default:
-+              ERR("Unknown musb termination\n");
-+              return;
-+      }
-+
-+      r |= ISP1704_OTG_CTRL_IDPULLUP;
-+      musb_ulpi_writeb(addr, ISP1704_FUNC_CTRL, r);
-+
-+}
-+
-+
-+
- static inline int musb_verify_charger(void __iomem *addr)
- {
-       u8 r, ret = 0;
-@@ -220,6 +273,8 @@
-       u8              vdat = 0;
-       u8              r;
-+      u8 testmode;
-+      testmode = musb_readb(musb->mregs,MUSB_TESTMODE);
-       msleep(5);
-@@ -297,7 +352,7 @@
-                       break;
-       }
--      if (vdat) {
-+      if (vdat && !(testmode & MUSB_TEST_FORCE_HOST)) {
-               /* REVISIT: This code works only with dedicated chargers!
-                * When support for HOST/HUB chargers is added, don't
-                * forget this.
-@@ -349,7 +404,7 @@
+       switch(musb->xceiv->state) {
+               case OTG_STATE_B_IDLE:
+                       /* we always reset transceiver */
+@@ -349,7 +351,7 @@
  
        prefetch((u8 *)src);
  
 -      DBG(4, "%cX ep%d fifo %p count %d buf %p\n",
-+      DBG(6, "%cX ep%d fifo %p count %d buf %p\n",
++      DBG_nonverb(4, "%cX ep%d fifo %p count %d buf %p\n",
                        'T', hw_ep->epnum, fifo, len, src);
  
        /* we can't assume unaligned reads work */
-@@ -387,7 +442,7 @@
+@@ -387,7 +389,7 @@
  {
        void __iomem *fifo = hw_ep->fifo;
  
 -      DBG(4, "%cX ep%d fifo %p count %d buf %p\n",
-+      DBG(6, "%cX ep%d fifo %p count %d buf %p\n",
++      DBG_nonverb(4, "%cX ep%d fifo %p count %d buf %p\n",
                        'R', hw_ep->epnum, fifo, len, dst);
  
        /* we can't assume unaligned writes work */
-@@ -490,7 +545,6 @@
- {
-       struct musb     *musb = (struct musb *)data;
-       unsigned long   flags;
--
-       spin_lock_irqsave(&musb->lock, flags);
-       switch (musb->xceiv->state) {
-       case OTG_STATE_B_WAIT_ACON:
-@@ -572,10 +626,19 @@
- static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
-                               u8 devctl, u8 power)
- {
-+      u8 testmode;
-       irqreturn_t handled = IRQ_NONE;
+@@ -576,8 +578,8 @@
        void __iomem *mbase = musb->mregs;
        u8 r;
  
-+      testmode = musb_readb(mbase,MUSB_TESTMODE);
-+  if(testmode & MUSB_TEST_FORCE_HOST) {
-+              if(int_usb & MUSB_INTR_SESSREQ) {
-+                      DBG(1,"Piggybacking CONNECT on SESS REQ\n");
-+                      musb->int_usb |= MUSB_INTR_CONNECT;
-+              } 
-+      }
-+
-       DBG(3, "<== Power=%02x, DevCtl=%02x, int_usb=0x%x\n", power, devctl,
-               int_usb);
-@@ -630,6 +693,8 @@
-               } else {
-                       switch (musb->xceiv->state) {
- #ifdef CONFIG_USB_MUSB_HDRC_HCD
-+                      case OTG_STATE_A_WAIT_BCON:
-+                      case OTG_STATE_A_HOST:
-                       case OTG_STATE_A_SUSPEND:
-                               /* possibly DISCONNECT is upcoming */
-                               musb->xceiv->state = OTG_STATE_A_HOST;
-@@ -678,7 +743,7 @@
-                * be discarded silently.
-                */
-               if ((devctl & MUSB_DEVCTL_VBUS)
--                  && !(devctl & MUSB_DEVCTL_BDEVICE)) {
-+                  && host_mode(musb->mregs)) {
-                       musb_writeb(mbase, MUSB_DEVCTL, MUSB_DEVCTL_SESSION);
-                       musb->ep0_stage = MUSB_EP0_START;
-                       musb->xceiv->state = OTG_STATE_A_IDLE;
-@@ -796,9 +861,15 @@
-                                       + msecs_to_jiffies(musb->a_wait_bcon));
-                       break;
-               case OTG_STATE_A_HOST:
-+                      if(testmode & MUSB_TEST_FORCE_HOST) {
-+                              //                              musb->int_usb |= MUSB_INTR_RESUME;
-+                              break;
-+                      }
-+
-                       musb->xceiv->state = OTG_STATE_A_SUSPEND;
-                       musb->is_active = is_otg_enabled(musb)
-                                       && musb->xceiv->host->b_hnp_enable;
-+
-                       break;
-               case OTG_STATE_B_HOST:
-                       /* Transition to B_PERIPHERAL, see 6.8.2.6 p 44 */
-@@ -818,6 +889,7 @@
-               musb->is_active = 1;
-               set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
-+
-               musb->ep0_stage = MUSB_EP0_START;
- #ifdef CONFIG_USB_MUSB_OTG
-@@ -836,9 +908,65 @@
-               musb->port1_status |= USB_PORT_STAT_CONNECTION
-                                       |(USB_PORT_STAT_C_CONNECTION << 16);
--              /* high vs full speed is just a guess until after reset */
--              if (devctl & MUSB_DEVCTL_LSDEV)
--                      musb->port1_status |= USB_PORT_STAT_LOW_SPEED;
-+              if (testmode & MUSB_TEST_FORCE_HOST) {
-+                      u8 r,reg;
-+      void __iomem *mbase = musb->mregs;
-+
-+                      musb_force_term(musb->mregs,MUSB_TERM_HOST_HIGHSPEED);
-+
-+                      r = musb_ulpi_readb(mbase, ISP1704_DEBUG);
-+                      DBG(1,"Linestate %x\n",r);
-+                      switch(r) {
-+                      case 2:
-+                              musb->port1_status |= USB_PORT_STAT_LOW_SPEED;
-+                              reg = musb_readb(mbase, MUSB_TESTMODE);
-+                              reg &= ~MUSB_TEST_FORCE_FS;
-+                              reg &= ~MUSB_TEST_FORCE_HS;
-+                              musb_writeb(mbase, MUSB_TESTMODE, reg);
-+
-+                              reg = musb_readb(mbase, MUSB_POWER);
-+                              reg &= ~MUSB_POWER_HSENAB;
-+                              musb_writeb(mbase, MUSB_POWER, reg);
-+
-+                              musb_force_term(musb->mregs,MUSB_TERM_HOST_LOWSPEED);
-+                              break;
-+                      case 1:
-+                              /*High or full speed*/
-+                              reg = musb_readb(mbase, MUSB_TESTMODE);
-+                              if(reg &  MUSB_TEST_FORCE_HS) {
-+                                      /*High speed*/
-+                                      reg &= ~MUSB_TEST_FORCE_FS;
-+                                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+
-+                                      reg = musb_readb(mbase, MUSB_POWER);
-+                                      reg |= MUSB_POWER_HSENAB;
-+                                      musb_writeb(mbase, MUSB_POWER, reg);
-+                              } else {
-+                                      /*Full speed*/
-+                                      reg |= MUSB_TEST_FORCE_FS;
-+                                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+
-+                                      reg = musb_readb(mbase, MUSB_POWER);
-+                                      reg &= ~MUSB_POWER_HSENAB;
-+                                      musb_writeb(mbase, MUSB_POWER, reg);
-+                              }
-+
-+                              musb_force_term(mbase,MUSB_TERM_HOST_FULLSPEED);
-+
-+                              break;
-+                      case 0:
-+                      case 3:
-+                              /*invalid*/
-+                              WARNING("Invalid line state of %d\n",r);
-+                              break;
-+                              
-+                      }
-+              } else {
-+
-+                      /* high vs full speed is just a guess until after reset */
-+                      if (devctl & MUSB_DEVCTL_LSDEV)
-+                              musb->port1_status |= USB_PORT_STAT_LOW_SPEED;
-+              }
-               if (hcd->status_urb)
-                       usb_hcd_poll_rh_status(hcd);
-@@ -974,6 +1102,8 @@
-                               musb->ignore_disconnect = 1;
-                               musb_g_reset(musb);
-                               /* FALLTHROUGH */
-+                      case OTG_STATE_A_HOST:
-+                              musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
-                       case OTG_STATE_A_WAIT_BCON:     /* OPT TD.4.7-900ms */
-                               DBG(1, "HNP: Setting timer as %s\n",
-                                               otg_state_string(musb));
-@@ -2421,8 +2551,7 @@
-               DBG(1, "%s mode, status %d, devctl %02x %c\n",
-                       "HOST", status,
-                       musb_readb(musb->mregs, MUSB_DEVCTL),
--                      (musb_readb(musb->mregs, MUSB_DEVCTL)
--                                      & MUSB_DEVCTL_BDEVICE
-+                              (!host_mode(musb->mregs)
-                               ? 'B' : 'A'));
-       } else /* peripheral is enabled */ {
+-      DBG(3, "<== Power=%02x, DevCtl=%02x, int_usb=0x%x\n", power, devctl,
+-              int_usb);
++        DBG(3, "<== State=%s Power=%02x, DevCtl=%02x, int_usb=0x%x\n",
++                otg_state_string(musb), power, devctl, int_usb);
+       /* in host mode, the peripheral may issue remote wakeup.
+        * in peripheral mode, the host may resume the link.
+@@ -2028,12 +2030,16 @@
+       int             status;
+       mutex_lock(&musb->mutex);
+-      if (sysfs_streq(buf, "host"))
+-              status = musb_platform_set_mode(musb, MUSB_HOST);
++        if (sysfs_streq(buf, "hostl"))
++                status = musb_platform_set_mode(musb, MUSB_HOST, 0);
++        else if (sysfs_streq(buf, "hostf"))
++                status = musb_platform_set_mode(musb, MUSB_HOST, 1);
++        else if (sysfs_streq(buf, "hosth"))
++                status = musb_platform_set_mode(musb, MUSB_HOST, 2);
+       else if (sysfs_streq(buf, "peripheral"))
+-              status = musb_platform_set_mode(musb, MUSB_PERIPHERAL);
++              status = musb_platform_set_mode(musb, MUSB_PERIPHERAL, 0);
+       else if (sysfs_streq(buf, "otg"))
+-              status = musb_platform_set_mode(musb, MUSB_OTG);
++              status = musb_platform_set_mode(musb, MUSB_OTG, 0);
+       else
+               status = -EINVAL;
+       mutex_unlock(&musb->mutex);
 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_core.h
 +++ kernel-power-2.6.28/drivers/usb/musb/musb_core.h
-@@ -85,6 +85,16 @@
- #define       is_host_active(musb)            is_host_capable()
- #endif
+@@ -591,7 +591,7 @@
+ extern void musb_hnp_stop(struct musb *musb);
+-extern int musb_platform_set_mode(struct musb *musb, u8 musb_mode);
++extern int musb_platform_set_mode(struct musb *musb, u8 musb_mode, u8 hostspeed);
  
-+static inline int host_mode(void __iomem *addr) 
-+{
-+      u8              devctl,testmode;
-+      devctl = musb_readb(addr, MUSB_DEVCTL);
-+      testmode = musb_readb(addr,MUSB_TESTMODE);
-+
-+      return (testmode & MUSB_TEST_FORCE_HOST) || !(devctl & MUSB_DEVCTL_BDEVICE);
-+}
-+
-+
- #if defined(CONFIG_USB_MUSB_OTG) || defined(CONFIG_USB_MUSB_PERIPHERAL)
- /* for some reason, the "select USB_GADGET_MUSB_HDRC" doesn't always
-  * override that choice selection (often USB_GADGET_DUMMY_HCD).
-@@ -593,6 +603,14 @@
- extern int musb_platform_set_mode(struct musb *musb, u8 musb_mode);
-+enum musb_term {
-+      MUSB_TERM_HOST_HIGHSPEED,
-+      MUSB_TERM_HOST_FULLSPEED,
-+      MUSB_TERM_HOST_LOWSPEED,
-+};
-+
-+extern void musb_force_term(void __iomem *addr, enum musb_term term);
-+
  #if defined(CONFIG_USB_TUSB6010) || defined(CONFIG_BLACKFIN) || \
        defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP34XX)
- extern void musb_platform_try_idle(struct musb *musb, unsigned long timeout);
+--- kernel-power-2.6.28.orig/drivers/usb/musb/musb_debug.h
++++ kernel-power-2.6.28/drivers/usb/musb/musb_debug.h
+@@ -46,6 +46,21 @@
+ #ifdef CONFIG_USB_MUSB_DEBUG
++#define xprintk_verb(level, facility, format, args...) do { \
++        if (_dbg_level(level)) { \
++                        u8 testmode, devctl, power/*, otg_ctrl, func_ctrl, isp_debug*/; \
++                        testmode = musb_readb(musb->mregs, MUSB_TESTMODE); \
++                        devctl = musb_readb(musb->mregs, MUSB_DEVCTL); \
++                        power = musb_readb(musb->mregs, MUSB_POWER); \
++                        /*otg_ctrl = musb_ulpi_readb(musb->mregs, ISP1704_OTG_CTRL); \
++                        func_ctrl = musb_ulpi_readb(musb->mregs, ISP1704_FUNC_CTRL); \
++                        isp_debug = musb_ulpi_readb(musb->mregs, ISP1704_DEBUG); */ \
++                        printk(facility "State=%s Testmode=%02x Power=%02x, DevCtl=%02x\n", \
++                                otg_state_string(musb), testmode, power, devctl/*, otg_ctrl, func_ctrl, isp_debug*/); \
++                        printk(facility "%-20s %4d: " format , \
++                                __func__, __LINE__ , ## args); \
++        } } while (0)
++
+ #define xprintk(level, facility, format, args...) do { \
+       if (_dbg_level(level)) { \
+               printk(facility "%-20s %4d: " format , \
+@@ -58,7 +73,8 @@
+ {
+       return musb_debug >= l;
+ }
+-#define DBG(level, fmt, args...) xprintk(level, KERN_DEBUG, fmt, ## args)
++#define DBG(level, fmt, args...) xprintk_verb(level, KERN_DEBUG, fmt, ## args)
++#define DBG_nonverb(level, fmt, args...) xprintk(level, KERN_DEBUG, fmt, ## args)
+ #else
+ #define DBG(level, fmt, args...)      do {} while(0)
+ #endif        /* CONFIG_USB_MUSB_DEBUG */
 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_gadget.c
 +++ kernel-power-2.6.28/drivers/usb/musb/musb_gadget.c
-@@ -1957,7 +1957,7 @@
-       u8              power;
-       DBG(3, "<== %s addr=%x driver '%s'\n",
--                      (devctl & MUSB_DEVCTL_BDEVICE)
-+                      !host_mode(musb->mregs)
-                               ? "B-Device" : "A-Device",
-                       musb_readb(mbase, MUSB_FADDR),
-                       musb->gadget_driver
-@@ -1994,7 +1994,7 @@
-       /* Normal reset, as B-Device;
-        * or else after HNP, as A-Device
-        */
--      if (devctl & MUSB_DEVCTL_BDEVICE) {
-+      if (!host_mode(musb->mregs)) {
-               musb->xceiv->state = OTG_STATE_B_PERIPHERAL;
-               musb->g.is_a_peripheral = 0;
-       } else if (is_otg_enabled(musb)) {
---- kernel-power-2.6.28.orig/drivers/usb/musb/musb_host.c
-+++ kernel-power-2.6.28/drivers/usb/musb/musb_host.c
-@@ -1863,8 +1863,10 @@
-       unsigned                        interval;
-       /* host role must be active */
--      if (!is_host_active(musb) || !musb->is_active)
-+      if (!is_host_active(musb) || !musb->is_active) {
-+              printk(KERN_ERR "musb is_host_active %d is_active %d\n",is_host_active(musb),musb->is_active);
-               return -ENODEV;
-+      }
-       spin_lock_irqsave(&musb->lock, flags);
-       ret = usb_hcd_link_urb_to_ep(hcd, urb);
-@@ -2275,6 +2277,7 @@
-       return 0;
- }
+@@ -816,12 +816,12 @@
+       if (!ep || !desc)
+               return -EINVAL;
  
-+
- const struct hc_driver musb_hc_driver = {
-       .description            = "musb-hcd",
-       .product_desc           = "MUSB HDRC host driver",
-@@ -2298,6 +2301,5 @@
-       .hub_control            = musb_hub_control,
-       .bus_suspend            = musb_bus_suspend,
-       .bus_resume             = musb_bus_resume,
--      /* .start_port_reset    = NULL, */
-       /* .hub_irq_enable      = NULL, */
- };
---- kernel-power-2.6.28.orig/drivers/usb/musb/musb_procfs.c
-+++ kernel-power-2.6.28/drivers/usb/musb/musb_procfs.c
-@@ -37,6 +37,7 @@
- #include <linux/seq_file.h>
- #include <linux/uaccess.h>    /* FIXME remove procfs writes */
- #include <mach/hardware.h>
-+#include <asm/mach-types.h>
- #include "musb_core.h"
-@@ -450,8 +451,8 @@
-               return 0;
-       buffer += count;
--      code = sprintf(buffer, "OTG state: %s; %sactive\n",
--                      otg_state_string(musb),
-+      code = sprintf(buffer, "OTG state: %s:%d; %sactive\n",
-+                                                               otg_state_string(musb),musb->xceiv->state,
-                       musb->is_active ? "" : "in");
-       if (code <= 0)
-               goto done;
-@@ -591,16 +592,34 @@
-  *
-  * C soft-connect
-  * c soft-disconnect
-- * I enable HS
-- * i disable HS
-- * s stop session
-- * F force session (OTG-unfriendly)
-+ * D<num> set/query the debug level
-  * E rElinquish bus (OTG)
-+ * e enumerate
-+ * F force session (OTG-unfriendly)
-  * H request host mode
-  * h cancel host request
-+ * I enable HS
-+ * i disable HS
-+ * J set HS test mode
-+ * j clear HS test mode
-+ * K set FS test mode
-+ * k clear FS test mode
-+ * M set host test mode
-+ * m clear host test mode
-+ * R reset peripheral
-+ * r resume root hub
-+ * s stop session
-  * T start sending TEST_PACKET
-- * D<num> set/query the debug level
-+ * X term highspeed
-+ * Y term fullspeed
-+ * Z term lowspeed
-+ * 
-  */
-+
-+extern inline void mbusywait(int ms);
-+extern        void musb_port_reset(struct musb *musb, bool do_reset);
-+extern void musb_port_suspend(struct musb *musb, bool do_suspend);
-+
- static int musb_proc_write(struct file *file, const char __user *buffer,
-                       unsigned long count, void *data)
- {
-@@ -608,49 +627,63 @@
-       u8 reg;
-       struct musb *musb = (struct musb *)data;
-       void __iomem *mbase = musb->mregs;
-+      unsigned long   flags;
-+      struct usb_hcd *hcd = musb_to_hcd(musb);
-+      struct usb_bus *bus = hcd_to_bus(hcd);
++        musb_ep = to_musb_ep(ep);
++        musb = musb_ep->musb;
+       DBG(1, "===> enabling %s\n", ep->name);
  
-       /* MOD_INC_USE_COUNT; */
+-      musb_ep = to_musb_ep(ep);
+       hw_ep = musb_ep->hw_ep;
+       regs = hw_ep->regs;
+-      musb = musb_ep->musb;
+       mbase = musb->mregs;
+       epnum = musb_ep->current_epnum;
  
-       if (unlikely(copy_from_user(&cmd, buffer, 1)))
-               return -EFAULT;
+@@ -949,8 +949,8 @@
+       int             status = 0;
  
-+
-       switch (cmd) {
-       case 'C':
-               if (mbase) {
--                      reg = musb_readb(mbase, MUSB_POWER)
--                                      | MUSB_POWER_SOFTCONN;
-+                      reg = musb_readb(mbase, MUSB_POWER);
-+                      reg |= MUSB_POWER_SOFTCONN;
-                       musb_writeb(mbase, MUSB_POWER, reg);
-               }
-               break;
+       musb_ep = to_musb_ep(ep);
+-      DBG(4, "disabling %s\n", musb_ep->name);
+       musb = musb_ep->musb;
++      DBG(4, "disabling %s\n", musb_ep->name);
+       epnum = musb_ep->current_epnum;
+       epio = musb->endpoints[epnum].regs;
  
-       case 'c':
-               if (mbase) {
--                      reg = musb_readb(mbase, MUSB_POWER)
--                                      & ~MUSB_POWER_SOFTCONN;
-+                      reg = musb_readb(mbase, MUSB_POWER);
-+                      reg &= ~MUSB_POWER_SOFTCONN;
-                       musb_writeb(mbase, MUSB_POWER, reg);
-               }
-               break;
-       case 'I':
-               if (mbase) {
--                      reg = musb_readb(mbase, MUSB_POWER)
--                                      | MUSB_POWER_HSENAB;
-+                      reg = musb_readb(mbase, MUSB_POWER);
-+                      reg |= MUSB_POWER_HSENAB;
-                       musb_writeb(mbase, MUSB_POWER, reg);
-               }
-               break;
-       case 'i':
-               if (mbase) {
--                      reg = musb_readb(mbase, MUSB_POWER)
--                                      & ~MUSB_POWER_HSENAB;
-+                      reg = musb_readb(mbase, MUSB_POWER);
-+                      reg &= ~MUSB_POWER_HSENAB;
-                       musb_writeb(mbase, MUSB_POWER, reg);
-               }
-               break;
-       case 'F':
--              reg = musb_readb(mbase, MUSB_DEVCTL);
--              reg |= MUSB_DEVCTL_SESSION;
--              musb_writeb(mbase, MUSB_DEVCTL, reg);
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_DEVCTL);
-+                      reg |= MUSB_DEVCTL_SESSION;
-+                      musb_writeb(mbase, MUSB_DEVCTL, reg);
-+              }
-+              break;
-+
-+      case 's':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_DEVCTL);
-+                      reg &= ~MUSB_DEVCTL_SESSION;
-+                      musb_writeb(mbase, MUSB_DEVCTL, reg);
-+              }
+--- kernel-power-2.6.28.orig/drivers/usb/musb/musb_host.c
++++ kernel-power-2.6.28/drivers/usb/musb/musb_host.c
+@@ -118,7 +118,7 @@
+       csr = musb_readw(epio, MUSB_TXCSR);
+       while (csr & MUSB_TXCSR_FIFONOTEMPTY) {
+               if (csr != lastcsr)
+-                      DBG(3, "Host TX FIFONOTEMPTY csr: %02x\n", csr);
++                      DBG_nonverb(3, "Host TX FIFONOTEMPTY csr: %02x\n", csr);
+               lastcsr = csr;
+               csr |= MUSB_TXCSR_FLUSHFIFO;
+               musb_writew(epio, MUSB_TXCSR, csr);
+@@ -2036,7 +2036,7 @@
+               dma = is_in ? ep->rx_channel : ep->tx_channel;
+               if (dma) {
+                       status = ep->musb->dma_controller->channel_abort(dma);
+-                      DBG(status ? 1 : 3,
++                      DBG_nonverb(status ? 1 : 3,
+                               "abort %cX%d DMA for urb %p --> %d\n",
+                               is_in ? 'R' : 'T', ep->epnum,
+                               urb, status);
+--- kernel-power-2.6.28.orig/drivers/usb/musb/musb_procfs.c
++++ kernel-power-2.6.28/drivers/usb/musb/musb_procfs.c
+@@ -651,6 +651,60 @@
+               reg = musb_readb(mbase, MUSB_DEVCTL);
+               reg |= MUSB_DEVCTL_SESSION;
+               musb_writeb(mbase, MUSB_DEVCTL, reg);
++ 
++                /* Pretend there's a session request */
++                musb->ep0_stage = MUSB_EP0_START;
++                musb->xceiv->state = OTG_STATE_A_IDLE;
++                MUSB_HST_MODE(musb);
++                musb_set_vbus(musb, 1);
++ 
++                /* Connect request */
++                {
++                struct usb_hcd *hcd = musb_to_hcd(musb);
++                u8 testmode;
++ 
++                musb->is_active = 1;
++                set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
++ 
++                musb->ep0_stage = MUSB_EP0_START;
++ 
++#ifdef CONFIG_USB_MUSB_OTG
++                /* flush endpoints when transitioning from Device Mode */
++                if (is_peripheral_active(musb)) {
++                        /* REVISIT HNP; just force disconnect */
++                }
++                musb_writew(mbase, MUSB_INTRTXE, musb->epmask);
++                musb_writew(mbase, MUSB_INTRRXE, musb->epmask & 0xfffe);
++                musb_writeb(mbase, MUSB_INTRUSBE, 0xf7);
++#endif
++                musb->port1_status &= ~(USB_PORT_STAT_LOW_SPEED
++                                        |USB_PORT_STAT_HIGH_SPEED
++                                        |USB_PORT_STAT_ENABLE
++                                        );
++                musb->port1_status |= USB_PORT_STAT_CONNECTION
++                                        |(USB_PORT_STAT_C_CONNECTION << 16);
++ 
++                testmode = musb_readb(mbase, MUSB_TESTMODE);
++                if (!(testmode & (MUSB_TEST_FORCE_FS | MUSB_TEST_FORCE_HS)))
++                        musb->port1_status |= USB_PORT_STAT_LOW_SPEED;
++ 
++                if (hcd->status_urb)
++                        usb_hcd_poll_rh_status(hcd);
++                else
++                        usb_hcd_resume_root_hub(hcd);
++ 
++                MUSB_HST_MODE(musb);
++ 
++                /* indicate new connection to OTG machine */
++                switch (musb->xceiv->state) {
++                default:
++                                musb->xceiv->state = OTG_STATE_A_HOST;
++                                hcd->self.is_b_host = 0;
++                        break;
++                }
++                DBG(1, "CONNECT (%s) devctl %02x\n",
++                                otg_state_string(musb), devctl);
++                }
                break;
  
        case 'H':
-@@ -679,6 +712,114 @@
+--- kernel-power-2.6.28.orig/drivers/usb/musb/musb_regs.h
++++ kernel-power-2.6.28/drivers/usb/musb/musb_regs.h
+@@ -330,7 +330,7 @@
+       while (!(musb_readb(addr, ULPI_REG_CONTROL) & ULPI_REG_CMPLT)) {
+               i++;
+               if (i == 10000) {
+-                      DBG(3, "ULPI read timed out\n");
++                      DBG_nonverb(3, "ULPI read timed out\n");
+                       return 0;
                }
-               break;
  
-+      case 'M':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_TESTMODE);
-+                      reg |= MUSB_TEST_FORCE_HOST;
-+                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+              }
-+              break;
-+      
-+      case 'm':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_TESTMODE);
-+                      reg &= ~MUSB_TEST_FORCE_HOST;
-+                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+                      MUSB_DEV_MODE(musb);
-+                      musb->xceiv->state = OTG_STATE_B_IDLE;
-+              }
-+              break;
-+
-+  case 'L':
-+                      musb->xceiv->state = OTG_STATE_A_HOST;
-+                      MUSB_HST_MODE(musb);
-+              break;
-+
-+  case 'l':
-+                      musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
-+                      MUSB_HST_MODE(musb);
-+              break;
-+
-+      case 'J':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_TESTMODE);
-+                      reg |= MUSB_TEST_FORCE_HS;
-+                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+              }
-+              break;
-+
-+      case 'j':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_TESTMODE);
-+                      reg &= ~MUSB_TEST_FORCE_HS;
-+                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+              }
-+              break;
-+
-+      case 'K':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_TESTMODE);
-+                      reg |= MUSB_TEST_FORCE_FS;
-+                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+              }
-+              break;
-+
-+      case 'k':
-+              if (mbase) {
-+                      reg = musb_readb(mbase, MUSB_TESTMODE);
-+                      reg &= ~MUSB_TEST_FORCE_FS;
-+                      musb_writeb(mbase, MUSB_TESTMODE, reg);
-+              }
-+              break;
-+
-+  case 'X':
-+    if (mbase)
-+                      musb_force_term(mbase,MUSB_TERM_HOST_HIGHSPEED);
-+              break;
-+
-+  case 'Y':
-+    if (mbase)
-+                      musb_force_term(mbase,MUSB_TERM_HOST_FULLSPEED);
-+              break;
-+
-+  case 'Z':
-+    if (mbase)
-+                      musb_force_term(mbase,MUSB_TERM_HOST_LOWSPEED);
-+              break;
-+
-+      case 'R':
-+              musb_port_reset(musb, true);
-+              while (time_before(jiffies, musb->rh_timer))
-+                      msleep(1);
-+              musb_port_reset(musb, false);
-+
-+              break;
-+              
-+  case 'r':
-+              usb_hcd_resume_root_hub(hcd);
-+              break;
-+
-+  case 'e':
-+              if(bus) 
-+                      usb_bus_start_enum(bus,bus->otg_port);
-+              break;
-+
-+      case 'U':
-+              /*Suspend*/
-+              musb_port_suspend(musb, true);
-+              break;
-+
-+      case 'u':
-+              /*Resume*/
-+              musb_port_suspend(musb, false);
-+              /*How to end sanely? */
-+              musb_port_reset(musb, true);
-+              while (time_before(jiffies, musb->rh_timer))
-+                      msleep(1);
-+              musb_port_reset(musb, false);
-+
-+      break;
-+
-       case '?':
-               INFO("?: you are seeing it\n");
-               INFO("C/c: soft connect enable/disable\n");
-@@ -695,6 +836,7 @@
-       musb_platform_try_idle(musb, 0);
-+
-       return count;
- }
-@@ -709,6 +851,8 @@
-       count -= off;
-       count -= 1;             /* for NUL at end */
-+      count -= 20; /* Padding */
-+
-       if (count <= 0)
-               return -EINVAL;
-@@ -720,6 +864,9 @@
-               count -= code;
-       }
-+      if (count < 0)
-+              goto done;
-+
-       /* generate the report for the end points */
-       /* REVISIT ... not unless something's connected! */
-       for (epnum = 0; count >= 0 && epnum < musb->nr_endpoints;
-@@ -728,14 +875,22 @@
-               if (code > 0) {
-                       buffer += code;
-                       count -= code;
-+                      if (count < 0)
-+                              goto done;
+@@ -355,7 +355,7 @@
+       while(!(musb_readb(addr, ULPI_REG_CONTROL) & ULPI_REG_CMPLT)) {
+               i++;
+               if (i == 10000) {
+-                      DBG(3, "ULPI write timed out\n");
++                      DBG_nonverb(3, "ULPI write timed out\n");
+                       return;
                }
        }
+--- kernel-power-2.6.28.orig/drivers/usb/musb/musbhsdma.c
++++ kernel-power-2.6.28/drivers/usb/musb/musbhsdma.c
+@@ -131,7 +131,7 @@
+       u8 bchannel = musb_channel->idx;
+       u16 csr = 0;
+-      DBG(4, "%p, pkt_sz %d, addr 0x%x, len %d, mode %d\n",
++      DBG_nonverb(4, "%p, pkt_sz %d, addr 0x%x, len %d, mode %d\n",
+                       channel, packet_sz, dma_addr, len, mode);
+       if (mode)
+@@ -167,7 +167,7 @@
+ {
+       struct musb_dma_channel *musb_channel = channel->private_data;
  
-+
-+ done:
-+
-       musb_platform_try_idle(musb, 0);
+-      DBG(2, "ep%d-%s pkt_sz %d, dma_addr 0x%x length %d, mode %d\n",
++      DBG_nonverb(2, "ep%d-%s pkt_sz %d, dma_addr 0x%x length %d, mode %d\n",
+               musb_channel->epnum,
+               musb_channel->transmit ? "Tx" : "Rx",
+               packet_sz, dma_addr, len, mode);
+--- kernel-power-2.6.28.orig/drivers/usb/musb/omap2430.c
++++ kernel-power-2.6.28/drivers/usb/musb/omap2430.c
+@@ -73,6 +73,8 @@
  
-       spin_unlock_irqrestore(&musb->lock, flags);
-       *eof = 1;
+       spin_lock_irqsave(&musb->lock, flags);
  
-+      if(count < 0)
-+              return -EINVAL;
++      DBG(3, "%s\n", otg_state_string(musb));
 +
-       return buffer - page;
- }
+       devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
  
---- kernel-power-2.6.28.orig/drivers/usb/musb/musb_virthub.c
-+++ kernel-power-2.6.28/drivers/usb/musb/musb_virthub.c
-@@ -46,7 +46,7 @@
- #include "musb_core.h"
+       switch (musb->xceiv->state) {
+@@ -211,15 +213,12 @@
  
+ static int musb_platform_resume(struct musb *musb);
  
--static void musb_port_suspend(struct musb *musb, bool do_suspend)
-+void musb_port_suspend(struct musb *musb, bool do_suspend)
+-int musb_platform_set_mode(struct musb *musb, u8 musb_mode)
++int musb_platform_set_mode(struct musb *musb, u8 musb_mode, u8 hostspeed)
  {
-       u8              power;
-       void __iomem    *mbase = musb->mregs;
-@@ -106,11 +106,13 @@
-               /* later, GetPortStatus will stop RESUME signaling */
-               musb->port1_status |= MUSB_PORT_STAT_RESUME;
--              musb->rh_timer = jiffies + msecs_to_jiffies(20);
-+              /*OMAP documentation states range of 10-15 ms */
-+              musb->rh_timer = jiffies + msecs_to_jiffies(13);
-+              //              musb->rh_timer = jiffies + msecs_to_jiffies(20);
-       }
- }
+       struct usb_hcd  *hcd;
+       struct usb_bus  *host;
+       u8              devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
  
--static void musb_port_reset(struct musb *musb, bool do_reset)
-+void musb_port_reset(struct musb *musb, bool do_reset)
- {
-       u8              power;
-       void __iomem    *mbase = musb->mregs;
-@@ -131,7 +133,7 @@
-        */
-       power = musb_readb(mbase, MUSB_POWER);
-       if (do_reset) {
+-      devctl |= MUSB_DEVCTL_SESSION;
+-      musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
 -
-+              DBG(4, "root port reset started\n");
-               /*
-                * If RESUME is set, we must make sure it stays minimum 20 ms.
-                * Then we must clear RESUME and wait a bit to let musb start
---- kernel-power-2.6.28.orig/drivers/usb/musb/omap2430.c
-+++ kernel-power-2.6.28/drivers/usb/musb/omap2430.c
-@@ -77,11 +77,14 @@
-       switch (musb->xceiv->state) {
-       case OTG_STATE_A_WAIT_BCON:
-+              if(host_mode(musb->mregs))
-+                      break; /*Don't time out*/
-+
-               devctl &= ~MUSB_DEVCTL_SESSION;
-               musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
-               devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
--              if (devctl & MUSB_DEVCTL_BDEVICE) {
-+              if (!host_mode(musb->mregs)) {
-                       musb->xceiv->state = OTG_STATE_B_IDLE;
-                       MUSB_DEV_MODE(musb);
-               } else {
-@@ -109,11 +112,14 @@
- #endif
+       switch (musb_mode) {
  #ifdef CONFIG_USB_MUSB_HDRC_HCD
-       case OTG_STATE_A_HOST:
-+
-+
-               devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
--              if (devctl &  MUSB_DEVCTL_BDEVICE)
-+              if (!host_mode(musb->mregs))
-                       musb->xceiv->state = OTG_STATE_B_IDLE;
--              else
--                      musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
-+              /*Don't time out if host*/
-+              //              else
-+              //      musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
+       case MUSB_HOST:
+@@ -227,10 +226,36 @@
+               host = hcd_to_bus(hcd);
+               otg_set_host(musb->xceiv, host);
++ 
++                if (machine_is_nokia_rx51()) {
++                        u8 testmode;
++ 
++                        musb_platform_resume(musb);
++ 
++                        devctl |= MUSB_DEVCTL_SESSION;
++                        musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
++ 
++                        testmode = MUSB_TEST_FORCE_HOST;
++                        if (hostspeed == 1)
++                                testmode |= MUSB_TEST_FORCE_FS;
++                        else if (hostspeed == 2)
++                                testmode |= MUSB_TEST_FORCE_HS;
++                        musb_writeb(musb->mregs, MUSB_TESTMODE, testmode);
++                }
+               break;
  #endif
-       default:
+ #ifdef CONFIG_USB_GADGET_MUSB_HDRC
+       case MUSB_PERIPHERAL:
++                if (machine_is_nokia_rx51()) {
++                        musb_platform_resume(musb);
++                        musb_set_vbus(musb, 0);
++ 
++                        devctl &= ~MUSB_DEVCTL_SESSION;
++                        musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
++ 
++                        musb_writeb(musb->mregs, MUSB_TESTMODE, 0);
++                }
++ 
+               otg_set_peripheral(musb->xceiv, &musb->g);
                break;
-@@ -133,7 +139,7 @@
-       /* Never idle if active, or when VBUS timeout is not set as host */
-       if (musb->is_active || ((musb->a_wait_bcon == 0)
-                       && (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) {
--              DBG(4, "%s active, deleting timer\n", otg_state_string(musb));
-+              DBG(6, "%s active, deleting timer\n", otg_state_string(musb));
-               del_timer(&musb_idle_timer);
-               last_timer = jiffies;
-               return;
-@@ -143,13 +149,13 @@
-               if (!timer_pending(&musb_idle_timer))
-                       last_timer = timeout;
-               else {
--                      DBG(4, "Longer idle timer already pending, ignoring\n");
-+                      DBG(6, "Longer idle timer already pending, ignoring\n");
-                       return;
-               }
-       }
-       last_timer = timeout;
--      DBG(4, "%s inactive, for idle timer for %lu ms\n",
-+      DBG(6, "%s inactive, for idle timer for %lu ms\n",
-               otg_state_string(musb),
-               (unsigned long)jiffies_to_msecs(timeout - jiffies));
-       mod_timer(&musb_idle_timer, timeout);
-@@ -182,8 +188,14 @@
-               musb->xceiv->default_a = 1;
-               musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
-               devctl |= MUSB_DEVCTL_SESSION;
--
-               MUSB_HST_MODE(musb);
-+              
-+              if ((devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS) {
-+                      /*Power is already applied. Skip VRISE and go directly to BCON.*/
-+                      musb->xceiv->state = OTG_STATE_A_WAIT_BCON;
-+              }
-+
-+
-       } else {
-               musb->is_active = 0;
-@@ -420,7 +432,7 @@
-       u8 r;
-       unsigned long   flags;
--      DBG(3, "restoring register context\n");
-+      DBG(3, "restoring register context for %s\n","musb_restore_ctx_and_resume");
-       if (musb->board && musb->board->xceiv_power)
-               musb->board->xceiv_power(1);
-@@ -431,13 +443,17 @@
-       else
-               clk_enable(musb->clock);
--      /* Recover OTG control */
--      r = musb_ulpi_readb(musb->mregs, ISP1704_OTG_CTRL);
--      r |= ISP1704_OTG_CTRL_IDPULLUP | ISP1704_OTG_CTRL_DP_PULLDOWN;
--      musb_ulpi_writeb(musb->mregs, ISP1704_OTG_CTRL, r);
--
-+      if(host_mode(musb->mregs)) {
-+              musb_force_term(musb->mregs,MUSB_TERM_HOST_FULLSPEED);
-+              r = musb_ulpi_readb(musb->mregs,ISP1704_FUNC_CTRL);
-+      } else {
-+              /* Recover OTG control */
-+              r = musb_ulpi_readb(musb->mregs, ISP1704_OTG_CTRL);
-+              r |= ISP1704_OTG_CTRL_IDPULLUP | ISP1704_OTG_CTRL_DP_PULLDOWN;
-+              musb_ulpi_writeb(musb->mregs, ISP1704_OTG_CTRL, r);
-+              r = ISP1704_FUNC_CTRL_FULL_SPEED;
-+      }
-       /* Recover FUNC control */
--      r = ISP1704_FUNC_CTRL_FULL_SPEED;
-       r |= ISP1704_FUNC_CTRL_SUSPENDM | ISP1704_FUNC_CTRL_RESET;
-       musb_ulpi_writeb(musb->mregs, ISP1704_FUNC_CTRL, r);
---- kernel-power-2.6.28.orig/drivers/usb/otg/otg.c
-+++ kernel-power-2.6.28/drivers/usb/otg/otg.c
-@@ -160,7 +160,8 @@
-       /* add other match criteria here ... */
--
-+      return 1;
-+      
-       /* OTG MESSAGE: report errors here, customize to match your product */
-       dev_err(&dev->dev, "device v%04x p%04x is not supported\n",
-               le16_to_cpu(dev->descriptor.idVendor),
+ #endif
 --- kernel-power-2.6.28.orig/drivers/usb/otg/twl4030-usb.c
 +++ kernel-power-2.6.28/drivers/usb/otg/twl4030-usb.c
-@@ -239,9 +239,9 @@
- enum linkstat {
-       USB_LINK_UNKNOWN = 0,
--      USB_LINK_NONE,
--      USB_LINK_VBUS,
--      USB_LINK_ID,
-+      USB_LINK_NONE = 1,
-+      USB_LINK_VBUS = 2,
-+      USB_LINK_ID = 3,
- };
+@@ -371,6 +371,7 @@
+       spin_lock_irq(&twl->lock);
+       twl->linkstat = linkstat;
++#if 0
+       if (linkstat == USB_LINK_ID) {
+               twl->otg.default_a = true;
+               twl->otg.state = OTG_STATE_A_IDLE;
+@@ -378,6 +379,7 @@
+               twl->otg.default_a = false;
+               twl->otg.state = OTG_STATE_B_IDLE;
+       }
++#endif
+       spin_unlock_irq(&twl->lock);
  
- struct twl4030_usb {
+       return linkstat;
diff --git a/kernel-bfs-2.6.28/debian/patches/usbignpower.diff b/kernel-bfs-2.6.28/debian/patches/usbignpower.diff
deleted file mode 100644 (file)
index 78a845f..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
---- kernel-power-2.6.28.orig/drivers/usb/core/generic.c
-+++ kernel-power-2.6.28/drivers/usb/core/generic.c
-@@ -97,10 +97,10 @@
-                */
-               /* Rule out configs that draw too much bus current */
--              if (c->desc.bMaxPower * 2 > udev->bus_mA) {
-+              /*if (c->desc.bMaxPower * 2 > udev->bus_mA) {
-                       insufficient_power++;
-                       continue;
--              }
-+              }*/
-               /* When the first config's first interface is one of Microsoft's
-                * pet nonstandard Ethernet-over-USB protocols, ignore it unless
-@@ -132,10 +132,10 @@
-                       best = c;
-       }
--      if (insufficient_power > 0)
-+      /*if (insufficient_power > 0)
-               dev_info(&udev->dev, "rejected %d configuration%s "
-                       "due to insufficient available bus power\n",
--                      insufficient_power, plural(insufficient_power));
-+                      insufficient_power, plural(insufficient_power));*/
-       if (best) {
-               i = best->desc.bConfigurationValue;
index f8666a8..728bfa8 100644 (file)
@@ -4,7 +4,7 @@
 WEEK := $(shell date +%Y%W)
 RELEASE := $(shell dpkg-parsechangelog | awk '/^Version: / { print $$2 }')
 REVISION := $(shell echo "$(RELEASE)" | sed 's/\(.*\)-maemo\(.*\)/.10bfs\2/')
-EXTRAVERSION := EXTRAVERSION=-bfs2
+EXTRAVERSION := EXTRAVERSION=-bfs3
 
 PACKAGE := kernel
 FLASHER_PACKAGE := kernel-bfs-flasher