diff options
author | marcel <marcel@FreeBSD.org> | 2006-07-26 17:17:23 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2006-07-26 17:17:23 +0000 |
commit | 2875d23aa565aa2493b0d9e67522c09befb7f3f4 (patch) | |
tree | a63740ce7d6ae5eeb36d5b3a4706e8db93f399d0 /sys | |
parent | 98879d5954171959172ad751ea8a8361bc15b06a (diff) | |
download | FreeBSD-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.c | 59 |
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); } |