Move the RTAS delay sleep code to new rtas_busy_sleep(). It can
be called from HCALL delay code that needs to support both usleep()
or msleep() depends on delay value.

Signed-off-by: Haren Myneni <ha...@linux.ibm.com>
---
 arch/powerpc/include/asm/rtas.h |  1 +
 arch/powerpc/kernel/rtas.c      | 56 ++++++++++++++++++---------------
 2 files changed, 32 insertions(+), 25 deletions(-)

diff --git a/arch/powerpc/include/asm/rtas.h b/arch/powerpc/include/asm/rtas.h
index c697c3c74694..b389351a0045 100644
--- a/arch/powerpc/include/asm/rtas.h
+++ b/arch/powerpc/include/asm/rtas.h
@@ -435,6 +435,7 @@ extern void rtas_get_rtc_time(struct rtc_time *rtc_time);
 extern int rtas_set_rtc_time(struct rtc_time *rtc_time);
 
 extern unsigned int rtas_busy_delay_time(int status);
+extern void rtas_busy_sleep(int value);
 bool rtas_busy_delay(int status);
 
 extern int early_init_dt_scan_rtas(unsigned long node,
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
index eddc031c4b95..aa0bd7c4dcf1 100644
--- a/arch/powerpc/kernel/rtas.c
+++ b/arch/powerpc/kernel/rtas.c
@@ -1250,6 +1250,36 @@ static bool __init rtas_busy_delay_early(int status)
        return retry;
 }
 
+void rtas_busy_sleep(int value)
+{
+       unsigned int ms;
+
+       ms = rtas_busy_delay_time(value);
+       /*
+        * The extended delay hint can be as high as 100 seconds.
+        * Surely any function returning such a status is either
+        * buggy or isn't going to be significantly slowed by us
+        * polling at 1HZ. Clamp the sleep time to one second.
+        */
+       ms = clamp(ms, 1U, 1000U);
+       /*
+        * The delay hint is an order-of-magnitude suggestion, not
+        * a minimum. It is fine, possibly even advantageous, for
+        * us to pause for less time than hinted. For small values,
+        * use usleep_range() to ensure we don't sleep much longer
+        * than actually needed.
+        *
+        * See Documentation/timers/timers-howto.rst for
+        * explanation of the threshold used here. In effect we use
+        * usleep_range() for 9900 and 9901, msleep() for
+        * 9902-9905.
+        */
+       if (ms <= 20)
+               usleep_range(ms * 100, ms * 1000);
+       else
+               msleep(ms);
+}
+
 /**
  * rtas_busy_delay() - helper for RTAS busy and extended delay statuses
  *
@@ -1270,7 +1300,6 @@ static bool __init rtas_busy_delay_early(int status)
  */
 bool __ref rtas_busy_delay(int status)
 {
-       unsigned int ms;
        bool ret;
 
        /*
@@ -1282,30 +1311,7 @@ bool __ref rtas_busy_delay(int status)
        switch (status) {
        case RTAS_EXTENDED_DELAY_MIN...RTAS_EXTENDED_DELAY_MAX:
                ret = true;
-               ms = rtas_busy_delay_time(status);
-               /*
-                * The extended delay hint can be as high as 100 seconds.
-                * Surely any function returning such a status is either
-                * buggy or isn't going to be significantly slowed by us
-                * polling at 1HZ. Clamp the sleep time to one second.
-                */
-               ms = clamp(ms, 1U, 1000U);
-               /*
-                * The delay hint is an order-of-magnitude suggestion, not
-                * a minimum. It is fine, possibly even advantageous, for
-                * us to pause for less time than hinted. For small values,
-                * use usleep_range() to ensure we don't sleep much longer
-                * than actually needed.
-                *
-                * See Documentation/timers/timers-howto.rst for
-                * explanation of the threshold used here. In effect we use
-                * usleep_range() for 9900 and 9901, msleep() for
-                * 9902-9905.
-                */
-               if (ms <= 20)
-                       usleep_range(ms * 100, ms * 1000);
-               else
-                       msleep(ms);
+               rtas_busy_sleep(status);
                break;
        case RTAS_BUSY:
                ret = true;
-- 
2.26.3

Reply via email to