summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2006-07-26 17:17:23 +0000
committermarcel <marcel@FreeBSD.org>2006-07-26 17:17:23 +0000
commit2875d23aa565aa2493b0d9e67522c09befb7f3f4 (patch)
treea63740ce7d6ae5eeb36d5b3a4706e8db93f399d0 /sys
parent98879d5954171959172ad751ea8a8361bc15b06a (diff)
downloadFreeBSD-src-2875d23aa565aa2493b0d9e67522c09befb7f3f4.zip
FreeBSD-src-2875d23aa565aa2493b0d9e67522c09befb7f3f4.tar.gz
Implement uart_cpu_eqres() and uart_cpu_getdev(). This allows
FreeBSD to use a serial console, as per the OFW settings.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/uart/uart_cpu_powerpc.c59
1 files changed, 56 insertions, 3 deletions
diff --git a/sys/dev/uart/uart_cpu_powerpc.c b/sys/dev/uart/uart_cpu_powerpc.c
index 1fb6a36..53f57dc 100644
--- a/sys/dev/uart/uart_cpu_powerpc.c
+++ b/sys/dev/uart/uart_cpu_powerpc.c
@@ -29,10 +29,12 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
-#include <sys/bus.h>
#include <machine/bus.h>
+#include <dev/ofw/openfirm.h>
+#include <machine/ofw_machdep.h>
+
#include <dev/uart/uart.h>
#include <dev/uart/uart_cpu.h>
@@ -43,12 +45,63 @@ int
uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
{
- return (0);
+ return ((b1->bsh == b2->bsh) ? 1 : 0);
}
int
uart_cpu_getdev(int devtype, struct uart_devinfo *di)
{
+ char buf[64];
+ phandle_t input, opts;
+ int error;
+
+ if ((opts = OF_finddevice("/options")) == -1)
+ return (ENXIO);
+ switch (devtype) {
+ case UART_DEV_CONSOLE:
+ if (OF_getprop(opts, "input-device", buf, sizeof(buf)) == -1)
+ return (ENXIO);
+ input = OF_finddevice(buf);
+ if (input == -1)
+ return (ENXIO);
+ if (OF_getprop(opts, "output-device", buf, sizeof(buf)) == -1)
+ return (ENXIO);
+ if (OF_finddevice(buf) != input)
+ return (ENXIO);
+ break;
+ case UART_DEV_DBGPORT:
+ if (!getenv_string("hw.uart.dbgport", buf, sizeof(buf)))
+ return (ENXIO);
+ input = OF_finddevice(buf);
+ if (input == -1)
+ return (ENXIO);
+ break;
+ default:
+ return (EINVAL);
+ }
+
+ if (OF_getprop(input, "device_type", buf, sizeof(buf)) == -1)
+ return (ENXIO);
+ if (strcmp(buf, "serial") != 0)
+ return (ENXIO);
+ if (OF_getprop(input, "name", buf, sizeof(buf)) == -1)
+ return (ENXIO);
+ if (strcmp(buf, "ch-a"))
+ return (ENXIO);
- return (ENXIO);
+ error = OF_decode_addr(input, 0, &di->bas.bst, &di->bas.bsh);
+ if (error)
+ return (error);
+
+ di->ops = uart_z8530_ops;
+
+ di->bas.rclk = 230400;
+ di->bas.chan = 1;
+ di->bas.regshft = 4;
+
+ di->baudrate = 0;
+ di->databits = 8;
+ di->stopbits = 1;
+ di->parity = UART_PARITY_NONE;
+ return (0);
}
OpenPOWER on IntegriCloud