162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/// Find missing put_device for every of_find_device_by_node.
362306a36Sopenharmony_ci///
462306a36Sopenharmony_ci// Confidence: Moderate
562306a36Sopenharmony_ci// Copyright: (C) 2018-2019 Wen Yang, ZTE.
662306a36Sopenharmony_ci// Comments:
762306a36Sopenharmony_ci// Options: --no-includes --include-headers
862306a36Sopenharmony_ci
962306a36Sopenharmony_civirtual report
1062306a36Sopenharmony_civirtual org
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci@search exists@
1362306a36Sopenharmony_cilocal idexpression id;
1462306a36Sopenharmony_ciexpression x,e,e1;
1562306a36Sopenharmony_ciposition p1,p2;
1662306a36Sopenharmony_citype T,T1,T2,T3;
1762306a36Sopenharmony_ci@@
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ciid = of_find_device_by_node@p1(x)
2062306a36Sopenharmony_ci... when != e = id
2162306a36Sopenharmony_ciif (id == NULL || ...) { ... return ...; }
2262306a36Sopenharmony_ci... when != put_device(&id->dev)
2362306a36Sopenharmony_ci    when != platform_device_put(id)
2462306a36Sopenharmony_ci    when != if (id) { ... put_device(&id->dev) ... }
2562306a36Sopenharmony_ci    when != e1 = (T)id
2662306a36Sopenharmony_ci    when != e1 = (T)(&id->dev)
2762306a36Sopenharmony_ci    when != e1 = get_device(&id->dev)
2862306a36Sopenharmony_ci    when != e1 = (T1)platform_get_drvdata(id)
2962306a36Sopenharmony_ci(
3062306a36Sopenharmony_ci  return
3162306a36Sopenharmony_ci(    id
3262306a36Sopenharmony_ci|    (T2)dev_get_drvdata(&id->dev)
3362306a36Sopenharmony_ci|    (T3)platform_get_drvdata(id)
3462306a36Sopenharmony_ci|    &id->dev
3562306a36Sopenharmony_ci);
3662306a36Sopenharmony_ci| return@p2 ...;
3762306a36Sopenharmony_ci)
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci@script:python depends on report@
4062306a36Sopenharmony_cip1 << search.p1;
4162306a36Sopenharmony_cip2 << search.p2;
4262306a36Sopenharmony_ci@@
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cicoccilib.report.print_report(p2[0],
4562306a36Sopenharmony_ci                             "ERROR: missing put_device; call of_find_device_by_node on line "
4662306a36Sopenharmony_ci                             + p1[0].line
4762306a36Sopenharmony_ci                             + ", but without a corresponding object release within this function.")
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci@script:python depends on org@
5062306a36Sopenharmony_cip1 << search.p1;
5162306a36Sopenharmony_cip2 << search.p2;
5262306a36Sopenharmony_ci@@
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cicocci.print_main("of_find_device_by_node", p1)
5562306a36Sopenharmony_cicocci.print_secs("needed put_device", p2)
56