summaryrefslogtreecommitdiff
path: root/sys/dev/pcmcia
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2005-09-26 22:32:07 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2005-09-26 22:32:07 +0000
commit6e2b42bd89bd45b8441c9c3b19f2deea36837b82 (patch)
treeb19c2bfb430a61a41aca890a54bc33cafacb9bfb /sys/dev/pcmcia
parent2a98855f6e6d38369b257c2f999103d445922b14 (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.c182
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
-}