18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/// Make sure pm_runtime_* calls does not use unnecessary IS_ERR_VALUE 38c2ecf20Sopenharmony_ci/// 48c2ecf20Sopenharmony_ci// Keywords: pm_runtime 58c2ecf20Sopenharmony_ci// Confidence: Medium 68c2ecf20Sopenharmony_ci// Copyright (C) 2013 Texas Instruments Incorporated - 78c2ecf20Sopenharmony_ci// URL: http://coccinelle.lip6.fr/ 88c2ecf20Sopenharmony_ci// Options: --include-headers 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_civirtual patch 118c2ecf20Sopenharmony_civirtual context 128c2ecf20Sopenharmony_civirtual org 138c2ecf20Sopenharmony_civirtual report 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci//---------------------------------------------------------- 168c2ecf20Sopenharmony_ci// Detection 178c2ecf20Sopenharmony_ci//---------------------------------------------------------- 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci@runtime_bad_err_handle exists@ 208c2ecf20Sopenharmony_ciexpression ret; 218c2ecf20Sopenharmony_ciposition p; 228c2ecf20Sopenharmony_ci@@ 238c2ecf20Sopenharmony_ci( 248c2ecf20Sopenharmony_ciret@p = \(pm_runtime_idle\| 258c2ecf20Sopenharmony_ci pm_runtime_suspend\| 268c2ecf20Sopenharmony_ci pm_runtime_autosuspend\| 278c2ecf20Sopenharmony_ci pm_runtime_resume\| 288c2ecf20Sopenharmony_ci pm_request_idle\| 298c2ecf20Sopenharmony_ci pm_request_resume\| 308c2ecf20Sopenharmony_ci pm_request_autosuspend\| 318c2ecf20Sopenharmony_ci pm_runtime_get\| 328c2ecf20Sopenharmony_ci pm_runtime_get_sync\| 338c2ecf20Sopenharmony_ci pm_runtime_put\| 348c2ecf20Sopenharmony_ci pm_runtime_put_autosuspend\| 358c2ecf20Sopenharmony_ci pm_runtime_put_sync\| 368c2ecf20Sopenharmony_ci pm_runtime_put_sync_suspend\| 378c2ecf20Sopenharmony_ci pm_runtime_put_sync_autosuspend\| 388c2ecf20Sopenharmony_ci pm_runtime_set_active\| 398c2ecf20Sopenharmony_ci pm_schedule_suspend\| 408c2ecf20Sopenharmony_ci pm_runtime_barrier\| 418c2ecf20Sopenharmony_ci pm_generic_runtime_suspend\| 428c2ecf20Sopenharmony_ci pm_generic_runtime_resume\)(...); 438c2ecf20Sopenharmony_ci... 448c2ecf20Sopenharmony_ciIS_ERR_VALUE(ret) 458c2ecf20Sopenharmony_ci... 468c2ecf20Sopenharmony_ci) 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci//---------------------------------------------------------- 498c2ecf20Sopenharmony_ci// For context mode 508c2ecf20Sopenharmony_ci//---------------------------------------------------------- 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci@depends on context@ 538c2ecf20Sopenharmony_ciidentifier pm_runtime_api; 548c2ecf20Sopenharmony_ciexpression ret; 558c2ecf20Sopenharmony_ciposition runtime_bad_err_handle.p; 568c2ecf20Sopenharmony_ci@@ 578c2ecf20Sopenharmony_ci( 588c2ecf20Sopenharmony_ciret@p = pm_runtime_api(...); 598c2ecf20Sopenharmony_ci... 608c2ecf20Sopenharmony_ci* IS_ERR_VALUE(ret) 618c2ecf20Sopenharmony_ci... 628c2ecf20Sopenharmony_ci) 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci//---------------------------------------------------------- 658c2ecf20Sopenharmony_ci// For patch mode 668c2ecf20Sopenharmony_ci//---------------------------------------------------------- 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci@depends on patch@ 698c2ecf20Sopenharmony_ciidentifier pm_runtime_api; 708c2ecf20Sopenharmony_ciexpression ret; 718c2ecf20Sopenharmony_ciposition runtime_bad_err_handle.p; 728c2ecf20Sopenharmony_ci@@ 738c2ecf20Sopenharmony_ci( 748c2ecf20Sopenharmony_ciret@p = pm_runtime_api(...); 758c2ecf20Sopenharmony_ci... 768c2ecf20Sopenharmony_ci- IS_ERR_VALUE(ret) 778c2ecf20Sopenharmony_ci+ ret < 0 788c2ecf20Sopenharmony_ci... 798c2ecf20Sopenharmony_ci) 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci//---------------------------------------------------------- 828c2ecf20Sopenharmony_ci// For org and report mode 838c2ecf20Sopenharmony_ci//---------------------------------------------------------- 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci@r depends on (org || report) exists@ 868c2ecf20Sopenharmony_ciposition p1, p2; 878c2ecf20Sopenharmony_ciidentifier pm_runtime_api; 888c2ecf20Sopenharmony_ciexpression ret; 898c2ecf20Sopenharmony_ciposition runtime_bad_err_handle.p; 908c2ecf20Sopenharmony_ci@@ 918c2ecf20Sopenharmony_ci( 928c2ecf20Sopenharmony_ciret@p = pm_runtime_api@p1(...); 938c2ecf20Sopenharmony_ci... 948c2ecf20Sopenharmony_ciIS_ERR_VALUE@p2(ret) 958c2ecf20Sopenharmony_ci... 968c2ecf20Sopenharmony_ci) 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci@script:python depends on org@ 998c2ecf20Sopenharmony_cip1 << r.p1; 1008c2ecf20Sopenharmony_cip2 << r.p2; 1018c2ecf20Sopenharmony_cipm_runtime_api << r.pm_runtime_api; 1028c2ecf20Sopenharmony_ci@@ 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_cicocci.print_main(pm_runtime_api,p1) 1058c2ecf20Sopenharmony_cicocci.print_secs("IS_ERR_VALUE",p2) 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci@script:python depends on report@ 1088c2ecf20Sopenharmony_cip1 << r.p1; 1098c2ecf20Sopenharmony_cip2 << r.p2; 1108c2ecf20Sopenharmony_cipm_runtime_api << r.pm_runtime_api; 1118c2ecf20Sopenharmony_ci@@ 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_cimsg = "%s returns < 0 as error. Unecessary IS_ERR_VALUE at line %s" % (pm_runtime_api, p2[0].line) 1148c2ecf20Sopenharmony_cicoccilib.report.print_report(p1[0],msg) 115