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