forked from mirrors/linux
		
	pwm: meson: Don't duplicate the polarity internally
Let meson_pwm_calc() use the polarity from struct pwm_state directly. This removes a level of indirection where meson_pwm_apply() first had to set a driver-internal inverter mask which was then only used by meson_pwm_calc(). Instead of adding the polarity as parameter to meson_pwm_calc() switch to struct pwm_state directly to make it easier to see where the parameters are actually coming from. Reviewed-by: Neil Armstrong <narmstrong@baylibre.com> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
This commit is contained in:
		
							parent
							
								
									33cefd84d2
								
							
						
					
					
						commit
						b79c3670e1
					
				
					 1 changed files with 8 additions and 15 deletions
				
			
		|  | @ -63,7 +63,6 @@ struct meson_pwm { | |||
| 	struct pwm_chip chip; | ||||
| 	const struct meson_pwm_data *data; | ||||
| 	void __iomem *base; | ||||
| 	u8 inverter_mask; | ||||
| 	/*
 | ||||
| 	 * Protects register (write) access to the REG_MISC_AB register | ||||
| 	 * that is shared between the two PWMs. | ||||
|  | @ -116,14 +115,17 @@ static void meson_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) | |||
| } | ||||
| 
 | ||||
| static int meson_pwm_calc(struct meson_pwm *meson, | ||||
| 			  struct meson_pwm_channel *channel, unsigned int id, | ||||
| 			  unsigned int duty, unsigned int period) | ||||
| 			  struct meson_pwm_channel *channel, | ||||
| 			  struct pwm_state *state) | ||||
| { | ||||
| 	unsigned int pre_div, cnt, duty_cnt; | ||||
| 	unsigned int duty, period, pre_div, cnt, duty_cnt; | ||||
| 	unsigned long fin_freq = -1; | ||||
| 	u64 fin_ps; | ||||
| 
 | ||||
| 	if (~(meson->inverter_mask >> id) & 0x1) | ||||
| 	duty = state->duty_cycle; | ||||
| 	period = state->period; | ||||
| 
 | ||||
| 	if (state->polarity == PWM_POLARITY_INVERSED) | ||||
| 		duty = period - duty; | ||||
| 
 | ||||
| 	if (period == channel->state.period && | ||||
|  | @ -278,15 +280,7 @@ static int meson_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, | |||
| 	if (state->period != channel->state.period || | ||||
| 	    state->duty_cycle != channel->state.duty_cycle || | ||||
| 	    state->polarity != channel->state.polarity) { | ||||
| 		if (state->polarity != channel->state.polarity) { | ||||
| 			if (state->polarity == PWM_POLARITY_NORMAL) | ||||
| 				meson->inverter_mask |= BIT(pwm->hwpwm); | ||||
| 			else | ||||
| 				meson->inverter_mask &= ~BIT(pwm->hwpwm); | ||||
| 		} | ||||
| 
 | ||||
| 		err = meson_pwm_calc(meson, channel, pwm->hwpwm, | ||||
| 				     state->duty_cycle, state->period); | ||||
| 		err = meson_pwm_calc(meson, channel, state); | ||||
| 		if (err < 0) | ||||
| 			return err; | ||||
| 
 | ||||
|  | @ -529,7 +523,6 @@ static int meson_pwm_probe(struct platform_device *pdev) | |||
| 	meson->chip.of_pwm_n_cells = 3; | ||||
| 
 | ||||
| 	meson->data = of_device_get_match_data(&pdev->dev); | ||||
| 	meson->inverter_mask = BIT(meson->chip.npwm) - 1; | ||||
| 
 | ||||
| 	channels = devm_kcalloc(&pdev->dev, meson->chip.npwm, | ||||
| 				sizeof(*channels), GFP_KERNEL); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Martin Blumenstingl
						Martin Blumenstingl