diff options
author | 2013-09-21 20:07:17 +0000 | |
---|---|---|
committer | 2013-09-21 20:07:17 +0000 | |
commit | 3f08751e46c19154f6ee4881bdfd257961d48bf9 (patch) | |
tree | 5d5752e37bfdb5def75360adb808e68732eab244 | |
parent | Allow for an out-of-softc indirection to reach the software copy of the (diff) | |
download | wireguard-openbsd-3f08751e46c19154f6ee4881bdfd257961d48bf9.tar.xz wireguard-openbsd-3f08751e46c19154f6ee4881bdfd257961d48bf9.zip |
Switch to MI dart(4) driver.
-rw-r--r-- | sys/arch/aviion/conf/files.aviion | 8 | ||||
-rw-r--r-- | sys/arch/aviion/dev/dart.c | 1110 | ||||
-rw-r--r-- | sys/arch/aviion/dev/dart_syscon.c | 100 | ||||
-rw-r--r-- | sys/arch/aviion/dev/dartreg.h | 181 |
4 files changed, 252 insertions, 1147 deletions
diff --git a/sys/arch/aviion/conf/files.aviion b/sys/arch/aviion/conf/files.aviion index c7046846536..2b05b3e4454 100644 --- a/sys/arch/aviion/conf/files.aviion +++ b/sys/arch/aviion/conf/files.aviion @@ -1,4 +1,4 @@ -# $OpenBSD: files.aviion,v 1.10 2013/09/16 16:30:50 miod Exp $ +# $OpenBSD: files.aviion,v 1.11 2013/09/21 20:07:17 miod Exp $ # maxpartitions 16 @@ -19,9 +19,9 @@ attach nvram at syscon file arch/aviion/dev/nvram.c nvram needs-flag device dart: tty -attach dart at syscon with dart_syscon -file arch/aviion/dev/dart.c dart needs-flag -file arch/aviion/dev/dart_syscon.c dart_syscon +file dev/ic/mc68681.c +attach dart at syscon +file arch/aviion/dev/dart.c dart needs-count attach le at syscon with le_syscon file arch/aviion/dev/if_le_syscon.c le_syscon diff --git a/sys/arch/aviion/dev/dart.c b/sys/arch/aviion/dev/dart.c index 0e3bb9dceae..813592f3e4b 100644 --- a/sys/arch/aviion/dev/dart.c +++ b/sys/arch/aviion/dev/dart.c @@ -1,6 +1,21 @@ -/* $OpenBSD: dart.c,v 1.11 2010/07/02 17:27:01 nicm Exp $ */ +/* $OpenBSD: dart.c,v 1.12 2013/09/21 20:07:18 miod Exp $ */ /* + * Copyright (c) 2006, 2013 Miodrag Vallat. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* * Mach Operating System * Copyright (c) 1993-1991 Carnegie Mellon University * All Rights Reserved. @@ -27,842 +42,237 @@ */ #include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/proc.h> -#include <sys/tty.h> #include <sys/systm.h> #include <sys/device.h> -#include <sys/syslog.h> #include <machine/autoconf.h> +#include <machine/board.h> #include <machine/conf.h> #include <machine/cpu.h> #include <dev/cons.h> #include <machine/avcommon.h> -#include <aviion/dev/dartreg.h> -#define SPKRDIS 0x10 /* disable speaker on OP3 */ -#include <aviion/dev/dartvar.h> +#include <aviion/dev/sysconvar.h> +#include <dev/ic/mc68681reg.h> +#include <dev/ic/mc68681var.h> + +struct dartsoftc { + struct mc68681_softc sc_base; + bus_space_tag_t sc_iot; + bus_space_handle_t sc_ioh; + struct intrhand sc_ih; +}; -#ifdef DDB -#include <ddb/db_var.h> -#endif +int dart_match(struct device *parent, void *self, void *aux); +void dart_attach(struct device *parent, struct device *self, void *aux); -struct cfdriver dart_cd = { - NULL, "dart", DV_TTY +struct cfattach dart_ca = { + sizeof(struct dartsoftc), dart_match, dart_attach }; -/* console is on the first port */ +/* console, if applicable, will always be on the first port */ #define CONS_PORT A_PORT -#ifdef USE_PROM_CONSOLE -#define dartcn_sv sc->sc_sv_reg_storage -#else -struct dart_sv_reg dartcn_sv; -#endif -/* prototypes */ cons_decl(dart); -int dart_speed(int); -struct tty *darttty(dev_t); -void dartstart(struct tty *); -int dartmctl(struct dartsoftc *, int, int, int); -int dartparam(struct tty *, struct termios *); -void dartmodemtrans(struct dartsoftc *, unsigned int, unsigned int); -void dartrint(struct dartsoftc *, int); -void dartxint(struct dartsoftc *, int); +int dartintr(void *); +uint8_t dart_read(void *, uint); +void dart_write(void *, uint, uint8_t); + +/* early console register image */ +struct mc68681_sw_reg dartcn_sw_reg; /* - * DUART registers are mapped as the least-significant byte of 32-bit - * addresses. The following macros hide this. + * DUART registers are mapped as the least-significant byte of 32-bit addresses. */ -#define dart_read(sc, reg) \ - bus_space_read_1((sc)->sc_iot, (sc)->sc_ioh, 3 + ((reg) << 2)) -#define dart_write(sc, reg, val) \ - bus_space_write_1((sc)->sc_iot, (sc)->sc_ioh, 3 + ((reg) << 2), (val)) - -#define DART_CHIP(dev) (minor(dev) >> 1) -#define DART_PORT(dev) (minor(dev) & 1) - -void -dart_common_attach(struct dartsoftc *sc) +uint8_t +dart_read(void *v, uint reg) { - if (sc->sc_console) { - sc->sc_sv_reg = &dartcn_sv; - - if (A_PORT != CONS_PORT) { - sc->sc_sv_reg->sv_mr1[A_PORT] = PARDIS | RXRTS | CL8; - sc->sc_sv_reg->sv_mr2[A_PORT] = /* TXCTS | */ SB1; - sc->sc_sv_reg->sv_csr[A_PORT] = BD9600; - sc->sc_sv_reg->sv_cr[A_PORT] = TXEN | RXEN; - sc->sc_sv_reg->sv_opr |= OPDTRA | OPRTSA; - } else { - sc->sc_sv_reg->sv_mr1[B_PORT] = PARDIS | RXRTS | CL8; - sc->sc_sv_reg->sv_mr2[B_PORT] = /* TXCTS | */ SB1; - sc->sc_sv_reg->sv_csr[B_PORT] = BD9600; - sc->sc_sv_reg->sv_cr[B_PORT] = TXEN | RXEN; - sc->sc_sv_reg->sv_opr |= OPDTRB | OPRTSB; - } - } else { - sc->sc_sv_reg = &sc->sc_sv_reg_storage; - - sc->sc_sv_reg->sv_mr1[A_PORT] = PARDIS | RXRTS | CL8; - sc->sc_sv_reg->sv_mr2[A_PORT] = /* TXCTS | */ SB1; - sc->sc_sv_reg->sv_csr[A_PORT] = BD9600; - sc->sc_sv_reg->sv_cr[A_PORT] = TXEN | RXEN; - - sc->sc_sv_reg->sv_mr1[B_PORT] = PARDIS | RXRTS | CL8; - sc->sc_sv_reg->sv_mr2[B_PORT] = /* TXCTS | */ SB1; - sc->sc_sv_reg->sv_csr[B_PORT] = BD9600; - sc->sc_sv_reg->sv_cr[B_PORT] = TXEN | RXEN; + struct dartsoftc *sc = v; - sc->sc_sv_reg->sv_opr = OPDTRA | OPRTSA | OPDTRB | OPRTSB; - - /* Start out with Tx and RX interrupts disabled */ - /* Enable input port change interrupt */ - sc->sc_sv_reg->sv_imr = IIPCHG; - } - - /* reset port a */ - if (sc->sc_console == 0 || CONS_PORT != A_PORT) { - dart_write(sc, DART_CRA, RXRESET | TXDIS | RXDIS); - DELAY_CR; - dart_write(sc, DART_CRA, TXRESET | TXDIS | RXDIS); - DELAY_CR; - dart_write(sc, DART_CRA, ERRRESET | TXDIS | RXDIS); - DELAY_CR; - dart_write(sc, DART_CRA, BRKINTRESET | TXDIS | RXDIS); - DELAY_CR; - dart_write(sc, DART_CRA, MRRESET | TXDIS | RXDIS); -#if 0 - DELAY_CR; -#endif - - dart_write(sc, DART_MR1A, sc->sc_sv_reg->sv_mr1[A_PORT]); - dart_write(sc, DART_MR2A, sc->sc_sv_reg->sv_mr2[A_PORT]); - dart_write(sc, DART_CSRA, sc->sc_sv_reg->sv_csr[A_PORT]); - dart_write(sc, DART_CRA, sc->sc_sv_reg->sv_cr[A_PORT]); - } - - /* reset port b */ - if (sc->sc_console == 0 || CONS_PORT != B_PORT) { - dart_write(sc, DART_CRB, RXRESET | TXDIS | RXDIS); - DELAY_CR; - dart_write(sc, DART_CRB, TXRESET | TXDIS | RXDIS); - DELAY_CR; - dart_write(sc, DART_CRB, ERRRESET | TXDIS | RXDIS); - DELAY_CR; - dart_write(sc, DART_CRB, BRKINTRESET | TXDIS | RXDIS); - DELAY_CR; - dart_write(sc, DART_CRB, MRRESET | TXDIS | RXDIS); -#if 0 - DELAY_CR; -#endif - - dart_write(sc, DART_MR1B, sc->sc_sv_reg->sv_mr1[B_PORT]); - dart_write(sc, DART_MR2B, sc->sc_sv_reg->sv_mr2[B_PORT]); - dart_write(sc, DART_CSRB, sc->sc_sv_reg->sv_csr[B_PORT]); - dart_write(sc, DART_CRB, sc->sc_sv_reg->sv_cr[B_PORT]); - } - - /* initialize common register of a DUART */ - dart_write(sc, DART_OPRS, sc->sc_sv_reg->sv_opr); - -#if 0 - dart_write(sc, DART_CTUR, SLCTIM >> 8); - dart_write(sc, DART_CTLR, SLCTIM & 0xff); - dart_write(sc, DART_ACR, BDSET2 | CCLK16 | IPDCDIB | IPDCDIA); -#endif - dart_write(sc, DART_IMR, sc->sc_sv_reg->sv_imr); - dart_write(sc, DART_OPCR, OPSET | SPKRDIS); - - sc->sc_dart[A_PORT].tty = sc->sc_dart[B_PORT].tty = NULL; - sc->sc_dart[A_PORT].dart_swflags = sc->sc_dart[B_PORT].dart_swflags = 0; - if (sc->sc_console) - sc->sc_dart[CONS_PORT].dart_swflags |= TIOCFLAG_SOFTCAR; - - printf("\n"); + return (uint8_t)bus_space_read_4(sc->sc_iot, sc->sc_ioh, reg << 2); } -/* speed tables */ -const struct dart_s { - int kspeed; - int dspeed; -} dart_speeds[] = { - { B0, 0 }, /* 0 baud, special HUP condition */ - { B50, NOBAUD }, /* 50 baud, not implemented */ - { B75, BD75 }, /* 75 baud */ - { B110, BD110 }, /* 110 baud */ - { B134, BD134 }, /* 134.5 baud */ - { B150, BD150 }, /* 150 baud */ - { B200, NOBAUD }, /* 200 baud, not implemented */ - { B300, BD300 }, /* 300 baud */ - { B600, BD600 }, /* 600 baud */ - { B1200, BD1200 }, /* 1200 baud */ - { B1800, BD1800 }, /* 1800 baud */ - { B2400, BD2400 }, /* 2400 baud */ - { B4800, BD4800 }, /* 4800 baud */ - { B9600, BD9600 }, /* 9600 baud */ - { B19200, BD19200 }, /* 19200 baud */ - { -1, NOBAUD }, /* anything more is uncivilized */ -}; - -int -dart_speed(int speed) +void +dart_write(void *v, uint reg, uint8_t val) { - const struct dart_s *ds; - - for (ds = dart_speeds; ds->kspeed != -1; ds++) - if (ds->kspeed == speed) - return ds->dspeed; + struct dartsoftc *sc = v; - return NOBAUD; + bus_space_write_4(sc->sc_iot, sc->sc_ioh, reg << 2, val); + /* + * Multiple accesses to the same command register must be delayed, + * to prevent the chip from misbehaving. + */ + if (reg == DART_CRA || reg == DART_CRB) + DELAY(2); } -struct tty * -darttty(dev_t dev) +int +dart_match(struct device *parent, void *cf, void *aux) { - u_int port, chip; - struct dartsoftc *sc; + struct confargs *ca = aux; + bus_space_handle_t ioh; + int rc; - chip = DART_CHIP(dev); - port = DART_PORT(dev); - if (dart_cd.cd_ndevs <= chip || port >= NDARTPORTS) - return (NULL); + /* + * We do not accept empty locators here... + */ + if (ca->ca_paddr == (paddr_t)-1) + return (0); - sc = (struct dartsoftc *)dart_cd.cd_devs[chip]; - if (sc == NULL) - return (NULL); + if (bus_space_map(ca->ca_iot, ca->ca_paddr, DART_SIZE << 2, 0, &ioh) != + 0) + return (0); + rc = badaddr((vaddr_t)bus_space_vaddr(ca->ca_iot, ioh), 4); + bus_space_unmap(ca->ca_iot, ca->ca_paddr, DART_SIZE << 2); - return sc->sc_dart[port].tty; + return (rc == 0); } void -dartstart(struct tty *tp) +dart_attach(struct device *parent, struct device *self, void *aux) { - struct dartsoftc *sc; - dev_t dev; - int s; - u_int port, chip; - int c, tries; - bus_addr_t ptaddr; - - if ((tp->t_state & TS_ISOPEN) == 0) + struct dartsoftc *sc = (struct dartsoftc *)self; + struct mc68681_softc *msc = &sc->sc_base; + struct confargs *ca = aux; + bus_space_handle_t ioh; + u_int intsrc; + + sc->sc_iot = ca->ca_iot; + if (bus_space_map(sc->sc_iot, ca->ca_paddr, DART_SIZE << 2, 0, &ioh) != + 0) { + printf(": can't map registers!\n"); return; - - dev = tp->t_dev; - chip = DART_CHIP(dev); - port = DART_PORT(dev); - sc = (struct dartsoftc *)dart_cd.cd_devs[chip]; - ptaddr = port == A_PORT ? DART_A_BASE : DART_B_BASE; - - s = spltty(); - - if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP)) - goto bail; - - ttwakeupwr(tp); - if (tp->t_outq.c_cc == 0) - goto bail; - - tp->t_state |= TS_BUSY; - while (tp->t_outq.c_cc != 0) { - - /* load transmitter until it is full */ - for (tries = 10000; tries != 0; tries --) - if (dart_read(sc, ptaddr + DART_SRA) & TXRDY) - break; - - if (tries == 0) { - timeout_add(&tp->t_rstrt_to, 1); - tp->t_state |= TS_TIMEOUT; - break; - } else { - c = getc(&tp->t_outq); - - dart_write(sc, ptaddr + DART_TBA, c & 0xff); - - sc->sc_sv_reg->sv_imr |= - port == A_PORT ? ITXRDYA : ITXRDYB; - dart_write(sc, DART_IMR, sc->sc_sv_reg->sv_imr); - } - } - tp->t_state &= ~TS_BUSY; - -bail: - splx(s); -} - -int -dartstop(struct tty *tp, int flag) -{ - int s; - - s = spltty(); - if (tp->t_state & TS_BUSY) { - if ((tp->t_state & TS_TTSTOP) == 0) - tp->t_state |= TS_FLUSH; } - splx(s); - - return 0; -} + sc->sc_ioh = ioh; -/* - * To be called at spltty - tty already locked. - * Returns status of carrier. - */ -int -dartmctl(struct dartsoftc *sc, int port, int flags, int how) -{ - int newflags, flagsmask; - struct dart_info *dart; - int s; - - dart = &sc->sc_dart[port]; - - s = spltty(); - - flagsmask = port == A_PORT ? (OPDTRA | OPRTSA) : (OPDTRB | OPRTSB); - newflags = (flags & TIOCM_DTR ? (OPDTRA | OPDTRB) : 0) | - (flags & TIOCM_RTS ? (OPRTSA | OPRTSB) : 0); - newflags &= flagsmask; /* restrict to the port we are acting on */ - - switch (how) { - case DMSET: - dart_write(sc, DART_OPRS, newflags); - dart_write(sc, DART_OPRR, ~newflags); - /* only replace the sv_opr bits for the port we are acting on */ - sc->sc_sv_reg->sv_opr &= ~flagsmask; - sc->sc_sv_reg->sv_opr |= newflags; - break; - case DMBIS: - dart_write(sc, DART_OPRS, newflags); - sc->sc_sv_reg->sv_opr |= newflags; - break; - case DMBIC: - dart_write(sc, DART_OPRR, newflags); - sc->sc_sv_reg->sv_opr &= ~newflags; - break; - case DMGET: - flags = 0; - if (port == A_PORT) { - if (sc->sc_sv_reg->sv_opr & OPDTRA) - flags |= TIOCM_DTR; - if (sc->sc_sv_reg->sv_opr & OPRTSA) - flags |= TIOCM_RTS; - } else { - if (sc->sc_sv_reg->sv_opr & OPDTRB) - flags |= TIOCM_DTR; - if (sc->sc_sv_reg->sv_opr & OPRTSB) - flags |= TIOCM_RTS; - } - break; + if (ca->ca_paddr == CONSOLE_DART_BASE) { + intsrc = INTSRC_DUART1; + msc->sc_consport = CONS_PORT; /* XXX always for now */ + msc->sc_sw_reg = &dartcn_sw_reg; + } else { + intsrc = INTSRC_DUART2; + msc->sc_sw_reg = &msc->sc_sw_reg_store; + msc->sc_consport = -1; } - splx(s); - return (flags); -} - -int -dartioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) -{ - int error; - u_int port, chip; - struct tty *tp; - struct dart_info *dart; - struct dartsoftc *sc; - - chip = DART_CHIP(dev); - port = DART_PORT(dev); - sc = (struct dartsoftc *)dart_cd.cd_devs[chip]; - dart = &sc->sc_dart[port]; - - tp = dart->tty; - if (tp == NULL) - return (ENXIO); - - error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p); - if (error >= 0) - return(error); + msc->sc_read = dart_read; + msc->sc_write = dart_write; - error = ttioctl(tp, cmd, data, flag, p); - if (error >= 0) - return(error); + /* + * Interrupt configuration. + * + * Timer interrupts are not routed anywhere, so we don't need + * to enable them. + */ + msc->sc_sw_reg->imr = 0; - switch (cmd) { - case TIOCSBRK: - case TIOCCBRK: - break; - case TIOCSDTR: - (void)dartmctl(sc, port, TIOCM_DTR | TIOCM_RTS, DMBIS); - break; - case TIOCCDTR: - (void)dartmctl(sc, port, TIOCM_DTR | TIOCM_RTS, DMBIC); - break; - case TIOCMSET: - (void)dartmctl(sc, port, *(int *) data, DMSET); - break; - case TIOCMBIS: - (void)dartmctl(sc, port, *(int *) data, DMBIS); - break; - case TIOCMBIC: - (void)dartmctl(sc, port, *(int *) data, DMBIC); - break; - case TIOCMGET: - *(int *)data = dartmctl(sc, port, 0, DMGET); - break; - case TIOCGFLAGS: - *(int *)data = dart->dart_swflags; - break; - case TIOCSFLAGS: - error = suser(p, 0); - if (error != 0) - return (EPERM); + /* + * Input Port configuration. + * + * There is no documentation about the serial port usage + * of the input port in the 400 and 4600 manuals. However, + * the 6280 manual describes canonical assignments, which + * are hopefully correct on other systems: + * IP0 = port A CTS + * IP1 = port B CTS + * IP2 = port A DCD (active low) + * IP3 = port B DCD (active low) + */ + msc->sc_hw[A_PORT].dcd_ip = 2; + msc->sc_hw[A_PORT].dcd_active_low = 1; + msc->sc_hw[B_PORT].dcd_ip = 3; + msc->sc_hw[B_PORT].dcd_active_low = 1; + msc->sc_sw_reg->acr |= + DART_ACR_ISR_IP3_CHANGE_ENABLE | DART_ACR_ISR_IP2_CHANGE_ENABLE; - dart->dart_swflags = *(int *)data; - dart->dart_swflags &= /* only allow valid flags */ - (TIOCFLAG_SOFTCAR | TIOCFLAG_CLOCAL | TIOCFLAG_CRTSCTS); + /* + * Output Port configuration. + * + * Again, the serial bits assigments are not documented until the + * 6280 manual, except for the speaker connected to OP3. + * OP0 = port A RTS (guessed) + * OP1 = port B RTS (guessed) + * OP2 = port A DTR + * OP3 = speaker input or port B DTR + * OP4 = speaker enable (active low) + * OP5 = port B DTR if speaker on OP3 + * OP6 = parallel port data strobe + * OP7 = parallel port selection + */ + msc->sc_sw_reg->opcr = DART_OPCR_OP7 | DART_OPCR_OP6 | + DART_OPCR_OP5 | DART_OPCR_OP4 | DART_OPCR_OP3 | DART_OPCR_OP2; + msc->sc_hw[A_PORT].dtr_op = 2; + msc->sc_hw[A_PORT].rts_op = 0; + switch (cpuid) { + case AVIION_300_310: + case AVIION_400_4000: + case AVIION_410_4100: + case AVIION_300C_310C: + case AVIION_300CD_310CD: + case AVIION_300D_310D: + case AVIION_4300_25: + case AVIION_4300_20: + case AVIION_4300_16: + msc->sc_sw_reg->opcr |= DART_OPCR_RX_A; /* disable speaker */ + /* FALLTHROUGH */ + case AVIION_4600_530: + msc->sc_hw[B_PORT].dtr_op = 5; + msc->sc_sw_reg->oprs |= DART_OP_OP5; break; default: - return (ENOTTY); - } - - return (0); -} - -int -dartparam(struct tty *tp, struct termios *t) -{ - int flags; - u_int port, chip; - int speeds; - unsigned char mr1, mr2; - struct dart_info *dart; - struct dartsoftc *sc; - dev_t dev; - bus_addr_t ptaddr; - - dev = tp->t_dev; - chip = DART_CHIP(dev); - port = DART_PORT(dev); - sc = (struct dartsoftc *)dart_cd.cd_devs[chip]; - dart = &sc->sc_dart[port]; - ptaddr = port == A_PORT ? DART_A_BASE : DART_B_BASE; - - tp->t_ispeed = t->c_ispeed; - tp->t_ospeed = t->c_ospeed; - tp->t_cflag = t->c_cflag; - - flags = tp->t_flags; - - /* Reset to make global changes*/ - /* disable Tx and Rx */ - - if (sc->sc_console == 0 || CONS_PORT != port) { - if (port == A_PORT) - sc->sc_sv_reg->sv_imr &= ~(ITXRDYA | IRXRDYA); - else - sc->sc_sv_reg->sv_imr &= ~(ITXRDYB | IRXRDYB); - dart_write(sc, DART_IMR, sc->sc_sv_reg->sv_imr); - - /* hang up on zero baud rate */ - if (tp->t_ispeed == 0) { - dartmctl(sc, port, HUPCL, DMSET); - return (0); - } else { - /* set baudrate */ - speeds = dart_speed(tp->t_ispeed); - if (speeds == NOBAUD) - speeds = sc->sc_sv_reg->sv_csr[port]; - dart_write(sc, ptaddr + DART_CSRA, speeds); - sc->sc_sv_reg->sv_csr[port] = speeds; - } - - /* get saved mode registers and clear set up parameters */ - mr1 = sc->sc_sv_reg->sv_mr1[port]; - mr1 &= ~(CLMASK | PARTYPEMASK | PARMODEMASK); - - mr2 = sc->sc_sv_reg->sv_mr2[port]; - mr2 &= ~SBMASK; - - /* set up character size */ - switch (t->c_cflag & CSIZE) { - case CL8: - mr1 |= CL8; - break; - case CL7: - mr1 |= CL7; - break; - case CL6: - mr1 |= CL6; - break; - case CL5: - mr1 |= CL5; - break; - } - - /* set up stop bits */ - if (tp->t_ospeed == B110) - mr2 |= SB2; - else - mr2 |= SB1; - - /* set up parity */ - if (t->c_cflag & PARENB) { - mr1 |= PAREN; - if (t->c_cflag & PARODD) - mr1 |= ODDPAR; - else - mr1 |= EVENPAR; - } else - mr1 |= PARDIS; - - if (sc->sc_sv_reg->sv_mr1[port] != mr1 || - sc->sc_sv_reg->sv_mr2[port] != mr2) { - /* write mode registers to duart */ - dart_write(sc, ptaddr + DART_CRA, MRRESET); - dart_write(sc, ptaddr + DART_MR1A, mr1); - dart_write(sc, ptaddr + DART_MR2A, mr2); - - /* save changed mode registers */ - sc->sc_sv_reg->sv_mr1[port] = mr1; - sc->sc_sv_reg->sv_mr2[port] = mr2; - } - } - - /* enable transmitter? */ - if (tp->t_state & TS_BUSY) { - sc->sc_sv_reg->sv_imr |= port == A_PORT ? ITXRDYA : ITXRDYB; - dart_write(sc, DART_IMR, sc->sc_sv_reg->sv_imr); - } - - /* re-enable the receiver */ -#if 0 - DELAY_CR; -#endif - sc->sc_sv_reg->sv_imr |= port == A_PORT ? IRXRDYA : IRXRDYB; - dart_write(sc, DART_IMR, sc->sc_sv_reg->sv_imr); - - return (0); -} - -void -dartmodemtrans(struct dartsoftc *sc, unsigned int ip, unsigned int ipcr) -{ - unsigned int dcdstate; - struct tty *tp; - int port; - struct dart_info *dart; - - /* input is inverted at port!!! */ - if (ipcr & IPCRDCDA) { - port = A_PORT; - dcdstate = !(ip & IPDCDA); - } else if (ipcr & IPCRDCDB) { - port = B_PORT; - dcdstate = !(ip & IPDCDB); - } else { -#ifdef DIAGNOSTIC - printf("dartmodemtrans: unknown transition ip=0x%x ipcr=0x%x\n", - ip, ipcr); -#endif - return; - } - - dart = &sc->sc_dart[port]; - tp = dart->tty; - if (tp != NULL) - ttymodem(tp, dcdstate); -} - -int -dartopen(dev_t dev, int flag, int mode, struct proc *p) -{ - int s; - u_int port, chip; - struct dart_info *dart; - struct dartsoftc *sc; - struct tty *tp; - - chip = DART_CHIP(dev); - port = DART_PORT(dev); - if (dart_cd.cd_ndevs <= chip || port >= NDARTPORTS) - return (ENODEV); - sc = (struct dartsoftc *)dart_cd.cd_devs[chip]; - if (sc == NULL) - return (ENODEV); - dart = &sc->sc_dart[port]; - - s = spltty(); - if (dart->tty != NULL) - tp = dart->tty; - else - tp = dart->tty = ttymalloc(0); - - tp->t_oproc = dartstart; - tp->t_param = dartparam; - tp->t_dev = dev; - - if ((tp->t_state & TS_ISOPEN) == 0) { - ttychars(tp); - - if (tp->t_ispeed == 0) { - tp->t_iflag = TTYDEF_IFLAG; - tp->t_oflag = TTYDEF_OFLAG; - tp->t_lflag = TTYDEF_LFLAG; - tp->t_ispeed = tp->t_ospeed = B9600; - if (sc->sc_console && port == CONS_PORT) { - /* console is 8N1 */ - tp->t_cflag = (CREAD | CS8 | HUPCL); - } else { - tp->t_cflag = TTYDEF_CFLAG; - } - } - - if (dart->dart_swflags & TIOCFLAG_CLOCAL) - tp->t_cflag |= CLOCAL; - if (dart->dart_swflags & TIOCFLAG_CRTSCTS) - tp->t_cflag |= CRTSCTS; - if (dart->dart_swflags & TIOCFLAG_MDMBUF) - tp->t_cflag |= MDMBUF; - - dartparam(tp, &tp->t_termios); - ttsetwater(tp); - - (void)dartmctl(sc, port, TIOCM_DTR | TIOCM_RTS, DMSET); - tp->t_state |= TS_CARR_ON; - } else if (tp->t_state & TS_XCLUDE && suser(p, 0) != 0) { - splx(s); - return (EBUSY); + msc->sc_hw[B_PORT].dtr_op = 3; + msc->sc_sw_reg->oprs |= DART_OP_OP3; + break; } + msc->sc_hw[B_PORT].rts_op = 1; + msc->sc_sw_reg->oprs |= DART_OP_OP2 | DART_OP_OP1 | DART_OP_OP0; /* - * Reset the tty pointer, as there could have been a dialout - * use of the tty with a dialin open waiting. + * Clock configuration. + * + * We don't use any clock; the MI driver expects a counter mode + * to be set in this case. */ - tp->t_dev = dev; - splx(s); - return ((*linesw[tp->t_line].l_open)(dev, tp, p)); -} + msc->sc_sw_reg->acr = DART_ACR_CT_COUNTER_CLK_16; -int -dartclose(dev_t dev, int flag, int mode, struct proc *p) -{ - struct tty *tp; - struct dart_info *dart; - struct dartsoftc *sc; - u_int port, chip; + mc68681_common_attach(msc); - chip = DART_CHIP(dev); - port = DART_PORT(dev); - sc = (struct dartsoftc *)dart_cd.cd_devs[chip]; - dart = &sc->sc_dart[port]; + /* enable interrupts */ + sc->sc_ih.ih_fn = dartintr; + sc->sc_ih.ih_arg = sc; + sc->sc_ih.ih_flags = 0; + sc->sc_ih.ih_ipl = IPL_TTY; - tp = dart->tty; - (*linesw[tp->t_line].l_close)(tp, flag, p); - ttyclose(tp); - - return (0); -} - -int -dartread(dev_t dev, struct uio *uio, int flag) -{ - u_int port, chip; - struct tty *tp; - struct dart_info *dart; - struct dartsoftc *sc; - - chip = DART_CHIP(dev); - port = DART_PORT(dev); - sc = (struct dartsoftc *)dart_cd.cd_devs[chip]; - dart = &sc->sc_dart[port]; - - tp = dart->tty; - if (tp == NULL) - return (ENXIO); - return ((*linesw[tp->t_line].l_read)(tp, uio, flag)); -} - -int -dartwrite(dev_t dev, struct uio *uio, int flag) -{ - u_int port, chip; - struct tty *tp; - struct dart_info *dart; - struct dartsoftc *sc; - - chip = DART_CHIP(dev); - port = DART_PORT(dev); - sc = (struct dartsoftc *)dart_cd.cd_devs[chip]; - dart = &sc->sc_dart[port]; - - tp = dart->tty; - if (tp == NULL) - return (ENXIO); - return ((*linesw[tp->t_line].l_write)(tp, uio, flag)); -} - -void -dartrint(struct dartsoftc *sc, int port) -{ - struct tty *tp; - unsigned char data, sr; - struct dart_info *dart; - bus_addr_t ptaddr; - - dart = &sc->sc_dart[port]; - ptaddr = port == A_PORT ? DART_A_BASE : DART_B_BASE; - tp = dart->tty; - - /* read status reg */ - while ((sr = dart_read(sc, ptaddr + DART_SRA)) & RXRDY) { - /* read data and reset receiver */ - data = dart_read(sc, ptaddr + DART_RBA); - - if ((tp->t_state & (TS_ISOPEN|TS_WOPEN)) == 0 && - (sc->sc_console == 0 || CONS_PORT != port)) { - return; - } - - if (sr & RBRK) { - /* clear break state */ - dart_write(sc, ptaddr + DART_CRA, BRKINTRESET); - DELAY_CR; - dart_write(sc, ptaddr + DART_CRA, ERRRESET); - -#if defined(DDB) - if (db_console != 0 && - sc->sc_console && port == CONS_PORT) - Debugger(); -#endif - } else { - if (sr & (FRERR | PERR | ROVRN)) { /* errors */ - if (sr & ROVRN) - log(LOG_WARNING, "%s port %c: " - "receiver overrun\n", - sc->sc_dev.dv_xname, 'A' + port); - if (sr & FRERR) - log(LOG_WARNING, "%s port %c: " - "framing error\n", - sc->sc_dev.dv_xname, 'A' + port); - if (sr & PERR) - log(LOG_WARNING, "%s port %c: " - "parity error\n", - sc->sc_dev.dv_xname, 'A' + port); - /* clear error state */ - dart_write(sc, ptaddr + DART_CRA, ERRRESET); - } else { - /* no errors */ - (*linesw[tp->t_line].l_rint)(data,tp); - } - } - } -} - -void -dartxint(struct dartsoftc *sc, int port) -{ - struct tty *tp; - struct dart_info *dart; - - dart = &sc->sc_dart[port]; - tp = dart->tty; - - if ((tp->t_state & (TS_ISOPEN|TS_WOPEN))==0) - goto out; - - if (tp->t_state & TS_BUSY) { - tp->t_state &= ~(TS_BUSY | TS_FLUSH); - dartstart(tp); - if (tp->t_state & TS_BUSY) { - /* do not disable transmitter, yet */ - return; - } - } -out: - - /* disable transmitter */ - sc->sc_sv_reg->sv_imr &= port == A_PORT ? ~ITXRDYA : ~ITXRDYB; - dart_write(sc, DART_IMR, sc->sc_sv_reg->sv_imr); + sysconintr_establish(intsrc, &sc->sc_ih, self->dv_xname); } int dartintr(void *arg) { - struct dartsoftc *sc = arg; - unsigned char isr, imr; - int port; + struct mc68681_softc *sc = arg; + uint8_t isr, imr; - /* read interrupt status register and mask with imr */ - isr = dart_read(sc, DART_ISR); - imr = sc->sc_sv_reg->sv_imr; + isr = (*sc->sc_read)(sc, DART_ISR); + imr = sc->sc_sw_reg->imr; - if ((isr & imr) == 0) { - /* - * We got an interrupt on a disabled condition (such as TX - * ready change on a disabled port). This should not happen, - * but we have to claim the interrupt anyway. - */ -#if defined(DIAGNOSTIC) && !defined(MULTIPROCESSOR) - printf("%s: spurious interrupt, isr %x imr %x\n", - sc->sc_dev.dv_xname, isr, imr); -#endif - return (1); - } isr &= imr; + if (isr == 0) + return 0; - if (isr & IIPCHG) { - unsigned int ip, ipcr; - - ip = dart_read(sc, DART_IP); - ipcr = dart_read(sc, DART_IPCR); - dartmodemtrans(sc, ip, ipcr); - return (1); - } - - if (isr & (IRXRDYA | ITXRDYA)) - port = 0; -#ifdef DIAGNOSTIC - else if ((isr & (IRXRDYB | ITXRDYB)) == 0) { - printf("%s: spurious interrupt, isr %x\n", - sc->sc_dev.dv_xname, isr); - return (1); /* claim it anyway */ - } -#endif - else - port = 1; - - if (isr & (IRXRDYA | IRXRDYB)) - dartrint(sc, port); - if (isr & (ITXRDYA | ITXRDYB)) - dartxint(sc, port); - if (isr & (port == A_PORT ? IBRKA : IBRKB)) - dart_write(sc, port == A_PORT ? DART_CRA : DART_CRB, - BRKINTRESET); - - return (1); + mc68681_intr(sc, isr); + return 1; } /* * Console interface routines. -#ifdef USE_PROM_CONSOLE - * Since we select the actual console after all devices are attached, - * we can safely pick the appropriate softc and use its information. -#endif */ -#ifdef USE_PROM_CONSOLE -#define dart_cnread(reg) dart_read(sc, (reg)) -#define dart_cnwrite(reg, val) dart_write(sc, (reg), (val)) -#else #define dart_cnread(reg) \ - *(volatile u_int8_t *)(CONSOLE_DART_BASE + 3 + ((reg) << 2)) + *(volatile u_int32_t *)(CONSOLE_DART_BASE + ((reg) << 2)) #define dart_cnwrite(reg, val) \ - *(volatile u_int8_t *)(CONSOLE_DART_BASE + 3 + ((reg) << 2)) = (val) -#endif + *(volatile u_int32_t *)(CONSOLE_DART_BASE + ((reg) << 2)) = (val) void dartcnprobe(struct consdev *cp) @@ -872,12 +282,6 @@ dartcnprobe(struct consdev *cp) if (badaddr(CONSOLE_DART_BASE, 4) != 0) return; -#ifdef USE_PROM_CONSOLE - /* do not attach as console if dart has been disabled */ - if (dart_cd.cd_ndevs == 0 || dart_cd.cd_devs[0] == NULL) - return; -#endif - /* locate the major number */ for (maj = 0; maj < nchrdev; maj++) if (cdevsw[maj].d_open == dartopen) @@ -893,80 +297,77 @@ void dartcninit(cp) struct consdev *cp; { -#ifndef USE_PROM_CONSOLE - dartcn_sv.sv_mr1[CONS_PORT] = PARDIS | RXRTS | CL8; - dartcn_sv.sv_mr2[CONS_PORT] = /* TXCTS | */ SB1; - dartcn_sv.sv_csr[CONS_PORT] = BD9600; - dartcn_sv.sv_cr[CONS_PORT] = TXEN | RXEN; - dartcn_sv.sv_opr = CONS_PORT == A_PORT ? (OPDTRA | OPRTSA) : - (OPDTRB | OPRTSB); - dartcn_sv.sv_imr = IIPCHG; - - dart_cnwrite(DART_CRA, RXRESET | TXDIS | RXDIS); - DELAY_CR; - dart_cnwrite(DART_CRA, TXRESET | TXDIS | RXDIS); - DELAY_CR; - dart_cnwrite(DART_CRA, ERRRESET | TXDIS | RXDIS); - DELAY_CR; - dart_cnwrite(DART_CRA, BRKINTRESET | TXDIS | RXDIS); - DELAY_CR; - dart_cnwrite(DART_CRA, MRRESET | TXDIS | RXDIS); - DELAY_CR; - - dart_cnwrite(DART_MR1A, dartcn_sv.sv_mr1[CONS_PORT]); - dart_cnwrite(DART_MR2A, dartcn_sv.sv_mr2[CONS_PORT]); - dart_cnwrite(DART_CSRA, dartcn_sv.sv_csr[CONS_PORT]); - dart_cnwrite(DART_CRA, dartcn_sv.sv_cr[CONS_PORT]); - - dart_cnwrite(DART_OPRS, dartcn_sv.sv_opr); - - dart_cnwrite(DART_IMR, dartcn_sv.sv_imr); -#endif + dartcn_sw_reg.mr1[CONS_PORT] = + DART_MR1_RX_IRQ_RXRDY | DART_MR1_ERROR_CHAR | + DART_MR1_PARITY_NONE | DART_MR1_RX_RTR | DART_MR1_BPC_8; + dartcn_sw_reg.mr2[CONS_PORT] = + DART_MR2_MODE_NORMAL | /* DART_MR2_TX_CTS | */ DART_MR2_STOP_1; + dartcn_sw_reg.cr[CONS_PORT] = + DART_CR_TX_ENABLE | DART_CR_RX_ENABLE; + + dartcn_sw_reg.acr = DART_ACR_BRG_SET_2 | DART_ACR_CT_COUNTER_CLK_16; + dartcn_sw_reg.oprs = CONS_PORT == A_PORT ? DART_OP_OP2 | DART_OP_OP0 : + DART_OP_OP5 | DART_OP_OP3 | DART_OP_OP1; + dartcn_sw_reg.opcr = DART_OPCR_RX_A; /* XXX unconditional */ + dartcn_sw_reg.imr = DART_ISR_IP_CHANGE; + + dart_cnwrite(DART_CRA, + DART_CR_RESET_RX | DART_CR_TX_DISABLE | DART_CR_RX_DISABLE); + DELAY(2); + dart_cnwrite(DART_CRA, + DART_CR_RESET_TX /* | DART_CR_TX_DISABLE | DART_CR_RX_DISABLE */); + DELAY(2); + dart_cnwrite(DART_CRA, + DART_CR_RESET_ERROR /* | DART_CR_TX_DISABLE | DART_CR_RX_DISABLE */); + DELAY(2); + dart_cnwrite(DART_CRA, + DART_CR_RESET_BREAK /* | DART_CR_TX_DISABLE | DART_CR_RX_DISABLE */); + DELAY(2); + dart_cnwrite(DART_CRA, + DART_CR_RESET_MR1 /* | DART_CR_TX_DISABLE | DART_CR_RX_DISABLE */); + DELAY(2); + + dart_cnwrite(DART_OPRS, dartcn_sw_reg.oprs); + dart_cnwrite(DART_OPCR, dartcn_sw_reg.opcr); + + dart_cnwrite(DART_ACR, dartcn_sw_reg.acr); + + dart_cnwrite(DART_MRA, dartcn_sw_reg.mr1[CONS_PORT]); + dart_cnwrite(DART_MRA, dartcn_sw_reg.mr2[CONS_PORT]); + dart_cnwrite(DART_CSRA, + (DART_CSR_9600 << DART_CSR_RXCLOCK_SHIFT) | + (DART_CSR_9600 << DART_CSR_TXCLOCK_SHIFT)); + dart_cnwrite(DART_CRA, dartcn_sw_reg.cr[CONS_PORT]); + DELAY(2); + + dart_cnwrite(DART_IMR, dartcn_sw_reg.imr); } void dartcnputc(dev_t dev, int c) { -#ifdef USE_PROM_CONSOLE - struct dartsoftc *sc; -#endif int s; - u_int port; - bus_addr_t ptaddr; - -#ifdef USE_PROM_CONSOLE - sc = (struct dartsoftc *)dart_cd.cd_devs[0]; - port = DART_PORT(dev); -#else - port = CONS_PORT; -#endif - ptaddr = port == A_PORT ? DART_A_BASE : DART_B_BASE; s = spltty(); /* inhibit interrupts on the chip */ - dart_cnwrite(DART_IMR, dartcn_sv.sv_imr & - (CONS_PORT == A_PORT ? ~ITXRDYA : ~ITXRDYB)); + dart_cnwrite(DART_IMR, dartcn_sw_reg.imr & ~DART_ISR_TXA); /* make sure transmitter is enabled */ -#if 0 - DELAY_CR; -#endif - dart_cnwrite(ptaddr + DART_CRA, TXEN); + dart_cnwrite(DART_CRA, DART_CR_TX_ENABLE); + DELAY(2); - while ((dart_cnread(ptaddr + DART_SRA) & TXRDY) == 0) + while ((dart_cnread(DART_SRA) & DART_SR_TX_READY) == 0) ; - dart_cnwrite(ptaddr + DART_TBA, c); + dart_cnwrite(DART_TBA, c); /* wait for transmitter to empty */ - while ((dart_cnread(ptaddr + DART_SRA) & TXEMT) == 0) + while ((dart_cnread(DART_SRA) & DART_SR_TX_EMPTY) == 0) ; /* restore the previous state */ - dart_cnwrite(DART_IMR, dartcn_sv.sv_imr); -#if 0 - DELAY_CR; -#endif - dart_cnwrite(ptaddr + DART_CRA, dartcn_sv.sv_cr[0]); + dart_cnwrite(DART_IMR, dartcn_sw_reg.imr); + dart_cnwrite(DART_CRA, dartcn_sw_reg.cr[0]); + DELAY(2); splx(s); } @@ -974,55 +375,40 @@ dartcnputc(dev_t dev, int c) int dartcngetc(dev_t dev) { -#ifdef USE_PROM_CONSOLE - struct dartsoftc *sc; -#endif - unsigned char sr; /* status reg of port a/b */ + uint8_t sr; /* status reg of port a/b */ u_char c; /* received character */ int s; - u_int port; - bus_addr_t ptaddr; - -#ifdef USE_PROM_CONSOLE - sc = (struct dartsoftc *)dart_cd.cd_devs[0]; - port = DART_PORT(dev); -#else - port = CONS_PORT; -#endif - ptaddr = port == A_PORT ? DART_A_BASE : DART_B_BASE; s = spltty(); /* enable receiver */ - dart_cnwrite(ptaddr + DART_CRA, RXEN); + dart_cnwrite(DART_CRA, DART_CR_RX_ENABLE); + DELAY(2); for (;;) { /* read status reg */ - sr = dart_cnread(ptaddr + DART_SRA); + sr = dart_cnread(DART_SRA); /* receiver interrupt handler*/ - if (sr & RXRDY) { + if (sr & DART_SR_RX_READY) { /* read character from port */ - c = dart_cnread(ptaddr + DART_RBA); - - /* check break condition */ - if (sr & RBRK) { - /* clear break state */ - dart_cnwrite(ptaddr + DART_CRA, BRKINTRESET); - DELAY_CR; - dart_cnwrite(ptaddr + DART_CRA, ERRRESET); - break; - } - - if (sr & (FRERR | PERR | ROVRN)) { - /* clear error state */ - dart_cnwrite(ptaddr + DART_CRA, ERRRESET); - } else { + c = dart_cnread(DART_RBA); + + /* check break and error conditions */ + if (sr & DART_SR_BREAK) { + dart_cnwrite(DART_CRA, DART_CR_RESET_BREAK); + DELAY(2); + dart_cnwrite(DART_CRA, DART_CR_RESET_ERROR); + DELAY(2); + } else if (sr & (DART_SR_FRAME | DART_SR_PARITY | + DART_SR_OVERRUN)) { + dart_cnwrite(DART_CRA, DART_CR_RESET_ERROR); + DELAY(2); + } else break; - } } } splx(s); - return ((int)c); + return (int)c; } diff --git a/sys/arch/aviion/dev/dart_syscon.c b/sys/arch/aviion/dev/dart_syscon.c deleted file mode 100644 index 06dcd1da55a..00000000000 --- a/sys/arch/aviion/dev/dart_syscon.c +++ /dev/null @@ -1,100 +0,0 @@ -/* $OpenBSD: dart_syscon.c,v 1.4 2013/09/16 16:30:50 miod Exp $ */ -/* - * Copyright (c) 2006, Miodrag Vallat - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/device.h> - -#include <machine/autoconf.h> -#include <machine/board.h> -#include <machine/cpu.h> - -#include <machine/avcommon.h> -#include <aviion/dev/sysconvar.h> -#include <aviion/dev/dartvar.h> - -int dart_syscon_match(struct device *parent, void *self, void *aux); -void dart_syscon_attach(struct device *parent, struct device *self, void *aux); - -struct cfattach dart_syscon_ca = { - sizeof(struct dartsoftc), dart_syscon_match, dart_syscon_attach -}; - -int -dart_syscon_match(struct device *parent, void *cf, void *aux) -{ - struct confargs *ca = aux; - bus_space_handle_t ioh; - int rc; - - /* - * We do not accept empty locators here... - */ - if (ca->ca_paddr == (paddr_t)-1) - return (0); - - if (bus_space_map(ca->ca_iot, ca->ca_paddr, DART_SIZE, 0, &ioh) != 0) - return (0); - rc = badaddr((vaddr_t)bus_space_vaddr(ca->ca_iot, ioh), 4); - bus_space_unmap(ca->ca_iot, ca->ca_paddr, DART_SIZE); - - return (rc == 0); -} - -void -dart_syscon_attach(struct device *parent, struct device *self, void *aux) -{ - struct dartsoftc *sc = (struct dartsoftc *)self; - struct confargs *ca = aux; - bus_space_handle_t ioh; - u_int intsrc; - - sc->sc_iot = ca->ca_iot; - if (bus_space_map(sc->sc_iot, ca->ca_paddr, DART_SIZE, 0, &ioh) != 0) { - printf(": can't map registers!\n"); - return; - } - sc->sc_ioh = ioh; - - if (ca->ca_paddr == CONSOLE_DART_BASE) { - intsrc = INTSRC_DUART1; - sc->sc_console = 1; /* XXX for now */ - printf(": console"); - } else { - intsrc = INTSRC_DUART2; - sc->sc_console = 0; - } - - /* enable interrupts */ - sc->sc_ih.ih_fn = dartintr; - sc->sc_ih.ih_arg = sc; - sc->sc_ih.ih_flags = 0; - sc->sc_ih.ih_ipl = IPL_TTY; - - sysconintr_establish(intsrc, &sc->sc_ih, self->dv_xname); - - dart_common_attach(sc); -} diff --git a/sys/arch/aviion/dev/dartreg.h b/sys/arch/aviion/dev/dartreg.h deleted file mode 100644 index 6218b9e91af..00000000000 --- a/sys/arch/aviion/dev/dartreg.h +++ /dev/null @@ -1,181 +0,0 @@ -/* $OpenBSD: dartreg.h,v 1.1.1.1 2006/05/09 18:24:15 miod Exp $ */ - -#define MAXPORTS 2 /* max count of PORTS/DUART */ - -#define A_PORT 0 /* flag for port a */ -#define B_PORT 1 /* flag for port b */ - -/* the access to the same command register must be delayed, - because the chip has some hardware problems in this case */ -#define DELAY_CR do { volatile int i; for (i = 0; i < 250; ++i); } while (0) - -/*********************** MC68681 DEFINITIONS ************************/ - -/* mode register 1: MR1x operations */ -#define RXRTS 0x80 /* enable receiver RTS */ -#define PAREN 0x00 /* with parity */ -#define PARDIS 0x10 /* no parity */ -#define EVENPAR 0x00 /* even parity */ -#define ODDPAR 0x04 /* odd parity */ -#define CL5 0x00 /* 5 bits per char */ -#define CL6 0x01 /* 6 bits per char */ -#define CL7 0x02 /* 7 bits per char */ -#define CL8 0x03 /* 8 bits per char */ -#define PARMODEMASK 0x18 /* parity mode mask */ -#define PARTYPEMASK 0x04 /* parity type mask */ -#define CLMASK 0x03 /* character length mask */ - -/* mode register 2: MR2x operations */ -#define TXRTS 0x20 /* enable transmitter RTS */ -#define TXCTS 0x10 /* enable transmitter CTS */ -#define SB2 0x0f /* 2 stop bits */ -#define SB1 0x07 /* 1 stop bit */ -#define SB1L5 0x00 /* 1 stop bit at 5 bits per character */ - -#define SBMASK 0x0f /* stop bit mask */ - -/* clock-select register: CSRx operations */ -#define NOBAUD -1 /* 50 and 200 baud are not possible */ -/* they are not in Baud register set 2 */ -#define BD75 0x00 /* 75 baud */ -#define BD110 0x11 /* 110 baud */ -#define BD134 0x22 /* 134.5 baud */ -#define BD150 0x33 /* 150 baud */ -#define BD300 0x44 /* 300 baud */ -#define BD600 0x55 /* 600 baud */ -#define BD1200 0x66 /* 1200 baud */ -#define BD1800 0xaa /* 1800 baud */ -#define BD2400 0x88 /* 2400 baud */ -#define BD4800 0x99 /* 4800 baud */ -#define BD9600 0xbb /* 9600 baud */ -#define BD19200 0xcc /* 19200 baud */ - -#define DEFBAUD BD9600 /* default value if baudrate is not possible */ - - -/* channel command register: CRx operations */ -#define MRRESET 0x10 /* reset mr pointer to mr1 */ -#define RXRESET 0x20 /* reset receiver */ -#define TXRESET 0x30 /* reset transmitter */ -#define ERRRESET 0x40 /* reset error status */ -#define BRKINTRESET 0x50 /* reset channel's break interrupt */ -#define BRKSTART 0x60 /* start break */ -#define BRKSTOP 0x70 /* stop break */ -#define TXDIS 0x08 /* disable transmitter */ -#define TXEN 0x04 /* enable transmitter */ -#define RXDIS 0x02 /* disable receiver */ -#define RXEN 0x01 /* enable receiver */ - -/* status register: SRx status */ -#define RBRK 0x80 /* received break */ -#define FRERR 0x40 /* frame error */ -#define PERR 0x20 /* parity error */ -#define ROVRN 0x10 /* receiver overrun error */ -#define TXEMT 0x08 /* transmitter empty */ -#define TXRDY 0x04 /* transmitter ready */ -#define FFULL 0x02 /* receiver FIFO full */ -#define RXRDY 0x01 /* receiver ready */ - -/* output port configuration register: OPCR operations */ -#define OPSET 0x00 /* set all op lines to op function */ -#define OPSETTO 0x04 /* use OP3 for timer output */ - -/* output port register: OP operations */ -#define OPDTRB 0x20 /* DTR line output b on the VME188, 181, 141 */ -#define OPDTRA 0x04 /* DTR line output a */ -#define OPRTSB 0x02 /* RTS line output b */ -#define OPRTSA 0x01 /* RTS line output a */ - -/* auxiliary control register: ACR operations */ -#define BDSET1 0x00 /* baudrate generator set 1 */ -#define BDSET2 0x80 /* baudrate generator set 2 */ -#define CCLK1 0x60 /* timer clock: external rate. TA */ -#define CCLK16 0x30 /* counter clock: x1 clk divided by 16 */ -#define SLCTIM 0x7800/* timer count to get 60 Hz time slice (16.6ms ticks) */ -#define IPDCDIB 0x08 /* IP3 change == DCD input on port B */ -#define IPDCDIA 0x04 /* IP2 change == DCD input on port A */ - -/* input port change register: IPCR operations */ -#define IPCRDCDB 0x80 /* IP3 change == DCD change on port B */ -#define IPCRDCDA 0x40 /* IP2 change == DCD change on port A */ - -/* Defines for mvme335 */ -#define IPDCDB 0x20 /* DCD line input b */ -#define IPDCDA 0x10 /* DCD line input a */ - -#define IPDSRB 0x08 /* DSR line input b */ -#define IPDSRA 0x04 /* DSR line input a */ -#define IPCTSB 0x02 /* CTS line input b */ -#define IPCTSA 0x01 /* CTS line input a */ - -/* interrupt status and mask register: ISR status and IMR mask */ -#define IIPCHG 0x80 /* input port change */ -#define IBRKB 0x40 /* delta break b */ -#define IRXRDYB 0x20 /* receiver ready b */ -#define ITXRDYB 0x10 /* transmitter ready b */ -#define ITIMER 0x08 /* Enable timer interrupts. */ -#define IBRKA 0x04 /* delta break a */ -#define IRXRDYA 0x02 /* receiver ready a */ -#define ITXRDYA 0x01 /* transmitter ready a */ - -/* interrupts from port a or b */ -#define AINTPORT ( IRXRDYA | ITXRDYA ) -#define BINTPORT ( IRXRDYB | ITXRDYB ) - -/* HW write register index for ut_wr_regs[] */ -#define MR1A 0 /* mode register 1 a */ -#define CSRA 1 /* clock-select register a*/ -#define CRA 2 /* command register a */ -#define TBA 3 /* transmitter buffer a */ -#define ACR 4 /* auxiliary control register*/ -#define IMR 5 /* interrupt mask register */ -#define CTUR 6 /* counter/timer upper reg */ -#define CTLR 7 /* counter/timer lower reg */ -#define MR1B 8 /* mode register 1 b */ -#define CSRB 9 /* clock-select register b*/ -#define CRB 10 /* command register b */ -#define TBB 11 /* transmitter buffer b */ -#define IVR 12 /* interrupt vector register */ -#define OPCR 13 /* output port config reg */ -#define OPRSET 14 /* output port: bit set cmd */ -#define OPRRESET 15 /* output port: bit reset cmd */ -#define MR2A 16 /* mode register 2 a */ -#define MR2B 17 /* mode register 2 b */ -#define MAXREG 18 /* max count of registers */ - -/* - * MC68681 hardware registers. - */ - -#define DART_MR1A 0x00 /* RW: mode register A */ -#define DART_MR2A 0x00 /* RW: mode register A */ -#define DART_SRA 0x01 /* R: status register A */ -#define DART_CSRA 0x01 /* W: clock select register A */ -#define DART_CRA 0x02 /* W: command register A */ -#define DART_RBA 0x03 /* R: receiver buffer A */ -#define DART_TBA 0x03 /* W: transmit buffer A */ -#define DART_IPCR 0x04 /* R: input port change register */ -#define DART_ACR 0x04 /* W: auxiliary control register */ -#define DART_ISR 0x05 /* R: interrupt status register */ -#define DART_IMR 0x05 /* W: interrupt mask register */ -#define DART_CUR 0x06 /* R: count upper register */ -#define DART_CTUR 0x06 /* W: counter/timer upper register */ -#define DART_CLR 0x07 /* R: count lower register */ -#define DART_CTLR 0x07 /* W: counter/timer lower register */ -#define DART_MR1B 0x08 /* RW: mode register B */ -#define DART_MR2B 0x08 /* RW: mode register B */ -#define DART_SRB 0x09 /* R: status register B */ -#define DART_CSRB 0x09 /* W: clock select register B */ -#define DART_CRB 0x0a /* W: command register B */ -#define DART_RBB 0x0b /* R: receiver buffer B */ -#define DART_TBB 0x0b /* W: transmit buffer B */ -#define DART_IVR 0x0c /* RW: interrupt vector register */ -#define DART_IP 0x0d /* R: input port (unlatched) */ -#define DART_OPCR 0x0d /* W: output port configuration register */ -#define DART_CTSTART 0x0e /* R: start counter command */ -#define DART_OPRS 0x0e /* W: output port bit set */ -#define DART_CTSTOP 0x0f /* R: stop counter command */ -#define DART_OPRR 0x0f /* W: output port bit reset */ - -#define DART_A_BASE 0x00 -#define DART_B_BASE 0x08 |