0, user_max);
 }
 
-static u32 intel_panel_compute_brightness(struct intel_connector *connector,
-                                         u32 val)
+static u32 intel_panel_invert_pwm_level(struct intel_connector *connector, u32 val)
 {
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        struct intel_panel *panel = &connector->panel;
 
-       drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
+       drm_WARN_ON(&dev_priv->drm, panel->backlight.pwm_level_max == 0);
 
        if (dev_priv->params.invert_brightness < 0)
                return val;
 
        if (dev_priv->params.invert_brightness > 0 ||
            dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS) {
-               return panel->backlight.max - val + panel->backlight.min;
+               return panel->backlight.pwm_level_max - val + panel->backlight.pwm_level_min;
        }
 
        return val;
 }
 
+void intel_panel_set_pwm_level(const struct drm_connector_state *conn_state, u32 val)
+{
+       struct intel_connector *connector = to_intel_connector(conn_state->connector);
+       struct drm_i915_private *i915 = to_i915(connector->base.dev);
+       struct intel_panel *panel = &connector->panel;
+
+       drm_dbg_kms(&i915->drm, "set backlight PWM = %d\n", val);
+       panel->backlight.pwm_funcs->set(conn_state, val);
+}
+
 static u32 lpt_get_backlight(struct intel_connector *connector, enum pipe unused)
 {
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        struct intel_panel *panel = &connector->panel;
        u32 tmp, mask;
 
-       drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
+       drm_WARN_ON(&dev_priv->drm, panel->backlight.pwm_level_max == 0);
 
        if (panel->backlight.combination_mode) {
                u8 lbpc;
 
-               lbpc = level * 0xfe / panel->backlight.max + 1;
+               lbpc = level * 0xfe / panel->backlight.pwm_level_max + 1;
                level /= lbpc;
                pci_write_config_byte(dev_priv->drm.pdev, LBPC, lbpc);
        }
        struct drm_i915_private *i915 = to_i915(connector->base.dev);
        struct intel_panel *panel = &connector->panel;
 
-       drm_dbg_kms(&i915->drm, "set backlight PWM = %d\n", level);
+       drm_dbg_kms(&i915->drm, "set backlight level = %d\n", level);
 
-       level = intel_panel_compute_brightness(connector, level);
        panel->backlight.funcs->set(conn_state, level);
 }
 
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        u32 tmp;
 
-       intel_panel_actually_set_backlight(old_conn_state, level);
+       intel_panel_set_pwm_level(old_conn_state, level);
 
        /*
         * Although we don't support or enable CPU PWM with LPT/SPT based
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        u32 tmp;
 
-       intel_panel_actually_set_backlight(old_conn_state, val);
+       intel_panel_set_pwm_level(old_conn_state, val);
 
        tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
        intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, tmp & ~BLM_PWM_ENABLE);
 
 static void i9xx_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
 {
-       intel_panel_actually_set_backlight(old_conn_state, val);
+       intel_panel_set_pwm_level(old_conn_state, val);
 }
 
 static void i965_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
        struct drm_i915_private *dev_priv = to_i915(old_conn_state->connector->dev);
        u32 tmp;
 
-       intel_panel_actually_set_backlight(old_conn_state, val);
+       intel_panel_set_pwm_level(old_conn_state, val);
 
        tmp = intel_de_read(dev_priv, BLC_PWM_CTL2);
        intel_de_write(dev_priv, BLC_PWM_CTL2, tmp & ~BLM_PWM_ENABLE);
        enum pipe pipe = to_intel_crtc(old_conn_state->crtc)->pipe;
        u32 tmp;
 
-       intel_panel_actually_set_backlight(old_conn_state, val);
+       intel_panel_set_pwm_level(old_conn_state, val);
 
        tmp = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
        intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe),
        struct intel_panel *panel = &connector->panel;
        u32 tmp;
 
-       intel_panel_actually_set_backlight(old_conn_state, val);
+       intel_panel_set_pwm_level(old_conn_state, val);
 
        tmp = intel_de_read(dev_priv,
                            BXT_BLC_PWM_CTL(panel->backlight.controller));
        struct intel_panel *panel = &connector->panel;
        u32 tmp;
 
-       intel_panel_actually_set_backlight(old_conn_state, val);
+       intel_panel_set_pwm_level(old_conn_state, val);
 
        tmp = intel_de_read(dev_priv,
                            BXT_BLC_PWM_CTL(panel->backlight.controller));
                intel_de_write(dev_priv, SOUTH_CHICKEN1, schicken);
        }
 
-       pch_ctl2 = panel->backlight.max << 16;
+       pch_ctl2 = panel->backlight.pwm_level_max << 16;
        intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, pch_ctl2);
 
        pch_ctl1 = 0;
                       pch_ctl1 | BLM_PCH_PWM_ENABLE);
 
        /* This won't stick until the above enable. */
-       intel_panel_actually_set_backlight(conn_state, level);
+       intel_panel_set_pwm_level(conn_state, level);
 }
 
 static void pch_enable_backlight(const struct intel_crtc_state *crtc_state,
        intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2 | BLM_PWM_ENABLE);
 
        /* This won't stick until the above enable. */
-       intel_panel_actually_set_backlight(conn_state, level);
+       intel_panel_set_pwm_level(conn_state, level);
 
-       pch_ctl2 = panel->backlight.max << 16;
+       pch_ctl2 = panel->backlight.pwm_level_max << 16;
        intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, pch_ctl2);
 
        pch_ctl1 = 0;
                intel_de_write(dev_priv, BLC_PWM_CTL, 0);
        }
 
-       freq = panel->backlight.max;
+       freq = panel->backlight.pwm_level_max;
        if (panel->backlight.combination_mode)
                freq /= 0xff;
 
        intel_de_posting_read(dev_priv, BLC_PWM_CTL);
 
        /* XXX: combine this into above write? */
-       intel_panel_actually_set_backlight(conn_state, level);
+       intel_panel_set_pwm_level(conn_state, level);
 
        /*
         * Needed to enable backlight on some 855gm models. BLC_HIST_CTL is
                intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2);
        }
 
-       freq = panel->backlight.max;
+       freq = panel->backlight.pwm_level_max;
        if (panel->backlight.combination_mode)
                freq /= 0xff;
 
        intel_de_posting_read(dev_priv, BLC_PWM_CTL2);
        intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2 | BLM_PWM_ENABLE);
 
-       intel_panel_actually_set_backlight(conn_state, level);
+       intel_panel_set_pwm_level(conn_state, level);
 }
 
 static void vlv_enable_backlight(const struct intel_crtc_state *crtc_state,
                intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe), ctl2);
        }
 
-       ctl = panel->backlight.max << 16;
+       ctl = panel->backlight.pwm_level_max << 16;
        intel_de_write(dev_priv, VLV_BLC_PWM_CTL(pipe), ctl);
 
        /* XXX: combine this into above write? */
-       intel_panel_actually_set_backlight(conn_state, level);
+       intel_panel_set_pwm_level(conn_state, level);
 
        ctl2 = 0;
        if (panel->backlight.active_low_pwm)
 
        intel_de_write(dev_priv,
                       BXT_BLC_PWM_FREQ(panel->backlight.controller),
-                      panel->backlight.max);
+                      panel->backlight.pwm_level_max);
 
-       intel_panel_actually_set_backlight(conn_state, level);
+       intel_panel_set_pwm_level(conn_state, level);
 
        pwm_ctl = 0;
        if (panel->backlight.active_low_pwm)
 
        intel_de_write(dev_priv,
                       BXT_BLC_PWM_FREQ(panel->backlight.controller),
-                      panel->backlight.max);
+                      panel->backlight.pwm_level_max);
 
-       intel_panel_actually_set_backlight(conn_state, level);
+       intel_panel_set_pwm_level(conn_state, level);
 
        pwm_ctl = 0;
        if (panel->backlight.active_low_pwm)
        struct intel_connector *connector = to_intel_connector(conn_state->connector);
        struct intel_panel *panel = &connector->panel;
 
-       level = intel_panel_compute_brightness(connector, level);
        pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100);
        panel->backlight.pwm_state.enabled = true;
        pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state);
 
        mutex_lock(&dev_priv->backlight_lock);
 
-       if (panel->backlight.enabled) {
+       if (panel->backlight.enabled)
                val = panel->backlight.funcs->get(connector, intel_connector_get_pipe(connector));
-               val = intel_panel_compute_brightness(connector, val);
-       }
 
        mutex_unlock(&dev_priv->backlight_lock);
 
        u16 pwm_freq_hz = get_vbt_pwm_freq(dev_priv);
        u32 pwm;
 
-       if (!panel->backlight.funcs->hz_to_pwm) {
+       if (!panel->backlight.pwm_funcs->hz_to_pwm) {
                drm_dbg_kms(&dev_priv->drm,
                            "backlight frequency conversion not supported\n");
                return 0;
        }
 
-       pwm = panel->backlight.funcs->hz_to_pwm(connector, pwm_freq_hz);
+       pwm = panel->backlight.pwm_funcs->hz_to_pwm(connector, pwm_freq_hz);
        if (!pwm) {
                drm_dbg_kms(&dev_priv->drm,
                            "backlight frequency conversion failed\n");
        struct intel_panel *panel = &connector->panel;
        int min;
 
-       drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
+       drm_WARN_ON(&dev_priv->drm, panel->backlight.pwm_level_max == 0);
 
        /*
         * XXX: If the vbt value is 255, it makes min equal to max, which leads
        }
 
        /* vbt value is a coefficient in range [0..255] */
-       return scale(min, 0, 255, 0, panel->backlight.max);
+       return scale(min, 0, 255, 0, panel->backlight.pwm_level_max);
 }
 
 static int lpt_setup_backlight(struct intel_connector *connector, enum pipe unused)
        panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY;
 
        pch_ctl2 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL2);
-       panel->backlight.max = pch_ctl2 >> 16;
+       panel->backlight.pwm_level_max = pch_ctl2 >> 16;
 
        cpu_ctl2 = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
 
-       if (!panel->backlight.max)
-               panel->backlight.max = get_backlight_max_vbt(connector);
+       if (!panel->backlight.pwm_level_max)
+               panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
 
-       if (!panel->backlight.max)
+       if (!panel->backlight.pwm_level_max)
                return -ENODEV;
 
-       panel->backlight.min = get_backlight_min_vbt(connector);
+       panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
 
-       panel->backlight.enabled = pch_ctl1 & BLM_PCH_PWM_ENABLE;
+       panel->backlight.pwm_enabled = pch_ctl1 & BLM_PCH_PWM_ENABLE;
 
-       cpu_mode = panel->backlight.enabled && HAS_PCH_LPT(dev_priv) &&
+       cpu_mode = panel->backlight.pwm_enabled && HAS_PCH_LPT(dev_priv) &&
                   !(pch_ctl1 & BLM_PCH_OVERRIDE_ENABLE) &&
                   (cpu_ctl2 & BLM_PWM_ENABLE);
-       if (cpu_mode)
-               val = pch_get_backlight(connector, unused);
-       else
-               val = lpt_get_backlight(connector, unused);
 
        if (cpu_mode) {
+               val = pch_get_backlight(connector, unused);
+
                drm_dbg_kms(&dev_priv->drm,
                            "CPU backlight register was enabled, switching to PCH override\n");
 
                               cpu_ctl2 & ~BLM_PWM_ENABLE);
        }
 
-       val = intel_panel_compute_brightness(connector, val);
-       panel->backlight.level = clamp(val, panel->backlight.min,
-                                      panel->backlight.max);
-
        return 0;
 }
 
 {
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        struct intel_panel *panel = &connector->panel;
-       u32 cpu_ctl2, pch_ctl1, pch_ctl2, val;
+       u32 cpu_ctl2, pch_ctl1, pch_ctl2;
 
        pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
        panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY;
 
        pch_ctl2 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL2);
-       panel->backlight.max = pch_ctl2 >> 16;
+       panel->backlight.pwm_level_max = pch_ctl2 >> 16;
 
-       if (!panel->backlight.max)
-               panel->backlight.max = get_backlight_max_vbt(connector);
+       if (!panel->backlight.pwm_level_max)
+               panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
 
-       if (!panel->backlight.max)
+       if (!panel->backlight.pwm_level_max)
                return -ENODEV;
 
-       panel->backlight.min = get_backlight_min_vbt(connector);
-
-       val = pch_get_backlight(connector, unused);
-       val = intel_panel_compute_brightness(connector, val);
-       panel->backlight.level = clamp(val, panel->backlight.min,
-                                      panel->backlight.max);
+       panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
 
        cpu_ctl2 = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
-       panel->backlight.enabled = (cpu_ctl2 & BLM_PWM_ENABLE) &&
+       panel->backlight.pwm_enabled = (cpu_ctl2 & BLM_PWM_ENABLE) &&
                (pch_ctl1 & BLM_PCH_PWM_ENABLE);
 
        return 0;
        if (IS_PINEVIEW(dev_priv))
                panel->backlight.active_low_pwm = ctl & BLM_POLARITY_PNV;
 
-       panel->backlight.max = ctl >> 17;
+       panel->backlight.pwm_level_max = ctl >> 17;
 
-       if (!panel->backlight.max) {
-               panel->backlight.max = get_backlight_max_vbt(connector);
-               panel->backlight.max >>= 1;
+       if (!panel->backlight.pwm_level_max) {
+               panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
+               panel->backlight.pwm_level_max >>= 1;
        }
 
-       if (!panel->backlight.max)
+       if (!panel->backlight.pwm_level_max)
                return -ENODEV;
 
        if (panel->backlight.combination_mode)
-               panel->backlight.max *= 0xff;
+               panel->backlight.pwm_level_max *= 0xff;
 
-       panel->backlight.min = get_backlight_min_vbt(connector);
+       panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
 
        val = i9xx_get_backlight(connector, unused);
-       val = intel_panel_compute_brightness(connector, val);
-       panel->backlight.level = clamp(val, panel->backlight.min,
-                                      panel->backlight.max);
+       val = intel_panel_invert_pwm_level(connector, val);
+       val = clamp(val, panel->backlight.pwm_level_min, panel->backlight.pwm_level_max);
 
-       panel->backlight.enabled = val != 0;
+       panel->backlight.pwm_enabled = val != 0;
 
        return 0;
 }
 {
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        struct intel_panel *panel = &connector->panel;
-       u32 ctl, ctl2, val;
+       u32 ctl, ctl2;
 
        ctl2 = intel_de_read(dev_priv, BLC_PWM_CTL2);
        panel->backlight.combination_mode = ctl2 & BLM_COMBINATION_MODE;
        panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965;
 
        ctl = intel_de_read(dev_priv, BLC_PWM_CTL);
-       panel->backlight.max = ctl >> 16;
+       panel->backlight.pwm_level_max = ctl >> 16;
 
-       if (!panel->backlight.max)
-               panel->backlight.max = get_backlight_max_vbt(connector);
+       if (!panel->backlight.pwm_level_max)
+               panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
 
-       if (!panel->backlight.max)
+       if (!panel->backlight.pwm_level_max)
                return -ENODEV;
 
        if (panel->backlight.combination_mode)
-               panel->backlight.max *= 0xff;
-
-       panel->backlight.min = get_backlight_min_vbt(connector);
+               panel->backlight.pwm_level_max *= 0xff;
 
-       val = i9xx_get_backlight(connector, unused);
-       val = intel_panel_compute_brightness(connector, val);
-       panel->backlight.level = clamp(val, panel->backlight.min,
-                                      panel->backlight.max);
+       panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
 
-       panel->backlight.enabled = ctl2 & BLM_PWM_ENABLE;
+       panel->backlight.pwm_enabled = ctl2 & BLM_PWM_ENABLE;
 
        return 0;
 }
 {
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        struct intel_panel *panel = &connector->panel;
-       u32 ctl, ctl2, val;
+       u32 ctl, ctl2;
 
        if (drm_WARN_ON(&dev_priv->drm, pipe != PIPE_A && pipe != PIPE_B))
                return -ENODEV;
        panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965;
 
        ctl = intel_de_read(dev_priv, VLV_BLC_PWM_CTL(pipe));
-       panel->backlight.max = ctl >> 16;
+       panel->backlight.pwm_level_max = ctl >> 16;
 
-       if (!panel->backlight.max)
-               panel->backlight.max = get_backlight_max_vbt(connector);
+       if (!panel->backlight.pwm_level_max)
+               panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
 
-       if (!panel->backlight.max)
+       if (!panel->backlight.pwm_level_max)
                return -ENODEV;
 
-       panel->backlight.min = get_backlight_min_vbt(connector);
+       panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
 
-       val = vlv_get_backlight(connector, pipe);
-       val = intel_panel_compute_brightness(connector, val);
-       panel->backlight.level = clamp(val, panel->backlight.min,
-                                      panel->backlight.max);
-
-       panel->backlight.enabled = ctl2 & BLM_PWM_ENABLE;
+       panel->backlight.pwm_enabled = ctl2 & BLM_PWM_ENABLE;
 
        return 0;
 }
        }
 
        panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY;
-       panel->backlight.max =
-               intel_de_read(dev_priv,
-                             BXT_BLC_PWM_FREQ(panel->backlight.controller));
+       panel->backlight.pwm_level_max =
+               intel_de_read(dev_priv, BXT_BLC_PWM_FREQ(panel->backlight.controller));
 
-       if (!panel->backlight.max)
-               panel->backlight.max = get_backlight_max_vbt(connector);
+       if (!panel->backlight.pwm_level_max)
+               panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
 
-       if (!panel->backlight.max)
+       if (!panel->backlight.pwm_level_max)
                return -ENODEV;
 
-       panel->backlight.min = get_backlight_min_vbt(connector);
-
-       val = bxt_get_backlight(connector, unused);
-       val = intel_panel_compute_brightness(connector, val);
-       panel->backlight.level = clamp(val, panel->backlight.min,
-                                      panel->backlight.max);
+       panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
 
-       panel->backlight.enabled = pwm_ctl & BXT_BLC_PWM_ENABLE;
+       panel->backlight.pwm_enabled = pwm_ctl & BXT_BLC_PWM_ENABLE;
 
        return 0;
 }
 {
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        struct intel_panel *panel = &connector->panel;
-       u32 pwm_ctl, val;
+       u32 pwm_ctl;
 
        /*
         * CNP has the BXT implementation of backlight, but with only one
                                BXT_BLC_PWM_CTL(panel->backlight.controller));
 
        panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY;
-       panel->backlight.max =
-               intel_de_read(dev_priv,
-                             BXT_BLC_PWM_FREQ(panel->backlight.controller));
+       panel->backlight.pwm_level_max =
+               intel_de_read(dev_priv, BXT_BLC_PWM_FREQ(panel->backlight.controller));
 
-       if (!panel->backlight.max)
-               panel->backlight.max = get_backlight_max_vbt(connector);
+       if (!panel->backlight.pwm_level_max)
+               panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
 
-       if (!panel->backlight.max)
+       if (!panel->backlight.pwm_level_max)
                return -ENODEV;
 
-       panel->backlight.min = get_backlight_min_vbt(connector);
+       panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
 
-       val = bxt_get_backlight(connector, unused);
-       val = intel_panel_compute_brightness(connector, val);
-       panel->backlight.level = clamp(val, panel->backlight.min,
-                                      panel->backlight.max);
-
-       panel->backlight.enabled = pwm_ctl & BXT_BLC_PWM_ENABLE;
+       panel->backlight.pwm_enabled = pwm_ctl & BXT_BLC_PWM_ENABLE;
 
        return 0;
 }
                return -ENODEV;
        }
 
-       panel->backlight.max = 100; /* 100% */
-       panel->backlight.min = get_backlight_min_vbt(connector);
+       panel->backlight.pwm_level_max = 100; /* 100% */
+       panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
 
        if (pwm_is_enabled(panel->backlight.pwm)) {
                /* PWM is already enabled, use existing settings */
 
                level = pwm_get_relative_duty_cycle(&panel->backlight.pwm_state,
                                                    100);
-               level = intel_panel_compute_brightness(connector, level);
-               panel->backlight.level = clamp(level, panel->backlight.min,
-                                              panel->backlight.max);
-               panel->backlight.enabled = true;
+               level = intel_panel_invert_pwm_level(connector, level);
+               panel->backlight.pwm_enabled = true;
 
                drm_dbg_kms(&dev_priv->drm, "PWM already enabled at freq %ld, VBT freq %d, level %d\n",
                            NSEC_PER_SEC / (unsigned long)panel->backlight.pwm_state.period,
        return 0;
 }
 
+static void intel_pwm_set_backlight(const struct drm_connector_state *conn_state, u32 level)
+{
+       struct intel_connector *connector = to_intel_connector(conn_state->connector);
+       struct intel_panel *panel = &connector->panel;
+
+       panel->backlight.pwm_funcs->set(conn_state,
+                                      intel_panel_invert_pwm_level(connector, level));
+}
+
+static u32 intel_pwm_get_backlight(struct intel_connector *connector, enum pipe pipe)
+{
+       struct intel_panel *panel = &connector->panel;
+
+       return intel_panel_invert_pwm_level(connector,
+                                           panel->backlight.pwm_funcs->get(connector, pipe));
+}
+
+static void intel_pwm_enable_backlight(const struct intel_crtc_state *crtc_state,
+                                      const struct drm_connector_state *conn_state, u32 level)
+{
+       struct intel_connector *connector = to_intel_connector(conn_state->connector);
+       struct intel_panel *panel = &connector->panel;
+
+       panel->backlight.pwm_funcs->enable(crtc_state, conn_state,
+                                          intel_panel_invert_pwm_level(connector, level));
+}
+
+static void intel_pwm_disable_backlight(const struct drm_connector_state *conn_state, u32 level)
+{
+       struct intel_connector *connector = to_intel_connector(conn_state->connector);
+       struct intel_panel *panel = &connector->panel;
+
+       panel->backlight.pwm_funcs->disable(conn_state,
+                                           intel_panel_invert_pwm_level(connector, level));
+}
+
+static int intel_pwm_setup_backlight(struct intel_connector *connector, enum pipe pipe)
+{
+       struct intel_panel *panel = &connector->panel;
+       int ret = panel->backlight.pwm_funcs->setup(connector, pipe);
+
+       if (ret < 0)
+               return ret;
+
+       panel->backlight.min = panel->backlight.pwm_level_min;
+       panel->backlight.max = panel->backlight.pwm_level_max;
+       panel->backlight.level = intel_pwm_get_backlight(connector, pipe);
+       panel->backlight.enabled = panel->backlight.pwm_enabled;
+
+       return 0;
+}
+
 void intel_panel_update_backlight(struct intel_atomic_state *state,
                                  struct intel_encoder *encoder,
                                  const struct intel_crtc_state *crtc_state,
        panel->backlight.present = false;
 }
 
-static const struct intel_panel_bl_funcs bxt_funcs = {
+static const struct intel_panel_bl_funcs bxt_pwm_funcs = {
        .setup = bxt_setup_backlight,
        .enable = bxt_enable_backlight,
        .disable = bxt_disable_backlight,
        .hz_to_pwm = bxt_hz_to_pwm,
 };
 
-static const struct intel_panel_bl_funcs cnp_funcs = {
+static const struct intel_panel_bl_funcs cnp_pwm_funcs = {
        .setup = cnp_setup_backlight,
        .enable = cnp_enable_backlight,
        .disable = cnp_disable_backlight,
        .hz_to_pwm = cnp_hz_to_pwm,
 };
 
-static const struct intel_panel_bl_funcs lpt_funcs = {
+static const struct intel_panel_bl_funcs lpt_pwm_funcs = {
        .setup = lpt_setup_backlight,
        .enable = lpt_enable_backlight,
        .disable = lpt_disable_backlight,
        .hz_to_pwm = lpt_hz_to_pwm,
 };
 
-static const struct intel_panel_bl_funcs spt_funcs = {
+static const struct intel_panel_bl_funcs spt_pwm_funcs = {
        .setup = lpt_setup_backlight,
        .enable = lpt_enable_backlight,
        .disable = lpt_disable_backlight,
        .hz_to_pwm = spt_hz_to_pwm,
 };
 
-static const struct intel_panel_bl_funcs pch_funcs = {
+static const struct intel_panel_bl_funcs pch_pwm_funcs = {
        .setup = pch_setup_backlight,
        .enable = pch_enable_backlight,
        .disable = pch_disable_backlight,
        .get = ext_pwm_get_backlight,
 };
 
-static const struct intel_panel_bl_funcs vlv_funcs = {
+static const struct intel_panel_bl_funcs vlv_pwm_funcs = {
        .setup = vlv_setup_backlight,
        .enable = vlv_enable_backlight,
        .disable = vlv_disable_backlight,
        .hz_to_pwm = vlv_hz_to_pwm,
 };
 
-static const struct intel_panel_bl_funcs i965_funcs = {
+static const struct intel_panel_bl_funcs i965_pwm_funcs = {
        .setup = i965_setup_backlight,
        .enable = i965_enable_backlight,
        .disable = i965_disable_backlight,
        .hz_to_pwm = i965_hz_to_pwm,
 };
 
-static const struct intel_panel_bl_funcs i9xx_funcs = {
+static const struct intel_panel_bl_funcs i9xx_pwm_funcs = {
        .setup = i9xx_setup_backlight,
        .enable = i9xx_enable_backlight,
        .disable = i9xx_disable_backlight,
        .hz_to_pwm = i9xx_hz_to_pwm,
 };
 
+static const struct intel_panel_bl_funcs pwm_bl_funcs = {
+       .setup = intel_pwm_setup_backlight,
+       .enable = intel_pwm_enable_backlight,
+       .disable = intel_pwm_disable_backlight,
+       .set = intel_pwm_set_backlight,
+       .get = intel_pwm_get_backlight,
+};
+
 /* Set up chip specific backlight functions */
 static void
 intel_panel_init_backlight_funcs(struct intel_panel *panel)
                return;
 
        if (IS_GEN9_LP(dev_priv)) {
-               panel->backlight.funcs = &bxt_funcs;
+               panel->backlight.pwm_funcs = &bxt_pwm_funcs;
        } else if (INTEL_PCH_TYPE(dev_priv) >= PCH_CNP) {
-               panel->backlight.funcs = &cnp_funcs;
+               panel->backlight.pwm_funcs = &cnp_pwm_funcs;
        } else if (INTEL_PCH_TYPE(dev_priv) >= PCH_LPT) {
                if (HAS_PCH_LPT(dev_priv))
-                       panel->backlight.funcs = &lpt_funcs;
+                       panel->backlight.pwm_funcs = &lpt_pwm_funcs;
                else
-                       panel->backlight.funcs = &spt_funcs;
+                       panel->backlight.pwm_funcs = &spt_pwm_funcs;
        } else if (HAS_PCH_SPLIT(dev_priv)) {
-               panel->backlight.funcs = &pch_funcs;
+               panel->backlight.pwm_funcs = &pch_pwm_funcs;
        } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI) {
-                       panel->backlight.funcs = &ext_pwm_funcs;
+                       panel->backlight.pwm_funcs = &ext_pwm_funcs;
                } else {
-                       panel->backlight.funcs = &vlv_funcs;
+                       panel->backlight.pwm_funcs = &vlv_pwm_funcs;
                }
        } else if (IS_GEN(dev_priv, 4)) {
-               panel->backlight.funcs = &i965_funcs;
+               panel->backlight.pwm_funcs = &i965_pwm_funcs;
        } else {
-               panel->backlight.funcs = &i9xx_funcs;
+               panel->backlight.pwm_funcs = &i9xx_pwm_funcs;
        }
+
+       /* We're using a standard PWM backlight interface */
+       panel->backlight.funcs = &pwm_bl_funcs;
 }
 
 enum drm_connector_status