https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=204521

--- Comment #195 from Gary Jennejohn <gljennj...@gmail.com> ---
This is the code I have in my test version of the driver for suspend/resume. 
Never tested, but it might save some time. NOTE that this is copy/paste so the
formatting will probably need to be fixed!

/*
 * Device suspend routine.
 * do what rtsx_activate in OpenBSD does
 */
static int
rtsx_suspend(device_t dev)
{
        struct rtsx_softc *sc = device_get_softc(dev);
        int i;
        uint16_t reg;

        RTSX_LOCK(sc);

        i = 0;
        for (reg = 0xFDA0; reg < 0xFDAE; reg++)
                (void)rtsx_read(sc, reg, &sc->regs[i++]);
        for (reg = 0xFD52; reg < 0xFD69; reg++)
                (void)rtsx_read(sc, reg, &sc->regs[i++]);
        for (reg = 0xFE20; reg < 0xFE34; reg++)
                (void)rtsx_read(sc, reg, &sc->regs[i++]);

        sc->regs4[0] = READ4(sc, RTSX_HCBAR);
        sc->regs4[1] = READ4(sc, RTSX_HCBCTLR);
        sc->regs4[2] = READ4(sc, RTSX_HDBAR);
        sc->regs4[3] = READ4(sc, RTSX_HDBCTLR);
        sc->regs4[4] = READ4(sc, RTSX_HAIMR);
        sc->regs4[5] = READ4(sc, RTSX_BIER);
        /* Not saving RTSX_BIPR. */

        RTSX_UNLOCK(sc);
        return (0);
}

/*
 * Device resume routine.
 * do what rtsx_activate in OpenBSD does
 */
static int
rtsx_resume(device_t dev)
{
        struct rtsx_softc *sc = device_get_softc(dev);
        int i;
        uint16_t reg;

        RTSX_LOCK(sc);

        WRITE4(sc, RTSX_HCBAR, sc->regs4[0]);
        WRITE4(sc, RTSX_HCBCTLR, sc->regs4[1]);
        WRITE4(sc, RTSX_HDBAR, sc->regs4[2]);
        WRITE4(sc, RTSX_HDBCTLR, sc->regs4[3]);
        WRITE4(sc, RTSX_HAIMR, sc->regs4[4]);
        WRITE4(sc, RTSX_BIER, sc->regs4[5]);
        /* Not writing RTSX_BIPR since doing so would clear it. */

        i = 0;
        for (reg = 0xFDA0; reg < 0xFDAE; reg++)
                (void)rtsx_write(sc, reg, 0xff, sc->regs[i++]);
        for (reg = 0xFD52; reg < 0xFD69; reg++)
                (void)rtsx_write(sc, reg, 0xff, sc->regs[i++]);
        for (reg = 0xFE20; reg < 0xFE34; reg++)
                (void)rtsx_write(sc, reg, 0xff, sc->regs[i++]);

        RTSX_UNLOCK(sc);
        return (0);
}

-- 
You are receiving this mail because:
You are the assignee for the bug.
_______________________________________________
freebsd-bugs@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"

Reply via email to