18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * polling/bitbanging SPI master controller driver utilities
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include <linux/spinlock.h>
78c2ecf20Sopenharmony_ci#include <linux/workqueue.h>
88c2ecf20Sopenharmony_ci#include <linux/interrupt.h>
98c2ecf20Sopenharmony_ci#include <linux/module.h>
108c2ecf20Sopenharmony_ci#include <linux/delay.h>
118c2ecf20Sopenharmony_ci#include <linux/errno.h>
128c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
138c2ecf20Sopenharmony_ci#include <linux/slab.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include <linux/spi/spi.h>
168c2ecf20Sopenharmony_ci#include <linux/spi/spi_bitbang.h>
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#define SPI_BITBANG_CS_DELAY	100
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci/*----------------------------------------------------------------------*/
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci/*
248c2ecf20Sopenharmony_ci * FIRST PART (OPTIONAL):  word-at-a-time spi_transfer support.
258c2ecf20Sopenharmony_ci * Use this for GPIO or shift-register level hardware APIs.
268c2ecf20Sopenharmony_ci *
278c2ecf20Sopenharmony_ci * spi_bitbang_cs is in spi_device->controller_state, which is unavailable
288c2ecf20Sopenharmony_ci * to glue code.  These bitbang setup() and cleanup() routines are always
298c2ecf20Sopenharmony_ci * used, though maybe they're called from controller-aware code.
308c2ecf20Sopenharmony_ci *
318c2ecf20Sopenharmony_ci * chipselect() and friends may use spi_device->controller_data and
328c2ecf20Sopenharmony_ci * controller registers as appropriate.
338c2ecf20Sopenharmony_ci *
348c2ecf20Sopenharmony_ci *
358c2ecf20Sopenharmony_ci * NOTE:  SPI controller pins can often be used as GPIO pins instead,
368c2ecf20Sopenharmony_ci * which means you could use a bitbang driver either to get hardware
378c2ecf20Sopenharmony_ci * working quickly, or testing for differences that aren't speed related.
388c2ecf20Sopenharmony_ci */
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_cistruct spi_bitbang_cs {
418c2ecf20Sopenharmony_ci	unsigned	nsecs;	/* (clock cycle time)/2 */
428c2ecf20Sopenharmony_ci	u32		(*txrx_word)(struct spi_device *spi, unsigned nsecs,
438c2ecf20Sopenharmony_ci					u32 word, u8 bits, unsigned flags);
448c2ecf20Sopenharmony_ci	unsigned	(*txrx_bufs)(struct spi_device *,
458c2ecf20Sopenharmony_ci					u32 (*txrx_word)(
468c2ecf20Sopenharmony_ci						struct spi_device *spi,
478c2ecf20Sopenharmony_ci						unsigned nsecs,
488c2ecf20Sopenharmony_ci						u32 word, u8 bits,
498c2ecf20Sopenharmony_ci						unsigned flags),
508c2ecf20Sopenharmony_ci					unsigned, struct spi_transfer *,
518c2ecf20Sopenharmony_ci					unsigned);
528c2ecf20Sopenharmony_ci};
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_cistatic unsigned bitbang_txrx_8(
558c2ecf20Sopenharmony_ci	struct spi_device	*spi,
568c2ecf20Sopenharmony_ci	u32			(*txrx_word)(struct spi_device *spi,
578c2ecf20Sopenharmony_ci					unsigned nsecs,
588c2ecf20Sopenharmony_ci					u32 word, u8 bits,
598c2ecf20Sopenharmony_ci					unsigned flags),
608c2ecf20Sopenharmony_ci	unsigned		ns,
618c2ecf20Sopenharmony_ci	struct spi_transfer	*t,
628c2ecf20Sopenharmony_ci	unsigned flags
638c2ecf20Sopenharmony_ci) {
648c2ecf20Sopenharmony_ci	unsigned		bits = t->bits_per_word;
658c2ecf20Sopenharmony_ci	unsigned		count = t->len;
668c2ecf20Sopenharmony_ci	const u8		*tx = t->tx_buf;
678c2ecf20Sopenharmony_ci	u8			*rx = t->rx_buf;
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci	while (likely(count > 0)) {
708c2ecf20Sopenharmony_ci		u8		word = 0;
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci		if (tx)
738c2ecf20Sopenharmony_ci			word = *tx++;
748c2ecf20Sopenharmony_ci		word = txrx_word(spi, ns, word, bits, flags);
758c2ecf20Sopenharmony_ci		if (rx)
768c2ecf20Sopenharmony_ci			*rx++ = word;
778c2ecf20Sopenharmony_ci		count -= 1;
788c2ecf20Sopenharmony_ci	}
798c2ecf20Sopenharmony_ci	return t->len - count;
808c2ecf20Sopenharmony_ci}
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_cistatic unsigned bitbang_txrx_16(
838c2ecf20Sopenharmony_ci	struct spi_device	*spi,
848c2ecf20Sopenharmony_ci	u32			(*txrx_word)(struct spi_device *spi,
858c2ecf20Sopenharmony_ci					unsigned nsecs,
868c2ecf20Sopenharmony_ci					u32 word, u8 bits,
878c2ecf20Sopenharmony_ci					unsigned flags),
888c2ecf20Sopenharmony_ci	unsigned		ns,
898c2ecf20Sopenharmony_ci	struct spi_transfer	*t,
908c2ecf20Sopenharmony_ci	unsigned flags
918c2ecf20Sopenharmony_ci) {
928c2ecf20Sopenharmony_ci	unsigned		bits = t->bits_per_word;
938c2ecf20Sopenharmony_ci	unsigned		count = t->len;
948c2ecf20Sopenharmony_ci	const u16		*tx = t->tx_buf;
958c2ecf20Sopenharmony_ci	u16			*rx = t->rx_buf;
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci	while (likely(count > 1)) {
988c2ecf20Sopenharmony_ci		u16		word = 0;
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci		if (tx)
1018c2ecf20Sopenharmony_ci			word = *tx++;
1028c2ecf20Sopenharmony_ci		word = txrx_word(spi, ns, word, bits, flags);
1038c2ecf20Sopenharmony_ci		if (rx)
1048c2ecf20Sopenharmony_ci			*rx++ = word;
1058c2ecf20Sopenharmony_ci		count -= 2;
1068c2ecf20Sopenharmony_ci	}
1078c2ecf20Sopenharmony_ci	return t->len - count;
1088c2ecf20Sopenharmony_ci}
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_cistatic unsigned bitbang_txrx_32(
1118c2ecf20Sopenharmony_ci	struct spi_device	*spi,
1128c2ecf20Sopenharmony_ci	u32			(*txrx_word)(struct spi_device *spi,
1138c2ecf20Sopenharmony_ci					unsigned nsecs,
1148c2ecf20Sopenharmony_ci					u32 word, u8 bits,
1158c2ecf20Sopenharmony_ci					unsigned flags),
1168c2ecf20Sopenharmony_ci	unsigned		ns,
1178c2ecf20Sopenharmony_ci	struct spi_transfer	*t,
1188c2ecf20Sopenharmony_ci	unsigned flags
1198c2ecf20Sopenharmony_ci) {
1208c2ecf20Sopenharmony_ci	unsigned		bits = t->bits_per_word;
1218c2ecf20Sopenharmony_ci	unsigned		count = t->len;
1228c2ecf20Sopenharmony_ci	const u32		*tx = t->tx_buf;
1238c2ecf20Sopenharmony_ci	u32			*rx = t->rx_buf;
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci	while (likely(count > 3)) {
1268c2ecf20Sopenharmony_ci		u32		word = 0;
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_ci		if (tx)
1298c2ecf20Sopenharmony_ci			word = *tx++;
1308c2ecf20Sopenharmony_ci		word = txrx_word(spi, ns, word, bits, flags);
1318c2ecf20Sopenharmony_ci		if (rx)
1328c2ecf20Sopenharmony_ci			*rx++ = word;
1338c2ecf20Sopenharmony_ci		count -= 4;
1348c2ecf20Sopenharmony_ci	}
1358c2ecf20Sopenharmony_ci	return t->len - count;
1368c2ecf20Sopenharmony_ci}
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_ciint spi_bitbang_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
1398c2ecf20Sopenharmony_ci{
1408c2ecf20Sopenharmony_ci	struct spi_bitbang_cs	*cs = spi->controller_state;
1418c2ecf20Sopenharmony_ci	u8			bits_per_word;
1428c2ecf20Sopenharmony_ci	u32			hz;
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_ci	if (t) {
1458c2ecf20Sopenharmony_ci		bits_per_word = t->bits_per_word;
1468c2ecf20Sopenharmony_ci		hz = t->speed_hz;
1478c2ecf20Sopenharmony_ci	} else {
1488c2ecf20Sopenharmony_ci		bits_per_word = 0;
1498c2ecf20Sopenharmony_ci		hz = 0;
1508c2ecf20Sopenharmony_ci	}
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci	/* spi_transfer level calls that work per-word */
1538c2ecf20Sopenharmony_ci	if (!bits_per_word)
1548c2ecf20Sopenharmony_ci		bits_per_word = spi->bits_per_word;
1558c2ecf20Sopenharmony_ci	if (bits_per_word <= 8)
1568c2ecf20Sopenharmony_ci		cs->txrx_bufs = bitbang_txrx_8;
1578c2ecf20Sopenharmony_ci	else if (bits_per_word <= 16)
1588c2ecf20Sopenharmony_ci		cs->txrx_bufs = bitbang_txrx_16;
1598c2ecf20Sopenharmony_ci	else if (bits_per_word <= 32)
1608c2ecf20Sopenharmony_ci		cs->txrx_bufs = bitbang_txrx_32;
1618c2ecf20Sopenharmony_ci	else
1628c2ecf20Sopenharmony_ci		return -EINVAL;
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_ci	/* nsecs = (clock period)/2 */
1658c2ecf20Sopenharmony_ci	if (!hz)
1668c2ecf20Sopenharmony_ci		hz = spi->max_speed_hz;
1678c2ecf20Sopenharmony_ci	if (hz) {
1688c2ecf20Sopenharmony_ci		cs->nsecs = (1000000000/2) / hz;
1698c2ecf20Sopenharmony_ci		if (cs->nsecs > (MAX_UDELAY_MS * 1000 * 1000))
1708c2ecf20Sopenharmony_ci			return -EINVAL;
1718c2ecf20Sopenharmony_ci	}
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ci	return 0;
1748c2ecf20Sopenharmony_ci}
1758c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_bitbang_setup_transfer);
1768c2ecf20Sopenharmony_ci
1778c2ecf20Sopenharmony_ci/*
1788c2ecf20Sopenharmony_ci * spi_bitbang_setup - default setup for per-word I/O loops
1798c2ecf20Sopenharmony_ci */
1808c2ecf20Sopenharmony_ciint spi_bitbang_setup(struct spi_device *spi)
1818c2ecf20Sopenharmony_ci{
1828c2ecf20Sopenharmony_ci	struct spi_bitbang_cs	*cs = spi->controller_state;
1838c2ecf20Sopenharmony_ci	struct spi_bitbang	*bitbang;
1848c2ecf20Sopenharmony_ci	bool			initial_setup = false;
1858c2ecf20Sopenharmony_ci	int			retval;
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_ci	bitbang = spi_master_get_devdata(spi->master);
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ci	if (!cs) {
1908c2ecf20Sopenharmony_ci		cs = kzalloc(sizeof(*cs), GFP_KERNEL);
1918c2ecf20Sopenharmony_ci		if (!cs)
1928c2ecf20Sopenharmony_ci			return -ENOMEM;
1938c2ecf20Sopenharmony_ci		spi->controller_state = cs;
1948c2ecf20Sopenharmony_ci		initial_setup = true;
1958c2ecf20Sopenharmony_ci	}
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_ci	/* per-word shift register access, in hardware or bitbanging */
1988c2ecf20Sopenharmony_ci	cs->txrx_word = bitbang->txrx_word[spi->mode & (SPI_CPOL|SPI_CPHA)];
1998c2ecf20Sopenharmony_ci	if (!cs->txrx_word) {
2008c2ecf20Sopenharmony_ci		retval = -EINVAL;
2018c2ecf20Sopenharmony_ci		goto err_free;
2028c2ecf20Sopenharmony_ci	}
2038c2ecf20Sopenharmony_ci
2048c2ecf20Sopenharmony_ci	if (bitbang->setup_transfer) {
2058c2ecf20Sopenharmony_ci		retval = bitbang->setup_transfer(spi, NULL);
2068c2ecf20Sopenharmony_ci		if (retval < 0)
2078c2ecf20Sopenharmony_ci			goto err_free;
2088c2ecf20Sopenharmony_ci	}
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_ci	dev_dbg(&spi->dev, "%s, %u nsec/bit\n", __func__, 2 * cs->nsecs);
2118c2ecf20Sopenharmony_ci
2128c2ecf20Sopenharmony_ci	return 0;
2138c2ecf20Sopenharmony_ci
2148c2ecf20Sopenharmony_cierr_free:
2158c2ecf20Sopenharmony_ci	if (initial_setup)
2168c2ecf20Sopenharmony_ci		kfree(cs);
2178c2ecf20Sopenharmony_ci	return retval;
2188c2ecf20Sopenharmony_ci}
2198c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_bitbang_setup);
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_ci/*
2228c2ecf20Sopenharmony_ci * spi_bitbang_cleanup - default cleanup for per-word I/O loops
2238c2ecf20Sopenharmony_ci */
2248c2ecf20Sopenharmony_civoid spi_bitbang_cleanup(struct spi_device *spi)
2258c2ecf20Sopenharmony_ci{
2268c2ecf20Sopenharmony_ci	kfree(spi->controller_state);
2278c2ecf20Sopenharmony_ci}
2288c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_bitbang_cleanup);
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_cistatic int spi_bitbang_bufs(struct spi_device *spi, struct spi_transfer *t)
2318c2ecf20Sopenharmony_ci{
2328c2ecf20Sopenharmony_ci	struct spi_bitbang_cs	*cs = spi->controller_state;
2338c2ecf20Sopenharmony_ci	unsigned		nsecs = cs->nsecs;
2348c2ecf20Sopenharmony_ci	struct spi_bitbang	*bitbang;
2358c2ecf20Sopenharmony_ci
2368c2ecf20Sopenharmony_ci	bitbang = spi_master_get_devdata(spi->master);
2378c2ecf20Sopenharmony_ci	if (bitbang->set_line_direction) {
2388c2ecf20Sopenharmony_ci		int err;
2398c2ecf20Sopenharmony_ci
2408c2ecf20Sopenharmony_ci		err = bitbang->set_line_direction(spi, !!(t->tx_buf));
2418c2ecf20Sopenharmony_ci		if (err < 0)
2428c2ecf20Sopenharmony_ci			return err;
2438c2ecf20Sopenharmony_ci	}
2448c2ecf20Sopenharmony_ci
2458c2ecf20Sopenharmony_ci	if (spi->mode & SPI_3WIRE) {
2468c2ecf20Sopenharmony_ci		unsigned flags;
2478c2ecf20Sopenharmony_ci
2488c2ecf20Sopenharmony_ci		flags = t->tx_buf ? SPI_MASTER_NO_RX : SPI_MASTER_NO_TX;
2498c2ecf20Sopenharmony_ci		return cs->txrx_bufs(spi, cs->txrx_word, nsecs, t, flags);
2508c2ecf20Sopenharmony_ci	}
2518c2ecf20Sopenharmony_ci	return cs->txrx_bufs(spi, cs->txrx_word, nsecs, t, 0);
2528c2ecf20Sopenharmony_ci}
2538c2ecf20Sopenharmony_ci
2548c2ecf20Sopenharmony_ci/*----------------------------------------------------------------------*/
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_ci/*
2578c2ecf20Sopenharmony_ci * SECOND PART ... simple transfer queue runner.
2588c2ecf20Sopenharmony_ci *
2598c2ecf20Sopenharmony_ci * This costs a task context per controller, running the queue by
2608c2ecf20Sopenharmony_ci * performing each transfer in sequence.  Smarter hardware can queue
2618c2ecf20Sopenharmony_ci * several DMA transfers at once, and process several controller queues
2628c2ecf20Sopenharmony_ci * in parallel; this driver doesn't match such hardware very well.
2638c2ecf20Sopenharmony_ci *
2648c2ecf20Sopenharmony_ci * Drivers can provide word-at-a-time i/o primitives, or provide
2658c2ecf20Sopenharmony_ci * transfer-at-a-time ones to leverage dma or fifo hardware.
2668c2ecf20Sopenharmony_ci */
2678c2ecf20Sopenharmony_ci
2688c2ecf20Sopenharmony_cistatic int spi_bitbang_prepare_hardware(struct spi_master *spi)
2698c2ecf20Sopenharmony_ci{
2708c2ecf20Sopenharmony_ci	struct spi_bitbang	*bitbang;
2718c2ecf20Sopenharmony_ci
2728c2ecf20Sopenharmony_ci	bitbang = spi_master_get_devdata(spi);
2738c2ecf20Sopenharmony_ci
2748c2ecf20Sopenharmony_ci	mutex_lock(&bitbang->lock);
2758c2ecf20Sopenharmony_ci	bitbang->busy = 1;
2768c2ecf20Sopenharmony_ci	mutex_unlock(&bitbang->lock);
2778c2ecf20Sopenharmony_ci
2788c2ecf20Sopenharmony_ci	return 0;
2798c2ecf20Sopenharmony_ci}
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_cistatic int spi_bitbang_transfer_one(struct spi_master *master,
2828c2ecf20Sopenharmony_ci				    struct spi_device *spi,
2838c2ecf20Sopenharmony_ci				    struct spi_transfer *transfer)
2848c2ecf20Sopenharmony_ci{
2858c2ecf20Sopenharmony_ci	struct spi_bitbang *bitbang = spi_master_get_devdata(master);
2868c2ecf20Sopenharmony_ci	int status = 0;
2878c2ecf20Sopenharmony_ci
2888c2ecf20Sopenharmony_ci	if (bitbang->setup_transfer) {
2898c2ecf20Sopenharmony_ci		status = bitbang->setup_transfer(spi, transfer);
2908c2ecf20Sopenharmony_ci		if (status < 0)
2918c2ecf20Sopenharmony_ci			goto out;
2928c2ecf20Sopenharmony_ci	}
2938c2ecf20Sopenharmony_ci
2948c2ecf20Sopenharmony_ci	if (transfer->len)
2958c2ecf20Sopenharmony_ci		status = bitbang->txrx_bufs(spi, transfer);
2968c2ecf20Sopenharmony_ci
2978c2ecf20Sopenharmony_ci	if (status == transfer->len)
2988c2ecf20Sopenharmony_ci		status = 0;
2998c2ecf20Sopenharmony_ci	else if (status >= 0)
3008c2ecf20Sopenharmony_ci		status = -EREMOTEIO;
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_ciout:
3038c2ecf20Sopenharmony_ci	spi_finalize_current_transfer(master);
3048c2ecf20Sopenharmony_ci
3058c2ecf20Sopenharmony_ci	return status;
3068c2ecf20Sopenharmony_ci}
3078c2ecf20Sopenharmony_ci
3088c2ecf20Sopenharmony_cistatic int spi_bitbang_unprepare_hardware(struct spi_master *spi)
3098c2ecf20Sopenharmony_ci{
3108c2ecf20Sopenharmony_ci	struct spi_bitbang	*bitbang;
3118c2ecf20Sopenharmony_ci
3128c2ecf20Sopenharmony_ci	bitbang = spi_master_get_devdata(spi);
3138c2ecf20Sopenharmony_ci
3148c2ecf20Sopenharmony_ci	mutex_lock(&bitbang->lock);
3158c2ecf20Sopenharmony_ci	bitbang->busy = 0;
3168c2ecf20Sopenharmony_ci	mutex_unlock(&bitbang->lock);
3178c2ecf20Sopenharmony_ci
3188c2ecf20Sopenharmony_ci	return 0;
3198c2ecf20Sopenharmony_ci}
3208c2ecf20Sopenharmony_ci
3218c2ecf20Sopenharmony_cistatic void spi_bitbang_set_cs(struct spi_device *spi, bool enable)
3228c2ecf20Sopenharmony_ci{
3238c2ecf20Sopenharmony_ci	struct spi_bitbang *bitbang = spi_master_get_devdata(spi->master);
3248c2ecf20Sopenharmony_ci
3258c2ecf20Sopenharmony_ci	/* SPI core provides CS high / low, but bitbang driver
3268c2ecf20Sopenharmony_ci	 * expects CS active
3278c2ecf20Sopenharmony_ci	 * spi device driver takes care of handling SPI_CS_HIGH
3288c2ecf20Sopenharmony_ci	 */
3298c2ecf20Sopenharmony_ci	enable = (!!(spi->mode & SPI_CS_HIGH) == enable);
3308c2ecf20Sopenharmony_ci
3318c2ecf20Sopenharmony_ci	ndelay(SPI_BITBANG_CS_DELAY);
3328c2ecf20Sopenharmony_ci	bitbang->chipselect(spi, enable ? BITBANG_CS_ACTIVE :
3338c2ecf20Sopenharmony_ci			    BITBANG_CS_INACTIVE);
3348c2ecf20Sopenharmony_ci	ndelay(SPI_BITBANG_CS_DELAY);
3358c2ecf20Sopenharmony_ci}
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_ci/*----------------------------------------------------------------------*/
3388c2ecf20Sopenharmony_ci
3398c2ecf20Sopenharmony_ciint spi_bitbang_init(struct spi_bitbang *bitbang)
3408c2ecf20Sopenharmony_ci{
3418c2ecf20Sopenharmony_ci	struct spi_master *master = bitbang->master;
3428c2ecf20Sopenharmony_ci	bool custom_cs;
3438c2ecf20Sopenharmony_ci
3448c2ecf20Sopenharmony_ci	if (!master)
3458c2ecf20Sopenharmony_ci		return -EINVAL;
3468c2ecf20Sopenharmony_ci	/*
3478c2ecf20Sopenharmony_ci	 * We only need the chipselect callback if we are actually using it.
3488c2ecf20Sopenharmony_ci	 * If we just use GPIO descriptors, it is surplus. If the
3498c2ecf20Sopenharmony_ci	 * SPI_MASTER_GPIO_SS flag is set, we always need to call the
3508c2ecf20Sopenharmony_ci	 * driver-specific chipselect routine.
3518c2ecf20Sopenharmony_ci	 */
3528c2ecf20Sopenharmony_ci	custom_cs = (!master->use_gpio_descriptors ||
3538c2ecf20Sopenharmony_ci		     (master->flags & SPI_MASTER_GPIO_SS));
3548c2ecf20Sopenharmony_ci
3558c2ecf20Sopenharmony_ci	if (custom_cs && !bitbang->chipselect)
3568c2ecf20Sopenharmony_ci		return -EINVAL;
3578c2ecf20Sopenharmony_ci
3588c2ecf20Sopenharmony_ci	mutex_init(&bitbang->lock);
3598c2ecf20Sopenharmony_ci
3608c2ecf20Sopenharmony_ci	if (!master->mode_bits)
3618c2ecf20Sopenharmony_ci		master->mode_bits = SPI_CPOL | SPI_CPHA | bitbang->flags;
3628c2ecf20Sopenharmony_ci
3638c2ecf20Sopenharmony_ci	if (master->transfer || master->transfer_one_message)
3648c2ecf20Sopenharmony_ci		return -EINVAL;
3658c2ecf20Sopenharmony_ci
3668c2ecf20Sopenharmony_ci	master->prepare_transfer_hardware = spi_bitbang_prepare_hardware;
3678c2ecf20Sopenharmony_ci	master->unprepare_transfer_hardware = spi_bitbang_unprepare_hardware;
3688c2ecf20Sopenharmony_ci	master->transfer_one = spi_bitbang_transfer_one;
3698c2ecf20Sopenharmony_ci	/*
3708c2ecf20Sopenharmony_ci	 * When using GPIO descriptors, the ->set_cs() callback doesn't even
3718c2ecf20Sopenharmony_ci	 * get called unless SPI_MASTER_GPIO_SS is set.
3728c2ecf20Sopenharmony_ci	 */
3738c2ecf20Sopenharmony_ci	if (custom_cs)
3748c2ecf20Sopenharmony_ci		master->set_cs = spi_bitbang_set_cs;
3758c2ecf20Sopenharmony_ci
3768c2ecf20Sopenharmony_ci	if (!bitbang->txrx_bufs) {
3778c2ecf20Sopenharmony_ci		bitbang->use_dma = 0;
3788c2ecf20Sopenharmony_ci		bitbang->txrx_bufs = spi_bitbang_bufs;
3798c2ecf20Sopenharmony_ci		if (!master->setup) {
3808c2ecf20Sopenharmony_ci			if (!bitbang->setup_transfer)
3818c2ecf20Sopenharmony_ci				bitbang->setup_transfer =
3828c2ecf20Sopenharmony_ci					 spi_bitbang_setup_transfer;
3838c2ecf20Sopenharmony_ci			master->setup = spi_bitbang_setup;
3848c2ecf20Sopenharmony_ci			master->cleanup = spi_bitbang_cleanup;
3858c2ecf20Sopenharmony_ci		}
3868c2ecf20Sopenharmony_ci	}
3878c2ecf20Sopenharmony_ci
3888c2ecf20Sopenharmony_ci	return 0;
3898c2ecf20Sopenharmony_ci}
3908c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_bitbang_init);
3918c2ecf20Sopenharmony_ci
3928c2ecf20Sopenharmony_ci/**
3938c2ecf20Sopenharmony_ci * spi_bitbang_start - start up a polled/bitbanging SPI master driver
3948c2ecf20Sopenharmony_ci * @bitbang: driver handle
3958c2ecf20Sopenharmony_ci *
3968c2ecf20Sopenharmony_ci * Caller should have zero-initialized all parts of the structure, and then
3978c2ecf20Sopenharmony_ci * provided callbacks for chip selection and I/O loops.  If the master has
3988c2ecf20Sopenharmony_ci * a transfer method, its final step should call spi_bitbang_transfer; or,
3998c2ecf20Sopenharmony_ci * that's the default if the transfer routine is not initialized.  It should
4008c2ecf20Sopenharmony_ci * also set up the bus number and number of chipselects.
4018c2ecf20Sopenharmony_ci *
4028c2ecf20Sopenharmony_ci * For i/o loops, provide callbacks either per-word (for bitbanging, or for
4038c2ecf20Sopenharmony_ci * hardware that basically exposes a shift register) or per-spi_transfer
4048c2ecf20Sopenharmony_ci * (which takes better advantage of hardware like fifos or DMA engines).
4058c2ecf20Sopenharmony_ci *
4068c2ecf20Sopenharmony_ci * Drivers using per-word I/O loops should use (or call) spi_bitbang_setup,
4078c2ecf20Sopenharmony_ci * spi_bitbang_cleanup and spi_bitbang_setup_transfer to handle those spi
4088c2ecf20Sopenharmony_ci * master methods.  Those methods are the defaults if the bitbang->txrx_bufs
4098c2ecf20Sopenharmony_ci * routine isn't initialized.
4108c2ecf20Sopenharmony_ci *
4118c2ecf20Sopenharmony_ci * This routine registers the spi_master, which will process requests in a
4128c2ecf20Sopenharmony_ci * dedicated task, keeping IRQs unblocked most of the time.  To stop
4138c2ecf20Sopenharmony_ci * processing those requests, call spi_bitbang_stop().
4148c2ecf20Sopenharmony_ci *
4158c2ecf20Sopenharmony_ci * On success, this routine will take a reference to master. The caller is
4168c2ecf20Sopenharmony_ci * responsible for calling spi_bitbang_stop() to decrement the reference and
4178c2ecf20Sopenharmony_ci * spi_master_put() as counterpart of spi_alloc_master() to prevent a memory
4188c2ecf20Sopenharmony_ci * leak.
4198c2ecf20Sopenharmony_ci */
4208c2ecf20Sopenharmony_ciint spi_bitbang_start(struct spi_bitbang *bitbang)
4218c2ecf20Sopenharmony_ci{
4228c2ecf20Sopenharmony_ci	struct spi_master *master = bitbang->master;
4238c2ecf20Sopenharmony_ci	int ret;
4248c2ecf20Sopenharmony_ci
4258c2ecf20Sopenharmony_ci	ret = spi_bitbang_init(bitbang);
4268c2ecf20Sopenharmony_ci	if (ret)
4278c2ecf20Sopenharmony_ci		return ret;
4288c2ecf20Sopenharmony_ci
4298c2ecf20Sopenharmony_ci	/* driver may get busy before register() returns, especially
4308c2ecf20Sopenharmony_ci	 * if someone registered boardinfo for devices
4318c2ecf20Sopenharmony_ci	 */
4328c2ecf20Sopenharmony_ci	ret = spi_register_master(spi_master_get(master));
4338c2ecf20Sopenharmony_ci	if (ret)
4348c2ecf20Sopenharmony_ci		spi_master_put(master);
4358c2ecf20Sopenharmony_ci
4368c2ecf20Sopenharmony_ci	return ret;
4378c2ecf20Sopenharmony_ci}
4388c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_bitbang_start);
4398c2ecf20Sopenharmony_ci
4408c2ecf20Sopenharmony_ci/*
4418c2ecf20Sopenharmony_ci * spi_bitbang_stop - stops the task providing spi communication
4428c2ecf20Sopenharmony_ci */
4438c2ecf20Sopenharmony_civoid spi_bitbang_stop(struct spi_bitbang *bitbang)
4448c2ecf20Sopenharmony_ci{
4458c2ecf20Sopenharmony_ci	spi_unregister_master(bitbang->master);
4468c2ecf20Sopenharmony_ci}
4478c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(spi_bitbang_stop);
4488c2ecf20Sopenharmony_ci
4498c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL");
4508c2ecf20Sopenharmony_ci
451