Merge remote-tracking branches 'spi/fix/atmel', 'spi/fix/pxa2xx' and 'spi/fix/unregis...
[muen/linux.git] / drivers / spi / spi.c
index b33a727a0158b19ebae1364a21fd8c9dff22e4e5..7b213faa0a2b7247837372a4bc4a537e1c9a2ad1 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
@@ -2254,12 +2260,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 +2272,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);