]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/spi/spi.c
spi: Add missing pm_runtime_put_noidle() after failed get
[mirror_ubuntu-bionic-kernel.git] / drivers / spi / spi.c
index b33a727a0158b19ebae1364a21fd8c9dff22e4e5..91e76c776037b7d3ad4d02b7f6dac9f9b4731344 100644 (file)
@@ -779,8 +779,14 @@ static int spi_map_buf(struct spi_controller *ctlr, struct device *dev,
        for (i = 0; i < sgs; i++) {
 
                if (vmalloced_buf || kmap_buf) {
-                       min = min_t(size_t,
-                                   len, desc_len - offset_in_page(buf));
+                       /*
+                        * Next scatterlist entry size is the minimum between
+                        * the desc_len and the remaining buffer length that
+                        * fits in a page.
+                        */
+                       min = min_t(size_t, desc_len,
+                                   min_t(size_t, len,
+                                         PAGE_SIZE - offset_in_page(buf)));
                        if (vmalloced_buf)
                                vm_page = vmalloc_to_page(buf);
                        else
@@ -1216,6 +1222,7 @@ static void __spi_pump_messages(struct spi_controller *ctlr, bool in_kthread)
        if (!was_busy && ctlr->auto_runtime_pm) {
                ret = pm_runtime_get_sync(ctlr->dev.parent);
                if (ret < 0) {
+                       pm_runtime_put_noidle(ctlr->dev.parent);
                        dev_err(&ctlr->dev, "Failed to power device: %d\n",
                                ret);
                        mutex_unlock(&ctlr->io_mutex);
@@ -2254,12 +2261,6 @@ void spi_unregister_controller(struct spi_controller *ctlr)
        mutex_lock(&board_lock);
        found = idr_find(&spi_master_idr, id);
        mutex_unlock(&board_lock);
-       if (found != ctlr) {
-               dev_dbg(&ctlr->dev,
-                       "attempting to delete unregistered controller [%s]\n",
-                       dev_name(&ctlr->dev));
-               return;
-       }
        if (ctlr->queued) {
                if (spi_destroy_queue(ctlr))
                        dev_err(&ctlr->dev, "queue remove failed\n");
@@ -2272,7 +2273,8 @@ void spi_unregister_controller(struct spi_controller *ctlr)
        device_unregister(&ctlr->dev);
        /* free bus id */
        mutex_lock(&board_lock);
-       idr_remove(&spi_master_idr, id);
+       if (found == ctlr)
+               idr_remove(&spi_master_idr, id);
        mutex_unlock(&board_lock);
 }
 EXPORT_SYMBOL_GPL(spi_unregister_controller);