diff options
Diffstat (limited to 'target/linux/sunxi/patches-4.1/129-nand-sunxi-fix-write-to-USER_DATA-a13.patch')
-rw-r--r-- | target/linux/sunxi/patches-4.1/129-nand-sunxi-fix-write-to-USER_DATA-a13.patch | 78 |
1 files changed, 0 insertions, 78 deletions
diff --git a/target/linux/sunxi/patches-4.1/129-nand-sunxi-fix-write-to-USER_DATA-a13.patch b/target/linux/sunxi/patches-4.1/129-nand-sunxi-fix-write-to-USER_DATA-a13.patch deleted file mode 100644 index ae2775d..0000000 --- a/target/linux/sunxi/patches-4.1/129-nand-sunxi-fix-write-to-USER_DATA-a13.patch +++ /dev/null @@ -1,78 +0,0 @@ -From b1488f1a55da6a297ac4e8e9140922f35b7583c5 Mon Sep 17 00:00:00 2001 -From: Boris Brezillon <boris.brezillon@free-electrons.com> -Date: Mon, 15 Jun 2015 11:09:58 +0200 -Subject: [PATCH] nand: sunxi: fix write to USER_DATA reg - -The USER_DATA register cannot be updated with readb on A13 SoCs, thus -triggering a bug when using memcpy_toio on this register. -Use writel (plus a temporary variable to old the USER_DATA value) to -address that problem. - -Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> ---- - drivers/mtd/nand/sunxi_nand.c | 38 +++++++++++++++++++++----------------- - 1 file changed, 21 insertions(+), 17 deletions(-) - ---- a/drivers/mtd/nand/sunxi_nand.c -+++ b/drivers/mtd/nand/sunxi_nand.c -@@ -908,7 +908,7 @@ static int sunxi_nfc_hw_ecc_write_page(s - - for (i = 0; i < ecc->steps; i++) { - bool rndactiv = false; -- u8 oob_buf[4]; -+ u32 user_data; - - if (i) - chip->cmdfunc(mtd, NAND_CMD_RNDIN, i * ecc->size, -1); -@@ -919,15 +919,13 @@ static int sunxi_nfc_hw_ecc_write_page(s - offset = layout->eccpos[i * ecc->bytes] - 4 + mtd->writesize; - - /* Fill OOB data in */ -- if (!oob_required) -- memset(oob_buf, 0xff, 4); -- else -- memcpy(oob_buf, -- chip->oob_poi + layout->oobfree[i].offset, -- 4); -- -- -- memcpy_toio(nfc->regs + NFC_REG_USER_DATA_BASE, oob_buf, 4); -+ if (!oob_required) { -+ user_data = 0xffffffff; -+ } else { -+ memcpy(&user_data, -+ chip->oob_poi + layout->oobfree[i].offset, 4); -+ user_data = le32_to_cpu(user_data); -+ } - - if (i) { - cnt = ecc->bytes + 4; -@@ -946,12 +944,16 @@ static int sunxi_nfc_hw_ecc_write_page(s - if (rndactiv) { - /* pre randomize to generate FF patterns on the NAND */ - if (!i) { -+ u8 oob_tmp[2]; - u16 state = rnd->subseeds[rnd->page % rnd->nseeds]; -+ oob_tmp[0] = user_data; -+ oob_tmp[1] = user_data >> 8; - state = sunxi_nfc_hwrnd_single_step(state, 15); -- oob_buf[0] ^= state; -+ oob_tmp[0] ^= state; - state = sunxi_nfc_hwrnd_step(rnd, state, 1); -- oob_buf[1] ^= state; -- memcpy_toio(nfc->regs + NFC_REG_USER_DATA_BASE, oob_buf, 4); -+ oob_tmp[1] ^= state; -+ user_data &= ~0xffff; -+ user_data |= oob_tmp[0] | (oob_tmp[1] << 8); - } - tmp = readl(nfc->regs + NFC_REG_ECC_CTL); - tmp &= ~(NFC_RANDOM_DIRECTION | NFC_ECC_EXCEPTION); -@@ -959,6 +961,8 @@ static int sunxi_nfc_hw_ecc_write_page(s - writel(tmp, nfc->regs + NFC_REG_ECC_CTL); - } - -+ writel(user_data, nfc->regs + NFC_REG_USER_DATA_BASE); -+ - chip->cmdfunc(mtd, NAND_CMD_RNDIN, offset, -1); - - ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); |