summaryrefslogtreecommitdiff
path: root/sys/dev/puc/com_puc.c
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/puc/com_puc.c
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/puc/com_puc.c')
-rw-r--r--sys/dev/puc/com_puc.c174
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);
}