[PATCH 1/3] pwm: imx27: track clock enable/disable to simplify code
Marco Felsch
m.felsch at pengutronix.de
Wed Sep 9 09:07:37 EDT 2020
Introduce a simple clock state so we can enable/disable the clock
without the need to check if we are running or not.
Signed-off-by: Marco Felsch <m.felsch at pengutronix.de>
---
drivers/pwm/pwm-imx27.c | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/drivers/pwm/pwm-imx27.c b/drivers/pwm/pwm-imx27.c
index c50d453552bd..3cf9f1774244 100644
--- a/drivers/pwm/pwm-imx27.c
+++ b/drivers/pwm/pwm-imx27.c
@@ -91,6 +91,7 @@ struct pwm_imx27_chip {
* value to return in that case.
*/
unsigned int duty_cycle;
+ bool clk_on;
};
#define to_pwm_imx27_chip(chip) container_of(chip, struct pwm_imx27_chip, chip)
@@ -99,6 +100,9 @@ static int pwm_imx27_clk_prepare_enable(struct pwm_imx27_chip *imx)
{
int ret;
+ if (imx->clk_on)
+ return 0;
+
ret = clk_prepare_enable(imx->clk_ipg);
if (ret)
return ret;
@@ -109,13 +113,20 @@ static int pwm_imx27_clk_prepare_enable(struct pwm_imx27_chip *imx)
return ret;
}
+ imx->clk_on = true;
+
return 0;
}
static void pwm_imx27_clk_disable_unprepare(struct pwm_imx27_chip *imx)
{
+ if (!imx->clk_on)
+ return;
+
clk_disable_unprepare(imx->clk_per);
clk_disable_unprepare(imx->clk_ipg);
+
+ imx->clk_on = false;
}
static void pwm_imx27_get_state(struct pwm_chip *chip,
@@ -223,6 +234,10 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm,
int ret;
u32 cr;
+ ret = pwm_imx27_clk_prepare_enable(imx);
+ if (ret)
+ return ret;
+
pwm_get_state(pwm, &cstate);
clkrate = clk_get_rate(imx->clk_per);
@@ -254,10 +269,6 @@ static int pwm_imx27_apply(struct pwm_chip *chip, struct pwm_device *pwm,
if (cstate.enabled) {
pwm_imx27_wait_fifo_slot(chip, pwm);
} else {
- ret = pwm_imx27_clk_prepare_enable(imx);
- if (ret)
- return ret;
-
pwm_imx27_sw_reset(chip);
}
--
2.20.1
More information about the linux-arm-kernel
mailing list