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/pcmcia | |
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/pcmcia')
-rw-r--r-- | sys/dev/pcmcia/com_pcmcia.c | 182 |
1 files changed, 9 insertions, 173 deletions
diff --git a/sys/dev/pcmcia/com_pcmcia.c b/sys/dev/pcmcia/com_pcmcia.c index f4b08663141..af370b32839 100644 --- a/sys/dev/pcmcia/com_pcmcia.c +++ b/sys/dev/pcmcia/com_pcmcia.c @@ -1,4 +1,4 @@ -/* $OpenBSD: com_pcmcia.c,v 1.41 2005/08/10 21:19:54 fgsch Exp $ */ +/* $OpenBSD: com_pcmcia.c,v 1.42 2005/09/26 22:32:06 miod Exp $ */ /* $NetBSD: com_pcmcia.c,v 1.15 1998/08/22 17:47:58 msaitoh Exp $ */ /* @@ -154,8 +154,6 @@ void com_pcmcia_disable(struct com_softc *); int com_pcmcia_enable1(struct com_softc *); void com_pcmcia_disable1(struct com_softc *); -void com_pcmcia_attach2(struct com_softc *); - struct com_pcmcia_softc { struct com_softc sc_com; /* real "com" softc */ @@ -326,9 +324,15 @@ found: sc->disable = com_pcmcia_disable; sc->sc_frequency = COM_FREQ; -#ifdef notyet + sc->sc_hwflags = 0; + sc->sc_swflags = 0; + + if (psc->sc_pf->sc->card.manufacturer == PCMCIA_VENDOR_AUDIOVOX && + psc->sc_pf->sc->card.product == PCMCIA_PRODUCT_AUDIOVOX_RTM8000) + sc->sc_fifolen = 16; + com_attach_subr(sc); -#endif + /* establish the interrupt. */ psc->sc_ih = pcmcia_intr_establish(pa->pf, IPL_TTY, comintr, sc, sc->sc_dev.dv_xname); @@ -336,8 +340,6 @@ found: if (*intrstr) printf(", %s", intrstr); - com_pcmcia_attach2(sc); - #ifdef notyet sc->enabled = 0; @@ -428,169 +430,3 @@ com_pcmcia_disable1(sc) pcmcia_function_disable(psc->sc_pf); } - -/* - * XXX This should be handled by a generic attach - */ -void -com_pcmcia_attach2(sc) - struct com_softc *sc; -{ - struct com_pcmcia_softc *psc = (struct com_pcmcia_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: - if (psc->sc_pf->sc->card.manufacturer == - PCMCIA_VENDOR_AUDIOVOX && - psc->sc_pf->sc->card.product == - PCMCIA_PRODUCT_AUDIOVOX_RTM8000) - sc->sc_fifolen = 16; - else - sc->sc_fifolen = 32; - printf(": st16650, %d byte fifo\n", sc->sc_fifolen); - SET(sc->sc_hwflags, COM_HW_FIFO); - 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("comattach: 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 -} |