}
 EXPORT_SYMBOL_GPL(spi_unregister_controller);
 
+static inline int __spi_check_suspended(const struct spi_controller *ctlr)
+{
+       return ctlr->flags & SPI_CONTROLLER_SUSPENDED ? -ESHUTDOWN : 0;
+}
+
+static inline void __spi_mark_suspended(struct spi_controller *ctlr)
+{
+       mutex_lock(&ctlr->bus_lock_mutex);
+       ctlr->flags |= SPI_CONTROLLER_SUSPENDED;
+       mutex_unlock(&ctlr->bus_lock_mutex);
+}
+
+static inline void __spi_mark_resumed(struct spi_controller *ctlr)
+{
+       mutex_lock(&ctlr->bus_lock_mutex);
+       ctlr->flags &= ~SPI_CONTROLLER_SUSPENDED;
+       mutex_unlock(&ctlr->bus_lock_mutex);
+}
+
 int spi_controller_suspend(struct spi_controller *ctlr)
 {
-       int ret;
+       int ret = 0;
 
        /* Basically no-ops for non-queued controllers */
-       if (!ctlr->queued)
-               return 0;
-
-       ret = spi_stop_queue(ctlr);
-       if (ret)
-               dev_err(&ctlr->dev, "queue stop failed\n");
+       if (ctlr->queued) {
+               ret = spi_stop_queue(ctlr);
+               if (ret)
+                       dev_err(&ctlr->dev, "queue stop failed\n");
+       }
 
+       __spi_mark_suspended(ctlr);
        return ret;
 }
 EXPORT_SYMBOL_GPL(spi_controller_suspend);
 
 int spi_controller_resume(struct spi_controller *ctlr)
 {
-       int ret;
-
-       if (!ctlr->queued)
-               return 0;
+       int ret = 0;
 
-       ret = spi_start_queue(ctlr);
-       if (ret)
-               dev_err(&ctlr->dev, "queue restart failed\n");
+       __spi_mark_resumed(ctlr);
 
+       if (ctlr->queued) {
+               ret = spi_start_queue(ctlr);
+               if (ret)
+                       dev_err(&ctlr->dev, "queue restart failed\n");
+       }
        return ret;
 }
 EXPORT_SYMBOL_GPL(spi_controller_resume);
        ctlr->cur_msg = msg;
        ret = __spi_pump_transfer_message(ctlr, msg, was_busy);
        if (ret)
-               goto out;
-
+               dev_err(&ctlr->dev, "noqueue transfer failed\n");
        ctlr->cur_msg = NULL;
        ctlr->fallback = false;
 
                spi_idle_runtime_pm(ctlr);
        }
 
-out:
        mutex_unlock(&ctlr->io_mutex);
 }
 
        int status;
        struct spi_controller *ctlr = spi->controller;
 
+       if (__spi_check_suspended(ctlr)) {
+               dev_warn_once(&spi->dev, "Attempted to sync while suspend\n");
+               return -ESHUTDOWN;
+       }
+
        status = __spi_validate(spi, message);
        if (status != 0)
                return status;