From 64c9fadc7c5a02c2b1818f5fa1616243b992a95f Mon Sep 17 00:00:00 2001 From: Henrik Brix Andersen Date: Sun, 1 May 2022 22:32:33 +0200 Subject: [PATCH] drivers: pwm: rv32m1: tpm: add pinctrl support Add pinctrl support to the OpenISA RV32M1 TPM PWM driver. Signed-off-by: Henrik Brix Andersen --- drivers/pwm/pwm_rv32m1_tpm.c | 26 ++++++++++++++++++++++++ dts/bindings/pwm/openisa,rv32m1-tpm.yaml | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/drivers/pwm/pwm_rv32m1_tpm.c b/drivers/pwm/pwm_rv32m1_tpm.c index e9b061fe9bc..a24ec18438f 100644 --- a/drivers/pwm/pwm_rv32m1_tpm.c +++ b/drivers/pwm/pwm_rv32m1_tpm.c @@ -15,6 +15,9 @@ #include #include #include +#ifdef CONFIG_PINCTRL +#include +#endif #define LOG_LEVEL CONFIG_PWM_LOG_LEVEL #include @@ -30,6 +33,9 @@ struct rv32m1_tpm_config { tpm_clock_prescale_t prescale; uint8_t channel_count; tpm_pwm_mode_t mode; +#ifdef CONFIG_PINCTRL + const struct pinctrl_dev_config *pincfg; +#endif }; struct rv32m1_tpm_data { @@ -131,6 +137,9 @@ static int rv32m1_tpm_init(const struct device *dev) struct rv32m1_tpm_data *data = dev->data; tpm_chnl_pwm_signal_param_t *channel = data->channel; tpm_config_t tpm_config; +#ifdef CONFIG_PINCTRL + int err; +#endif int i; if (config->channel_count > ARRAY_SIZE(data->channel)) { @@ -157,6 +166,13 @@ static int rv32m1_tpm_init(const struct device *dev) channel++; } +#ifdef CONFIG_PINCTRL + err = pinctrl_apply_state(config->pincfg, PINCTRL_STATE_DEFAULT); + if (err) { + return err; + } +#endif + TPM_GetDefaultConfig(&tpm_config); tpm_config.prescale = config->prescale; @@ -170,7 +186,16 @@ static const struct pwm_driver_api rv32m1_tpm_driver_api = { .get_cycles_per_sec = rv32m1_tpm_get_cycles_per_sec, }; +#ifdef CONFIG_PINCTRL +#define PINCTRL_INIT(n) .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), +#define PINCTRL_DEFINE(n) PINCTRL_DT_INST_DEFINE(n); +#else +#define PINCTRL_DEFINE(n) +#define PINCTRL_INIT(n) +#endif + #define TPM_DEVICE(n) \ + PINCTRL_DEFINE(n) \ static const struct rv32m1_tpm_config rv32m1_tpm_config_##n = { \ .base = (TPM_Type *) \ DT_INST_REG_ADDR(n), \ @@ -182,6 +207,7 @@ static const struct pwm_driver_api rv32m1_tpm_driver_api = { .channel_count = FSL_FEATURE_TPM_CHANNEL_COUNTn((TPM_Type *) \ DT_INST_REG_ADDR(n)), \ .mode = kTPM_EdgeAlignedPwm, \ + PINCTRL_INIT(n) \ }; \ static struct rv32m1_tpm_data rv32m1_tpm_data_##n; \ DEVICE_DT_INST_DEFINE(n, &rv32m1_tpm_init, NULL, \ diff --git a/dts/bindings/pwm/openisa,rv32m1-tpm.yaml b/dts/bindings/pwm/openisa,rv32m1-tpm.yaml index bfcbbca80be..1deec9acae6 100644 --- a/dts/bindings/pwm/openisa,rv32m1-tpm.yaml +++ b/dts/bindings/pwm/openisa,rv32m1-tpm.yaml @@ -5,7 +5,7 @@ description: OpenISA Timer/PWM Module (TPM) compatible: "openisa,rv32m1-tpm" -include: [pwm-controller.yaml, base.yaml] +include: [pwm-controller.yaml, base.yaml, pinctrl-device.yaml] properties: reg: