diff options
| author | Martin Blumenstingl <martin.blumenstingl@googlemail.com> | 2019-06-12 21:59:02 +0200 | 
|---|---|---|
| committer | Thierry Reding <thierry.reding@gmail.com> | 2019-06-26 11:39:08 +0200 | 
| commit | b79c3670e120c6c6aee313c56acd9bbb13db310f (patch) | |
| tree | 3459bebd4bd0b6a943a4976164f8d339d82d32d4 /drivers/pwm/pwm-meson.c | |
| parent | 33cefd84d26b59e071b3172b0e3ca979163f39eb (diff) | |
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>
Diffstat (limited to 'drivers/pwm/pwm-meson.c')
| -rw-r--r-- | drivers/pwm/pwm-meson.c | 23 | 
1 files changed, 8 insertions, 15 deletions
| diff --git a/drivers/pwm/pwm-meson.c b/drivers/pwm/pwm-meson.c index 3f78f8d643d6..aa6ead19d42a 100644 --- a/drivers/pwm/pwm-meson.c +++ b/drivers/pwm/pwm-meson.c @@ -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); | 
