|
@@ -275,13 +275,12 @@ static void read_fiforeg(struct sh_flctl *flctl, int rlen, int offset)
|
|
|
{
|
|
|
int i, len_4align;
|
|
|
unsigned long *buf = (unsigned long *)&flctl->done_buff[offset];
|
|
|
- void *fifo_addr = (void *)FLDTFIFO(flctl);
|
|
|
|
|
|
len_4align = (rlen + 3) / 4;
|
|
|
|
|
|
for (i = 0; i < len_4align; i++) {
|
|
|
wait_rfifo_ready(flctl);
|
|
|
- buf[i] = readl(fifo_addr);
|
|
|
+ buf[i] = readl(FLDTFIFO(flctl));
|
|
|
buf[i] = be32_to_cpu(buf[i]);
|
|
|
}
|
|
|
}
|
|
@@ -318,6 +317,18 @@ static void write_fiforeg(struct sh_flctl *flctl, int rlen, int offset)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void write_ec_fiforeg(struct sh_flctl *flctl, int rlen, int offset)
|
|
|
+{
|
|
|
+ int i, len_4align;
|
|
|
+ unsigned long *data = (unsigned long *)&flctl->done_buff[offset];
|
|
|
+
|
|
|
+ len_4align = (rlen + 3) / 4;
|
|
|
+ for (i = 0; i < len_4align; i++) {
|
|
|
+ wait_wecfifo_ready(flctl);
|
|
|
+ writel(cpu_to_be32(data[i]), FLECFIFO(flctl));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void set_cmd_regs(struct mtd_info *mtd, uint32_t cmd, uint32_t flcmcdr_val)
|
|
|
{
|
|
|
struct sh_flctl *flctl = mtd_to_flctl(mtd);
|
|
@@ -384,6 +395,7 @@ static int flctl_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
uint8_t *buf, int oob_required, int page)
|
|
|
{
|
|
|
chip->read_buf(mtd, buf, mtd->writesize);
|
|
|
+ chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -391,6 +403,7 @@ static void flctl_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
const uint8_t *buf, int oob_required)
|
|
|
{
|
|
|
chip->write_buf(mtd, buf, mtd->writesize);
|
|
|
+ chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
|
|
|
}
|
|
|
|
|
|
static void execmd_read_page_sector(struct mtd_info *mtd, int page_addr)
|
|
@@ -466,7 +479,7 @@ static void execmd_read_oob(struct mtd_info *mtd, int page_addr)
|
|
|
static void execmd_write_page_sector(struct mtd_info *mtd)
|
|
|
{
|
|
|
struct sh_flctl *flctl = mtd_to_flctl(mtd);
|
|
|
- int i, page_addr = flctl->seqin_page_addr;
|
|
|
+ int page_addr = flctl->seqin_page_addr;
|
|
|
int sector, page_sectors;
|
|
|
|
|
|
page_sectors = flctl->page_size ? 4 : 1;
|
|
@@ -482,11 +495,7 @@ static void execmd_write_page_sector(struct mtd_info *mtd)
|
|
|
|
|
|
for (sector = 0; sector < page_sectors; sector++) {
|
|
|
write_fiforeg(flctl, 512, 512 * sector);
|
|
|
-
|
|
|
- for (i = 0; i < 4; i++) {
|
|
|
- wait_wecfifo_ready(flctl); /* wait for write ready */
|
|
|
- writel(0xFFFFFFFF, FLECFIFO(flctl));
|
|
|
- }
|
|
|
+ write_ec_fiforeg(flctl, 16, mtd->writesize + 16 * sector);
|
|
|
}
|
|
|
|
|
|
wait_completion(flctl);
|