From bd6c9a9a8a7e1cbd5edee29a5a32ea7b29228637 Mon Sep 17 00:00:00 2001
From: Philipp Zabel
Date: Mon, 25 Jun 2012 16:15:20 +0200
Subject: [PATCH] --- yaml --- r: 333097 b: refs/heads/master c:
7b27c160c68152581c702b9f1fe362338d2a0cad h: refs/heads/master i: 333095:
50b6d346908f944a78aae03efd1552a6a51af87c v: v3
---
[refs] | 2 +-
trunk/drivers/pwm/pwm-imx.c | 35 +++++++++++++++++++++++++++--------
2 files changed, 28 insertions(+), 9 deletions(-)
diff --git a/[refs] b/[refs]
index 472f23701364..a6b931cffae0 100644
--- a/[refs]
+++ b/[refs]
@@ -1,2 +1,2 @@
---
-refs/heads/master: 8d1c24bfd20829f5943c76b85c4973db264dd666
+refs/heads/master: 7b27c160c68152581c702b9f1fe362338d2a0cad
diff --git a/trunk/drivers/pwm/pwm-imx.c b/trunk/drivers/pwm/pwm-imx.c
index 852de6ce6e11..8a5d3ae2946a 100644
--- a/trunk/drivers/pwm/pwm-imx.c
+++ b/trunk/drivers/pwm/pwm-imx.c
@@ -40,7 +40,8 @@
#define MX3_PWMCR_EN (1 << 0)
struct imx_chip {
- struct clk *clk;
+ struct clk *clk_per;
+ struct clk *clk_ipg;
int enabled;
void __iomem *mmio_base;
@@ -106,7 +107,7 @@ static int imx_pwm_config_v2(struct pwm_chip *chip,
unsigned long period_cycles, duty_cycles, prescale;
u32 cr;
- c = clk_get_rate(imx->clk);
+ c = clk_get_rate(imx->clk_per);
c = c * period_ns;
do_div(c, 1000000000);
period_cycles = c;
@@ -161,8 +162,17 @@ static int imx_pwm_config(struct pwm_chip *chip,
struct pwm_device *pwm, int duty_ns, int period_ns)
{
struct imx_chip *imx = to_imx_chip(chip);
+ int ret;
+
+ ret = clk_prepare_enable(imx->clk_ipg);
+ if (ret)
+ return ret;
- return imx->config(chip, pwm, duty_ns, period_ns);
+ ret = imx->config(chip, pwm, duty_ns, period_ns);
+
+ clk_disable_unprepare(imx->clk_ipg);
+
+ return ret;
}
static int imx_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
@@ -170,7 +180,7 @@ static int imx_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
struct imx_chip *imx = to_imx_chip(chip);
int ret;
- ret = clk_prepare_enable(imx->clk);
+ ret = clk_prepare_enable(imx->clk_per);
if (ret)
return ret;
@@ -187,7 +197,7 @@ static void imx_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
imx->set_enable(chip, false);
- clk_disable_unprepare(imx->clk);
+ clk_disable_unprepare(imx->clk_per);
imx->enabled = 0;
}
@@ -239,10 +249,19 @@ static int __devinit imx_pwm_probe(struct platform_device *pdev)
return -ENOMEM;
}
- imx->clk = devm_clk_get(&pdev->dev, "pwm");
+ imx->clk_per = devm_clk_get(&pdev->dev, "per");
+ if (IS_ERR(imx->clk_per)) {
+ dev_err(&pdev->dev, "getting per clock failed with %ld\n",
+ PTR_ERR(imx->clk_per));
+ return PTR_ERR(imx->clk_per);
+ }
- if (IS_ERR(imx->clk))
- return PTR_ERR(imx->clk);
+ imx->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
+ if (IS_ERR(imx->clk_ipg)) {
+ dev_err(&pdev->dev, "getting ipg clock failed with %ld\n",
+ PTR_ERR(imx->clk_ipg));
+ return PTR_ERR(imx->clk_ipg);
+ }
imx->chip.ops = &imx_pwm_ops;
imx->chip.dev = &pdev->dev;