Example #1
0
/* ARGSUSED */
static void
mvusb_attach(device_t parent, device_t self, void *aux)
{
	struct mvusb_softc *sc = device_private(self);
	struct marvell_attach_args *mva = aux;
	usbd_status r;

	aprint_normal(": Marvell USB 2.0 Interface\n");
	aprint_naive("\n");

	sc->sc.sc_dev = self;
	sc->sc.sc_bus.hci_private = sc;

	sc->sc_model = mva->mva_model;
	sc->sc_rev = mva->mva_revision;
	sc->sc_iot = mva->mva_iot;

	/* Map I/O registers for marvell usb */
	if (bus_space_subregion(mva->mva_iot, mva->mva_ioh, mva->mva_offset,
	    mva->mva_size, &sc->sc_ioh)) {
		aprint_error_dev(self, "can't map registers\n");
		return;
	}
	mvusb_init(sc, mva->mva_tags);

	/* Map I/O registers for ehci */
	sc->sc.sc_size = MARVELL_USB_EHCI_SIZE;
	if (bus_space_subregion(sc->sc_iot, sc->sc_ioh, MARVELL_USB_EHCI_BASE,
	    sc->sc.sc_size, &sc->sc.ioh)) {
		aprint_error_dev(self, "can't subregion registers\n");
		return;
	}
	sc->sc.iot = sc->sc_iot;
	sc->sc.sc_bus.dmatag = mva->mva_dmat;

	/* Disable interrupts, so we don't get any spurious ones. */
	sc->sc.sc_offs = EREAD1(&sc->sc, EHCI_CAPLENGTH);
	DPRINTF(("%s: offs=%d\n", device_xname(self), sc->sc.sc_offs));
	EOWRITE2(&sc->sc, EHCI_USBINTR, 0);

	marvell_intr_establish(mva->mva_irq, IPL_USB, ehci_intr, sc);

	sc->sc.sc_bus.usbrev = USBREV_2_0;
	/* Figure out vendor for root hub descriptor. */
	sc->sc.sc_id_vendor = 0x0000;				/* XXXXX */
	strcpy(sc->sc.sc_vendor, "Marvell");

	sc->sc.sc_vendor_init = mvusb_vendor_init;
	sc->sc.sc_vendor_port_status = mvusb_vendor_port_status;

	r = ehci_init(&sc->sc);
	if (r != USBD_NORMAL_COMPLETION) {
		aprint_error_dev(self, "init failed, error=%d\n", r);
		return;
	}

	/* Attach usb device. */
	sc->sc.sc_child = config_found(self, &sc->sc.sc_bus, usbctlprint);
}
Example #2
0
/*
 * cpu_initclocks:
 *
 *	Initialize the clock and get them going.
 */
void
cpu_initclocks(void)
{
	struct mvsoctmr_softc *sc;
	void *clock_ih;
	const int en = 1, autoen = 1;
	uint32_t timer0_tval;

	sc = mvsoctmr_sc;
	if (sc == NULL)
		panic("cpu_initclocks: mvsoctmr not found");

	mvsoctmr_timecounter.tc_priv = sc;

	if (sc->sc_flags & TMR_FLAGS_ARMADAXP)
		/* We set global timer and counter to 25 MHz mode */
		mvsoctmr_timecounter.tc_frequency = 25000000;
	else
		mvsoctmr_timecounter.tc_frequency = mvTclk;

	timer0_tval = (mvsoctmr_timecounter.tc_frequency * 2) / (u_long) hz;
	timer0_tval = (timer0_tval / 2) + (timer0_tval & 1);

	mvsoctmr_cntl(sc, MVSOCTMR_TIMER0, timer0_tval, en, autoen);
	mvsoctmr_cntl(sc, MVSOCTMR_TIMER1, 0xffffffff, en, autoen);

	if (sc->sc_flags & TMR_FLAGS_ARMADAXP) {
		/*
		 * Establishing timer interrupts is slightly different for
		 * Armada XP than for other supported SoCs from Marvell.
		 * Timer interrupt is no different from any other interrupt
		 * in Armada XP, so we use generic marvell_intr_establish().
		 */
		clock_ih = marvell_intr_establish(sc->sc_irq, IPL_CLOCK,
		    clockhandler, NULL);
	} else
		clock_ih = mvsoc_bridge_intr_establish(
		    MVSOC_MLMB_MLMBI_CPUTIMER0INTREQ, IPL_CLOCK, clockhandler,
		    NULL);
	if (clock_ih == NULL)
		panic("cpu_initclocks: unable to register timer interrupt");

	tc_init(&mvsoctmr_timecounter);
}
Example #3
0
/* ARGSUSED */
static void
gttwsi_attach(device_t parent, device_t self, void *args)
{
    struct marvell_attach_args *mva = args;
    bus_space_handle_t ioh;

    if (bus_space_subregion(mva->mva_iot, mva->mva_ioh, mva->mva_offset,
                            mva->mva_size, &ioh)) {
        aprint_error(": cannot map registers\n");
        return;
    }

    gttwsi_attach_subr(self, mva->mva_iot, ioh);

    marvell_intr_establish(mva->mva_irq, IPL_BIO, gttwsi_intr,
                           device_private(self));

    gttwsi_config_children(self);
}
Example #4
0
/* ARGSUSED */
static void
mvsatahc_attach(device_t parent, device_t self, void *aux)
{
    struct mvsata_softc *sc = device_private(self);
    struct marvell_attach_args *mva = aux;
    uint32_t mask;
    int port, i;

    aprint_normal(": Marvell Serial-ATA Host Controller (SATAHC)\n");
    aprint_naive("\n");

    sc->sc_wdcdev.sc_atac.atac_dev = self;
    sc->sc_model = mva->mva_model;
    sc->sc_iot = mva->mva_iot;
    if (bus_space_subregion(mva->mva_iot, mva->mva_ioh, mva->mva_offset,
                            mva->mva_size, &sc->sc_ioh)) {
        aprint_error_dev(self, "can't map registers\n");
        return;
    }
    sc->sc_dmat = mva->mva_dmat;
    sc->sc_enable_intr = mvsatahc_enable_intr;

    mvsatahc_wininit(sc, mva->mva_tags);

    for (i = 0; i < __arraycount(mvsata_products); i++)
        if (mva->mva_model == mvsata_products[i].model)
            break;
    KASSERT(i < __arraycount(mvsata_products));

    if (mvsata_attach(sc, &mvsata_products[i], NULL, NULL, 0) != 0)
        return;

    marvell_intr_establish(mva->mva_irq, IPL_BIO, mvsatahc_intr, sc);
    mask = 0;
    for (port = 0; port < sc->sc_port; port++)
        mask |=
            MVSATAHC_MI_SATAERR(port) |
            MVSATAHC_MI_SATADONE(port);
    bus_space_write_4(sc->sc_iot, sc->sc_ioh, MVSATAHC_MIMR, mask);
}