Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions boards/arm/gd32e103v_eval/gd32e103v_eval.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ toolchain:
supported:
- counter
- watchdog
- dma
1 change: 1 addition & 0 deletions boards/arm/gd32e507v_start/gd32e507v_start.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ supported:
- gpio
- watchdog
- counter
- dma
1 change: 1 addition & 0 deletions boards/arm/gd32f350r_eval/gd32f350r_eval.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ toolchain:
- xtools
supported:
- watchdog
- dma
1 change: 1 addition & 0 deletions boards/arm/gd32f403z_eval/gd32f403z_eval.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ supported:
- counter
- pwm
- watchdog
- dma
1 change: 1 addition & 0 deletions boards/arm/gd32f407v_start/gd32f407v_start.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ supported:
- pwm
- gpio
- counter
- dma
1 change: 1 addition & 0 deletions boards/arm/gd32f450i_eval/gd32f450i_eval.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ supported:
- pwm
- watchdog
- counter
- dma
1 change: 1 addition & 0 deletions boards/arm/gd32f450v_start/gd32f450v_start.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ supported:
- pwm
- gpio
- counter
- dma
1 change: 1 addition & 0 deletions boards/arm/gd32f450z_eval/gd32f450z_eval.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ supported:
- spi
- uart
- watchdog
- dma
1 change: 1 addition & 0 deletions boards/arm/gd32f470i_eval/gd32f470i_eval.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ supported:
- spi
- uart
- watchdog
- dma
1 change: 1 addition & 0 deletions boards/riscv/gd32vf103c_starter/gd32vf103c_starter.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ supported:
- gpio
- pwm
- watchdog
- dma
1 change: 1 addition & 0 deletions boards/riscv/gd32vf103v_eval/gd32vf103v_eval.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ supported:
- gpio
- pwm
- watchdog
- dma
1 change: 1 addition & 0 deletions boards/riscv/longan_nano/longan_nano.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ flash: 128
ram: 32
supported:
- watchdog
- dma
1 change: 1 addition & 0 deletions boards/riscv/longan_nano/longan_nano_lite.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ flash: 64
ram: 20
supported:
- watchdog
- dma
2 changes: 1 addition & 1 deletion drivers/dma/Kconfig.gd32
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
config DMA_GD32
bool "Gigadevice GD32 DMA driver"
default y
depends on DT_HAS_GD_GD32_DMA_ENABLED
depends on DT_HAS_GD_GD32_DMA_ENABLED || DT_HAS_GD_GD32_DMA_V1_ENABLED
select USE_GD32_DMA
help
DMA driver for GigaDevice GD32 series MCUs.
49 changes: 30 additions & 19 deletions drivers/dma/dma_gd32.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
* SPDX-License-Identifier: Apache-2.0
*/

#define DT_DRV_COMPAT gd_gd32_dma

#include <zephyr/device.h>
#include <zephyr/drivers/clock_control.h>
#include <zephyr/drivers/clock_control/gd32.h>
Expand All @@ -16,7 +14,13 @@
#include <gd32_dma.h>
#include <zephyr/irq.h>

#ifdef CONFIG_SOC_SERIES_GD32F4XX
#if DT_HAS_COMPAT_STATUS_OKAY(gd_gd32_dma_v1)
#define DT_DRV_COMPAT gd_gd32_dma_v1
#elif DT_HAS_COMPAT_STATUS_OKAY(gd_gd32_dma)
#define DT_DRV_COMPAT gd_gd32_dma
#endif

#if DT_HAS_COMPAT_STATUS_OKAY(gd_gd32_dma_v1)
#define CHXCTL_PERIEN_OFFSET ((uint32_t)25U)
#define GD32_DMA_CHXCTL_DIR BIT(6)
#define GD32_DMA_CHXCTL_M2M BIT(7)
Expand Down Expand Up @@ -58,7 +62,8 @@ struct dma_gd32_config {
uint32_t reg;
uint32_t channels;
uint16_t clkid;
#ifdef CONFIG_SOC_SERIES_GD32F4XX
bool mem2mem;
#if DT_HAS_COMPAT_STATUS_OKAY(gd_gd32_dma_v1)
struct reset_dt_spec reset;
#endif
void (*irq_configure)(void);
Expand Down Expand Up @@ -189,7 +194,7 @@ gd32_dma_periph_width_config(uint32_t reg, dma_channel_enum ch, uint32_t pwidth)
GD32_DMA_CHCTL(reg, ch) = (ctl & (~DMA_CHXCTL_PWIDTH)) | pwidth;
}

#ifdef CONFIG_SOC_SERIES_GD32F4XX
#if DT_HAS_COMPAT_STATUS_OKAY(gd_gd32_dma_v1)
static inline void
gd32_dma_channel_subperipheral_select(uint32_t reg, dma_channel_enum ch,
dma_subperipheral_enum sub_periph)
Expand All @@ -211,7 +216,7 @@ gd32_dma_periph_address_config(uint32_t reg, dma_channel_enum ch, uint32_t addr)
static inline void
gd32_dma_memory_address_config(uint32_t reg, dma_channel_enum ch, uint32_t addr)
{
#ifdef CONFIG_SOC_SERIES_GD32F4XX
#if DT_HAS_COMPAT_STATUS_OKAY(gd_gd32_dma_v1)
DMA_CHM0ADDR(reg, ch) = addr;
#else
GD32_DMA_CHMADDR(reg, ch) = addr;
Expand All @@ -233,7 +238,7 @@ gd32_dma_transfer_number_get(uint32_t reg, dma_channel_enum ch)
static inline void
gd32_dma_interrupt_flag_clear(uint32_t reg, dma_channel_enum ch, uint32_t flag)
{
#ifdef CONFIG_SOC_SERIES_GD32F4XX
#if DT_HAS_COMPAT_STATUS_OKAY(gd_gd32_dma_v1)
if (ch < DMA_CH4) {
DMA_INTC0(reg) |= DMA_FLAG_ADD(flag, ch);
} else {
Expand All @@ -247,7 +252,7 @@ gd32_dma_interrupt_flag_clear(uint32_t reg, dma_channel_enum ch, uint32_t flag)
static inline void
gd32_dma_flag_clear(uint32_t reg, dma_channel_enum ch, uint32_t flag)
{
#ifdef CONFIG_SOC_SERIES_GD32F4XX
#if DT_HAS_COMPAT_STATUS_OKAY(gd_gd32_dma_v1)
if (ch < DMA_CH4) {
DMA_INTC0(reg) |= DMA_FLAG_ADD(flag, ch);
} else {
Expand All @@ -261,7 +266,7 @@ gd32_dma_flag_clear(uint32_t reg, dma_channel_enum ch, uint32_t flag)
static inline uint32_t
gd32_dma_interrupt_flag_get(uint32_t reg, dma_channel_enum ch, uint32_t flag)
{
#ifdef CONFIG_SOC_SERIES_GD32F4XX
#if DT_HAS_COMPAT_STATUS_OKAY(gd_gd32_dma_v1)
if (ch < DMA_CH4) {
return (DMA_INTF0(reg) & DMA_FLAG_ADD(flag, ch));
} else {
Expand All @@ -279,7 +284,7 @@ static inline void gd32_dma_deinit(uint32_t reg, dma_channel_enum ch)
GD32_DMA_CHCTL(reg, ch) = DMA_CHCTL_RESET_VALUE;
GD32_DMA_CHCNT(reg, ch) = DMA_CHCNT_RESET_VALUE;
GD32_DMA_CHPADDR(reg, ch) = DMA_CHPADDR_RESET_VALUE;
#ifdef CONFIG_SOC_SERIES_GD32F4XX
#if DT_HAS_COMPAT_STATUS_OKAY(gd_gd32_dma_v1)
DMA_CHM0ADDR(reg, ch) = DMA_CHMADDR_RESET_VALUE;
DMA_CHFCTL(reg, ch) = DMA_CHFCTL_RESET_VALUE;
if (ch < DMA_CH4) {
Expand Down Expand Up @@ -403,10 +408,15 @@ static int dma_gd32_config(const struct device *dev, uint32_t channel,
return -ENOTSUP;
}

#ifdef CONFIG_SOC_SERIES_GD32F4XX
if (dma_cfg->linked_channel > 0xF) {
LOG_ERR("linked_channel must be <7 (%" PRIu32 ")",
dma_cfg->linked_channel);
if (dma_cfg->channel_direction == MEMORY_TO_MEMORY && !cfg->mem2mem) {
LOG_ERR("not supporting MEMORY_TO_MEMORY");
return -ENOTSUP;
}

#if DT_HAS_COMPAT_STATUS_OKAY(gd_gd32_dma_v1)
if (dma_cfg->dma_slot > 0xF) {
LOG_ERR("dma_slot must be <7 (%" PRIu32 ")",
dma_cfg->dma_slot);
return -EINVAL;
}
#endif
Expand Down Expand Up @@ -462,10 +472,10 @@ static int dma_gd32_config(const struct device *dev, uint32_t channel,
gd32_dma_periph_width_config(cfg->reg, channel,
dma_gd32_periph_width(periph_cfg->width));
gd32_dma_circulation_disable(cfg->reg, channel);
#ifdef CONFIG_SOC_SERIES_GD32F4XX
#if DT_HAS_COMPAT_STATUS_OKAY(gd_gd32_dma_v1)
if (dma_cfg->channel_direction != MEMORY_TO_MEMORY) {
gd32_dma_channel_subperipheral_select(cfg->reg, channel,
dma_cfg->linked_channel);
dma_cfg->dma_slot);
}
#endif

Expand Down Expand Up @@ -594,7 +604,7 @@ static int dma_gd32_init(const struct device *dev)
(void)clock_control_on(GD32_CLOCK_CONTROLLER,
(clock_control_subsys_t *)&cfg->clkid);

#ifdef CONFIG_SOC_SERIES_GD32F4XX
#if DT_HAS_COMPAT_STATUS_OKAY(gd_gd32_dma_v1)
(void)reset_line_toggle_dt(&cfg->reset);
#endif

Expand Down Expand Up @@ -665,10 +675,11 @@ static const struct dma_driver_api dma_gd32_driver_api = {
} \
static const struct dma_gd32_config dma_gd32##inst##_config = { \
.reg = DT_INST_REG_ADDR(inst), \
.channels = DT_INST_PROP(inst, dma_channels), \
.clkid = DT_INST_CLOCKS_CELL(inst, id), \
IF_ENABLED(CONFIG_SOC_SERIES_GD32F4XX, \
.mem2mem = DT_INST_PROP(inst, gd_mem2mem), \
IF_ENABLED(DT_HAS_COMPAT_STATUS_OKAY(gd_gd32_dma_v1), \
(.reset = RESET_DT_SPEC_INST_GET(inst),)) \
.channels = DT_INST_PROP(inst, dma_channels), \
.irq_configure = dma_gd32##inst##_irq_configure, \
}; \
\
Expand Down
4 changes: 2 additions & 2 deletions dts/arm/gigadevice/gd32e10x/gd32e10x.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -472,7 +472,7 @@
<15 0>, <16 0>, <17 0>;
clocks = <&cctl GD32_CLOCK_DMA0>;
dma-channels = <7>;
#dma-cells = <1>;
#dma-cells = <2>;
status = "disabled";
};

Expand All @@ -483,7 +483,7 @@
<60 0>;
clocks = <&cctl GD32_CLOCK_DMA1>;
dma-channels = <5>;
#dma-cells = <1>;
#dma-cells = <2>;
status = "disabled";
};

Expand Down
6 changes: 4 additions & 2 deletions dts/arm/gigadevice/gd32e50x/gd32e50x.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -411,7 +411,8 @@
<15 0>, <16 0>, <17 0>;
clocks = <&cctl GD32_CLOCK_DMA0>;
dma-channels = <7>;
#dma-cells = <1>;
gd,mem2mem;
#dma-cells = <2>;
status = "disabled";
};

Expand All @@ -422,7 +423,8 @@
<60 0>;
clocks = <&cctl GD32_CLOCK_DMA1>;
dma-channels = <5>;
#dma-cells = <1>;
gd,mem2mem;
#dma-cells = <2>;
status = "disabled";
};
};
Expand Down
2 changes: 1 addition & 1 deletion dts/arm/gigadevice/gd32f3x0/gd32f3x0.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@
interrupts = <9 0>, <10 0>, <11 0>, <48 0>;
clocks = <&cctl GD32_CLOCK_DMA>;
dma-channels = <7>;
#dma-cells = <1>;
#dma-cells = <2>;
status = "disabled";
};

Expand Down
6 changes: 4 additions & 2 deletions dts/arm/gigadevice/gd32f403/gd32f403.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,8 @@
<15 0>, <16 0>, <17 0>;
clocks = <&cctl GD32_CLOCK_DMA0>;
dma-channels = <7>;
#dma-cells = <1>;
gd,mem2mem;
#dma-cells = <2>;
status = "disabled";
};

Expand All @@ -507,7 +508,8 @@
<60 0>;
clocks = <&cctl GD32_CLOCK_DMA1>;
dma-channels = <5>;
#dma-cells = <1>;
gd,mem2mem;
#dma-cells = <2>;
status = "disabled";
};
};
Expand Down
10 changes: 6 additions & 4 deletions dts/arm/gigadevice/gd32f4xx/gd32f4xx.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -618,26 +618,28 @@
};

dma0: dma@40026000 {
compatible = "gd,gd32-dma";
compatible = "gd,gd32-dma-v1";
reg = <0x40026000 0x400>;
interrupts = <11 0>, <12 0>, <13 0>, <14 0>,
<15 0>, <16 0>, <17 0>, <47 0>;
clocks = <&cctl GD32_CLOCK_DMA0>;
resets = <&rctl GD32_RESET_DMA0>;
dma-channels = <8>;
#dma-cells = <1>;
gd,mem2mem;
#dma-cells = <4>;
status = "disabled";
};

dma1: dma@40026400 {
compatible = "gd,gd32-dma";
compatible = "gd,gd32-dma-v1";
reg = <0x40026400 0x400>;
interrupts = <56 0>, <57 0>, <58 0>, <59 0>,
<60 0>, <68 0>, <69 0>, <70 0>;
clocks = <&cctl GD32_CLOCK_DMA1>;
resets = <&rctl GD32_RESET_DMA1>;
dma-channels = <8>;
#dma-cells = <1>;
gd,mem2mem;
#dma-cells = <4>;
status = "disabled";
};
};
Expand Down
21 changes: 21 additions & 0 deletions dts/bindings/dma/gd,gd32-dma-base.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Copyright (c) 2022, TOKITA Hiroshi <[email protected]>
# SPDX-License-Identifier: Apache-2.0

include: dma-controller.yaml

properties:
reg:
required: true

interrupts:
required: true

dma-channels:
required: true

clocks:
required: true

gd,mem2mem:
type: boolean
description: The DMA controller supporting memory to memory transfer
Loading