Beispiel #1
0
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");
}
Beispiel #2
0
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);
}
Beispiel #3
0
/**
 * 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)));
	}
}
Beispiel #4
0
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;
}