diff options
author | Aidan MacDonald <amachronic@protonmail.com> | 2021-05-12 14:28:32 +0100 |
---|---|---|
committer | Aidan MacDonald <amachronic@protonmail.com> | 2021-05-14 10:30:58 +0000 |
commit | ad64293ae6f8eb7d549277366e6078c2f7e0f371 (patch) | |
tree | 7005b539ce5c5c1d5f55c68177705801a06aa95b /firmware | |
parent | eb0336ededda8d64b0f5fd98853b85ea5aa46060 (diff) | |
download | rockbox-ad64293ae6f8eb7d549277366e6078c2f7e0f371.tar.gz rockbox-ad64293ae6f8eb7d549277366e6078c2f7e0f371.zip |
X1000: fix SD driver issues
- Added panic check for unaligned addresses
- Properly set 50 MHz high-speed mode timings
Change-Id: Ia0b3e5a6612c2053a28c2c3125de8ea92100912e
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/target/mips/ingenic_x1000/msc-x1000.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/firmware/target/mips/ingenic_x1000/msc-x1000.c b/firmware/target/mips/ingenic_x1000/msc-x1000.c index 62aa76988c..b8f23053dc 100644 --- a/firmware/target/mips/ingenic_x1000/msc-x1000.c +++ b/firmware/target/mips/ingenic_x1000/msc-x1000.c | |||
@@ -335,10 +335,12 @@ void msc_set_speed(msc_drv* d, int rate) | |||
335 | jz_writef(MSC_LPM(d->msc_nr), | 335 | jz_writef(MSC_LPM(d->msc_nr), |
336 | DRV_SEL_V(RISE_EDGE_DELAY_QTR_PHASE), | 336 | DRV_SEL_V(RISE_EDGE_DELAY_QTR_PHASE), |
337 | SMP_SEL_V(RISE_EDGE_DELAYED)); | 337 | SMP_SEL_V(RISE_EDGE_DELAYED)); |
338 | jz_writef(MSC_CTRL2(d->msc_nr), SPEED_V(HIGHSPEED)); | ||
338 | } else { | 339 | } else { |
339 | jz_writef(MSC_LPM(d->msc_nr), | 340 | jz_writef(MSC_LPM(d->msc_nr), |
340 | DRV_SEL_V(FALL_EDGE), | 341 | DRV_SEL_V(FALL_EDGE), |
341 | SMP_SEL_V(RISE_EDGE)); | 342 | SMP_SEL_V(RISE_EDGE)); |
343 | jz_writef(MSC_CTRL2(d->msc_nr), SPEED_V(DEFAULT)); | ||
342 | } | 344 | } |
343 | 345 | ||
344 | /* Restart clock if it was running before */ | 346 | /* Restart clock if it was running before */ |
@@ -443,10 +445,16 @@ void msc_async_start(msc_drv* d, msc_req* r) | |||
443 | else | 445 | else |
444 | discard_dcache_range(r->data, d->dma_desc.len); | 446 | discard_dcache_range(r->data, d->dma_desc.len); |
445 | 447 | ||
446 | /* TODO - should use MODE_SEL bit? what value of INCR? */ | 448 | /* Unaligned address for DMA doesn't seem to work correctly. |
447 | unsigned long addr_off = ((unsigned long)r->data) & 3; | 449 | * FAT FS driver should ensure proper alignment of all buffers, |
448 | jz_writef(MSC_DMAC(d->msc_nr), MODE_SEL(0), INCR(0), DMASEL(0), | 450 | * so in practice this panic should not occur, but if it does |
449 | ALIGN_EN(addr_off != 0 ? 1 : 0), ADDR_OFFSET(addr_off)); | 451 | * I want to hear about it. */ |
452 | if(UNLIKELY(d->dma_desc.mem & 3)) { | ||
453 | panicf("msc%d bad align: %08x", d->msc_nr, | ||
454 | (unsigned)d->dma_desc.mem); | ||
455 | } | ||
456 | |||
457 | jz_writef(MSC_DMAC(d->msc_nr), MODE_SEL(0), INCR(0), DMASEL(0)); | ||
450 | REG_MSC_DMANDA(d->msc_nr) = PHYSADDR(&d->dma_desc); | 458 | REG_MSC_DMANDA(d->msc_nr) = PHYSADDR(&d->dma_desc); |
451 | } | 459 | } |
452 | 460 | ||