aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/extres
diff options
context:
space:
mode:
authorEmmanuel Vadot <manu@FreeBSD.org>2016-11-04 17:04:45 +0000
committerEmmanuel Vadot <manu@FreeBSD.org>2016-11-04 17:04:45 +0000
commit90aabaafa55a7a3d48bf27db160b8f058298015d (patch)
treed4091d8a5f307f4b15d0376c38322c4128127bcc /sys/dev/extres
parente98bb55f0b6a228c63ff5d11cde0d5634ce48bfd (diff)
downloadsrc-90aabaafa55a7a3d48bf27db160b8f058298015d.tar.gz
src-90aabaafa55a7a3d48bf27db160b8f058298015d.zip
Add clk_set_assigned
assigned-clock-parents are DT properties used to configure some default parent clocks on one node. Reviewed by: mmel MFC after: 2 weeks
Notes
Notes: svn path=/head/; revision=308298
Diffstat (limited to 'sys/dev/extres')
-rw-r--r--sys/dev/extres/clk/clk.c50
-rw-r--r--sys/dev/extres/clk/clk.h2
2 files changed, 50 insertions, 2 deletions
diff --git a/sys/dev/extres/clk/clk.c b/sys/dev/extres/clk/clk.c
index bcb0a263027e..9c189fa86699 100644
--- a/sys/dev/extres/clk/clk.c
+++ b/sys/dev/extres/clk/clk.c
@@ -1196,7 +1196,47 @@ clk_get_by_id(device_t dev, struct clkdom *clkdom, intptr_t id, clk_t *clk)
#ifdef FDT
int
-clk_get_by_ofw_index(device_t dev, phandle_t cnode, int idx, clk_t *clk)
+clk_set_assigned(device_t dev, phandle_t node)
+{
+ clk_t clk, clk_parent;
+ int error, nclocks, i;
+
+ error = ofw_bus_parse_xref_list_get_length(node,
+ "assigned-clock-parents", "#clock-cells", &nclocks);
+
+ if (error != 0) {
+ device_printf(dev, "cannot parse assigned-clock-parents property\n");
+ return (error);
+ }
+
+ for (i = 0; i < nclocks; i++) {
+ error = clk_get_by_ofw_index_prop(dev, 0,
+ "assigned-clock-parents", i, &clk_parent);
+ if (error != 0) {
+ device_printf(dev, "cannot get parent %d\n", i);
+ return (error);
+ }
+
+ error = clk_get_by_ofw_index_prop(dev, 0, "assigned-clocks",
+ i, &clk);
+ if (error != 0) {
+ device_printf(dev, "cannot get assigned clock %d\n", i);
+ clk_release(clk_parent);
+ return (error);
+ }
+
+ error = clk_set_parent_by_clk(clk, clk_parent);
+ clk_release(clk_parent);
+ clk_release(clk);
+ if (error != 0)
+ return (error);
+ }
+
+ return (0);
+}
+
+int
+clk_get_by_ofw_index_prop(device_t dev, phandle_t cnode, const char *prop, int idx, clk_t *clk)
{
phandle_t parent, *cells;
device_t clockdev;
@@ -1214,7 +1254,7 @@ clk_get_by_ofw_index(device_t dev, phandle_t cnode, int idx, clk_t *clk)
}
- rv = ofw_bus_parse_xref_list_alloc(cnode, "clocks", "#clock-cells", idx,
+ rv = ofw_bus_parse_xref_list_alloc(cnode, prop, "#clock-cells", idx,
&parent, &ncells, &cells);
if (rv != 0) {
return (rv);
@@ -1247,6 +1287,12 @@ done:
}
int
+clk_get_by_ofw_index(device_t dev, phandle_t cnode, int idx, clk_t *clk)
+{
+ return (clk_get_by_ofw_index_prop(dev, cnode, "clocks", idx, clk));
+}
+
+int
clk_get_by_ofw_name(device_t dev, phandle_t cnode, const char *name, clk_t *clk)
{
int rv, idx;
diff --git a/sys/dev/extres/clk/clk.h b/sys/dev/extres/clk/clk.h
index 60b8d2b77b75..9bd259997977 100644
--- a/sys/dev/extres/clk/clk.h
+++ b/sys/dev/extres/clk/clk.h
@@ -129,7 +129,9 @@ int clk_set_parent_by_clk(clk_t clk, clk_t parent);
const char *clk_get_name(clk_t clk);
#ifdef FDT
+int clk_set_assigned(device_t dev, phandle_t node);
int clk_get_by_ofw_index(device_t dev, phandle_t node, int idx, clk_t *clk);
+int clk_get_by_ofw_index_prop(device_t dev, phandle_t cnode, const char *prop, int idx, clk_t *clk);
int clk_get_by_ofw_name(device_t dev, phandle_t node, const char *name,
clk_t *clk);
int clk_parse_ofw_out_names(device_t dev, phandle_t node,