aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/uart/uart_cpu_fdt.c
diff options
context:
space:
mode:
authorNathan Whitehorn <nwhitehorn@FreeBSD.org>2013-10-26 18:25:55 +0000
committerNathan Whitehorn <nwhitehorn@FreeBSD.org>2013-10-26 18:25:55 +0000
commitdce533f3905933a3a627f7fd6a49f2f5d3278174 (patch)
tree54bde12eb1d6ba55a77515efec4610529d3e2c44 /sys/dev/uart/uart_cpu_fdt.c
parent52a522a28364b06293922bea74d87d55487d9903 (diff)
Notes
Diffstat (limited to 'sys/dev/uart/uart_cpu_fdt.c')
-rw-r--r--sys/dev/uart/uart_cpu_fdt.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/sys/dev/uart/uart_cpu_fdt.c b/sys/dev/uart/uart_cpu_fdt.c
index 0fee5e5e326d5..57ad6ec637731 100644
--- a/sys/dev/uart/uart_cpu_fdt.c
+++ b/sys/dev/uart/uart_cpu_fdt.c
@@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
#include <sys/bus.h>
#include <sys/kernel.h>
#include <sys/module.h>
+#include <sys/systm.h>
#include <vm/vm.h>
#include <vm/pmap.h>
@@ -98,10 +99,25 @@ uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
return ((pmap_kextract(b1->bsh) == pmap_kextract(b2->bsh)) ? 1 : 0);
}
+static int
+phandle_chosen_propdev(phandle_t chosen, const char *name, phandle_t *node)
+{
+ char buf[64];
+
+ if (OF_getprop(chosen, name, buf, sizeof(buf)) <= 0)
+ return (ENXIO);
+ if ((*node = OF_finddevice(buf)) == -1)
+ return (ENXIO);
+
+ return (0);
+}
+
int
uart_cpu_getdev(int devtype, struct uart_devinfo *di)
{
- char buf[64];
+ const char *propnames[] = {"stdout-path", "linux,stdout-path", "stdout",
+ "stdin-path", "stdin", NULL};
+ const char **name;
struct uart_class *class;
phandle_t node, chosen;
pcell_t shift, br, rclk;
@@ -111,7 +127,7 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
uart_bus_space_mem = fdtbus_bs_tag;
uart_bus_space_io = NULL;
- /* Allow overriding the FDT uning the environment. */
+ /* Allow overriding the FDT using the environment. */
class = &uart_ns8250_class;
err = uart_getenv(devtype, di, class);
if (!err)
@@ -125,14 +141,11 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
*/
if ((chosen = OF_finddevice("/chosen")) == -1)
return (ENXIO);
- if (OF_getprop(chosen, "stdin", buf, sizeof(buf)) <= 0)
- return (ENXIO);
- if ((node = OF_finddevice(buf)) == -1)
- return (ENXIO);
- if (OF_getprop(chosen, "stdout", buf, sizeof(buf)) <= 0)
- return (ENXIO);
- if (OF_finddevice(buf) != node)
- /* Only stdin == stdout is supported. */
+ for (name = propnames; *name != NULL; name++) {
+ if (phandle_chosen_propdev(chosen, *name, &node) == 0)
+ break;
+ }
+ if (*name == NULL)
return (ENXIO);
/*
* Retrieve serial attributes.