spi: bitbang: Introduce spi_bitbang_init()
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>
This commit is contained in:
parent
8b797490b4
commit
45beec3519
2 changed files with 40 additions and 27 deletions
|
@ -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
|
* spi_bitbang_start - start up a polled/bitbanging SPI master driver
|
||||||
* @bitbang: driver handle
|
* @bitbang: driver handle
|
||||||
|
@ -368,33 +404,9 @@ int spi_bitbang_start(struct spi_bitbang *bitbang)
|
||||||
struct spi_master *master = bitbang->master;
|
struct spi_master *master = bitbang->master;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!master || !bitbang->chipselect)
|
ret = spi_bitbang_init(bitbang);
|
||||||
return -EINVAL;
|
if (ret)
|
||||||
|
return ret;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* driver may get busy before register() returns, especially
|
/* driver may get busy before register() returns, especially
|
||||||
* if someone registered boardinfo for devices
|
* if someone registered boardinfo for devices
|
||||||
|
|
|
@ -44,6 +44,7 @@ extern int spi_bitbang_setup_transfer(struct spi_device *spi,
|
||||||
|
|
||||||
/* start or stop queue processing */
|
/* start or stop queue processing */
|
||||||
extern int spi_bitbang_start(struct spi_bitbang *spi);
|
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);
|
extern void spi_bitbang_stop(struct spi_bitbang *spi);
|
||||||
|
|
||||||
#endif /* __SPI_BITBANG_H */
|
#endif /* __SPI_BITBANG_H */
|
||||||
|
|
Loading…
Add table
Reference in a new issue