amd/stoneyridge/spi: Fix reads greater than 5 bytes
This corrects a bug in 918c8717
"amd/stoneyridge: Add SPI controller
driver". Pass a pointer to din to the do_command() function so the
caller's copy is correctly updated. The bug allowed reads <= 5 bytes
to work correctly (3 bytes consumed in the FIFO by the address) but
overwrote data in the din buffer on larger transfers.
Change-Id: I32b7752f047112849871cafc9ae33c5ea1466ee1
Signed-off-by: Marshall Dawson <marshalldawson3rd@gmail.com>
Reviewed-on: https://review.coreboot.org/22519
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
parent
a85f8b94ab
commit
0e022038fc
|
@ -114,7 +114,7 @@ void spi_init(void)
|
|||
}
|
||||
|
||||
static int do_command(uint8_t cmd, const void *dout,
|
||||
size_t bytesout, void *din, size_t *bytesin)
|
||||
size_t bytesout, uint8_t **din, size_t *bytesin)
|
||||
{
|
||||
size_t count;
|
||||
size_t max_in = MIN(*bytesin, SPI_FIFO_DEPTH);
|
||||
|
@ -138,8 +138,8 @@ static int do_command(uint8_t cmd, const void *dout,
|
|||
for (count = 0; count < bytesout; count++)
|
||||
spi_read8(SPI_CNTRL1); /* skip the bytes we sent */
|
||||
|
||||
for (count = 0; count < max_in; count++, din++)
|
||||
*(uint8_t *)din = spi_read8(SPI_CNTRL1);
|
||||
for (count = 0; count < max_in; count++, (*din)++)
|
||||
**din = spi_read8(SPI_CNTRL1);
|
||||
|
||||
*bytesin -= max_in;
|
||||
return 0;
|
||||
|
@ -168,7 +168,7 @@ static int spi_ctrlr_xfer(const struct spi_slave *slave, const void *dout,
|
|||
}
|
||||
|
||||
do {
|
||||
if (do_command(cmd, dout, bytesout, din, &bytesin))
|
||||
if (do_command(cmd, dout, bytesout, (uint8_t **)&din, &bytesin))
|
||||
return -1;
|
||||
} while (bytesin);
|
||||
|
||||
|
|
Loading…
Reference in New Issue