
On 5/16/2012 2:44 AM, Scott Wood wrote:
- case FSMC_VER8:
/* Busy waiting for ecc computation to finish for 512 bytes */
while (!(readl(&fsmc_regs_p->sts)& FSMC_CODE_RDY))
;
Timeout?
- uint16_t ecc_oob[7];
- uint8_t *oob = (uint8_t *)&ecc_oob[0];
Please use a union, or better an explicit alignment attribute.
+enum {
- FSMC_VER1 = 1,
- FSMC_VER2,
- FSMC_VER3,
- FSMC_VER4,
- FSMC_VER5,
- FSMC_VER6,
- FSMC_VER7,
- FSMC_VER8,
+};
Is this really necessary?
Three fixups.
Signed-off-by: Amit Virdi amit.virdi@st.com --- drivers/mtd/nand/fsmc_nand.c | 24 +++++++++++++----------- include/linux/mtd/fsmc_nand.h | 12 ++---------- 2 files changed, 15 insertions(+), 21 deletions(-)
diff --git a/drivers/mtd/nand/fsmc_nand.c b/drivers/mtd/nand/fsmc_nand.c index 5e91ece..f38603a 100644 --- a/drivers/mtd/nand/fsmc_nand.c +++ b/drivers/mtd/nand/fsmc_nand.c @@ -278,12 +278,20 @@ static int fsmc_read_hwecc(struct mtd_info *mtd, const u_char *data, u_char *ecc) { u_int ecc_tmp; + int timeout = FSMC_CODE_RDY_TIMEOUT; + ulong start;
switch (fsmc_version) { case FSMC_VER8: - /* Busy waiting for ecc computation to finish for 512 bytes */ - while (!(readl(&fsmc_regs_p->sts) & FSMC_CODE_RDY)) - ; + start = get_timer(0); + while (get_timer(start) < timeout) { + /* + * Busy waiting for ecc computation + * to finish for 512 bytes + */ + if (readl(&fsmc_regs_p->sts) & FSMC_CODE_RDY) + break; + }
ecc_tmp = readl(&fsmc_regs_p->ecc1); ecc[0] = (u_char) (ecc_tmp >> 0); @@ -352,13 +360,7 @@ static int fsmc_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, uint8_t *ecc_calc = chip->buffers->ecccalc; uint8_t *ecc_code = chip->buffers->ecccode; int off, len, group = 0; - /* - * ecc_oob is intentionally taken as u16. In 16bit devices, we end up - * reading 14 bytes (7 words) from oob. The local array is to maintain - * word alignment - */ - uint16_t ecc_oob[7]; - uint8_t *oob = (uint8_t *)&ecc_oob[0]; + uint8_t oob[13] __attribute__ ((aligned (16)));
/* Differentiate between small and large page ecc place definitions */ if (mtd->writesize == 512) @@ -389,7 +391,7 @@ static int fsmc_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, j += len; }
- memcpy(&ecc_code[i], ecc_oob, 13); + memcpy(&ecc_code[i], oob, 13); chip->ecc.calculate(mtd, p, &ecc_calc[i]);
stat = chip->ecc.correct(mtd, p, &ecc_code[i], diff --git a/include/linux/mtd/fsmc_nand.h b/include/linux/mtd/fsmc_nand.h index 3bd8fc0..efc6eb3 100644 --- a/include/linux/mtd/fsmc_nand.h +++ b/include/linux/mtd/fsmc_nand.h @@ -77,16 +77,8 @@ struct fsmc_regs { #define FSMC_REVISION_MSK (0xf) #define FSMC_REVISION_SHFT (0x4)
-enum { - FSMC_VER1 = 1, - FSMC_VER2, - FSMC_VER3, - FSMC_VER4, - FSMC_VER5, - FSMC_VER6, - FSMC_VER7, - FSMC_VER8, -}; +#define FSMC_CODE_RDY_TIMEOUT 1000 /* 1 sec */ +#define FSMC_VER8 0x8
/* * There are 13 bytes of ecc for every 512 byte block and it has to be read