drivers: pwm_mcux: Update MCUX pwm driver to use clock bindings

MCUX PWM driver used hardcoded clock source. update driver to use clock
bindings to determine PWM peripheral clock frequency.

Signed-off-by: Daniel DeGrasse <daniel.degrasse@nxp.com>
This commit is contained in:
Daniel DeGrasse 2021-12-02 09:57:54 -06:00 committed by Maureen Helm
commit b0dfda1584
7 changed files with 70 additions and 7 deletions

View file

@ -102,6 +102,12 @@ static int mcux_ccm_get_subsys_rate(const struct device *dev,
break; break;
#endif #endif
#ifdef CONFIG_PWM_MCUX
case IMX_CCM_PWM_CLK:
*rate = CLOCK_GetIpgFreq();
break;
#endif
#ifdef CONFIG_UART_MCUX_IUART #ifdef CONFIG_UART_MCUX_IUART
case IMX_CCM_UART_CLK: case IMX_CCM_UART_CLK:
*rate = CLOCK_GetPllFreq(kCLOCK_SystemPll1Ctrl) / *rate = CLOCK_GetPllFreq(kCLOCK_SystemPll1Ctrl) /

View file

@ -67,6 +67,12 @@ static int mcux_ccm_get_subsys_rate(const struct device *dev,
break; break;
#endif #endif
#ifdef CONFIG_PWM_MCUX
case IMX_CCM_PWM_CLK:
clock_root = kCLOCK_Root_Bus;
break;
#endif
#ifdef CONFIG_CAN_MCUX_FLEXCAN #ifdef CONFIG_CAN_MCUX_FLEXCAN
case IMX_CCM_CAN1_CLK: case IMX_CCM_CAN1_CLK:
clock_root = kCLOCK_Root_Can1 + instance; clock_root = kCLOCK_Root_Can1 + instance;

View file

@ -8,9 +8,9 @@
#include <errno.h> #include <errno.h>
#include <drivers/pwm.h> #include <drivers/pwm.h>
#include <drivers/clock_control.h>
#include <soc.h> #include <soc.h>
#include <fsl_pwm.h> #include <fsl_pwm.h>
#include <fsl_clock.h>
#define LOG_LEVEL CONFIG_PWM_LOG_LEVEL #define LOG_LEVEL CONFIG_PWM_LOG_LEVEL
#include <logging/log.h> #include <logging/log.h>
@ -21,7 +21,8 @@ LOG_MODULE_REGISTER(pwm_mcux);
struct pwm_mcux_config { struct pwm_mcux_config {
PWM_Type *base; PWM_Type *base;
uint8_t index; uint8_t index;
clock_name_t clock_source; const struct device *clock_dev;
clock_control_subsys_t clock_subsys;
pwm_clock_prescale_t prescale; pwm_clock_prescale_t prescale;
pwm_mode_t mode; pwm_mode_t mode;
}; };
@ -75,7 +76,11 @@ static int mcux_pwm_pin_set(const struct device *dev, uint32_t pwm,
LOG_DBG("SETUP dutycycle to %u\n", duty_cycle); LOG_DBG("SETUP dutycycle to %u\n", duty_cycle);
clock_freq = CLOCK_GetFreq(config->clock_source); if (clock_control_get_rate(config->clock_dev, config->clock_subsys,
&clock_freq)) {
return -EINVAL;
}
pwm_freq = (clock_freq >> config->prescale) / period_cycles; pwm_freq = (clock_freq >> config->prescale) / period_cycles;
if (pwm_freq == 0) { if (pwm_freq == 0) {
@ -112,8 +117,13 @@ static int mcux_pwm_get_cycles_per_sec(const struct device *dev, uint32_t pwm,
uint64_t *cycles) uint64_t *cycles)
{ {
const struct pwm_mcux_config *config = dev->config; const struct pwm_mcux_config *config = dev->config;
uint32_t clock_freq;
*cycles = CLOCK_GetFreq(config->clock_source) >> config->prescale; if (clock_control_get_rate(config->clock_dev, config->clock_subsys,
&clock_freq)) {
return -EINVAL;
}
*cycles = clock_freq >> config->prescale;
return 0; return 0;
} }
@ -124,10 +134,12 @@ static int pwm_mcux_init(const struct device *dev)
struct pwm_mcux_data *data = dev->data; struct pwm_mcux_data *data = dev->data;
pwm_config_t pwm_config; pwm_config_t pwm_config;
status_t status; status_t status;
int i;
PWM_GetDefaultConfig(&pwm_config); PWM_GetDefaultConfig(&pwm_config);
pwm_config.prescale = config->prescale; pwm_config.prescale = config->prescale;
pwm_config.reloadLogic = kPWM_ReloadPwmFullCycle; pwm_config.reloadLogic = kPWM_ReloadPwmFullCycle;
pwm_config.clockSource = kPWM_BusClock;
status = PWM_Init(config->base, config->index, &pwm_config); status = PWM_Init(config->base, config->index, &pwm_config);
if (status != kStatus_Success) { if (status != kStatus_Success) {
@ -136,8 +148,9 @@ static int pwm_mcux_init(const struct device *dev)
} }
/* Disable fault sources */ /* Disable fault sources */
((PWM_Type *)config->base)->SM[config->index].DISMAP[0] = 0x0000; for (i = 0; i < FSL_FEATURE_PWM_FAULT_CH_COUNT; i++) {
((PWM_Type *)config->base)->SM[config->index].DISMAP[1] = 0x0000; ((PWM_Type *)config->base)->SM[config->index].DISMAP[i] = 0x0000;
}
data->channel[0].pwmChannel = kPWM_PwmA; data->channel[0].pwmChannel = kPWM_PwmA;
data->channel[0].level = kPWM_HighTrue; data->channel[0].level = kPWM_HighTrue;
@ -160,7 +173,8 @@ static const struct pwm_driver_api pwm_mcux_driver_api = {
.index = DT_INST_PROP(n, index), \ .index = DT_INST_PROP(n, index), \
.mode = kPWM_EdgeAligned, \ .mode = kPWM_EdgeAligned, \
.prescale = kPWM_Prescale_Divide_128, \ .prescale = kPWM_Prescale_Divide_128, \
.clock_source = kCLOCK_IpgClk, \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \
.clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name),\
}; \ }; \
\ \
DEVICE_DT_INST_DEFINE(n, \ DEVICE_DT_INST_DEFINE(n, \

View file

@ -379,6 +379,7 @@
label = "FLEXPWM1_PWM0"; label = "FLEXPWM1_PWM0";
interrupts = <102 0>; interrupts = <102 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -388,6 +389,7 @@
label = "FLEXPWM1_PWM1"; label = "FLEXPWM1_PWM1";
interrupts = <103 0>; interrupts = <103 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -397,6 +399,7 @@
label = "FLEXPWM1_PWM2"; label = "FLEXPWM1_PWM2";
interrupts = <104 0>; interrupts = <104 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -406,6 +409,7 @@
label = "FLEXPWM1_PWM3"; label = "FLEXPWM1_PWM3";
interrupts = <105 0>; interrupts = <105 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
}; };
@ -421,6 +425,7 @@
label = "FLEXPWM2_PWM0"; label = "FLEXPWM2_PWM0";
interrupts = <137 0>; interrupts = <137 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -430,6 +435,7 @@
label = "FLEXPWM2_PWM1"; label = "FLEXPWM2_PWM1";
interrupts = <138 0>; interrupts = <138 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -439,6 +445,7 @@
label = "FLEXPWM2_PWM2"; label = "FLEXPWM2_PWM2";
interrupts = <139 0>; interrupts = <139 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -448,6 +455,7 @@
label = "FLEXPWM2_PWM3"; label = "FLEXPWM2_PWM3";
interrupts = <140 0>; interrupts = <140 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
}; };
@ -463,6 +471,7 @@
label = "FLEXPWM3_PWM0"; label = "FLEXPWM3_PWM0";
interrupts = <142 0>; interrupts = <142 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -472,6 +481,7 @@
label = "FLEXPWM3_PWM1"; label = "FLEXPWM3_PWM1";
interrupts = <143 0>; interrupts = <143 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -481,6 +491,7 @@
label = "FLEXPWM3_PWM2"; label = "FLEXPWM3_PWM2";
interrupts = <144 0>; interrupts = <144 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -490,6 +501,7 @@
label = "FLEXPWM3_PWM3"; label = "FLEXPWM3_PWM3";
interrupts = <145 0>; interrupts = <145 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
}; };
@ -505,6 +517,7 @@
label = "FLEXPWM4_PWM0"; label = "FLEXPWM4_PWM0";
interrupts = <147 0>; interrupts = <147 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -514,6 +527,7 @@
label = "FLEXPWM4_PWM1"; label = "FLEXPWM4_PWM1";
interrupts = <148 0>; interrupts = <148 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -523,6 +537,7 @@
label = "FLEXPWM4_PWM2"; label = "FLEXPWM4_PWM2";
interrupts = <149 0>; interrupts = <149 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -532,6 +547,7 @@
label = "FLEXPWM4_PWM3"; label = "FLEXPWM4_PWM3";
interrupts = <150 0>; interrupts = <150 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
}; };

View file

@ -471,6 +471,7 @@
label = "FLEXPWM1_PWM0"; label = "FLEXPWM1_PWM0";
interrupts = <125 0>; interrupts = <125 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -480,6 +481,7 @@
label = "FLEXPWM1_PWM1"; label = "FLEXPWM1_PWM1";
interrupts = <126 0>; interrupts = <126 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -489,6 +491,7 @@
label = "FLEXPWM1_PWM2"; label = "FLEXPWM1_PWM2";
interrupts = <127 0>; interrupts = <127 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -498,6 +501,7 @@
label = "FLEXPWM1_PWM3"; label = "FLEXPWM1_PWM3";
interrupts = <128 0>; interrupts = <128 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
}; };
@ -513,6 +517,7 @@
label = "FLEXPWM2_PWM0"; label = "FLEXPWM2_PWM0";
interrupts = <177 0>; interrupts = <177 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -522,6 +527,7 @@
label = "FLEXPWM2_PWM1"; label = "FLEXPWM2_PWM1";
interrupts = <178 0>; interrupts = <178 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -531,6 +537,7 @@
label = "FLEXPWM2_PWM2"; label = "FLEXPWM2_PWM2";
interrupts = <179 0>; interrupts = <179 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -540,6 +547,7 @@
label = "FLEXPWM2_PWM3"; label = "FLEXPWM2_PWM3";
interrupts = <180 0>; interrupts = <180 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
}; };
@ -555,6 +563,7 @@
label = "FLEXPWM3_PWM0"; label = "FLEXPWM3_PWM0";
interrupts = <182 0>; interrupts = <182 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -564,6 +573,7 @@
label = "FLEXPWM3_PWM1"; label = "FLEXPWM3_PWM1";
interrupts = <183 0>; interrupts = <183 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -573,6 +583,7 @@
label = "FLEXPWM3_PWM2"; label = "FLEXPWM3_PWM2";
interrupts = <184 0>; interrupts = <184 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -582,6 +593,7 @@
label = "FLEXPWM3_PWM3"; label = "FLEXPWM3_PWM3";
interrupts = <185 0>; interrupts = <185 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
}; };
@ -597,6 +609,7 @@
label = "FLEXPWM4_PWM0"; label = "FLEXPWM4_PWM0";
interrupts = <187 0>; interrupts = <187 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -606,6 +619,7 @@
label = "FLEXPWM4_PWM1"; label = "FLEXPWM4_PWM1";
interrupts = <188 0>; interrupts = <188 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -615,6 +629,7 @@
label = "FLEXPWM4_PWM2"; label = "FLEXPWM4_PWM2";
interrupts = <189 0>; interrupts = <189 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
@ -624,6 +639,7 @@
label = "FLEXPWM4_PWM3"; label = "FLEXPWM4_PWM3";
interrupts = <190 0>; interrupts = <190 0>;
#pwm-cells = <1>; #pwm-cells = <1>;
clocks = <&ccm IMX_CCM_PWM_CLK 0 0>;
status = "disabled"; status = "disabled";
}; };
}; };

View file

@ -22,5 +22,6 @@
#define IMX_CCM_SAI1_CLK 12 #define IMX_CCM_SAI1_CLK 12
#define IMX_CCM_SAI2_CLK 13 #define IMX_CCM_SAI2_CLK 13
#define IMX_CCM_SAI3_CLK 14 #define IMX_CCM_SAI3_CLK 14
#define IMX_CCM_PWM_CLK 15
#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_IMX_CCM_H_ */ #endif /* ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_IMX_CCM_H_ */

View file

@ -60,6 +60,9 @@
#define IMX_CCM_EDMA_CLK 0x700UL #define IMX_CCM_EDMA_CLK 0x700UL
#define IMX_CCM_EDMA_LPSR_CLK 0x701UL #define IMX_CCM_EDMA_LPSR_CLK 0x701UL
/* PWM */
#define IMX_CCM_PWM_CLK 0x800UL
/* CAN */ /* CAN */
#define IMX_CCM_CAN_CLK 0x900UL #define IMX_CCM_CAN_CLK 0x900UL
#define IMX_CCM_CAN1_CLK 0x900UL #define IMX_CCM_CAN1_CLK 0x900UL
@ -75,4 +78,5 @@
#define IMX_CCM_GPT5_CLK 0x1004UL #define IMX_CCM_GPT5_CLK 0x1004UL
#define IMX_CCM_GPT6_CLK 0x1005UL #define IMX_CCM_GPT6_CLK 0x1005UL
#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_IMX_CCM_REV2_H_ */ #endif /* ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_IMX_CCM_REV2_H_ */