Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spi: sh-msiof: Add reset of registers before starting transfer

In accordance with hardware specification Ver 1.0, reset register
transmission / reception setting before transfer.

Signed-off-by: Hiromitsu Yamasaki <hiromitsu.yamasaki.ym@renesas.com>
[geert: Use readl_poll_timeout_atomic()]
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Geert Uytterhoeven and committed by
Mark Brown
fedd6940 9115b4d8

+18
+18
drivers/spi/spi-sh-msiof.c
··· 132 132 #define CTR_TFSE BIT(14) /* Transmit Frame Sync Signal Output Enable */ 133 133 #define CTR_TXE BIT(9) /* Transmit Enable */ 134 134 #define CTR_RXE BIT(8) /* Receive Enable */ 135 + #define CTR_TXRST BIT(1) /* Transmit Reset */ 136 + #define CTR_RXRST BIT(0) /* Receive Reset */ 135 137 136 138 /* FCTR */ 137 139 #define FCTR_TFWM_MASK GENMASK(31, 29) /* Transmit FIFO Watermark */ ··· 241 239 complete(&p->done); 242 240 243 241 return IRQ_HANDLED; 242 + } 243 + 244 + static void sh_msiof_spi_reset_regs(struct sh_msiof_spi_priv *p) 245 + { 246 + u32 mask = CTR_TXRST | CTR_RXRST; 247 + u32 data; 248 + 249 + data = sh_msiof_read(p, CTR); 250 + data |= mask; 251 + sh_msiof_write(p, CTR, data); 252 + 253 + readl_poll_timeout_atomic(p->mapbase + CTR, data, !(data & mask), 1, 254 + 100); 244 255 } 245 256 246 257 static const u32 sh_msiof_spi_div_array[] = { ··· 934 919 int n; 935 920 bool swab; 936 921 int ret; 922 + 923 + /* reset registers */ 924 + sh_msiof_spi_reset_regs(p); 937 925 938 926 /* setup clocks (clock already enabled in chipselect()) */ 939 927 if (!spi_controller_is_slave(p->ctlr))