Skip to content

Commit

Permalink
pwm: Drop support for legacy drivers
Browse files Browse the repository at this point in the history
There are no drivers left providing the legacy callbacks. So drop
support for these.

If this commit breaks your out-of-tree pwm driver, look at e.g. commit
ec00cd5 ("pwm: renesas-tpu: Implement .apply() callback") for an
example of the needed conversion for your driver.

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 thierryreding committed Jun 22, 2022
1 parent f2906aa commit 0829c35
Show file tree
Hide file tree
Showing 2 changed files with 1 addition and 93 deletions.
82 changes: 1 addition & 81 deletions drivers/pwm/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -235,18 +235,8 @@ EXPORT_SYMBOL_GPL(pwm_get_chip_data);

static bool pwm_ops_check(const struct pwm_chip *chip)
{

const struct pwm_ops *ops = chip->ops;

/* driver supports legacy, non-atomic operation */
if (ops->config && ops->enable && ops->disable) {
if (IS_ENABLED(CONFIG_PWM_DEBUG))
dev_warn(chip->dev,
"Driver needs updating to atomic API\n");

return true;
}

if (!ops->apply)
return false;

Expand Down Expand Up @@ -548,73 +538,6 @@ static void pwm_apply_state_debug(struct pwm_device *pwm,
}
}

static int pwm_apply_legacy(struct pwm_chip *chip, struct pwm_device *pwm,
const struct pwm_state *state)
{
int err;
struct pwm_state initial_state = pwm->state;

if (state->polarity != pwm->state.polarity) {
if (!chip->ops->set_polarity)
return -EINVAL;

/*
* Changing the polarity of a running PWM is only allowed when
* the PWM driver implements ->apply().
*/
if (pwm->state.enabled) {
chip->ops->disable(chip, pwm);

/*
* Update pwm->state already here in case
* .set_polarity() or another callback depend on that.
*/
pwm->state.enabled = false;
}

err = chip->ops->set_polarity(chip, pwm, state->polarity);
if (err)
goto rollback;

pwm->state.polarity = state->polarity;
}

if (!state->enabled) {
if (pwm->state.enabled)
chip->ops->disable(chip, pwm);

return 0;
}

/*
* We cannot skip calling ->config even if state->period ==
* pwm->state.period && state->duty_cycle == pwm->state.duty_cycle
* because we might have exited early in the last call to
* pwm_apply_state because of !state->enabled and so the two values in
* pwm->state might not be configured in hardware.
*/
err = chip->ops->config(pwm->chip, pwm,
state->duty_cycle,
state->period);
if (err)
goto rollback;

pwm->state.period = state->period;
pwm->state.duty_cycle = state->duty_cycle;

if (!pwm->state.enabled) {
err = chip->ops->enable(chip, pwm);
if (err)
goto rollback;
}

return 0;

rollback:
pwm->state = initial_state;
return err;
}

/**
* pwm_apply_state() - atomically apply a new state to a PWM device
* @pwm: PWM device
Expand Down Expand Up @@ -647,10 +570,7 @@ int pwm_apply_state(struct pwm_device *pwm, const struct pwm_state *state)
state->usage_power == pwm->state.usage_power)
return 0;

if (chip->ops->apply)
err = chip->ops->apply(chip, pwm, state);
else
err = pwm_apply_legacy(chip, pwm, state);
err = chip->ops->apply(chip, pwm, state);
if (err)
return err;

Expand Down
12 changes: 0 additions & 12 deletions include/linux/pwm.h
Original file line number Diff line number Diff line change
Expand Up @@ -261,10 +261,6 @@ pwm_set_relative_duty_cycle(struct pwm_state *state, unsigned int duty_cycle,
* called once per PWM device when the PWM chip is
* registered.
* @owner: helps prevent removal of modules exporting active PWMs
* @config: configure duty cycles and period length for this PWM
* @set_polarity: configure the polarity of this PWM
* @enable: enable PWM output toggling
* @disable: disable PWM output toggling
*/
struct pwm_ops {
int (*request)(struct pwm_chip *chip, struct pwm_device *pwm);
Expand All @@ -276,14 +272,6 @@ struct pwm_ops {
void (*get_state)(struct pwm_chip *chip, struct pwm_device *pwm,
struct pwm_state *state);
struct module *owner;

/* Only used by legacy drivers */
int (*config)(struct pwm_chip *chip, struct pwm_device *pwm,
int duty_ns, int period_ns);
int (*set_polarity)(struct pwm_chip *chip, struct pwm_device *pwm,
enum pwm_polarity polarity);
int (*enable)(struct pwm_chip *chip, struct pwm_device *pwm);
void (*disable)(struct pwm_chip *chip, struct pwm_device *pwm);
};

/**
Expand Down

0 comments on commit 0829c35

Please sign in to comment.