diff options
Diffstat (limited to 'drivers/spi/spi-dw-core.c')
| -rw-r--r-- | drivers/spi/spi-dw-core.c | 20 | 
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/spi/spi-dw-core.c b/drivers/spi/spi-dw-core.c index 0274c9295514..ddfdb903047a 100644 --- a/drivers/spi/spi-dw-core.c +++ b/drivers/spi/spi-dw-core.c @@ -6,6 +6,7 @@   */  #include <linux/bitfield.h> +#include <linux/bitops.h>  #include <linux/dma-mapping.h>  #include <linux/interrupt.h>  #include <linux/module.h> @@ -421,10 +422,7 @@ static int dw_spi_transfer_one(struct spi_controller *host,  	int ret;  	dws->dma_mapped = 0; -	dws->n_bytes = -		roundup_pow_of_two(DIV_ROUND_UP(transfer->bits_per_word, -						BITS_PER_BYTE)); - +	dws->n_bytes = roundup_pow_of_two(BITS_TO_BYTES(transfer->bits_per_word));  	dws->tx = (void *)transfer->tx_buf;  	dws->tx_len = transfer->len / dws->n_bytes;  	dws->rx = transfer->rx_buf; @@ -837,6 +835,20 @@ static void dw_spi_hw_init(struct device *dev, struct dw_spi *dws)  	}  	/* +	 * Try to detect the number of native chip-selects if the platform +	 * driver didn't set it up. There can be up to 16 lines configured. +	 */ +	if (!dws->num_cs) { +		u32 ser; + +		dw_writel(dws, DW_SPI_SER, 0xffff); +		ser = dw_readl(dws, DW_SPI_SER); +		dw_writel(dws, DW_SPI_SER, 0); + +		dws->num_cs = hweight16(ser); +	} + +	/*  	 * Try to detect the FIFO depth if not set by interface driver,  	 * the depth could be from 2 to 256 from HW spec  	 */  |