diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2005-09-26 22:32:07 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2005-09-26 22:32:07 +0000 |
commit | 6e2b42bd89bd45b8441c9c3b19f2deea36837b82 (patch) | |
tree | b19c2bfb430a61a41aca890a54bc33cafacb9bfb /sys/dev/puc/com_puc.c | |
parent | 2a98855f6e6d38369b257c2f999103d445922b14 (diff) |
Share com probe code between com and pccom; allows us to get rid of awkward
code duplication in cardbus, pcmcia and puc attachments.
Joint effort with fgs@; blessed deraadt@
Diffstat (limited to 'sys/dev/puc/com_puc.c')
-rw-r--r-- | sys/dev/puc/com_puc.c | 174 |
1 files changed, 2 insertions, 172 deletions
diff --git a/sys/dev/puc/com_puc.c b/sys/dev/puc/com_puc.c index 35c4ee9423f..4a81caa0afd 100644 --- a/sys/dev/puc/com_puc.c +++ b/sys/dev/puc/com_puc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: com_puc.c,v 1.8 2005/07/18 17:51:48 miod Exp $ */ +/* $OpenBSD: com_puc.c,v 1.9 2005/09/26 22:32:06 miod Exp $ */ /* * Copyright (c) 1997 - 1999, Jason Downs. All rights reserved. @@ -84,8 +84,6 @@ struct cfattach pccom_puc_ca = { }; #endif -void com_puc_attach2(struct com_softc *); - int com_puc_match(parent, match, aux) struct device *parent; @@ -130,176 +128,8 @@ com_puc_attach(parent, self, aux) if (pa->flags) sc->sc_frequency = pa->flags & PUC_COM_CLOCKMASK; - com_puc_attach2(sc); -} - -/* - * XXX This should be handled by a generic attach - */ -void -com_puc_attach2(sc) - struct com_softc *sc; -{ - bus_space_tag_t iot = sc->sc_iot; - bus_space_handle_t ioh = sc->sc_ioh; - u_int8_t lcr; - sc->sc_hwflags = 0; sc->sc_swflags = 0; - /* - * Probe for all known forms of UART. - */ - lcr = bus_space_read_1(iot, ioh, com_lcr); - - bus_space_write_1(iot, ioh, com_lcr, LCR_EFR); - bus_space_write_1(iot, ioh, com_efr, 0); - bus_space_write_1(iot, ioh, com_lcr, 0); - - bus_space_write_1(iot, ioh, com_fifo, FIFO_ENABLE); - delay(100); - - switch(bus_space_read_1(iot, ioh, com_iir) >> 6) { - case 0: - sc->sc_uarttype = COM_UART_16450; - break; - case 2: - sc->sc_uarttype = COM_UART_16550; - break; - case 3: - sc->sc_uarttype = COM_UART_16550A; - break; - default: - sc->sc_uarttype = COM_UART_UNKNOWN; - break; - } - - if (sc->sc_uarttype == COM_UART_16550A) { /* Probe for ST16650s */ - bus_space_write_1(iot, ioh, com_lcr, lcr | LCR_DLAB); - if (bus_space_read_1(iot, ioh, com_efr) == 0) { - sc->sc_uarttype = COM_UART_ST16650; - } else { - bus_space_write_1(iot, ioh, com_lcr, LCR_EFR); - if (bus_space_read_1(iot, ioh, com_efr) == 0) - sc->sc_uarttype = COM_UART_ST16650V2; - } - } - -#if NPCCOM > 0 -#ifdef i386 - if (sc->sc_uarttype == COM_UART_ST16650V2) { /* Probe for XR16850s */ - u_int8_t dlbl, dlbh; - - /* Enable latch access and get the current values. */ - bus_space_write_1(iot, ioh, com_lcr, lcr | LCR_DLAB); - dlbl = bus_space_read_1(iot, ioh, com_dlbl); - dlbh = bus_space_read_1(iot, ioh, com_dlbh); - - /* Zero out the latch divisors */ - bus_space_write_1(iot, ioh, com_dlbl, 0); - bus_space_write_1(iot, ioh, com_dlbh, 0); - - if (bus_space_read_1(iot, ioh, com_dlbh) == 0x10) { - sc->sc_uarttype = COM_UART_XR16850; - sc->sc_uartrev = bus_space_read_1(iot, ioh, com_dlbl); - } - - /* Reset to original. */ - bus_space_write_1(iot, ioh, com_dlbl, dlbl); - bus_space_write_1(iot, ioh, com_dlbh, dlbh); - } -#endif -#endif - - /* Reset the LCR (latch access is probably enabled). */ - bus_space_write_1(iot, ioh, com_lcr, lcr); - if (sc->sc_uarttype == COM_UART_16450) { /* Probe for 8250 */ - u_int8_t scr0, scr1, scr2; - - scr0 = bus_space_read_1(iot, ioh, com_scratch); - bus_space_write_1(iot, ioh, com_scratch, 0xa5); - scr1 = bus_space_read_1(iot, ioh, com_scratch); - bus_space_write_1(iot, ioh, com_scratch, 0x5a); - scr2 = bus_space_read_1(iot, ioh, com_scratch); - bus_space_write_1(iot, ioh, com_scratch, scr0); - - if ((scr1 != 0xa5) || (scr2 != 0x5a)) - sc->sc_uarttype = COM_UART_8250; - } - - /* - * Print UART type and initialize ourself. - */ - sc->sc_fifolen = 1; /* default */ - switch (sc->sc_uarttype) { - case COM_UART_UNKNOWN: - printf(": unknown uart\n"); - break; - case COM_UART_8250: - printf(": ns8250, no fifo\n"); - break; - case COM_UART_16450: - printf(": ns16450, no fifo\n"); - break; - case COM_UART_16550: - printf(": ns16550, no working fifo\n"); - break; - case COM_UART_16550A: - printf(": ns16550a, 16 byte fifo\n"); - SET(sc->sc_hwflags, COM_HW_FIFO); - sc->sc_fifolen = 16; - break; - case COM_UART_ST16650: - printf(": st16650, no working fifo\n"); - break; - case COM_UART_ST16650V2: - printf(": st16650, 32 byte fifo\n"); - SET(sc->sc_hwflags, COM_HW_FIFO); - sc->sc_fifolen = 32; - break; - case COM_UART_TI16750: - printf(": ti16750, 64 byte fifo\n"); - SET(sc->sc_hwflags, COM_HW_FIFO); - sc->sc_fifolen = 64; - break; -#if NPCCOM > 0 -#ifdef i386 - case COM_UART_XR16850: - printf(": xr16850 (rev %d), 128 byte fifo\n", sc->sc_uartrev); - SET(sc->sc_hwflags, COM_HW_FIFO); - sc->sc_fifolen = 128; - break; -#endif -#endif - default: - panic("com_puc_attach2: bad fifo type"); - } - - /* clear and disable fifo */ - bus_space_write_1(iot, ioh, com_fifo, FIFO_RCV_RST | FIFO_XMT_RST); - (void)bus_space_read_1(iot, ioh, com_data); - bus_space_write_1(iot, ioh, com_fifo, 0); - - sc->sc_mcr = 0; - bus_space_write_1(iot, ioh, com_mcr, sc->sc_mcr); - - timeout_set(&sc->sc_diag_tmo, comdiag, sc); - timeout_set(&sc->sc_dtr_tmo, com_raisedtr, sc); -#if NCOM > 0 -#ifdef __HAVE_GENERIC_SOFT_INTERRUPTS - sc->sc_si = softintr_establish(IPL_TTY, comsoft, sc); - if (sc->sc_si == NULL) - panic("%s: can't establish soft interrupt.", - sc->sc_dev.dv_xname); -#else - timeout_set(&sc->sc_comsoft_tmo, comsoft, sc); -#endif -#endif - - /* - * If there are no enable/disable functions, assume the device - * is always enabled. - */ - if (!sc->enable) - sc->enabled = 1; + com_attach_subr(sc); } |