summaryrefslogtreecommitdiff
path: root/drivers/pwm
diff options
context:
space:
mode:
authorLiu Ying <victor.liu@nxp.com>2019-11-06 15:27:29 +0800
committerDong Aisheng <aisheng.dong@nxp.com>2019-11-25 15:43:02 +0800
commit055889789c56e297d213b0ea2f023db35734d9da (patch)
tree66414c7d2fbf5f9eaea40d6528da68cf31fbe208 /drivers/pwm
parent219d54332a09e8d8741c1e1982f5eae56099de85 (diff)
pwm: imx27: Use 32k clock if it is supplied
The PWM in i.MX8qxp MIPI subsystem needs to use the '32k' clock to work properly. This patch gets this clock in the PWM driver and uses it if it is supplied. Signed-off-by: Liu Ying <victor.liu@nxp.com>
Diffstat (limited to 'drivers/pwm')
-rw-r--r--drivers/pwm/pwm-imx27.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/drivers/pwm/pwm-imx27.c b/drivers/pwm/pwm-imx27.c
index ae11d8577f18..1f909deab1c8 100644
--- a/drivers/pwm/pwm-imx27.c
+++ b/drivers/pwm/pwm-imx27.c
@@ -83,6 +83,7 @@
struct pwm_imx27_chip {
struct clk *clk_ipg;
struct clk *clk_per;
+ struct clk *clk_32k;
void __iomem *mmio_base;
struct pwm_chip chip;
};
@@ -94,17 +95,28 @@ static int pwm_imx27_clk_prepare_enable(struct pwm_chip *chip)
struct pwm_imx27_chip *imx = to_pwm_imx27_chip(chip);
int ret;
+ if (imx->clk_32k) {
+ ret = clk_prepare_enable(imx->clk_32k);
+ if (ret)
+ goto err1;
+ }
+
ret = clk_prepare_enable(imx->clk_ipg);
if (ret)
- return ret;
+ goto err2;
ret = clk_prepare_enable(imx->clk_per);
- if (ret) {
- clk_disable_unprepare(imx->clk_ipg);
- return ret;
- }
+ if (ret)
+ goto err3;
return 0;
+err3:
+ clk_disable_unprepare(imx->clk_ipg);
+err2:
+ if (imx->clk_32k)
+ clk_disable_unprepare(imx->clk_32k);
+err1:
+ return ret;
}
static void pwm_imx27_clk_disable_unprepare(struct pwm_chip *chip)
@@ -113,6 +125,8 @@ static void pwm_imx27_clk_disable_unprepare(struct pwm_chip *chip)
clk_disable_unprepare(imx->clk_per);
clk_disable_unprepare(imx->clk_ipg);
+ if (imx->clk_32k)
+ clk_disable_unprepare(imx->clk_32k);
}
static void pwm_imx27_get_state(struct pwm_chip *chip,
@@ -321,6 +335,13 @@ static int pwm_imx27_probe(struct platform_device *pdev)
return ret;
}
+ imx->clk_32k = devm_clk_get_optional(&pdev->dev, "32k");
+ if (IS_ERR(imx->clk_32k)) {
+ dev_err(&pdev->dev, "getting 32k clock failed with %ld\n",
+ PTR_ERR(imx->clk_32k));
+ return PTR_ERR(imx->clk_32k);
+ }
+
imx->chip.ops = &pwm_imx27_ops;
imx->chip.dev = &pdev->dev;
imx->chip.base = -1;