spi: bitbang: Introduce spi_bitbang_init()
authorAndrey Smirnov <andrew.smirnov@gmail.com>
Wed, 3 Apr 2019 04:01:32 +0000 (21:01 -0700)
committerMark Brown <broonie@kernel.org>
Mon, 8 Apr 2019 07:10:39 +0000 (14:10 +0700)
Move all of the code doing struct spi_bitbang initialization, so that
it can be paired with devm_spi_register_master() in order to avoid
having to call spi_bitbang_stop() explicitly.

Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Cc: Mark Brown <broonie@kernel.org>
Cc: Chris Healy <cphealy@gmail.com>
Cc: linux-spi@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-bitbang.c
include/linux/spi/spi_bitbang.h

index dd9a8c5..4243e53 100644 (file)
@@ -335,6 +335,42 @@ static void spi_bitbang_set_cs(struct spi_device *spi, bool enable)
 
 /*----------------------------------------------------------------------*/
 
+int spi_bitbang_init(struct spi_bitbang *bitbang)
+{
+       struct spi_master *master = bitbang->master;
+
+       if (!master || !bitbang->chipselect)
+               return -EINVAL;
+
+       mutex_init(&bitbang->lock);
+
+       if (!master->mode_bits)
+               master->mode_bits = SPI_CPOL | SPI_CPHA | bitbang->flags;
+
+       if (master->transfer || master->transfer_one_message)
+               return -EINVAL;
+
+       master->prepare_transfer_hardware = spi_bitbang_prepare_hardware;
+       master->unprepare_transfer_hardware = spi_bitbang_unprepare_hardware;
+       master->transfer_one = spi_bitbang_transfer_one;
+       master->set_cs = spi_bitbang_set_cs;
+
+       if (!bitbang->txrx_bufs) {
+               bitbang->use_dma = 0;
+               bitbang->txrx_bufs = spi_bitbang_bufs;
+               if (!master->setup) {
+                       if (!bitbang->setup_transfer)
+                               bitbang->setup_transfer =
+                                        spi_bitbang_setup_transfer;
+                       master->setup = spi_bitbang_setup;
+                       master->cleanup = spi_bitbang_cleanup;
+               }
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(spi_bitbang_init);
+
 /**
  * spi_bitbang_start - start up a polled/bitbanging SPI master driver
  * @bitbang: driver handle
@@ -368,33 +404,9 @@ int spi_bitbang_start(struct spi_bitbang *bitbang)
        struct spi_master *master = bitbang->master;
        int ret;
 
-       if (!master || !bitbang->chipselect)
-               return -EINVAL;
-
-       mutex_init(&bitbang->lock);
-
-       if (!master->mode_bits)
-               master->mode_bits = SPI_CPOL | SPI_CPHA | bitbang->flags;
-
-       if (master->transfer || master->transfer_one_message)
-               return -EINVAL;
-
-       master->prepare_transfer_hardware = spi_bitbang_prepare_hardware;
-       master->unprepare_transfer_hardware = spi_bitbang_unprepare_hardware;
-       master->transfer_one = spi_bitbang_transfer_one;
-       master->set_cs = spi_bitbang_set_cs;
-
-       if (!bitbang->txrx_bufs) {
-               bitbang->use_dma = 0;
-               bitbang->txrx_bufs = spi_bitbang_bufs;
-               if (!master->setup) {
-                       if (!bitbang->setup_transfer)
-                               bitbang->setup_transfer =
-                                        spi_bitbang_setup_transfer;
-                       master->setup = spi_bitbang_setup;
-                       master->cleanup = spi_bitbang_cleanup;
-               }
-       }
+       ret = spi_bitbang_init(bitbang);
+       if (ret)
+               return ret;
 
        /* driver may get busy before register() returns, especially
         * if someone registered boardinfo for devices
index b7e021b..4444c2a 100644 (file)
@@ -44,6 +44,7 @@ extern int spi_bitbang_setup_transfer(struct spi_device *spi,
 
 /* start or stop queue processing */
 extern int spi_bitbang_start(struct spi_bitbang *spi);
+extern int spi_bitbang_init(struct spi_bitbang *spi);
 extern void spi_bitbang_stop(struct spi_bitbang *spi);
 
 #endif /* __SPI_BITBANG_H */