diff options
Diffstat (limited to 'sys/arch')
-rw-r--r-- | sys/arch/sparc/dev/bwtwo.c | 41 | ||||
-rw-r--r-- | sys/arch/sparc/dev/pfour.c | 32 |
2 files changed, 54 insertions, 19 deletions
diff --git a/sys/arch/sparc/dev/bwtwo.c b/sys/arch/sparc/dev/bwtwo.c index a7d03a8b39d..76d14e39401 100644 --- a/sys/arch/sparc/dev/bwtwo.c +++ b/sys/arch/sparc/dev/bwtwo.c @@ -72,6 +72,7 @@ #include <sparc/dev/bwtworeg.h> #include <sparc/dev/pfourreg.h> #include <sparc/dev/sbusvar.h> +#include "pfour.h" /* per-display variables */ struct bwtwo_softc { @@ -124,7 +125,7 @@ bwtwomatch(parent, vcf, aux) return (0); if (ca->ca_bustype == BUS_SBUS) return(1); -#ifdef SUN4 +#if NPFOUR > 0 if (ca->ca_bustype == BUS_PFOUR && PFOUR_ID(ra->ra_pfour) == PFOUR_ID_BW) return (1); @@ -154,6 +155,7 @@ bwtwoattach(parent, self, args) sc->sc_bustype = ca->ca_bustype; switch (ca->ca_bustype) { #if defined(SUN4) +#if NPFOUR > 0 case BUS_PFOUR: node = 0; pfour_reset(); @@ -163,6 +165,7 @@ bwtwoattach(parent, self, args) sc->sc_fb.fb_linebytes = sc->sc_fb.fb_type.fb_width / 8; nam = "bwtwo"; break; +#endif case BUS_OBIO: node = 0; nam = "bwtwo"; @@ -330,15 +333,17 @@ int bwtwostatus(sc) struct bwtwo_softc *sc; { - int on; - #ifdef SUN4 - if (cputyp == CPU_SUN4 && sc->sc_bustype == BUS_OBIO) - on = lduba(AC_SYSENABLE, ASI_CONTROL) & SYSEN_VIDEO; - else +#if NPFOUR > 0 + if (sc->sc_bustype == BUS_PFOUR) + return pfourstatus(); +#endif + if (sc->sc_bustype == BUS_OBIO) + return (lduba(AC_SYSENABLE, ASI_CONTROL) & SYSEN_VIDEO); +#endif +#if defined(SUN4C) || defined(SUN4M) + return (sc->sc_reg->bw_ctl & CTL_VE); #endif - on = sc->sc_reg->bw_ctl & CTL_VE; - return (on); } void @@ -346,21 +351,29 @@ bwtwoenable(sc, on) struct bwtwo_softc *sc; int on; { +#if NPFOUR > 0 + if (sc->sc_bustype == BUS_PFOUR) { + pfourenable(on); + return; + } +#endif if (on) { #ifdef SUN4 - if (cputyp == CPU_SUN4 && sc->sc_bustype == BUS_OBIO) + if (sc->sc_bustype == BUS_OBIO) { stba(AC_SYSENABLE, ASI_CONTROL, lduba(AC_SYSENABLE, ASI_CONTROL) | SYSEN_VIDEO); - else + return; + } #endif - sc->sc_reg->bw_ctl |= CTL_VE; + sc->sc_reg->bw_ctl |= CTL_VE; } else { #ifdef SUN4 - if (cputyp == CPU_SUN4 && sc->sc_bustype == BUS_OBIO) + if (sc->sc_bustype == BUS_OBIO) { stba(AC_SYSENABLE, ASI_CONTROL, lduba(AC_SYSENABLE, ASI_CONTROL) & ~SYSEN_VIDEO); - else + return; + } #endif - sc->sc_reg->bw_ctl &= ~CTL_VE; + sc->sc_reg->bw_ctl &= ~CTL_VE; } } diff --git a/sys/arch/sparc/dev/pfour.c b/sys/arch/sparc/dev/pfour.c index 78c3ccb722d..48d555b3773 100644 --- a/sys/arch/sparc/dev/pfour.c +++ b/sys/arch/sparc/dev/pfour.c @@ -50,10 +50,9 @@ #include <sparc/sparc/vaddrs.h> #include <sparc/dev/pfourreg.h> -volatile int *pfour_vaddr; /* pfour register */ - struct pfour_softc { struct device sc_dev; /* base device */ + volatile u_long *sc_vaddr; /* pfour register */ int nothing; }; @@ -106,7 +105,7 @@ pfourattach(parent, self, args) return; } - pfour_vaddr = mapiodev((caddr_t)(ca->ca_ra.ra_paddr + PFOUR_REG), + sc->sc_vaddr = mapiodev((caddr_t)(ca->ca_ra.ra_paddr + PFOUR_REG), NBPG, ca->ca_bustype); printf(": cardtype 0x%02x\n", PFOUR_FBTYPE(val)); @@ -140,8 +139,11 @@ pfourattach(parent, self, args) void pfour_reset() { - *pfour_vaddr = PFOUR_REG_VIDEO | PFOUR_REG_RESET; - *pfour_vaddr = PFOUR_REG_VIDEO; + struct pfour_softc *sc = pfourcd.cd_devs[0]; + + *sc->sc_vaddr = PFOUR_REG_VIDEO | PFOUR_REG_RESET; + delay(1); + *sc->sc_vaddr = PFOUR_REG_VIDEO; } int @@ -187,3 +189,23 @@ pfour_videosize(reg, xp, yp) } return (0); } + +void +pfourenable(on) + int on; +{ + struct pfour_softc *sc = pfourcd.cd_devs[0]; + + if (on) + *sc->sc_vaddr |= PFOUR_REG_VIDEO; + else + *sc->sc_vaddr &= ~PFOUR_REG_VIDEO; +} + +int +pfourstatus() +{ + struct pfour_softc *sc = pfourcd.cd_devs[0]; + + return (*sc->sc_vaddr & PFOUR_REG_VIDEO); +} |