summaryrefslogtreecommitdiff
path: root/firmware/target/arm/as3525/ata_sd_as3525.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/as3525/ata_sd_as3525.c')
-rw-r--r--firmware/target/arm/as3525/ata_sd_as3525.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/firmware/target/arm/as3525/ata_sd_as3525.c b/firmware/target/arm/as3525/ata_sd_as3525.c
index 472e0fe09a..ab247c86d9 100644
--- a/firmware/target/arm/as3525/ata_sd_as3525.c
+++ b/firmware/target/arm/as3525/ata_sd_as3525.c
@@ -121,6 +121,10 @@ static struct event_queue sd_queue;
121bool sd_enabled = false; 121bool sd_enabled = false;
122#endif 122#endif
123 123
124#if defined(HAVE_MULTIDRIVE)
125static bool hs_card = false;
126#endif
127
124static struct wakeup transfer_completion_signal; 128static struct wakeup transfer_completion_signal;
125static volatile unsigned int transfer_error[NUM_VOLUMES]; 129static volatile unsigned int transfer_error[NUM_VOLUMES];
126#define PL180_MAX_TRANSFER_ERRORS 10 130#define PL180_MAX_TRANSFER_ERRORS 10
@@ -347,13 +351,18 @@ static int sd_init_card(const int drive)
347 351
348 sd_parse_csd(&card_info[drive]); 352 sd_parse_csd(&card_info[drive]);
349 353
354#if defined(HAVE_MULTIDRIVE)
355 hs_card = (card_info[drive].speed == 50000000) ? true : false;
356#endif
357
350 /* Boost MCICLK to operating speed */ 358 /* Boost MCICLK to operating speed */
351 if(drive == INTERNAL_AS3525) 359 if(drive == INTERNAL_AS3525)
352 MCI_CLOCK(drive) = MCI_QUARTERSPEED; /* MCICLK = PCLK/4 = 15.5MHz */ 360 MCI_CLOCK(drive) = MCI_HALFSPEED; /* MCICLK = IDE_CLK/2 = 25 MHz */
361#if defined(HAVE_MULTIDRIVE)
353 else 362 else
354 /* MCICLK = PCLK/2 = 31MHz(HS) or PCLK/4 = 15.5 Mhz (STD)*/ 363 /* MCICLK = PCLK/2 = 31MHz(HS) or PCLK/4 = 15.5 Mhz (STD)*/
355 MCI_CLOCK(drive) = ((card_info[drive].speed == 50000000) ? 364 MCI_CLOCK(drive) = (hs_card ? MCI_HALFSPEED : MCI_QUARTERSPEED);
356 MCI_HALFSPEED : MCI_QUARTERSPEED); 365#endif
357 366
358 /* CMD7 w/rca: Select card to put it in TRAN state */ 367 /* CMD7 w/rca: Select card to put it in TRAN state */
359 if(!send_cmd(drive, SD_SELECT_CARD, card_info[drive].rca, MCI_ARG, NULL)) 368 if(!send_cmd(drive, SD_SELECT_CARD, card_info[drive].rca, MCI_ARG, NULL))
@@ -733,10 +742,14 @@ static int sd_transfer_sectors(IF_MD2(int drive,) unsigned long start,
733 dma_enable_channel(0, dma_buf, MCI_FIFO(drive), 742 dma_enable_channel(0, dma_buf, MCI_FIFO(drive),
734 (drive == INTERNAL_AS3525) ? DMA_PERI_SD : DMA_PERI_SD_SLOT, 743 (drive == INTERNAL_AS3525) ? DMA_PERI_SD : DMA_PERI_SD_SLOT,
735 DMAC_FLOWCTRL_PERI_MEM_TO_PERI, true, false, 0, DMA_S8, NULL); 744 DMAC_FLOWCTRL_PERI_MEM_TO_PERI, true, false, 0, DMA_S8, NULL);
736 745#if defined(HAVE_MULTIDRIVE)
737 /*Small delay for writes prevents data crc failures at lower freqs*/ 746 /*Small delay for writes prevents data crc failures at lower freqs*/
738 int write_delay = 125; 747 if((drive == SD_SLOT_AS3525) && !hs_card)
739 while(write_delay--); 748 {
749 int write_delay = 125;
750 while(write_delay--);
751 }
752#endif
740 } 753 }
741 else 754 else
742 dma_enable_channel(0, MCI_FIFO(drive), dma_buf, 755 dma_enable_channel(0, MCI_FIFO(drive), dma_buf,