Skip to content

Commit aa17acd

Browse files
committed
drivers: sdhc: litex: use new mode
use new mode for litesdcard Signed-off-by: Fin Maaß <[email protected]>
1 parent 3ed9d78 commit aa17acd

File tree

2 files changed

+22
-65
lines changed

2 files changed

+22
-65
lines changed

drivers/sdhc/sdhc_litex_litesdcard.c

Lines changed: 17 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -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), \

dts/riscv/riscv32-litex-vexriscv.dtsi

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -147,15 +147,10 @@
147147
<0xf0001850 0x4>,
148148
<0xf0001854 0x4>,
149149
<0xf0001858 0x4>,
150-
<0xf000185c 0x8>,
150+
<0xf000185c 0x4>,
151+
<0xf0001860 0x4>,
151152
<0xf0001864 0x4>,
152-
<0xf0001868 0x4>,
153-
<0xf000186c 0x4>,
154-
<0xf0001870 0x4>,
155-
<0xf0001874 0x4>,
156-
<0xf0001878 0x4>,
157-
<0xf000187c 0x4>,
158-
<0xf0001880 0x4>;
153+
<0xf0001868 0x4>;
159154
reg-names = "phy_card_detect",
160155
"phy_clocker_divider",
161156
"phy_init_initialize",
@@ -169,22 +164,17 @@
169164
"core_data_event",
170165
"core_block_length",
171166
"core_block_count",
172-
"block2mem_dma_base",
173-
"block2mem_dma_length",
174-
"block2mem_dma_enable",
175-
"block2mem_dma_done",
176-
"block2mem_dma_loop",
177-
"block2mem_dma_offset",
178167
"mem2block_dma_base",
179168
"mem2block_dma_length",
180169
"mem2block_dma_enable",
181170
"mem2block_dma_done",
182171
"mem2block_dma_loop",
183172
"mem2block_dma_offset",
173+
"mem2block_dma_we",
184174
"ev_status",
185175
"ev_pending",
186176
"ev_enable";
187-
interrupts = <2 0>;
177+
interrupts = <2 1>;
188178
// status = "disabled";
189179
status = "okay";
190180
mmc {

0 commit comments

Comments
 (0)