109c434b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2048b9c35SAkinobu Mita #include <linux/kernel.h>
3048b9c35SAkinobu Mita #include <linux/module.h>
4048b9c35SAkinobu Mita #include <linux/suspend.h>
5048b9c35SAkinobu Mita 
6048b9c35SAkinobu Mita #include "notifier-error-inject.h"
7048b9c35SAkinobu Mita 
8048b9c35SAkinobu Mita static int priority;
9048b9c35SAkinobu Mita module_param(priority, int, 0);
10048b9c35SAkinobu Mita MODULE_PARM_DESC(priority, "specify PM notifier priority");
11048b9c35SAkinobu Mita 
12048b9c35SAkinobu Mita static struct notifier_err_inject pm_notifier_err_inject = {
13048b9c35SAkinobu Mita 	.actions = {
14048b9c35SAkinobu Mita 		{ NOTIFIER_ERR_INJECT_ACTION(PM_HIBERNATION_PREPARE) },
15048b9c35SAkinobu Mita 		{ NOTIFIER_ERR_INJECT_ACTION(PM_SUSPEND_PREPARE) },
16048b9c35SAkinobu Mita 		{ NOTIFIER_ERR_INJECT_ACTION(PM_RESTORE_PREPARE) },
17048b9c35SAkinobu Mita 		{}
18048b9c35SAkinobu Mita 	}
19048b9c35SAkinobu Mita };
20048b9c35SAkinobu Mita 
21048b9c35SAkinobu Mita static struct dentry *dir;
22048b9c35SAkinobu Mita 
err_inject_init(void)23048b9c35SAkinobu Mita static int err_inject_init(void)
24048b9c35SAkinobu Mita {
25048b9c35SAkinobu Mita 	int err;
26048b9c35SAkinobu Mita 
27048b9c35SAkinobu Mita 	dir = notifier_err_inject_init("pm", notifier_err_inject_dir,
28048b9c35SAkinobu Mita 					&pm_notifier_err_inject, priority);
29048b9c35SAkinobu Mita 	if (IS_ERR(dir))
30048b9c35SAkinobu Mita 		return PTR_ERR(dir);
31048b9c35SAkinobu Mita 
32048b9c35SAkinobu Mita 	err = register_pm_notifier(&pm_notifier_err_inject.nb);
33048b9c35SAkinobu Mita 	if (err)
34048b9c35SAkinobu Mita 		debugfs_remove_recursive(dir);
35048b9c35SAkinobu Mita 
36048b9c35SAkinobu Mita 	return err;
37048b9c35SAkinobu Mita }
38048b9c35SAkinobu Mita 
err_inject_exit(void)39048b9c35SAkinobu Mita static void err_inject_exit(void)
40048b9c35SAkinobu Mita {
41048b9c35SAkinobu Mita 	unregister_pm_notifier(&pm_notifier_err_inject.nb);
42048b9c35SAkinobu Mita 	debugfs_remove_recursive(dir);
43048b9c35SAkinobu Mita }
44048b9c35SAkinobu Mita 
45048b9c35SAkinobu Mita module_init(err_inject_init);
46048b9c35SAkinobu Mita module_exit(err_inject_exit);
47048b9c35SAkinobu Mita 
48048b9c35SAkinobu Mita MODULE_DESCRIPTION("PM notifier error injection module");
49048b9c35SAkinobu Mita MODULE_LICENSE("GPL");
50048b9c35SAkinobu Mita MODULE_AUTHOR("Akinobu Mita <akinobu.mita@gmail.com>");
51