44 * SPDX-License-Identifier: Apache-2.0
55 */
66
7- #define DT_DRV_COMPAT gd_gd32_dma
8-
97#include <zephyr/device.h>
108#include <zephyr/drivers/clock_control.h>
119#include <zephyr/drivers/clock_control/gd32.h>
1614#include <gd32_dma.h>
1715#include <zephyr/irq.h>
1816
19- #ifdef CONFIG_SOC_SERIES_GD32F4XX
17+ #if DT_HAS_COMPAT_STATUS_OKAY (gd_gd32_dma_v1 )
18+ #define DT_DRV_COMPAT gd_gd32_dma_v1
19+ #elif DT_HAS_COMPAT_STATUS_OKAY (gd_gd32_dma )
20+ #define DT_DRV_COMPAT gd_gd32_dma
21+ #endif
22+
23+ #if DT_HAS_COMPAT_STATUS_OKAY (gd_gd32_dma_v1 )
2024#define CHXCTL_PERIEN_OFFSET ((uint32_t)25U)
2125#define GD32_DMA_CHXCTL_DIR BIT(6)
2226#define GD32_DMA_CHXCTL_M2M BIT(7)
@@ -59,7 +63,7 @@ struct dma_gd32_config {
5963 uint32_t channels ;
6064 uint16_t clkid ;
6165 bool mem2mem ;
62- #ifdef CONFIG_SOC_SERIES_GD32F4XX
66+ #if DT_HAS_COMPAT_STATUS_OKAY ( gd_gd32_dma_v1 )
6367 struct reset_dt_spec reset ;
6468#endif
6569 void (* irq_configure )(void );
@@ -190,7 +194,7 @@ gd32_dma_periph_width_config(uint32_t reg, dma_channel_enum ch, uint32_t pwidth)
190194 GD32_DMA_CHCTL (reg , ch ) = (ctl & (~DMA_CHXCTL_PWIDTH )) | pwidth ;
191195}
192196
193- #ifdef CONFIG_SOC_SERIES_GD32F4XX
197+ #if DT_HAS_COMPAT_STATUS_OKAY ( gd_gd32_dma_v1 )
194198static inline void
195199gd32_dma_channel_subperipheral_select (uint32_t reg , dma_channel_enum ch ,
196200 dma_subperipheral_enum sub_periph )
@@ -212,7 +216,7 @@ gd32_dma_periph_address_config(uint32_t reg, dma_channel_enum ch, uint32_t addr)
212216static inline void
213217gd32_dma_memory_address_config (uint32_t reg , dma_channel_enum ch , uint32_t addr )
214218{
215- #ifdef CONFIG_SOC_SERIES_GD32F4XX
219+ #if DT_HAS_COMPAT_STATUS_OKAY ( gd_gd32_dma_v1 )
216220 DMA_CHM0ADDR (reg , ch ) = addr ;
217221#else
218222 GD32_DMA_CHMADDR (reg , ch ) = addr ;
@@ -234,7 +238,7 @@ gd32_dma_transfer_number_get(uint32_t reg, dma_channel_enum ch)
234238static inline void
235239gd32_dma_interrupt_flag_clear (uint32_t reg , dma_channel_enum ch , uint32_t flag )
236240{
237- #ifdef CONFIG_SOC_SERIES_GD32F4XX
241+ #if DT_HAS_COMPAT_STATUS_OKAY ( gd_gd32_dma_v1 )
238242 if (ch < DMA_CH4 ) {
239243 DMA_INTC0 (reg ) |= DMA_FLAG_ADD (flag , ch );
240244 } else {
@@ -248,7 +252,7 @@ gd32_dma_interrupt_flag_clear(uint32_t reg, dma_channel_enum ch, uint32_t flag)
248252static inline void
249253gd32_dma_flag_clear (uint32_t reg , dma_channel_enum ch , uint32_t flag )
250254{
251- #ifdef CONFIG_SOC_SERIES_GD32F4XX
255+ #if DT_HAS_COMPAT_STATUS_OKAY ( gd_gd32_dma_v1 )
252256 if (ch < DMA_CH4 ) {
253257 DMA_INTC0 (reg ) |= DMA_FLAG_ADD (flag , ch );
254258 } else {
@@ -262,7 +266,7 @@ gd32_dma_flag_clear(uint32_t reg, dma_channel_enum ch, uint32_t flag)
262266static inline uint32_t
263267gd32_dma_interrupt_flag_get (uint32_t reg , dma_channel_enum ch , uint32_t flag )
264268{
265- #ifdef CONFIG_SOC_SERIES_GD32F4XX
269+ #if DT_HAS_COMPAT_STATUS_OKAY ( gd_gd32_dma_v1 )
266270 if (ch < DMA_CH4 ) {
267271 return (DMA_INTF0 (reg ) & DMA_FLAG_ADD (flag , ch ));
268272 } else {
@@ -280,7 +284,7 @@ static inline void gd32_dma_deinit(uint32_t reg, dma_channel_enum ch)
280284 GD32_DMA_CHCTL (reg , ch ) = DMA_CHCTL_RESET_VALUE ;
281285 GD32_DMA_CHCNT (reg , ch ) = DMA_CHCNT_RESET_VALUE ;
282286 GD32_DMA_CHPADDR (reg , ch ) = DMA_CHPADDR_RESET_VALUE ;
283- #ifdef CONFIG_SOC_SERIES_GD32F4XX
287+ #if DT_HAS_COMPAT_STATUS_OKAY ( gd_gd32_dma_v1 )
284288 DMA_CHM0ADDR (reg , ch ) = DMA_CHMADDR_RESET_VALUE ;
285289 DMA_CHFCTL (reg , ch ) = DMA_CHFCTL_RESET_VALUE ;
286290 if (ch < DMA_CH4 ) {
@@ -409,7 +413,7 @@ static int dma_gd32_config(const struct device *dev, uint32_t channel,
409413 return - ENOTSUP ;
410414 }
411415
412- #ifdef CONFIG_SOC_SERIES_GD32F4XX
416+ #if DT_HAS_COMPAT_STATUS_OKAY ( gd_gd32_dma_v1 )
413417 if (dma_cfg -> dma_slot > 0xF ) {
414418 LOG_ERR ("dma_slot must be <7 (%" PRIu32 ")" ,
415419 dma_cfg -> dma_slot );
@@ -468,7 +472,7 @@ static int dma_gd32_config(const struct device *dev, uint32_t channel,
468472 gd32_dma_periph_width_config (cfg -> reg , channel ,
469473 dma_gd32_periph_width (periph_cfg -> width ));
470474 gd32_dma_circulation_disable (cfg -> reg , channel );
471- #ifdef CONFIG_SOC_SERIES_GD32F4XX
475+ #if DT_HAS_COMPAT_STATUS_OKAY ( gd_gd32_dma_v1 )
472476 if (dma_cfg -> channel_direction != MEMORY_TO_MEMORY ) {
473477 gd32_dma_channel_subperipheral_select (cfg -> reg , channel ,
474478 dma_cfg -> dma_slot );
@@ -600,7 +604,7 @@ static int dma_gd32_init(const struct device *dev)
600604 (void )clock_control_on (GD32_CLOCK_CONTROLLER ,
601605 (clock_control_subsys_t * )& cfg -> clkid );
602606
603- #ifdef CONFIG_SOC_SERIES_GD32F4XX
607+ #if DT_HAS_COMPAT_STATUS_OKAY ( gd_gd32_dma_v1 )
604608 (void )reset_line_toggle_dt (& cfg -> reset );
605609#endif
606610
@@ -674,7 +678,7 @@ static const struct dma_driver_api dma_gd32_driver_api = {
674678 .channels = DT_INST_PROP(inst, dma_channels), \
675679 .clkid = DT_INST_CLOCKS_CELL(inst, id), \
676680 .mem2mem = DT_INST_PROP(inst, gd_mem2mem), \
677- IF_ENABLED(CONFIG_SOC_SERIES_GD32F4XX, \
681+ IF_ENABLED(DT_HAS_COMPAT_STATUS_OKAY(gd_gd32_dma_v1), \
678682 (.reset = RESET_DT_SPEC_INST_GET(inst),)) \
679683 .irq_configure = dma_gd32##inst##_irq_configure, \
680684 }; \
0 commit comments