Merge branch 'devicetree/merge' of git://git.secretlab.ca/git/linux-2.6
[firefly-linux-kernel-4.4.55.git] / drivers / spi / spi_bitbang.c
index 5265330a528fb2a367f164465fefb0b496e25c31..14a63f6010d1bfda52ea7b125c8571fab457615b 100644 (file)
@@ -259,11 +259,6 @@ static void bitbang_work(struct work_struct *work)
        struct spi_bitbang      *bitbang =
                container_of(work, struct spi_bitbang, work);
        unsigned long           flags;
-       int                     do_setup = -1;
-       int                     (*setup_transfer)(struct spi_device *,
-                                       struct spi_transfer *);
-
-       setup_transfer = bitbang->setup_transfer;
 
        spin_lock_irqsave(&bitbang->lock, flags);
        bitbang->busy = 1;
@@ -275,6 +270,7 @@ static void bitbang_work(struct work_struct *work)
                unsigned                tmp;
                unsigned                cs_change;
                int                     status;
+               int                     do_setup = -1;
 
                m = container_of(bitbang->queue.next, struct spi_message,
                                queue);
@@ -300,13 +296,11 @@ static void bitbang_work(struct work_struct *work)
 
                        /* init (-1) or override (1) transfer params */
                        if (do_setup != 0) {
-                               if (!setup_transfer) {
-                                       status = -ENOPROTOOPT;
-                                       break;
-                               }
-                               status = setup_transfer(spi, t);
+                               status = bitbang->setup_transfer(spi, t);
                                if (status < 0)
                                        break;
+                               if (do_setup == -1)
+                                       do_setup = 0;
                        }
 
                        /* set up default clock polarity, and activate chip;
@@ -367,11 +361,6 @@ static void bitbang_work(struct work_struct *work)
                m->status = status;
                m->complete(m->context);
 
-               /* restore speed and wordsize if it was overridden */
-               if (do_setup == 1)
-                       setup_transfer(spi, NULL);
-               do_setup = 0;
-
                /* normally deactivate chipselect ... unless no error and
                 * cs_change has hinted that the next message will probably
                 * be for this chip too.
@@ -468,6 +457,9 @@ int spi_bitbang_start(struct spi_bitbang *bitbang)
                }
        } else if (!bitbang->master->setup)
                return -EINVAL;
+       if (bitbang->master->transfer == spi_bitbang_transfer &&
+                       !bitbang->setup_transfer)
+               return -EINVAL;
 
        /* this task is the only thing to touch the SPI bits */
        bitbang->busy = 0;