18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci#include "edac_module.h"
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_cistatic struct workqueue_struct *wq;
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_cibool edac_queue_work(struct delayed_work *work, unsigned long delay)
78c2ecf20Sopenharmony_ci{
88c2ecf20Sopenharmony_ci	return queue_delayed_work(wq, work, delay);
98c2ecf20Sopenharmony_ci}
108c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(edac_queue_work);
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_cibool edac_mod_work(struct delayed_work *work, unsigned long delay)
138c2ecf20Sopenharmony_ci{
148c2ecf20Sopenharmony_ci	return mod_delayed_work(wq, work, delay);
158c2ecf20Sopenharmony_ci}
168c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(edac_mod_work);
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_cibool edac_stop_work(struct delayed_work *work)
198c2ecf20Sopenharmony_ci{
208c2ecf20Sopenharmony_ci	bool ret;
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci	ret = cancel_delayed_work_sync(work);
238c2ecf20Sopenharmony_ci	flush_workqueue(wq);
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci	return ret;
268c2ecf20Sopenharmony_ci}
278c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(edac_stop_work);
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ciint edac_workqueue_setup(void)
308c2ecf20Sopenharmony_ci{
318c2ecf20Sopenharmony_ci	wq = alloc_ordered_workqueue("edac-poller", WQ_MEM_RECLAIM);
328c2ecf20Sopenharmony_ci	if (!wq)
338c2ecf20Sopenharmony_ci		return -ENODEV;
348c2ecf20Sopenharmony_ci	else
358c2ecf20Sopenharmony_ci		return 0;
368c2ecf20Sopenharmony_ci}
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_civoid edac_workqueue_teardown(void)
398c2ecf20Sopenharmony_ci{
408c2ecf20Sopenharmony_ci	flush_workqueue(wq);
418c2ecf20Sopenharmony_ci	destroy_workqueue(wq);
428c2ecf20Sopenharmony_ci	wq = NULL;
438c2ecf20Sopenharmony_ci}
44