xref: /openbmc/linux/scripts/coccinelle/free/put_device.cocci (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
1da9cfb87SWen Yang// SPDX-License-Identifier: GPL-2.0
2da9cfb87SWen Yang/// Find missing put_device for every of_find_device_by_node.
3da9cfb87SWen Yang///
4da9cfb87SWen Yang// Confidence: Moderate
5da9cfb87SWen Yang// Copyright: (C) 2018-2019 Wen Yang, ZTE.
6da9cfb87SWen Yang// Comments:
7da9cfb87SWen Yang// Options: --no-includes --include-headers
8da9cfb87SWen Yang
9da9cfb87SWen Yangvirtual report
10da9cfb87SWen Yangvirtual org
11da9cfb87SWen Yang
12da9cfb87SWen Yang@search exists@
13da9cfb87SWen Yanglocal idexpression id;
14da9cfb87SWen Yangexpression x,e,e1;
15da9cfb87SWen Yangposition p1,p2;
16da9cfb87SWen Yangtype T,T1,T2,T3;
17da9cfb87SWen Yang@@
18da9cfb87SWen Yang
19da9cfb87SWen Yangid = of_find_device_by_node@p1(x)
20da9cfb87SWen Yang... when != e = id
21da9cfb87SWen Yangif (id == NULL || ...) { ... return ...; }
22da9cfb87SWen Yang... when != put_device(&id->dev)
23da9cfb87SWen Yang    when != platform_device_put(id)
24da9cfb87SWen Yang    when != if (id) { ... put_device(&id->dev) ... }
25da9cfb87SWen Yang    when != e1 = (T)id
26*f58c17c2SMarkus Elfring    when != e1 = (T)(&id->dev)
27da9cfb87SWen Yang    when != e1 = get_device(&id->dev)
28da9cfb87SWen Yang    when != e1 = (T1)platform_get_drvdata(id)
29da9cfb87SWen Yang(
30da9cfb87SWen Yang  return
31da9cfb87SWen Yang(    id
32da9cfb87SWen Yang|    (T2)dev_get_drvdata(&id->dev)
33da9cfb87SWen Yang|    (T3)platform_get_drvdata(id)
347265f5b7SWen Yang|    &id->dev
35da9cfb87SWen Yang);
36da9cfb87SWen Yang| return@p2 ...;
37da9cfb87SWen Yang)
38da9cfb87SWen Yang
39da9cfb87SWen Yang@script:python depends on report@
40da9cfb87SWen Yangp1 << search.p1;
41da9cfb87SWen Yangp2 << search.p2;
42da9cfb87SWen Yang@@
43da9cfb87SWen Yang
4430a70e80SMarkus Elfringcoccilib.report.print_report(p2[0],
4530a70e80SMarkus Elfring                             "ERROR: missing put_device; call of_find_device_by_node on line "
46da9cfb87SWen Yang                             + p1[0].line
4730a70e80SMarkus Elfring                             + ", but without a corresponding object release within this function.")
48da9cfb87SWen Yang
49da9cfb87SWen Yang@script:python depends on org@
50da9cfb87SWen Yangp1 << search.p1;
51da9cfb87SWen Yangp2 << search.p2;
52da9cfb87SWen Yang@@
53da9cfb87SWen Yang
54da9cfb87SWen Yangcocci.print_main("of_find_device_by_node", p1)
55da9cfb87SWen Yangcocci.print_secs("needed put_device", p2)
56