162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/// Make sure pm_runtime_* calls does not use unnecessary IS_ERR_VALUE
362306a36Sopenharmony_ci///
462306a36Sopenharmony_ci// Keywords: pm_runtime
562306a36Sopenharmony_ci// Confidence: Medium
662306a36Sopenharmony_ci// Copyright (C) 2013 Texas Instruments Incorporated -
762306a36Sopenharmony_ci// URL: https://coccinelle.gitlabpages.inria.fr/website
862306a36Sopenharmony_ci// Options: --include-headers
962306a36Sopenharmony_ci
1062306a36Sopenharmony_civirtual patch
1162306a36Sopenharmony_civirtual context
1262306a36Sopenharmony_civirtual org
1362306a36Sopenharmony_civirtual report
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci//----------------------------------------------------------
1662306a36Sopenharmony_ci//  Detection
1762306a36Sopenharmony_ci//----------------------------------------------------------
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci@runtime_bad_err_handle exists@
2062306a36Sopenharmony_ciexpression ret;
2162306a36Sopenharmony_ciposition p;
2262306a36Sopenharmony_ci@@
2362306a36Sopenharmony_ci(
2462306a36Sopenharmony_ciret@p = \(pm_runtime_idle\|
2562306a36Sopenharmony_ci	pm_runtime_suspend\|
2662306a36Sopenharmony_ci	pm_runtime_autosuspend\|
2762306a36Sopenharmony_ci	pm_runtime_resume\|
2862306a36Sopenharmony_ci	pm_request_idle\|
2962306a36Sopenharmony_ci	pm_request_resume\|
3062306a36Sopenharmony_ci	pm_request_autosuspend\|
3162306a36Sopenharmony_ci	pm_runtime_get\|
3262306a36Sopenharmony_ci	pm_runtime_get_sync\|
3362306a36Sopenharmony_ci	pm_runtime_put\|
3462306a36Sopenharmony_ci	pm_runtime_put_autosuspend\|
3562306a36Sopenharmony_ci	pm_runtime_put_sync\|
3662306a36Sopenharmony_ci	pm_runtime_put_sync_suspend\|
3762306a36Sopenharmony_ci	pm_runtime_put_sync_autosuspend\|
3862306a36Sopenharmony_ci	pm_runtime_set_active\|
3962306a36Sopenharmony_ci	pm_schedule_suspend\|
4062306a36Sopenharmony_ci	pm_runtime_barrier\|
4162306a36Sopenharmony_ci	pm_generic_runtime_suspend\|
4262306a36Sopenharmony_ci	pm_generic_runtime_resume\)(...);
4362306a36Sopenharmony_ci...
4462306a36Sopenharmony_ciIS_ERR_VALUE(ret)
4562306a36Sopenharmony_ci...
4662306a36Sopenharmony_ci)
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci//----------------------------------------------------------
4962306a36Sopenharmony_ci//  For context mode
5062306a36Sopenharmony_ci//----------------------------------------------------------
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci@depends on context@
5362306a36Sopenharmony_ciidentifier pm_runtime_api;
5462306a36Sopenharmony_ciexpression ret;
5562306a36Sopenharmony_ciposition runtime_bad_err_handle.p;
5662306a36Sopenharmony_ci@@
5762306a36Sopenharmony_ci(
5862306a36Sopenharmony_ciret@p = pm_runtime_api(...);
5962306a36Sopenharmony_ci...
6062306a36Sopenharmony_ci* IS_ERR_VALUE(ret)
6162306a36Sopenharmony_ci...
6262306a36Sopenharmony_ci)
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci//----------------------------------------------------------
6562306a36Sopenharmony_ci//  For patch mode
6662306a36Sopenharmony_ci//----------------------------------------------------------
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci@depends on patch@
6962306a36Sopenharmony_ciidentifier pm_runtime_api;
7062306a36Sopenharmony_ciexpression ret;
7162306a36Sopenharmony_ciposition runtime_bad_err_handle.p;
7262306a36Sopenharmony_ci@@
7362306a36Sopenharmony_ci(
7462306a36Sopenharmony_ciret@p = pm_runtime_api(...);
7562306a36Sopenharmony_ci...
7662306a36Sopenharmony_ci- IS_ERR_VALUE(ret)
7762306a36Sopenharmony_ci+ ret < 0
7862306a36Sopenharmony_ci...
7962306a36Sopenharmony_ci)
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci//----------------------------------------------------------
8262306a36Sopenharmony_ci//  For org and report mode
8362306a36Sopenharmony_ci//----------------------------------------------------------
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci@r depends on (org || report) exists@
8662306a36Sopenharmony_ciposition p1, p2;
8762306a36Sopenharmony_ciidentifier pm_runtime_api;
8862306a36Sopenharmony_ciexpression ret;
8962306a36Sopenharmony_ciposition runtime_bad_err_handle.p;
9062306a36Sopenharmony_ci@@
9162306a36Sopenharmony_ci(
9262306a36Sopenharmony_ciret@p = pm_runtime_api@p1(...);
9362306a36Sopenharmony_ci...
9462306a36Sopenharmony_ciIS_ERR_VALUE@p2(ret)
9562306a36Sopenharmony_ci...
9662306a36Sopenharmony_ci)
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci@script:python depends on org@
9962306a36Sopenharmony_cip1 << r.p1;
10062306a36Sopenharmony_cip2 << r.p2;
10162306a36Sopenharmony_cipm_runtime_api << r.pm_runtime_api;
10262306a36Sopenharmony_ci@@
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_cicocci.print_main(pm_runtime_api,p1)
10562306a36Sopenharmony_cicocci.print_secs("IS_ERR_VALUE",p2)
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci@script:python depends on report@
10862306a36Sopenharmony_cip1 << r.p1;
10962306a36Sopenharmony_cip2 << r.p2;
11062306a36Sopenharmony_cipm_runtime_api << r.pm_runtime_api;
11162306a36Sopenharmony_ci@@
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_cimsg = "%s returns < 0 as error. Unecessary IS_ERR_VALUE at line %s" % (pm_runtime_api, p2[0].line)
11462306a36Sopenharmony_cicoccilib.report.print_report(p1[0],msg)
115