|
@@ -115,6 +115,7 @@ struct ehrpwm_pwm_chip {
|
|
|
void __iomem *mmio_base;
|
|
|
unsigned long period_cycles[NUM_PWM_CHANNEL];
|
|
|
enum pwm_polarity polarity[NUM_PWM_CHANNEL];
|
|
|
+ struct clk *tbclk;
|
|
|
};
|
|
|
|
|
|
static inline struct ehrpwm_pwm_chip *to_ehrpwm_pwm_chip(struct pwm_chip *chip)
|
|
@@ -335,6 +336,9 @@ static int ehrpwm_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
|
|
|
/* Channels polarity can be configured from action qualifier module */
|
|
|
configure_polarity(pc, pwm->hwpwm);
|
|
|
|
|
|
+ /* Enable TBCLK before enabling PWM device */
|
|
|
+ clk_enable(pc->tbclk);
|
|
|
+
|
|
|
/* Enable time counter for free_run */
|
|
|
ehrpwm_modify(pc->mmio_base, TBCTL, TBCTL_RUN_MASK, TBCTL_FREE_RUN);
|
|
|
return 0;
|
|
@@ -363,6 +367,9 @@ static void ehrpwm_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
|
|
|
|
|
|
ehrpwm_modify(pc->mmio_base, AQCSFRC, aqcsfrc_mask, aqcsfrc_val);
|
|
|
|
|
|
+ /* Disabling TBCLK on PWM disable */
|
|
|
+ clk_disable(pc->tbclk);
|
|
|
+
|
|
|
/* Stop Time base counter */
|
|
|
ehrpwm_modify(pc->mmio_base, TBCTL, TBCTL_RUN_MASK, TBCTL_STOP_NEXT);
|
|
|
|
|
@@ -432,6 +439,13 @@ static int __devinit ehrpwm_pwm_probe(struct platform_device *pdev)
|
|
|
if (!pc->mmio_base)
|
|
|
return -EADDRNOTAVAIL;
|
|
|
|
|
|
+ /* Acquire tbclk for Time Base EHRPWM submodule */
|
|
|
+ pc->tbclk = devm_clk_get(&pdev->dev, "tbclk");
|
|
|
+ if (IS_ERR(pc->tbclk)) {
|
|
|
+ dev_err(&pdev->dev, "Failed to get tbclk\n");
|
|
|
+ return PTR_ERR(pc->tbclk);
|
|
|
+ }
|
|
|
+
|
|
|
ret = pwmchip_add(&pc->chip);
|
|
|
if (ret < 0) {
|
|
|
dev_err(&pdev->dev, "pwmchip_add() failed: %d\n", ret);
|