void MGC_GadgetReset(MGC_LinuxCd * pThis) { const u8 *pBase = (u8 *) pThis->pRegs; u8 devctl = MGC_Read8(pBase, MGC_O_HDRC_DEVCTL); #ifdef MUSB_PARANOID ASSERT_SPINLOCK_UNLOCKED(&pThis->Lock); ASSERT_SPINLOCK_UNLOCKED(&MGC_aGadgetLocalEnd[0]); #endif DBG(3, "<== %s addr=%x driver '%s'\n", (devctl & MGC_M_DEVCTL_BDEVICE) ? "B-Device" : "A-Device", MGC_Read8(pBase, MGC_O_HDRC_FADDR), pThis->pGadgetDriver ? pThis->pGadgetDriver->driver.name : NULL ); /* HR does NOT clear itself */ if (devctl & MGC_M_DEVCTL_HR) { MGC_Write8(pBase, MGC_O_HDRC_DEVCTL, MGC_M_DEVCTL_SESSION); } /* start in USB_STATE_DEFAULT */ pThis->bAddress = 0; pThis->bEnd0Stage = MGC_END0_STAGE_SETUP; pThis->bMayWakeup = 0; pThis->g.b_hnp_enable = 0; pThis->g.a_alt_hnp_support = 0; pThis->g.a_hnp_support = 0; pThis->g.speed = USB_SPEED_UNKNOWN; if (pThis->pGadgetDriver) { u8 bEnd; u8 power = MGC_Read8(pBase, MGC_O_HDRC_POWER); pThis->g.speed = (power & MGC_M_POWER_HSMODE) ? USB_SPEED_HIGH : USB_SPEED_FULL; for (bEnd = 1; bEnd < pThis->bEndCount; bEnd++) { (void)usb_ep_disable(&MGC_aGadgetLocalEnd[bEnd] .end_point); } } #ifdef MUSB_MONITOR_DATA MGC_DisableDebug(); #endif DBG(2, "==>\n"); }
static void musb_pullup(struct musb *musb, int is_on) { u8 power; power = MGC_Read8(musb->pRegs, MGC_O_HDRC_POWER); if (is_on) power |= MGC_M_POWER_SOFTCONN; else power &= ~MGC_M_POWER_SOFTCONN; DBG(3, "gadget %s %sconnecting to host\n", musb->pGadgetDriver->function, is_on ? "" : "dis"); MGC_Write8(musb->pRegs, MGC_O_HDRC_POWER, power); }
/** * Dump core registers whose reads are non-destructive. * @param pThis * @param bEnd */ void MGC_HdrcDumpRegs(u8 * pBase, int multipoint, u8 bEnd) { MGC_SelectEnd(pBase, bEnd); if (!bEnd) { printk(KERN_INFO " 0: CSR0=%04x, Count0=%02x, Type0=%02x, NAKlimit0=%02x\n", MGC_ReadCsr16(pBase, MGC_O_HDRC_CSR0, 0), MGC_ReadCsr8(pBase, MGC_O_HDRC_COUNT0, 0), MGC_ReadCsr8(pBase, MGC_O_HDRC_TYPE0, 0), MGC_ReadCsr8(pBase, MGC_O_HDRC_NAKLIMIT0, 0)); } else { printk(KERN_INFO "%2d: TxCSR=%04x, TxMaxP=%04x, TxType=%02x, TxInterval=%02x\n", bEnd, MGC_ReadCsr16(pBase, MGC_O_HDRC_TXCSR, bEnd), MGC_ReadCsr16(pBase, MGC_O_HDRC_TXMAXP, bEnd), MGC_ReadCsr8(pBase, MGC_O_HDRC_TXTYPE, bEnd), MGC_ReadCsr8(pBase, MGC_O_HDRC_TXINTERVAL, bEnd)); printk(KERN_INFO " RxCSR=%04x, RxMaxP=%04x, RxType=%02x, RxInterval=%02x, RxCount=%04x\n", MGC_ReadCsr16(pBase, MGC_O_HDRC_TXCSR, bEnd), MGC_ReadCsr16(pBase, MGC_O_HDRC_TXMAXP, bEnd), MGC_ReadCsr8(pBase, MGC_O_HDRC_TXTYPE, bEnd), MGC_ReadCsr8(pBase, MGC_O_HDRC_TXINTERVAL, bEnd), MGC_ReadCsr16(pBase, MGC_O_HDRC_RXCOUNT, bEnd)); } if (multipoint) { printk(KERN_INFO " TxAddr=%02x, TxHubAddr=%02x, TxHubPort=%02x\n", MGC_Read8(pBase, MGC_BUSCTL_OFFSET(bEnd, MGC_O_HDRC_TXFUNCADDR)), MGC_Read8(pBase, MGC_BUSCTL_OFFSET(bEnd, MGC_O_HDRC_TXHUBADDR)), MGC_Read8(pBase, MGC_BUSCTL_OFFSET(bEnd, MGC_O_HDRC_TXHUBPORT))); printk(KERN_INFO " RxAddr=%02x, RxHubAddr=%02x, RxHubPort=%02x\n", MGC_Read8(pBase, MGC_BUSCTL_OFFSET(bEnd, MGC_O_HDRC_RXFUNCADDR)), MGC_Read8(pBase, MGC_BUSCTL_OFFSET(bEnd, MGC_O_HDRC_RXHUBADDR)), MGC_Read8(pBase, MGC_BUSCTL_OFFSET(bEnd, MGC_O_HDRC_RXHUBPORT))); } }
static int MGC_GadgetWakeup(struct usb_gadget *gadget) { u8 power; struct musb *pThis = gadget_to_musb(gadget); if (!pThis->bMayWakeup) return -EINVAL; // XXX spin_lock power = MGC_Read8(pThis->pRegs, MGC_O_HDRC_POWER); power |= MGC_M_POWER_RESUME; MGC_Write8(pThis->pRegs, MGC_O_HDRC_POWER, power); power -= MGC_M_POWER_RESUME; mdelay(10); MGC_Write8(pThis->pRegs, MGC_O_HDRC_POWER, power); // XXX spin_unlock return 0; }