xref: /netbsd-src/sys/arch/evbppc/walnut/dev/pbus.c (revision d710132b4b8ce7f7cccaaf660cb16aa16b4077a0)
1 /*	$NetBSD: pbus.c,v 1.2 2003/01/01 01:31:50 thorpej Exp $	*/
2 
3 /*
4  * Copyright 2001 Wasabi Systems, Inc.
5  * All rights reserved.
6  *
7  * Written by Eduardo Horvath and Simon Burge for Wasabi Systems, Inc.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, 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. All advertising materials mentioning features or use of this software
18  *    must display the following acknowledgement:
19  *      This product includes software developed for the NetBSD Project by
20  *      Wasabi Systems, Inc.
21  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22  *    or promote products derived from this software without specific prior
23  *    written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
29  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35  * POSSIBILITY OF SUCH DAMAGE.
36  */
37 
38 /*
39  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
40  *
41  * Redistribution and use in source and binary forms, with or without
42  * modification, are permitted provided that the following conditions
43  * are met:
44  * 1. Redistributions of source code must retain the above copyright
45  *    notice, this list of conditions and the following disclaimer.
46  * 2. Redistributions in binary form must reproduce the above copyright
47  *    notice, this list of conditions and the following disclaimer in the
48  *    documentation and/or other materials provided with the distribution.
49  * 3. All advertising materials mentioning features or use of this software
50  *    must display the following acknowledgement:
51  *      This product includes software developed by Christopher G. Demetriou
52  *	for the NetBSD Project.
53  * 4. The name of the author may not be used to endorse or promote products
54  *    derived from this software without specific prior written permission
55  *
56  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
57  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
58  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
59  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
60  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
61  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
62  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
63  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
64  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
65  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
66  */
67 
68 #include "locators.h"
69 #include "pckbc.h"
70 
71 #include <sys/param.h>
72 #include <sys/systm.h>
73 #include <sys/device.h>
74 
75 #include <machine/bus.h>
76 #include <machine/walnut.h>
77 
78 #include <evbppc/walnut/dev/pbusvar.h>
79 
80 #include <powerpc/ibm4xx/ibm405gp.h>
81 #include <powerpc/ibm4xx/dev/plbvar.h>
82 
83 /*
84  * The devices built in to the 405GP cpu.
85  */
86 const struct pbus_dev {
87 	const char *name;
88 	bus_addr_t addr;
89 	int irq;
90 } pbus_devs [] = {
91 	{ "dsrtc",	NVRAM_BASE,	-1 },
92 	{ "pckbc",	KEY_MOUSE_BASE,	25 }, /* XXX: really irq x..x+1 */
93 	{ NULL }
94 };
95 
96 static int	pbus_match(struct device *, struct cfdata *, void *);
97 static void	pbus_attach(struct device *, struct device *, void *);
98 static int	pbus_submatch(struct device *, struct cfdata *, void *);
99 static int	pbus_print(void *, const char *);
100 
101 CFATTACH_DECL(pbus, sizeof(struct device),
102     pbus_match, pbus_attach, NULL, NULL);
103 
104 /*
105  * Probe for the peripheral bus.
106  */
107 static int
108 pbus_match(struct device *parent, struct cfdata *cf, void *aux)
109 {
110 	struct pbus_attach_args *pba = aux;
111 
112 	/* match only pbus devices */
113 	if (strcmp(pba->pb_name, cf->cf_name) != 0)
114 		return (0);
115 
116 	return (1);
117 }
118 
119 static int
120 pbus_submatch(struct device *parent, struct cfdata *cf, void *aux)
121 {
122 	struct pbus_attach_args *pba = aux;
123 
124 	if (cf->cf_loc[PBUSCF_ADDR] != PBUSCF_ADDR_DEFAULT &&
125 	    cf->cf_loc[PBUSCF_ADDR] != pba->pb_addr)
126 		return (0);
127 
128 	return (config_match(parent, cf, aux));
129 }
130 
131 /*
132  * Attach the peripheral bus.
133  */
134 static void
135 pbus_attach(struct device *parent, struct device *self, void *aux)
136 {
137 	struct plb_attach_args *paa = aux;
138 	struct pbus_attach_args pba;
139 	int i;
140 #if NPCKBC > 0
141 	bus_space_handle_t ioh_fpga;
142 	bus_space_tag_t iot_fpga = paa->plb_bt;
143 	uint8_t fpga_reg;
144 #endif
145 
146 	printf("\n");
147 
148 	for (i = 0; pbus_devs[i].name != NULL; i++) {
149 		pba.pb_name = pbus_devs[i].name;
150 		pba.pb_addr = pbus_devs[i].addr;
151 		pba.pb_irq = pbus_devs[i].irq;
152 		pba.pb_bt = paa->plb_bt;
153 		pba.pb_dmat = paa->plb_dmat;
154 
155 		(void) config_found_sm(self, &pba, pbus_print, pbus_submatch);
156 	}
157 
158 #if NPCKBC > 0
159 	/* Configure FPGA */
160 	if (bus_space_map(iot_fpga, FPGA_BASE, FPGA_SIZE, 0, &ioh_fpga)) {
161 		printf("pbus_attach: can't map FPGA\n");
162 		/* XXX - disable keyboard probe? */
163 	} else {
164 		/* Use separate interrupts for keyboard and mouse */
165 		fpga_reg = bus_space_read_1(iot_fpga, ioh_fpga, FPGA_BRDC);
166 		fpga_reg |= FPGA_BRDC_INT;
167 		bus_space_write_1(iot_fpga, ioh_fpga, FPGA_BRDC, fpga_reg);
168 
169 		/* Set interrupts to active high */
170 		fpga_reg = bus_space_read_1(iot_fpga, ioh_fpga, FPGA_INT_POL);
171 		fpga_reg |= (FPGA_IRQ_KYBD | FPGA_IRQ_MOUSE);
172 		bus_space_write_1(iot_fpga, ioh_fpga, FPGA_INT_POL, fpga_reg);
173 
174 		/* Set interrupts to level triggered */
175 		fpga_reg = bus_space_read_1(iot_fpga, ioh_fpga, FPGA_INT_TRIG);
176 		fpga_reg |= (FPGA_IRQ_KYBD | FPGA_IRQ_MOUSE);
177 		bus_space_write_1(iot_fpga, ioh_fpga, FPGA_INT_TRIG, fpga_reg);
178 
179 		/* Enable interrupts */
180 		fpga_reg = bus_space_read_1(iot_fpga, ioh_fpga, FPGA_INT_ENABLE);
181 		fpga_reg |= (FPGA_IRQ_KYBD | FPGA_IRQ_MOUSE);
182 		bus_space_write_1(iot_fpga, ioh_fpga, FPGA_INT_ENABLE, fpga_reg);
183 
184 		bus_space_unmap(&iot_fpga, ioh_fpga, 2);
185 	}
186 #endif
187 
188 }
189 
190 static int
191 pbus_print(void *aux, const char *pnp)
192 {
193 	struct pbus_attach_args *pba = aux;
194 
195 	if (pnp)
196 		printf("%s at %s", pba->pb_name, pnp);
197 
198 	if (pba->pb_addr != PBUSCF_ADDR_DEFAULT)
199 		aprint_normal(" addr 0x%08lx", pba->pb_addr);
200 	if (pba->pb_irq != PBUSCF_IRQ_DEFAULT)
201 		aprint_normal(" irq %d", pba->pb_irq);
202 
203 	return (UNCONF);
204 }
205