return card->ext_csd.rev >= 3;
 }
 
+static int mmc_sleep_busy_cb(void *cb_data, bool *busy)
+{
+       struct mmc_host *host = cb_data;
+
+       *busy = host->ops->card_busy(host);
+       return 0;
+}
+
 static int mmc_sleep(struct mmc_host *host)
 {
        struct mmc_command cmd = {};
                goto out_release;
 
        /*
-        * If the host does not wait while the card signals busy, then we will
-        * will have to wait the sleep/awake timeout.  Note, we cannot use the
-        * SEND_STATUS command to poll the status because that command (and most
-        * others) is invalid while the card sleeps.
+        * If the host does not wait while the card signals busy, then we can
+        * try to poll, but only if the host supports HW polling, as the
+        * SEND_STATUS cmd is not allowed. If we can't poll, then we simply need
+        * to wait the sleep/awake timeout.
         */
-       if (!use_r1b_resp || !(host->caps & MMC_CAP_WAIT_WHILE_BUSY))
+       if (host->caps & MMC_CAP_WAIT_WHILE_BUSY && use_r1b_resp)
+               goto out_release;
+
+       if (!host->ops->card_busy) {
                mmc_delay(timeout_ms);
+               goto out_release;
+       }
+
+       err = __mmc_poll_for_busy(card, timeout_ms, &mmc_sleep_busy_cb, host);
 
 out_release:
        mmc_retune_release(host);