xref: /netbsd/sys/arch/alpha/tlsb/mcclock_tlsb.c (revision bf9ec67e)
1 /* $NetBSD: mcclock_tlsb.c,v 1.8 1998/05/13 02:50:29 thorpej Exp $ */
2 
3 /*
4  * Copyright (c) 1997 by Matthew Jacob
5  * NASA AMES Research Center.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice immediately at the beginning of the file, without modification,
13  *    this list of conditions, and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  * 3. The name of the author may not be used to endorse or promote products
18  *    derived from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
24  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32 
33 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
34 
35 __KERNEL_RCSID(0, "$NetBSD: mcclock_tlsb.c,v 1.8 1998/05/13 02:50:29 thorpej Exp $");
36 
37 #include <sys/param.h>
38 #include <sys/kernel.h>
39 #include <sys/systm.h>
40 #include <sys/device.h>
41 
42 #include <machine/bus.h>
43 
44 #include <dev/dec/clockvar.h>
45 #include <dev/dec/mcclockvar.h>
46 
47 #include <alpha/tlsb/gbusvar.h>
48 
49 #include <alpha/tlsb/tlsbreg.h>		/* XXX */
50 
51 #include <dev/ic/mc146818reg.h>
52 
53 #define	KV(_addr)	((caddr_t)ALPHA_PHYS_TO_K0SEG((_addr)))
54 /*
55  * Registers are 64 bytes apart (and 1 byte wide)
56  */
57 #define	REGSHIFT	6
58 
59 struct mcclock_tlsb_softc {
60 	struct mcclock_softc	sc_mcclock;
61 	unsigned long regbase;
62 };
63 
64 int	mcclock_tlsb_match __P((struct device *, struct cfdata *, void *));
65 void	mcclock_tlsb_attach __P((struct device *, struct device *, void *));
66 
67 struct cfattach mcclock_tlsb_ca = {
68 	sizeof (struct mcclock_tlsb_softc),
69 	mcclock_tlsb_match,
70 	mcclock_tlsb_attach,
71 };
72 
73 extern struct cfdriver mcclock_cd;
74 
75 static void	mcclock_tlsb_write __P((struct mcclock_softc *, u_int, u_int));
76 static u_int	mcclock_tlsb_read __P((struct mcclock_softc *, u_int));
77 
78 const struct mcclock_busfns mcclock_tlsb_busfns = {
79 	mcclock_tlsb_write, mcclock_tlsb_read,
80 };
81 
82 int
83 mcclock_tlsb_match(parent, match, aux)
84 	struct device *parent;
85 	struct cfdata *match;
86 	void *aux;
87 {
88 	struct gbus_attach_args *ga = aux;
89 	if (strcmp(ga->ga_name, mcclock_cd.cd_name))
90 		return (0);
91 	return (1);
92 }
93 
94 void
95 mcclock_tlsb_attach(parent, self, aux)
96 	struct device *parent, *self;
97 	void *aux;
98 {
99 	struct mcclock_tlsb_softc *sc = (struct mcclock_tlsb_softc *)self;
100 	struct gbus_attach_args *ga = aux;
101 
102 	/* XXX Should be bus.h'd, so we can accomodate the kn7aa. */
103 	sc->regbase = TLSB_GBUS_BASE + ga->ga_offset;
104 
105 	mcclock_attach(&sc->sc_mcclock, &mcclock_tlsb_busfns);
106 }
107 
108 static void
109 mcclock_tlsb_write(mcsc, reg, val)
110 	struct mcclock_softc *mcsc;
111 	u_int reg, val;
112 {
113 	struct mcclock_tlsb_softc *sc = (struct mcclock_tlsb_softc *)mcsc;
114 	unsigned char *ptr = (unsigned char *)
115 		KV(sc->regbase + (reg << REGSHIFT));
116 	*ptr = val;
117 }
118 
119 static u_int
120 mcclock_tlsb_read(mcsc, reg)
121 	struct mcclock_softc *mcsc;
122 	u_int reg;
123 {
124 	struct mcclock_tlsb_softc *sc = (struct mcclock_tlsb_softc *)mcsc;
125 	unsigned char *ptr = (unsigned char *)
126 		KV(sc->regbase + (reg << REGSHIFT));
127 	return *ptr;
128 }
129