Skip to content

Commit

Permalink
spi: bitbang: Introduce spi_bitbang_init()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
ndreys authored and broonie committed Apr 8, 2019
1 parent 8b79749 commit 45beec3
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 27 deletions.
66 changes: 39 additions & 27 deletions drivers/spi/spi-bitbang.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions include/linux/spi/spi_bitbang.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

0 comments on commit 45beec3

Please sign in to comment.