Make all of the COM_xxx type options runtime selectable. Kernel configs
with the existing options (COM_16650, COM_16750, COM_AWIN, COM_HAYESP, and COM_PXA2X0) will select the correct type in com_attach_subr. New code should specify the com type by passing COM_TYPE_xxx to comcnattach and/or setting sc_type.
This commit is contained in:
parent
2247cb6b7f
commit
1d72c7e24d
230
sys/dev/ic/com.c
230
sys/dev/ic/com.c
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: com.c,v 1.343 2017/10/28 04:53:55 riastradh Exp $ */
|
||||
/* $NetBSD: com.c,v 1.344 2017/10/29 14:06:08 jmcneill Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1998, 1999, 2004, 2008 The NetBSD Foundation, Inc.
|
||||
|
@ -66,7 +66,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: com.c,v 1.343 2017/10/28 04:53:55 riastradh Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: com.c,v 1.344 2017/10/29 14:06:08 jmcneill Exp $");
|
||||
|
||||
#include "opt_com.h"
|
||||
#include "opt_ddb.h"
|
||||
|
@ -122,9 +122,7 @@ __KERNEL_RCSID(0, "$NetBSD: com.c,v 1.343 2017/10/28 04:53:55 riastradh Exp $");
|
|||
#include <dev/ic/comvar.h>
|
||||
#include <dev/ic/ns16550reg.h>
|
||||
#include <dev/ic/st16650reg.h>
|
||||
#ifdef COM_HAYESP
|
||||
#include <dev/ic/hayespreg.h>
|
||||
#endif
|
||||
#define com_lcr com_cfcr
|
||||
#include <dev/cons.h>
|
||||
|
||||
|
@ -252,20 +250,12 @@ void com_kgdb_putc(void *, int);
|
|||
|
||||
#ifdef COM_REGMAP
|
||||
/* initializer for typical 16550-ish hardware */
|
||||
#define COM_REG_16550 { \
|
||||
com_data, com_data, com_dlbl, com_dlbh, com_ier, com_iir, com_fifo, \
|
||||
com_efr, com_lcr, com_mcr, com_lsr, com_msr }
|
||||
/* 16750-specific register set, additional UART status register */
|
||||
#define COM_REG_16750 { \
|
||||
#define COM_REG_STD { \
|
||||
com_data, com_data, com_dlbl, com_dlbh, com_ier, com_iir, com_fifo, \
|
||||
com_efr, com_lcr, com_mcr, com_lsr, com_msr, 0, 0, 0, 0, 0, 0, 0, 0, \
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, com_usr }
|
||||
|
||||
#ifdef COM_16750
|
||||
const bus_size_t com_std_map[32] = COM_REG_16750;
|
||||
#else
|
||||
const bus_size_t com_std_map[16] = COM_REG_16550;
|
||||
#endif /* COM_16750 */
|
||||
const bus_size_t com_std_map[32] = COM_REG_STD;
|
||||
#endif /* COM_REGMAP */
|
||||
|
||||
#define COMDIALOUT_MASK TTDIALOUT_MASK
|
||||
|
@ -393,9 +383,7 @@ com_attach_subr(struct com_softc *sc)
|
|||
{
|
||||
struct com_regs *regsp = &sc->sc_regs;
|
||||
struct tty *tp;
|
||||
#if defined(COM_16650) || defined(COM_16750)
|
||||
u_int8_t lcr;
|
||||
#endif
|
||||
const char *fifo_msg = NULL;
|
||||
prop_dictionary_t dict;
|
||||
bool is_console = true;
|
||||
|
@ -407,6 +395,18 @@ com_attach_subr(struct com_softc *sc)
|
|||
callout_init(&sc->sc_diag_callout, 0);
|
||||
mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_HIGH);
|
||||
|
||||
#if defined(COM_16650)
|
||||
sc->sc_type = COM_TYPE_16650;
|
||||
#elif defined(COM_16750)
|
||||
sc->sc_type = COM_TYPE_16750;
|
||||
#elif defined(COM_AWIN)
|
||||
sc->sc_type = COM_TYPE_SUNXI;
|
||||
#elif defined(COM_HAYESP)
|
||||
sc->sc_type = COM_TYPE_HAYESP;
|
||||
#elif defined(COM_PXA2X0)
|
||||
sc->sc_type = COM_TYPE_PXA2x0;
|
||||
#endif
|
||||
|
||||
/* Disable interrupts before configuring the device. */
|
||||
if (sc->sc_type == COM_TYPE_PXA2x0)
|
||||
sc->sc_ier = IER_EUART;
|
||||
|
@ -424,10 +424,13 @@ com_attach_subr(struct com_softc *sc)
|
|||
(u_long)comcons_info.regs.cr_iobase);
|
||||
}
|
||||
|
||||
#if defined(COM_16750) || defined(COM_AWIN)
|
||||
/* Use in comintr(). */
|
||||
sc->sc_lcr = cflag2lcr(comcons_info.cflag);
|
||||
#endif
|
||||
switch (sc->sc_type) {
|
||||
case COM_TYPE_16750:
|
||||
case COM_TYPE_SUNXI:
|
||||
/* Use in comintr(). */
|
||||
sc->sc_lcr = cflag2lcr(comcons_info.cflag);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Make sure the console is always "hardwired". */
|
||||
delay(10000); /* wait for output to finish */
|
||||
|
@ -501,7 +504,8 @@ com_attach_subr(struct com_softc *sc)
|
|||
== FIFO_TRIGGER_14) {
|
||||
SET(sc->sc_hwflags, COM_HW_FIFO);
|
||||
|
||||
#ifdef COM_16650
|
||||
fifo_msg = "ns16550a, working fifo";
|
||||
|
||||
/*
|
||||
* IIR changes into the EFR if LCR is set to LCR_EERS
|
||||
* on 16650s. We also know IIR != 0 at this point.
|
||||
|
@ -513,23 +517,32 @@ com_attach_subr(struct com_softc *sc)
|
|||
* setting DLAB enable gives access to the EFR on
|
||||
* these chips.
|
||||
*/
|
||||
lcr = CSR_READ_1(regsp, COM_REG_LCR);
|
||||
CSR_WRITE_1(regsp, COM_REG_LCR, LCR_EERS);
|
||||
CSR_WRITE_1(regsp, COM_REG_EFR, 0);
|
||||
if (CSR_READ_1(regsp, COM_REG_EFR) == 0) {
|
||||
CSR_WRITE_1(regsp, COM_REG_LCR, lcr | LCR_DLAB);
|
||||
if (sc->sc_type == COM_TYPE_16650) {
|
||||
lcr = CSR_READ_1(regsp, COM_REG_LCR);
|
||||
CSR_WRITE_1(regsp, COM_REG_LCR, LCR_EERS);
|
||||
CSR_WRITE_1(regsp, COM_REG_EFR, 0);
|
||||
if (CSR_READ_1(regsp, COM_REG_EFR) == 0) {
|
||||
CLR(sc->sc_hwflags, COM_HW_FIFO);
|
||||
sc->sc_fifolen = 0;
|
||||
} else {
|
||||
SET(sc->sc_hwflags, COM_HW_FLOW);
|
||||
sc->sc_fifolen = 32;
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
sc->sc_fifolen = 16;
|
||||
CSR_WRITE_1(regsp, COM_REG_LCR,
|
||||
lcr | LCR_DLAB);
|
||||
if (CSR_READ_1(regsp, COM_REG_EFR) == 0) {
|
||||
CLR(sc->sc_hwflags, COM_HW_FIFO);
|
||||
sc->sc_fifolen = 0;
|
||||
} else {
|
||||
SET(sc->sc_hwflags, COM_HW_FLOW);
|
||||
sc->sc_fifolen = 32;
|
||||
}
|
||||
} else
|
||||
sc->sc_fifolen = 16;
|
||||
|
||||
CSR_WRITE_1(regsp, COM_REG_LCR, lcr);
|
||||
if (sc->sc_fifolen == 0)
|
||||
fifo_msg = "st16650, broken fifo";
|
||||
else if (sc->sc_fifolen == 32)
|
||||
fifo_msg = "st16650a, working fifo";
|
||||
else
|
||||
fifo_msg = "ns16550a, working fifo";
|
||||
}
|
||||
|
||||
#ifdef COM_16750
|
||||
/*
|
||||
* TL16C750 can enable 64byte FIFO, only when DLAB
|
||||
* is 1. However, some 16750 may always enable. For
|
||||
|
@ -539,54 +552,43 @@ com_attach_subr(struct com_softc *sc)
|
|||
* use SC16C750. Probably 32 bytes of FIFO and HW FLOW
|
||||
* should become effective.
|
||||
*/
|
||||
uint8_t iir1, iir2;
|
||||
uint8_t fcr = FIFO_ENABLE | FIFO_TRIGGER_14;
|
||||
if (sc->sc_type == COM_TYPE_16750) {
|
||||
uint8_t iir1, iir2;
|
||||
uint8_t fcr = FIFO_ENABLE | FIFO_TRIGGER_14;
|
||||
|
||||
if (sc->sc_type == COM_TYPE_INGENIC)
|
||||
fcr |= FIFO_UART_ON;
|
||||
|
||||
lcr = CSR_READ_1(regsp, COM_REG_LCR);
|
||||
CSR_WRITE_1(regsp, COM_REG_LCR, lcr & ~LCR_DLAB);
|
||||
CSR_WRITE_1(regsp, COM_REG_FIFO, fcr | FIFO_64B_ENABLE);
|
||||
iir1 = CSR_READ_1(regsp, COM_REG_IIR);
|
||||
CSR_WRITE_1(regsp, COM_REG_FIFO, fcr);
|
||||
CSR_WRITE_1(regsp, COM_REG_LCR, lcr | LCR_DLAB);
|
||||
CSR_WRITE_1(regsp, COM_REG_FIFO, fcr | FIFO_64B_ENABLE);
|
||||
iir2 = CSR_READ_1(regsp, COM_REG_IIR);
|
||||
|
||||
CSR_WRITE_1(regsp, COM_REG_LCR, lcr);
|
||||
|
||||
if (!ISSET(iir1, IIR_64B_FIFO) &&
|
||||
ISSET(iir2, IIR_64B_FIFO)) {
|
||||
/* It is TL16C750. */
|
||||
sc->sc_fifolen = 64;
|
||||
SET(sc->sc_hwflags, COM_HW_AFE);
|
||||
} else
|
||||
lcr = CSR_READ_1(regsp, COM_REG_LCR);
|
||||
CSR_WRITE_1(regsp, COM_REG_LCR,
|
||||
lcr & ~LCR_DLAB);
|
||||
CSR_WRITE_1(regsp, COM_REG_FIFO,
|
||||
fcr | FIFO_64B_ENABLE);
|
||||
iir1 = CSR_READ_1(regsp, COM_REG_IIR);
|
||||
CSR_WRITE_1(regsp, COM_REG_FIFO, fcr);
|
||||
#endif
|
||||
CSR_WRITE_1(regsp, COM_REG_LCR, lcr | LCR_DLAB);
|
||||
CSR_WRITE_1(regsp, COM_REG_FIFO,
|
||||
fcr | FIFO_64B_ENABLE);
|
||||
iir2 = CSR_READ_1(regsp, COM_REG_IIR);
|
||||
|
||||
#ifdef COM_16650
|
||||
CSR_WRITE_1(regsp, COM_REG_LCR, lcr);
|
||||
if (sc->sc_fifolen == 0)
|
||||
fifo_msg = "st16650, broken fifo";
|
||||
else if (sc->sc_fifolen == 32)
|
||||
fifo_msg = "st16650a, working fifo";
|
||||
else
|
||||
#endif
|
||||
#ifdef COM_16750
|
||||
if (sc->sc_fifolen == 64)
|
||||
fifo_msg = "tl16c750, working fifo";
|
||||
else
|
||||
#endif
|
||||
fifo_msg = "ns16550a, working fifo";
|
||||
CSR_WRITE_1(regsp, COM_REG_LCR, lcr);
|
||||
|
||||
if (!ISSET(iir1, IIR_64B_FIFO) &&
|
||||
ISSET(iir2, IIR_64B_FIFO)) {
|
||||
/* It is TL16C750. */
|
||||
sc->sc_fifolen = 64;
|
||||
SET(sc->sc_hwflags, COM_HW_AFE);
|
||||
} else
|
||||
CSR_WRITE_1(regsp, COM_REG_FIFO, fcr);
|
||||
|
||||
if (sc->sc_fifolen == 64)
|
||||
fifo_msg = "tl16c750, working fifo";
|
||||
else
|
||||
fifo_msg = "ns16750, working fifo";
|
||||
}
|
||||
} else
|
||||
fifo_msg = "ns16550, broken fifo";
|
||||
else
|
||||
fifo_msg = "ns8250 or ns16450, no fifo";
|
||||
if (sc->sc_type == COM_TYPE_INGENIC) {
|
||||
CSR_WRITE_1(regsp, COM_REG_FIFO, FIFO_UART_ON);
|
||||
} else
|
||||
CSR_WRITE_1(regsp, COM_REG_FIFO, 0);
|
||||
CSR_WRITE_1(regsp, COM_REG_FIFO, 0);
|
||||
|
||||
fifodelay:
|
||||
/*
|
||||
* Some chips will clear down both Tx and Rx FIFOs when zero is
|
||||
|
@ -685,7 +687,6 @@ com_config(struct com_softc *sc)
|
|||
CSR_WRITE_1(regsp, COM_REG_IER, sc->sc_ier);
|
||||
(void) CSR_READ_1(regsp, COM_REG_IIR);
|
||||
|
||||
#ifdef COM_HAYESP
|
||||
/* Look for a Hayes ESP board. */
|
||||
if (sc->sc_type == COM_TYPE_HAYESP) {
|
||||
|
||||
|
@ -716,7 +717,6 @@ com_config(struct com_softc *sc)
|
|||
bus_space_write_1(regsp->cr_iot, sc->sc_hayespioh, HAYESP_CMD2,
|
||||
HAYESP_LOBYTE(HAYESP_RXLOWMARK));
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ISSET(sc->sc_hwflags, COM_HW_CONSOLE|COM_HW_KGDB))
|
||||
com_enable_debugport(sc);
|
||||
|
@ -1360,7 +1360,6 @@ comparam(struct tty *tp, struct termios *t)
|
|||
if (COM_ISALIVE(sc) == 0)
|
||||
return (EIO);
|
||||
|
||||
#ifdef COM_HAYESP
|
||||
if (sc->sc_type == COM_TYPE_HAYESP) {
|
||||
int prescaler, speed;
|
||||
|
||||
|
@ -1378,8 +1377,7 @@ comparam(struct tty *tp, struct termios *t)
|
|||
return (EINVAL);
|
||||
sc->sc_prescaler = prescaler;
|
||||
} else
|
||||
#endif
|
||||
ospeed = comspeed(t->c_ospeed, sc->sc_frequency, sc->sc_type);
|
||||
ospeed = comspeed(t->c_ospeed, sc->sc_frequency, sc->sc_type);
|
||||
|
||||
/* Check requested parameters. */
|
||||
if (ospeed < 0)
|
||||
|
@ -1565,6 +1563,7 @@ void
|
|||
com_iflush(struct com_softc *sc)
|
||||
{
|
||||
struct com_regs *regsp = &sc->sc_regs;
|
||||
uint8_t fifo;
|
||||
#ifdef DIAGNOSTIC
|
||||
int reg;
|
||||
#endif
|
||||
|
@ -1588,19 +1587,21 @@ com_iflush(struct com_softc *sc)
|
|||
aprint_error_dev(sc->sc_dev, "com_iflush timeout %02x\n", reg);
|
||||
#endif
|
||||
|
||||
#if defined(COM_16750) || defined(COM_AWIN)
|
||||
uint8_t fifo;
|
||||
/*
|
||||
* Reset all Rx/Tx FIFO, preserve current FIFO length.
|
||||
* This should prevent triggering busy interrupt while
|
||||
* manipulating divisors.
|
||||
*/
|
||||
fifo = CSR_READ_1(regsp, COM_REG_FIFO) & (FIFO_TRIGGER_1 |
|
||||
FIFO_TRIGGER_4 | FIFO_TRIGGER_8 | FIFO_TRIGGER_14);
|
||||
CSR_WRITE_1(regsp, COM_REG_FIFO, fifo | FIFO_ENABLE | FIFO_RCV_RST |
|
||||
FIFO_XMT_RST);
|
||||
delay(100);
|
||||
#endif
|
||||
switch (sc->sc_type) {
|
||||
case COM_TYPE_16750:
|
||||
case COM_TYPE_SUNXI:
|
||||
/*
|
||||
* Reset all Rx/Tx FIFO, preserve current FIFO length.
|
||||
* This should prevent triggering busy interrupt while
|
||||
* manipulating divisors.
|
||||
*/
|
||||
fifo = CSR_READ_1(regsp, COM_REG_FIFO) & (FIFO_TRIGGER_1 |
|
||||
FIFO_TRIGGER_4 | FIFO_TRIGGER_8 | FIFO_TRIGGER_14);
|
||||
CSR_WRITE_1(regsp, COM_REG_FIFO,
|
||||
fifo | FIFO_ENABLE | FIFO_RCV_RST | FIFO_XMT_RST);
|
||||
delay(100);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1640,14 +1641,12 @@ com_loadchannelregs(struct com_softc *sc)
|
|||
CSR_WRITE_1(regsp, COM_REG_LCR, sc->sc_lcr);
|
||||
CSR_WRITE_1(regsp, COM_REG_MCR, sc->sc_mcr_active = sc->sc_mcr);
|
||||
CSR_WRITE_1(regsp, COM_REG_FIFO, sc->sc_fifo);
|
||||
#ifdef COM_HAYESP
|
||||
if (sc->sc_type == COM_TYPE_HAYESP) {
|
||||
bus_space_write_1(regsp->cr_iot, sc->sc_hayespioh, HAYESP_CMD1,
|
||||
HAYESP_SETPRESCALER);
|
||||
bus_space_write_1(regsp->cr_iot, sc->sc_hayespioh, HAYESP_CMD2,
|
||||
sc->sc_prescaler);
|
||||
}
|
||||
#endif
|
||||
if (sc->sc_type == COM_TYPE_OMAP) {
|
||||
/* setup the fifos. the FCR value is not used as long
|
||||
as SCR[6] and SCR[7] are 0, which they are at reset
|
||||
|
@ -1922,10 +1921,8 @@ com_rxsoft(struct com_softc *sc, struct tty *tp)
|
|||
if (ISSET(sc->sc_rx_flags, RX_IBUF_OVERFLOWED)) {
|
||||
CLR(sc->sc_rx_flags, RX_IBUF_OVERFLOWED);
|
||||
SET(sc->sc_ier, IER_ERXRDY);
|
||||
#ifdef COM_PXA2X0
|
||||
if (sc->sc_type == COM_TYPE_PXA2x0)
|
||||
SET(sc->sc_ier, IER_ERXTOUT);
|
||||
#endif
|
||||
if (sc->sc_type == COM_TYPE_INGENIC ||
|
||||
sc->sc_type == COM_TYPE_TEGRA)
|
||||
SET(sc->sc_ier, IER_ERXTOUT);
|
||||
|
@ -2034,13 +2031,9 @@ comintr(void *arg)
|
|||
iir = CSR_READ_1(regsp, COM_REG_IIR);
|
||||
|
||||
/* Handle ns16750-specific busy interrupt. */
|
||||
#ifdef COM_16750
|
||||
#ifdef COM_AWIN
|
||||
#error "COM_16750 and COM_AWIN are exclusive"
|
||||
#endif
|
||||
int timeout;
|
||||
if ((iir & IIR_BUSY) == IIR_BUSY) {
|
||||
for (timeout = 10000;
|
||||
if (sc->sc_type == COM_TYPE_16750 &&
|
||||
(iir & IIR_BUSY) == IIR_BUSY) {
|
||||
for (int timeout = 10000;
|
||||
(CSR_READ_1(regsp, COM_REG_USR) & 0x1) != 0; timeout--)
|
||||
if (timeout <= 0) {
|
||||
aprint_error_dev(sc->sc_dev,
|
||||
|
@ -2053,10 +2046,10 @@ comintr(void *arg)
|
|||
CSR_WRITE_1(regsp, COM_REG_LCR, sc->sc_lcr);
|
||||
iir = CSR_READ_1(regsp, COM_REG_IIR);
|
||||
}
|
||||
#endif /* COM_16750 */
|
||||
#ifdef COM_AWIN
|
||||
|
||||
/* Allwinner BUSY interrupt */
|
||||
if ((iir & IIR_BUSY) == IIR_BUSY) {
|
||||
if (sc->sc_type == COM_TYPE_SUNXI &&
|
||||
(iir & IIR_BUSY) == IIR_BUSY) {
|
||||
if ((CSR_READ_1(regsp, COM_REG_USR) & 0x1) != 0) {
|
||||
CSR_WRITE_1(regsp, COM_REG_HALT, HALT_CHCFG_EN);
|
||||
CSR_WRITE_1(regsp, COM_REG_LCR, sc->sc_lcr | LCR_DLAB);
|
||||
|
@ -2086,7 +2079,6 @@ comintr(void *arg)
|
|||
CSR_WRITE_1(regsp, COM_REG_LCR, sc->sc_lcr);
|
||||
}
|
||||
}
|
||||
#endif /* COM_AWIN */
|
||||
|
||||
if (ISSET(iir, IIR_NOPEND)) {
|
||||
mutex_spin_exit(&sc->sc_lock);
|
||||
|
@ -2166,17 +2158,19 @@ again: do {
|
|||
*/
|
||||
if (!cc) {
|
||||
SET(sc->sc_rx_flags, RX_IBUF_OVERFLOWED);
|
||||
#ifdef COM_PXA2X0
|
||||
if (sc->sc_type == COM_TYPE_PXA2x0)
|
||||
switch (sc->sc_type) {
|
||||
case COM_TYPE_PXA2x0:
|
||||
CLR(sc->sc_ier, IER_ERXRDY|IER_ERXTOUT);
|
||||
else
|
||||
#endif
|
||||
if (sc->sc_type == COM_TYPE_INGENIC ||
|
||||
sc->sc_type == COM_TYPE_TEGRA)
|
||||
break;
|
||||
case COM_TYPE_INGENIC:
|
||||
case COM_TYPE_TEGRA:
|
||||
CLR(sc->sc_ier,
|
||||
IER_ERXRDY | IER_ERXTOUT);
|
||||
else
|
||||
break;
|
||||
default:
|
||||
CLR(sc->sc_ier, IER_ERXRDY);
|
||||
break;
|
||||
}
|
||||
CSR_WRITE_1(regsp, COM_REG_IER, sc->sc_ier);
|
||||
}
|
||||
} else {
|
||||
|
@ -2444,11 +2438,9 @@ cominit(struct com_regs *regsp, int rate, int frequency, int type,
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef COM_PXA2X0
|
||||
if (type == COM_TYPE_PXA2x0)
|
||||
CSR_WRITE_1(regsp, COM_REG_IER, IER_EUART);
|
||||
else
|
||||
#endif
|
||||
CSR_WRITE_1(regsp, COM_REG_IER, 0);
|
||||
|
||||
return (0);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: comreg.h,v 1.25 2016/05/27 20:01:49 bouyer Exp $ */
|
||||
/* $NetBSD: comreg.h,v 1.26 2017/10/29 14:06:08 jmcneill Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1991 The Regents of the University of California.
|
||||
|
@ -64,9 +64,7 @@
|
|||
#define IIR_NOPEND 0x1 /* No pending interrupts */
|
||||
#define IIR_64B_FIFO 0x20 /* 64byte FIFO Enabled (16750) */
|
||||
#define IIR_FIFO_MASK 0xc0 /* set if FIFOs are enabled */
|
||||
#if defined(COM_16750) || defined(COM_AWIN)
|
||||
#define IIR_BUSY 0x7 /* Busy indicator */
|
||||
#endif
|
||||
#define IIR_BUSY 0x7 /* Busy indicator (16750/SUNXI) */
|
||||
|
||||
/* fifo control register */
|
||||
#define FIFO_ENABLE 0x01 /* Turn the FIFO on */
|
||||
|
@ -160,11 +158,9 @@
|
|||
#define MDR1_MODE_UART_16X 0x00
|
||||
#define MDR1_MODE_MASK 0x07
|
||||
|
||||
#ifdef COM_AWIN
|
||||
/* AWIN-specific registers */
|
||||
/* SUNXI-specific registers */
|
||||
#define HALT_CHCFG_UD 0x04 /* apply updates to LCR/dividors */
|
||||
#define HALT_CHCFG_EN 0x02 /* enable change while busy */
|
||||
#endif
|
||||
|
||||
|
||||
/* XXX ISA-specific. */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: comvar.h,v 1.83 2017/07/31 09:25:14 jmcneill Exp $ */
|
||||
/* $NetBSD: comvar.h,v 1.84 2017/10/29 14:06:08 jmcneill Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
|
||||
|
@ -91,33 +91,20 @@ int com_is_console(bus_space_tag_t, bus_addr_t, bus_space_handle_t *);
|
|||
#define COM_REG_MCR 9
|
||||
#define COM_REG_LSR 10
|
||||
#define COM_REG_MSR 11
|
||||
#ifdef COM_16750
|
||||
#define COM_REG_USR 31
|
||||
#endif
|
||||
#ifdef COM_AWIN
|
||||
#define COM_REG_USR 31
|
||||
#define COM_REG_TFL 32
|
||||
#define COM_REG_RFL 33
|
||||
#define COM_REG_HALT 41
|
||||
#endif
|
||||
#define COM_REG_USR 31 /* 16750/SUNXI */
|
||||
#define COM_REG_TFL 32 /* SUNXI */
|
||||
#define COM_REG_RFL 33 /* SUNXI */
|
||||
#define COM_REG_HALT 41 /* SUNXI */
|
||||
|
||||
struct com_regs {
|
||||
bus_space_tag_t cr_iot;
|
||||
bus_space_handle_t cr_ioh;
|
||||
bus_addr_t cr_iobase;
|
||||
bus_size_t cr_nports;
|
||||
#ifdef COM_16750
|
||||
bus_size_t cr_map[32];
|
||||
#else
|
||||
bus_size_t cr_map[16];
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef COM_16750
|
||||
extern const bus_size_t com_std_map[32];
|
||||
#else
|
||||
extern const bus_size_t com_std_map[16];
|
||||
#endif
|
||||
|
||||
#define COM_INIT_REGS(regs, tag, hdl, addr) \
|
||||
do { \
|
||||
|
@ -144,15 +131,10 @@ extern const bus_size_t com_std_map[16];
|
|||
#define COM_REG_TCR com_msr
|
||||
#define COM_REG_TLR com_scratch
|
||||
#define COM_REG_MDR1 8
|
||||
#ifdef COM_16750
|
||||
#define COM_REG_USR com_usr
|
||||
#endif
|
||||
#ifdef COM_AWIN
|
||||
#define COM_REG_USR com_usr
|
||||
#define COM_REG_TFL com_tfl
|
||||
#define COM_REG_RFL com_rfl
|
||||
#define COM_REG_HALT com_halt
|
||||
#endif
|
||||
#define COM_REG_USR com_usr /* 16750/SUNXI */
|
||||
#define COM_REG_TFL com_tfl /* SUNXI */
|
||||
#define COM_REG_RFL com_rfl /* SUNXI */
|
||||
#define COM_REG_HALT com_halt /* SUNXI */
|
||||
|
||||
struct com_regs {
|
||||
bus_space_tag_t cr_iot;
|
||||
|
@ -229,9 +211,7 @@ struct com_softc {
|
|||
sc_mcr_active, sc_lcr, sc_ier, sc_fifo, sc_dlbl, sc_dlbh, sc_efr;
|
||||
u_char sc_mcr_dtr, sc_mcr_rts, sc_msr_cts, sc_msr_dcd;
|
||||
|
||||
#ifdef COM_HAYESP
|
||||
u_char sc_prescaler;
|
||||
#endif
|
||||
u_char sc_prescaler; /* for COM_TYPE_HAYESP */
|
||||
|
||||
/*
|
||||
* There are a great many almost-ns16550-compatible UARTs out
|
||||
|
@ -248,6 +228,9 @@ struct com_softc {
|
|||
#define COM_TYPE_INGENIC 6 /* JZ4780 built-in */
|
||||
#define COM_TYPE_TEGRA 7 /* NVIDIA Tegra built-in */
|
||||
#define COM_TYPE_BCMAUXUART 8 /* BCM2835 AUX UART */
|
||||
#define COM_TYPE_16650 9
|
||||
#define COM_TYPE_16750 10
|
||||
#define COM_TYPE_SUNXI 11 /* Allwinner built-in */
|
||||
|
||||
/* power management hooks */
|
||||
int (*enable)(struct com_softc *);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: ns16550reg.h,v 1.11 2016/05/27 20:01:49 bouyer Exp $ */
|
||||
/* $NetBSD: ns16550reg.h,v 1.12 2017/10/29 14:06:08 jmcneill Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1991 The Regents of the University of California.
|
||||
|
@ -51,12 +51,11 @@
|
|||
/*
|
||||
* Additional register present in NS16750
|
||||
*/
|
||||
#ifdef COM_16750
|
||||
#define com_usr 31 /* status register (R) */
|
||||
#endif
|
||||
#ifdef COM_AWIN
|
||||
#define com_usr 31 /* status register (R) */
|
||||
#define com_tfl 32 /* transmit fifo level (R) */
|
||||
#define com_rfl 33 /* receive fifo level (R) */
|
||||
#define com_halt 41 /* halt tx (R/W) */
|
||||
#endif
|
||||
#define com_usr 31 /* status register (R) (16750/SUNXI) */
|
||||
|
||||
/*
|
||||
* Additional registers present on Allwinner hardware
|
||||
*/
|
||||
#define com_tfl 32 /* transmit fifo level (R) (SUNXI) */
|
||||
#define com_rfl 33 /* receive fifo level (R) (SUNXI) */
|
||||
#define com_halt 41 /* halt tx (R/W) (SUNXI) */
|
||||
|
|
Loading…
Reference in New Issue