diff mbox

clk: fix parent validation in __clk_set_parent()

Message ID 1341313938-17861-1-git-send-email-rnayak@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Rajendra Nayak July 3, 2012, 11:12 a.m. UTC
The below commit introduced a bug in __clk_set_parent()
which could cause it to *skip* the parent validation
which makes sure the parent passed to the api is a valid
one.

    commit 7975059db572eb47f0fb272a62afeae272a4b209
    Author: Rajendra Nayak <rnayak@ti.com>
    Date:   Wed Jun 6 14:41:31 2012 +0530

        clk: Allow late cache allocation for clk->parents

This was identified by the following compiler warning..

    drivers/clk/clk.c: In function '__clk_set_parent':
    drivers/clk/clk.c:1083:5: warning: 'i' may be used uninitialized in this function [-Wuninitialized]

.. as reported by Marc Kleine-Budde.

There were various options discussed on how to fix this, one
being initing 'i' to clk->num_parents, but the below approach
was found to be more appropriate as it also makes the 'parent
validation' code simpler to read.

Reported-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
---
 drivers/clk/clk.c |   28 +++++++++++++---------------
 1 files changed, 13 insertions(+), 15 deletions(-)

Comments

Prashant Gaikwad July 5, 2012, 12:57 a.m. UTC | #1
On Tuesday 03 July 2012 04:42 PM, Rajendra Nayak wrote:
> The below commit introduced a bug in __clk_set_parent()
> which could cause it to *skip* the parent validation
> which makes sure the parent passed to the api is a valid
> one.

Need this fix for Tegra too.

>      commit 7975059db572eb47f0fb272a62afeae272a4b209
>      Author: Rajendra Nayak<rnayak@ti.com>
>      Date:   Wed Jun 6 14:41:31 2012 +0530
>
>          clk: Allow late cache allocation for clk->parents
>
> This was identified by the following compiler warning..
>
>      drivers/clk/clk.c: In function '__clk_set_parent':
>      drivers/clk/clk.c:1083:5: warning: 'i' may be used uninitialized in this function [-Wuninitialized]
>
> .. as reported by Marc Kleine-Budde.
>
> There were various options discussed on how to fix this, one
> being initing 'i' to clk->num_parents, but the below approach
> was found to be more appropriate as it also makes the 'parent
> validation' code simpler to read.
>
> Reported-by: Marc Kleine-Budde<mkl@pengutronix.de>
> Signed-off-by: Rajendra Nayak<rnayak@ti.com>
>
Mike Turquette July 5, 2012, 7:18 p.m. UTC | #2
On Wed, Jul 4, 2012 at 5:57 PM, Prashant Gaikwad <pgaikwad@nvidia.com> wrote:
> On Tuesday 03 July 2012 04:42 PM, Rajendra Nayak wrote:
>>
>> The below commit introduced a bug in __clk_set_parent()
>> which could cause it to *skip* the parent validation
>> which makes sure the parent passed to the api is a valid
>> one.
>
>
> Need this fix for Tegra too.
>

Hi Prashant,

You'll find it if you pull the latest clk-next.

Regards,
Mike

>
>>      commit 7975059db572eb47f0fb272a62afeae272a4b209
>>      Author: Rajendra Nayak<rnayak@ti.com>
>>      Date:   Wed Jun 6 14:41:31 2012 +0530
>>
>>          clk: Allow late cache allocation for clk->parents
>>
>> This was identified by the following compiler warning..
>>
>>      drivers/clk/clk.c: In function '__clk_set_parent':
>>      drivers/clk/clk.c:1083:5: warning: 'i' may be used uninitialized in
>> this function [-Wuninitialized]
>>
>> .. as reported by Marc Kleine-Budde.
>>
>> There were various options discussed on how to fix this, one
>> being initing 'i' to clk->num_parents, but the below approach
>> was found to be more appropriate as it also makes the 'parent
>> validation' code simpler to read.
>>
>> Reported-by: Marc Kleine-Budde<mkl@pengutronix.de>
>> Signed-off-by: Rajendra Nayak<rnayak@ti.com>
>>
>
diff mbox

Patch

diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 8996f46..46317cb 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -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)) {
-				if (clk->parents)
-					clk->parents[i] = __clk_lookup(parent->name);
-				break;
-			}
+	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",