Skip to content

Commit

Permalink
pwm: sti: Maintain a bitmap of configured devices
Browse files Browse the repository at this point in the history
This patch introduces a bitmap which is used to keep track of the
pwm channels which have been configured in a pwm chip.

The method used earlier to find the number of configured channels,
was to count the pwmdevices with PWMF_REQUESTED field set
and period value configured. This was not correct and failed
when of_pwm_get()/pwm_get() and then pwm_config() was used.

Signed-off-by: Ajit Pal Singh <ajitpal.singh@st.com>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
  • Loading branch information
Ajit Pal Singh authored and Thierry Reding committed Jan 30, 2015
1 parent ed73598 commit cd264b6
Showing 1 changed file with 11 additions and 19 deletions.
30 changes: 11 additions & 19 deletions drivers/pwm/pwm-sti.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ struct sti_pwm_chip {
struct regmap_field *pwm_int_en;
struct pwm_chip chip;
struct pwm_device *cur;
unsigned long configured;
unsigned int en_count;
struct mutex sti_pwm_lock; /* To sync between enable/disable calls */
void __iomem *mmio;
Expand Down Expand Up @@ -102,24 +103,6 @@ static int sti_pwm_get_prescale(struct sti_pwm_chip *pc, unsigned long period,
return 0;
}

/* Calculate the number of PWM devices configured with a period. */
static unsigned int sti_pwm_count_configured(struct pwm_chip *chip)
{
struct pwm_device *pwm;
unsigned int ncfg = 0;
unsigned int i;

for (i = 0; i < chip->npwm; i++) {
pwm = &chip->pwms[i];
if (test_bit(PWMF_REQUESTED, &pwm->flags)) {
if (pwm_get_period(pwm))
ncfg++;
}
}

return ncfg;
}

/*
* For STiH4xx PWM IP, the PWM period is fixed to 256 local clock cycles.
* The only way to change the period (apart from changing the PWM input clock)
Expand All @@ -141,7 +124,7 @@ static int sti_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
unsigned int ncfg;
bool period_same = false;

ncfg = sti_pwm_count_configured(chip);
ncfg = hweight_long(pc->configured);
if (ncfg)
period_same = (period_ns == pwm_get_period(cur));

Expand Down Expand Up @@ -197,6 +180,7 @@ static int sti_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,

ret = regmap_field_write(pc->pwm_int_en, 0);

set_bit(pwm->hwpwm, &pc->configured);
pc->cur = pwm;

dev_dbg(dev, "prescale:%u, period:%i, duty:%i, pwmvalx:%u\n",
Expand Down Expand Up @@ -254,10 +238,18 @@ static void sti_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
mutex_unlock(&pc->sti_pwm_lock);
}

static void sti_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
{
struct sti_pwm_chip *pc = to_sti_pwmchip(chip);

clear_bit(pwm->hwpwm, &pc->configured);
}

static const struct pwm_ops sti_pwm_ops = {
.config = sti_pwm_config,
.enable = sti_pwm_enable,
.disable = sti_pwm_disable,
.free = sti_pwm_free,
.owner = THIS_MODULE,
};

Expand Down

0 comments on commit cd264b6

Please sign in to comment.