From ce627dbfd76e099260f3ccf14a7e699fa11a4be5 Mon Sep 17 00:00:00 2001 From: Liu Ying Date: Thu, 23 Nov 2017 16:03:10 +0800 Subject: [PATCH] MLK-16973-4 pwm: imx: Use ipg and per clks in ->config, ->enable and ->disable For the i.MX8QM SoC, it turns out that both ipg and per clocks are needed to be enabled when the PWM registers are configured. Hence, we use the two clocks in the ->config, ->enable and disable hooks. For other SoCs unlike i.MX8QM, it could bring some additional trivial power consumptions due to the additional active ipg clock when PWM is enabled. Signed-off-by: Liu Ying --- drivers/pwm/pwm-imx.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/pwm/pwm-imx.c b/drivers/pwm/pwm-imx.c index d600fd5cd4ba..381b32a06c95 100644 --- a/drivers/pwm/pwm-imx.c +++ b/drivers/pwm/pwm-imx.c @@ -206,13 +206,20 @@ static int imx_pwm_config(struct pwm_chip *chip, struct imx_chip *imx = to_imx_chip(chip); int ret; - ret = clk_prepare_enable(imx->clk_ipg); + ret = clk_prepare_enable(imx->clk_per); if (ret) return ret; + ret = clk_prepare_enable(imx->clk_ipg); + if (ret) { + clk_disable_unprepare(imx->clk_per); + return ret; + } + ret = imx->config(chip, pwm, duty_ns, period_ns); clk_disable_unprepare(imx->clk_ipg); + clk_disable_unprepare(imx->clk_per); return ret; } @@ -226,6 +233,12 @@ static int imx_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) if (ret) return ret; + ret = clk_prepare_enable(imx->clk_ipg); + if (ret) { + clk_disable_unprepare(imx->clk_per); + return ret; + } + imx->set_enable(chip, true); return 0; @@ -237,6 +250,7 @@ static void imx_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) imx->set_enable(chip, false); + clk_disable_unprepare(imx->clk_ipg); clk_disable_unprepare(imx->clk_per); }