Annotation of sys/arch/sparc64/dev/clkbrd.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: clkbrd.c,v 1.5 2004/10/01 18:18:49 jason Exp $ */
2:
3: /*
4: * Copyright (c) 2004 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:
29: #include <sys/types.h>
30: #include <sys/param.h>
31: #include <sys/systm.h>
32: #include <sys/kernel.h>
33: #include <sys/device.h>
34: #include <sys/conf.h>
35: #include <sys/timeout.h>
36: #include <sys/malloc.h>
37:
38: #include <machine/bus.h>
39: #include <machine/autoconf.h>
40: #include <machine/openfirm.h>
41:
42: #include <sparc64/dev/fhcvar.h>
43: #include <sparc64/dev/clkbrdreg.h>
44: #include <sparc64/dev/clkbrdvar.h>
45:
46: int clkbrd_match(struct device *, void *, void *);
47: void clkbrd_attach(struct device *, struct device *, void *);
48: void clkbrd_led_blink(void *, int);
49:
50: struct cfattach clkbrd_ca = {
51: sizeof(struct clkbrd_softc), clkbrd_match, clkbrd_attach
52: };
53:
54: struct cfdriver clkbrd_cd = {
55: NULL, "clkbrd", DV_DULL
56: };
57:
58: int
59: clkbrd_match(parent, match, aux)
60: struct device *parent;
61: void *match, *aux;
62: {
63: struct fhc_attach_args *fa = aux;
64:
65: if (strcmp(fa->fa_name, "clock-board") == 0)
66: return (1);
67: return (0);
68: }
69:
70: void
71: clkbrd_attach(parent, self, aux)
72: struct device *parent, *self;
73: void *aux;
74: {
75: struct clkbrd_softc *sc = (struct clkbrd_softc *)self;
76: struct fhc_attach_args *fa = aux;
77: int slots;
78: u_int8_t r;
79:
80: sc->sc_bt = fa->fa_bustag;
81:
82: if (fa->fa_nreg < 2) {
83: printf(": no registers\n");
84: return;
85: }
86:
87: if (fhc_bus_map(sc->sc_bt, fa->fa_reg[1].fbr_slot,
88: fa->fa_reg[1].fbr_offset, fa->fa_reg[1].fbr_size, 0,
89: &sc->sc_creg)) {
90: printf(": can't map ctrl regs\n");
91: return;
92: }
93:
94: if (fa->fa_nreg > 2) {
95: if (fhc_bus_map(sc->sc_bt, fa->fa_reg[2].fbr_slot,
96: fa->fa_reg[2].fbr_offset, fa->fa_reg[2].fbr_size, 0,
97: &sc->sc_vreg)) {
98: printf(": can't map vreg\n");
99: return;
100: }
101: sc->sc_has_vreg = 1;
102: }
103:
104: slots = 4;
105: r = bus_space_read_1(sc->sc_bt, sc->sc_creg, CLK_STS1);
106: switch (r & 0xc0) {
107: case 0x40:
108: slots = 16;
109: break;
110: case 0xc0:
111: slots = 8;
112: break;
113: case 0x80:
114: if (sc->sc_has_vreg) {
115: r = bus_space_read_1(sc->sc_bt, sc->sc_vreg, 0);
116: if (r != 0 && (r & 0x80) == 0)
117: slots = 5;
118: }
119: }
120:
121: printf(": %d slots\n", slots);
122:
123: sc->sc_blink.bl_func = clkbrd_led_blink;
124: sc->sc_blink.bl_arg = sc;
125: blink_led_register(&sc->sc_blink);
126: }
127:
128: void
129: clkbrd_led_blink(void *vsc, int on)
130: {
131: struct clkbrd_softc *sc = vsc;
132: int s;
133: u_int8_t r;
134:
135: s = splhigh();
136: r = bus_space_read_1(sc->sc_bt, sc->sc_creg, CLK_CTRL);
137: if (on)
138: r |= CLK_CTRL_RLED;
139: else
140: r &= ~CLK_CTRL_RLED;
141: bus_space_write_1(sc->sc_bt, sc->sc_creg, CLK_CTRL, r);
142: bus_space_read_1(sc->sc_bt, sc->sc_creg, CLK_CTRL);
143: splx(s);
144: }
CVSweb