|
@@ -1755,3 +1755,25 @@ unsigned long msleep_interruptible(unsigned int msecs)
|
|
|
}
|
|
|
|
|
|
EXPORT_SYMBOL(msleep_interruptible);
|
|
|
+
|
|
|
+static int __sched do_usleep_range(unsigned long min, unsigned long max)
|
|
|
+{
|
|
|
+ ktime_t kmin;
|
|
|
+ unsigned long delta;
|
|
|
+
|
|
|
+ kmin = ktime_set(0, min * NSEC_PER_USEC);
|
|
|
+ delta = max - min;
|
|
|
+ return schedule_hrtimeout_range(&kmin, delta, HRTIMER_MODE_REL);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * usleep_range - Drop in replacement for udelay where wakeup is flexible
|
|
|
+ * @min: Minimum time in usecs to sleep
|
|
|
+ * @max: Maximum time in usecs to sleep
|
|
|
+ */
|
|
|
+void usleep_range(unsigned long min, unsigned long max)
|
|
|
+{
|
|
|
+ __set_current_state(TASK_UNINTERRUPTIBLE);
|
|
|
+ do_usleep_range(min, max);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(usleep_range);
|