aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/extres
diff options
context:
space:
mode:
authorEmmanuel Vadot <manu@FreeBSD.org>2018-01-20 14:47:27 +0000
committerEmmanuel Vadot <manu@FreeBSD.org>2018-01-20 14:47:27 +0000
commit2b541904af5976992f3ad6ffe04bd11665be06da (patch)
tree46ed345dc8a5830fb44256a9eec00f350ba4aabb /sys/dev/extres
parentad2c142415975b8577ae886bd43f09eced6f536e (diff)
downloadsrc-2b541904af5976992f3ad6ffe04bd11665be06da.tar.gz
src-2b541904af5976992f3ad6ffe04bd11665be06da.zip
clk: Get new parent freq after set_freq
During set_freq a clknode might have reparent (using a better parent that have a higher frequency for example), before refreshing the cache, re-get the parent frequency. Reviewed by: mmel
Notes
Notes: svn path=/head/; revision=328198
Diffstat (limited to 'sys/dev/extres')
-rw-r--r--sys/dev/extres/clk/clk.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/dev/extres/clk/clk.c b/sys/dev/extres/clk/clk.c
index 55d21698fa3a..c6a1f466ceb1 100644
--- a/sys/dev/extres/clk/clk.c
+++ b/sys/dev/extres/clk/clk.c
@@ -916,6 +916,14 @@ clknode_set_freq(struct clknode *clknode, uint64_t freq, int flags,
/* Success - invalidate frequency cache for all children. */
if ((flags & CLK_SET_DRYRUN) == 0) {
clknode->freq = freq;
+ /* Clock might have reparent during set_freq */
+ if (clknode->parent_cnt > 0) {
+ rv = clknode_get_freq(clknode->parent,
+ &parent_freq);
+ if (rv != 0) {
+ return (rv);
+ }
+ }
clknode_refresh_cache(clknode, parent_freq);
}
} else if (clknode->parent != NULL) {