aboutsummaryrefslogtreecommitdiff
path: root/drivers/spi
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2023-02-23 17:32:22 -0500
committerTom Rini <trini@konsulko.com>2023-02-23 17:40:18 -0500
commit0024e7f72b689f8c2df731a69e20f47b6f8dc5a7 (patch)
tree03da9b68c29df4ffa5c181acca8ce6176636a410 /drivers/spi
parent0b58258a33280a536c5b1e5e90dfdf0b5b5852cc (diff)
parent5a8fe1ee818e0f8a74fa088f6a3d705a01b6afbe (diff)
Merge branch 'master' of https://source.denx.de/u-boot/custodians/u-boot-tegra
Diffstat (limited to 'drivers/spi')
-rw-r--r--drivers/spi/tegra20_slink.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/spi/tegra20_slink.c b/drivers/spi/tegra20_slink.c
index 209ba8b0cc..d0e788539e 100644
--- a/drivers/spi/tegra20_slink.c
+++ b/drivers/spi/tegra20_slink.c
@@ -208,16 +208,14 @@ static int tegra30_spi_xfer(struct udevice *dev, unsigned int bitlen,
u32 reg, tmpdout, tmpdin = 0;
const u8 *dout = data_out;
u8 *din = data_in;
- int num_bytes;
- int ret;
+ int num_bytes, overflow;
+ int ret = 0;
debug("%s: slave %u:%u dout %p din %p bitlen %u\n",
__func__, dev_seq(bus), spi_chip_select(dev), dout, din, bitlen);
- if (bitlen % 8)
- return -1;
- num_bytes = bitlen / 8;
- ret = 0;
+ num_bytes = DIV_ROUND_UP(bitlen, 8);
+ overflow = bitlen % 8;
reg = readl(&regs->status);
writel(reg, &regs->status); /* Clear all SPI events via R/W */
@@ -254,8 +252,13 @@ static int tegra30_spi_xfer(struct udevice *dev, unsigned int bitlen,
num_bytes -= bytes;
- clrsetbits_le32(&regs->command, SLINK_CMD_BIT_LENGTH_MASK,
- bytes * 8 - 1);
+ if (overflow && !num_bytes)
+ clrsetbits_le32(&regs->command, SLINK_CMD_BIT_LENGTH_MASK,
+ (bytes - 1) * 8 + overflow - 1);
+ else
+ clrsetbits_le32(&regs->command, SLINK_CMD_BIT_LENGTH_MASK,
+ bytes * 8 - 1);
+
writel(tmpdout, &regs->tx_fifo);
setbits_le32(&regs->command, SLINK_CMD_GO);