1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef __SPI_BITBANG_H 3*4882a593Smuzhiyun #define __SPI_BITBANG_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/workqueue.h> 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun struct spi_bitbang { 8*4882a593Smuzhiyun struct mutex lock; 9*4882a593Smuzhiyun u8 busy; 10*4882a593Smuzhiyun u8 use_dma; 11*4882a593Smuzhiyun u16 flags; /* extra spi->mode support */ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun struct spi_master *master; 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* setup_transfer() changes clock and/or wordsize to match settings 16*4882a593Smuzhiyun * for this transfer; zeroes restore defaults from spi_device. 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun int (*setup_transfer)(struct spi_device *spi, 19*4882a593Smuzhiyun struct spi_transfer *t); 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun void (*chipselect)(struct spi_device *spi, int is_on); 22*4882a593Smuzhiyun #define BITBANG_CS_ACTIVE 1 /* normally nCS, active low */ 23*4882a593Smuzhiyun #define BITBANG_CS_INACTIVE 0 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* txrx_bufs() may handle dma mapping for transfers that don't 26*4882a593Smuzhiyun * already have one (transfer.{tx,rx}_dma is zero), or use PIO 27*4882a593Smuzhiyun */ 28*4882a593Smuzhiyun int (*txrx_bufs)(struct spi_device *spi, struct spi_transfer *t); 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* txrx_word[SPI_MODE_*]() just looks like a shift register */ 31*4882a593Smuzhiyun u32 (*txrx_word[4])(struct spi_device *spi, 32*4882a593Smuzhiyun unsigned nsecs, 33*4882a593Smuzhiyun u32 word, u8 bits, unsigned flags); 34*4882a593Smuzhiyun int (*set_line_direction)(struct spi_device *spi, bool output); 35*4882a593Smuzhiyun }; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* you can call these default bitbang->master methods from your custom 38*4882a593Smuzhiyun * methods, if you like. 39*4882a593Smuzhiyun */ 40*4882a593Smuzhiyun extern int spi_bitbang_setup(struct spi_device *spi); 41*4882a593Smuzhiyun extern void spi_bitbang_cleanup(struct spi_device *spi); 42*4882a593Smuzhiyun extern int spi_bitbang_setup_transfer(struct spi_device *spi, 43*4882a593Smuzhiyun struct spi_transfer *t); 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* start or stop queue processing */ 46*4882a593Smuzhiyun extern int spi_bitbang_start(struct spi_bitbang *spi); 47*4882a593Smuzhiyun extern int spi_bitbang_init(struct spi_bitbang *spi); 48*4882a593Smuzhiyun extern void spi_bitbang_stop(struct spi_bitbang *spi); 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #endif /* __SPI_BITBANG_H */ 51