38
38
#include <zephyr/logging/log.h>
39
39
LOG_MODULE_REGISTER (uart_stm32 , CONFIG_UART_LOG_LEVEL );
40
40
41
+ /* This symbol takes the value 1 if one of the device instances */
42
+ /* is configured in dts with an optional clock */
43
+ #if STM32_DT_INST_DEV_OPT_CLOCK_SUPPORT
44
+ #define STM32_UART_OPT_CLOCK_SUPPORT 1
45
+ #else
46
+ #define STM32_UART_OPT_CLOCK_SUPPORT 0
47
+ #endif
48
+
41
49
#define HAS_LPUART_1 (DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(lpuart1), \
42
50
st_stm32_lpuart, okay))
43
51
@@ -93,20 +101,28 @@ static void uart_stm32_pm_policy_state_lock_put(const struct device *dev)
93
101
}
94
102
#endif /* CONFIG_PM */
95
103
96
- static inline void uart_stm32_set_baudrate (const struct device * dev ,
97
- uint32_t baud_rate )
104
+ static inline void uart_stm32_set_baudrate (const struct device * dev , uint32_t baud_rate )
98
105
{
99
106
const struct uart_stm32_config * config = dev -> config ;
100
107
struct uart_stm32_data * data = dev -> data ;
101
108
102
109
uint32_t clock_rate ;
103
110
104
111
/* Get clock rate */
105
- if (clock_control_get_rate (data -> clock ,
106
- (clock_control_subsys_t * )& config -> pclken ,
107
- & clock_rate ) < 0 ) {
108
- LOG_ERR ("Failed call clock_control_get_rate" );
109
- return ;
112
+ if (IS_ENABLED (STM32_UART_OPT_CLOCK_SUPPORT ) && (config -> pclk_len > 1 )) {
113
+ if (clock_control_get_rate (data -> clock ,
114
+ (clock_control_subsys_t )& config -> pclken [1 ],
115
+ & clock_rate ) < 0 ) {
116
+ LOG_ERR ("Failed call clock_control_get_rate(pclken[1])" );
117
+ return ;
118
+ }
119
+ } else {
120
+ if (clock_control_get_rate (data -> clock ,
121
+ (clock_control_subsys_t )& config -> pclken [0 ],
122
+ & clock_rate ) < 0 ) {
123
+ LOG_ERR ("Failed call clock_control_get_rate(pclken[0])" );
124
+ return ;
125
+ }
110
126
}
111
127
112
128
#if HAS_LPUART_1
@@ -1550,9 +1566,20 @@ static int uart_stm32_init(const struct device *dev)
1550
1566
1551
1567
__uart_stm32_get_clock (dev );
1552
1568
/* enable clock */
1553
- if (clock_control_on (data -> clock ,
1554
- (clock_control_subsys_t * )& config -> pclken ) != 0 ) {
1555
- return - EIO ;
1569
+ err = clock_control_on (data -> clock , (clock_control_subsys_t )& config -> pclken [0 ]);
1570
+ if (err != 0 ) {
1571
+ LOG_ERR ("Could not enable (LP)UART clock" );
1572
+ return err ;
1573
+ }
1574
+
1575
+ if (IS_ENABLED (STM32_UART_OPT_CLOCK_SUPPORT ) && (config -> pclk_len > 1 )) {
1576
+ err = clock_control_configure (DEVICE_DT_GET (STM32_CLOCK_CONTROL_NODE ),
1577
+ (clock_control_subsys_t ) & config -> pclken [1 ],
1578
+ NULL );
1579
+ if (err != 0 ) {
1580
+ LOG_ERR ("Could not select UART source clock" );
1581
+ return err ;
1582
+ }
1556
1583
}
1557
1584
1558
1585
/* Configure dt provided device signals when available */
@@ -1697,10 +1724,10 @@ static void uart_stm32_irq_config_func_##index(const struct device *dev) \
1697
1724
1698
1725
#ifdef CONFIG_UART_ASYNC_API
1699
1726
#define UART_DMA_CHANNEL (index , dir , DIR , src , dest ) \
1700
- .dma_##dir = { \
1727
+ .dma_##dir = { \
1701
1728
COND_CODE_1(DT_INST_DMAS_HAS_NAME(index, dir), \
1702
1729
(UART_DMA_CHANNEL_INIT(index, dir, DIR, src, dest)), \
1703
- (NULL)) \
1730
+ (NULL)) \
1704
1731
},
1705
1732
1706
1733
#else
@@ -1712,15 +1739,17 @@ STM32_UART_IRQ_HANDLER_DECL(index) \
1712
1739
\
1713
1740
PINCTRL_DT_INST_DEFINE(index); \
1714
1741
\
1742
+ static const struct stm32_pclken pclken_##index[] = \
1743
+ STM32_DT_INST_CLOCKS(index);\
1744
+ \
1715
1745
static const struct uart_stm32_config uart_stm32_cfg_##index = { \
1716
1746
.usart = (USART_TypeDef *)DT_INST_REG_ADDR(index), \
1717
- .pclken = { .bus = DT_INST_CLOCKS_CELL(index, bus), \
1718
- .enr = DT_INST_CLOCKS_CELL(index, bits) \
1719
- }, \
1747
+ .pclken = pclken_##index, \
1748
+ .pclk_len = DT_INST_NUM_CLOCKS(index), \
1720
1749
.hw_flow_control = DT_INST_PROP(index, hw_flow_control), \
1721
1750
.parity = DT_INST_ENUM_IDX_OR(index, parity, UART_CFG_PARITY_NONE), \
1722
1751
.pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(index), \
1723
- .single_wire = DT_INST_PROP_OR(index, single_wire, false), \
1752
+ .single_wire = DT_INST_PROP_OR(index, single_wire, false), \
1724
1753
.tx_rx_swap = DT_INST_PROP_OR(index, tx_rx_swap, false), \
1725
1754
STM32_UART_IRQ_HANDLER_FUNC(index) \
1726
1755
}; \
0 commit comments