/* SPDX-License-Identifier: MIT */ /* Copyright © 2025 Intel Corporation */ #ifndef __INTEL_DISPLAY_JIFFIES_H__ #define __INTEL_DISPLAY_JIFFIES_H__ #include static inline unsigned long msecs_to_jiffies_timeout(const unsigned int m) { unsigned long j = msecs_to_jiffies(m); return min_t(unsigned long, MAX_JIFFY_OFFSET, j + 1); } /* * If you need to wait X milliseconds between events A and B, but event B * doesn't happen exactly after event A, you record the timestamp (jiffies) of * when event A happened, then just before event B you call this function and * pass the timestamp as the first argument, and X as the second argument. */ static inline void wait_remaining_ms_from_jiffies(unsigned long timestamp_jiffies, int to_wait_ms) { unsigned long target_jiffies, tmp_jiffies, remaining_jiffies; /* * Don't re-read the value of "jiffies" every time since it may change * behind our back and break the math. */ tmp_jiffies = jiffies; target_jiffies = timestamp_jiffies + msecs_to_jiffies_timeout(to_wait_ms); if (time_after(target_jiffies, tmp_jiffies)) { remaining_jiffies = target_jiffies - tmp_jiffies; while (remaining_jiffies) remaining_jiffies = schedule_timeout_uninterruptible(remaining_jiffies); } } #endif /* __INTEL_DISPLAY_JIFFIES_H__ */