|
@@ -1467,6 +1467,7 @@ static struct clk *clk_propagate_rate_change(struct clk *clk, unsigned long even
|
|
|
static void clk_change_rate(struct clk *clk)
|
|
|
{
|
|
|
struct clk *child;
|
|
|
+ struct hlist_node *tmp;
|
|
|
unsigned long old_rate;
|
|
|
unsigned long best_parent_rate = 0;
|
|
|
bool skip_set_rate = false;
|
|
@@ -1502,7 +1503,11 @@ static void clk_change_rate(struct clk *clk)
|
|
|
if (clk->notifier_count && old_rate != clk->rate)
|
|
|
__clk_notify(clk, POST_RATE_CHANGE, old_rate, clk->rate);
|
|
|
|
|
|
- hlist_for_each_entry(child, &clk->children, child_node) {
|
|
|
+ /*
|
|
|
+ * Use safe iteration, as change_rate can actually swap parents
|
|
|
+ * for certain clock types.
|
|
|
+ */
|
|
|
+ hlist_for_each_entry_safe(child, tmp, &clk->children, child_node) {
|
|
|
/* Skip children who will be reparented to another clock */
|
|
|
if (child->new_parent && child->new_parent != clk)
|
|
|
continue;
|