@@ -277,34 +277,65 @@ static int stm32_sdmmc_dma_deinit(struct stm32_sdmmc_priv *priv)
277
277
278
278
#endif
279
279
280
+ /* Forward declarations */
281
+ static int stm32_sdmmc_pwr_on (struct stm32_sdmmc_priv * priv );
282
+ static int stm32_sdmmc_pwr_off (struct stm32_sdmmc_priv * priv );
283
+ static int stm32_sdmmc_card_detect_init (struct stm32_sdmmc_priv * priv );
284
+ static bool stm32_sdmmc_card_present (struct stm32_sdmmc_priv * priv );
285
+ static int stm32_sdmmc_card_detect_uninit (struct stm32_sdmmc_priv * priv );
286
+
280
287
static int stm32_sdmmc_access_init (struct disk_info * disk )
281
288
{
282
289
const struct device * dev = disk -> dev ;
283
290
struct stm32_sdmmc_priv * priv = dev -> data ;
284
291
int err ;
285
292
286
- if (priv -> status == DISK_STATUS_NOMEDIA ) {
287
- return - ENODEV ;
293
+ err = stm32_sdmmc_pwr_on (priv );
294
+ if (err ) {
295
+ return - EIO ;
296
+ }
297
+
298
+ /* Configure dt provided device signals when available */
299
+ err = pinctrl_apply_state (priv -> pcfg , PINCTRL_STATE_DEFAULT );
300
+ if (err < 0 ) {
301
+ stm32_sdmmc_pwr_off (priv );
302
+ return err ;
303
+ }
304
+
305
+ #if !defined(CONFIG_SDMMC_STM32_EMMC )
306
+ err = stm32_sdmmc_card_detect_init (priv );
307
+ if (err ) {
308
+ stm32_sdmmc_pwr_off (priv );
309
+ return err ;
310
+ }
311
+ #endif
312
+
313
+ if (stm32_sdmmc_card_present (priv )) {
314
+ priv -> status = DISK_STATUS_UNINIT ;
315
+ } else {
316
+ priv -> status = DISK_STATUS_NOMEDIA ;
317
+ err = - ENODEV ;
318
+ goto error ;
288
319
}
289
320
290
321
#if STM32_SDMMC_USE_DMA
291
322
err = stm32_sdmmc_dma_init (priv );
292
323
if (err ) {
293
324
LOG_ERR ("DMA init failed" );
294
- return err ;
325
+ goto error ;
295
326
}
296
327
#endif
297
328
298
329
err = stm32_sdmmc_clock_enable (priv );
299
330
if (err ) {
300
331
LOG_ERR ("failed to init clocks" );
301
- return err ;
332
+ goto error ;
302
333
}
303
334
304
335
err = reset_line_toggle_dt (& priv -> reset );
305
336
if (err ) {
306
337
LOG_ERR ("failed to reset peripheral" );
307
- return err ;
338
+ goto error ;
308
339
}
309
340
310
341
#ifdef CONFIG_SDMMC_STM32_EMMC
@@ -314,7 +345,8 @@ static int stm32_sdmmc_access_init(struct disk_info *disk)
314
345
#endif
315
346
if (err != HAL_OK ) {
316
347
LOG_ERR ("failed to init stm32_sdmmc (ErrorCode 0x%X)" , priv -> hsd .ErrorCode );
317
- return - EIO ;
348
+ err = - EIO ;
349
+ goto error ;
318
350
}
319
351
320
352
#ifdef CONFIG_SDMMC_STM32_HWFC
@@ -323,6 +355,12 @@ static int stm32_sdmmc_access_init(struct disk_info *disk)
323
355
324
356
priv -> status = DISK_STATUS_OK ;
325
357
return 0 ;
358
+ error :
359
+ #if !defined(CONFIG_SDMMC_STM32_EMMC )
360
+ stm32_sdmmc_card_detect_uninit (priv );
361
+ #endif
362
+ stm32_sdmmc_pwr_off (priv );
363
+ return err ;
326
364
}
327
365
328
366
static int stm32_sdmmc_access_deinit (struct stm32_sdmmc_priv * priv )
@@ -348,6 +386,11 @@ static int stm32_sdmmc_access_deinit(struct stm32_sdmmc_priv *priv)
348
386
return err ;
349
387
}
350
388
389
+ #if !defined(CONFIG_SDMMC_STM32_EMMC )
390
+ stm32_sdmmc_card_detect_uninit (priv );
391
+ #endif
392
+ stm32_sdmmc_pwr_off (priv );
393
+
351
394
priv -> status = DISK_STATUS_UNINIT ;
352
395
return 0 ;
353
396
}
@@ -646,7 +689,7 @@ static int stm32_sdmmc_card_detect_uninit(struct stm32_sdmmc_priv *priv)
646
689
}
647
690
#endif /* !CONFIG_SDMMC_STM32_EMMC */
648
691
649
- static int stm32_sdmmc_pwr_init (struct stm32_sdmmc_priv * priv )
692
+ static int stm32_sdmmc_pwr_on (struct stm32_sdmmc_priv * priv )
650
693
{
651
694
int err ;
652
695
@@ -668,21 +711,20 @@ static int stm32_sdmmc_pwr_init(struct stm32_sdmmc_priv *priv)
668
711
return 0 ;
669
712
}
670
713
671
- static int stm32_sdmmc_pwr_uninit (struct stm32_sdmmc_priv * priv )
714
+ static int stm32_sdmmc_pwr_off (struct stm32_sdmmc_priv * priv )
672
715
{
673
716
if (!priv -> pe .port ) {
674
717
return 0 ;
675
718
}
676
719
677
- gpio_pin_configure_dt (& priv -> pe , GPIO_DISCONNECTED );
720
+ gpio_pin_configure_dt (& priv -> pe , GPIO_OUTPUT_INACTIVE );
678
721
return 0 ;
679
722
}
680
723
681
724
static int disk_stm32_sdmmc_init (const struct device * dev )
682
725
{
683
726
struct stm32_sdmmc_priv * priv = dev -> data ;
684
727
const struct device * const clk = DEVICE_DT_GET (STM32_CLOCK_CONTROL_NODE );
685
- int err ;
686
728
687
729
if (!device_is_ready (clk )) {
688
730
LOG_ERR ("clock control device not ready" );
@@ -694,12 +736,6 @@ static int disk_stm32_sdmmc_init(const struct device *dev)
694
736
return - ENODEV ;
695
737
}
696
738
697
- /* Configure dt provided device signals when available */
698
- err = pinctrl_apply_state (priv -> pcfg , PINCTRL_STATE_DEFAULT );
699
- if (err < 0 ) {
700
- return err ;
701
- }
702
-
703
739
priv -> irq_config (dev );
704
740
705
741
/* Initialize semaphores */
@@ -708,38 +744,13 @@ static int disk_stm32_sdmmc_init(const struct device *dev)
708
744
709
745
#if !defined(CONFIG_SDMMC_STM32_EMMC )
710
746
k_work_init (& priv -> work , stm32_sdmmc_cd_handler );
711
-
712
- err = stm32_sdmmc_card_detect_init (priv );
713
- if (err ) {
714
- return err ;
715
- }
716
747
#endif
717
748
718
- err = stm32_sdmmc_pwr_init (priv );
719
- if (err ) {
720
- goto err_card_detect ;
721
- }
722
-
723
- if (stm32_sdmmc_card_present (priv )) {
724
- priv -> status = DISK_STATUS_UNINIT ;
725
- } else {
726
- priv -> status = DISK_STATUS_NOMEDIA ;
727
- }
749
+ /* Ensure off by default */
750
+ stm32_sdmmc_pwr_off (priv );
728
751
729
752
stm32_sdmmc_info .dev = dev ;
730
- err = disk_access_register (& stm32_sdmmc_info );
731
- if (err ) {
732
- goto err_pwr ;
733
- }
734
- return 0 ;
735
-
736
- err_pwr :
737
- stm32_sdmmc_pwr_uninit (priv );
738
- err_card_detect :
739
- #if !defined(CONFIG_SDMMC_STM32_EMMC )
740
- stm32_sdmmc_card_detect_uninit (priv );
741
- #endif
742
- return err ;
753
+ return disk_access_register (& stm32_sdmmc_info );
743
754
}
744
755
745
756
#if DT_NODE_HAS_STATUS_OKAY (DT_DRV_INST (0 ))
0 commit comments