jz47xx: Further SD driver improvements
rockbox-gerrit-noreply--- via rockbox-cvs <[email protected]>
| Newsgroups | gmane.comp.systems.archos.rockbox.cvs |
|---|---|
| Message-ID | <[email protected]> |
commit 41567532a1da82d25a70553a5b1f3e6e35c82490 Author: Solomon Peachy <[email protected]> Date: Tue Feb 17 17:32:03 2026 -0500 jz47xx: Further SD driver improvements * Get rid of the SD_CIM_RESET meta-command and put all reset/init logic into one place * Don't double-issue the SD_GO_IDLE_STATE command * Explicitly set lowest speed upon reset Change-Id: I5abfe9f64997e39087b8a77d525f90c77733a1a8 diff --git a/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c b/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c index e20c681c1e..9883f2bf39 100644 --- a/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c +++ b/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c @@ -92,10 +92,6 @@ enum sd_result_t #define SD_CLOCK_FAST 24000000 /* 24 MHz for SD Cards */ #define SD_CLOCK_HIGH 48000000 /* 48 MHz for SD Cards */ -/* Extra commands for state control */ -/* Use negative numbers to disambiguate */ -#define SD_CIM_RESET -1 - /* Proprietary commands, illegal/reserved according to SD Specification 2.00 */ /* class 1 */ #define SD_READ_DAT_UNTIL_STOP 11 /* adtc [31:0] dadr R1 */ @@ -650,24 +646,10 @@ static int jz_sd_exec_cmd(struct sd_request *request) /* Stop clock when programming things */ jz_sd_stop_clock(); /* stop SD clock */ - if (request->cmd == SD_CIM_RESET) { - /* On reset, 1-bit bus width */ - use_4bit = 0; - - /* Reset MMC/SD controller */ - __msc_reset(); - - /* On reset, drop SD clock down */ - jz_sd_set_clock(MMC_CLOCK_SLOW); - - /* On reset, stop SD clock */ - jz_sd_stop_clock(); - } - /* Generic handling for all requests with data rx/tx */ if (has_data) { cmdat |= MSC_CMDAT_DATA_EN; -// if (request->nob > 1 && use_sbc[drive]) +// if (request->nob > 1 && use_sbc) // cmdat |= MSC_CMDAT_SEND_AS_STOP; #ifdef SD_DMA_ENABLE if (request->cnt >= 512) @@ -689,12 +671,10 @@ static int jz_sd_exec_cmd(struct sd_request *request) /* Per-command type handling */ switch (request->cmd) { - /* SD core extra command */ - case SD_CIM_RESET: - cmdat |= MSC_CMDAT_INIT; /* Initialization sequence sent prior to command */ - break; /* bc - broadcast - no response */ case SD_GO_IDLE_STATE: + cmdat |= MSC_CMDAT_INIT; /* Initialization sequence sent prior to command */ + /* Intentional Fallthrough */ case SD_SET_DSR: break; @@ -767,10 +747,7 @@ static int jz_sd_exec_cmd(struct sd_request *request) } /* Set command index */ - if (request->cmd == SD_CIM_RESET) - REG_MSC_CMD = SD_GO_IDLE_STATE; - else - REG_MSC_CMD = request->cmd; + REG_MSC_CMD = request->cmd; /* Set argument */ REG_MSC_ARG = request->arg; @@ -915,6 +892,7 @@ static void jz_sd_hardware_init(void) SD_RESET(); /* reset mmc/sd controller */ SD_IRQ_MASK(); /* mask all IRQs */ jz_sd_stop_clock(); /* stop SD clock */ + jz_sd_set_clock(MMC_CLOCK_SLOW); /* Drop to lowest speed */ #ifdef SD_DMA_ENABLE // __cpm_start_dmac(); // __dmac_enable_module(); @@ -1209,6 +1187,7 @@ static int __sd_init_device(void) memset(&card, 0, sizeof(tCardInfo)); use_4bit = 0; + use_sbc = 0; /* reset mmc/sd controller */ jz_sd_hardware_init(); @@ -1216,7 +1195,6 @@ static int __sd_init_device(void) if (!card_detect_target()) return 0; - sd_simple_cmd(&init_req, SD_CIM_RESET, 0, RESPONSE_NONE); sd_simple_cmd(&init_req, SD_GO_IDLE_STATE, 0, RESPONSE_NONE); sleep(HZ/2); /* Give the card/controller some rest */ diff --git a/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4760.c b/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4760.c index 7a3b450e65..4b9e0387b2 100644 --- a/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4760.c +++ b/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4760.c @@ -107,10 +107,6 @@ enum sd_result_t #define SD_CLOCK_FAST 24000000 /* 24 MHz for SD Cards */ #define SD_CLOCK_HIGH 48000000 /* 48 MHz for SD Cards */ -/* Extra commands for state control */ -/* Use negative numbers to disambiguate */ -#define SD_CIM_RESET -1 - /* Proprietary commands, illegal/reserved according to SD Specification 2.00 */ /* class 1 */ #define SD_READ_DAT_UNTIL_STOP 11 /* adtc [31:0] dadr R1 */ @@ -729,26 +725,6 @@ static int jz_sd_exec_cmd(const int drive, struct sd_request *request) jz_sd_stop_clock(drive); /* stop SD clock */ #endif - if (request->cmd == SD_CIM_RESET) { - /* On reset, 1-bit bus width */ - use_4bit[drive] = 0; - - /* On reset, stop SD clock */ - jz_sd_stop_clock(drive); - - /* Reset MMC/SD controller */ - __msc_reset(MSC_CHN(drive)); - - /* Drop SD clock down to lowest speed */ - jz_sd_set_clock(drive, MMC_CLOCK_SLOW); - -#if SD_AUTO_CLOCK - /* Re-enable clocks */ - REG_MSC_STRPCL(MSC_CHN(drive)) = MSC_STRPCL_CLOCK_CONTROL_START; - REG_MSC_LPM(drive) = MSC_SET_LPM; -#endif - } - /* Generic handling for all requests with data rx/tx */ if (has_data) { cmdat |= MSC_CMDAT_DATA_EN; @@ -771,12 +747,11 @@ static int jz_sd_exec_cmd(const int drive, struct sd_request *request) /* Per-command type handling */ switch (request->cmd) { - /* SD core extra command */ - case SD_CIM_RESET: - cmdat |= MSC_CMDAT_INIT; /* Initialization sequence sent prior to command */ - break; /* bc - broadcast - no response */ case SD_GO_IDLE_STATE: + cmdat |= MSC_CMDAT_INIT; /* Initialization sequence sent prior to command */ + /* Intentional Fallthrough */ + case SD_SET_DSR: break; @@ -792,7 +767,7 @@ static int jz_sd_exec_cmd(const int drive, struct sd_request *request) case SD_READ_SINGLE_BLOCK: case SD_READ_MULTIPLE_BLOCK: case SD_SWITCH_FUNC: - /* These READ data */ + /* These READ data */ break; case SD_WRITE_DAT_UNTIL_STOP: @@ -859,10 +834,7 @@ static int jz_sd_exec_cmd(const int drive, struct sd_request *request) } /* Set command index */ - if (request->cmd == SD_CIM_RESET) - REG_MSC_CMD(MSC_CHN(drive)) = SD_GO_IDLE_STATE; - else - REG_MSC_CMD(MSC_CHN(drive)) = request->cmd; + REG_MSC_CMD(MSC_CHN(drive)) = request->cmd; /* Set argument */ REG_MSC_ARG(MSC_CHN(drive)) = request->arg; @@ -1029,6 +1001,7 @@ static void jz_sd_hardware_init(const int drive) #else jz_sd_stop_clock(drive); /* stop SD clock */ #endif + jz_sd_set_clock(drive, MMC_CLOCK_SLOW); /* Drop to lowest speed */ } static void sd_send_cmd(const int drive, struct sd_request *request, int cmd, unsigned int arg, @@ -1317,6 +1290,7 @@ static int __sd_init_device(const int drive) memset(&card[drive], 0, sizeof(tCardInfo)); use_4bit[drive] = 0; + use_sbc[drive] = 0; active[drive] = 0; /* reset mmc/sd controller */ @@ -1326,7 +1300,6 @@ static int __sd_init_device(const int drive) if (!card_detect_target(drive)) return 0; - sd_simple_cmd(drive, &init_req, SD_CIM_RESET, 0, RESPONSE_NONE); sd_simple_cmd(drive, &init_req, SD_GO_IDLE_STATE, 0, RESPONSE_NONE); sleep(HZ/2); /* Give the card/controller some rest */ -- rockbox-cvs mailing list [email protected] https://lists.haxx.se/mailman/listinfo/rockbox-cvs