1 /* $NetBSD: com_pioc.c,v 1.17 2018/12/08 17:46:09 thorpej Exp $ */ 2 3 /*- 4 * Copyright (c) 1998 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Charles M. Hannum. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /*- 33 * Copyright (c) 1991 The Regents of the University of California. 34 * All rights reserved. 35 * 36 * Redistribution and use in source and binary forms, with or without 37 * modification, are permitted provided that the following conditions 38 * are met: 39 * 1. Redistributions of source code must retain the above copyright 40 * notice, this list of conditions and the following disclaimer. 41 * 2. Redistributions in binary form must reproduce the above copyright 42 * notice, this list of conditions and the following disclaimer in the 43 * documentation and/or other materials provided with the distribution. 44 * 3. Neither the name of the University nor the names of its contributors 45 * may be used to endorse or promote products derived from this software 46 * without specific prior written permission. 47 * 48 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 51 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58 * SUCH DAMAGE. 59 * 60 * @(#)com.c 7.5 (Berkeley) 5/16/91 61 */ 62 63 #include <sys/param.h> 64 65 __KERNEL_RCSID(0, "$NetBSD: com_pioc.c,v 1.17 2018/12/08 17:46:09 thorpej Exp $"); 66 67 #include <sys/systm.h> 68 #include <sys/tty.h> 69 #include <sys/proc.h> 70 #include <sys/conf.h> 71 #include <sys/kernel.h> 72 #include <sys/device.h> 73 #include <sys/bus.h> 74 75 #include <machine/intr.h> 76 #include <machine/io.h> 77 78 #include <acorn32/mainbus/piocvar.h> 79 #include <dev/ic/comreg.h> 80 #include <dev/ic/comvar.h> 81 82 #include <dev/cons.h> 83 84 #include "locators.h" 85 86 struct com_pioc_softc { 87 struct com_softc sc_com; /* real "com" softc */ 88 void *sc_ih; /* interrupt handler */ 89 }; 90 91 /* Prototypes for functions */ 92 93 cons_decl(com); 94 95 static int com_pioc_probe (device_t, cfdata_t , void *); 96 static void com_pioc_attach (device_t, device_t, void *); 97 98 /* device attach structure */ 99 100 CFATTACH_DECL_NEW(com_pioc, sizeof(struct com_pioc_softc), 101 com_pioc_probe, com_pioc_attach, NULL, NULL); 102 103 extern bus_space_tag_t comconstag; /* From pioc.c */ 104 105 /* 106 * int com_pioc_probe(device_t parent, cfdata_t cf, void *aux) 107 * 108 * Make sure we are trying to attach a com device and then 109 * probe for one. 110 */ 111 112 static int 113 com_pioc_probe(device_t parent, cfdata_t cf, void *aux) 114 { 115 bus_space_tag_t iot; 116 bus_space_handle_t ioh; 117 int iobase; 118 int rv = 1; 119 struct pioc_attach_args *pa = aux; 120 121 /* We need an offset */ 122 if (pa->pa_offset == PIOCCF_OFFSET_DEFAULT) 123 return(0); 124 125 iot = pa->pa_iot; 126 iobase = pa->pa_iobase + pa->pa_offset; 127 128 /* if it's in use as console, it's there. */ 129 if (!com_is_console(iot, iobase, 0)) { 130 if (bus_space_map(iot, iobase, COM_NPORTS, 0, &ioh)) { 131 return 0; 132 } 133 rv = comprobe1(iot, ioh); 134 bus_space_unmap(iot, ioh, COM_NPORTS); 135 } 136 137 if (rv) { 138 pa->pa_iosize = COM_NPORTS; 139 } 140 return (rv); 141 } 142 143 /* 144 * void com_pioc_attach(device_t parent, device_t self, void *aux) 145 * 146 * attach the com device 147 */ 148 149 static void 150 com_pioc_attach(device_t parent, device_t self, void *aux) 151 { 152 struct com_pioc_softc *psc = device_private(self); 153 struct com_softc *sc = &psc->sc_com; 154 u_int iobase; 155 bus_space_tag_t iot; 156 bus_space_handle_t ioh; 157 struct pioc_attach_args *pa = aux; 158 int count; 159 160 sc->sc_dev = self; 161 iot = pa->pa_iot; 162 iobase = pa->pa_iobase + pa->pa_offset; 163 164 /* 165 printf(" (iot = %p, iobase = 0x%08x) ", iot, iobase); 166 */ 167 if (!com_is_console(iot, iobase, &ioh) 168 && bus_space_map(iot, iobase, COM_NPORTS, 0, &ioh)) 169 panic("comattach: io mapping failed"); 170 com_init_regs(&sc->sc_regs, iot, ioh, iobase); 171 172 sc->sc_frequency = COM_FREQ; 173 174 com_attach_subr(sc); 175 176 if (pa->pa_irq != MAINBUSCF_IRQ_DEFAULT) { 177 psc->sc_ih = intr_claim(pa->pa_irq, IPL_SERIAL, "com", 178 comintr, sc); 179 } 180 181 if (!pmf_device_register1(self, com_suspend, com_resume, com_cleanup)) { 182 aprint_error_dev(self, 183 "could not establish shutdown hook"); 184 } 185 186 /* 187 * This is a patch for bugged revision 1-4 SMC FDC37C665 188 * I/O controllers. 189 * If there is RX data pending when the FIFO in turned on 190 * the RX register cannot be emptied. 191 * 192 * Solution: 193 * Make sure FIFO is off. 194 * Read pending data / int status etc. 195 */ 196 bus_space_write_1(iot, ioh, com_fifo, 0); 197 for (count = 0; count < 8; ++count) 198 (void)bus_space_read_1(iot, ioh, count); 199 200 } 201 202 /* 203 * Console attachment functions 204 */ 205 206 void 207 comcnprobe(struct consdev *cp) 208 { 209 210 #ifdef COMCONSOLE 211 cp->cn_pri = CN_REMOTE; /* Force a serial port console */ 212 #else 213 cp->cn_pri = CN_NORMAL; 214 #endif 215 } 216 217 void 218 comcninit(struct consdev *cp) 219 { 220 int result; 221 222 #ifndef CONMODE 223 #define CONMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */ 224 #endif 225 #ifndef CONSPEED 226 #define CONSPEED 38400 227 #endif 228 #ifndef CONADDR 229 #define CONADDR 0x3f8 230 #endif 231 232 result = comcnattach(comconstag, (IO_CONF_BASE + CONADDR), CONSPEED, 233 COM_FREQ, COM_TYPE_NORMAL, CONMODE); 234 if (result) { 235 printf("initialising serial; got errornr %d\n", result); 236 panic("can't init serial console @%x", CONADDR); 237 }; 238 } 239 240 241 /* End of com_pioc.c */ 242