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