1
0
mirror of https://github.com/openbsd/src.git synced 2026-04-22 05:05:03 +00:00

Bring back the PXA2X0 variant; it resurfaced in the SpacemiT K1 SoC.

Incorporate a fix inspired by NetBSD to keep the console enabled when
userland closes the device.
This commit is contained in:
kettenis
2026-04-06 10:27:53 +00:00
parent 15aed7f109
commit e7bf55dd66
3 changed files with 34 additions and 4 deletions

View File

@@ -1,4 +1,4 @@
/* $OpenBSD: com_fdt.c,v 1.9 2024/01/31 01:01:10 hastings Exp $ */
/* $OpenBSD: com_fdt.c,v 1.10 2026/04/06 10:27:53 kettenis Exp $ */
/*
* Copyright (c) 2016 Patrick Wildt <patrick@blueri.se>
*
@@ -54,6 +54,7 @@ com_fdt_init_cons(void)
void *node;
if ((node = fdt_find_cons("brcm,bcm2835-aux-uart")) == NULL &&
(node = fdt_find_cons("intel,xscale-uart")) == NULL &&
(node = fdt_find_cons("marvell,armada-38x-uart")) == NULL &&
(node = fdt_find_cons("mediatek,mt6577-uart")) == NULL &&
(node = fdt_find_cons("ns16550a")) == NULL &&
@@ -96,6 +97,7 @@ com_fdt_match(struct device *parent, void *match, void *aux)
struct fdt_attach_args *faa = aux;
return (OF_is_compatible(faa->fa_node, "brcm,bcm2835-aux-uart") ||
OF_is_compatible(faa->fa_node, "intel,xscale-uart") ||
OF_is_compatible(faa->fa_node, "marvell,armada-38x-uart") ||
OF_is_compatible(faa->fa_node, "mediatek,mt6577-uart") ||
OF_is_compatible(faa->fa_node, "ns16550a") ||
@@ -143,6 +145,9 @@ com_fdt_attach(struct device *parent, struct device *self, void *aux)
sc->sc_reg_width = OF_getpropint(faa->fa_node, "reg-io-width", width);
sc->sc_reg_shift = OF_getpropint(faa->fa_node, "reg-shift", shift);
if (OF_is_compatible(faa->fa_node, "intel,xscale-uart"))
sc->sc_uarttype = COM_UART_PXA2X0;
if (OF_is_compatible(faa->fa_node, "mediatek,mt6577-uart"))
sc->sc_uarttype = COM_UART_16550A;

View File

@@ -1,4 +1,4 @@
/* $OpenBSD: com.c,v 1.180 2025/09/16 12:18:10 hshoexer Exp $ */
/* $OpenBSD: com.c,v 1.181 2026/04/06 10:27:53 kettenis Exp $ */
/* $NetBSD: com.c,v 1.82.4.1 1996/06/02 09:08:00 mrg Exp $ */
/*
@@ -307,6 +307,9 @@ comopen(dev_t dev, int flag, int mode, struct proc *p)
case COM_UART_XR17V35X:
com_write_reg(sc, UART_EXAR_SLEEP, 0);
break;
case COM_UART_PXA2X0:
com_write_reg(sc, com_ier, IER_EUART);
break;
}
}
@@ -363,6 +366,8 @@ comopen(dev_t dev, int flag, int mode, struct proc *p)
SET(sc->sc_mcr, MCR_IENABLE);
com_write_reg(sc, com_mcr, sc->sc_mcr);
sc->sc_ier = IER_ERXRDY | IER_ERLS | IER_EMSC;
if (sc->sc_uarttype == COM_UART_PXA2X0)
sc->sc_ier |= IER_EUART | IER_ERXTOUT;
com_write_reg(sc, com_ier, sc->sc_ier);
sc->sc_msr = com_read_reg(sc, com_msr);
@@ -465,10 +470,14 @@ void
compwroff(struct com_softc *sc)
{
struct tty *tp = sc->sc_tty;
u_int8_t ier;
CLR(sc->sc_lcr, LCR_SBREAK);
com_write_reg(sc, com_lcr, sc->sc_lcr);
com_write_reg(sc, com_ier, 0);
ier = 0;
if (sc->sc_uarttype == COM_UART_PXA2X0)
ier |= IER_EUART;
com_write_reg(sc, com_ier, ier);
if (ISSET(tp->t_cflag, HUPCL) &&
!ISSET(sc->sc_swflags, COM_SW_SOFTCAR)) {
/* XXX perhaps only clear DTR */
@@ -502,6 +511,9 @@ compwroff(struct com_softc *sc)
case COM_UART_XR17V35X:
com_write_reg(sc, UART_EXAR_SLEEP, 0xff);
break;
case COM_UART_PXA2X0:
com_write_reg(sc, com_ier, 0);
break;
}
}
}
@@ -540,6 +552,9 @@ com_resume(struct com_softc *sc)
case COM_UART_XR17V35X:
com_write_reg(sc, UART_EXAR_SLEEP, 0);
break;
case COM_UART_PXA2X0:
com_write_reg(sc, com_ier, IER_EUART);
break;
}
}
@@ -1304,6 +1319,8 @@ com_attach_subr(struct com_softc *sc)
u_int32_t cpr;
sc->sc_ier = 0;
if (sc->sc_uarttype == COM_UART_PXA2X0)
sc->sc_ier |= IER_EUART;
/* disable interrupts */
com_write_reg(sc, com_ier, sc->sc_ier);
@@ -1502,6 +1519,11 @@ com_attach_subr(struct com_softc *sc)
sc->sc_fifolen = 1;
}
break;
case COM_UART_PXA2X0:
printf(": pxa2x0, 32 byte fifo\n");
SET(sc->sc_hwflags, COM_HW_FIFO);
sc->sc_fifolen = 32;
break;
default:
panic("comattach: bad fifo type");
}
@@ -1575,6 +1597,8 @@ com_fifo_probe(struct com_softc *sc)
return;
ier = 0;
if (sc->sc_uarttype == COM_UART_PXA2X0)
ier |= IER_EUART;
com_write_reg(sc, com_ier, ier);
com_write_reg(sc, com_lcr, LCR_DLAB);
com_write_reg(sc, com_dlbl, 3);

View File

@@ -1,4 +1,4 @@
/* $OpenBSD: comvar.h,v 1.61 2024/05/29 00:48:15 jsg Exp $ */
/* $OpenBSD: comvar.h,v 1.62 2026/04/06 10:27:53 kettenis Exp $ */
/* $NetBSD: comvar.h,v 1.5 1996/05/05 19:50:47 christos Exp $ */
/*
@@ -105,6 +105,7 @@ struct com_softc {
#define COM_UART_OX16C950 0x11 /* 128 byte fifo */
#define COM_UART_XR17V35X 0x12 /* 256 byte fifo */
#define COM_UART_DW_APB 0x13 /* configurable */
#define COM_UART_PXA2X0 0x14 /* 32 byte fifo */
u_char sc_hwflags;
#define COM_HW_NOIEN 0x01