@@ -158,6 +158,7 @@ struct pxa3xx_nand_info {
struct nand_chip nand_chip;
struct pxa3xx_nand_cmdset *cmdset;
/* page size of attached chip */
+ int page_addr;
uint16_t page_size;
uint8_t chip_select;
uint8_t use_ecc;
@@ -186,8 +187,8 @@ struct pxa3xx_nand {
int drcmr_dat;
int drcmr_cmd;
int data_dma_ch;
- dma_addr_t data_buff_phys;
- dma_addr_t data_desc_addr;
+ dma_addr_t dma_buff_phys;
+ dma_addr_t dma_desc_addr;
struct pxa_dma_desc *data_desc;
struct pxa3xx_nand_info *info[NUM_CHIP_SELECT];
@@ -496,25 +497,25 @@ static void start_data_dma(struct pxa3xx_nand
*nand, int dir_out)
desc_oob->ddadr = desc->ddadr = DDADR_STOP;
desc_oob->dcmd = desc->dcmd = DCMD_WIDTH4 | DCMD_BURST32;
if (dir_out) {
- desc->dsadr = nand->data_buff_phys + nand->data_column;
+ desc->dsadr = nand->dma_buff_phys + nand->data_column;
desc->dtadr = nand->mmio_phys + NDDB;
desc->dcmd |= DCMD_ENDIRQEN | DCMD_INCSRCADDR | DCMD_FLOWTRG |
(data_len + oob_len);
} else {
if (nand->oob_size > 0) {
- desc_oob->dtadr = nand->data_buff_phys
+ desc_oob->dtadr = nand->dma_buff_phys
+ info->page_size + nand->oob_column;
desc_oob->dcmd |= DCMD_ENDIRQEN | DCMD_INCTRGADDR | DCMD_FLOWSRC | oob_len;
- desc->ddadr = nand->data_desc_addr + sizeof(struct pxa_dma_desc);
+ desc->ddadr = nand->dma_desc_addr + sizeof(struct pxa_dma_desc);
desc->dcmd |= DCMD_INCTRGADDR | DCMD_FLOWSRC | data_len;
}
else
desc->dcmd |= DCMD_ENDIRQEN | DCMD_INCTRGADDR | DCMD_FLOWSRC | data_len;
- desc->dtadr = nand->data_buff_phys + nand->data_column;
+ desc->dtadr = nand->dma_buff_phys + nand->data_column;
desc_oob->dsadr = desc->dsadr = nand->mmio_phys + NDDB;
}
DRCMR(nand->drcmr_dat) = DRCMR_MAPVLD | nand->data_dma_ch;
- DDADR(nand->data_dma_ch) = nand->data_desc_addr;
+ DDADR(nand->data_dma_ch) = nand->dma_desc_addr;
DCSR(nand->data_dma_ch) |= DCSR_RUN;