diff options
| -rw-r--r-- | drivers/mmc/host/mmc_spi.c | 6 | ||||
| -rw-r--r-- | drivers/spi/omap_uwire.c | 2 | ||||
| -rw-r--r-- | include/linux/spi/spi.h | 4 | 
3 files changed, 12 insertions, 0 deletions
diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c index 240608cc7ae..a461017ce5c 100644 --- a/drivers/mmc/host/mmc_spi.c +++ b/drivers/mmc/host/mmc_spi.c @@ -1313,6 +1313,12 @@ static int mmc_spi_probe(struct spi_device *spi)  	struct mmc_spi_host	*host;  	int			status; +	/* We rely on full duplex transfers, mostly to reduce +	 * per-transfer overheads (by making fewer transfers). +	 */ +	if (spi->master->flags & SPI_MASTER_HALF_DUPLEX) +		return -EINVAL; +  	/* MMC and SD specs only seem to care that sampling is on the  	 * rising edge ... meaning SPI modes 0 or 3.  So either SPI mode  	 * should be legit.  We'll use mode 0 since the steady state is 0, diff --git a/drivers/spi/omap_uwire.c b/drivers/spi/omap_uwire.c index aa90ddb3706..8980a5640bd 100644 --- a/drivers/spi/omap_uwire.c +++ b/drivers/spi/omap_uwire.c @@ -514,6 +514,8 @@ static int __init uwire_probe(struct platform_device *pdev)  	/* the spi->mode bits understood by this driver: */  	master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; +	master->flags = SPI_MASTER_HALF_DUPLEX; +  	master->bus_num = 2;	/* "official" */  	master->num_chipselect = 4;  	master->setup = uwire_setup; diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 743c933ac4e..c47c4b4da97 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -250,6 +250,10 @@ struct spi_master {  	/* spi_device.mode flags understood by this controller driver */  	u16			mode_bits; +	/* other constraints relevant to this driver */ +	u16			flags; +#define SPI_MASTER_HALF_DUPLEX	BIT(0)		/* can't do full duplex */ +  	/* Setup mode and clock, etc (spi driver may call many times).  	 *  	 * IMPORTANT:  this may be called when transfers to another  |