Annotation of sys/arch/sparc64/dev/beeper.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: beeper.c,v 1.10 2005/12/20 16:50:33 martin Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 2001 Jason L. Wright (jason@thought.net)
! 5: * All rights reserved.
! 6: *
! 7: * Redistribution and use in source and binary forms, with or without
! 8: * modification, are permitted provided that the following conditions
! 9: * are met:
! 10: * 1. Redistributions of source code must retain the above copyright
! 11: * notice, this list of conditions and the following disclaimer.
! 12: * 2. Redistributions in binary form must reproduce the above copyright
! 13: * notice, this list of conditions and the following disclaimer in the
! 14: * documentation and/or other materials provided with the distribution.
! 15: *
! 16: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 17: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
! 18: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
! 19: * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
! 20: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
! 21: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
! 22: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 23: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
! 24: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
! 25: * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 26: * POSSIBILITY OF SUCH DAMAGE.
! 27: *
! 28: * Effort sponsored in part by the Defense Advanced Research Projects
! 29: * Agency (DARPA) and Air Force Research Laboratory, Air Force
! 30: * Materiel Command, USAF, under agreement number F30602-01-2-0537.
! 31: *
! 32: */
! 33:
! 34: /*
! 35: * Driver for beeper device on SUNW,Ultra-1-Engine.
! 36: */
! 37:
! 38: #include <sys/types.h>
! 39: #include <sys/param.h>
! 40: #include <sys/systm.h>
! 41: #include <sys/kernel.h>
! 42: #include <sys/device.h>
! 43: #include <sys/conf.h>
! 44: #include <sys/timeout.h>
! 45:
! 46: #include <machine/bus.h>
! 47: #include <machine/autoconf.h>
! 48: #include <machine/openfirm.h>
! 49:
! 50: #include <sparc64/dev/ebusreg.h>
! 51: #include <sparc64/dev/ebusvar.h>
! 52:
! 53: #include "pckbd.h"
! 54: #if NPCKBD > 0
! 55: #include <dev/ic/pckbcvar.h>
! 56: #include <dev/pckbc/pckbdvar.h>
! 57: #endif
! 58:
! 59: struct beeper_softc {
! 60: struct device sc_dev;
! 61: bus_space_tag_t sc_iot;
! 62: bus_space_handle_t sc_ioh;
! 63: struct timeout sc_to;
! 64: int sc_belltimeout, sc_bellactive;
! 65: };
! 66:
! 67: #define BEEP_REG 0
! 68:
! 69: int beeper_match(struct device *, void *, void *);
! 70: void beeper_attach(struct device *, struct device *, void *);
! 71:
! 72: struct cfattach beeper_ca = {
! 73: sizeof(struct beeper_softc), beeper_match, beeper_attach
! 74: };
! 75:
! 76: struct cfdriver beeper_cd = {
! 77: NULL, "beeper", DV_DULL
! 78: };
! 79:
! 80: #if NPCKBD > 0
! 81: void beeper_stop(void *);
! 82: void beeper_bell(void *, u_int, u_int, u_int, int);
! 83: #endif
! 84:
! 85: int
! 86: beeper_match(parent, match, aux)
! 87: struct device *parent;
! 88: void *match;
! 89: void *aux;
! 90: {
! 91: struct ebus_attach_args *ea = aux;
! 92:
! 93: if (strcmp(ea->ea_name, "beeper") == 0)
! 94: return (1);
! 95: return (0);
! 96: }
! 97:
! 98: void
! 99: beeper_attach(parent, self, aux)
! 100: struct device *parent, *self;
! 101: void *aux;
! 102: {
! 103: struct beeper_softc *sc = (void *)self;
! 104: struct ebus_attach_args *ea = aux;
! 105:
! 106: sc->sc_iot = ea->ea_memtag;
! 107:
! 108: /* Use prom address if available, otherwise map it. */
! 109: if (ea->ea_nvaddrs) {
! 110: if (bus_space_map(sc->sc_iot, ea->ea_vaddrs[0], 0,
! 111: BUS_SPACE_MAP_PROMADDRESS, &sc->sc_ioh)) {
! 112: printf(": can't map PROM register space\n");
! 113: return;
! 114: }
! 115: } else if (ebus_bus_map(sc->sc_iot, 0,
! 116: EBUS_PADDR_FROM_REG(&ea->ea_regs[0]), ea->ea_regs[0].size, 0, 0,
! 117: &sc->sc_ioh) != 0) {
! 118: printf(": can't map register space\n");
! 119: return;
! 120: }
! 121:
! 122: #if NPCKBD > 0
! 123: timeout_set(&sc->sc_to, beeper_stop, sc);
! 124: pckbd_hookup_bell(beeper_bell, sc);
! 125: #endif
! 126: printf("\n");
! 127: }
! 128:
! 129: #if NPCKBD > 0
! 130: void
! 131: beeper_stop(vsc)
! 132: void *vsc;
! 133: {
! 134: struct beeper_softc *sc = vsc;
! 135: int s;
! 136:
! 137: s = spltty();
! 138: bus_space_write_4(sc->sc_iot, sc->sc_ioh, BEEP_REG, 0);
! 139: sc->sc_bellactive = 0;
! 140: sc->sc_belltimeout = 0;
! 141: splx(s);
! 142: }
! 143:
! 144: void
! 145: beeper_bell(vsc, pitch, period, volume, poll)
! 146: void *vsc;
! 147: u_int pitch, period, volume;
! 148: int poll;
! 149: {
! 150: struct beeper_softc *sc = vsc;
! 151: int s, ticks;
! 152:
! 153: ticks = (period * hz) / 1000;
! 154: if (ticks <= 0)
! 155: ticks = 1;
! 156:
! 157: s = spltty();
! 158: if (sc->sc_bellactive) {
! 159: if (sc->sc_belltimeout == 0)
! 160: timeout_del(&sc->sc_to);
! 161: }
! 162: if (pitch == 0 || period == 0) {
! 163: beeper_stop(sc);
! 164: splx(s);
! 165: return;
! 166: }
! 167: if (!sc->sc_bellactive) {
! 168: sc->sc_bellactive = 1;
! 169: sc->sc_belltimeout = 1;
! 170: bus_space_write_4(sc->sc_iot, sc->sc_ioh, BEEP_REG, 1);
! 171: timeout_add(&sc->sc_to, ticks);
! 172: }
! 173: splx(s);
! 174: }
! 175: #endif /* NPCKBD > 0 */
CVSweb