#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_INTSTAT 0x13
+#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)
MODULE_ALIAS("platform:" MUSB_DRIVER_NAME);
-
-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;
-
+ /* 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_XCVRSELECT;
+ r |= ISP1704_FUNC_CTRL_HIGH_SPEED;
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_FULL_SPEED;
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_LOW_SPEED;
r |= ISP1704_FUNC_CTRL_TERMSELECT;
r &= ~ISP1704_FUNC_CTRL_OPMODE;
break;
return;
}
- r |= ISP1704_OTG_CTRL_IDPULLUP;
musb_ulpi_writeb(addr, ISP1704_FUNC_CTRL, r);
}
*
*/
-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);