1 /* $NetBSD: hil_intio.c,v 1.3 2011/02/19 05:36:49 tsutsui Exp $ */ 2 /* $OpenBSD: hil_intio.c,v 1.8 2007/01/06 20:10:57 miod Exp $ */ 3 4 /* 5 * Copyright (c) 2005, Miodrag Vallat. 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, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 21 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 25 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 26 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27 * POSSIBILITY OF SUCH DAMAGE. 28 * 29 */ 30 31 #include <sys/param.h> 32 #include <sys/systm.h> 33 #include <sys/device.h> 34 #include <sys/conf.h> 35 #include <sys/bus.h> 36 #include <sys/cpu.h> 37 38 #include <machine/intr.h> 39 40 #include <dev/cons.h> 41 42 #include <hp300/dev/intiovar.h> 43 44 #include <machine/hil_machdep.h> 45 #include <dev/hil/hilvar.h> 46 47 static int hil_intio_match(device_t, cfdata_t, void *); 48 static void hil_intio_attach(device_t, device_t, void *); 49 50 CFATTACH_DECL_NEW(hil_intio, sizeof(struct hil_softc), 51 hil_intio_match, hil_intio_attach, NULL, NULL); 52 53 int 54 hil_intio_match(device_t parent, cfdata_t cf, void *aux) 55 { 56 struct intio_attach_args *ia = aux; 57 static int hil_matched = 0; 58 59 if (strcmp("hil", ia->ia_modname) != 0) 60 return 0; 61 62 /* Allow only one instance. */ 63 if (hil_matched != 0) 64 return 0; 65 66 if (badaddr((void *)ia->ia_addr)) /* should not happen! */ 67 return 0; 68 69 return 1; 70 } 71 72 int hil_is_console = -1; /* undecided */ 73 74 void 75 hil_intio_attach(device_t parent, device_t self, void *aux) 76 { 77 struct hil_softc *sc = device_private(self); 78 struct intio_attach_args *ia = aux; 79 80 sc->sc_dev = self; 81 sc->sc_bst = ia->ia_bst; 82 if (bus_space_map(sc->sc_bst, ia->ia_iobase, 83 HILMAPSIZE, 0, &sc->sc_bsh) != 0) { 84 aprint_error(": couldn't map hil controller\n"); 85 return; 86 } 87 88 /* 89 * Check that the configured console device is a wsdisplay. 90 */ 91 if (major(cn_tab->cn_dev) != devsw_name2chr("wsdisplay", NULL, 0)) 92 hil_is_console = 0; 93 94 hil_attach(sc, &hil_is_console); 95 intr_establish(hil_intr, sc, ia->ia_ipl, IPL_TTY); 96 97 config_interrupts(self, hil_attach_deferred); 98 } 99