summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/arm/xscale/pxa/uart_bus_pxa.c20
-rw-r--r--sys/conf/options.arm1
2 files changed, 19 insertions, 2 deletions
diff --git a/sys/arm/xscale/pxa/uart_bus_pxa.c b/sys/arm/xscale/pxa/uart_bus_pxa.c
index eab7883..c5df619 100644
--- a/sys/arm/xscale/pxa/uart_bus_pxa.c
+++ b/sys/arm/xscale/pxa/uart_bus_pxa.c
@@ -72,12 +72,28 @@ uart_pxa_probe(device_t dev)
bus_space_handle_t base;
struct uart_softc *sc;
- /* Check to see if the enable bit's on. */
base = (bus_space_handle_t)pxa_get_base(dev);
+#ifdef QEMU_WORKAROUNDS
+ /*
+ * QEMU really exposes only the first uart unless
+ * you specify several of them in the configuration.
+ * Otherwise all the rest of UARTs stay unconnected,
+ * which causes problems in the ns16550 attach routine.
+ * Unfortunately, even if you provide qemu with 4 uarts
+ * on the command line, it has a bug where it segfaults
+ * trying to enable bluetooth on the HWUART. So we just
+ * allow the FFUART to be attached.
+ * Also, don't check the UUE (UART Unit Enable) bit, as
+ * the gumstix bootloader doesn't set it.
+ */
+ if (base != PXA2X0_FFUART_BASE)
+ return (ENXIO);
+#else
+ /* Check to see if the enable bit's on. */
if ((bus_space_read_4(obio_tag, base,
(REG_IER << 2)) & PXA_UART_UUE) == 0)
return (ENXIO);
-
+#endif
sc = device_get_softc(dev);
sc->sc_class = &uart_ns8250_class;
diff --git a/sys/conf/options.arm b/sys/conf/options.arm
index 3f9df6b..bbe7f12 100644
--- a/sys/conf/options.arm
+++ b/sys/conf/options.arm
@@ -23,6 +23,7 @@ KERNPHYSADDR opt_global.h
KERNVIRTADDR opt_global.h
LOADERRAMADDR opt_global.h
PHYSADDR opt_global.h
+QEMU_WORKAROUNDS opt_global.h
SKYEYE_WORKAROUNDS opt_global.h
SOC_MV_DISCOVERY opt_global.h
SOC_MV_KIRKWOOD opt_global.h
OpenPOWER on IntegriCloud