xref: /openbmc/linux/scripts/coccinelle/free/clk_put.cocci (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
17f904d7eSThomas Gleixner// SPDX-License-Identifier: GPL-2.0-only
253302c1dSJulia Lawall/// Find missing clk_puts.
353302c1dSJulia Lawall///
453302c1dSJulia Lawall//# This only signals a missing clk_put when there is a clk_put later
553302c1dSJulia Lawall//# in the same function.
653302c1dSJulia Lawall//# False positives can be due to loops.
753302c1dSJulia Lawall//
853302c1dSJulia Lawall// Confidence: Moderate
97f904d7eSThomas Gleixner// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
107f904d7eSThomas Gleixner// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
11*f01701ceSJulia Lawall// URL: https://coccinelle.gitlabpages.inria.fr/website
1253302c1dSJulia Lawall// Comments:
1353302c1dSJulia Lawall// Options:
1453302c1dSJulia Lawall
1553302c1dSJulia Lawallvirtual context
1653302c1dSJulia Lawallvirtual org
1753302c1dSJulia Lawallvirtual report
1853302c1dSJulia Lawall
1953302c1dSJulia Lawall@clk@
2053302c1dSJulia Lawallexpression e;
2153302c1dSJulia Lawallstatement S,S1;
2253302c1dSJulia Lawallint ret;
2353302c1dSJulia Lawallposition p1,p2,p3;
2453302c1dSJulia Lawall@@
2553302c1dSJulia Lawall
2653302c1dSJulia Lawalle = clk_get@p1(...)
2753302c1dSJulia Lawall... when != clk_put(e)
2853302c1dSJulia Lawallif (<+...e...+>) S
2953302c1dSJulia Lawall... when any
3053302c1dSJulia Lawall    when != clk_put(e)
3153302c1dSJulia Lawall    when != if (...) { ... clk_put(e); ... }
3253302c1dSJulia Lawall(
3353302c1dSJulia Lawall if (ret == 0) S1
3453302c1dSJulia Lawall|
3553302c1dSJulia Lawallif (...)
3653302c1dSJulia Lawall   { ...
3753302c1dSJulia Lawall     return 0; }
3853302c1dSJulia Lawall|
3953302c1dSJulia Lawallif (...)
4053302c1dSJulia Lawall   { ...
4153302c1dSJulia Lawall     return <+...e...+>; }
4253302c1dSJulia Lawall|
4353302c1dSJulia Lawall*if@p2 (...)
4453302c1dSJulia Lawall   { ... when != clk_put(e)
4553302c1dSJulia Lawall         when forall
4653302c1dSJulia Lawall     return@p3 ...; }
4753302c1dSJulia Lawall)
4853302c1dSJulia Lawall... when any
4953302c1dSJulia Lawallclk_put(e);
5053302c1dSJulia Lawall
5153302c1dSJulia Lawall@script:python depends on org@
5253302c1dSJulia Lawallp1 << clk.p1;
5353302c1dSJulia Lawallp2 << clk.p2;
5453302c1dSJulia Lawallp3 << clk.p3;
5553302c1dSJulia Lawall@@
5653302c1dSJulia Lawall
5753302c1dSJulia Lawallcocci.print_main("clk_get",p1)
5853302c1dSJulia Lawallcocci.print_secs("if",p2)
5953302c1dSJulia Lawallcocci.print_secs("needed clk_put",p3)
6053302c1dSJulia Lawall
6153302c1dSJulia Lawall@script:python depends on report@
6253302c1dSJulia Lawallp1 << clk.p1;
6353302c1dSJulia Lawallp2 << clk.p2;
6453302c1dSJulia Lawallp3 << clk.p3;
6553302c1dSJulia Lawall@@
6653302c1dSJulia Lawall
6753302c1dSJulia Lawallmsg = "ERROR: missing clk_put; clk_get on line %s and execution via conditional on line %s" % (p1[0].line,p2[0].line)
6853302c1dSJulia Lawallcoccilib.report.print_report(p3[0],msg)
69