@@ -26,14 +26,12 @@ LOG_MODULE_REGISTER(sdhc_litex, CONFIG_SDHC_LOG_LEVEL);
2626#define SDCARD_CTRL_RESP_SHORT_BUSY 3
2727
2828#define SDCARD_EV_CARD_DETECT_BIT 0
29- #define SDCARD_EV_BLOCK2MEM_DMA_BIT 1
29+ #define SDCARD_EV_CMD_DONE_BIT 1
3030#define SDCARD_EV_MEM2BLOCK_DMA_BIT 2
31- #define SDCARD_EV_CMD_DONE_BIT 3
3231
3332#define SDCARD_EV_CARD_DETECT BIT(SDCARD_EV_CARD_DETECT_BIT)
34- #define SDCARD_EV_BLOCK2MEM_DMA BIT(SDCARD_EV_BLOCK2MEM_DMA_BIT)
35- #define SDCARD_EV_MEM2BLOCK_DMA BIT(SDCARD_EV_MEM2BLOCK_DMA_BIT)
3633#define SDCARD_EV_CMD_DONE BIT(SDCARD_EV_CMD_DONE_BIT)
34+ #define SDCARD_EV_MEM2BLOCK_DMA BIT(SDCARD_EV_MEM2BLOCK_DMA_BIT)
3735
3836#define SDCARD_CORE_EVENT_DONE_BIT 0
3937#define SDCARD_CORE_EVENT_ERROR_BIT 1
@@ -62,9 +60,7 @@ struct sdhc_litex_config {
6260 mem_addr_t phy_card_detect_addr ;
6361 mem_addr_t phy_clocker_divider_addr ;
6462 mem_addr_t phy_init_initialize_addr ;
65- mem_addr_t phy_cmdr_timeout_addr ;
6663 mem_addr_t phy_dataw_status_addr ;
67- mem_addr_t phy_datar_timeout_addr ;
6864 mem_addr_t phy_settings_addr ;
6965 mem_addr_t core_cmd_argument_addr ;
7066 mem_addr_t core_cmd_command_addr ;
@@ -74,14 +70,11 @@ struct sdhc_litex_config {
7470 mem_addr_t core_data_event_addr ;
7571 mem_addr_t core_block_length_addr ;
7672 mem_addr_t core_block_count_addr ;
77- mem_addr_t block2mem_dma_base_addr ;
78- mem_addr_t block2mem_dma_length_addr ;
79- mem_addr_t block2mem_dma_enable_addr ;
80- mem_addr_t block2mem_dma_done_addr ;
8173 mem_addr_t mem2block_dma_base_addr ;
8274 mem_addr_t mem2block_dma_length_addr ;
8375 mem_addr_t mem2block_dma_enable_addr ;
8476 mem_addr_t mem2block_dma_done_addr ;
77+ mem_addr_t mem2block_dma_we_addr ;
8578 mem_addr_t ev_status_addr ;
8679 mem_addr_t ev_pending_addr ;
8780 mem_addr_t ev_enable_addr ;
@@ -180,16 +173,7 @@ static int litex_mmc_send_cmd(const struct device *dev, uint8_t cmd, uint8_t tra
180173
181174 litex_write8 (1 , dev_config -> core_cmd_send_addr );
182175
183- if (transfer != SDCARD_CTRL_DATA_TRANSFER_NONE ||
184- response_len == SDCARD_CTRL_RESP_SHORT_BUSY ) {
185- k_sem_take (& dev_data -> cmd_done_sem , K_FOREVER );
186-
187- LOG_DBG ("Command done event received" );
188- } else {
189- while (!IS_BIT_SET (litex_read8 (dev_config -> core_cmd_event_addr ),
190- SDCARD_CORE_EVENT_DONE_BIT )) {
191- }
192- }
176+ k_sem_take (& dev_data -> cmd_done_sem , K_FOREVER );
193177
194178 if ((response_len != SDCARD_CTRL_RESP_NONE ) && (response != NULL )) {
195179 litex_read32_array (dev_config -> core_cmd_response_addr , response , 4 );
@@ -227,6 +211,8 @@ static int sdhc_litex_wait_for_dma(const struct device *dev, struct sdhc_command
227211 return 0 ; /* No DMA for other commands */
228212 }
229213
214+ litex_write8 (0 , dev_config -> mem2block_dma_enable_addr );
215+
230216 if ((data -> blocks > 1 ) && dev_data -> no_cmd23_set_block_count ) {
231217 litex_mmc_send_cmd (dev , SD_STOP_TRANSMISSION , SDCARD_CTRL_DATA_TRANSFER_NONE ,
232218 data -> blocks , NULL , SDCARD_CTRL_RESP_SHORT_BUSY );
@@ -276,26 +262,21 @@ static void sdhc_litex_do_dma(const struct device *dev, struct sdhc_command *cmd
276262 case SD_WRITE_SINGLE_BLOCK :
277263 case SD_WRITE_MULTIPLE_BLOCK :
278264 * transfer = SDCARD_CTRL_DATA_TRANSFER_WRITE ;
279- litex_write8 (0 , dev_config -> mem2block_dma_enable_addr );
280- litex_write64 ((uint64_t )(uintptr_t )(data -> data ),
281- dev_config -> mem2block_dma_base_addr );
282- litex_write32 (data -> block_size * data -> blocks ,
283- dev_config -> mem2block_dma_length_addr );
284- litex_write8 (1 , dev_config -> mem2block_dma_enable_addr );
265+ litex_write8 (0 , dev_config -> mem2block_dma_we_addr );
285266 break ;
286267 default :
287268 * transfer = SDCARD_CTRL_DATA_TRANSFER_READ ;
288- litex_write32 ((sys_clock_hw_cycles_per_sec () / MSEC_PER_SEC ) * data -> timeout_ms ,
289- dev_config -> phy_datar_timeout_addr );
290- litex_write8 (0 , dev_config -> block2mem_dma_enable_addr );
291- litex_write64 ((uint64_t )(uintptr_t )(data -> data ),
292- dev_config -> block2mem_dma_base_addr );
293- litex_write32 (data -> block_size * data -> blocks ,
294- dev_config -> block2mem_dma_length_addr );
295- litex_write8 (1 , dev_config -> block2mem_dma_enable_addr );
269+ litex_write8 (BIT (0 ), dev_config -> mem2block_dma_we_addr );
296270 break ;
297271 }
298272
273+ litex_write8 (0 , dev_config -> mem2block_dma_enable_addr );
274+ litex_write64 ((uint64_t )(uintptr_t )(data -> data ),
275+ dev_config -> mem2block_dma_base_addr );
276+ litex_write32 (data -> block_size * data -> blocks ,
277+ dev_config -> mem2block_dma_length_addr );
278+ litex_write8 (1 , dev_config -> mem2block_dma_enable_addr );
279+
299280 litex_write16 (data -> block_size , dev_config -> core_block_length_addr );
300281 litex_write32 (data -> blocks , dev_config -> core_block_count_addr );
301282}
@@ -317,9 +298,6 @@ static int sdhc_litex_request(const struct device *dev, struct sdhc_command *cmd
317298 k_sleep (K_MSEC (1 ));
318299 }
319300
320- litex_write32 ((sys_clock_hw_cycles_per_sec () / MSEC_PER_SEC ) * cmd -> timeout_ms ,
321- dev_config -> phy_cmdr_timeout_addr );
322-
323301 switch (cmd -> response_type & SDHC_NATIVE_RESPONSE_MASK ) {
324302 case SD_RSP_TYPE_NONE :
325303 response_len = SDCARD_CTRL_RESP_NONE ;
@@ -452,8 +430,7 @@ static int sdhc_litex_init(const struct device *dev)
452430
453431 dev_config -> irq_config_func ();
454432
455- litex_write8 (SDCARD_EV_BLOCK2MEM_DMA | SDCARD_EV_MEM2BLOCK_DMA | SDCARD_EV_CMD_DONE ,
456- dev_config -> ev_enable_addr );
433+ litex_write8 (SDCARD_EV_MEM2BLOCK_DMA | SDCARD_EV_CMD_DONE , dev_config -> ev_enable_addr );
457434
458435 litex_write8 (SDCARD_PHY_SETTINGS_PHY_SPEED_1X , dev_config -> phy_settings_addr );
459436
@@ -482,11 +459,6 @@ static void sdhc_litex_irq_handler(const struct device *dev)
482459 litex_write8 (SDCARD_EV_CARD_DETECT , dev_config -> ev_pending_addr );
483460 }
484461
485- if (IS_BIT_SET (ev_pending & ev_enable , SDCARD_EV_BLOCK2MEM_DMA_BIT )) {
486- k_sem_give (& dev_data -> dma_done_sem );
487- litex_write8 (SDCARD_EV_BLOCK2MEM_DMA , dev_config -> ev_pending_addr );
488- }
489-
490462 if (IS_BIT_SET (ev_pending & ev_enable , SDCARD_EV_MEM2BLOCK_DMA_BIT )) {
491463 k_sem_give (& dev_data -> dma_done_sem );
492464 litex_write8 (SDCARD_EV_MEM2BLOCK_DMA , dev_config -> ev_pending_addr );
@@ -512,9 +484,7 @@ static void sdhc_litex_irq_handler(const struct device *dev)
512484 .phy_card_detect_addr = DT_INST_REG_ADDR_BY_NAME(n, phy_card_detect), \
513485 .phy_clocker_divider_addr = DT_INST_REG_ADDR_BY_NAME(n, phy_clocker_divider), \
514486 .phy_init_initialize_addr = DT_INST_REG_ADDR_BY_NAME(n, phy_init_initialize), \
515- .phy_cmdr_timeout_addr = DT_INST_REG_ADDR_BY_NAME(n, phy_cmdr_timeout), \
516487 .phy_dataw_status_addr = DT_INST_REG_ADDR_BY_NAME(n, phy_dataw_status), \
517- .phy_datar_timeout_addr = DT_INST_REG_ADDR_BY_NAME(n, phy_datar_timeout), \
518488 .phy_settings_addr = DT_INST_REG_ADDR_BY_NAME(n, phy_settings), \
519489 .core_cmd_argument_addr = DT_INST_REG_ADDR_BY_NAME(n, core_cmd_argument), \
520490 .core_cmd_command_addr = DT_INST_REG_ADDR_BY_NAME(n, core_cmd_command), \
@@ -524,14 +494,11 @@ static void sdhc_litex_irq_handler(const struct device *dev)
524494 .core_data_event_addr = DT_INST_REG_ADDR_BY_NAME(n, core_data_event), \
525495 .core_block_length_addr = DT_INST_REG_ADDR_BY_NAME(n, core_block_length), \
526496 .core_block_count_addr = DT_INST_REG_ADDR_BY_NAME(n, core_block_count), \
527- .block2mem_dma_base_addr = DT_INST_REG_ADDR_BY_NAME(n, block2mem_dma_base), \
528- .block2mem_dma_length_addr = DT_INST_REG_ADDR_BY_NAME(n, block2mem_dma_length), \
529- .block2mem_dma_enable_addr = DT_INST_REG_ADDR_BY_NAME(n, block2mem_dma_enable), \
530- .block2mem_dma_done_addr = DT_INST_REG_ADDR_BY_NAME(n, block2mem_dma_done), \
531497 .mem2block_dma_base_addr = DT_INST_REG_ADDR_BY_NAME(n, mem2block_dma_base), \
532498 .mem2block_dma_length_addr = DT_INST_REG_ADDR_BY_NAME(n, mem2block_dma_length), \
533499 .mem2block_dma_enable_addr = DT_INST_REG_ADDR_BY_NAME(n, mem2block_dma_enable), \
534500 .mem2block_dma_done_addr = DT_INST_REG_ADDR_BY_NAME(n, mem2block_dma_done), \
501+ .mem2block_dma_we_addr = DT_INST_REG_ADDR_BY_NAME(n, mem2block_dma_we), \
535502 .ev_status_addr = DT_INST_REG_ADDR_BY_NAME(n, ev_status), \
536503 .ev_pending_addr = DT_INST_REG_ADDR_BY_NAME(n, ev_pending), \
537504 .ev_enable_addr = DT_INST_REG_ADDR_BY_NAME(n, ev_enable), \
0 commit comments