pwm: Add the pwm_is_enabled() helper
Some PWM drivers are testing the PWMF_ENABLED flag. Create a helper function to hide the logic behind enabled test. This will allow us to smoothly move from the current approach to an atomic PWM update approach. Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
This commit is contained in:
		
							parent
							
								
									d770e558e2
								
							
						
					
					
						commit
						5c31252c4a
					
				| @ -455,7 +455,7 @@ int pwm_set_polarity(struct pwm_device *pwm, enum pwm_polarity polarity) | ||||
| 	if (!pwm->chip->ops->set_polarity) | ||||
| 		return -ENOSYS; | ||||
| 
 | ||||
| 	if (test_bit(PWMF_ENABLED, &pwm->flags)) | ||||
| 	if (pwm_is_enabled(pwm)) | ||||
| 		return -EBUSY; | ||||
| 
 | ||||
| 	err = pwm->chip->ops->set_polarity(pwm->chip, pwm, polarity); | ||||
| @ -853,7 +853,7 @@ static void pwm_dbg_show(struct pwm_chip *chip, struct seq_file *s) | ||||
| 		if (test_bit(PWMF_REQUESTED, &pwm->flags)) | ||||
| 			seq_puts(s, " requested"); | ||||
| 
 | ||||
| 		if (test_bit(PWMF_ENABLED, &pwm->flags)) | ||||
| 		if (pwm_is_enabled(pwm)) | ||||
| 			seq_puts(s, " enabled"); | ||||
| 
 | ||||
| 		seq_puts(s, "\n"); | ||||
|  | ||||
| @ -347,7 +347,7 @@ static int atmel_tcb_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | ||||
| 	tcbpwm->duty = duty; | ||||
| 
 | ||||
| 	/* If the PWM is enabled, call enable to apply the new conf */ | ||||
| 	if (test_bit(PWMF_ENABLED, &pwm->flags)) | ||||
| 	if (pwm_is_enabled(pwm)) | ||||
| 		atmel_tcb_pwm_enable(chip, pwm); | ||||
| 
 | ||||
| 	return 0; | ||||
|  | ||||
| @ -114,7 +114,7 @@ static int atmel_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | ||||
| 	u32 val; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	if (test_bit(PWMF_ENABLED, &pwm->flags) && (period_ns != pwm->period)) { | ||||
| 	if (pwm_is_enabled(pwm) && (period_ns != pwm->period)) { | ||||
| 		dev_err(chip->dev, "cannot change PWM period while enabled\n"); | ||||
| 		return -EBUSY; | ||||
| 	} | ||||
| @ -176,7 +176,7 @@ static void atmel_pwm_config_v1(struct pwm_chip *chip, struct pwm_device *pwm, | ||||
| 	 * If the PWM channel is enabled, only update CDTY by using the update | ||||
| 	 * register, it needs to set bit 10 of CMR to 0 | ||||
| 	 */ | ||||
| 	if (test_bit(PWMF_ENABLED, &pwm->flags)) | ||||
| 	if (pwm_is_enabled(pwm)) | ||||
| 		return; | ||||
| 	/*
 | ||||
| 	 * If the PWM channel is disabled, write value to duty and period | ||||
| @ -191,7 +191,7 @@ static void atmel_pwm_config_v2(struct pwm_chip *chip, struct pwm_device *pwm, | ||||
| { | ||||
| 	struct atmel_pwm_chip *atmel_pwm = to_atmel_pwm_chip(chip); | ||||
| 
 | ||||
| 	if (test_bit(PWMF_ENABLED, &pwm->flags)) { | ||||
| 	if (pwm_is_enabled(pwm)) { | ||||
| 		/*
 | ||||
| 		 * If the PWM channel is enabled, using the duty update register | ||||
| 		 * to update the value. | ||||
|  | ||||
| @ -134,7 +134,7 @@ static int kona_pwmc_config(struct pwm_chip *chip, struct pwm_device *pwm, | ||||
| 	} | ||||
| 
 | ||||
| 	/* If the PWM channel is enabled, write the settings to the HW */ | ||||
| 	if (test_bit(PWMF_ENABLED, &pwm->flags)) { | ||||
| 	if (pwm_is_enabled(pwm)) { | ||||
| 		value = readl(kp->base + PRESCALE_OFFSET); | ||||
| 		value &= ~PRESCALE_MASK(chan); | ||||
| 		value |= prescale << PRESCALE_SHIFT(chan); | ||||
| @ -287,7 +287,7 @@ static int kona_pwmc_remove(struct platform_device *pdev) | ||||
| 	unsigned int chan; | ||||
| 
 | ||||
| 	for (chan = 0; chan < kp->chip.npwm; chan++) | ||||
| 		if (test_bit(PWMF_ENABLED, &kp->chip.pwms[chan].flags)) | ||||
| 		if (pwm_is_enabled(&kp->chip.pwms[chan])) | ||||
| 			clk_disable_unprepare(kp->clk); | ||||
| 
 | ||||
| 	return pwmchip_remove(&kp->chip); | ||||
|  | ||||
| @ -82,7 +82,7 @@ static int ep93xx_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | ||||
| 	 * The clock needs to be enabled to access the PWM registers. | ||||
| 	 * Configuration can be changed at any time. | ||||
| 	 */ | ||||
| 	if (!test_bit(PWMF_ENABLED, &pwm->flags)) { | ||||
| 	if (!pwm_is_enabled(pwm)) { | ||||
| 		ret = clk_enable(ep93xx_pwm->clk); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| @ -113,7 +113,7 @@ static int ep93xx_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | ||||
| 		ret = -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!test_bit(PWMF_ENABLED, &pwm->flags)) | ||||
| 	if (!pwm_is_enabled(pwm)) | ||||
| 		clk_disable(ep93xx_pwm->clk); | ||||
| 
 | ||||
| 	return ret; | ||||
|  | ||||
| @ -114,7 +114,7 @@ static int imx_pwm_config_v2(struct pwm_chip *chip, | ||||
| 	unsigned long long c; | ||||
| 	unsigned long period_cycles, duty_cycles, prescale; | ||||
| 	unsigned int period_ms; | ||||
| 	bool enable = test_bit(PWMF_ENABLED, &pwm->flags); | ||||
| 	bool enable = pwm_is_enabled(pwm); | ||||
| 	int wait_count = 0, fifoav; | ||||
| 	u32 cr, sr; | ||||
| 
 | ||||
|  | ||||
| @ -77,7 +77,7 @@ static int mxs_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | ||||
| 	 * If the PWM channel is disabled, make sure to turn on the clock | ||||
| 	 * before writing the register. Otherwise, keep it enabled. | ||||
| 	 */ | ||||
| 	if (!test_bit(PWMF_ENABLED, &pwm->flags)) { | ||||
| 	if (!pwm_is_enabled(pwm)) { | ||||
| 		ret = clk_prepare_enable(mxs->clk); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| @ -92,7 +92,7 @@ static int mxs_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | ||||
| 	/*
 | ||||
| 	 * If the PWM is not enabled, turn the clock off again to save power. | ||||
| 	 */ | ||||
| 	if (!test_bit(PWMF_ENABLED, &pwm->flags)) | ||||
| 	if (!pwm_is_enabled(pwm)) | ||||
| 		clk_disable_unprepare(mxs->clk); | ||||
| 
 | ||||
| 	return 0; | ||||
|  | ||||
| @ -301,7 +301,7 @@ static int tpu_pwm_config(struct pwm_chip *chip, struct pwm_device *_pwm, | ||||
| 	pwm->duty = duty; | ||||
| 
 | ||||
| 	/* If the channel is disabled we're done. */ | ||||
| 	if (!test_bit(PWMF_ENABLED, &_pwm->flags)) | ||||
| 	if (!pwm_is_enabled(_pwm)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (duty_only && pwm->timer_on) { | ||||
|  | ||||
| @ -112,7 +112,7 @@ static int tegra_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | ||||
| 	 * If the PWM channel is disabled, make sure to turn on the clock | ||||
| 	 * before writing the register. Otherwise, keep it enabled. | ||||
| 	 */ | ||||
| 	if (!test_bit(PWMF_ENABLED, &pwm->flags)) { | ||||
| 	if (!pwm_is_enabled(pwm)) { | ||||
| 		err = clk_prepare_enable(pc->clk); | ||||
| 		if (err < 0) | ||||
| 			return err; | ||||
| @ -124,7 +124,7 @@ static int tegra_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | ||||
| 	/*
 | ||||
| 	 * If the PWM is not enabled, turn the clock off again to save power. | ||||
| 	 */ | ||||
| 	if (!test_bit(PWMF_ENABLED, &pwm->flags)) | ||||
| 	if (!pwm_is_enabled(pwm)) | ||||
| 		clk_disable_unprepare(pc->clk); | ||||
| 
 | ||||
| 	return 0; | ||||
| @ -214,7 +214,7 @@ static int tegra_pwm_remove(struct platform_device *pdev) | ||||
| 	for (i = 0; i < NUM_PWM; i++) { | ||||
| 		struct pwm_device *pwm = &pc->chip.pwms[i]; | ||||
| 
 | ||||
| 		if (!test_bit(PWMF_ENABLED, &pwm->flags)) | ||||
| 		if (!pwm_is_enabled(pwm)) | ||||
| 			if (clk_prepare_enable(pc->clk) < 0) | ||||
| 				continue; | ||||
| 
 | ||||
|  | ||||
| @ -97,7 +97,7 @@ static int ecap_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | ||||
| 
 | ||||
| 	writew(reg_val, pc->mmio_base + ECCTL2); | ||||
| 
 | ||||
| 	if (!test_bit(PWMF_ENABLED, &pwm->flags)) { | ||||
| 	if (!pwm_is_enabled(pwm)) { | ||||
| 		/* Update active registers if not running */ | ||||
| 		writel(duty_cycles, pc->mmio_base + CAP2); | ||||
| 		writel(period_cycles, pc->mmio_base + CAP1); | ||||
| @ -111,7 +111,7 @@ static int ecap_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | ||||
| 		writel(period_cycles, pc->mmio_base + CAP3); | ||||
| 	} | ||||
| 
 | ||||
| 	if (!test_bit(PWMF_ENABLED, &pwm->flags)) { | ||||
| 	if (!pwm_is_enabled(pwm)) { | ||||
| 		reg_val = readw(pc->mmio_base + ECCTL2); | ||||
| 		/* Disable APWM mode to put APWM output Low */ | ||||
| 		reg_val &= ~ECCTL2_APWM_MODE; | ||||
| @ -179,7 +179,7 @@ static void ecap_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) | ||||
| 
 | ||||
| static void ecap_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) | ||||
| { | ||||
| 	if (test_bit(PWMF_ENABLED, &pwm->flags)) { | ||||
| 	if (pwm_is_enabled(pwm)) { | ||||
| 		dev_warn(chip->dev, "Removing PWM device without disabling\n"); | ||||
| 		pm_runtime_put_sync(chip->dev); | ||||
| 	} | ||||
| @ -306,7 +306,7 @@ static int ecap_pwm_suspend(struct device *dev) | ||||
| 	ecap_pwm_save_context(pc); | ||||
| 
 | ||||
| 	/* Disable explicitly if PWM is running */ | ||||
| 	if (test_bit(PWMF_ENABLED, &pwm->flags)) | ||||
| 	if (pwm_is_enabled(pwm)) | ||||
| 		pm_runtime_put_sync(dev); | ||||
| 
 | ||||
| 	return 0; | ||||
| @ -318,7 +318,7 @@ static int ecap_pwm_resume(struct device *dev) | ||||
| 	struct pwm_device *pwm = pc->chip.pwms; | ||||
| 
 | ||||
| 	/* Enable explicitly if PWM was running */ | ||||
| 	if (test_bit(PWMF_ENABLED, &pwm->flags)) | ||||
| 	if (pwm_is_enabled(pwm)) | ||||
| 		pm_runtime_get_sync(dev); | ||||
| 
 | ||||
| 	ecap_pwm_restore_context(pc); | ||||
|  | ||||
| @ -407,7 +407,7 @@ static void ehrpwm_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) | ||||
| { | ||||
| 	struct ehrpwm_pwm_chip *pc = to_ehrpwm_pwm_chip(chip); | ||||
| 
 | ||||
| 	if (test_bit(PWMF_ENABLED, &pwm->flags)) { | ||||
| 	if (pwm_is_enabled(pwm)) { | ||||
| 		dev_warn(chip->dev, "Removing PWM device without disabling\n"); | ||||
| 		pm_runtime_put_sync(chip->dev); | ||||
| 	} | ||||
| @ -565,7 +565,7 @@ static int ehrpwm_pwm_suspend(struct device *dev) | ||||
| 	for (i = 0; i < pc->chip.npwm; i++) { | ||||
| 		struct pwm_device *pwm = &pc->chip.pwms[i]; | ||||
| 
 | ||||
| 		if (!test_bit(PWMF_ENABLED, &pwm->flags)) | ||||
| 		if (!pwm_is_enabled(pwm)) | ||||
| 			continue; | ||||
| 
 | ||||
| 		/* Disable explicitly if PWM is running */ | ||||
| @ -582,7 +582,7 @@ static int ehrpwm_pwm_resume(struct device *dev) | ||||
| 	for (i = 0; i < pc->chip.npwm; i++) { | ||||
| 		struct pwm_device *pwm = &pc->chip.pwms[i]; | ||||
| 
 | ||||
| 		if (!test_bit(PWMF_ENABLED, &pwm->flags)) | ||||
| 		if (!pwm_is_enabled(pwm)) | ||||
| 			continue; | ||||
| 
 | ||||
| 		/* Enable explicitly if PWM was running */ | ||||
|  | ||||
| @ -97,7 +97,7 @@ static ssize_t pwm_enable_show(struct device *child, | ||||
| 			       char *buf) | ||||
| { | ||||
| 	const struct pwm_device *pwm = child_to_pwm_device(child); | ||||
| 	int enabled = test_bit(PWMF_ENABLED, &pwm->flags); | ||||
| 	int enabled = pwm_is_enabled(pwm); | ||||
| 
 | ||||
| 	return sprintf(buf, "%d\n", enabled); | ||||
| } | ||||
|  | ||||
| @ -92,6 +92,11 @@ struct pwm_device { | ||||
| 	enum pwm_polarity	polarity; | ||||
| }; | ||||
| 
 | ||||
| static inline bool pwm_is_enabled(const struct pwm_device *pwm) | ||||
| { | ||||
| 	return test_bit(PWMF_ENABLED, &pwm->flags); | ||||
| } | ||||
| 
 | ||||
| static inline void pwm_set_period(struct pwm_device *pwm, unsigned int period) | ||||
| { | ||||
| 	if (pwm) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user