linux/drivers/memory
Wolfram Sang 5e63b85a48 memory: renesas-rpc-if: Correct QSPI data transfer in Manual mode
commit fff53a551d upstream.

This patch fixes 2 problems:
[1] The output warning logs and data loss when performing
mount/umount then remount the device with jffs2 format.
[2] The access width of SMWDR[0:1]/SMRDR[0:1] register is wrong.

This is the sample warning logs when performing mount/umount then
remount the device with jffs2 format:
jffs2: jffs2_scan_inode_node(): CRC failed on node at 0x031c51d4:
Read 0x00034e00, calculated 0xadb272a7

The reason for issue [1] is that the writing data seems to
get messed up.
Data is only completed when the number of bytes is divisible by 4.
If you only have 3 bytes of data left to write, 1 garbage byte
is inserted after the end of the write stream.
If you only have 2 bytes of data left to write, 2 bytes of '00'
are added into the write stream.
If you only have 1 byte of data left to write, 2 bytes of '00'
are added into the write stream. 1 garbage byte is inserted after
the end of the write stream.

To solve problem [1], data must be written continuously in serial
and the write stream ends when data is out.

Following HW manual 62.2.15, access to SMWDR0 register should be
in the same size as the transfer size specified in the SPIDE[3:0]
bits in the manual mode enable setting register (SMENR).
Be sure to access from address 0.

So, in 16-bit transfer (SPIDE[3:0]=b'1100), SMWDR0 should be
accessed by 16-bit width.
Similar to SMWDR1, SMDDR0/1 registers.
In current code, SMWDR0 register is accessed by regmap_write()
that only set up to do 32-bit width.

To solve problem [2], data must be written 16-bit or 8-bit when
transferring 1-byte or 2-byte.

Fixes: ca7d8b980b ("memory: add Renesas RPC-IF driver")
Cc: <stable@vger.kernel.org>
Signed-off-by: Duc Nguyen <duc.nguyen.ub@renesas.com>
[wsa: refactored to use regmap only via reg_read/reg_write]
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Link: https://lore.kernel.org/r/20210922091007.5516-1-wsa+renesas@sang-engineering.com
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2021-11-18 14:03:47 +01:00
..
samsung memory: samsung: exynos5422-dmc: handle clk_set_parent() failure 2021-05-14 09:50:19 +02:00
tegra memory: tegra: Fix compilation warnings on 64bit platforms 2021-07-25 14:36:14 +02:00
.gitignore
atmel-ebi.c memory: atmel-ebi: add missing of_node_put for loop iteration 2021-07-20 16:05:54 +02:00
atmel-sdramc.c
brcmstb_dpfe.c memory: brcmstb_dpfe: Simplify with dev_err_probe() 2020-09-02 17:22:31 +02:00
bt1-l2-ctl.c
da8xx-ddrctl.c
emif-asm-offsets.c
emif.c memory: emif: Convert to DEFINE_SHOW_ATTRIBUTE 2020-09-20 18:59:19 +02:00
emif.h
fsl_ifc.c memory: fsl_ifc: fix leak of private memory on probe failure 2021-07-20 16:05:56 +02:00
fsl-corenet-cf.c memory: fsl-corenet-cf: Fix handling of platform_get_irq() error 2020-09-02 17:32:02 +02:00
jedec_ddr_data.c
jedec_ddr.h
jz4780-nemc.c memory: jz4780_nemc: Fix an error pointer vs NULL check in probe() 2020-12-30 11:54:27 +01:00
Kconfig memory: ti-emif-sram: only build for ARMv7 2020-12-30 11:53:37 +01:00
Makefile memory: brcmstb_dpfe: add separate entry for compile test 2020-08-17 20:44:00 +02:00
mtk-smi.c memory: mtk-smi: Fix PM usage counter unbalance in mtk_smi ops 2021-03-04 11:37:22 +01:00
mvebu-devbus.c
of_memory.c
of_memory.h
omap-gpmc.c memory: gpmc: fix out of bounds read and dereference on gpmc_cs[] 2021-05-14 09:50:06 +02:00
pl172.c
pl353-smc.c memory: pl353: Fix error return code in pl353_smc_probe() 2021-07-20 16:05:54 +02:00
renesas-rpc-if.c memory: renesas-rpc-if: Correct QSPI data transfer in Manual mode 2021-11-18 14:03:47 +01:00
stm32-fmc2-ebi.c memory: stm32-fmc2-ebi: add missing of_node_put for loop iteration 2021-07-20 16:05:54 +02:00
ti-aemif.c memory: ti-aemif: Drop child node when jumping out loop 2021-03-04 11:37:25 +01:00
ti-emif-pm.c
ti-emif-sram-pm.S