Re: [Cocci] [PATCH v13 3/6] clk: Make clk API return per-user struct clk instances

2015-02-06 Thread Quentin Lambert


On 06/02/2015 03:15, Stephen Boyd wrote:

Thanks for the coccinelle patch. Thinking more about it, I don't think
we care if the pointer is dereferenced because that would require a
definition of struct clk and that is most likely not the case outside of
the clock framework. Did you scan the entire kernel?

No I haven't.

I'm running it now
but it seems to be taking a while.

Yes, that's why, as a first step, I chose to limit the scan to the arm 
directory.

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [Cocci] [PATCH v13 3/6] clk: Make clk API return per-user struct clk instances

2015-02-05 Thread Quentin Lambert

Sorry let me do that properly.

On 05/02/2015 16:45, Quentin Lambert wrote:


On 05/02/2015 00:26, Stephen Boyd wrote:

If you want me to I can enlarge the search to other directories.

Yes please do. And if you could share the coccinelle patch that would be
great. Thanks.


structclk.cocci is the coccinelle patch
structclk-arm.patch is the result I got when applying it to the 
arch/arm directory


Is there anything else I can do to help?




These are the new instances I found by applying the patch to arch/arm 
directory:


./arch/arm/mach-imx/mach-imx6q.c
@@ -211,7 +211,6 @@ static void __init imx6q_1588_init(void)
  * set bit IOMUXC_GPR1[21].  Or the PTP clock must be from pad
  * (external OSC), and we need to clear the bit.
  */
 clksel = ptp_clk == enet_ref ? IMX6Q_GPR1_ENET_CLK_SEL_ANATOP :
IMX6Q_GPR1_ENET_CLK_SEL_PAD;
 gpr = syscon_regmap_lookup_by_compatible(fsl,imx6q-iomuxc-gpr);
 if (!IS_ERR(gpr))

./arch/arm/mach-shmobile/clock-r8a73a4.c
@@ -139,7 +139,6 @@ static int pll_set_parent(struct clk *cl

 /* Search the parent */
 for (i = 0; i  clk-parent_num; i++)
 if (clk-parent_table[i] == parent)
 break;

 if (i == clk-parent_num)

./arch/arm/mach-shmobile/clock-sh7372.c
@@ -223,7 +223,6 @@ static int pllc2_set_parent(struct clk *

 /* Search the parent */
 for (i = 0; i  clk-parent_num; i++)
 if (clk-parent_table[i] == parent)
 break;

 if (i == clk-parent_num)

./arch/arm/mach-shmobile/clock-r8a7740.c
@@ -195,7 +195,6 @@ static int usb24s_set_parent(struct clk

 /* Search the parent */
 for (i = 0; i  clk-parent_num; i++)
 if (clk-parent_table[i] == parent)
 break;

 if (i == clk-parent_num)



--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [Cocci] [PATCH v13 3/6] clk: Make clk API return per-user struct clk instances

2015-02-05 Thread Quentin Lambert


On 05/02/2015 00:26, Stephen Boyd wrote:

If you want me to I can enlarge the search to other directories.

Yes please do. And if you could share the coccinelle patch that would be
great. Thanks.


structclk.cocci is the coccinelle patch
structclk-arm.patch is the result I got when applying it to the arch/arm 
directory


Is there anything else I can do to help?


diff -u -p ./arch/arm/mach-imx/mach-imx6q.c /tmp/nothing/mach-imx/mach-imx6q.c
--- ./arch/arm/mach-imx/mach-imx6q.c
+++ /tmp/nothing/mach-imx/mach-imx6q.c
@@ -211,7 +211,6 @@ static void __init imx6q_1588_init(void)
 	 * set bit IOMUXC_GPR1[21].  Or the PTP clock must be from pad
 	 * (external OSC), and we need to clear the bit.
 	 */
-	clksel = ptp_clk == enet_ref ? IMX6Q_GPR1_ENET_CLK_SEL_ANATOP :
    IMX6Q_GPR1_ENET_CLK_SEL_PAD;
 	gpr = syscon_regmap_lookup_by_compatible(fsl,imx6q-iomuxc-gpr);
 	if (!IS_ERR(gpr))
diff -u -p ./arch/arm/mach-shmobile/clock-r8a73a4.c /tmp/nothing/mach-shmobile/clock-r8a73a4.c
--- ./arch/arm/mach-shmobile/clock-r8a73a4.c
+++ /tmp/nothing/mach-shmobile/clock-r8a73a4.c
@@ -139,7 +139,6 @@ static int pll_set_parent(struct clk *cl
 
 	/* Search the parent */
 	for (i = 0; i  clk-parent_num; i++)
-		if (clk-parent_table[i] == parent)
 			break;
 
 	if (i == clk-parent_num)
diff -u -p ./arch/arm/mach-shmobile/clock-sh7372.c /tmp/nothing/mach-shmobile/clock-sh7372.c
--- ./arch/arm/mach-shmobile/clock-sh7372.c
+++ /tmp/nothing/mach-shmobile/clock-sh7372.c
@@ -223,7 +223,6 @@ static int pllc2_set_parent(struct clk *
 
 	/* Search the parent */
 	for (i = 0; i  clk-parent_num; i++)
-		if (clk-parent_table[i] == parent)
 			break;
 
 	if (i == clk-parent_num)
diff -u -p ./arch/arm/mach-shmobile/clock-r8a7740.c /tmp/nothing/mach-shmobile/clock-r8a7740.c
--- ./arch/arm/mach-shmobile/clock-r8a7740.c
+++ /tmp/nothing/mach-shmobile/clock-r8a7740.c
@@ -195,7 +195,6 @@ static int usb24s_set_parent(struct clk
 
 	/* Search the parent */
 	for (i = 0; i  clk-parent_num; i++)
-		if (clk-parent_table[i] == parent)
 			break;
 
 	if (i == clk-parent_num)
diff -u -p ./arch/arm/mach-omap2/clkt_clksel.c /tmp/nothing/mach-omap2/clkt_clksel.c
--- ./arch/arm/mach-omap2/clkt_clksel.c
+++ /tmp/nothing/mach-omap2/clkt_clksel.c
@@ -67,7 +67,6 @@ static const struct clksel *_get_clksel_
 		return NULL;
 
 	for (clks = clk-clksel; clks-parent; clks++)
-		if (clks-parent == src_clk)
 			break; /* Found the requested parent */
 
 	if (!clks-parent) {
diff -u -p ./arch/arm/mach-omap2/timer.c /tmp/nothing/mach-omap2/timer.c
--- ./arch/arm/mach-omap2/timer.c
+++ /tmp/nothing/mach-omap2/timer.c
@@ -298,7 +298,6 @@ static int __init omap_dm_timer_init_one
 	if (IS_ERR(src))
 		return PTR_ERR(src);
 
-	if (clk_get_parent(timer-fclk) != src) {
 		r = clk_set_parent(timer-fclk, src);
 		if (r  0) {
 			pr_warn(%s: %s cannot set source\n, __func__,
/// Find any attempt to compare or dereference struct clk pointers.
///
// Confidence: High
// Copyright: (C) 2015 Quentin Lambert, INRIA/LiP6. GPLv2
// URL: http://coccinelle.lip6.fr/
// Options: --recursive-includes --relax-include-path
// Options: --include-headers-for-types

virtual context
virtual org
virtual report


// 

@comparison_dereference depends on context || org || report@
struct clk *x1, x2;
position j0;
@@

(
*  x1@j0 == x2
|
*  x1@j0 != x2
|
*  *x1@j0
)

// 

@script:python comparison_dereference_org depends on org@
j0  comparison_dereference.j0;
@@

msg = WARNING trying to compare or dereference struct clk pointers.
coccilib.org.print_todo(j0[0], msg)

// 

@script:python comparison_dereference_report depends on report@
j0  comparison_dereference.j0;
@@

msg = WARNING trying to compare or dereference struct clk pointers.
coccilib.report.print_report(j0[0], msg)


Re: [Cocci] [PATCH v13 3/6] clk: Make clk API return per-user struct clk instances

2015-02-03 Thread Quentin Lambert

Hello,
Julia asked me to have a look and see if I can help.

On 02/02/2015 23:50, Mike Turquette wrote:

Quoting Stephen Boyd (2015-02-02 14:35:59)

On 02/02/15 13:31, Julia Lawall wrote:

On Mon, 2 Feb 2015, Stephen Boyd wrote:


Julia,

Is there a way we can write a coccinelle script to check for this? The
goal being to find all drivers that are comparing struct clk pointers or
attempting to dereference them. There are probably other frameworks that
could use the same type of check (regulator, gpiod, reset, pwm, etc.).
Probably anything that has a get/put API.

Comparing or dereferencing pointers of a particular type should be
straightforward to check for.  Is there an example of how to use the
parent_index value to fix the problem?


I'm not sure how to fix this case with parent_index values generically.
I imagine it would be highly specific to the surrounding code to the
point where we couldn't fix it automatically. For example, if it's a clk
consumer (not provider like in this case) using an index wouldn't be the
right fix. We would need some sort of clk API that we don't currently
have and I would wonder why clock consumers even care to compare such
pointers in the first place.

Ack. Is there precedent for a Don't do that kind of response?

Regards,
Mike


--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project


___
Cocci mailing list
co...@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci

I have found these three cases using Coccinnelle in the mach-omap2
directory.



./arch/arm/mach-omap2/clkt_clksel.c
@@ -67,7 +67,6 @@ static const struct clksel *_get_clksel_
return NULL;

for (clks = clk-clksel; clks-parent; clks++)
if (clks-parent == src_clk)
break; /* Found the requested parent */

if (!clks-parent) {
./arch/arm/mach-omap2/dpll3xxx.c
@@ -551,7 +549,6 @@ int omap3_noncore_dpll_set_rate(struct c
if (!dd)
return -EINVAL;

if (__clk_get_parent(hw-clk) != dd-clk_ref)
return -EINVAL;

if (dd-last_rounded_rate == 0)
./arch/arm/mach-omap2/timer.c
@@ -298,7 +298,6 @@ static int __init omap_dm_timer_init_one
if (IS_ERR(src))
return PTR_ERR(src);

if (clk_get_parent(timer-fclk) != src) {
r = clk_set_parent(timer-fclk, src);
if (r  0) {
pr_warn(%s: %s cannot set source\n, __func__,


Are they instances of your issue?
Do you have any suggestion on how to fix them?
If you want me to I can enlarge the search to other directories.


Quentin
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html