0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /// Make sure pm_runtime_* calls does not use unnecessary IS_ERR_VALUE
0003 ///
0004 // Keywords: pm_runtime
0005 // Confidence: Medium
0006 // Copyright (C) 2013 Texas Instruments Incorporated -
0007 // URL: https://coccinelle.gitlabpages.inria.fr/website
0008 // Options: --include-headers
0009
0010 virtual patch
0011 virtual context
0012 virtual org
0013 virtual report
0014
0015 //----------------------------------------------------------
0016 // Detection
0017 //----------------------------------------------------------
0018
0019 @runtime_bad_err_handle exists@
0020 expression ret;
0021 position p;
0022 @@
0023 (
0024 ret@p = \(pm_runtime_idle\|
0025 pm_runtime_suspend\|
0026 pm_runtime_autosuspend\|
0027 pm_runtime_resume\|
0028 pm_request_idle\|
0029 pm_request_resume\|
0030 pm_request_autosuspend\|
0031 pm_runtime_get\|
0032 pm_runtime_get_sync\|
0033 pm_runtime_put\|
0034 pm_runtime_put_autosuspend\|
0035 pm_runtime_put_sync\|
0036 pm_runtime_put_sync_suspend\|
0037 pm_runtime_put_sync_autosuspend\|
0038 pm_runtime_set_active\|
0039 pm_schedule_suspend\|
0040 pm_runtime_barrier\|
0041 pm_generic_runtime_suspend\|
0042 pm_generic_runtime_resume\)(...);
0043 ...
0044 IS_ERR_VALUE(ret)
0045 ...
0046 )
0047
0048 //----------------------------------------------------------
0049 // For context mode
0050 //----------------------------------------------------------
0051
0052 @depends on context@
0053 identifier pm_runtime_api;
0054 expression ret;
0055 position runtime_bad_err_handle.p;
0056 @@
0057 (
0058 ret@p = pm_runtime_api(...);
0059 ...
0060 * IS_ERR_VALUE(ret)
0061 ...
0062 )
0063
0064 //----------------------------------------------------------
0065 // For patch mode
0066 //----------------------------------------------------------
0067
0068 @depends on patch@
0069 identifier pm_runtime_api;
0070 expression ret;
0071 position runtime_bad_err_handle.p;
0072 @@
0073 (
0074 ret@p = pm_runtime_api(...);
0075 ...
0076 - IS_ERR_VALUE(ret)
0077 + ret < 0
0078 ...
0079 )
0080
0081 //----------------------------------------------------------
0082 // For org and report mode
0083 //----------------------------------------------------------
0084
0085 @r depends on (org || report) exists@
0086 position p1, p2;
0087 identifier pm_runtime_api;
0088 expression ret;
0089 position runtime_bad_err_handle.p;
0090 @@
0091 (
0092 ret@p = pm_runtime_api@p1(...);
0093 ...
0094 IS_ERR_VALUE@p2(ret)
0095 ...
0096 )
0097
0098 @script:python depends on org@
0099 p1 << r.p1;
0100 p2 << r.p2;
0101 pm_runtime_api << r.pm_runtime_api;
0102 @@
0103
0104 cocci.print_main(pm_runtime_api,p1)
0105 cocci.print_secs("IS_ERR_VALUE",p2)
0106
0107 @script:python depends on report@
0108 p1 << r.p1;
0109 p2 << r.p2;
0110 pm_runtime_api << r.pm_runtime_api;
0111 @@
0112
0113 msg = "%s returns < 0 as error. Unecessary IS_ERR_VALUE at line %s" % (pm_runtime_api, p2[0].line)
0114 coccilib.report.print_report(p1[0],msg)