Add ahb stuff for SD

This commit is contained in:
marcan 2009-03-07 20:44:54 +01:00 committed by bushing
parent 526c6d3865
commit 689f718c64
3 changed files with 10 additions and 3 deletions

View File

@ -74,7 +74,7 @@ void _ahb_flush_to(enum AHBDEV dev) {
//case 6: mask = 0x0010; break; //case 6: mask = 0x0010; break;
//case 7: mask = 0x0020; break; //case 7: mask = 0x0020; break;
//case 8: mask = 0x0040; break; //case 8: mask = 0x0040; break;
//case 9: mask = 0x0080; break; case AHB_SDHC: mask = 0x0080; break;
//case 10: mask = 0x0100; break; //case 10: mask = 0x0100; break;
//case 11: mask = 0x1000; break; //case 11: mask = 0x1000; break;
//case 12: mask = 0x0000; break; //case 12: mask = 0x0000; break;
@ -88,6 +88,7 @@ void _ahb_flush_to(enum AHBDEV dev) {
switch(dev) { switch(dev) {
// 2 to 10 in IOS, add more // 2 to 10 in IOS, add more
case AHB_NAND: case AHB_NAND:
case AHB_SDHC:
while((read32(HW_18C) & 0xF) == 9) while((read32(HW_18C) & 0xF) == 9)
set32(HW_188, 0x10000); set32(HW_188, 0x10000);
clear32(HW_188, 0x10000); clear32(HW_188, 0x10000);
@ -155,6 +156,7 @@ void ahb_flush_from(enum AHBDEV dev)
req = 1; req = 1;
break; break;
case AHB_NAND: case AHB_NAND:
case AHB_SDHC:
req = 8; req = 8;
break; break;
default: default:

View File

@ -13,6 +13,7 @@ enum AHBDEV {
AHB_STARLET = 0, //or MEM2?? AHB_STARLET = 0, //or MEM2??
AHB_1 = 1, //or MEM1?? AHB_1 = 1, //or MEM1??
AHB_NAND = 3, AHB_NAND = 3,
AHB_SDHC = 9,
}; };
void dc_flushrange(const void *start, u32 size); void dc_flushrange(const void *start, u32 size);

8
sdhc.c
View File

@ -597,10 +597,12 @@ static s32 __sd_cmd(sdhci_t *sdhci, u32 cmd, u32 type, u32 arg, u32 blk_cnt, voi
if(use_dma == 1) if(use_dma == 1)
{ {
sdhc_debug(sdhci->reg_base, "preparing buffer for SDMA transfer"); sdhc_debug(sdhci->reg_base, "preparing buffer for SDMA transfer");
if(mask == SDHC_BFR_WRITE_ENABLE) if(mask == SDHC_BFR_WRITE_ENABLE) {
dc_flushrange(buffer, blk_cnt * BLOCK_SIZE); dc_flushrange(buffer, blk_cnt * BLOCK_SIZE);
else ahb_flush_to(AHB_SDHC);
} else {
dc_invalidaterange(buffer, blk_cnt * BLOCK_SIZE); dc_invalidaterange(buffer, blk_cnt * BLOCK_SIZE);
}
__sd_write32(sdhci->reg_base + SDHC_SDMA_ADDR, dma_addr(buffer)); __sd_write32(sdhci->reg_base + SDHC_SDMA_ADDR, dma_addr(buffer));
__sd_write16(sdhci->reg_base + SDHC_NORMAL_INTERRUPT_STATUS, 0); __sd_write16(sdhci->reg_base + SDHC_NORMAL_INTERRUPT_STATUS, 0);
@ -699,6 +701,8 @@ static s32 __sd_cmd(sdhci_t *sdhci, u32 cmd, u32 type, u32 arg, u32 blk_cnt, voi
sdhc_debug(sdhci->reg_base, "transfer completed. disabling interrupts again and returning."); sdhc_debug(sdhci->reg_base, "transfer completed. disabling interrupts again and returning.");
__sd_write16(sdhci->reg_base + SDHC_NORMAL_INTERRUPT_STATUS, INTERRUPT_TRANSFER_COMPLETE | INTERRUPT_DMA); __sd_write16(sdhci->reg_base + SDHC_NORMAL_INTERRUPT_STATUS, INTERRUPT_TRANSFER_COMPLETE | INTERRUPT_DMA);
__sd_write16(sdhci->reg_base + SDHC_NORMAL_INTERRUPT_ENABLE, 0); __sd_write16(sdhci->reg_base + SDHC_NORMAL_INTERRUPT_ENABLE, 0);
if(mask == SDHC_BFR_READ_ENABLE)
ahb_flush_from(AHB_SDHC);
return 0; return 0;
} }
else if(retval & INTERRUPT_DMA) else if(retval & INTERRUPT_DMA)