Commit 7f9938d0 authored by Matt Reimer's avatar Matt Reimer Committed by David Woodhouse

[MTD] [NAND] pxa3xx: fix non-page-aligned reads

Reads from non-page-aligned addresses were broken because while the
address to read from was correctly written to NDCB*, a full page was
always read. Fix this by ignoring the column and only using the page
address.

I suspect this whole-page behavior is due to the controller's need to
read the entire page in order to generate correct ECC. In the non-ECC
case this could be optimized to use the column address, and to set the
read length to what is being requested rather than the length of an
entire page.
Signed-off-by: default avatarMatt Reimer <mreimer@vpop.net>
Signed-off-by: default avatarEric Miao <eric.miao@marvell.com>
Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent a5cce42f
...@@ -368,14 +368,14 @@ static int prepare_read_prog_cmd(struct pxa3xx_nand_info *info, ...@@ -368,14 +368,14 @@ static int prepare_read_prog_cmd(struct pxa3xx_nand_info *info,
/* large block, 2 cycles for column address /* large block, 2 cycles for column address
* row address starts from 3rd cycle * row address starts from 3rd cycle
*/ */
info->ndcb1 |= (page_addr << 16) | (column & 0xffff); info->ndcb1 |= page_addr << 16;
if (info->row_addr_cycles == 3) if (info->row_addr_cycles == 3)
info->ndcb2 = (page_addr >> 16) & 0xff; info->ndcb2 = (page_addr >> 16) & 0xff;
} else } else
/* small block, 1 cycles for column address /* small block, 1 cycles for column address
* row address starts from 2nd cycle * row address starts from 2nd cycle
*/ */
info->ndcb1 = (page_addr << 8) | (column & 0xff); info->ndcb1 = page_addr << 8;
if (cmd == cmdset->program) if (cmd == cmdset->program)
info->ndcb0 |= NDCB0_CMD_TYPE(1) | NDCB0_AUTO_RS; info->ndcb0 |= NDCB0_CMD_TYPE(1) | NDCB0_AUTO_RS;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment