diff options
Diffstat (limited to 'firmware/target/mips/ingenic_jz47xx/ata-nand-jz4760.c')
-rw-r--r-- | firmware/target/mips/ingenic_jz47xx/ata-nand-jz4760.c | 88 |
1 files changed, 44 insertions, 44 deletions
diff --git a/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4760.c b/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4760.c index 3b1a1aad59..1eacf9170a 100644 --- a/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4760.c +++ b/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4760.c | |||
@@ -148,20 +148,20 @@ static inline void jz_nand_read_buf8(void *buf, int count) | |||
148 | static void jz_nand_write_dma(void *source, unsigned int len, int bw) | 148 | static void jz_nand_write_dma(void *source, unsigned int len, int bw) |
149 | { | 149 | { |
150 | mutex_lock(&nand_dma_mtx); | 150 | mutex_lock(&nand_dma_mtx); |
151 | 151 | ||
152 | if(((unsigned int)source < 0xa0000000) && len) | 152 | if(((unsigned int)source < 0xa0000000) && len) |
153 | dma_cache_wback_inv((unsigned long)source, len); | 153 | dma_cache_wback_inv((unsigned long)source, len); |
154 | 154 | ||
155 | dma_enable(); | 155 | dma_enable(); |
156 | 156 | ||
157 | REG_DMAC_DCCSR(DMA_NAND_CHANNEL) = DMAC_DCCSR_NDES; | 157 | REG_DMAC_DCCSR(DMA_NAND_CHANNEL) = DMAC_DCCSR_NDES; |
158 | REG_DMAC_DSAR(DMA_NAND_CHANNEL) = PHYSADDR((unsigned long)source); | 158 | REG_DMAC_DSAR(DMA_NAND_CHANNEL) = PHYSADDR((unsigned long)source); |
159 | REG_DMAC_DTAR(DMA_NAND_CHANNEL) = PHYSADDR((unsigned long)NAND_DATAPORT); | 159 | REG_DMAC_DTAR(DMA_NAND_CHANNEL) = PHYSADDR((unsigned long)NAND_DATAPORT); |
160 | REG_DMAC_DTCR(DMA_NAND_CHANNEL) = len / 16; | 160 | REG_DMAC_DTCR(DMA_NAND_CHANNEL) = len / 16; |
161 | REG_DMAC_DRSR(DMA_NAND_CHANNEL) = DMAC_DRSR_RS_AUTO; | 161 | REG_DMAC_DRSR(DMA_NAND_CHANNEL) = DMAC_DRSR_RS_AUTO; |
162 | REG_DMAC_DCMD(DMA_NAND_CHANNEL) = (DMAC_DCMD_SAI| DMAC_DCMD_DAI | DMAC_DCMD_SWDH_32 | DMAC_DCMD_DS_16BYTE | | 162 | REG_DMAC_DCMD(DMA_NAND_CHANNEL) = (DMAC_DCMD_SAI| DMAC_DCMD_DAI | DMAC_DCMD_SWDH_32 | DMAC_DCMD_DS_16BYTE | |
163 | (bw == 8 ? DMAC_DCMD_DWDH_8 : DMAC_DCMD_DWDH_16)); | 163 | (bw == 8 ? DMAC_DCMD_DWDH_8 : DMAC_DCMD_DWDH_16)); |
164 | 164 | ||
165 | REG_DMAC_DCCSR(DMA_NAND_CHANNEL) |= DMAC_DCCSR_EN; /* Enable DMA channel */ | 165 | REG_DMAC_DCCSR(DMA_NAND_CHANNEL) |= DMAC_DCCSR_EN; /* Enable DMA channel */ |
166 | #if 1 | 166 | #if 1 |
167 | while( REG_DMAC_DTCR(DMA_NAND_CHANNEL) ) | 167 | while( REG_DMAC_DTCR(DMA_NAND_CHANNEL) ) |
@@ -172,26 +172,26 @@ static void jz_nand_write_dma(void *source, unsigned int len, int bw) | |||
172 | #endif | 172 | #endif |
173 | 173 | ||
174 | REG_DMAC_DCCSR(DMA_NAND_CHANNEL) &= ~DMAC_DCCSR_EN; /* Disable DMA channel */ | 174 | REG_DMAC_DCCSR(DMA_NAND_CHANNEL) &= ~DMAC_DCCSR_EN; /* Disable DMA channel */ |
175 | 175 | ||
176 | dma_disable(); | 176 | dma_disable(); |
177 | 177 | ||
178 | mutex_unlock(&nand_dma_mtx); | 178 | mutex_unlock(&nand_dma_mtx); |
179 | } | 179 | } |
180 | 180 | ||
181 | static void jz_nand_read_dma(void *target, unsigned int len, int bw) | 181 | static void jz_nand_read_dma(void *target, unsigned int len, int bw) |
182 | { | 182 | { |
183 | mutex_lock(&nand_dma_mtx); | 183 | mutex_lock(&nand_dma_mtx); |
184 | 184 | ||
185 | if(((unsigned int)target < 0xa0000000) && len) | 185 | if(((unsigned int)target < 0xa0000000) && len) |
186 | dma_cache_wback_inv((unsigned long)target, len); | 186 | dma_cache_wback_inv((unsigned long)target, len); |
187 | 187 | ||
188 | dma_enable(); | 188 | dma_enable(); |
189 | 189 | ||
190 | REG_DMAC_DCCSR(DMA_NAND_CHANNEL) = DMAC_DCCSR_NDES ; | 190 | REG_DMAC_DCCSR(DMA_NAND_CHANNEL) = DMAC_DCCSR_NDES ; |
191 | REG_DMAC_DSAR(DMA_NAND_CHANNEL) = PHYSADDR((unsigned long)NAND_DATAPORT); | 191 | REG_DMAC_DSAR(DMA_NAND_CHANNEL) = PHYSADDR((unsigned long)NAND_DATAPORT); |
192 | REG_DMAC_DTAR(DMA_NAND_CHANNEL) = PHYSADDR((unsigned long)target); | 192 | REG_DMAC_DTAR(DMA_NAND_CHANNEL) = PHYSADDR((unsigned long)target); |
193 | REG_DMAC_DTCR(DMA_NAND_CHANNEL) = len / 4; | 193 | REG_DMAC_DTCR(DMA_NAND_CHANNEL) = len / 4; |
194 | REG_DMAC_DRSR(DMA_NAND_CHANNEL) = DMAC_DRSR_RS_AUTO; | 194 | REG_DMAC_DRSR(DMA_NAND_CHANNEL) = DMAC_DRSR_RS_AUTO; |
195 | REG_DMAC_DCMD(DMA_NAND_CHANNEL) = (DMAC_DCMD_SAI| DMAC_DCMD_DAI | DMAC_DCMD_DWDH_32 | DMAC_DCMD_DS_32BIT | | 195 | REG_DMAC_DCMD(DMA_NAND_CHANNEL) = (DMAC_DCMD_SAI| DMAC_DCMD_DAI | DMAC_DCMD_DWDH_32 | DMAC_DCMD_DS_32BIT | |
196 | (bw == 8 ? DMAC_DCMD_SWDH_8 : DMAC_DCMD_SWDH_16)); | 196 | (bw == 8 ? DMAC_DCMD_SWDH_8 : DMAC_DCMD_SWDH_16)); |
197 | REG_DMAC_DCCSR(DMA_NAND_CHANNEL) |= DMAC_DCCSR_EN; /* Enable DMA channel */ | 197 | REG_DMAC_DCCSR(DMA_NAND_CHANNEL) |= DMAC_DCCSR_EN; /* Enable DMA channel */ |
@@ -204,9 +204,9 @@ static void jz_nand_read_dma(void *target, unsigned int len, int bw) | |||
204 | #endif | 204 | #endif |
205 | 205 | ||
206 | //REG_DMAC_DCCSR(DMA_NAND_CHANNEL) &= ~DMAC_DCCSR_EN; /* Disable DMA channel */ | 206 | //REG_DMAC_DCCSR(DMA_NAND_CHANNEL) &= ~DMAC_DCCSR_EN; /* Disable DMA channel */ |
207 | 207 | ||
208 | dma_disable(); | 208 | dma_disable(); |
209 | 209 | ||
210 | mutex_unlock(&nand_dma_mtx); | 210 | mutex_unlock(&nand_dma_mtx); |
211 | } | 211 | } |
212 | 212 | ||
@@ -223,7 +223,7 @@ void DMA_CALLBACK(DMA_NAND_CHANNEL)(void) | |||
223 | 223 | ||
224 | if (REG_DMAC_DCCSR(DMA_NAND_CHANNEL) & DMAC_DCCSR_TT) | 224 | if (REG_DMAC_DCCSR(DMA_NAND_CHANNEL) & DMAC_DCCSR_TT) |
225 | REG_DMAC_DCCSR(DMA_NAND_CHANNEL) &= ~DMAC_DCCSR_TT; | 225 | REG_DMAC_DCCSR(DMA_NAND_CHANNEL) &= ~DMAC_DCCSR_TT; |
226 | 226 | ||
227 | semaphore_release(&nand_dma_complete); | 227 | semaphore_release(&nand_dma_complete); |
228 | } | 228 | } |
229 | #endif /* USE_DMA */ | 229 | #endif /* USE_DMA */ |
@@ -245,7 +245,7 @@ static inline void jz_nand_read_buf(void *buf, int count, int bw) | |||
245 | 245 | ||
246 | #ifdef USE_ECC | 246 | #ifdef USE_ECC |
247 | /* | 247 | /* |
248 | * Correct 1~9-bit errors in 512-bytes data | 248 | * Correct 1~9-bit errors in 512-bytes data |
249 | */ | 249 | */ |
250 | static void jz_rs_correct(unsigned char *dat, int idx, int mask) | 250 | static void jz_rs_correct(unsigned char *dat, int idx, int mask) |
251 | { | 251 | { |
@@ -348,7 +348,7 @@ static int jz_nand_read_page(unsigned long page_addr, unsigned char *dst) | |||
348 | #endif | 348 | #endif |
349 | unsigned char *data_buf; | 349 | unsigned char *data_buf; |
350 | unsigned char oob_buf[nandp->oob_size]; | 350 | unsigned char oob_buf[nandp->oob_size]; |
351 | 351 | ||
352 | page_size = nandp->page_size; | 352 | page_size = nandp->page_size; |
353 | oob_size = nandp->oob_size; | 353 | oob_size = nandp->oob_size; |
354 | row_cycle = nandp->row_cycle; | 354 | row_cycle = nandp->row_cycle; |
@@ -472,9 +472,9 @@ static int jz_nand_init(void) | |||
472 | __gpio_as_nand_16bit(1); | 472 | __gpio_as_nand_16bit(1); |
473 | 473 | ||
474 | REG_NEMC_SMCR1 = CFG_NAND_SMCR1 | 0x40; | 474 | REG_NEMC_SMCR1 = CFG_NAND_SMCR1 | 0x40; |
475 | 475 | ||
476 | __nand_select(); | 476 | __nand_select(); |
477 | 477 | ||
478 | __nand_cmd(NAND_CMD_READID); | 478 | __nand_cmd(NAND_CMD_READID); |
479 | __nand_addr(NAND_CMD_READ0); | 479 | __nand_addr(NAND_CMD_READ0); |
480 | cData[0] = __nand_data8(); | 480 | cData[0] = __nand_data8(); |
@@ -482,14 +482,14 @@ static int jz_nand_init(void) | |||
482 | cData[2] = __nand_data8(); | 482 | cData[2] = __nand_data8(); |
483 | cData[3] = __nand_data8(); | 483 | cData[3] = __nand_data8(); |
484 | cData[4] = __nand_data8(); | 484 | cData[4] = __nand_data8(); |
485 | 485 | ||
486 | __nand_deselect(); | 486 | __nand_deselect(); |
487 | 487 | ||
488 | logf("NAND chip %d: 0x%x 0x%x 0x%x 0x%x 0x%x", i+1, cData[0], cData[1], | 488 | logf("NAND chip %d: 0x%x 0x%x 0x%x 0x%x 0x%x", i+1, cData[0], cData[1], |
489 | cData[2], cData[3], cData[4]); | 489 | cData[2], cData[3], cData[4]); |
490 | 490 | ||
491 | bank = nand_identify(cData); | 491 | bank = nand_identify(cData); |
492 | 492 | ||
493 | if(bank == NULL) | 493 | if(bank == NULL) |
494 | { | 494 | { |
495 | panicf("Unknown NAND flash chip: 0x%x 0x%x 0x%x 0x%x 0x%x", cData[0], | 495 | panicf("Unknown NAND flash chip: 0x%x 0x%x 0x%x 0x%x 0x%x", cData[0], |
@@ -498,16 +498,16 @@ static int jz_nand_init(void) | |||
498 | } | 498 | } |
499 | 499 | ||
500 | chip_info = bank; | 500 | chip_info = bank; |
501 | 501 | ||
502 | internal_param.bus_width = 16; | 502 | internal_param.bus_width = 16; |
503 | internal_param.row_cycle = chip_info->row_cycles; | 503 | internal_param.row_cycle = chip_info->row_cycles; |
504 | internal_param.page_size = chip_info->page_size; | 504 | internal_param.page_size = chip_info->page_size; |
505 | internal_param.oob_size = chip_info->spare_size; | 505 | internal_param.oob_size = chip_info->spare_size; |
506 | internal_param.page_per_block = chip_info->pages_per_block; | 506 | internal_param.page_per_block = chip_info->pages_per_block; |
507 | internal_param.bad_block_pos = 0; | 507 | internal_param.bad_block_pos = 0; |
508 | 508 | ||
509 | nand_size = ((chip_info->page_size * chip_info->blocks_per_bank * chip_info->pages_per_block) - 0x200000) / 512; | 509 | nand_size = ((chip_info->page_size * chip_info->blocks_per_bank * chip_info->pages_per_block) - 0x200000) / 512; |
510 | 510 | ||
511 | return 0; | 511 | return 0; |
512 | } | 512 | } |
513 | 513 | ||
@@ -515,7 +515,7 @@ int nand_init(void) | |||
515 | { | 515 | { |
516 | int res = 0; | 516 | int res = 0; |
517 | static bool inited = false; | 517 | static bool inited = false; |
518 | 518 | ||
519 | if(!inited) | 519 | if(!inited) |
520 | { | 520 | { |
521 | res = jz_nand_init(); | 521 | res = jz_nand_init(); |
@@ -525,7 +525,7 @@ int nand_init(void) | |||
525 | semaphore_init(&nand_dma_complete, 1, 0); | 525 | semaphore_init(&nand_dma_complete, 1, 0); |
526 | system_enable_irq(DMA_IRQ(DMA_NAND_CHANNEL)); | 526 | system_enable_irq(DMA_IRQ(DMA_NAND_CHANNEL)); |
527 | #endif | 527 | #endif |
528 | 528 | ||
529 | inited = true; | 529 | inited = true; |
530 | } | 530 | } |
531 | 531 | ||
@@ -536,7 +536,7 @@ static inline int read_sector(unsigned long start, unsigned int count, | |||
536 | void* buf, unsigned int chip_size) | 536 | void* buf, unsigned int chip_size) |
537 | { | 537 | { |
538 | register int ret; | 538 | register int ret; |
539 | 539 | ||
540 | if(UNLIKELY(start % chip_size == 0 && count == chip_size)) | 540 | if(UNLIKELY(start % chip_size == 0 && count == chip_size)) |
541 | ret = jz_nand_read_page(start / chip_size, buf); | 541 | ret = jz_nand_read_page(start / chip_size, buf); |
542 | else | 542 | else |
@@ -544,7 +544,7 @@ static inline int read_sector(unsigned long start, unsigned int count, | |||
544 | ret = jz_nand_read_page(start / chip_size, temp_page); | 544 | ret = jz_nand_read_page(start / chip_size, temp_page); |
545 | memcpy(buf, temp_page + (start % chip_size), count); | 545 | memcpy(buf, temp_page + (start % chip_size), count); |
546 | } | 546 | } |
547 | 547 | ||
548 | return ret; | 548 | return ret; |
549 | } | 549 | } |
550 | 550 | ||
@@ -559,7 +559,7 @@ static inline int write_sector(unsigned long start, unsigned int count, | |||
559 | (void)chip_size; | 559 | (void)chip_size; |
560 | 560 | ||
561 | /* TODO */ | 561 | /* TODO */ |
562 | 562 | ||
563 | return ret; | 563 | return ret; |
564 | } | 564 | } |
565 | 565 | ||
@@ -571,20 +571,20 @@ int nand_read_sectors(IF_MV(int drive,) unsigned long start, int count, void* bu | |||
571 | int ret = 0; | 571 | int ret = 0; |
572 | unsigned int _count, chip_size = chip_info->page_size; | 572 | unsigned int _count, chip_size = chip_info->page_size; |
573 | unsigned long _start; | 573 | unsigned long _start; |
574 | 574 | ||
575 | logf("start"); | 575 | logf("start"); |
576 | mutex_lock(&nand_mtx); | 576 | mutex_lock(&nand_mtx); |
577 | 577 | ||
578 | _start = start << 9; | 578 | _start = start << 9; |
579 | _start += 0x200000; /* skip BL */ | 579 | _start += 0x200000; /* skip BL */ |
580 | _count = count << 9; | 580 | _count = count << 9; |
581 | 581 | ||
582 | __nand_select(); | 582 | __nand_select(); |
583 | ret = read_sector(_start, _count, buf, chip_size); | 583 | ret = read_sector(_start, _count, buf, chip_size); |
584 | __nand_deselect(); | 584 | __nand_deselect(); |
585 | 585 | ||
586 | mutex_unlock(&nand_mtx); | 586 | mutex_unlock(&nand_mtx); |
587 | 587 | ||
588 | logf("nand_read_sectors(%ld, %d, 0x%x): %d", start, count, (int)buf, ret); | 588 | logf("nand_read_sectors(%ld, %d, 0x%x): %d", start, count, (int)buf, ret); |
589 | 589 | ||
590 | return ret; | 590 | return ret; |
@@ -598,20 +598,20 @@ int nand_write_sectors(IF_MV(int drive,) unsigned long start, int count, const v | |||
598 | int ret = 0; | 598 | int ret = 0; |
599 | unsigned int _count, chip_size = chip_info->page_size; | 599 | unsigned int _count, chip_size = chip_info->page_size; |
600 | unsigned long _start; | 600 | unsigned long _start; |
601 | 601 | ||
602 | logf("start"); | 602 | logf("start"); |
603 | mutex_lock(&nand_mtx); | 603 | mutex_lock(&nand_mtx); |
604 | 604 | ||
605 | _start = start << 9; | 605 | _start = start << 9; |
606 | _start += chip_info->page_size * chip_info->pages_per_block; /* skip BL */ | 606 | _start += chip_info->page_size * chip_info->pages_per_block; /* skip BL */ |
607 | _count = count << 9; | 607 | _count = count << 9; |
608 | 608 | ||
609 | __nand_select(); | 609 | __nand_select(); |
610 | ret = write_sector(_start, _count, buf, chip_size); | 610 | ret = write_sector(_start, _count, buf, chip_size); |
611 | __nand_deselect(); | 611 | __nand_deselect(); |
612 | 612 | ||
613 | mutex_unlock(&nand_mtx); | 613 | mutex_unlock(&nand_mtx); |
614 | 614 | ||
615 | logf("nand_write_sectors(%ld, %d, 0x%x): %d", start, count, (int)buf, ret); | 615 | logf("nand_write_sectors(%ld, %d, 0x%x): %d", start, count, (int)buf, ret); |
616 | 616 | ||
617 | return ret; | 617 | return ret; |
@@ -667,7 +667,7 @@ void nand_get_info(IF_MV(int drive,) struct storage_info *info) | |||
667 | #ifdef HAVE_MULTIVOLUME | 667 | #ifdef HAVE_MULTIVOLUME |
668 | (void)drive; | 668 | (void)drive; |
669 | #endif | 669 | #endif |
670 | 670 | ||
671 | /* firmware version */ | 671 | /* firmware version */ |
672 | info->revision="0.00"; | 672 | info->revision="0.00"; |
673 | 673 | ||
@@ -685,7 +685,7 @@ int nand_num_drives(int first_drive) | |||
685 | { | 685 | { |
686 | /* We don't care which logical drive number(s) we have been assigned */ | 686 | /* We don't care which logical drive number(s) we have been assigned */ |
687 | (void)first_drive; | 687 | (void)first_drive; |
688 | 688 | ||
689 | return 1; | 689 | return 1; |
690 | } | 690 | } |
691 | #endif | 691 | #endif |