1 /*
2  * Copyright (c) 2020 Amarula Solutions.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #define DT_DRV_COMPAT st_stm32_sdmmc
8 
9 #include <zephyr/devicetree.h>
10 #include <zephyr/drivers/disk.h>
11 #include <zephyr/drivers/clock_control.h>
12 #include <zephyr/drivers/clock_control/stm32_clock_control.h>
13 #include <zephyr/drivers/pinctrl.h>
14 #include <zephyr/drivers/gpio.h>
15 #include <zephyr/drivers/reset.h>
16 #include <zephyr/logging/log.h>
17 #include <zephyr/irq.h>
18 #include <soc.h>
19 #include <stm32_ll_rcc.h>
20 
21 LOG_MODULE_REGISTER(stm32_sdmmc, CONFIG_SDMMC_LOG_LEVEL);
22 
23 #define STM32_SDMMC_USE_DMA DT_NODE_HAS_PROP(DT_DRV_INST(0), dmas)
24 
25 #if STM32_SDMMC_USE_DMA
26 #include <zephyr/drivers/dma.h>
27 #include <zephyr/drivers/dma/dma_stm32.h>
28 #include <stm32_ll_dma.h>
29 #endif
30 
31 #ifndef MMC_TypeDef
32 #define MMC_TypeDef SDMMC_TypeDef
33 #endif
34 
35 #ifndef SDMMC_BUS_WIDE_1B
36 #define SDMMC_BUS_WIDE_1B SDIO_BUS_WIDE_1B
37 #endif
38 
39 #ifndef SDMMC_BUS_WIDE_4B
40 #define SDMMC_BUS_WIDE_4B SDIO_BUS_WIDE_4B
41 #endif
42 
43 #ifndef SDMMC_BUS_WIDE_8B
44 #define SDMMC_BUS_WIDE_8B SDIO_BUS_WIDE_8B
45 #endif
46 
47 typedef void (*irq_config_func_t)(const struct device *dev);
48 
49 #if STM32_SDMMC_USE_DMA
50 
51 static const uint32_t table_priority[] = {
52 	DMA_PRIORITY_LOW,
53 	DMA_PRIORITY_MEDIUM,
54 	DMA_PRIORITY_HIGH,
55 	DMA_PRIORITY_VERY_HIGH
56 };
57 
58 struct sdmmc_dma_stream {
59 	const struct device *dev;
60 	uint32_t channel;
61 	uint32_t channel_nb;
62 	DMA_TypeDef *reg;
63 	struct dma_config cfg;
64 };
65 #endif
66 
67 struct stm32_sdmmc_priv {
68 	irq_config_func_t irq_config;
69 	struct k_sem thread_lock;
70 	struct k_sem sync;
71 	SD_HandleTypeDef hsd;
72 	int status;
73 	struct k_work work;
74 	struct gpio_callback cd_cb;
75 	struct gpio_dt_spec cd;
76 	struct gpio_dt_spec pe;
77 	struct stm32_pclken *pclken;
78 	const struct pinctrl_dev_config *pcfg;
79 	const struct reset_dt_spec reset;
80 
81 #if STM32_SDMMC_USE_DMA
82 	struct sdmmc_dma_stream dma_rx;
83 	struct sdmmc_dma_stream dma_tx;
84 #endif
85 };
86 
87 #ifdef CONFIG_SDMMC_STM32_HWFC
stm32_sdmmc_fc_enable(struct stm32_sdmmc_priv * priv)88 static void stm32_sdmmc_fc_enable(struct stm32_sdmmc_priv *priv)
89 {
90 	MMC_TypeDef *sdmmcx = priv->hsd.Instance;
91 
92 	sdmmcx->CLKCR |= SDMMC_CLKCR_HWFC_EN;
93 }
94 #endif
95 
stm32_sdmmc_isr(const struct device * dev)96 static void stm32_sdmmc_isr(const struct device *dev)
97 {
98 	struct stm32_sdmmc_priv *priv = dev->data;
99 
100 	HAL_SD_IRQHandler(&priv->hsd);
101 }
102 
HAL_SD_TxCpltCallback(SD_HandleTypeDef * hsd)103 void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
104 {
105 	struct stm32_sdmmc_priv *priv =
106 		CONTAINER_OF(hsd, struct stm32_sdmmc_priv, hsd);
107 
108 	priv->status = hsd->ErrorCode;
109 
110 	k_sem_give(&priv->sync);
111 }
112 
HAL_SD_RxCpltCallback(SD_HandleTypeDef * hsd)113 void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
114 {
115 	struct stm32_sdmmc_priv *priv =
116 		CONTAINER_OF(hsd, struct stm32_sdmmc_priv, hsd);
117 
118 	priv->status = hsd->ErrorCode;
119 
120 	k_sem_give(&priv->sync);
121 }
122 
HAL_SD_ErrorCallback(SD_HandleTypeDef * hsd)123 void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd)
124 {
125 	struct stm32_sdmmc_priv *priv =
126 		CONTAINER_OF(hsd, struct stm32_sdmmc_priv, hsd);
127 
128 	priv->status = hsd->ErrorCode;
129 
130 	k_sem_give(&priv->sync);
131 }
132 
stm32_sdmmc_clock_enable(struct stm32_sdmmc_priv * priv)133 static int stm32_sdmmc_clock_enable(struct stm32_sdmmc_priv *priv)
134 {
135 	const struct device *clock;
136 
137 	/* HSI48 Clock is enabled through using the device tree */
138 	clock = DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE);
139 
140 	if (DT_INST_NUM_CLOCKS(0) > 1) {
141 		if (clock_control_configure(clock,
142 					    (clock_control_subsys_t)&priv->pclken[1],
143 					    NULL) != 0) {
144 			LOG_ERR("Failed to enable SDMMC domain clock");
145 			return -EIO;
146 		}
147 	}
148 
149 	if (IS_ENABLED(CONFIG_SDMMC_STM32_CLOCK_CHECK)) {
150 		uint32_t sdmmc_clock_rate;
151 
152 		if (clock_control_get_rate(clock,
153 					   (clock_control_subsys_t)&priv->pclken[1],
154 					   &sdmmc_clock_rate) != 0) {
155 			LOG_ERR("Failed to get SDMMC domain clock rate");
156 			return -EIO;
157 		}
158 
159 		if (sdmmc_clock_rate != MHZ(48)) {
160 			LOG_ERR("SDMMC Clock is not 48MHz (%d)", sdmmc_clock_rate);
161 			return -ENOTSUP;
162 		}
163 	}
164 
165 	/* Enable the APB clock for stm32_sdmmc */
166 	return clock_control_on(clock, (clock_control_subsys_t)&priv->pclken[0]);
167 }
168 
stm32_sdmmc_clock_disable(struct stm32_sdmmc_priv * priv)169 static int stm32_sdmmc_clock_disable(struct stm32_sdmmc_priv *priv)
170 {
171 	const struct device *clock;
172 
173 	clock = DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE);
174 
175 	return clock_control_off(clock,
176 				 (clock_control_subsys_t)&priv->pclken);
177 }
178 
179 #if STM32_SDMMC_USE_DMA
180 
stm32_sdmmc_dma_cb(const struct device * dev,void * arg,uint32_t channel,int status)181 static void stm32_sdmmc_dma_cb(const struct device *dev, void *arg,
182 			 uint32_t channel, int status)
183 {
184 	DMA_HandleTypeDef *hdma = arg;
185 
186 	if (status != 0) {
187 		LOG_ERR("DMA callback error with channel %d.", channel);
188 
189 	}
190 
191 	HAL_DMA_IRQHandler(hdma);
192 }
193 
stm32_sdmmc_configure_dma(DMA_HandleTypeDef * handle,struct sdmmc_dma_stream * dma)194 static int stm32_sdmmc_configure_dma(DMA_HandleTypeDef *handle, struct sdmmc_dma_stream *dma)
195 {
196 	int ret;
197 
198 	if (!device_is_ready(dma->dev)) {
199 		LOG_ERR("Failed to get dma dev");
200 		return -ENODEV;
201 	}
202 
203 	dma->cfg.user_data = handle;
204 
205 	ret = dma_config(dma->dev, dma->channel, &dma->cfg);
206 	if (ret != 0) {
207 		LOG_ERR("Failed to conig");
208 		return ret;
209 	}
210 
211 	handle->Instance                 = __LL_DMA_GET_STREAM_INSTANCE(dma->reg, dma->channel_nb);
212 	handle->Init.Channel             = dma->cfg.dma_slot * DMA_CHANNEL_1;
213 	handle->Init.PeriphInc           = DMA_PINC_DISABLE;
214 	handle->Init.MemInc              = DMA_MINC_ENABLE;
215 	handle->Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
216 	handle->Init.MemDataAlignment    = DMA_MDATAALIGN_WORD;
217 	handle->Init.Mode                = DMA_PFCTRL;
218 	handle->Init.Priority            = table_priority[dma->cfg.channel_priority],
219 	handle->Init.FIFOMode            = DMA_FIFOMODE_ENABLE;
220 	handle->Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
221 	handle->Init.MemBurst            = DMA_MBURST_INC4;
222 	handle->Init.PeriphBurst         = DMA_PBURST_INC4;
223 
224 	return ret;
225 }
226 
stm32_sdmmc_dma_init(struct stm32_sdmmc_priv * priv)227 static int stm32_sdmmc_dma_init(struct stm32_sdmmc_priv *priv)
228 {
229 	static DMA_HandleTypeDef dma_tx_handle;
230 	static DMA_HandleTypeDef dma_rx_handle;
231 	int err;
232 
233 	LOG_DBG("using dma");
234 
235 	err = stm32_sdmmc_configure_dma(&dma_tx_handle, &priv->dma_tx);
236 	if (err) {
237 		LOG_ERR("failed to init tx dma");
238 		return err;
239 	}
240 	__HAL_LINKDMA(&priv->hsd, hdmatx, dma_tx_handle);
241 	HAL_DMA_DeInit(&dma_tx_handle);
242 	HAL_DMA_Init(&dma_tx_handle);
243 
244 	err = stm32_sdmmc_configure_dma(&dma_rx_handle, &priv->dma_rx);
245 	if (err) {
246 		LOG_ERR("failed to init rx dma");
247 		return err;
248 	}
249 	__HAL_LINKDMA(&priv->hsd, hdmarx, dma_rx_handle);
250 	HAL_DMA_DeInit(&dma_rx_handle);
251 	HAL_DMA_Init(&dma_rx_handle);
252 
253 	return err;
254 }
255 
256 #endif
257 
stm32_sdmmc_access_init(struct disk_info * disk)258 static int stm32_sdmmc_access_init(struct disk_info *disk)
259 {
260 	const struct device *dev = disk->dev;
261 	struct stm32_sdmmc_priv *priv = dev->data;
262 	int err;
263 
264 	if (priv->status == DISK_STATUS_OK) {
265 		return 0;
266 	}
267 
268 	if (priv->status == DISK_STATUS_NOMEDIA) {
269 		return -ENODEV;
270 	}
271 
272 #if STM32_SDMMC_USE_DMA
273 	err = stm32_sdmmc_dma_init(priv);
274 	if (err) {
275 		LOG_ERR("DMA init failed");
276 		return err;
277 	}
278 #endif
279 
280 	err = stm32_sdmmc_clock_enable(priv);
281 	if (err) {
282 		LOG_ERR("failed to init clocks");
283 		return err;
284 	}
285 
286 	err = reset_line_toggle_dt(&priv->reset);
287 	if (err) {
288 		LOG_ERR("failed to reset peripheral");
289 		return err;
290 	}
291 
292 	err = HAL_SD_Init(&priv->hsd);
293 	if (err != HAL_OK) {
294 		LOG_ERR("failed to init stm32_sdmmc (ErrorCode 0x%X)", priv->hsd.ErrorCode);
295 		return -EIO;
296 	}
297 
298 #ifdef CONFIG_SDMMC_STM32_HWFC
299 	stm32_sdmmc_fc_enable(priv);
300 #endif
301 
302 	priv->status = DISK_STATUS_OK;
303 	return 0;
304 }
305 
stm32_sdmmc_access_deinit(struct stm32_sdmmc_priv * priv)306 static void stm32_sdmmc_access_deinit(struct stm32_sdmmc_priv *priv)
307 {
308 	HAL_SD_DeInit(&priv->hsd);
309 	stm32_sdmmc_clock_disable(priv);
310 }
311 
stm32_sdmmc_access_status(struct disk_info * disk)312 static int stm32_sdmmc_access_status(struct disk_info *disk)
313 {
314 	const struct device *dev = disk->dev;
315 	struct stm32_sdmmc_priv *priv = dev->data;
316 
317 	return priv->status;
318 }
319 
stm32_sdmmc_access_read(struct disk_info * disk,uint8_t * data_buf,uint32_t start_sector,uint32_t num_sector)320 static int stm32_sdmmc_access_read(struct disk_info *disk, uint8_t *data_buf,
321 				   uint32_t start_sector, uint32_t num_sector)
322 {
323 	const struct device *dev = disk->dev;
324 	struct stm32_sdmmc_priv *priv = dev->data;
325 	int err;
326 
327 	k_sem_take(&priv->thread_lock, K_FOREVER);
328 
329 #if STM32_SDMMC_USE_DMA || IS_ENABLED(DT_PROP(DT_DRV_INST(0), idma))
330 	err = HAL_SD_ReadBlocks_DMA(&priv->hsd, data_buf, start_sector,
331 				num_sector);
332 #else
333 	err = HAL_SD_ReadBlocks_IT(&priv->hsd, data_buf, start_sector,
334 				num_sector);
335 #endif
336 	if (err != HAL_OK) {
337 		LOG_ERR("sd read block failed %d", err);
338 		err = -EIO;
339 		goto end;
340 	}
341 
342 	k_sem_take(&priv->sync, K_FOREVER);
343 
344 	if (priv->status != DISK_STATUS_OK) {
345 		LOG_ERR("sd read error %d", priv->status);
346 		err = -EIO;
347 		goto end;
348 	}
349 
350 	while (HAL_SD_GetCardState(&priv->hsd) != HAL_SD_CARD_TRANSFER) {
351 	}
352 
353 end:
354 	k_sem_give(&priv->thread_lock);
355 	return err;
356 }
357 
stm32_sdmmc_access_write(struct disk_info * disk,const uint8_t * data_buf,uint32_t start_sector,uint32_t num_sector)358 static int stm32_sdmmc_access_write(struct disk_info *disk,
359 				    const uint8_t *data_buf,
360 				    uint32_t start_sector, uint32_t num_sector)
361 {
362 	const struct device *dev = disk->dev;
363 	struct stm32_sdmmc_priv *priv = dev->data;
364 	int err;
365 
366 	k_sem_take(&priv->thread_lock, K_FOREVER);
367 
368 #if STM32_SDMMC_USE_DMA || IS_ENABLED(DT_PROP(DT_DRV_INST(0), idma))
369 	err = HAL_SD_WriteBlocks_DMA(&priv->hsd, (uint8_t *)data_buf, start_sector,
370 				 num_sector);
371 #else
372 	err = HAL_SD_WriteBlocks_IT(&priv->hsd, (uint8_t *)data_buf, start_sector,
373 				 num_sector);
374 #endif
375 	if (err != HAL_OK) {
376 		LOG_ERR("sd write block failed %d", err);
377 		err = -EIO;
378 		goto end;
379 	}
380 
381 	k_sem_take(&priv->sync, K_FOREVER);
382 
383 	if (priv->status != DISK_STATUS_OK) {
384 		LOG_ERR("sd write error %d", priv->status);
385 		err = -EIO;
386 		goto end;
387 	}
388 
389 	while (HAL_SD_GetCardState(&priv->hsd) != HAL_SD_CARD_TRANSFER) {
390 	}
391 
392 end:
393 	k_sem_give(&priv->thread_lock);
394 	return err;
395 }
396 
stm32_sdmmc_access_ioctl(struct disk_info * disk,uint8_t cmd,void * buff)397 static int stm32_sdmmc_access_ioctl(struct disk_info *disk, uint8_t cmd,
398 				    void *buff)
399 {
400 	const struct device *dev = disk->dev;
401 	struct stm32_sdmmc_priv *priv = dev->data;
402 	HAL_SD_CardInfoTypeDef info;
403 	int err;
404 
405 	switch (cmd) {
406 	case DISK_IOCTL_GET_SECTOR_COUNT:
407 		err = HAL_SD_GetCardInfo(&priv->hsd, &info);
408 		if (err != HAL_OK) {
409 			return -EIO;
410 		}
411 		*(uint32_t *)buff = info.LogBlockNbr;
412 		break;
413 	case DISK_IOCTL_GET_SECTOR_SIZE:
414 		err = HAL_SD_GetCardInfo(&priv->hsd, &info);
415 		if (err != HAL_OK) {
416 			return -EIO;
417 		}
418 		*(uint32_t *)buff = info.LogBlockSize;
419 		break;
420 	case DISK_IOCTL_GET_ERASE_BLOCK_SZ:
421 		*(uint32_t *)buff = 1;
422 		break;
423 	case DISK_IOCTL_CTRL_SYNC:
424 		/* we use a blocking API, so nothing to do for sync */
425 		break;
426 	default:
427 		return -EINVAL;
428 	}
429 	return 0;
430 }
431 
432 static const struct disk_operations stm32_sdmmc_ops = {
433 	.init = stm32_sdmmc_access_init,
434 	.status = stm32_sdmmc_access_status,
435 	.read = stm32_sdmmc_access_read,
436 	.write = stm32_sdmmc_access_write,
437 	.ioctl = stm32_sdmmc_access_ioctl,
438 };
439 
440 static struct disk_info stm32_sdmmc_info = {
441 	.name = CONFIG_SDMMC_VOLUME_NAME,
442 	.ops = &stm32_sdmmc_ops,
443 };
444 
445 /*
446  * Check if the card is present or not. If no card detect gpio is set, assume
447  * the card is present. If reading the gpio fails for some reason, assume the
448  * card is there.
449  */
stm32_sdmmc_card_present(struct stm32_sdmmc_priv * priv)450 static bool stm32_sdmmc_card_present(struct stm32_sdmmc_priv *priv)
451 {
452 	int err;
453 
454 	if (!priv->cd.port) {
455 		return true;
456 	}
457 
458 	err = gpio_pin_get_dt(&priv->cd);
459 	if (err < 0) {
460 		LOG_WRN("reading card detect failed %d", err);
461 		return true;
462 	}
463 	return err;
464 }
465 
stm32_sdmmc_cd_handler(struct k_work * item)466 static void stm32_sdmmc_cd_handler(struct k_work *item)
467 {
468 	struct stm32_sdmmc_priv *priv = CONTAINER_OF(item,
469 						     struct stm32_sdmmc_priv,
470 						     work);
471 
472 	if (stm32_sdmmc_card_present(priv)) {
473 		LOG_DBG("card inserted");
474 		priv->status = DISK_STATUS_UNINIT;
475 	} else {
476 		LOG_DBG("card removed");
477 		stm32_sdmmc_access_deinit(priv);
478 		priv->status = DISK_STATUS_NOMEDIA;
479 	}
480 }
481 
stm32_sdmmc_cd_callback(const struct device * gpiodev,struct gpio_callback * cb,uint32_t pin)482 static void stm32_sdmmc_cd_callback(const struct device *gpiodev,
483 				    struct gpio_callback *cb,
484 				    uint32_t pin)
485 {
486 	struct stm32_sdmmc_priv *priv = CONTAINER_OF(cb,
487 						     struct stm32_sdmmc_priv,
488 						     cd_cb);
489 
490 	k_work_submit(&priv->work);
491 }
492 
stm32_sdmmc_card_detect_init(struct stm32_sdmmc_priv * priv)493 static int stm32_sdmmc_card_detect_init(struct stm32_sdmmc_priv *priv)
494 {
495 	int err;
496 
497 	if (!priv->cd.port) {
498 		return 0;
499 	}
500 
501 	if (!device_is_ready(priv->cd.port)) {
502 		return -ENODEV;
503 	}
504 
505 	gpio_init_callback(&priv->cd_cb, stm32_sdmmc_cd_callback,
506 			   1 << priv->cd.pin);
507 
508 	err = gpio_add_callback(priv->cd.port, &priv->cd_cb);
509 	if (err) {
510 		return err;
511 	}
512 
513 	err = gpio_pin_configure_dt(&priv->cd, GPIO_INPUT);
514 	if (err) {
515 		goto remove_callback;
516 	}
517 
518 	err = gpio_pin_interrupt_configure_dt(&priv->cd, GPIO_INT_EDGE_BOTH);
519 	if (err) {
520 		goto unconfigure_pin;
521 	}
522 	return 0;
523 
524 unconfigure_pin:
525 	gpio_pin_configure_dt(&priv->cd, GPIO_DISCONNECTED);
526 remove_callback:
527 	gpio_remove_callback(priv->cd.port, &priv->cd_cb);
528 	return err;
529 }
530 
stm32_sdmmc_card_detect_uninit(struct stm32_sdmmc_priv * priv)531 static int stm32_sdmmc_card_detect_uninit(struct stm32_sdmmc_priv *priv)
532 {
533 	if (!priv->cd.port) {
534 		return 0;
535 	}
536 
537 	gpio_pin_interrupt_configure_dt(&priv->cd, GPIO_INT_MODE_DISABLED);
538 	gpio_pin_configure_dt(&priv->cd, GPIO_DISCONNECTED);
539 	gpio_remove_callback(priv->cd.port, &priv->cd_cb);
540 	return 0;
541 }
542 
stm32_sdmmc_pwr_init(struct stm32_sdmmc_priv * priv)543 static int stm32_sdmmc_pwr_init(struct stm32_sdmmc_priv *priv)
544 {
545 	int err;
546 
547 	if (!priv->pe.port) {
548 		return 0;
549 	}
550 
551 	if (!device_is_ready(priv->pe.port)) {
552 		return -ENODEV;
553 	}
554 
555 	err = gpio_pin_configure_dt(&priv->pe, GPIO_OUTPUT_ACTIVE);
556 	if (err) {
557 		return err;
558 	}
559 
560 	k_sleep(K_MSEC(50));
561 
562 	return 0;
563 }
564 
stm32_sdmmc_pwr_uninit(struct stm32_sdmmc_priv * priv)565 static int stm32_sdmmc_pwr_uninit(struct stm32_sdmmc_priv *priv)
566 {
567 	if (!priv->pe.port) {
568 		return 0;
569 	}
570 
571 	gpio_pin_configure_dt(&priv->pe, GPIO_DISCONNECTED);
572 	return 0;
573 }
574 
disk_stm32_sdmmc_init(const struct device * dev)575 static int disk_stm32_sdmmc_init(const struct device *dev)
576 {
577 	struct stm32_sdmmc_priv *priv = dev->data;
578 	const struct device *const clk = DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE);
579 	int err;
580 
581 	if (!device_is_ready(clk)) {
582 		LOG_ERR("clock control device not ready");
583 		return -ENODEV;
584 	}
585 
586 	if (!device_is_ready(priv->reset.dev)) {
587 		LOG_ERR("reset control device not ready");
588 		return -ENODEV;
589 	}
590 
591 	k_work_init(&priv->work, stm32_sdmmc_cd_handler);
592 
593 	/* Configure dt provided device signals when available */
594 	err = pinctrl_apply_state(priv->pcfg, PINCTRL_STATE_DEFAULT);
595 	if (err < 0) {
596 		return err;
597 	}
598 
599 	priv->irq_config(dev);
600 
601 	/* Initialize semaphores */
602 	k_sem_init(&priv->thread_lock, 1, 1);
603 	k_sem_init(&priv->sync, 0, 1);
604 
605 	err = stm32_sdmmc_card_detect_init(priv);
606 	if (err) {
607 		return err;
608 	}
609 
610 	err = stm32_sdmmc_pwr_init(priv);
611 	if (err) {
612 		goto err_card_detect;
613 	}
614 
615 	if (stm32_sdmmc_card_present(priv)) {
616 		priv->status = DISK_STATUS_UNINIT;
617 	} else {
618 		priv->status = DISK_STATUS_NOMEDIA;
619 	}
620 
621 	stm32_sdmmc_info.dev = dev;
622 	err = disk_access_register(&stm32_sdmmc_info);
623 	if (err) {
624 		goto err_pwr;
625 	}
626 	return 0;
627 
628 err_pwr:
629 	stm32_sdmmc_pwr_uninit(priv);
630 err_card_detect:
631 	stm32_sdmmc_card_detect_uninit(priv);
632 	return err;
633 }
634 
635 #if DT_NODE_HAS_STATUS(DT_DRV_INST(0), okay)
636 
637 #if STM32_SDMMC_USE_DMA
638 
639 #define SDMMC_DMA_CHANNEL_INIT(dir, dir_cap)				\
640 	.dev = DEVICE_DT_GET(STM32_DMA_CTLR(0, dir)),			\
641 	.channel = DT_INST_DMAS_CELL_BY_NAME(0, dir, channel),		\
642 	.channel_nb = DT_DMAS_CELL_BY_NAME(				\
643 			DT_DRV_INST(0), dir, channel),			\
644 	.reg = (DMA_TypeDef *)DT_REG_ADDR(				\
645 			DT_PHANDLE_BY_NAME(DT_DRV_INST(0), dmas, dir)),	\
646 	.cfg = {							\
647 		.dma_slot = STM32_DMA_SLOT(0, dir, slot),		\
648 		.channel_priority = STM32_DMA_CONFIG_PRIORITY(		\
649 				STM32_DMA_CHANNEL_CONFIG(0, dir)),	\
650 		.dma_callback = stm32_sdmmc_dma_cb,			\
651 		.linked_channel = STM32_DMA_HAL_OVERRIDE,		\
652 	},								\
653 
654 
655 #define SDMMC_DMA_CHANNEL(dir, DIR)					\
656 .dma_##dir = {								\
657 	COND_CODE_1(DT_INST_DMAS_HAS_NAME(0, dir),			\
658 		 (SDMMC_DMA_CHANNEL_INIT(dir, DIR)),			\
659 		 (NULL))						\
660 	},
661 
662 #else
663 #define SDMMC_DMA_CHANNEL(dir, DIR)
664 #endif
665 
666 PINCTRL_DT_INST_DEFINE(0);
667 
stm32_sdmmc_irq_config_func(const struct device * dev)668 static void stm32_sdmmc_irq_config_func(const struct device *dev)
669 {
670 	IRQ_CONNECT(DT_INST_IRQN(0),
671 		DT_INST_IRQ(0, priority),
672 		stm32_sdmmc_isr, DEVICE_DT_INST_GET(0),
673 		0);
674 	irq_enable(DT_INST_IRQN(0));
675 }
676 
677 #if DT_INST_PROP(0, bus_width) == 1
678 #define SDMMC_BUS_WIDTH SDMMC_BUS_WIDE_1B
679 #elif DT_INST_PROP(0, bus_width) == 4
680 #define SDMMC_BUS_WIDTH SDMMC_BUS_WIDE_4B
681 #elif DT_INST_PROP(0, bus_width) == 8
682 #define SDMMC_BUS_WIDTH SDMMC_BUS_WIDE_8B
683 #endif /* DT_INST_PROP(0, bus_width) */
684 
685 static struct stm32_pclken pclken_sdmmc[] = STM32_DT_INST_CLOCKS(0);
686 
687 static struct stm32_sdmmc_priv stm32_sdmmc_priv_1 = {
688 	.irq_config = stm32_sdmmc_irq_config_func,
689 	.hsd = {
690 		.Instance = (MMC_TypeDef *)DT_INST_REG_ADDR(0),
691 		.Init.BusWide = SDMMC_BUS_WIDTH,
692 #if DT_INST_NODE_HAS_PROP(0, clk_div)
693 		.Init.ClockDiv = DT_INST_PROP(0, clk_div),
694 #endif
695 	},
696 #if DT_INST_NODE_HAS_PROP(0, cd_gpios)
697 	.cd = GPIO_DT_SPEC_INST_GET(0, cd_gpios),
698 #endif
699 #if DT_INST_NODE_HAS_PROP(0, pwr_gpios)
700 	.pe = GPIO_DT_SPEC_INST_GET(0, pwr_gpios),
701 #endif
702 	.pclken = pclken_sdmmc,
703 	.pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(0),
704 	.reset = RESET_DT_SPEC_INST_GET(0),
705 	SDMMC_DMA_CHANNEL(rx, RX)
706 	SDMMC_DMA_CHANNEL(tx, TX)
707 };
708 
709 DEVICE_DT_INST_DEFINE(0, disk_stm32_sdmmc_init, NULL,
710 		    &stm32_sdmmc_priv_1, NULL, POST_KERNEL,
711 		    CONFIG_SD_INIT_PRIORITY,
712 		    NULL);
713 #endif
714