Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9e85a6f9 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'clk-fixes-for-linus' of git://git.linaro.org/people/mturquette/linux

Pull fix to common clk framework from Michael Turquette:
 "The previous set of common clk fixes for -rc5 left an uninitialized
  int which could lead to bad array indexing when switching clock
  parents.  The issue is fixed with a trivial change to the code flow in
  __clk_set_parent."

* tag 'clk-fixes-for-linus' of git://git.linaro.org/people/mturquette/linux:
  clk: fix parent validation in __clk_set_parent()
parents 6c8addcb 863b1327
Loading
Loading
Loading
Loading
+13 −15
Original line number Diff line number Diff line
@@ -1067,26 +1067,24 @@ static int __clk_set_parent(struct clk *clk, struct clk *parent)

	old_parent = clk->parent;

	/* find index of new parent clock using cached parent ptrs */
	if (clk->parents)
		for (i = 0; i < clk->num_parents; i++)
			if (clk->parents[i] == parent)
				break;
	else
	if (!clk->parents)
		clk->parents = kzalloc((sizeof(struct clk*) * clk->num_parents),
								GFP_KERNEL);

	/*
	 * find index of new parent clock using string name comparison
	 * also try to cache the parent to avoid future calls to __clk_lookup
	 * find index of new parent clock using cached parent ptrs,
	 * or if not yet cached, use string name comparison and cache
	 * them now to avoid future calls to __clk_lookup.
	 */
	if (i == clk->num_parents)
		for (i = 0; i < clk->num_parents; i++)
			if (!strcmp(clk->parent_names[i], parent->name)) {
	for (i = 0; i < clk->num_parents; i++) {
		if (clk->parents && clk->parents[i] == parent)
			break;
		else if (!strcmp(clk->parent_names[i], parent->name)) {
			if (clk->parents)
				clk->parents[i] = __clk_lookup(parent->name);
			break;
		}
	}

	if (i == clk->num_parents) {
		pr_debug("%s: clock %s is not a possible parent of clock %s\n",