mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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
 | 
			
		||||
 * @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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue