@@ -1403,25 +1403,38 @@ static inline bool spi_stm32_is_subghzspi(const struct device *dev)
1403
1403
#endif /* st_stm32_spi_subghz */
1404
1404
}
1405
1405
1406
- #ifdef CONFIG_PM_DEVICE
1406
+ static int spi_stm32_pinctrl_apply (const struct device * dev , uint8_t id )
1407
+ {
1408
+ const struct spi_stm32_config * config = dev -> config ;
1409
+ int err ;
1410
+
1411
+ if (spi_stm32_is_subghzspi (dev )) {
1412
+ return 0 ;
1413
+ }
1414
+
1415
+ /* Move pins to requested state */
1416
+ err = pinctrl_apply_state (config -> pcfg , id );
1417
+ if ((id == PINCTRL_STATE_SLEEP ) && (err == - ENOENT )) {
1418
+ /* Sleep state is optional */
1419
+ err = 0 ;
1420
+ }
1421
+ return err ;
1422
+ }
1423
+
1407
1424
static int spi_stm32_pm_action (const struct device * dev ,
1408
1425
enum pm_device_action action )
1409
1426
{
1410
1427
const struct spi_stm32_config * config = dev -> config ;
1411
1428
const struct device * const clk = DEVICE_DT_GET (STM32_CLOCK_CONTROL_NODE );
1412
1429
int err ;
1413
1430
1414
-
1415
1431
switch (action ) {
1416
1432
case PM_DEVICE_ACTION_RESUME :
1417
- if (!spi_stm32_is_subghzspi (dev )) {
1418
- /* Set pins to active state */
1419
- err = pinctrl_apply_state (config -> pcfg , PINCTRL_STATE_DEFAULT );
1420
- if (err < 0 ) {
1421
- return err ;
1422
- }
1433
+ /* Configure pins for active mode */
1434
+ err = spi_stm32_pinctrl_apply (dev , PINCTRL_STATE_DEFAULT );
1435
+ if (err < 0 ) {
1436
+ return err ;
1423
1437
}
1424
-
1425
1438
/* enable clock */
1426
1439
err = clock_control_on (clk , (clock_control_subsys_t )& config -> pclken [0 ]);
1427
1440
if (err != 0 ) {
@@ -1436,30 +1449,19 @@ static int spi_stm32_pm_action(const struct device *dev,
1436
1449
LOG_ERR ("Could not disable SPI clock" );
1437
1450
return err ;
1438
1451
}
1439
-
1440
- if (!spi_stm32_is_subghzspi (dev )) {
1441
- /* Move pins to sleep state */
1442
- err = pinctrl_apply_state (config -> pcfg , PINCTRL_STATE_SLEEP );
1443
- if ((err < 0 ) && (err != - ENOENT )) {
1444
- /*
1445
- * If returning -ENOENT, no pins where defined for sleep mode :
1446
- * Do not output on console (might sleep already) when going to
1447
- * sleep,
1448
- * "SPI pinctrl sleep state not available"
1449
- * and don't block PM suspend.
1450
- * Else return the error.
1451
- */
1452
- return err ;
1453
- }
1454
- }
1452
+ /* Configure pins for sleep mode */
1453
+ return spi_stm32_pinctrl_apply (dev , PINCTRL_STATE_SLEEP );
1454
+ case PM_DEVICE_ACTION_TURN_ON :
1455
+ /* Configure pins for sleep mode */
1456
+ return spi_stm32_pinctrl_apply (dev , PINCTRL_STATE_SLEEP );
1457
+ case PM_DEVICE_ACTION_TURN_OFF :
1455
1458
break ;
1456
1459
default :
1457
1460
return - ENOTSUP ;
1458
1461
}
1459
1462
1460
1463
return 0 ;
1461
1464
}
1462
- #endif /* CONFIG_PM_DEVICE */
1463
1465
1464
1466
static int spi_stm32_init (const struct device * dev )
1465
1467
{
@@ -1472,13 +1474,6 @@ static int spi_stm32_init(const struct device *dev)
1472
1474
return - ENODEV ;
1473
1475
}
1474
1476
1475
- err = clock_control_on (DEVICE_DT_GET (STM32_CLOCK_CONTROL_NODE ),
1476
- (clock_control_subsys_t ) & cfg -> pclken [0 ]);
1477
- if (err < 0 ) {
1478
- LOG_ERR ("Could not enable SPI clock" );
1479
- return err ;
1480
- }
1481
-
1482
1477
if (IS_ENABLED (STM32_SPI_DOMAIN_CLOCK_SUPPORT ) && (cfg -> pclk_len > 1 )) {
1483
1478
err = clock_control_configure (DEVICE_DT_GET (STM32_CLOCK_CONTROL_NODE ),
1484
1479
(clock_control_subsys_t ) & cfg -> pclken [1 ],
@@ -1489,15 +1484,6 @@ static int spi_stm32_init(const struct device *dev)
1489
1484
}
1490
1485
}
1491
1486
1492
- if (!spi_stm32_is_subghzspi (dev )) {
1493
- /* Configure dt provided device signals when available */
1494
- err = pinctrl_apply_state (cfg -> pcfg , PINCTRL_STATE_DEFAULT );
1495
- if (err < 0 ) {
1496
- LOG_ERR ("SPI pinctrl setup failed (%d)" , err );
1497
- return err ;
1498
- }
1499
- }
1500
-
1501
1487
#ifdef CONFIG_SPI_STM32_INTERRUPT
1502
1488
cfg -> irq_config (dev );
1503
1489
#endif /* CONFIG_SPI_STM32_INTERRUPT */
@@ -1526,7 +1512,7 @@ static int spi_stm32_init(const struct device *dev)
1526
1512
1527
1513
spi_context_unlock_unconditionally (& data -> ctx );
1528
1514
1529
- return pm_device_runtime_enable (dev );
1515
+ return pm_device_driver_init (dev , spi_stm32_pm_action );
1530
1516
}
1531
1517
1532
1518
#ifdef CONFIG_SPI_STM32_INTERRUPT
0 commit comments