}
 EXPORT_SYMBOL_GPL(sdhci_request);
 
+int sdhci_request_atomic(struct mmc_host *mmc, struct mmc_request *mrq)
+{
+       struct sdhci_host *host = mmc_priv(mmc);
+       struct mmc_command *cmd;
+       unsigned long flags;
+       int ret = 0;
+
+       spin_lock_irqsave(&host->lock, flags);
+
+       if (sdhci_present_error(host, mrq->cmd, true)) {
+               sdhci_finish_mrq(host, mrq);
+               goto out_finish;
+       }
+
+       cmd = sdhci_manual_cmd23(host, mrq) ? mrq->sbc : mrq->cmd;
+
+       /*
+        * The HSQ may send a command in interrupt context without polling
+        * the busy signaling, which means we should return BUSY if controller
+        * has not released inhibit bits to allow HSQ trying to send request
+        * again in non-atomic context. So we should not finish this request
+        * here.
+        */
+       if (!sdhci_send_command(host, cmd))
+               ret = -EBUSY;
+       else
+               sdhci_led_activate(host);
+
+out_finish:
+       spin_unlock_irqrestore(&host->lock, flags);
+       return ret;
+}
+EXPORT_SYMBOL_GPL(sdhci_request_atomic);
+
 void sdhci_set_bus_width(struct sdhci_host *host, int width)
 {
        u8 ctrl;
 
 void sdhci_set_power_noreg(struct sdhci_host *host, unsigned char mode,
                           unsigned short vdd);
 void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq);
+int sdhci_request_atomic(struct mmc_host *mmc, struct mmc_request *mrq);
 void sdhci_set_bus_width(struct sdhci_host *host, int width);
 void sdhci_reset(struct sdhci_host *host, u8 mask);
 void sdhci_set_uhs_signaling(struct sdhci_host *host, unsigned timing);