diff options
author | Tomasz Moń <desowin@gmail.com> | 2011-12-21 09:58:03 +0000 |
---|---|---|
committer | Tomasz Moń <desowin@gmail.com> | 2011-12-21 09:58:03 +0000 |
commit | 013384f1387076a962388690341f8cb52e83f86c (patch) | |
tree | e414f6af5f4b3f2a61668f6c631ada12c072a871 | |
parent | 01415ad1b7d2d62c87d2bd2f433928a4a45e7859 (diff) | |
download | rockbox-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
-rw-r--r-- | firmware/target/arm/tms320dm320/sdmmc-dm320.c | 12 | ||||
-rw-r--r-- | firmware/target/arm/tms320dm320/system-dm320.c | 2 |
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 |