summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/target/mips/ingenic_x1000/msc-x1000.c16
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