spi: mpc8xxx: Use IO accessors

Accesses to the register map are currently done by directly reading and
writing the structure.

Switch to the appropriate IO accessors instead.

Signed-off-by: Mario Six <mario.six@gdsys.cc>
Acked-by: Jagan Teki <jagan@amarulasolutions.com>
This commit is contained in:
Mario Six 2019-04-29 01:58:42 +05:30 committed by Jagan Teki
parent 6ea9395bf7
commit 1a907e41dc

View file

@ -58,21 +58,21 @@ void spi_free_slave(struct spi_slave *slave)
void spi_init(void) void spi_init(void)
{ {
volatile spi8xxx_t *spi = &((immap_t *) (CONFIG_SYS_IMMR))->spi; spi8xxx_t *spi = &((immap_t *)(CONFIG_SYS_IMMR))->spi;
/* /*
* SPI pins on the MPC83xx are not muxed, so all we do is initialize * SPI pins on the MPC83xx are not muxed, so all we do is initialize
* some registers * some registers
*/ */
spi->mode = SPI_MODE_REV | SPI_MODE_MS | SPI_MODE_EN; out_be32(&spi->mode, SPI_MODE_REV | SPI_MODE_MS | SPI_MODE_EN);
/* Use SYSCLK / 8 (16.67MHz typ.) */ /* Use SYSCLK / 8 (16.67MHz typ.) */
spi->mode = (spi->mode & 0xfff0ffff) | BIT(16); clrsetbits_be32(&spi->mode, 0x000f0000, BIT(16));
/* Clear all SPI events */ /* Clear all SPI events */
spi->event = 0xffffffff; setbits_be32(&spi->event, 0xffffffff);
/* Mask all SPI interrupts */ /* Mask all SPI interrupts */
spi->mask = 0x00000000; clrbits_be32(&spi->mask, 0xffffffff);
/* LST bit doesn't do anything, so disregard */ /* LST bit doesn't do anything, so disregard */
spi->com = 0; out_be32(&spi->com, 0);
} }
int spi_claim_bus(struct spi_slave *slave) int spi_claim_bus(struct spi_slave *slave)
@ -87,7 +87,7 @@ void spi_release_bus(struct spi_slave *slave)
int spi_xfer(struct spi_slave *slave, uint bitlen, const void *dout, void *din, int spi_xfer(struct spi_slave *slave, uint bitlen, const void *dout, void *din,
ulong flags) ulong flags)
{ {
volatile spi8xxx_t *spi = &((immap_t *) (CONFIG_SYS_IMMR))->spi; spi8xxx_t *spi = &((immap_t *)(CONFIG_SYS_IMMR))->spi;
uint tmpdout, tmpdin, event; uint tmpdout, tmpdin, event;
int num_blks = DIV_ROUND_UP(bitlen, 32); int num_blks = DIV_ROUND_UP(bitlen, 32);
int tm, is_read = 0; int tm, is_read = 0;
@ -100,7 +100,7 @@ int spi_xfer(struct spi_slave *slave, uint bitlen, const void *dout, void *din,
spi_cs_activate(slave); spi_cs_activate(slave);
/* Clear all SPI events */ /* Clear all SPI events */
spi->event = 0xffffffff; setbits_be32(&spi->event, 0xffffffff);
/* Handle data in 32-bit chunks */ /* Handle data in 32-bit chunks */
while (num_blks--) { while (num_blks--) {
@ -118,26 +118,26 @@ int spi_xfer(struct spi_slave *slave, uint bitlen, const void *dout, void *din,
* len > 16 0 * len > 16 0
*/ */
spi->mode &= ~SPI_MODE_EN; clrbits_be32(&spi->mode, SPI_MODE_EN);
if (bitlen <= 16) { if (bitlen <= 16) {
if (bitlen <= 4) if (bitlen <= 4)
spi->mode = (spi->mode & 0xff0fffff) | clrsetbits_be32(&spi->mode, 0x00f00000,
(3 << 20); (3 << 20));
else else
spi->mode = (spi->mode & 0xff0fffff) | clrsetbits_be32(&spi->mode, 0x00f00000,
((bitlen - 1) << 20); ((bitlen - 1) << 20));
} else { } else {
spi->mode = (spi->mode & 0xff0fffff); clrbits_be32(&spi->mode, 0x00f00000);
/* Set up the next iteration if sending > 32 bits */ /* Set up the next iteration if sending > 32 bits */
bitlen -= 32; bitlen -= 32;
dout += 4; dout += 4;
} }
spi->mode |= SPI_MODE_EN; setbits_be32(&spi->mode, SPI_MODE_EN);
/* Write the data out */ /* Write the data out */
spi->tx = tmpdout; out_be32(&spi->tx, tmpdout);
debug("*** %s: ... %08x written\n", __func__, tmpdout); debug("*** %s: ... %08x written\n", __func__, tmpdout);
@ -147,10 +147,10 @@ int spi_xfer(struct spi_slave *slave, uint bitlen, const void *dout, void *din,
* The NE event must be read and cleared first * The NE event must be read and cleared first
*/ */
for (tm = 0, is_read = 0; tm < SPI_TIMEOUT; ++tm) { for (tm = 0, is_read = 0; tm < SPI_TIMEOUT; ++tm) {
event = spi->event; event = in_be32(&spi->event);
if (event & SPI_EV_NE) { if (event & SPI_EV_NE) {
tmpdin = spi->rx; tmpdin = in_be32(&spi->rx);
spi->event |= SPI_EV_NE; setbits_be32(&spi->event, SPI_EV_NE);
is_read = 1; is_read = 1;
*(u32 *)din = (tmpdin << (32 - char_size)); *(u32 *)din = (tmpdin << (32 - char_size));