diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/pwm/pwm-tiehrpwm.c | 14 | 
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/pwm/pwm-tiehrpwm.c b/drivers/pwm/pwm-tiehrpwm.c index d3c1dff0a0d..565f96ad278 100644 --- a/drivers/pwm/pwm-tiehrpwm.c +++ b/drivers/pwm/pwm-tiehrpwm.c @@ -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);  |