diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c index 3cc7fce9f5b2..4889c5a0cbc2 100644 --- a/drivers/pwm/pwm-rockchip.c +++ b/drivers/pwm/pwm-rockchip.c @@ -38,6 +38,7 @@ struct rockchip_pwm_chip { struct clk *pclk; const struct rockchip_pwm_data *data; void __iomem *base; + bool vop_pwm_en; /* indicate voppwm mirror register state */ }; struct rockchip_pwm_regs { @@ -52,6 +53,7 @@ struct rockchip_pwm_data { unsigned int prescaler; bool supports_polarity; bool supports_lock; + bool vop_pwm; u32 enable_conf; u32 enable_conf_mask; }; @@ -129,6 +131,12 @@ static void rockchip_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, * change the duty and period, that would not be effective. */ ctrl = readl_relaxed(pc->base + pc->data->regs.ctrl); + if (pc->data->vop_pwm) { + if (pc->vop_pwm_en) + ctrl |= PWM_ENABLE; + else + ctrl &= ~PWM_ENABLE; + } if (pc->data->supports_lock) { ctrl |= PWM_LOCK_EN; writel_relaxed(ctrl, pc->base + pc->data->regs.ctrl); @@ -180,6 +188,8 @@ static int rockchip_pwm_enable(struct pwm_chip *chip, val &= ~enable_conf; writel_relaxed(val, pc->base + pc->data->regs.ctrl); + if (pc->data->vop_pwm) + pc->vop_pwm_en = enable; if (!enable) clk_disable(pc->clk); @@ -245,6 +255,7 @@ static const struct rockchip_pwm_data pwm_data_v1 = { .prescaler = 2, .supports_polarity = false, .supports_lock = false, + .vop_pwm = false, .enable_conf = PWM_CTRL_OUTPUT_EN | PWM_CTRL_TIMER_EN, .enable_conf_mask = BIT(1) | BIT(3), }; @@ -259,6 +270,7 @@ static const struct rockchip_pwm_data pwm_data_v2 = { .prescaler = 1, .supports_polarity = true, .supports_lock = false, + .vop_pwm = false, .enable_conf = PWM_OUTPUT_LEFT | PWM_LP_DISABLE | PWM_ENABLE | PWM_CONTINUOUS, .enable_conf_mask = GENMASK(2, 0) | BIT(5) | BIT(8), @@ -274,6 +286,7 @@ static const struct rockchip_pwm_data pwm_data_vop = { .prescaler = 1, .supports_polarity = true, .supports_lock = false, + .vop_pwm = true, .enable_conf = PWM_OUTPUT_LEFT | PWM_LP_DISABLE | PWM_ENABLE | PWM_CONTINUOUS, .enable_conf_mask = GENMASK(2, 0) | BIT(5) | BIT(8), @@ -289,6 +302,7 @@ static const struct rockchip_pwm_data pwm_data_v3 = { .prescaler = 1, .supports_polarity = true, .supports_lock = true, + .vop_pwm = false, .enable_conf = PWM_OUTPUT_LEFT | PWM_LP_DISABLE | PWM_ENABLE | PWM_CONTINUOUS, .enable_conf_mask = GENMASK(2, 0) | BIT(5) | BIT(8),