diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c index 47d5af13048a..367916838a9e 100644 --- a/drivers/pwm/pwm-rockchip.c +++ b/drivers/pwm/pwm-rockchip.c @@ -26,6 +26,7 @@ #define PWM_INACTIVE_POSITIVE (1 << 4) #define PWM_POLARITY_MASK (PWM_DUTY_POSITIVE | PWM_INACTIVE_POSITIVE) #define PWM_OUTPUT_LEFT (0 << 5) +#define PWM_OUTPUT_CENTER (1 << 5) #define PWM_LOCK_EN (1 << 6) #define PWM_LP_DISABLE (0 << 8) @@ -36,6 +37,7 @@ struct rockchip_pwm_chip { const struct rockchip_pwm_data *data; void __iomem *base; bool vop_pwm_en; /* indicate voppwm mirror register state */ + bool center_aligned; }; struct rockchip_pwm_regs { @@ -178,6 +180,11 @@ static int rockchip_pwm_enable(struct pwm_chip *chip, val = readl_relaxed(pc->base + pc->data->regs.ctrl); val &= ~pc->data->enable_conf_mask; + if (PWM_OUTPUT_CENTER & pc->data->enable_conf_mask) { + if (pc->center_aligned) + val |= PWM_OUTPUT_CENTER; + } + if (enable) val |= enable_conf; else @@ -381,6 +388,9 @@ static int rockchip_pwm_probe(struct platform_device *pdev) ctrl = readl_relaxed(pc->base + pc->data->regs.ctrl); enabled = (ctrl & enable_conf) == enable_conf; + pc->center_aligned = + device_property_read_bool(&pdev->dev, "center-aligned"); + ret = pwmchip_add(&pc->chip); if (ret < 0) { dev_err(&pdev->dev, "pwmchip_add() failed: %d\n", ret);