1*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun/// Make sure pm_runtime_* calls does not use unnecessary IS_ERR_VALUE 3*4882a593Smuzhiyun/// 4*4882a593Smuzhiyun// Keywords: pm_runtime 5*4882a593Smuzhiyun// Confidence: Medium 6*4882a593Smuzhiyun// Copyright (C) 2013 Texas Instruments Incorporated - 7*4882a593Smuzhiyun// URL: http://coccinelle.lip6.fr/ 8*4882a593Smuzhiyun// Options: --include-headers 9*4882a593Smuzhiyun 10*4882a593Smuzhiyunvirtual patch 11*4882a593Smuzhiyunvirtual context 12*4882a593Smuzhiyunvirtual org 13*4882a593Smuzhiyunvirtual report 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun//---------------------------------------------------------- 16*4882a593Smuzhiyun// Detection 17*4882a593Smuzhiyun//---------------------------------------------------------- 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun@runtime_bad_err_handle exists@ 20*4882a593Smuzhiyunexpression ret; 21*4882a593Smuzhiyunposition p; 22*4882a593Smuzhiyun@@ 23*4882a593Smuzhiyun( 24*4882a593Smuzhiyunret@p = \(pm_runtime_idle\| 25*4882a593Smuzhiyun pm_runtime_suspend\| 26*4882a593Smuzhiyun pm_runtime_autosuspend\| 27*4882a593Smuzhiyun pm_runtime_resume\| 28*4882a593Smuzhiyun pm_request_idle\| 29*4882a593Smuzhiyun pm_request_resume\| 30*4882a593Smuzhiyun pm_request_autosuspend\| 31*4882a593Smuzhiyun pm_runtime_get\| 32*4882a593Smuzhiyun pm_runtime_get_sync\| 33*4882a593Smuzhiyun pm_runtime_put\| 34*4882a593Smuzhiyun pm_runtime_put_autosuspend\| 35*4882a593Smuzhiyun pm_runtime_put_sync\| 36*4882a593Smuzhiyun pm_runtime_put_sync_suspend\| 37*4882a593Smuzhiyun pm_runtime_put_sync_autosuspend\| 38*4882a593Smuzhiyun pm_runtime_set_active\| 39*4882a593Smuzhiyun pm_schedule_suspend\| 40*4882a593Smuzhiyun pm_runtime_barrier\| 41*4882a593Smuzhiyun pm_generic_runtime_suspend\| 42*4882a593Smuzhiyun pm_generic_runtime_resume\)(...); 43*4882a593Smuzhiyun... 44*4882a593SmuzhiyunIS_ERR_VALUE(ret) 45*4882a593Smuzhiyun... 46*4882a593Smuzhiyun) 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun//---------------------------------------------------------- 49*4882a593Smuzhiyun// For context mode 50*4882a593Smuzhiyun//---------------------------------------------------------- 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun@depends on context@ 53*4882a593Smuzhiyunidentifier pm_runtime_api; 54*4882a593Smuzhiyunexpression ret; 55*4882a593Smuzhiyunposition runtime_bad_err_handle.p; 56*4882a593Smuzhiyun@@ 57*4882a593Smuzhiyun( 58*4882a593Smuzhiyunret@p = pm_runtime_api(...); 59*4882a593Smuzhiyun... 60*4882a593Smuzhiyun* IS_ERR_VALUE(ret) 61*4882a593Smuzhiyun... 62*4882a593Smuzhiyun) 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun//---------------------------------------------------------- 65*4882a593Smuzhiyun// For patch mode 66*4882a593Smuzhiyun//---------------------------------------------------------- 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun@depends on patch@ 69*4882a593Smuzhiyunidentifier pm_runtime_api; 70*4882a593Smuzhiyunexpression ret; 71*4882a593Smuzhiyunposition runtime_bad_err_handle.p; 72*4882a593Smuzhiyun@@ 73*4882a593Smuzhiyun( 74*4882a593Smuzhiyunret@p = pm_runtime_api(...); 75*4882a593Smuzhiyun... 76*4882a593Smuzhiyun- IS_ERR_VALUE(ret) 77*4882a593Smuzhiyun+ ret < 0 78*4882a593Smuzhiyun... 79*4882a593Smuzhiyun) 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun//---------------------------------------------------------- 82*4882a593Smuzhiyun// For org and report mode 83*4882a593Smuzhiyun//---------------------------------------------------------- 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun@r depends on (org || report) exists@ 86*4882a593Smuzhiyunposition p1, p2; 87*4882a593Smuzhiyunidentifier pm_runtime_api; 88*4882a593Smuzhiyunexpression ret; 89*4882a593Smuzhiyunposition runtime_bad_err_handle.p; 90*4882a593Smuzhiyun@@ 91*4882a593Smuzhiyun( 92*4882a593Smuzhiyunret@p = pm_runtime_api@p1(...); 93*4882a593Smuzhiyun... 94*4882a593SmuzhiyunIS_ERR_VALUE@p2(ret) 95*4882a593Smuzhiyun... 96*4882a593Smuzhiyun) 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun@script:python depends on org@ 99*4882a593Smuzhiyunp1 << r.p1; 100*4882a593Smuzhiyunp2 << r.p2; 101*4882a593Smuzhiyunpm_runtime_api << r.pm_runtime_api; 102*4882a593Smuzhiyun@@ 103*4882a593Smuzhiyun 104*4882a593Smuzhiyuncocci.print_main(pm_runtime_api,p1) 105*4882a593Smuzhiyuncocci.print_secs("IS_ERR_VALUE",p2) 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun@script:python depends on report@ 108*4882a593Smuzhiyunp1 << r.p1; 109*4882a593Smuzhiyunp2 << r.p2; 110*4882a593Smuzhiyunpm_runtime_api << r.pm_runtime_api; 111*4882a593Smuzhiyun@@ 112*4882a593Smuzhiyun 113*4882a593Smuzhiyunmsg = "%s returns < 0 as error. Unecessary IS_ERR_VALUE at line %s" % (pm_runtime_api, p2[0].line) 114*4882a593Smuzhiyuncoccilib.report.print_report(p1[0],msg) 115