summaryrefslogtreecommitdiff
path: root/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4760.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/mips/ingenic_jz47xx/ata-nand-jz4760.c')
-rw-r--r--firmware/target/mips/ingenic_jz47xx/ata-nand-jz4760.c88
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)
148static void jz_nand_write_dma(void *source, unsigned int len, int bw) 148static 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
181static void jz_nand_read_dma(void *target, unsigned int len, int bw) 181static 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 */
250static void jz_rs_correct(unsigned char *dat, int idx, int mask) 250static 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