int bppopen(dev_t dev, int flags, int mode, struct lwp *l) { int unit = BPPUNIT(dev); struct bpp_softc *sc; struct lsi64854_softc *lsi; uint16_t irq; int s; if (unit >= bpp_cd.cd_ndevs) return ENXIO; sc = device_lookup_private(&bpp_cd, unit); if ((sc->sc_flags & (BPP_OPEN|BPP_XCLUDE)) == (BPP_OPEN|BPP_XCLUDE)) return EBUSY; lsi = &sc->sc_lsi64854; /* Set default parameters */ sc->sc_hwcurrent = sc->sc_hwdefault; s = splbpp(); bpp_setparams(sc, &sc->sc_hwdefault); splx(s); /* Enable interrupts */ irq = BPP_ERR_IRQ_EN; irq |= sc->sc_hwdefault.hw_irq; bus_space_write_2(lsi->sc_bustag, lsi->sc_regs, L64854_REG_ICR, irq); return 0; }
int bppopen(dev_t dev, int flags, int mode, struct proc *p) { int unit = BPPUNIT(dev); struct bpp_softc *sc; struct lsi64854_softc *lsi; u_int16_t irq; int s; if (unit >= bpp_cd.cd_ndevs) return (ENXIO); if ((sc = bpp_cd.cd_devs[unit]) == NULL) return (ENXIO); lsi = &sc->sc_lsi64854; /* Set default parameters */ s = splbpp(); bpp_setparams(sc, &sc->sc_hwstate); splx(s); /* Enable interrupts */ irq = BPP_ERR_IRQ_EN; irq |= sc->sc_hwstate.hw_irq; bus_space_write_2(lsi->sc_bustag, lsi->sc_regs, L64854_REG_ICR, irq); return (0); }
int bppioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) { struct bpp_softc *sc; struct proc *p = l->l_proc; struct hwstate *hw, *chw; int error = 0; int s; sc = device_lookup_private(&bpp_cd, BPPUNIT(dev)); switch(cmd) { case BPPIOCSPARAM: chw = &sc->sc_hwcurrent; hw = (struct hwstate *)data; /* * Extract and store user-settable bits. */ #define _bpp_set(reg,mask) do { \ chw->reg &= ~(mask); \ chw->reg |= (hw->reg & (mask)); \ } while (/* CONSTCOND */ 0) _bpp_set(hw_hcr, BPP_HCR_DSS_MASK|BPP_HCR_DSW_MASK); _bpp_set(hw_ocr, BPP_OCR_USER); _bpp_set(hw_tcr, BPP_TCR_USER); _bpp_set(hw_or, BPP_OR_USER); _bpp_set(hw_irq, BPP_IRQ_USER); #undef _bpp_set /* Apply settings */ s = splbpp(); bpp_setparams(sc, chw); splx(s); break; case BPPIOCGPARAM: *((struct hwstate *)data) = sc->sc_hwcurrent; break; case TIOCEXCL: s = splbpp(); sc->sc_flags |= BPP_XCLUDE; splx(s); break; case TIOCNXCL: s = splbpp(); sc->sc_flags &= ~BPP_XCLUDE; splx(s); break; case FIOASYNC: mutex_enter(proc_lock); if (*(int *)data) { if (sc->sc_asyncproc != NULL) error = EBUSY; else sc->sc_asyncproc = p; } else sc->sc_asyncproc = NULL; mutex_exit(proc_lock); break; default: break; } return error; }