summaryrefslogtreecommitdiff
path: root/sys/dev/uart/uart_cpu_sparc64.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/uart/uart_cpu_sparc64.c')
-rw-r--r--sys/dev/uart/uart_cpu_sparc64.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/sys/dev/uart/uart_cpu_sparc64.c b/sys/dev/uart/uart_cpu_sparc64.c
index df89a2e0789d..a56b0ad7b3c6 100644
--- a/sys/dev/uart/uart_cpu_sparc64.c
+++ b/sys/dev/uart/uart_cpu_sparc64.c
@@ -27,18 +27,28 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_isa.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <machine/bus.h>
#include <machine/bus_private.h>
+#include <machine/resource.h>
+#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/openfirm.h>
#include <machine/ofw_machdep.h>
+#include <isa/isavar.h>
+
#include <dev/uart/uart.h>
+#include <dev/uart/uart_bus.h>
#include <dev/uart/uart_cpu.h>
+#include <sparc64/pci/ofw_pci.h>
+#include <sparc64/isa/ofw_isa.h>
+
bus_space_tag_t uart_bus_space_io;
bus_space_tag_t uart_bus_space_mem;
@@ -240,3 +250,39 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
(par == 'o') ? UART_PARITY_ODD : UART_PARITY_EVEN;
return (0);
}
+
+void
+uart_cpu_identify(driver_t *driver, device_t parent)
+{
+#ifdef DEV_ISA
+ char buf[32];
+ struct isa_regs reg;
+ device_t child;
+ phandle_t node;
+ ofw_isa_intr_t intr;
+#endif
+
+#ifdef DEV_ISA
+ if (strcmp(device_get_name(parent), "isa") == 0) {
+ if ((node = ofw_bus_get_node(device_get_parent(parent))) == 0)
+ return;
+ for (node = OF_child(node); node != 0; node = OF_peer(node)) {
+ if (OF_getprop(node, "name", buf, sizeof(buf)) == -1)
+ continue;
+ if (strcmp(buf, "serial") != 0)
+ continue;
+ if ((OF_getprop(node, "reg", &reg,
+ sizeof(reg)) == -1) ||
+ (OF_getprop(node, "interrupts", &intr,
+ sizeof(intr)) == -1))
+ continue;
+ if ((child = BUS_ADD_CHILD(parent, ISA_ORDER_SENSITIVE,
+ uart_driver_name, -1)) == NULL)
+ return;
+ bus_set_resource(child, SYS_RES_IOPORT, 0,
+ ISA_REG_PHYS(&reg), reg.size);
+ bus_set_resource(child, SYS_RES_IRQ, 0, intr, 1);
+ }
+ }
+#endif
+}