2 * Copyright (c) 2018, STMicroelectronics - All Rights Reserved
4 * SPDX-License-Identifier: BSD-3-Clause
8 #include <arch_helpers.h>
11 #include <delay_timer.h>
12 #include <dt-bindings/clock/stm32mp1-clks.h>
13 #include <dt-bindings/reset/stm32mp1-resets.h>
19 #include <stm32_sdmmc2.h>
20 #include <stm32mp1_clk.h>
21 #include <stm32mp1_dt.h>
22 #include <stm32mp1_rcc.h>
23 #include <stm32mp1_reset.h>
27 /* Registers offsets */
28 #define SDMMC_POWER 0x00U
29 #define SDMMC_CLKCR 0x04U
30 #define SDMMC_ARGR 0x08U
31 #define SDMMC_CMDR 0x0CU
32 #define SDMMC_RESPCMDR 0x10U
33 #define SDMMC_RESP1R 0x14U
34 #define SDMMC_RESP2R 0x18U
35 #define SDMMC_RESP3R 0x1CU
36 #define SDMMC_RESP4R 0x20U
37 #define SDMMC_DTIMER 0x24U
38 #define SDMMC_DLENR 0x28U
39 #define SDMMC_DCTRLR 0x2CU
40 #define SDMMC_DCNTR 0x30U
41 #define SDMMC_STAR 0x34U
42 #define SDMMC_ICR 0x38U
43 #define SDMMC_MASKR 0x3CU
44 #define SDMMC_ACKTIMER 0x40U
45 #define SDMMC_IDMACTRLR 0x50U
46 #define SDMMC_IDMABSIZER 0x54U
47 #define SDMMC_IDMABASE0R 0x58U
48 #define SDMMC_IDMABASE1R 0x5CU
49 #define SDMMC_FIFOR 0x80U
51 /* SDMMC power control register */
52 #define SDMMC_POWER_PWRCTRL GENMASK(1, 0)
53 #define SDMMC_POWER_DIRPOL BIT(4)
55 /* SDMMC clock control register */
56 #define SDMMC_CLKCR_WIDBUS_4 BIT(14)
57 #define SDMMC_CLKCR_WIDBUS_8 BIT(15)
58 #define SDMMC_CLKCR_NEGEDGE BIT(16)
59 #define SDMMC_CLKCR_HWFC_EN BIT(17)
60 #define SDMMC_CLKCR_SELCLKRX_0 BIT(20)
62 /* SDMMC command register */
63 #define SDMMC_CMDR_CMDTRANS BIT(6)
64 #define SDMMC_CMDR_CMDSTOP BIT(7)
65 #define SDMMC_CMDR_WAITRESP GENMASK(9, 8)
66 #define SDMMC_CMDR_WAITRESP_SHORT BIT(8)
67 #define SDMMC_CMDR_WAITRESP_SHORT_NOCRC BIT(9)
68 #define SDMMC_CMDR_CPSMEN BIT(12)
70 /* SDMMC data control register */
71 #define SDMMC_DCTRLR_DTEN BIT(0)
72 #define SDMMC_DCTRLR_DTDIR BIT(1)
73 #define SDMMC_DCTRLR_DTMODE GENMASK(3, 2)
74 #define SDMMC_DCTRLR_DBLOCKSIZE_0 BIT(4)
75 #define SDMMC_DCTRLR_DBLOCKSIZE_1 BIT(5)
76 #define SDMMC_DCTRLR_DBLOCKSIZE_3 BIT(7)
77 #define SDMMC_DCTRLR_DBLOCKSIZE GENMASK(7, 4)
78 #define SDMMC_DCTRLR_FIFORST BIT(13)
80 #define SDMMC_DCTRLR_CLEAR_MASK (SDMMC_DCTRLR_DTEN | \
81 SDMMC_DCTRLR_DTDIR | \
82 SDMMC_DCTRLR_DTMODE | \
83 SDMMC_DCTRLR_DBLOCKSIZE)
84 #define SDMMC_DBLOCKSIZE_8 (SDMMC_DCTRLR_DBLOCKSIZE_0 | \
85 SDMMC_DCTRLR_DBLOCKSIZE_1)
86 #define SDMMC_DBLOCKSIZE_512 (SDMMC_DCTRLR_DBLOCKSIZE_0 | \
87 SDMMC_DCTRLR_DBLOCKSIZE_3)
89 /* SDMMC status register */
90 #define SDMMC_STAR_CCRCFAIL BIT(0)
91 #define SDMMC_STAR_DCRCFAIL BIT(1)
92 #define SDMMC_STAR_CTIMEOUT BIT(2)
93 #define SDMMC_STAR_DTIMEOUT BIT(3)
94 #define SDMMC_STAR_TXUNDERR BIT(4)
95 #define SDMMC_STAR_RXOVERR BIT(5)
96 #define SDMMC_STAR_CMDREND BIT(6)
97 #define SDMMC_STAR_CMDSENT BIT(7)
98 #define SDMMC_STAR_DATAEND BIT(8)
99 #define SDMMC_STAR_DBCKEND BIT(10)
100 #define SDMMC_STAR_DPSMACT BIT(12)
101 #define SDMMC_STAR_RXFIFOHF BIT(15)
102 #define SDMMC_STAR_RXFIFOE BIT(19)
103 #define SDMMC_STAR_IDMATE BIT(27)
104 #define SDMMC_STAR_IDMABTC BIT(28)
106 /* SDMMC DMA control register */
107 #define SDMMC_IDMACTRLR_IDMAEN BIT(0)
109 #define SDMMC_STATIC_FLAGS (SDMMC_STAR_CCRCFAIL | \
110 SDMMC_STAR_DCRCFAIL | \
111 SDMMC_STAR_CTIMEOUT | \
112 SDMMC_STAR_DTIMEOUT | \
113 SDMMC_STAR_TXUNDERR | \
114 SDMMC_STAR_RXOVERR | \
115 SDMMC_STAR_CMDREND | \
116 SDMMC_STAR_CMDSENT | \
117 SDMMC_STAR_DATAEND | \
118 SDMMC_STAR_DBCKEND | \
119 SDMMC_STAR_IDMATE | \
122 #define TIMEOUT_10_MS (plat_get_syscnt_freq2() / 100U)
123 #define TIMEOUT_1_S plat_get_syscnt_freq2()
125 #define DT_SDMMC2_COMPAT "st,stm32-sdmmc2"
127 static void stm32_sdmmc2_init(void);
128 static int stm32_sdmmc2_send_cmd_req(struct mmc_cmd
*cmd
);
129 static int stm32_sdmmc2_send_cmd(struct mmc_cmd
*cmd
);
130 static int stm32_sdmmc2_set_ios(unsigned int clk
, unsigned int width
);
131 static int stm32_sdmmc2_prepare(int lba
, uintptr_t buf
, size_t size
);
132 static int stm32_sdmmc2_read(int lba
, uintptr_t buf
, size_t size
);
133 static int stm32_sdmmc2_write(int lba
, uintptr_t buf
, size_t size
);
135 static const struct mmc_ops stm32_sdmmc2_ops
= {
136 .init
= stm32_sdmmc2_init
,
137 .send_cmd
= stm32_sdmmc2_send_cmd
,
138 .set_ios
= stm32_sdmmc2_set_ios
,
139 .prepare
= stm32_sdmmc2_prepare
,
140 .read
= stm32_sdmmc2_read
,
141 .write
= stm32_sdmmc2_write
,
144 static struct stm32_sdmmc2_params sdmmc2_params
;
146 #pragma weak plat_sdmmc2_use_dma
147 bool plat_sdmmc2_use_dma(unsigned int instance
, unsigned int memory
)
152 static void stm32_sdmmc2_init(void)
155 uintptr_t base
= sdmmc2_params
.reg_base
;
157 clock_div
= div_round_up(sdmmc2_params
.clk_rate
,
158 STM32MP1_MMC_INIT_FREQ
* 2);
160 mmio_write_32(base
+ SDMMC_CLKCR
, SDMMC_CLKCR_HWFC_EN
| clock_div
|
161 sdmmc2_params
.negedge
|
162 sdmmc2_params
.pin_ckin
);
164 mmio_write_32(base
+ SDMMC_POWER
,
165 SDMMC_POWER_PWRCTRL
| sdmmc2_params
.dirpol
);
170 static int stm32_sdmmc2_stop_transfer(void)
172 struct mmc_cmd cmd_stop
;
174 zeromem(&cmd_stop
, sizeof(struct mmc_cmd
));
176 cmd_stop
.cmd_idx
= MMC_CMD(12);
177 cmd_stop
.resp_type
= MMC_RESPONSE_R1B
;
179 return stm32_sdmmc2_send_cmd(&cmd_stop
);
182 static int stm32_sdmmc2_send_cmd_req(struct mmc_cmd
*cmd
)
184 uint32_t flags_cmd
, status
;
185 uint32_t flags_data
= 0;
187 uintptr_t base
= sdmmc2_params
.reg_base
;
188 unsigned int cmd_reg
, arg_reg
, start
;
194 flags_cmd
= SDMMC_STAR_CTIMEOUT
;
195 arg_reg
= cmd
->cmd_arg
;
197 if ((mmio_read_32(base
+ SDMMC_CMDR
) & SDMMC_CMDR_CPSMEN
) != 0U) {
198 mmio_write_32(base
+ SDMMC_CMDR
, 0);
201 cmd_reg
= cmd
->cmd_idx
| SDMMC_CMDR_CPSMEN
;
203 if (cmd
->resp_type
== 0U) {
204 flags_cmd
|= SDMMC_STAR_CMDSENT
;
207 if ((cmd
->resp_type
& MMC_RSP_48
) != 0U) {
208 if ((cmd
->resp_type
& MMC_RSP_136
) != 0U) {
209 flags_cmd
|= SDMMC_STAR_CMDREND
;
210 cmd_reg
|= SDMMC_CMDR_WAITRESP
;
211 } else if ((cmd
->resp_type
& MMC_RSP_CRC
) != 0U) {
212 flags_cmd
|= SDMMC_STAR_CMDREND
| SDMMC_STAR_CCRCFAIL
;
213 cmd_reg
|= SDMMC_CMDR_WAITRESP_SHORT
;
215 flags_cmd
|= SDMMC_STAR_CMDREND
;
216 cmd_reg
|= SDMMC_CMDR_WAITRESP_SHORT_NOCRC
;
220 switch (cmd
->cmd_idx
) {
222 arg_reg
|= OCR_POWERUP
;
225 if (sdmmc2_params
.device_info
->mmc_dev_type
== MMC_IS_EMMC
) {
226 cmd_reg
|= SDMMC_CMDR_CMDTRANS
;
230 cmd_reg
|= SDMMC_CMDR_CMDSTOP
;
234 cmd_reg
|= SDMMC_CMDR_CMDTRANS
;
235 if (sdmmc2_params
.use_dma
) {
236 flags_data
|= SDMMC_STAR_DCRCFAIL
|
237 SDMMC_STAR_DTIMEOUT
|
244 arg_reg
|= OCR_3_2_3_3
| OCR_3_3_3_4
;
247 cmd_reg
|= SDMMC_CMDR_CMDTRANS
;
248 if (sdmmc2_params
.use_dma
) {
249 flags_data
|= SDMMC_STAR_DCRCFAIL
|
250 SDMMC_STAR_DTIMEOUT
|
261 if ((cmd
->resp_type
& MMC_RSP_BUSY
) != 0U) {
262 mmio_write_32(base
+ SDMMC_DTIMER
, UINT32_MAX
);
265 mmio_write_32(base
+ SDMMC_ARGR
, arg_reg
);
267 mmio_write_32(base
+ SDMMC_CMDR
, cmd_reg
);
269 status
= mmio_read_32(base
+ SDMMC_STAR
);
271 start
= get_timer(0);
273 while ((status
& flags_cmd
) == 0U) {
274 if (get_timer(start
) > TIMEOUT_10_MS
) {
276 ERROR("%s: timeout 10ms (cmd = %d,status = %x)\n",
277 __func__
, cmd
->cmd_idx
, status
);
281 status
= mmio_read_32(base
+ SDMMC_STAR
);
284 if ((status
& (SDMMC_STAR_CTIMEOUT
| SDMMC_STAR_CCRCFAIL
)) != 0U) {
285 if ((status
& SDMMC_STAR_CTIMEOUT
) != 0U) {
288 * Those timeouts can occur, and framework will handle
289 * the retries. CMD8 is expected to return this timeout
292 if (!((cmd
->cmd_idx
== MMC_CMD(1)) ||
293 (cmd
->cmd_idx
== MMC_CMD(13)) ||
294 ((cmd
->cmd_idx
== MMC_CMD(8)) &&
295 (cmd
->resp_type
== MMC_RESPONSE_R7
)))) {
296 ERROR("%s: CTIMEOUT (cmd = %d,status = %x)\n",
297 __func__
, cmd
->cmd_idx
, status
);
301 ERROR("%s: CRCFAIL (cmd = %d,status = %x)\n",
302 __func__
, cmd
->cmd_idx
, status
);
308 if ((cmd_reg
& SDMMC_CMDR_WAITRESP
) != 0U) {
309 if ((cmd
->cmd_idx
== MMC_CMD(9)) &&
310 ((cmd_reg
& SDMMC_CMDR_WAITRESP
) == SDMMC_CMDR_WAITRESP
)) {
311 /* Need to invert response to match CSD structure */
312 cmd
->resp_data
[0] = mmio_read_32(base
+ SDMMC_RESP4R
);
313 cmd
->resp_data
[1] = mmio_read_32(base
+ SDMMC_RESP3R
);
314 cmd
->resp_data
[2] = mmio_read_32(base
+ SDMMC_RESP2R
);
315 cmd
->resp_data
[3] = mmio_read_32(base
+ SDMMC_RESP1R
);
317 cmd
->resp_data
[0] = mmio_read_32(base
+ SDMMC_RESP1R
);
318 if ((cmd_reg
& SDMMC_CMDR_WAITRESP
) ==
319 SDMMC_CMDR_WAITRESP
) {
320 cmd
->resp_data
[1] = mmio_read_32(base
+
322 cmd
->resp_data
[2] = mmio_read_32(base
+
324 cmd
->resp_data
[3] = mmio_read_32(base
+
330 if (flags_data
== 0U) {
331 mmio_write_32(base
+ SDMMC_ICR
, SDMMC_STATIC_FLAGS
);
336 status
= mmio_read_32(base
+ SDMMC_STAR
);
338 start
= get_timer(0);
340 while ((status
& flags_data
) == 0U) {
341 if (get_timer(start
) > TIMEOUT_10_MS
) {
342 ERROR("%s: timeout 10ms (cmd = %d,status = %x)\n",
343 __func__
, cmd
->cmd_idx
, status
);
348 status
= mmio_read_32(base
+ SDMMC_STAR
);
351 if ((status
& (SDMMC_STAR_DTIMEOUT
| SDMMC_STAR_DCRCFAIL
|
352 SDMMC_STAR_TXUNDERR
| SDMMC_STAR_RXOVERR
|
353 SDMMC_STAR_IDMATE
)) != 0U) {
354 ERROR("%s: Error flag (cmd = %d,status = %x)\n", __func__
,
355 cmd
->cmd_idx
, status
);
360 mmio_write_32(base
+ SDMMC_ICR
, SDMMC_STATIC_FLAGS
);
361 mmio_clrbits_32(base
+ SDMMC_CMDR
, SDMMC_CMDR_CMDTRANS
);
364 int ret_stop
= stm32_sdmmc2_stop_transfer();
374 static int stm32_sdmmc2_send_cmd(struct mmc_cmd
*cmd
)
381 for (retry
= 0; retry
<= 3; retry
++) {
382 err
= stm32_sdmmc2_send_cmd_req(cmd
);
387 if ((cmd
->cmd_idx
== MMC_CMD(1)) ||
388 (cmd
->cmd_idx
== MMC_CMD(13))) {
389 return 0; /* Retry managed by framework */
392 /* Command 8 is expected to fail for eMMC */
393 if (!(cmd
->cmd_idx
== MMC_CMD(8))) {
394 WARN(" CMD%d, Retry: %d, Error: %d\n",
395 cmd
->cmd_idx
, retry
, err
);
404 static int stm32_sdmmc2_set_ios(unsigned int clk
, unsigned int width
)
406 uintptr_t base
= sdmmc2_params
.reg_base
;
407 uint32_t bus_cfg
= 0;
408 uint32_t clock_div
, max_freq
;
409 uint32_t clk_rate
= sdmmc2_params
.clk_rate
;
410 uint32_t max_bus_freq
= sdmmc2_params
.device_info
->max_bus_freq
;
413 case MMC_BUS_WIDTH_1
:
415 case MMC_BUS_WIDTH_4
:
416 bus_cfg
|= SDMMC_CLKCR_WIDBUS_4
;
418 case MMC_BUS_WIDTH_8
:
419 bus_cfg
|= SDMMC_CLKCR_WIDBUS_8
;
426 if (sdmmc2_params
.device_info
->mmc_dev_type
== MMC_IS_EMMC
) {
427 if (max_bus_freq
>= 52000000U) {
428 max_freq
= STM32MP1_EMMC_HIGH_SPEED_MAX_FREQ
;
430 max_freq
= STM32MP1_EMMC_NORMAL_SPEED_MAX_FREQ
;
433 if (max_bus_freq
>= 50000000U) {
434 max_freq
= STM32MP1_SD_HIGH_SPEED_MAX_FREQ
;
436 max_freq
= STM32MP1_SD_NORMAL_SPEED_MAX_FREQ
;
440 clock_div
= div_round_up(clk_rate
, max_freq
* 2);
442 mmio_write_32(base
+ SDMMC_CLKCR
,
443 SDMMC_CLKCR_HWFC_EN
| clock_div
| bus_cfg
|
444 sdmmc2_params
.negedge
|
445 sdmmc2_params
.pin_ckin
);
450 static int stm32_sdmmc2_prepare(int lba
, uintptr_t buf
, size_t size
)
454 uintptr_t base
= sdmmc2_params
.reg_base
;
455 uint32_t data_ctrl
= SDMMC_DCTRLR_DTDIR
;
458 data_ctrl
|= SDMMC_DBLOCKSIZE_8
;
460 data_ctrl
|= SDMMC_DBLOCKSIZE_512
;
463 sdmmc2_params
.use_dma
= plat_sdmmc2_use_dma(base
, buf
);
465 if (sdmmc2_params
.use_dma
) {
466 inv_dcache_range(buf
, size
);
470 mmio_write_32(base
+ SDMMC_DTIMER
, UINT32_MAX
);
472 mmio_write_32(base
+ SDMMC_DLENR
, 0);
474 mmio_clrsetbits_32(base
+ SDMMC_DCTRLR
,
475 SDMMC_DCTRLR_CLEAR_MASK
, SDMMC_DCTRLR_DTDIR
);
477 zeromem(&cmd
, sizeof(struct mmc_cmd
));
479 cmd
.cmd_idx
= MMC_CMD(16);
480 if (size
> MMC_BLOCK_SIZE
) {
481 cmd
.cmd_arg
= MMC_BLOCK_SIZE
;
486 cmd
.resp_type
= MMC_RESPONSE_R1
;
488 ret
= stm32_sdmmc2_send_cmd(&cmd
);
490 ERROR("CMD16 failed\n");
494 /* Prepare data command */
495 mmio_write_32(base
+ SDMMC_DTIMER
, UINT32_MAX
);
497 mmio_write_32(base
+ SDMMC_DLENR
, size
);
499 if (sdmmc2_params
.use_dma
) {
500 mmio_write_32(base
+ SDMMC_IDMACTRLR
,
501 SDMMC_IDMACTRLR_IDMAEN
);
502 mmio_write_32(base
+ SDMMC_IDMABASE0R
, buf
);
504 flush_dcache_range(buf
, size
);
507 mmio_clrsetbits_32(base
+ SDMMC_DCTRLR
,
508 SDMMC_DCTRLR_CLEAR_MASK
,
514 static int stm32_sdmmc2_read(int lba
, uintptr_t buf
, size_t size
)
516 uint32_t error_flags
= SDMMC_STAR_RXOVERR
| SDMMC_STAR_DCRCFAIL
|
518 uint32_t flags
= error_flags
| SDMMC_STAR_DATAEND
;
521 uintptr_t base
= sdmmc2_params
.reg_base
;
522 uintptr_t fifo_reg
= base
+ SDMMC_FIFOR
;
526 /* Assert buf is 4 bytes aligned */
527 assert((buf
& GENMASK(1, 0)) == 0U);
529 buffer
= (uint32_t *)buf
;
531 if (sdmmc2_params
.use_dma
) {
532 inv_dcache_range(buf
, size
);
537 if (size
<= MMC_BLOCK_SIZE
) {
538 flags
|= SDMMC_STAR_DBCKEND
;
541 start
= get_timer(0);
544 status
= mmio_read_32(base
+ SDMMC_STAR
);
546 if ((status
& error_flags
) != 0U) {
547 ERROR("%s: Read error (status = %x)\n", __func__
,
549 mmio_write_32(base
+ SDMMC_DCTRLR
,
550 SDMMC_DCTRLR_FIFORST
);
552 mmio_write_32(base
+ SDMMC_ICR
,
555 ret
= stm32_sdmmc2_stop_transfer();
563 if (get_timer(start
) > TIMEOUT_1_S
) {
564 ERROR("%s: timeout 1s (status = %x)\n",
566 mmio_write_32(base
+ SDMMC_ICR
,
569 ret
= stm32_sdmmc2_stop_transfer();
577 if (size
< (8U * sizeof(uint32_t))) {
578 if ((mmio_read_32(base
+ SDMMC_DCNTR
) > 0U) &&
579 ((status
& SDMMC_STAR_RXFIFOE
) == 0U)) {
580 *buffer
= mmio_read_32(fifo_reg
);
583 } else if ((status
& SDMMC_STAR_RXFIFOHF
) != 0U) {
586 /* Read data from SDMMC Rx FIFO */
587 for (count
= 0; count
< 8U; count
++) {
588 *buffer
= mmio_read_32(fifo_reg
);
592 } while ((status
& flags
) == 0U);
594 mmio_write_32(base
+ SDMMC_ICR
, SDMMC_STATIC_FLAGS
);
596 if ((status
& SDMMC_STAR_DPSMACT
) != 0U) {
597 WARN("%s: DPSMACT=1, send stop\n", __func__
);
598 return stm32_sdmmc2_stop_transfer();
604 static int stm32_sdmmc2_write(int lba
, uintptr_t buf
, size_t size
)
609 static int stm32_sdmmc2_dt_get_config(void)
613 const fdt32_t
*cuint
;
615 if (fdt_get_address(&fdt
) == 0) {
616 return -FDT_ERR_NOTFOUND
;
620 return -FDT_ERR_NOTFOUND
;
623 sdmmc_node
= fdt_node_offset_by_compatible(fdt
, -1, DT_SDMMC2_COMPAT
);
625 while (sdmmc_node
!= -FDT_ERR_NOTFOUND
) {
626 cuint
= fdt_getprop(fdt
, sdmmc_node
, "reg", NULL
);
631 if (fdt32_to_cpu(*cuint
) == sdmmc2_params
.reg_base
) {
635 sdmmc_node
= fdt_node_offset_by_compatible(fdt
, sdmmc_node
,
639 if (sdmmc_node
== -FDT_ERR_NOTFOUND
) {
640 return -FDT_ERR_NOTFOUND
;
643 if (fdt_check_status(sdmmc_node
) == 0) {
644 return -FDT_ERR_NOTFOUND
;
647 if (dt_set_pinctrl_config(sdmmc_node
) != 0) {
648 return -FDT_ERR_BADVALUE
;
651 cuint
= fdt_getprop(fdt
, sdmmc_node
, "clocks", NULL
);
653 return -FDT_ERR_NOTFOUND
;
657 sdmmc2_params
.clock_id
= fdt32_to_cpu(*cuint
);
659 cuint
= fdt_getprop(fdt
, sdmmc_node
, "resets", NULL
);
661 return -FDT_ERR_NOTFOUND
;
665 sdmmc2_params
.reset_id
= fdt32_to_cpu(*cuint
);
667 if ((fdt_getprop(fdt
, sdmmc_node
, "st,pin-ckin", NULL
)) != NULL
) {
668 sdmmc2_params
.pin_ckin
= SDMMC_CLKCR_SELCLKRX_0
;
671 if ((fdt_getprop(fdt
, sdmmc_node
, "st,dirpol", NULL
)) != NULL
) {
672 sdmmc2_params
.dirpol
= SDMMC_POWER_DIRPOL
;
675 if ((fdt_getprop(fdt
, sdmmc_node
, "st,negedge", NULL
)) != NULL
) {
676 sdmmc2_params
.negedge
= SDMMC_CLKCR_NEGEDGE
;
679 cuint
= fdt_getprop(fdt
, sdmmc_node
, "bus-width", NULL
);
681 switch (fdt32_to_cpu(*cuint
)) {
683 sdmmc2_params
.bus_width
= MMC_BUS_WIDTH_4
;
687 sdmmc2_params
.bus_width
= MMC_BUS_WIDTH_8
;
698 unsigned long long stm32_sdmmc2_mmc_get_device_size(void)
700 return sdmmc2_params
.device_info
->device_size
;
703 int stm32_sdmmc2_mmc_init(struct stm32_sdmmc2_params
*params
)
707 assert((params
!= NULL
) &&
708 ((params
->reg_base
& MMC_BLOCK_MASK
) == 0U) &&
709 ((params
->bus_width
== MMC_BUS_WIDTH_1
) ||
710 (params
->bus_width
== MMC_BUS_WIDTH_4
) ||
711 (params
->bus_width
== MMC_BUS_WIDTH_8
)));
713 memcpy(&sdmmc2_params
, params
, sizeof(struct stm32_sdmmc2_params
));
715 if (stm32_sdmmc2_dt_get_config() != 0) {
716 ERROR("%s: DT error\n", __func__
);
720 ret
= stm32mp1_clk_enable(sdmmc2_params
.clock_id
);
722 ERROR("%s: clock %d failed\n", __func__
,
723 sdmmc2_params
.clock_id
);
727 stm32mp1_reset_assert(sdmmc2_params
.reset_id
);
729 stm32mp1_reset_deassert(sdmmc2_params
.reset_id
);
732 sdmmc2_params
.clk_rate
= stm32mp1_clk_get_rate(sdmmc2_params
.clock_id
);
734 return mmc_init(&stm32_sdmmc2_ops
, sdmmc2_params
.clk_rate
,
735 sdmmc2_params
.bus_width
, sdmmc2_params
.flags
,
736 sdmmc2_params
.device_info
);