|
@@ -85,6 +85,22 @@ static int pca9685_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
|
|
|
}
|
|
|
|
|
|
if (duty_ns == period_ns) {
|
|
|
+ /* Clear both OFF registers */
|
|
|
+ if (pwm->hwpwm >= PCA9685_MAXCHAN)
|
|
|
+ reg = PCA9685_ALL_LED_OFF_L;
|
|
|
+ else
|
|
|
+ reg = LED_N_OFF_L(pwm->hwpwm);
|
|
|
+
|
|
|
+ regmap_write(pca->regmap, reg, 0x0);
|
|
|
+
|
|
|
+ if (pwm->hwpwm >= PCA9685_MAXCHAN)
|
|
|
+ reg = PCA9685_ALL_LED_OFF_H;
|
|
|
+ else
|
|
|
+ reg = LED_N_OFF_H(pwm->hwpwm);
|
|
|
+
|
|
|
+ regmap_write(pca->regmap, reg, 0x0);
|
|
|
+
|
|
|
+ /* Set the full ON bit */
|
|
|
if (pwm->hwpwm >= PCA9685_MAXCHAN)
|
|
|
reg = PCA9685_ALL_LED_ON_H;
|
|
|
else
|
|
@@ -112,6 +128,14 @@ static int pca9685_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
|
|
|
|
|
|
regmap_write(pca->regmap, reg, ((int)duty >> 8) & 0xf);
|
|
|
|
|
|
+ /* Clear the full ON bit, otherwise the set OFF time has no effect */
|
|
|
+ if (pwm->hwpwm >= PCA9685_MAXCHAN)
|
|
|
+ reg = PCA9685_ALL_LED_ON_H;
|
|
|
+ else
|
|
|
+ reg = LED_N_ON_H(pwm->hwpwm);
|
|
|
+
|
|
|
+ regmap_write(pca->regmap, reg, 0);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|