#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)
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:" MUSB_DRIVER_NAME);
+void musb_isp1704_host(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 = ISP1704_FUNC_CTRL_SUSPENDM | ISP1704_FUNC_CTRL_RESET;
+ /* 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;
+ DBG(1,"musb_force_term, highspeed\n");
+ break;
+
+ case MUSB_TERM_HOST_FULLSPEED:
+ r |= ISP1704_FUNC_CTRL_FULL_SPEED;
+ r |= ISP1704_FUNC_CTRL_TERMSELECT;
+ r &= ~ISP1704_FUNC_CTRL_OPMODE;
+ DBG(1,"musb_force_term, fullspeed\n");
+ break;
+
+ case MUSB_TERM_HOST_LOWSPEED:
+ r |= ISP1704_FUNC_CTRL_LOW_SPEED;
+ r |= ISP1704_FUNC_CTRL_TERMSELECT;
+ r &= ~ISP1704_FUNC_CTRL_OPMODE;
+ DBG(1,"musb_force_term, lowspeed\n");
+ break;
+
+ default:
+ ERR("Unknown musb termination\n");
+ return;
+ }
+
+ musb_ulpi_writeb(addr, ISP1704_FUNC_CTRL, r);
+}
+
+void musb_isp1704_otg(void __iomem *addr)
+{
+ u8 r;
+
+ /* Recover OTG control */
+ r = musb_ulpi_readb(addr, ISP1704_OTG_CTRL);
+ r &= ~ISP1704_OTG_CTRL_DM_PULLDOWN;
+ r |= ISP1704_OTG_CTRL_IDPULLUP | ISP1704_OTG_CTRL_DP_PULLDOWN; //???
+ musb_ulpi_writeb(addr, ISP1704_OTG_CTRL, r);
+
+ /* Recover FUNC control */
+ r = ISP1704_FUNC_CTRL_FULL_SPEED;
+ r |= ISP1704_FUNC_CTRL_SUSPENDM | ISP1704_FUNC_CTRL_RESET;
+ musb_ulpi_writeb(addr, ISP1704_FUNC_CTRL, r);
+}
+
static inline int musb_verify_charger(void __iomem *addr)
{
u8 r, ret = 0;
*buffer = 0;
count = sprintf(buffer, "Status: %sHDRC, Mode=%s "
- "(Power=%02x, DevCtl=%02x)\n",
+ "(Power=%02x, DevCtl=%02x, Testmode=%02x)\n",
(musb->is_multipoint ? "M" : ""), MUSB_MODE(musb),
musb_readb(mbase, MUSB_POWER),
- musb_readb(mbase, MUSB_DEVCTL));
+ musb_readb(mbase, MUSB_DEVCTL),
+ musb_readb(mbase, MUSB_TESTMODE));
if (count <= 0)
return 0;
buffer += count;
MUSB_TEST_PACKET);
}
break;
+ case 'M':
+ if (mbase) {
+ musb_isp1704_host(mbase, MUSB_TERM_HOST_LOWSPEED);
+ DBG(1, "STARTING HOSTMODE (Power=%02x, DevCtl=%02x, Testmode=%02x)\n",
+ musb_readb(mbase, MUSB_POWER),
+ musb_readb(mbase, MUSB_DEVCTL),
+ musb_readb(mbase, MUSB_TESTMODE));
+ reg = musb_readb(mbase, MUSB_POWER);
+ reg &= ~(MUSB_POWER_SUSPENDM | MUSB_POWER_ENSUSPEND);
+ musb_writeb(mbase, MUSB_POWER, reg);
+ DBG(1, "(1) disabled suspendmodes (Power=%02x, DevCtl=%02x, Testmode=%02x)\n",
+ musb_readb(mbase, MUSB_POWER),
+ musb_readb(mbase, MUSB_DEVCTL),
+ musb_readb(mbase, MUSB_TESTMODE));
+
+ reg = musb_readb(mbase, MUSB_TESTMODE);
+ reg |= MUSB_TEST_FORCE_HOST;
+ musb_writeb(mbase, MUSB_TESTMODE, reg);
+ DBG(1, "(2) set FORCE_HOST (Power=%02x, DevCtl=%02x, Testmode=%02x)\n",
+ musb_readb(mbase, MUSB_POWER),
+ musb_readb(mbase, MUSB_DEVCTL),
+ musb_readb(mbase, MUSB_TESTMODE));
+
+ reg = musb_readb(mbase, MUSB_DEVCTL);
+ reg |= MUSB_DEVCTL_SESSION;
+ musb_writeb(mbase, MUSB_DEVCTL, reg);
+ DBG(1, "(3) set SESSION (Power=%02x, DevCtl=%02x, Testmode=%02x)\n",
+ musb_readb(mbase, MUSB_POWER),
+ musb_readb(mbase, MUSB_DEVCTL),
+ musb_readb(mbase, MUSB_TESTMODE));
+ }
+ break;
+ case 'm':
+ if (mbase) {
+ DBG(1, "LEAVING HOSTMODE (Power=%02x, DevCtl=%02x, Testmode=%02x)\n",
+ musb_readb(mbase, MUSB_POWER),
+ musb_readb(mbase, MUSB_DEVCTL),
+ musb_readb(mbase, MUSB_TESTMODE));
+ reg = musb_readb(mbase, MUSB_DEVCTL);
+ reg &= ~MUSB_DEVCTL_SESSION;
+ musb_writeb(mbase, MUSB_DEVCTL, reg);
+ DBG(1, "(1) reset SESSION (Power=%02x, DevCtl=%02x, Testmode=%02x)\n",
+ musb_readb(mbase, MUSB_POWER),
+ musb_readb(mbase, MUSB_DEVCTL),
+ musb_readb(mbase, MUSB_TESTMODE));
+
+ reg = musb_readb(mbase, MUSB_TESTMODE);
+ reg &= ~MUSB_TEST_FORCE_HOST;
+ musb_writeb(mbase, MUSB_TESTMODE, reg);
+ DBG(1, "(2) reset FORCE_HOST (Power=%02x, DevCtl=%02x, Testmode=%02x)\n",
+ musb_readb(mbase, MUSB_POWER),
+ musb_readb(mbase, MUSB_DEVCTL),
+ musb_readb(mbase, MUSB_TESTMODE));
+ musb_isp1704_otg(mbase);
+ }
+ break;
case '?':
INFO("?: you are seeing it\n");
break;
}
- musb_platform_try_idle(musb, 0);
+ //musb_platform_try_idle(musb, 0);
return count;
}
}
}
- musb_platform_try_idle(musb, 0);
+ //musb_platform_try_idle(musb, 0);
spin_unlock_irqrestore(&musb->lock, flags);
*eof = 1;