spi/bitbang: check for setup_transfer during initialization
authorSascha Hauer <s.hauer@pengutronix.de>
Tue, 8 Feb 2011 09:46:14 +0000 (10:46 +0100)
committerGrant Likely <grant.likely@secretlab.ca>
Tue, 15 Feb 2011 22:05:58 +0000 (15:05 -0700)
setup_transfer is mandatory if spi_bitbang_transfer is used, so
check for it during initialization and not each time during runtime.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
drivers/spi/spi_bitbang.c

index 8b55724d5f390152b7005d15b667f4f18f8ac788..14a63f6010d1bfda52ea7b125c8571fab457615b 100644 (file)
@@ -259,10 +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                     (*setup_transfer)(struct spi_device *,
-                                       struct spi_transfer *);
-
-       setup_transfer = bitbang->setup_transfer;
 
        spin_lock_irqsave(&bitbang->lock, flags);
        bitbang->busy = 1;
@@ -300,11 +296,7 @@ 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)
@@ -465,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;