diff --git a/drivers/pwm/pwm_numaker.c b/drivers/pwm/pwm_numaker.c index a4cadec4256..c06800d4bcc 100644 --- a/drivers/pwm/pwm_numaker.c +++ b/drivers/pwm/pwm_numaker.c @@ -25,6 +25,7 @@ LOG_MODULE_REGISTER(pwm_numaker, CONFIG_PWM_LOG_LEVEL); #define NUMAKER_SYSCLK_FREQ DT_PROP(DT_NODELABEL(sysclk), clock_frequency) /* EPWM channel 0~5 mask */ #define NUMAKER_PWM_CHANNEL_MASK (0x3FU) +#define NUMAKER_PWM_HCLK0 1U /* Device config */ struct pwm_numaker_config { @@ -432,6 +433,29 @@ static int pwm_numaker_clk_get_rate(EPWM_T *epwm, uint32_t *rate) uint32_t clk_src; uint32_t epwm_clk_src; +#if defined(CONFIG_SOC_SERIES_M55M1X) + if (epwm == EPWM0) { + clk_src = CLK->EPWMSEL & CLK_EPWMSEL_EPWM0SEL_Msk; + } else if (epwm == EPWM1) { + clk_src = CLK->EPWMSEL & CLK_EPWMSEL_EPWM1SEL_Msk; + } else { + LOG_ERR("Invalid EPWM node"); + return -EINVAL; + } + + if (clk_src == NUMAKER_PWM_HCLK0) { + /* clock source is from HCLK0 clock */ + epwm_clk_src = CLK_GetHCLK0Freq(); + } else { + /* clock source is from PCLK */ + SystemCoreClockUpdate(); + if (epwm == EPWM0) { + epwm_clk_src = CLK_GetPCLK0Freq(); + } else { /* (epwm == EPWM1) */ + epwm_clk_src = CLK_GetPCLK2Freq(); + } + } +#else if (epwm == EPWM0) { clk_src = CLK->CLKSEL2 & CLK_CLKSEL2_EPWM0SEL_Msk; } else if (epwm == EPWM1) { @@ -453,6 +477,7 @@ static int pwm_numaker_clk_get_rate(EPWM_T *epwm, uint32_t *rate) epwm_clk_src = CLK_GetPCLK1Freq(); } } +#endif *rate = epwm_clk_src; return 0; } diff --git a/dts/arm/nuvoton/m55m1x.dtsi b/dts/arm/nuvoton/m55m1x.dtsi index c1b88b5b3e0..6aee45bcd4d 100644 --- a/dts/arm/nuvoton/m55m1x.dtsi +++ b/dts/arm/nuvoton/m55m1x.dtsi @@ -436,6 +436,30 @@ status = "disabled"; #io-channel-cells = <1>; }; + + epwm0: epwm@40242000 { + compatible = "nuvoton,numaker-pwm"; + reg = <0x40242000 0x37c>; + interrupts = <31 0>, <32 0>, <33 0>; + interrupt-names = "pair0", "pair1", "pair2"; + resets = <&rst NUMAKER_SYS_EPWM0RST>; + prescaler = <19>; + clocks = <&pcc NUMAKER_EPWM0_MODULE NUMAKER_CLK_EPWMSEL_EPWM0SEL_PCLK0 0>; + #pwm-cells = <3>; + status = "disabled"; + }; + + epwm1: epwm@40282000 { + compatible = "nuvoton,numaker-pwm"; + reg = <0x40282000 0x37c>; + interrupts = <35 0>, <36 0>, <37 0>; + interrupt-names = "pair0", "pair1", "pair2"; + resets = <&rst NUMAKER_SYS_EPWM1RST>; + prescaler = <19>; + clocks = <&pcc NUMAKER_EPWM1_MODULE NUMAKER_CLK_EPWMSEL_EPWM1SEL_PCLK2 0>; + #pwm-cells = <3>; + status = "disabled"; + }; }; };