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; | 	struct pwm_chip chip; | ||||||
| 	const struct meson_pwm_data *data; | 	const struct meson_pwm_data *data; | ||||||
| 	void __iomem *base; | 	void __iomem *base; | ||||||
| 	u8 inverter_mask; |  | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * Protects register (write) access to the REG_MISC_AB register | 	 * Protects register (write) access to the REG_MISC_AB register | ||||||
| 	 * that is shared between the two PWMs. | 	 * 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, | static int meson_pwm_calc(struct meson_pwm *meson, | ||||||
| 			  struct meson_pwm_channel *channel, unsigned int id, | 			  struct meson_pwm_channel *channel, | ||||||
| 			  unsigned int duty, unsigned int period) | 			  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; | 	unsigned long fin_freq = -1; | ||||||
| 	u64 fin_ps; | 	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; | 		duty = period - duty; | ||||||
| 
 | 
 | ||||||
| 	if (period == channel->state.period && | 	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 || | 	if (state->period != channel->state.period || | ||||||
| 	    state->duty_cycle != channel->state.duty_cycle || | 	    state->duty_cycle != channel->state.duty_cycle || | ||||||
| 	    state->polarity != channel->state.polarity) { | 	    state->polarity != channel->state.polarity) { | ||||||
| 		if (state->polarity != channel->state.polarity) { | 		err = meson_pwm_calc(meson, channel, state); | ||||||
| 			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); |  | ||||||
| 		if (err < 0) | 		if (err < 0) | ||||||
| 			return err; | 			return err; | ||||||
| 
 | 
 | ||||||
|  | @ -529,7 +523,6 @@ static int meson_pwm_probe(struct platform_device *pdev) | ||||||
| 	meson->chip.of_pwm_n_cells = 3; | 	meson->chip.of_pwm_n_cells = 3; | ||||||
| 
 | 
 | ||||||
| 	meson->data = of_device_get_match_data(&pdev->dev); | 	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, | 	channels = devm_kcalloc(&pdev->dev, meson->chip.npwm, | ||||||
| 				sizeof(*channels), GFP_KERNEL); | 				sizeof(*channels), GFP_KERNEL); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Martin Blumenstingl
						Martin Blumenstingl