diff --git a/subsys/input/input.c b/subsys/input/input.c index 560f7a02614..55ff1afc5d3 100644 --- a/subsys/input/input.c +++ b/subsys/input/input.c @@ -50,7 +50,21 @@ int input_report(const struct device *dev, }; #ifdef CONFIG_INPUT_MODE_THREAD - return k_msgq_put(&input_msgq, &evt, timeout); + int ret; + + if (!K_TIMEOUT_EQ(timeout, K_NO_WAIT) && + k_current_get() == k_work_queue_thread_get(&k_sys_work_q)) { + LOG_DBG("Timeout discarded. No blocking in syswq."); + timeout = K_NO_WAIT; + } + + ret = k_msgq_put(&input_msgq, &evt, timeout); + if (ret < 0) { + LOG_WRN("Event dropped, queue full, not blocking in syswq."); + return ret; + } + + return 0; #else input_process(&evt); return 0;