drivers: pwm: support for numaker m55m1x

Modify Nuvoton numaker pwm driver for m55m1x series.
Add pwm nodes in m55m1x.dtsi

Signed-off-by: cyliang tw <cyliang@nuvoton.com>
This commit is contained in:
cyliang tw 2025-05-12 14:07:26 +08:00 committed by Fabio Baltieri
commit a5f8645038
2 changed files with 49 additions and 0 deletions

View file

@ -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;
}

View file

@ -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";
};
};
};