On Tue, Dec 13, 2016 at 04:52:51PM +0100, Clemens Gruber wrote: > Until now, we assumed that the period is the hardware default of 1/200Hz > at probe time, but if the period was changed and the user reboots, this > assumption is wrong. > > Solution: Check if the prescaler is set to the hardware default. If not, > reprogram the prescaler at first configuration. > > Cc: # v4.3+ > Signed-off-by: Clemens Gruber > --- > drivers/pwm/pwm-pca9685.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) Cc'ing Mika and Andy and quoting verbatim for review. Thierry > diff --git a/drivers/pwm/pwm-pca9685.c b/drivers/pwm/pwm-pca9685.c > index 01a6a83..efc657e 100644 > --- a/drivers/pwm/pwm-pca9685.c > +++ b/drivers/pwm/pwm-pca9685.c > @@ -55,6 +55,7 @@ > #define PCA9685_PRESCALE 0xFE > > #define PCA9685_PRESCALE_MIN 0x03 /* => max. frequency of 1526 Hz */ > +#define PCA9685_PRESCALE_DEF 0x1E /* => default frequency of 200 Hz */ > #define PCA9685_PRESCALE_MAX 0xFF /* => min. frequency of 24 Hz */ > > #define PCA9685_COUNTER_RANGE 4096 > @@ -289,8 +290,8 @@ static int pca9685_pwm_probe(struct i2c_client *client, > const struct i2c_device_id *id) > { > struct pca9685 *pca; > + int prescale, mode2; > int ret; > - int mode2; > > pca = devm_kzalloc(&client->dev, sizeof(*pca), GFP_KERNEL); > if (!pca) > @@ -304,10 +305,15 @@ static int pca9685_pwm_probe(struct i2c_client *client, > return ret; > } > pca->duty_ns = 0; > - pca->period_ns = PCA9685_DEFAULT_PERIOD; > > i2c_set_clientdata(client, pca); > > + regmap_read(pca->regmap, PCA9685_PRESCALE, &prescale); > + if (prescale == PCA9685_PRESCALE_DEF) > + pca->period_ns = PCA9685_DEFAULT_PERIOD; > + else > + pca->period_ns = 0; > + > regmap_read(pca->regmap, PCA9685_MODE2, &mode2); > > if (device_property_read_bool(&client->dev, "invert")) > -- > 2.10.2 >