Skip to content

Commit

Permalink
pwm: berlin: Implement .apply() callback
Browse files Browse the repository at this point in the history
To eventually get rid of all legacy drivers convert this driver to the
modern world implementing .apply(). This just pushes down a slightly
optimized variant of how legacy drivers are handled in the core.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
  • Loading branch information
Uwe Kleine-König authored and Thierry Reding committed Jun 30, 2021
1 parent 3f3e805 commit 30dffb4
Showing 1 changed file with 38 additions and 5 deletions.
43 changes: 38 additions & 5 deletions drivers/pwm/pwm-berlin.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ static void berlin_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
}

static int berlin_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
int duty_ns, int period_ns)
u64 duty_ns, u64 period_ns)
{
struct berlin_pwm_chip *bpc = to_berlin_pwm_chip(chip);
bool prescale_4096 = false;
Expand Down Expand Up @@ -167,13 +167,46 @@ static void berlin_pwm_disable(struct pwm_chip *chip,
berlin_pwm_writel(bpc, pwm->hwpwm, value, BERLIN_PWM_EN);
}

static int berlin_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
const struct pwm_state *state)
{
int err;
bool enabled = pwm->state.enabled;

if (state->polarity != pwm->state.polarity) {
if (enabled) {
berlin_pwm_disable(chip, pwm);
enabled = false;
}

err = berlin_pwm_set_polarity(chip, pwm, state->polarity);
if (err)
return err;
}

if (!state->enabled) {
if (enabled)
berlin_pwm_disable(chip, pwm);
return 0;
}

if (state->period != pwm->state.period ||
state->duty_cycle != pwm->state.duty_cycle) {
err = berlin_pwm_config(chip, pwm, state->duty_cycle, state->period);
if (err)
return err;
}

if (!enabled)
return berlin_pwm_enable(chip, pwm);

return 0;
}

static const struct pwm_ops berlin_pwm_ops = {
.request = berlin_pwm_request,
.free = berlin_pwm_free,
.config = berlin_pwm_config,
.set_polarity = berlin_pwm_set_polarity,
.enable = berlin_pwm_enable,
.disable = berlin_pwm_disable,
.apply = berlin_pwm_apply,
.owner = THIS_MODULE,
};

Expand Down

0 comments on commit 30dffb4

Please sign in to comment.