|
@@ -87,6 +87,7 @@ struct fsl_pwm_chip {
|
|
|
|
|
|
int period_ns;
|
|
|
|
|
|
+ struct clk *ipg_clk;
|
|
|
struct clk *clk[FSL_PWM_CLK_MAX];
|
|
|
};
|
|
|
|
|
@@ -99,14 +100,14 @@ static int fsl_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
|
|
|
{
|
|
|
struct fsl_pwm_chip *fpc = to_fsl_chip(chip);
|
|
|
|
|
|
- return clk_prepare_enable(fpc->clk[FSL_PWM_CLK_SYS]);
|
|
|
+ return clk_prepare_enable(fpc->ipg_clk);
|
|
|
}
|
|
|
|
|
|
static void fsl_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
|
|
|
{
|
|
|
struct fsl_pwm_chip *fpc = to_fsl_chip(chip);
|
|
|
|
|
|
- clk_disable_unprepare(fpc->clk[FSL_PWM_CLK_SYS]);
|
|
|
+ clk_disable_unprepare(fpc->ipg_clk);
|
|
|
}
|
|
|
|
|
|
static int fsl_pwm_calculate_default_ps(struct fsl_pwm_chip *fpc,
|
|
@@ -363,7 +364,7 @@ static int fsl_pwm_init(struct fsl_pwm_chip *fpc)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
- ret = clk_prepare_enable(fpc->clk[FSL_PWM_CLK_SYS]);
|
|
|
+ ret = clk_prepare_enable(fpc->ipg_clk);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
@@ -371,7 +372,7 @@ static int fsl_pwm_init(struct fsl_pwm_chip *fpc)
|
|
|
regmap_write(fpc->regmap, FTM_OUTINIT, 0x00);
|
|
|
regmap_write(fpc->regmap, FTM_OUTMASK, 0xFF);
|
|
|
|
|
|
- clk_disable_unprepare(fpc->clk[FSL_PWM_CLK_SYS]);
|
|
|
+ clk_disable_unprepare(fpc->ipg_clk);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -441,6 +442,15 @@ static int fsl_pwm_probe(struct platform_device *pdev)
|
|
|
if (IS_ERR(fpc->clk[FSL_PWM_CLK_CNTEN]))
|
|
|
return PTR_ERR(fpc->clk[FSL_PWM_CLK_CNTEN]);
|
|
|
|
|
|
+ /*
|
|
|
+ * ipg_clk is the interface clock for the IP. If not provided, use the
|
|
|
+ * ftm_sys clock as the default.
|
|
|
+ */
|
|
|
+ fpc->ipg_clk = devm_clk_get(&pdev->dev, "ipg");
|
|
|
+ if (IS_ERR(fpc->ipg_clk))
|
|
|
+ fpc->ipg_clk = fpc->clk[FSL_PWM_CLK_SYS];
|
|
|
+
|
|
|
+
|
|
|
fpc->chip.ops = &fsl_pwm_ops;
|
|
|
fpc->chip.of_xlate = of_pwm_xlate_with_flags;
|
|
|
fpc->chip.of_pwm_n_cells = 3;
|
|
@@ -480,7 +490,7 @@ static int fsl_pwm_suspend(struct device *dev)
|
|
|
if (!test_bit(PWMF_REQUESTED, &pwm->flags))
|
|
|
continue;
|
|
|
|
|
|
- clk_disable_unprepare(fpc->clk[FSL_PWM_CLK_SYS]);
|
|
|
+ clk_disable_unprepare(fpc->ipg_clk);
|
|
|
|
|
|
if (!pwm_is_enabled(pwm))
|
|
|
continue;
|
|
@@ -503,7 +513,7 @@ static int fsl_pwm_resume(struct device *dev)
|
|
|
if (!test_bit(PWMF_REQUESTED, &pwm->flags))
|
|
|
continue;
|
|
|
|
|
|
- clk_prepare_enable(fpc->clk[FSL_PWM_CLK_SYS]);
|
|
|
+ clk_prepare_enable(fpc->ipg_clk);
|
|
|
|
|
|
if (!pwm_is_enabled(pwm))
|
|
|
continue;
|