forked from Minki/linux
pwm: sun4i: Drop legacy callbacks
Remove the legacy callbacks .enable(), .disable(), .set_polarity() and .config(). Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Acked-by: Chen-Yu Tsai <wens@csie.org> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
This commit is contained in:
parent
c32c5c50d4
commit
a054c4d684
@ -305,167 +305,7 @@ static int sun4i_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sun4i_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
|
|
||||||
int duty_ns, int period_ns)
|
|
||||||
{
|
|
||||||
struct sun4i_pwm_chip *sun4i_pwm = to_sun4i_pwm_chip(chip);
|
|
||||||
u32 prd, dty, val, clk_gate;
|
|
||||||
u64 clk_rate, div = 0;
|
|
||||||
unsigned int prescaler = 0;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
clk_rate = clk_get_rate(sun4i_pwm->clk);
|
|
||||||
|
|
||||||
if (sun4i_pwm->data->has_prescaler_bypass) {
|
|
||||||
/* First, test without any prescaler when available */
|
|
||||||
prescaler = PWM_PRESCAL_MASK;
|
|
||||||
/*
|
|
||||||
* When not using any prescaler, the clock period in nanoseconds
|
|
||||||
* is not an integer so round it half up instead of
|
|
||||||
* truncating to get less surprising values.
|
|
||||||
*/
|
|
||||||
div = clk_rate * period_ns + NSEC_PER_SEC / 2;
|
|
||||||
do_div(div, NSEC_PER_SEC);
|
|
||||||
if (div - 1 > PWM_PRD_MASK)
|
|
||||||
prescaler = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prescaler == 0) {
|
|
||||||
/* Go up from the first divider */
|
|
||||||
for (prescaler = 0; prescaler < PWM_PRESCAL_MASK; prescaler++) {
|
|
||||||
if (!prescaler_table[prescaler])
|
|
||||||
continue;
|
|
||||||
div = clk_rate;
|
|
||||||
do_div(div, prescaler_table[prescaler]);
|
|
||||||
div = div * period_ns;
|
|
||||||
do_div(div, NSEC_PER_SEC);
|
|
||||||
if (div - 1 <= PWM_PRD_MASK)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (div - 1 > PWM_PRD_MASK) {
|
|
||||||
dev_err(chip->dev, "period exceeds the maximum value\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
prd = div;
|
|
||||||
div *= duty_ns;
|
|
||||||
do_div(div, period_ns);
|
|
||||||
dty = div;
|
|
||||||
|
|
||||||
err = clk_prepare_enable(sun4i_pwm->clk);
|
|
||||||
if (err) {
|
|
||||||
dev_err(chip->dev, "failed to enable PWM clock\n");
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_lock(&sun4i_pwm->ctrl_lock);
|
|
||||||
val = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG);
|
|
||||||
|
|
||||||
if (sun4i_pwm->data->has_rdy && (val & PWM_RDY(pwm->hwpwm))) {
|
|
||||||
spin_unlock(&sun4i_pwm->ctrl_lock);
|
|
||||||
clk_disable_unprepare(sun4i_pwm->clk);
|
|
||||||
return -EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
clk_gate = val & BIT_CH(PWM_CLK_GATING, pwm->hwpwm);
|
|
||||||
if (clk_gate) {
|
|
||||||
val &= ~BIT_CH(PWM_CLK_GATING, pwm->hwpwm);
|
|
||||||
sun4i_pwm_writel(sun4i_pwm, val, PWM_CTRL_REG);
|
|
||||||
}
|
|
||||||
|
|
||||||
val = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG);
|
|
||||||
val &= ~BIT_CH(PWM_PRESCAL_MASK, pwm->hwpwm);
|
|
||||||
val |= BIT_CH(prescaler, pwm->hwpwm);
|
|
||||||
sun4i_pwm_writel(sun4i_pwm, val, PWM_CTRL_REG);
|
|
||||||
|
|
||||||
val = (dty & PWM_DTY_MASK) | PWM_PRD(prd);
|
|
||||||
sun4i_pwm_writel(sun4i_pwm, val, PWM_CH_PRD(pwm->hwpwm));
|
|
||||||
|
|
||||||
if (clk_gate) {
|
|
||||||
val = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG);
|
|
||||||
val |= clk_gate;
|
|
||||||
sun4i_pwm_writel(sun4i_pwm, val, PWM_CTRL_REG);
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_unlock(&sun4i_pwm->ctrl_lock);
|
|
||||||
clk_disable_unprepare(sun4i_pwm->clk);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int sun4i_pwm_set_polarity(struct pwm_chip *chip, struct pwm_device *pwm,
|
|
||||||
enum pwm_polarity polarity)
|
|
||||||
{
|
|
||||||
struct sun4i_pwm_chip *sun4i_pwm = to_sun4i_pwm_chip(chip);
|
|
||||||
u32 val;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = clk_prepare_enable(sun4i_pwm->clk);
|
|
||||||
if (ret) {
|
|
||||||
dev_err(chip->dev, "failed to enable PWM clock\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_lock(&sun4i_pwm->ctrl_lock);
|
|
||||||
val = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG);
|
|
||||||
|
|
||||||
if (polarity != PWM_POLARITY_NORMAL)
|
|
||||||
val &= ~BIT_CH(PWM_ACT_STATE, pwm->hwpwm);
|
|
||||||
else
|
|
||||||
val |= BIT_CH(PWM_ACT_STATE, pwm->hwpwm);
|
|
||||||
|
|
||||||
sun4i_pwm_writel(sun4i_pwm, val, PWM_CTRL_REG);
|
|
||||||
|
|
||||||
spin_unlock(&sun4i_pwm->ctrl_lock);
|
|
||||||
clk_disable_unprepare(sun4i_pwm->clk);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int sun4i_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
|
|
||||||
{
|
|
||||||
struct sun4i_pwm_chip *sun4i_pwm = to_sun4i_pwm_chip(chip);
|
|
||||||
u32 val;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = clk_prepare_enable(sun4i_pwm->clk);
|
|
||||||
if (ret) {
|
|
||||||
dev_err(chip->dev, "failed to enable PWM clock\n");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_lock(&sun4i_pwm->ctrl_lock);
|
|
||||||
val = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG);
|
|
||||||
val |= BIT_CH(PWM_EN, pwm->hwpwm);
|
|
||||||
val |= BIT_CH(PWM_CLK_GATING, pwm->hwpwm);
|
|
||||||
sun4i_pwm_writel(sun4i_pwm, val, PWM_CTRL_REG);
|
|
||||||
spin_unlock(&sun4i_pwm->ctrl_lock);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void sun4i_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
|
|
||||||
{
|
|
||||||
struct sun4i_pwm_chip *sun4i_pwm = to_sun4i_pwm_chip(chip);
|
|
||||||
u32 val;
|
|
||||||
|
|
||||||
spin_lock(&sun4i_pwm->ctrl_lock);
|
|
||||||
val = sun4i_pwm_readl(sun4i_pwm, PWM_CTRL_REG);
|
|
||||||
val &= ~BIT_CH(PWM_EN, pwm->hwpwm);
|
|
||||||
val &= ~BIT_CH(PWM_CLK_GATING, pwm->hwpwm);
|
|
||||||
sun4i_pwm_writel(sun4i_pwm, val, PWM_CTRL_REG);
|
|
||||||
spin_unlock(&sun4i_pwm->ctrl_lock);
|
|
||||||
|
|
||||||
clk_disable_unprepare(sun4i_pwm->clk);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct pwm_ops sun4i_pwm_ops = {
|
static const struct pwm_ops sun4i_pwm_ops = {
|
||||||
.config = sun4i_pwm_config,
|
|
||||||
.set_polarity = sun4i_pwm_set_polarity,
|
|
||||||
.enable = sun4i_pwm_enable,
|
|
||||||
.disable = sun4i_pwm_disable,
|
|
||||||
.apply = sun4i_pwm_apply,
|
.apply = sun4i_pwm_apply,
|
||||||
.get_state = sun4i_pwm_get_state,
|
.get_state = sun4i_pwm_get_state,
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
|
Loading…
Reference in New Issue
Block a user