summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorTomasz Moń <desowin@gmail.com>2011-12-21 09:58:03 +0000
committerTomasz Moń <desowin@gmail.com>2011-12-21 09:58:03 +0000
commit013384f1387076a962388690341f8cb52e83f86c (patch)
treee414f6af5f4b3f2a61668f6c631ada12c072a871 /firmware
parent01415ad1b7d2d62c87d2bd2f433928a4a45e7859 (diff)
downloadrockbox-013384f1387076a962388690341f8cb52e83f86c.tar.gz
rockbox-013384f1387076a962388690341f8cb52e83f86c.zip
Sansa Connect: Add udelay() in sdmmc card initialization to prevent dead locks.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@31388 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/target/arm/tms320dm320/sdmmc-dm320.c12
-rw-r--r--firmware/target/arm/tms320dm320/system-dm320.c2
2 files changed, 10 insertions, 4 deletions
diff --git a/firmware/target/arm/tms320dm320/sdmmc-dm320.c b/firmware/target/arm/tms320dm320/sdmmc-dm320.c
index 6b5399d9a2..447ada21ae 100644
--- a/firmware/target/arm/tms320dm320/sdmmc-dm320.c
+++ b/firmware/target/arm/tms320dm320/sdmmc-dm320.c
@@ -348,6 +348,9 @@ static int sd_init_card(const int card_no)
348 bitclr16(&IO_MMC_CONTROL, MMC_CTRL_WIDTH); 348 bitclr16(&IO_MMC_CONTROL, MMC_CTRL_WIDTH);
349 sd_set_clock_rate(INITIAL_CLK); 349 sd_set_clock_rate(INITIAL_CLK);
350 350
351 /* Prevent dead lock */
352 udelay(100);
353
351 ret = sd_command(SD_GO_IDLE_STATE, 0, MMC_CMD_INITCLK, NULL); 354 ret = sd_command(SD_GO_IDLE_STATE, 0, MMC_CMD_INITCLK, NULL);
352 355
353 if (ret < 0) 356 if (ret < 0)
@@ -424,6 +427,9 @@ static int sd_init_card(const int card_no)
424 427
425 sd_set_clock_rate(currcard->speed); 428 sd_set_clock_rate(currcard->speed);
426 429
430 /* Prevent dead lock */
431 udelay(100);
432
427 ret = sd_command(SD_SELECT_CARD, currcard->rca, 433 ret = sd_command(SD_SELECT_CARD, currcard->rca,
428 SDHC_RESP_FMT_1, NULL); 434 SDHC_RESP_FMT_1, NULL);
429 if (ret < 0) 435 if (ret < 0)
@@ -893,7 +899,7 @@ int sd_init(void)
893 899
894 /* mmc module clock: 75 Mhz (AHB) / 2 = ~37.5 Mhz 900 /* mmc module clock: 75 Mhz (AHB) / 2 = ~37.5 Mhz
895 * (Frequencies above are taken from Sansa Connect's OF source code) */ 901 * (Frequencies above are taken from Sansa Connect's OF source code) */
896 IO_CLK_DIV3 = (IO_CLK_DIV3 & 0xFF00) | 0x02; /* OF uses 1 */ 902 IO_CLK_DIV3 = (IO_CLK_DIV3 & 0xFF00) | 0x01;
897 903
898 bitset16(&IO_CLK_MOD2, CLK_MOD2_MMC); 904 bitset16(&IO_CLK_MOD2, CLK_MOD2_MMC);
899 905
@@ -932,8 +938,8 @@ int sd_init(void)
932 938
933 sd_select_device(1); 939 sd_select_device(1);
934 940
935 /* Enable Memory Card CLK */ 941 /* Disable Memory Card CLK - it is enabled on demand by TMS320DM320 */
936 bitset16(&IO_MMC_MEM_CLK_CONTROL, (1 << 8)); 942 bitclr16(&IO_MMC_MEM_CLK_CONTROL, (1 << 8));
937 943
938 queue_init(&sd_queue, true); 944 queue_init(&sd_queue, true);
939 sd_thread_id = create_thread(sd_thread, sd_stack, sizeof(sd_stack), 945 sd_thread_id = create_thread(sd_thread, sd_stack, sizeof(sd_stack),
diff --git a/firmware/target/arm/tms320dm320/system-dm320.c b/firmware/target/arm/tms320dm320/system-dm320.c
index e455ade590..5d7872f2bc 100644
--- a/firmware/target/arm/tms320dm320/system-dm320.c
+++ b/firmware/target/arm/tms320dm320/system-dm320.c
@@ -435,7 +435,7 @@ void udelay(int usec) {
435 if (stop < count) 435 if (stop < count)
436 { 436 {
437 /* udelay will end after counter reset (tick) */ 437 /* udelay will end after counter reset (tick) */
438 while (((IO_TIMER1_TMCNT < stop) && (current_tick != prev_tick)) || 438 while ((IO_TIMER1_TMCNT < stop) ||
439 (current_tick == prev_tick)); /* ensure new tick */ 439 (current_tick == prev_tick)); /* ensure new tick */
440 } 440 }
441 else 441 else