+ 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;
+ }