| From db334576de1aeb19d140dacfe3e443b2c849c080 Mon Sep 17 00:00:00 2001 |
| From: Geert Uytterhoeven <geert+renesas@linux-m68k.org> |
| Date: Fri, 24 Jan 2014 09:43:53 +0100 |
| Subject: spi: rspi: Abstract 8/16-bit Data Register access |
| |
| Add rspi_{write,read}_data(), to abstract 8-bit (QSPI, and RSPI on RZ/A1H) |
| versus 16-bit (RSPI) Data Register access. |
| |
| Signed-off-by: Geert Uytterhoeven <geert+renesas@linux-m68k.org> |
| Signed-off-by: Mark Brown <broonie@linaro.org> |
| (cherry picked from commit 74da76865d57161cadf8f324281f23ed3eb5db9c) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/spi/spi-rspi.c | 56 +++++++++++++++++++++++++++++++------------------- |
| 1 file changed, 35 insertions(+), 21 deletions(-) |
| |
| diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c |
| index 0e4d169c90d7..a0bb3c28ae91 100644 |
| --- a/drivers/spi/spi-rspi.c |
| +++ b/drivers/spi/spi-rspi.c |
| @@ -192,6 +192,7 @@ struct rspi_data { |
| |
| unsigned dma_width_16bit:1; |
| unsigned dma_callbacked:1; |
| + unsigned byte_access:1; |
| }; |
| |
| static void rspi_write8(const struct rspi_data *rspi, u8 data, u16 offset) |
| @@ -219,10 +220,25 @@ static u16 rspi_read16(const struct rspi_data *rspi, u16 offset) |
| return ioread16(rspi->addr + offset); |
| } |
| |
| +static void rspi_write_data(const struct rspi_data *rspi, u16 data) |
| +{ |
| + if (rspi->byte_access) |
| + rspi_write8(rspi, data, RSPI_SPDR); |
| + else /* 16 bit */ |
| + rspi_write16(rspi, data, RSPI_SPDR); |
| +} |
| + |
| +static u16 rspi_read_data(const struct rspi_data *rspi) |
| +{ |
| + if (rspi->byte_access) |
| + return rspi_read8(rspi, RSPI_SPDR); |
| + else /* 16 bit */ |
| + return rspi_read16(rspi, RSPI_SPDR); |
| +} |
| + |
| /* optional functions */ |
| struct spi_ops { |
| - int (*set_config_register)(const struct rspi_data *rspi, |
| - int access_size); |
| + int (*set_config_register)(struct rspi_data *rspi, int access_size); |
| int (*send_pio)(struct rspi_data *rspi, struct spi_transfer *t); |
| int (*receive_pio)(struct rspi_data *rspi, struct spi_transfer *t); |
| }; |
| @@ -230,8 +246,7 @@ struct spi_ops { |
| /* |
| * functions for RSPI |
| */ |
| -static int rspi_set_config_register(const struct rspi_data *rspi, |
| - int access_size) |
| +static int rspi_set_config_register(struct rspi_data *rspi, int access_size) |
| { |
| int spbr; |
| |
| @@ -242,8 +257,9 @@ static int rspi_set_config_register(const struct rspi_data *rspi, |
| spbr = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz) - 1; |
| rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR); |
| |
| - /* Sets number of frames to be used: 1 frame */ |
| - rspi_write8(rspi, 0x00, RSPI_SPDCR); |
| + /* Disable dummy transmission, set 16-bit word access, 1 frame */ |
| + rspi_write8(rspi, 0, RSPI_SPDCR); |
| + rspi->byte_access = 0; |
| |
| /* Sets RSPCK, SSL, next-access delay value */ |
| rspi_write8(rspi, 0x00, RSPI_SPCKD); |
| @@ -266,8 +282,7 @@ static int rspi_set_config_register(const struct rspi_data *rspi, |
| /* |
| * functions for QSPI |
| */ |
| -static int qspi_set_config_register(const struct rspi_data *rspi, |
| - int access_size) |
| +static int qspi_set_config_register(struct rspi_data *rspi, int access_size) |
| { |
| u16 spcmd; |
| int spbr; |
| @@ -279,8 +294,9 @@ static int qspi_set_config_register(const struct rspi_data *rspi, |
| spbr = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz); |
| rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR); |
| |
| - /* Sets number of frames to be used: 1 frame */ |
| - rspi_write8(rspi, 0x00, RSPI_SPDCR); |
| + /* Disable dummy transmission, set byte access */ |
| + rspi_write8(rspi, 0, RSPI_SPDCR); |
| + rspi->byte_access = 1; |
| |
| /* Sets RSPCK, SSL, next-access delay value */ |
| rspi_write8(rspi, 0x00, RSPI_SPCKD); |
| @@ -354,7 +370,7 @@ static int rspi_send_pio(struct rspi_data *rspi, struct spi_transfer *t) |
| return -ETIMEDOUT; |
| } |
| |
| - rspi_write16(rspi, *data, RSPI_SPDR); |
| + rspi_write_data(rspi, *data); |
| data++; |
| remain--; |
| } |
| @@ -380,14 +396,14 @@ static int qspi_send_pio(struct rspi_data *rspi, struct spi_transfer *t) |
| "%s: tx empty timeout\n", __func__); |
| return -ETIMEDOUT; |
| } |
| - rspi_write8(rspi, *data++, RSPI_SPDR); |
| + rspi_write_data(rspi, *data++); |
| |
| if (rspi_wait_for_interrupt(rspi, SPSR_SPRF, SPCR_SPRIE) < 0) { |
| dev_err(&rspi->master->dev, |
| "%s: receive timeout\n", __func__); |
| return -ETIMEDOUT; |
| } |
| - rspi_read8(rspi, RSPI_SPDR); |
| + rspi_read_data(rspi); |
| |
| remain--; |
| } |
| @@ -525,7 +541,7 @@ static void rspi_receive_init(const struct rspi_data *rspi) |
| |
| spsr = rspi_read8(rspi, RSPI_SPSR); |
| if (spsr & SPSR_SPRF) |
| - rspi_read16(rspi, RSPI_SPDR); /* dummy read */ |
| + rspi_read_data(rspi); /* dummy read */ |
| if (spsr & SPSR_OVRF) |
| rspi_write8(rspi, rspi_read8(rspi, RSPI_SPSR) & ~SPSR_OVRF, |
| RSPI_SPSR); |
| @@ -549,15 +565,14 @@ static int rspi_receive_pio(struct rspi_data *rspi, struct spi_transfer *t) |
| return -ETIMEDOUT; |
| } |
| /* dummy write for generate clock */ |
| - rspi_write16(rspi, DUMMY_DATA, RSPI_SPDR); |
| + rspi_write_data(rspi, DUMMY_DATA); |
| |
| if (rspi_wait_for_interrupt(rspi, SPSR_SPRF, SPCR_SPRIE) < 0) { |
| dev_err(&rspi->master->dev, |
| "%s: receive timeout\n", __func__); |
| return -ETIMEDOUT; |
| } |
| - /* SPDR allows 16 or 32-bit access only */ |
| - *data = (u8)rspi_read16(rspi, RSPI_SPDR); |
| + *data = rspi_read_data(rspi); |
| |
| data++; |
| remain--; |
| @@ -572,7 +587,7 @@ static void qspi_receive_init(const struct rspi_data *rspi) |
| |
| spsr = rspi_read8(rspi, RSPI_SPSR); |
| if (spsr & SPSR_SPRF) |
| - rspi_read8(rspi, RSPI_SPDR); /* dummy read */ |
| + rspi_read_data(rspi); /* dummy read */ |
| rspi_write8(rspi, SPBFCR_TXRST | SPBFCR_RXRST, QSPI_SPBFCR); |
| rspi_write8(rspi, 0x00, QSPI_SPBFCR); |
| } |
| @@ -593,15 +608,14 @@ static int qspi_receive_pio(struct rspi_data *rspi, struct spi_transfer *t) |
| return -ETIMEDOUT; |
| } |
| /* dummy write for generate clock */ |
| - rspi_write8(rspi, DUMMY_DATA, RSPI_SPDR); |
| + rspi_write_data(rspi, DUMMY_DATA); |
| |
| if (rspi_wait_for_interrupt(rspi, SPSR_SPRF, SPCR_SPRIE) < 0) { |
| dev_err(&rspi->master->dev, |
| "%s: receive timeout\n", __func__); |
| return -ETIMEDOUT; |
| } |
| - /* SPDR allows 8, 16 or 32-bit access */ |
| - *data++ = rspi_read8(rspi, RSPI_SPDR); |
| + *data++ = rspi_read_data(rspi); |
| remain--; |
| } |
| |
| -- |
| 2.1.2 |
| |