diff options
Diffstat (limited to 'drivers/pwm/pwm-qpnp.c')
| -rw-r--r-- | drivers/pwm/pwm-qpnp.c | 51 |
1 files changed, 38 insertions, 13 deletions
diff --git a/drivers/pwm/pwm-qpnp.c b/drivers/pwm/pwm-qpnp.c index 9cd29e4c81e3..ac71f2c75472 100644 --- a/drivers/pwm/pwm-qpnp.c +++ b/drivers/pwm/pwm-qpnp.c @@ -745,11 +745,27 @@ static int qpnp_lpg_configure_pattern(struct qpnp_pwm_chip *chip) QPNP_LPG_PATTERN_CONFIG), 1, chip); } +static int qpnp_lpg_glitch_removal(struct qpnp_pwm_chip *chip, bool enable) +{ + struct qpnp_lpg_config *lpg_config = &chip->lpg_config; + u8 value, mask; + + qpnp_set_pwm_type_config(&value, enable ? 1 : 0, 0, 0, 0); + + mask = QPNP_EN_GLITCH_REMOVAL_MASK | QPNP_EN_FULL_SCALE_MASK | + QPNP_EN_PHASE_STAGGER_MASK | QPNP_PHASE_STAGGER_MASK; + + pr_debug("pwm_type_config: %d\n", value); + return qpnp_lpg_save_and_write(value, mask, + &chip->qpnp_lpg_registers[QPNP_LPG_PWM_TYPE_CONFIG], + SPMI_LPG_REG_ADDR(lpg_config->base_addr, + QPNP_LPG_PWM_TYPE_CONFIG), 1, chip); +} + static int qpnp_lpg_configure_pwm(struct qpnp_pwm_chip *chip) { struct qpnp_lpg_config *lpg_config = &chip->lpg_config; - int rc; - u8 value, mask; + int rc; pr_debug("pwm_size_clk: %d\n", chip->qpnp_lpg_registers[QPNP_LPG_PWM_SIZE_CLK]); @@ -770,16 +786,13 @@ static int qpnp_lpg_configure_pwm(struct qpnp_pwm_chip *chip) if (rc) return rc; - qpnp_set_pwm_type_config(&value, 1, 0, 0, 0); - - mask = QPNP_EN_GLITCH_REMOVAL_MASK | QPNP_EN_FULL_SCALE_MASK | - QPNP_EN_PHASE_STAGGER_MASK | QPNP_PHASE_STAGGER_MASK; - - pr_debug("pwm_type_config: %d\n", value); - return qpnp_lpg_save_and_write(value, mask, - &chip->qpnp_lpg_registers[QPNP_LPG_PWM_TYPE_CONFIG], - SPMI_LPG_REG_ADDR(lpg_config->base_addr, - QPNP_LPG_PWM_TYPE_CONFIG), 1, chip); + /* Disable glitch removal when LPG/PWM is configured */ + rc = qpnp_lpg_glitch_removal(chip, false); + if (rc) { + pr_err("Error in disabling glitch control, rc=%d\n", rc); + return rc; + } + return rc; } static int qpnp_configure_pwm_control(struct qpnp_pwm_chip *chip) @@ -1204,8 +1217,20 @@ static int _pwm_config(struct qpnp_pwm_chip *chip, if (rc) goto out; - if (!rc && chip->enabled) + if (!rc && chip->enabled) { rc = qpnp_lpg_configure_pwm_state(chip, QPNP_PWM_ENABLE); + if (rc) { + pr_err("Error in configuring pwm state, rc=%d\n", rc); + return rc; + } + + /* Enable the glitch removal after PWM is enabled */ + rc = qpnp_lpg_glitch_removal(chip, true); + if (rc) { + pr_err("Error in enabling glitch control, rc=%d\n", rc); + return rc; + } + } pr_debug("duty/period=%u/%u %s: pwm_value=%d (of %d)\n", (unsigned)duty_value, (unsigned)period_value, |
