diff options
Diffstat (limited to 'drivers/spi/spi-sprd.c')
| -rw-r--r-- | drivers/spi/spi-sprd.c | 17 | 
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/spi/spi-sprd.c b/drivers/spi/spi-sprd.c index 8c9021b7f7a9..6678f1cbc566 100644 --- a/drivers/spi/spi-sprd.c +++ b/drivers/spi/spi-sprd.c @@ -669,12 +669,16 @@ static void sprd_spi_set_speed(struct sprd_spi *ss, u32 speed_hz)  	writel_relaxed(clk_div, ss->base + SPRD_SPI_CLKD);  } -static void sprd_spi_init_hw(struct sprd_spi *ss, struct spi_transfer *t) +static int sprd_spi_init_hw(struct sprd_spi *ss, struct spi_transfer *t)  { +	struct spi_delay *d = &t->word_delay;  	u16 word_delay, interval;  	u32 val; -	val = readl_relaxed(ss->base + SPRD_SPI_CTL7); +	if (d->unit != SPI_DELAY_UNIT_SCK) +		return -EINVAL; + +	val = readl_relaxed(ss->base + SPRD_SPI_CTL0);  	val &= ~(SPRD_SPI_SCK_REV | SPRD_SPI_NG_TX | SPRD_SPI_NG_RX);  	/* Set default chip selection, clock phase and clock polarity */  	val |= ss->hw_mode & SPI_CPHA ? SPRD_SPI_NG_RX : SPRD_SPI_NG_TX; @@ -686,7 +690,7 @@ static void sprd_spi_init_hw(struct sprd_spi *ss, struct spi_transfer *t)  	 * formula as below per datasheet:  	 * interval time (source clock cycles) = interval * 4 + 10.  	 */ -	word_delay = clamp_t(u16, t->word_delay, SPRD_SPI_MIN_DELAY_CYCLE, +	word_delay = clamp_t(u16, d->value, SPRD_SPI_MIN_DELAY_CYCLE,  			     SPRD_SPI_MAX_DELAY_CYCLE);  	interval = DIV_ROUND_UP(word_delay - 10, 4);  	ss->word_delay = interval * 4 + 10; @@ -711,6 +715,8 @@ static void sprd_spi_init_hw(struct sprd_spi *ss, struct spi_transfer *t)  		val &= ~SPRD_SPI_DATA_LINE2_EN;  	writel_relaxed(val, ss->base + SPRD_SPI_CTL7); + +	return 0;  }  static int sprd_spi_setup_transfer(struct spi_device *sdev, @@ -719,13 +725,16 @@ static int sprd_spi_setup_transfer(struct spi_device *sdev,  	struct sprd_spi *ss = spi_controller_get_devdata(sdev->controller);  	u8 bits_per_word = t->bits_per_word;  	u32 val, mode = 0; +	int ret;  	ss->len = t->len;  	ss->tx_buf = t->tx_buf;  	ss->rx_buf = t->rx_buf;  	ss->hw_mode = sdev->mode; -	sprd_spi_init_hw(ss, t); +	ret = sprd_spi_init_hw(ss, t); +	if (ret) +		return ret;  	/* Set tansfer speed and valid bits */  	sprd_spi_set_speed(ss, t->speed_hz);  |