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