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