summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/target/arm/as3525/ata_sd_as3525.c38
-rw-r--r--firmware/target/arm/as3525/clock-target.h3
2 files changed, 8 insertions, 33 deletions
diff --git a/firmware/target/arm/as3525/ata_sd_as3525.c b/firmware/target/arm/as3525/ata_sd_as3525.c
index 7e5bc126af..342be613c5 100644
--- a/firmware/target/arm/as3525/ata_sd_as3525.c
+++ b/firmware/target/arm/as3525/ata_sd_as3525.c
@@ -117,32 +117,6 @@ static volatile bool retry;
117 117
118static inline void mci_delay(void) { int i = 0xffff; while(i--) ; } 118static inline void mci_delay(void) { int i = 0xffff; while(i--) ; }
119 119
120static void mci_set_clock_divider(const int drive, int divider)
121{
122 int clock = MCI_CLOCK(drive);
123
124 if(divider > 1)
125 {
126 /* use divide logic */
127 clock &= ~MCI_CLOCK_BYPASS;
128
129 /* convert divider to MCI_CLOCK logic */
130 divider = (divider/2) - 1;
131 if(divider >= 256)
132 divider = 255;
133 }
134 else
135 {
136 /* bypass dividing logic */
137 clock |= MCI_CLOCK_BYPASS;
138 divider = 0;
139 }
140
141 MCI_CLOCK(drive) = clock | divider;
142
143 mci_delay();
144}
145
146#ifdef HAVE_HOTSWAP 120#ifdef HAVE_HOTSWAP
147#if defined(SANSA_E200V2) || defined(SANSA_FUZE) 121#if defined(SANSA_E200V2) || defined(SANSA_FUZE)
148static int sd1_oneshot_callback(struct timeout *tmo) 122static int sd1_oneshot_callback(struct timeout *tmo)
@@ -348,7 +322,8 @@ static int sd_init_card(const int drive)
348 322
349 card_info[drive].initialized = 1; 323 card_info[drive].initialized = 1;
350 324
351 mci_set_clock_divider(drive, 1); /* full speed */ 325 MCI_CLOCK(drive) |= MCI_CLOCK_BYPASS; /* full speed */
326 mci_delay();
352 327
353 /* 328 /*
354 * enable bank switching 329 * enable bank switching
@@ -481,12 +456,9 @@ static void init_pl180_controller(const int drive)
481 456
482 MCI_SELECT(drive) = 0; 457 MCI_SELECT(drive) = 0;
483 458
484 MCI_CLOCK(drive) = MCI_CLOCK_ENABLE; 459 MCI_CLOCK(drive) = MCI_CLOCK_ENABLE |
485 MCI_CLOCK(drive) &= ~MCI_CLOCK_POWERSAVE; 460 (((CLK_DIV(AS3525_PCLK_FREQ, AS3525_SD_IDENT_FREQ)) / 2) - 1);
486 461 mci_delay();
487 /* set MCLK divider */
488 mci_set_clock_divider(drive,
489 CLK_DIV(AS3525_PCLK_FREQ, AS3525_SD_IDENT_FREQ));
490} 462}
491 463
492int sd_init(void) 464int sd_init(void)
diff --git a/firmware/target/arm/as3525/clock-target.h b/firmware/target/arm/as3525/clock-target.h
index 21fd4c65d2..f4b223cdff 100644
--- a/firmware/target/arm/as3525/clock-target.h
+++ b/firmware/target/arm/as3525/clock-target.h
@@ -63,5 +63,8 @@
63#endif 63#endif
64 64
65#define AS3525_SD_IDENT_FREQ 400000 /* must be between 100 & 400 kHz */ 65#define AS3525_SD_IDENT_FREQ 400000 /* must be between 100 & 400 kHz */
66#if ((CLK_DIV(AS3525_PCLK_FREQ, AS3525_SD_IDENT_FREQ) / 2) - 1) >= (1<<8) /* 8 bits */
67#error SD IDENTIFICATION frequency is too low : clock divider will not fit !
68#endif
66 69
67#endif /* CLOCK_TARGET_H */ 70#endif /* CLOCK_TARGET_H */