svn commit: r230315 - in projects/armv6/sys/dev: fdt uart
Olivier Houchard
cognet at FreeBSD.org
Wed Jan 18 19:55:51 UTC 2012
Author: cognet
Date: Wed Jan 18 19:55:51 2012
New Revision: 230315
URL: http://svn.freebsd.org/changeset/base/230315
Log:
Add a function to get the PA from range, instead of (ab)using fdt_immr_pa,
and use it for the UART driver
Submitted by: dmarion
Modified:
projects/armv6/sys/dev/fdt/fdt_common.c
projects/armv6/sys/dev/fdt/fdt_common.h
projects/armv6/sys/dev/uart/uart_bus_fdt.c
Modified: projects/armv6/sys/dev/fdt/fdt_common.c
==============================================================================
--- projects/armv6/sys/dev/fdt/fdt_common.c Wed Jan 18 19:54:32 2012 (r230314)
+++ projects/armv6/sys/dev/fdt/fdt_common.c Wed Jan 18 19:55:51 2012 (r230315)
@@ -63,30 +63,12 @@ vm_offset_t fdt_immr_va;
vm_offset_t fdt_immr_size;
int
-fdt_immr_addr(vm_offset_t immr_va)
+fdt_get_range(phandle_t node, int range_id, u_long *base, u_long *size)
{
pcell_t ranges[6], *rangesptr;
- phandle_t node;
- u_long base, size;
pcell_t addr_cells, size_cells, par_addr_cells;
int len, tuple_size, tuples;
- /*
- * Try to access the SOC node directly i.e. through /aliases/.
- */
- if ((node = OF_finddevice("soc")) != 0)
- if (fdt_is_compatible_strict(node, "simple-bus"))
- goto moveon;
- /*
- * Find the node the long way.
- */
- if ((node = OF_finddevice("/")) == 0)
- return (ENXIO);
-
- if ((node = fdt_find_compatible(node, "simple-bus", 1)) == 0)
- return (ENXIO);
-
-moveon:
if ((fdt_addrsize_cells(node, &addr_cells, &size_cells)) != 0)
return (ENXIO);
/*
@@ -100,6 +82,9 @@ moveon:
if (len > sizeof(ranges))
return (ENOMEM);
+ if (!(range_id < len))
+ return (ERANGE);
+
if (OF_getprop(node, "ranges", ranges, sizeof(ranges)) <= 0)
return (EINVAL);
@@ -111,21 +96,48 @@ moveon:
addr_cells, size_cells)) {
return (ERANGE);
}
- base = 0;
- size = 0;
- rangesptr = &ranges[0];
+ *base = 0;
+ *size = 0;
+ rangesptr = &ranges[range_id];
- base = fdt_data_get((void *)rangesptr, addr_cells);
+ *base = fdt_data_get((void *)rangesptr, addr_cells);
rangesptr += addr_cells;
- base += fdt_data_get((void *)rangesptr, par_addr_cells);
+ *base += fdt_data_get((void *)rangesptr, par_addr_cells);
rangesptr += par_addr_cells;
- size = fdt_data_get((void *)rangesptr, size_cells);
+ *size = fdt_data_get((void *)rangesptr, size_cells);
+ return (0);
+}
- fdt_immr_pa = base;
- fdt_immr_va = immr_va;
- fdt_immr_size = size;
+int
+fdt_immr_addr(vm_offset_t immr_va)
+{
+ phandle_t node;
+ u_long base, size;
+ int r;
- return (0);
+ /*
+ * Try to access the SOC node directly i.e. through /aliases/.
+ */
+ if ((node = OF_finddevice("soc")) != 0)
+ if (fdt_is_compatible_strict(node, "simple-bus"))
+ goto moveon;
+ /*
+ * Find the node the long way.
+ */
+ if ((node = OF_finddevice("/")) == 0)
+ return (ENXIO);
+
+ if ((node = fdt_find_compatible(node, "simple-bus", 1)) == 0)
+ return (ENXIO);
+
+moveon:
+ if ((r = fdt_get_range(node, 0, &base, &size)) == 0) {
+ fdt_immr_pa = base;
+ fdt_immr_va = immr_va;
+ fdt_immr_size = size;
+ }
+
+ return (r);
}
/*
Modified: projects/armv6/sys/dev/fdt/fdt_common.h
==============================================================================
--- projects/armv6/sys/dev/fdt/fdt_common.h Wed Jan 18 19:54:32 2012 (r230314)
+++ projects/armv6/sys/dev/fdt/fdt_common.h Wed Jan 18 19:55:51 2012 (r230315)
@@ -90,6 +90,7 @@ int fdt_data_verify(void *, int);
phandle_t fdt_find_compatible(phandle_t, const char *, int);
int fdt_get_mem_regions(struct mem_region *, int *, uint32_t *);
int fdt_get_phyaddr(phandle_t node, int *);
+int fdt_get_range(phandle_t, int, u_long *, u_long *);
int fdt_immr_addr(vm_offset_t);
int fdt_regsize(phandle_t, u_long *, u_long *);
int fdt_intr_decode(phandle_t, pcell_t *, int *, int *, int *);
Modified: projects/armv6/sys/dev/uart/uart_bus_fdt.c
==============================================================================
--- projects/armv6/sys/dev/uart/uart_bus_fdt.c Wed Jan 18 19:54:32 2012 (r230314)
+++ projects/armv6/sys/dev/uart/uart_bus_fdt.c Wed Jan 18 19:55:51 2012 (r230315)
@@ -137,7 +137,7 @@ uart_cpu_getdev(int devtype, struct uart
struct uart_class *class;
phandle_t node, chosen;
pcell_t shift, br, rclk;
- u_long start, size;
+ u_long start, size, pbase, psize;
int err;
uart_bus_space_mem = fdtbus_bs_tag;
@@ -198,7 +198,9 @@ uart_cpu_getdev(int devtype, struct uart
err = fdt_regsize(node, &start, &size);
if (err)
return (ENXIO);
- start += fdt_immr_pa;
+
+ fdt_get_range(OF_parent(node), 0, &pbase, &psize);
+ start += pbase;
return (bus_space_map(di->bas.bst, start, size, 0, &di->bas.bsh));
}
More information about the svn-src-projects
mailing list