0001
0002
0003
0004
0005
0006 #include <linux/backlight.h>
0007 #include <linux/kernel.h>
0008 #include <linux/pwm.h>
0009 #include <linux/string_helpers.h>
0010
0011 #include "intel_backlight.h"
0012 #include "intel_connector.h"
0013 #include "intel_de.h"
0014 #include "intel_display_types.h"
0015 #include "intel_dp_aux_backlight.h"
0016 #include "intel_dsi_dcs_backlight.h"
0017 #include "intel_panel.h"
0018 #include "intel_pci_config.h"
0019 #include "intel_pps.h"
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 static u32 scale(u32 source_val,
0033 u32 source_min, u32 source_max,
0034 u32 target_min, u32 target_max)
0035 {
0036 u64 target_val;
0037
0038 WARN_ON(source_min > source_max);
0039 WARN_ON(target_min > target_max);
0040
0041
0042 source_val = clamp(source_val, source_min, source_max);
0043
0044
0045 target_val = mul_u32_u32(source_val - source_min,
0046 target_max - target_min);
0047 target_val = DIV_ROUND_CLOSEST_ULL(target_val, source_max - source_min);
0048 target_val += target_min;
0049
0050 return target_val;
0051 }
0052
0053
0054
0055
0056
0057 static u32 clamp_user_to_hw(struct intel_connector *connector,
0058 u32 user_level, u32 user_max)
0059 {
0060 struct intel_panel *panel = &connector->panel;
0061 u32 hw_level;
0062
0063 hw_level = scale(user_level, 0, user_max, 0, panel->backlight.max);
0064 hw_level = clamp(hw_level, panel->backlight.min, panel->backlight.max);
0065
0066 return hw_level;
0067 }
0068
0069
0070 static u32 scale_hw_to_user(struct intel_connector *connector,
0071 u32 hw_level, u32 user_max)
0072 {
0073 struct intel_panel *panel = &connector->panel;
0074
0075 return scale(hw_level, panel->backlight.min, panel->backlight.max,
0076 0, user_max);
0077 }
0078
0079 u32 intel_backlight_invert_pwm_level(struct intel_connector *connector, u32 val)
0080 {
0081 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0082 struct intel_panel *panel = &connector->panel;
0083
0084 drm_WARN_ON(&dev_priv->drm, panel->backlight.pwm_level_max == 0);
0085
0086 if (dev_priv->params.invert_brightness < 0)
0087 return val;
0088
0089 if (dev_priv->params.invert_brightness > 0 ||
0090 dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS) {
0091 return panel->backlight.pwm_level_max - val + panel->backlight.pwm_level_min;
0092 }
0093
0094 return val;
0095 }
0096
0097 void intel_backlight_set_pwm_level(const struct drm_connector_state *conn_state, u32 val)
0098 {
0099 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0100 struct drm_i915_private *i915 = to_i915(connector->base.dev);
0101 struct intel_panel *panel = &connector->panel;
0102
0103 drm_dbg_kms(&i915->drm, "set backlight PWM = %d\n", val);
0104 panel->backlight.pwm_funcs->set(conn_state, val);
0105 }
0106
0107 u32 intel_backlight_level_to_pwm(struct intel_connector *connector, u32 val)
0108 {
0109 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0110 struct intel_panel *panel = &connector->panel;
0111
0112 drm_WARN_ON_ONCE(&dev_priv->drm,
0113 panel->backlight.max == 0 || panel->backlight.pwm_level_max == 0);
0114
0115 val = scale(val, panel->backlight.min, panel->backlight.max,
0116 panel->backlight.pwm_level_min, panel->backlight.pwm_level_max);
0117
0118 return intel_backlight_invert_pwm_level(connector, val);
0119 }
0120
0121 u32 intel_backlight_level_from_pwm(struct intel_connector *connector, u32 val)
0122 {
0123 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0124 struct intel_panel *panel = &connector->panel;
0125
0126 drm_WARN_ON_ONCE(&dev_priv->drm,
0127 panel->backlight.max == 0 || panel->backlight.pwm_level_max == 0);
0128
0129 if (dev_priv->params.invert_brightness > 0 ||
0130 (dev_priv->params.invert_brightness == 0 && dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS))
0131 val = panel->backlight.pwm_level_max - (val - panel->backlight.pwm_level_min);
0132
0133 return scale(val, panel->backlight.pwm_level_min, panel->backlight.pwm_level_max,
0134 panel->backlight.min, panel->backlight.max);
0135 }
0136
0137 static u32 lpt_get_backlight(struct intel_connector *connector, enum pipe unused)
0138 {
0139 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0140
0141 return intel_de_read(dev_priv, BLC_PWM_PCH_CTL2) & BACKLIGHT_DUTY_CYCLE_MASK;
0142 }
0143
0144 static u32 pch_get_backlight(struct intel_connector *connector, enum pipe unused)
0145 {
0146 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0147
0148 return intel_de_read(dev_priv, BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
0149 }
0150
0151 static u32 i9xx_get_backlight(struct intel_connector *connector, enum pipe unused)
0152 {
0153 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0154 struct intel_panel *panel = &connector->panel;
0155 u32 val;
0156
0157 val = intel_de_read(dev_priv, BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
0158 if (DISPLAY_VER(dev_priv) < 4)
0159 val >>= 1;
0160
0161 if (panel->backlight.combination_mode) {
0162 u8 lbpc;
0163
0164 pci_read_config_byte(to_pci_dev(dev_priv->drm.dev), LBPC, &lbpc);
0165 val *= lbpc;
0166 }
0167
0168 return val;
0169 }
0170
0171 static u32 vlv_get_backlight(struct intel_connector *connector, enum pipe pipe)
0172 {
0173 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0174
0175 if (drm_WARN_ON(&dev_priv->drm, pipe != PIPE_A && pipe != PIPE_B))
0176 return 0;
0177
0178 return intel_de_read(dev_priv, VLV_BLC_PWM_CTL(pipe)) & BACKLIGHT_DUTY_CYCLE_MASK;
0179 }
0180
0181 static u32 bxt_get_backlight(struct intel_connector *connector, enum pipe unused)
0182 {
0183 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0184 struct intel_panel *panel = &connector->panel;
0185
0186 return intel_de_read(dev_priv,
0187 BXT_BLC_PWM_DUTY(panel->backlight.controller));
0188 }
0189
0190 static u32 ext_pwm_get_backlight(struct intel_connector *connector, enum pipe unused)
0191 {
0192 struct intel_panel *panel = &connector->panel;
0193 struct pwm_state state;
0194
0195 pwm_get_state(panel->backlight.pwm, &state);
0196 return pwm_get_relative_duty_cycle(&state, 100);
0197 }
0198
0199 static void lpt_set_backlight(const struct drm_connector_state *conn_state, u32 level)
0200 {
0201 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0202 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0203
0204 u32 val = intel_de_read(dev_priv, BLC_PWM_PCH_CTL2) & ~BACKLIGHT_DUTY_CYCLE_MASK;
0205 intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, val | level);
0206 }
0207
0208 static void pch_set_backlight(const struct drm_connector_state *conn_state, u32 level)
0209 {
0210 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0211 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0212 u32 tmp;
0213
0214 tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL) & ~BACKLIGHT_DUTY_CYCLE_MASK;
0215 intel_de_write(dev_priv, BLC_PWM_CPU_CTL, tmp | level);
0216 }
0217
0218 static void i9xx_set_backlight(const struct drm_connector_state *conn_state, u32 level)
0219 {
0220 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0221 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0222 struct intel_panel *panel = &connector->panel;
0223 u32 tmp, mask;
0224
0225 drm_WARN_ON(&dev_priv->drm, panel->backlight.pwm_level_max == 0);
0226
0227 if (panel->backlight.combination_mode) {
0228 u8 lbpc;
0229
0230 lbpc = level * 0xfe / panel->backlight.pwm_level_max + 1;
0231 level /= lbpc;
0232 pci_write_config_byte(to_pci_dev(dev_priv->drm.dev), LBPC, lbpc);
0233 }
0234
0235 if (DISPLAY_VER(dev_priv) == 4) {
0236 mask = BACKLIGHT_DUTY_CYCLE_MASK;
0237 } else {
0238 level <<= 1;
0239 mask = BACKLIGHT_DUTY_CYCLE_MASK_PNV;
0240 }
0241
0242 tmp = intel_de_read(dev_priv, BLC_PWM_CTL) & ~mask;
0243 intel_de_write(dev_priv, BLC_PWM_CTL, tmp | level);
0244 }
0245
0246 static void vlv_set_backlight(const struct drm_connector_state *conn_state, u32 level)
0247 {
0248 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0249 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0250 enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe;
0251 u32 tmp;
0252
0253 tmp = intel_de_read(dev_priv, VLV_BLC_PWM_CTL(pipe)) & ~BACKLIGHT_DUTY_CYCLE_MASK;
0254 intel_de_write(dev_priv, VLV_BLC_PWM_CTL(pipe), tmp | level);
0255 }
0256
0257 static void bxt_set_backlight(const struct drm_connector_state *conn_state, u32 level)
0258 {
0259 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0260 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0261 struct intel_panel *panel = &connector->panel;
0262
0263 intel_de_write(dev_priv,
0264 BXT_BLC_PWM_DUTY(panel->backlight.controller), level);
0265 }
0266
0267 static void ext_pwm_set_backlight(const struct drm_connector_state *conn_state, u32 level)
0268 {
0269 struct intel_panel *panel = &to_intel_connector(conn_state->connector)->panel;
0270
0271 pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100);
0272 pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state);
0273 }
0274
0275 static void
0276 intel_panel_actually_set_backlight(const struct drm_connector_state *conn_state, u32 level)
0277 {
0278 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0279 struct drm_i915_private *i915 = to_i915(connector->base.dev);
0280 struct intel_panel *panel = &connector->panel;
0281
0282 drm_dbg_kms(&i915->drm, "set backlight level = %d\n", level);
0283
0284 panel->backlight.funcs->set(conn_state, level);
0285 }
0286
0287
0288
0289
0290 void intel_backlight_set_acpi(const struct drm_connector_state *conn_state,
0291 u32 user_level, u32 user_max)
0292 {
0293 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0294 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0295 struct intel_panel *panel = &connector->panel;
0296 u32 hw_level;
0297
0298
0299
0300
0301
0302
0303
0304 if (!panel->backlight.present || !conn_state->crtc)
0305 return;
0306
0307 mutex_lock(&dev_priv->backlight_lock);
0308
0309 drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
0310
0311 hw_level = clamp_user_to_hw(connector, user_level, user_max);
0312 panel->backlight.level = hw_level;
0313
0314 if (panel->backlight.device)
0315 panel->backlight.device->props.brightness =
0316 scale_hw_to_user(connector,
0317 panel->backlight.level,
0318 panel->backlight.device->props.max_brightness);
0319
0320 if (panel->backlight.enabled)
0321 intel_panel_actually_set_backlight(conn_state, hw_level);
0322
0323 mutex_unlock(&dev_priv->backlight_lock);
0324 }
0325
0326 static void lpt_disable_backlight(const struct drm_connector_state *old_conn_state, u32 level)
0327 {
0328 struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
0329 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0330 u32 tmp;
0331
0332 intel_backlight_set_pwm_level(old_conn_state, level);
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342 tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
0343 if (tmp & BLM_PWM_ENABLE) {
0344 drm_dbg_kms(&dev_priv->drm,
0345 "cpu backlight was enabled, disabling\n");
0346 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2,
0347 tmp & ~BLM_PWM_ENABLE);
0348 }
0349
0350 tmp = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
0351 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, tmp & ~BLM_PCH_PWM_ENABLE);
0352 }
0353
0354 static void pch_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
0355 {
0356 struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
0357 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0358 u32 tmp;
0359
0360 intel_backlight_set_pwm_level(old_conn_state, val);
0361
0362 tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
0363 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, tmp & ~BLM_PWM_ENABLE);
0364
0365 tmp = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
0366 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, tmp & ~BLM_PCH_PWM_ENABLE);
0367 }
0368
0369 static void i9xx_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
0370 {
0371 intel_backlight_set_pwm_level(old_conn_state, val);
0372 }
0373
0374 static void i965_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
0375 {
0376 struct drm_i915_private *dev_priv = to_i915(old_conn_state->connector->dev);
0377 u32 tmp;
0378
0379 intel_backlight_set_pwm_level(old_conn_state, val);
0380
0381 tmp = intel_de_read(dev_priv, BLC_PWM_CTL2);
0382 intel_de_write(dev_priv, BLC_PWM_CTL2, tmp & ~BLM_PWM_ENABLE);
0383 }
0384
0385 static void vlv_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
0386 {
0387 struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
0388 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0389 enum pipe pipe = to_intel_crtc(old_conn_state->crtc)->pipe;
0390 u32 tmp;
0391
0392 intel_backlight_set_pwm_level(old_conn_state, val);
0393
0394 tmp = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
0395 intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe),
0396 tmp & ~BLM_PWM_ENABLE);
0397 }
0398
0399 static void bxt_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
0400 {
0401 struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
0402 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0403 struct intel_panel *panel = &connector->panel;
0404 u32 tmp;
0405
0406 intel_backlight_set_pwm_level(old_conn_state, val);
0407
0408 tmp = intel_de_read(dev_priv,
0409 BXT_BLC_PWM_CTL(panel->backlight.controller));
0410 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
0411 tmp & ~BXT_BLC_PWM_ENABLE);
0412
0413 if (panel->backlight.controller == 1) {
0414 val = intel_de_read(dev_priv, UTIL_PIN_CTL);
0415 val &= ~UTIL_PIN_ENABLE;
0416 intel_de_write(dev_priv, UTIL_PIN_CTL, val);
0417 }
0418 }
0419
0420 static void cnp_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
0421 {
0422 struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
0423 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0424 struct intel_panel *panel = &connector->panel;
0425 u32 tmp;
0426
0427 intel_backlight_set_pwm_level(old_conn_state, val);
0428
0429 tmp = intel_de_read(dev_priv,
0430 BXT_BLC_PWM_CTL(panel->backlight.controller));
0431 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
0432 tmp & ~BXT_BLC_PWM_ENABLE);
0433 }
0434
0435 static void ext_pwm_disable_backlight(const struct drm_connector_state *old_conn_state, u32 level)
0436 {
0437 struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
0438 struct intel_panel *panel = &connector->panel;
0439
0440 intel_backlight_set_pwm_level(old_conn_state, level);
0441
0442 panel->backlight.pwm_state.enabled = false;
0443 pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state);
0444 }
0445
0446 void intel_backlight_disable(const struct drm_connector_state *old_conn_state)
0447 {
0448 struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
0449 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0450 struct intel_panel *panel = &connector->panel;
0451
0452 if (!panel->backlight.present)
0453 return;
0454
0455
0456
0457
0458
0459
0460
0461 if (dev_priv->drm.switch_power_state == DRM_SWITCH_POWER_CHANGING) {
0462 drm_dbg_kms(&dev_priv->drm,
0463 "Skipping backlight disable on vga switch\n");
0464 return;
0465 }
0466
0467 mutex_lock(&dev_priv->backlight_lock);
0468
0469 if (panel->backlight.device)
0470 panel->backlight.device->props.power = FB_BLANK_POWERDOWN;
0471 panel->backlight.enabled = false;
0472 panel->backlight.funcs->disable(old_conn_state, 0);
0473
0474 mutex_unlock(&dev_priv->backlight_lock);
0475 }
0476
0477 static void lpt_enable_backlight(const struct intel_crtc_state *crtc_state,
0478 const struct drm_connector_state *conn_state, u32 level)
0479 {
0480 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0481 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0482 struct intel_panel *panel = &connector->panel;
0483 u32 pch_ctl1, pch_ctl2, schicken;
0484
0485 pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
0486 if (pch_ctl1 & BLM_PCH_PWM_ENABLE) {
0487 drm_dbg_kms(&dev_priv->drm, "pch backlight already enabled\n");
0488 pch_ctl1 &= ~BLM_PCH_PWM_ENABLE;
0489 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
0490 }
0491
0492 if (HAS_PCH_LPT(dev_priv)) {
0493 schicken = intel_de_read(dev_priv, SOUTH_CHICKEN2);
0494 if (panel->backlight.alternate_pwm_increment)
0495 schicken |= LPT_PWM_GRANULARITY;
0496 else
0497 schicken &= ~LPT_PWM_GRANULARITY;
0498 intel_de_write(dev_priv, SOUTH_CHICKEN2, schicken);
0499 } else {
0500 schicken = intel_de_read(dev_priv, SOUTH_CHICKEN1);
0501 if (panel->backlight.alternate_pwm_increment)
0502 schicken |= SPT_PWM_GRANULARITY;
0503 else
0504 schicken &= ~SPT_PWM_GRANULARITY;
0505 intel_de_write(dev_priv, SOUTH_CHICKEN1, schicken);
0506 }
0507
0508 pch_ctl2 = panel->backlight.pwm_level_max << 16;
0509 intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, pch_ctl2);
0510
0511 pch_ctl1 = 0;
0512 if (panel->backlight.active_low_pwm)
0513 pch_ctl1 |= BLM_PCH_POLARITY;
0514
0515
0516 if (HAS_PCH_LPT(dev_priv))
0517 pch_ctl1 |= BLM_PCH_OVERRIDE_ENABLE;
0518
0519 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
0520 intel_de_posting_read(dev_priv, BLC_PWM_PCH_CTL1);
0521 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
0522 pch_ctl1 | BLM_PCH_PWM_ENABLE);
0523
0524
0525 intel_backlight_set_pwm_level(conn_state, level);
0526 }
0527
0528 static void pch_enable_backlight(const struct intel_crtc_state *crtc_state,
0529 const struct drm_connector_state *conn_state, u32 level)
0530 {
0531 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0532 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0533 struct intel_panel *panel = &connector->panel;
0534 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
0535 u32 cpu_ctl2, pch_ctl1, pch_ctl2;
0536
0537 cpu_ctl2 = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
0538 if (cpu_ctl2 & BLM_PWM_ENABLE) {
0539 drm_dbg_kms(&dev_priv->drm, "cpu backlight already enabled\n");
0540 cpu_ctl2 &= ~BLM_PWM_ENABLE;
0541 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2);
0542 }
0543
0544 pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
0545 if (pch_ctl1 & BLM_PCH_PWM_ENABLE) {
0546 drm_dbg_kms(&dev_priv->drm, "pch backlight already enabled\n");
0547 pch_ctl1 &= ~BLM_PCH_PWM_ENABLE;
0548 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
0549 }
0550
0551 if (cpu_transcoder == TRANSCODER_EDP)
0552 cpu_ctl2 = BLM_TRANSCODER_EDP;
0553 else
0554 cpu_ctl2 = BLM_PIPE(cpu_transcoder);
0555 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2);
0556 intel_de_posting_read(dev_priv, BLC_PWM_CPU_CTL2);
0557 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2 | BLM_PWM_ENABLE);
0558
0559
0560 intel_backlight_set_pwm_level(conn_state, level);
0561
0562 pch_ctl2 = panel->backlight.pwm_level_max << 16;
0563 intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, pch_ctl2);
0564
0565 pch_ctl1 = 0;
0566 if (panel->backlight.active_low_pwm)
0567 pch_ctl1 |= BLM_PCH_POLARITY;
0568
0569 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
0570 intel_de_posting_read(dev_priv, BLC_PWM_PCH_CTL1);
0571 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
0572 pch_ctl1 | BLM_PCH_PWM_ENABLE);
0573 }
0574
0575 static void i9xx_enable_backlight(const struct intel_crtc_state *crtc_state,
0576 const struct drm_connector_state *conn_state, u32 level)
0577 {
0578 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0579 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0580 struct intel_panel *panel = &connector->panel;
0581 u32 ctl, freq;
0582
0583 ctl = intel_de_read(dev_priv, BLC_PWM_CTL);
0584 if (ctl & BACKLIGHT_DUTY_CYCLE_MASK_PNV) {
0585 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
0586 intel_de_write(dev_priv, BLC_PWM_CTL, 0);
0587 }
0588
0589 freq = panel->backlight.pwm_level_max;
0590 if (panel->backlight.combination_mode)
0591 freq /= 0xff;
0592
0593 ctl = freq << 17;
0594 if (panel->backlight.combination_mode)
0595 ctl |= BLM_LEGACY_MODE;
0596 if (IS_PINEVIEW(dev_priv) && panel->backlight.active_low_pwm)
0597 ctl |= BLM_POLARITY_PNV;
0598
0599 intel_de_write(dev_priv, BLC_PWM_CTL, ctl);
0600 intel_de_posting_read(dev_priv, BLC_PWM_CTL);
0601
0602
0603 intel_backlight_set_pwm_level(conn_state, level);
0604
0605
0606
0607
0608
0609
0610 if (DISPLAY_VER(dev_priv) == 2)
0611 intel_de_write(dev_priv, BLC_HIST_CTL, BLM_HISTOGRAM_ENABLE);
0612 }
0613
0614 static void i965_enable_backlight(const struct intel_crtc_state *crtc_state,
0615 const struct drm_connector_state *conn_state, u32 level)
0616 {
0617 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0618 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0619 struct intel_panel *panel = &connector->panel;
0620 enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe;
0621 u32 ctl, ctl2, freq;
0622
0623 ctl2 = intel_de_read(dev_priv, BLC_PWM_CTL2);
0624 if (ctl2 & BLM_PWM_ENABLE) {
0625 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
0626 ctl2 &= ~BLM_PWM_ENABLE;
0627 intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2);
0628 }
0629
0630 freq = panel->backlight.pwm_level_max;
0631 if (panel->backlight.combination_mode)
0632 freq /= 0xff;
0633
0634 ctl = freq << 16;
0635 intel_de_write(dev_priv, BLC_PWM_CTL, ctl);
0636
0637 ctl2 = BLM_PIPE(pipe);
0638 if (panel->backlight.combination_mode)
0639 ctl2 |= BLM_COMBINATION_MODE;
0640 if (panel->backlight.active_low_pwm)
0641 ctl2 |= BLM_POLARITY_I965;
0642 intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2);
0643 intel_de_posting_read(dev_priv, BLC_PWM_CTL2);
0644 intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2 | BLM_PWM_ENABLE);
0645
0646 intel_backlight_set_pwm_level(conn_state, level);
0647 }
0648
0649 static void vlv_enable_backlight(const struct intel_crtc_state *crtc_state,
0650 const struct drm_connector_state *conn_state, u32 level)
0651 {
0652 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0653 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0654 struct intel_panel *panel = &connector->panel;
0655 enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
0656 u32 ctl, ctl2;
0657
0658 ctl2 = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
0659 if (ctl2 & BLM_PWM_ENABLE) {
0660 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
0661 ctl2 &= ~BLM_PWM_ENABLE;
0662 intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe), ctl2);
0663 }
0664
0665 ctl = panel->backlight.pwm_level_max << 16;
0666 intel_de_write(dev_priv, VLV_BLC_PWM_CTL(pipe), ctl);
0667
0668
0669 intel_backlight_set_pwm_level(conn_state, level);
0670
0671 ctl2 = 0;
0672 if (panel->backlight.active_low_pwm)
0673 ctl2 |= BLM_POLARITY_I965;
0674 intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe), ctl2);
0675 intel_de_posting_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
0676 intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe),
0677 ctl2 | BLM_PWM_ENABLE);
0678 }
0679
0680 static void bxt_enable_backlight(const struct intel_crtc_state *crtc_state,
0681 const struct drm_connector_state *conn_state, u32 level)
0682 {
0683 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0684 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0685 struct intel_panel *panel = &connector->panel;
0686 enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
0687 u32 pwm_ctl, val;
0688
0689
0690 if (panel->backlight.controller == 1) {
0691 val = intel_de_read(dev_priv, UTIL_PIN_CTL);
0692 if (val & UTIL_PIN_ENABLE) {
0693 drm_dbg_kms(&dev_priv->drm,
0694 "util pin already enabled\n");
0695 val &= ~UTIL_PIN_ENABLE;
0696 intel_de_write(dev_priv, UTIL_PIN_CTL, val);
0697 }
0698
0699 val = 0;
0700 if (panel->backlight.util_pin_active_low)
0701 val |= UTIL_PIN_POLARITY;
0702 intel_de_write(dev_priv, UTIL_PIN_CTL,
0703 val | UTIL_PIN_PIPE(pipe) | UTIL_PIN_MODE_PWM | UTIL_PIN_ENABLE);
0704 }
0705
0706 pwm_ctl = intel_de_read(dev_priv,
0707 BXT_BLC_PWM_CTL(panel->backlight.controller));
0708 if (pwm_ctl & BXT_BLC_PWM_ENABLE) {
0709 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
0710 pwm_ctl &= ~BXT_BLC_PWM_ENABLE;
0711 intel_de_write(dev_priv,
0712 BXT_BLC_PWM_CTL(panel->backlight.controller),
0713 pwm_ctl);
0714 }
0715
0716 intel_de_write(dev_priv,
0717 BXT_BLC_PWM_FREQ(panel->backlight.controller),
0718 panel->backlight.pwm_level_max);
0719
0720 intel_backlight_set_pwm_level(conn_state, level);
0721
0722 pwm_ctl = 0;
0723 if (panel->backlight.active_low_pwm)
0724 pwm_ctl |= BXT_BLC_PWM_POLARITY;
0725
0726 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
0727 pwm_ctl);
0728 intel_de_posting_read(dev_priv,
0729 BXT_BLC_PWM_CTL(panel->backlight.controller));
0730 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
0731 pwm_ctl | BXT_BLC_PWM_ENABLE);
0732 }
0733
0734 static void cnp_enable_backlight(const struct intel_crtc_state *crtc_state,
0735 const struct drm_connector_state *conn_state, u32 level)
0736 {
0737 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0738 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0739 struct intel_panel *panel = &connector->panel;
0740 u32 pwm_ctl;
0741
0742 pwm_ctl = intel_de_read(dev_priv,
0743 BXT_BLC_PWM_CTL(panel->backlight.controller));
0744 if (pwm_ctl & BXT_BLC_PWM_ENABLE) {
0745 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
0746 pwm_ctl &= ~BXT_BLC_PWM_ENABLE;
0747 intel_de_write(dev_priv,
0748 BXT_BLC_PWM_CTL(panel->backlight.controller),
0749 pwm_ctl);
0750 }
0751
0752 intel_de_write(dev_priv,
0753 BXT_BLC_PWM_FREQ(panel->backlight.controller),
0754 panel->backlight.pwm_level_max);
0755
0756 intel_backlight_set_pwm_level(conn_state, level);
0757
0758 pwm_ctl = 0;
0759 if (panel->backlight.active_low_pwm)
0760 pwm_ctl |= BXT_BLC_PWM_POLARITY;
0761
0762 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
0763 pwm_ctl);
0764 intel_de_posting_read(dev_priv,
0765 BXT_BLC_PWM_CTL(panel->backlight.controller));
0766 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
0767 pwm_ctl | BXT_BLC_PWM_ENABLE);
0768 }
0769
0770 static void ext_pwm_enable_backlight(const struct intel_crtc_state *crtc_state,
0771 const struct drm_connector_state *conn_state, u32 level)
0772 {
0773 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0774 struct intel_panel *panel = &connector->panel;
0775
0776 pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100);
0777 panel->backlight.pwm_state.enabled = true;
0778 pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state);
0779 }
0780
0781 static void __intel_backlight_enable(const struct intel_crtc_state *crtc_state,
0782 const struct drm_connector_state *conn_state)
0783 {
0784 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0785 struct intel_panel *panel = &connector->panel;
0786
0787 WARN_ON(panel->backlight.max == 0);
0788
0789 if (panel->backlight.level <= panel->backlight.min) {
0790 panel->backlight.level = panel->backlight.max;
0791 if (panel->backlight.device)
0792 panel->backlight.device->props.brightness =
0793 scale_hw_to_user(connector,
0794 panel->backlight.level,
0795 panel->backlight.device->props.max_brightness);
0796 }
0797
0798 panel->backlight.funcs->enable(crtc_state, conn_state, panel->backlight.level);
0799 panel->backlight.enabled = true;
0800 if (panel->backlight.device)
0801 panel->backlight.device->props.power = FB_BLANK_UNBLANK;
0802 }
0803
0804 void intel_backlight_enable(const struct intel_crtc_state *crtc_state,
0805 const struct drm_connector_state *conn_state)
0806 {
0807 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0808 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0809 struct intel_panel *panel = &connector->panel;
0810 enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
0811
0812 if (!panel->backlight.present)
0813 return;
0814
0815 drm_dbg_kms(&dev_priv->drm, "pipe %c\n", pipe_name(pipe));
0816
0817 mutex_lock(&dev_priv->backlight_lock);
0818
0819 __intel_backlight_enable(crtc_state, conn_state);
0820
0821 mutex_unlock(&dev_priv->backlight_lock);
0822 }
0823
0824 #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
0825 static u32 intel_panel_get_backlight(struct intel_connector *connector)
0826 {
0827 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0828 struct intel_panel *panel = &connector->panel;
0829 u32 val = 0;
0830
0831 mutex_lock(&dev_priv->backlight_lock);
0832
0833 if (panel->backlight.enabled)
0834 val = panel->backlight.funcs->get(connector, intel_connector_get_pipe(connector));
0835
0836 mutex_unlock(&dev_priv->backlight_lock);
0837
0838 drm_dbg_kms(&dev_priv->drm, "get backlight PWM = %d\n", val);
0839 return val;
0840 }
0841
0842
0843 static u32 scale_user_to_hw(struct intel_connector *connector,
0844 u32 user_level, u32 user_max)
0845 {
0846 struct intel_panel *panel = &connector->panel;
0847
0848 return scale(user_level, 0, user_max,
0849 panel->backlight.min, panel->backlight.max);
0850 }
0851
0852
0853 static void intel_panel_set_backlight(const struct drm_connector_state *conn_state,
0854 u32 user_level, u32 user_max)
0855 {
0856 struct intel_connector *connector = to_intel_connector(conn_state->connector);
0857 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
0858 struct intel_panel *panel = &connector->panel;
0859 u32 hw_level;
0860
0861 if (!panel->backlight.present)
0862 return;
0863
0864 mutex_lock(&dev_priv->backlight_lock);
0865
0866 drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
0867
0868 hw_level = scale_user_to_hw(connector, user_level, user_max);
0869 panel->backlight.level = hw_level;
0870
0871 if (panel->backlight.enabled)
0872 intel_panel_actually_set_backlight(conn_state, hw_level);
0873
0874 mutex_unlock(&dev_priv->backlight_lock);
0875 }
0876
0877 static int intel_backlight_device_update_status(struct backlight_device *bd)
0878 {
0879 struct intel_connector *connector = bl_get_data(bd);
0880 struct intel_panel *panel = &connector->panel;
0881 struct drm_device *dev = connector->base.dev;
0882
0883 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
0884 DRM_DEBUG_KMS("updating intel_backlight, brightness=%d/%d\n",
0885 bd->props.brightness, bd->props.max_brightness);
0886 intel_panel_set_backlight(connector->base.state, bd->props.brightness,
0887 bd->props.max_brightness);
0888
0889
0890
0891
0892
0893
0894
0895 if (panel->backlight.enabled) {
0896 if (panel->backlight.power) {
0897 bool enable = bd->props.power == FB_BLANK_UNBLANK &&
0898 bd->props.brightness != 0;
0899 panel->backlight.power(connector, enable);
0900 }
0901 } else {
0902 bd->props.power = FB_BLANK_POWERDOWN;
0903 }
0904
0905 drm_modeset_unlock(&dev->mode_config.connection_mutex);
0906 return 0;
0907 }
0908
0909 static int intel_backlight_device_get_brightness(struct backlight_device *bd)
0910 {
0911 struct intel_connector *connector = bl_get_data(bd);
0912 struct drm_device *dev = connector->base.dev;
0913 struct drm_i915_private *dev_priv = to_i915(dev);
0914 intel_wakeref_t wakeref;
0915 int ret = 0;
0916
0917 with_intel_runtime_pm(&dev_priv->runtime_pm, wakeref) {
0918 u32 hw_level;
0919
0920 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
0921
0922 hw_level = intel_panel_get_backlight(connector);
0923 ret = scale_hw_to_user(connector,
0924 hw_level, bd->props.max_brightness);
0925
0926 drm_modeset_unlock(&dev->mode_config.connection_mutex);
0927 }
0928
0929 return ret;
0930 }
0931
0932 static const struct backlight_ops intel_backlight_device_ops = {
0933 .update_status = intel_backlight_device_update_status,
0934 .get_brightness = intel_backlight_device_get_brightness,
0935 };
0936
0937 int intel_backlight_device_register(struct intel_connector *connector)
0938 {
0939 struct drm_i915_private *i915 = to_i915(connector->base.dev);
0940 struct intel_panel *panel = &connector->panel;
0941 struct backlight_properties props;
0942 struct backlight_device *bd;
0943 const char *name;
0944 int ret = 0;
0945
0946 if (WARN_ON(panel->backlight.device))
0947 return -ENODEV;
0948
0949 if (!panel->backlight.present)
0950 return 0;
0951
0952 WARN_ON(panel->backlight.max == 0);
0953
0954 memset(&props, 0, sizeof(props));
0955 props.type = BACKLIGHT_RAW;
0956
0957
0958
0959
0960
0961 props.max_brightness = panel->backlight.max;
0962 props.brightness = scale_hw_to_user(connector,
0963 panel->backlight.level,
0964 props.max_brightness);
0965
0966 if (panel->backlight.enabled)
0967 props.power = FB_BLANK_UNBLANK;
0968 else
0969 props.power = FB_BLANK_POWERDOWN;
0970
0971 name = kstrdup("intel_backlight", GFP_KERNEL);
0972 if (!name)
0973 return -ENOMEM;
0974
0975 bd = backlight_device_get_by_name(name);
0976 if (bd) {
0977 put_device(&bd->dev);
0978
0979
0980
0981
0982
0983
0984
0985 kfree(name);
0986 name = kasprintf(GFP_KERNEL, "card%d-%s-backlight",
0987 i915->drm.primary->index, connector->base.name);
0988 if (!name)
0989 return -ENOMEM;
0990 }
0991 bd = backlight_device_register(name, connector->base.kdev, connector,
0992 &intel_backlight_device_ops, &props);
0993
0994 if (IS_ERR(bd)) {
0995 drm_err(&i915->drm,
0996 "[CONNECTOR:%d:%s] backlight device %s register failed: %ld\n",
0997 connector->base.base.id, connector->base.name, name, PTR_ERR(bd));
0998 ret = PTR_ERR(bd);
0999 goto out;
1000 }
1001
1002 panel->backlight.device = bd;
1003
1004 drm_dbg_kms(&i915->drm,
1005 "[CONNECTOR:%d:%s] backlight device %s registered\n",
1006 connector->base.base.id, connector->base.name, name);
1007
1008 out:
1009 kfree(name);
1010
1011 return ret;
1012 }
1013
1014 void intel_backlight_device_unregister(struct intel_connector *connector)
1015 {
1016 struct intel_panel *panel = &connector->panel;
1017
1018 if (panel->backlight.device) {
1019 backlight_device_unregister(panel->backlight.device);
1020 panel->backlight.device = NULL;
1021 }
1022 }
1023 #endif
1024
1025
1026
1027
1028
1029 static u32 cnp_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1030 {
1031 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1032
1033 return DIV_ROUND_CLOSEST(KHz(RUNTIME_INFO(dev_priv)->rawclk_freq),
1034 pwm_freq_hz);
1035 }
1036
1037
1038
1039
1040 static u32 bxt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1041 {
1042 return DIV_ROUND_CLOSEST(KHz(19200), pwm_freq_hz);
1043 }
1044
1045
1046
1047
1048
1049
1050 static u32 spt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1051 {
1052 struct intel_panel *panel = &connector->panel;
1053 u32 mul;
1054
1055 if (panel->backlight.alternate_pwm_increment)
1056 mul = 128;
1057 else
1058 mul = 16;
1059
1060 return DIV_ROUND_CLOSEST(MHz(24), pwm_freq_hz * mul);
1061 }
1062
1063
1064
1065
1066
1067
1068 static u32 lpt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1069 {
1070 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1071 struct intel_panel *panel = &connector->panel;
1072 u32 mul, clock;
1073
1074 if (panel->backlight.alternate_pwm_increment)
1075 mul = 16;
1076 else
1077 mul = 128;
1078
1079 if (HAS_PCH_LPT_H(dev_priv))
1080 clock = MHz(135);
1081 else
1082 clock = MHz(24);
1083
1084 return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * mul);
1085 }
1086
1087
1088
1089
1090
1091 static u32 pch_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1092 {
1093 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1094
1095 return DIV_ROUND_CLOSEST(KHz(RUNTIME_INFO(dev_priv)->rawclk_freq),
1096 pwm_freq_hz * 128);
1097 }
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107 static u32 i9xx_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1108 {
1109 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1110 int clock;
1111
1112 if (IS_PINEVIEW(dev_priv))
1113 clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
1114 else
1115 clock = KHz(dev_priv->cdclk.hw.cdclk);
1116
1117 return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 32);
1118 }
1119
1120
1121
1122
1123
1124
1125 static u32 i965_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1126 {
1127 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1128 int clock;
1129
1130 if (IS_G4X(dev_priv))
1131 clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
1132 else
1133 clock = KHz(dev_priv->cdclk.hw.cdclk);
1134
1135 return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 128);
1136 }
1137
1138
1139
1140
1141
1142
1143 static u32 vlv_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1144 {
1145 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1146 int mul, clock;
1147
1148 if ((intel_de_read(dev_priv, CBR1_VLV) & CBR_PWM_CLOCK_MUX_SELECT) == 0) {
1149 if (IS_CHERRYVIEW(dev_priv))
1150 clock = KHz(19200);
1151 else
1152 clock = MHz(25);
1153 mul = 16;
1154 } else {
1155 clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
1156 mul = 128;
1157 }
1158
1159 return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * mul);
1160 }
1161
1162 static u16 get_vbt_pwm_freq(struct intel_connector *connector)
1163 {
1164 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1165 u16 pwm_freq_hz = connector->panel.vbt.backlight.pwm_freq_hz;
1166
1167 if (pwm_freq_hz) {
1168 drm_dbg_kms(&dev_priv->drm,
1169 "VBT defined backlight frequency %u Hz\n",
1170 pwm_freq_hz);
1171 } else {
1172 pwm_freq_hz = 200;
1173 drm_dbg_kms(&dev_priv->drm,
1174 "default backlight frequency %u Hz\n",
1175 pwm_freq_hz);
1176 }
1177
1178 return pwm_freq_hz;
1179 }
1180
1181 static u32 get_backlight_max_vbt(struct intel_connector *connector)
1182 {
1183 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1184 struct intel_panel *panel = &connector->panel;
1185 u16 pwm_freq_hz = get_vbt_pwm_freq(connector);
1186 u32 pwm;
1187
1188 if (!panel->backlight.pwm_funcs->hz_to_pwm) {
1189 drm_dbg_kms(&dev_priv->drm,
1190 "backlight frequency conversion not supported\n");
1191 return 0;
1192 }
1193
1194 pwm = panel->backlight.pwm_funcs->hz_to_pwm(connector, pwm_freq_hz);
1195 if (!pwm) {
1196 drm_dbg_kms(&dev_priv->drm,
1197 "backlight frequency conversion failed\n");
1198 return 0;
1199 }
1200
1201 return pwm;
1202 }
1203
1204
1205
1206
1207 static u32 get_backlight_min_vbt(struct intel_connector *connector)
1208 {
1209 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1210 struct intel_panel *panel = &connector->panel;
1211 int min;
1212
1213 drm_WARN_ON(&dev_priv->drm, panel->backlight.pwm_level_max == 0);
1214
1215
1216
1217
1218
1219
1220
1221
1222 min = clamp_t(int, connector->panel.vbt.backlight.min_brightness, 0, 64);
1223 if (min != connector->panel.vbt.backlight.min_brightness) {
1224 drm_dbg_kms(&dev_priv->drm,
1225 "clamping VBT min backlight %d/255 to %d/255\n",
1226 connector->panel.vbt.backlight.min_brightness, min);
1227 }
1228
1229
1230 return scale(min, 0, 255, 0, panel->backlight.pwm_level_max);
1231 }
1232
1233 static int lpt_setup_backlight(struct intel_connector *connector, enum pipe unused)
1234 {
1235 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1236 struct intel_panel *panel = &connector->panel;
1237 u32 cpu_ctl2, pch_ctl1, pch_ctl2, val;
1238 bool alt, cpu_mode;
1239
1240 if (HAS_PCH_LPT(dev_priv))
1241 alt = intel_de_read(dev_priv, SOUTH_CHICKEN2) & LPT_PWM_GRANULARITY;
1242 else
1243 alt = intel_de_read(dev_priv, SOUTH_CHICKEN1) & SPT_PWM_GRANULARITY;
1244 panel->backlight.alternate_pwm_increment = alt;
1245
1246 pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
1247 panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY;
1248
1249 pch_ctl2 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL2);
1250 panel->backlight.pwm_level_max = pch_ctl2 >> 16;
1251
1252 cpu_ctl2 = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
1253
1254 if (!panel->backlight.pwm_level_max)
1255 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1256
1257 if (!panel->backlight.pwm_level_max)
1258 return -ENODEV;
1259
1260 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1261
1262 panel->backlight.pwm_enabled = pch_ctl1 & BLM_PCH_PWM_ENABLE;
1263
1264 cpu_mode = panel->backlight.pwm_enabled && HAS_PCH_LPT(dev_priv) &&
1265 !(pch_ctl1 & BLM_PCH_OVERRIDE_ENABLE) &&
1266 (cpu_ctl2 & BLM_PWM_ENABLE);
1267
1268 if (cpu_mode) {
1269 val = pch_get_backlight(connector, unused);
1270
1271 drm_dbg_kms(&dev_priv->drm,
1272 "CPU backlight register was enabled, switching to PCH override\n");
1273
1274
1275 lpt_set_backlight(connector->base.state, val);
1276 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
1277 pch_ctl1 | BLM_PCH_OVERRIDE_ENABLE);
1278
1279 intel_de_write(dev_priv, BLC_PWM_CPU_CTL2,
1280 cpu_ctl2 & ~BLM_PWM_ENABLE);
1281 }
1282
1283 return 0;
1284 }
1285
1286 static int pch_setup_backlight(struct intel_connector *connector, enum pipe unused)
1287 {
1288 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1289 struct intel_panel *panel = &connector->panel;
1290 u32 cpu_ctl2, pch_ctl1, pch_ctl2;
1291
1292 pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
1293 panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY;
1294
1295 pch_ctl2 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL2);
1296 panel->backlight.pwm_level_max = pch_ctl2 >> 16;
1297
1298 if (!panel->backlight.pwm_level_max)
1299 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1300
1301 if (!panel->backlight.pwm_level_max)
1302 return -ENODEV;
1303
1304 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1305
1306 cpu_ctl2 = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
1307 panel->backlight.pwm_enabled = (cpu_ctl2 & BLM_PWM_ENABLE) &&
1308 (pch_ctl1 & BLM_PCH_PWM_ENABLE);
1309
1310 return 0;
1311 }
1312
1313 static int i9xx_setup_backlight(struct intel_connector *connector, enum pipe unused)
1314 {
1315 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1316 struct intel_panel *panel = &connector->panel;
1317 u32 ctl, val;
1318
1319 ctl = intel_de_read(dev_priv, BLC_PWM_CTL);
1320
1321 if (DISPLAY_VER(dev_priv) == 2 || IS_I915GM(dev_priv) || IS_I945GM(dev_priv))
1322 panel->backlight.combination_mode = ctl & BLM_LEGACY_MODE;
1323
1324 if (IS_PINEVIEW(dev_priv))
1325 panel->backlight.active_low_pwm = ctl & BLM_POLARITY_PNV;
1326
1327 panel->backlight.pwm_level_max = ctl >> 17;
1328
1329 if (!panel->backlight.pwm_level_max) {
1330 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1331 panel->backlight.pwm_level_max >>= 1;
1332 }
1333
1334 if (!panel->backlight.pwm_level_max)
1335 return -ENODEV;
1336
1337 if (panel->backlight.combination_mode)
1338 panel->backlight.pwm_level_max *= 0xff;
1339
1340 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1341
1342 val = i9xx_get_backlight(connector, unused);
1343 val = intel_backlight_invert_pwm_level(connector, val);
1344 val = clamp(val, panel->backlight.pwm_level_min, panel->backlight.pwm_level_max);
1345
1346 panel->backlight.pwm_enabled = val != 0;
1347
1348 return 0;
1349 }
1350
1351 static int i965_setup_backlight(struct intel_connector *connector, enum pipe unused)
1352 {
1353 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1354 struct intel_panel *panel = &connector->panel;
1355 u32 ctl, ctl2;
1356
1357 ctl2 = intel_de_read(dev_priv, BLC_PWM_CTL2);
1358 panel->backlight.combination_mode = ctl2 & BLM_COMBINATION_MODE;
1359 panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965;
1360
1361 ctl = intel_de_read(dev_priv, BLC_PWM_CTL);
1362 panel->backlight.pwm_level_max = ctl >> 16;
1363
1364 if (!panel->backlight.pwm_level_max)
1365 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1366
1367 if (!panel->backlight.pwm_level_max)
1368 return -ENODEV;
1369
1370 if (panel->backlight.combination_mode)
1371 panel->backlight.pwm_level_max *= 0xff;
1372
1373 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1374
1375 panel->backlight.pwm_enabled = ctl2 & BLM_PWM_ENABLE;
1376
1377 return 0;
1378 }
1379
1380 static int vlv_setup_backlight(struct intel_connector *connector, enum pipe pipe)
1381 {
1382 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1383 struct intel_panel *panel = &connector->panel;
1384 u32 ctl, ctl2;
1385
1386 if (drm_WARN_ON(&dev_priv->drm, pipe != PIPE_A && pipe != PIPE_B))
1387 return -ENODEV;
1388
1389 ctl2 = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
1390 panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965;
1391
1392 ctl = intel_de_read(dev_priv, VLV_BLC_PWM_CTL(pipe));
1393 panel->backlight.pwm_level_max = ctl >> 16;
1394
1395 if (!panel->backlight.pwm_level_max)
1396 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1397
1398 if (!panel->backlight.pwm_level_max)
1399 return -ENODEV;
1400
1401 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1402
1403 panel->backlight.pwm_enabled = ctl2 & BLM_PWM_ENABLE;
1404
1405 return 0;
1406 }
1407
1408 static int
1409 bxt_setup_backlight(struct intel_connector *connector, enum pipe unused)
1410 {
1411 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1412 struct intel_panel *panel = &connector->panel;
1413 u32 pwm_ctl, val;
1414
1415 panel->backlight.controller = connector->panel.vbt.backlight.controller;
1416
1417 pwm_ctl = intel_de_read(dev_priv,
1418 BXT_BLC_PWM_CTL(panel->backlight.controller));
1419
1420
1421 if (panel->backlight.controller == 1) {
1422 val = intel_de_read(dev_priv, UTIL_PIN_CTL);
1423 panel->backlight.util_pin_active_low =
1424 val & UTIL_PIN_POLARITY;
1425 }
1426
1427 panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY;
1428 panel->backlight.pwm_level_max =
1429 intel_de_read(dev_priv, BXT_BLC_PWM_FREQ(panel->backlight.controller));
1430
1431 if (!panel->backlight.pwm_level_max)
1432 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1433
1434 if (!panel->backlight.pwm_level_max)
1435 return -ENODEV;
1436
1437 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1438
1439 panel->backlight.pwm_enabled = pwm_ctl & BXT_BLC_PWM_ENABLE;
1440
1441 return 0;
1442 }
1443
1444 static int
1445 cnp_setup_backlight(struct intel_connector *connector, enum pipe unused)
1446 {
1447 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1448 struct intel_panel *panel = &connector->panel;
1449 u32 pwm_ctl;
1450
1451
1452
1453
1454
1455
1456 panel->backlight.controller = 0;
1457
1458 pwm_ctl = intel_de_read(dev_priv,
1459 BXT_BLC_PWM_CTL(panel->backlight.controller));
1460
1461 panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY;
1462 panel->backlight.pwm_level_max =
1463 intel_de_read(dev_priv, BXT_BLC_PWM_FREQ(panel->backlight.controller));
1464
1465 if (!panel->backlight.pwm_level_max)
1466 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1467
1468 if (!panel->backlight.pwm_level_max)
1469 return -ENODEV;
1470
1471 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1472
1473 panel->backlight.pwm_enabled = pwm_ctl & BXT_BLC_PWM_ENABLE;
1474
1475 return 0;
1476 }
1477
1478 static int ext_pwm_setup_backlight(struct intel_connector *connector,
1479 enum pipe pipe)
1480 {
1481 struct drm_device *dev = connector->base.dev;
1482 struct drm_i915_private *dev_priv = to_i915(dev);
1483 struct intel_panel *panel = &connector->panel;
1484 const char *desc;
1485 u32 level;
1486
1487
1488 if (connector->panel.vbt.dsi.config->pwm_blc == PPS_BLC_PMIC) {
1489 panel->backlight.pwm = pwm_get(dev->dev, "pwm_pmic_backlight");
1490 desc = "PMIC";
1491 } else {
1492 panel->backlight.pwm = pwm_get(dev->dev, "pwm_soc_backlight");
1493 desc = "SoC";
1494 }
1495
1496 if (IS_ERR(panel->backlight.pwm)) {
1497 drm_err(&dev_priv->drm, "Failed to get the %s PWM chip\n",
1498 desc);
1499 panel->backlight.pwm = NULL;
1500 return -ENODEV;
1501 }
1502
1503 panel->backlight.pwm_level_max = 100;
1504 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1505
1506 if (pwm_is_enabled(panel->backlight.pwm)) {
1507
1508 pwm_get_state(panel->backlight.pwm, &panel->backlight.pwm_state);
1509
1510 level = pwm_get_relative_duty_cycle(&panel->backlight.pwm_state,
1511 100);
1512 level = intel_backlight_invert_pwm_level(connector, level);
1513 panel->backlight.pwm_enabled = true;
1514
1515 drm_dbg_kms(&dev_priv->drm, "PWM already enabled at freq %ld, VBT freq %d, level %d\n",
1516 NSEC_PER_SEC / (unsigned long)panel->backlight.pwm_state.period,
1517 get_vbt_pwm_freq(connector), level);
1518 } else {
1519
1520 panel->backlight.pwm_state.period =
1521 NSEC_PER_SEC / get_vbt_pwm_freq(connector);
1522 }
1523
1524 drm_info(&dev_priv->drm, "Using %s PWM for LCD backlight control\n",
1525 desc);
1526 return 0;
1527 }
1528
1529 static void intel_pwm_set_backlight(const struct drm_connector_state *conn_state, u32 level)
1530 {
1531 struct intel_connector *connector = to_intel_connector(conn_state->connector);
1532 struct intel_panel *panel = &connector->panel;
1533
1534 panel->backlight.pwm_funcs->set(conn_state,
1535 intel_backlight_invert_pwm_level(connector, level));
1536 }
1537
1538 static u32 intel_pwm_get_backlight(struct intel_connector *connector, enum pipe pipe)
1539 {
1540 struct intel_panel *panel = &connector->panel;
1541
1542 return intel_backlight_invert_pwm_level(connector,
1543 panel->backlight.pwm_funcs->get(connector, pipe));
1544 }
1545
1546 static void intel_pwm_enable_backlight(const struct intel_crtc_state *crtc_state,
1547 const struct drm_connector_state *conn_state, u32 level)
1548 {
1549 struct intel_connector *connector = to_intel_connector(conn_state->connector);
1550 struct intel_panel *panel = &connector->panel;
1551
1552 panel->backlight.pwm_funcs->enable(crtc_state, conn_state,
1553 intel_backlight_invert_pwm_level(connector, level));
1554 }
1555
1556 static void intel_pwm_disable_backlight(const struct drm_connector_state *conn_state, u32 level)
1557 {
1558 struct intel_connector *connector = to_intel_connector(conn_state->connector);
1559 struct intel_panel *panel = &connector->panel;
1560
1561 panel->backlight.pwm_funcs->disable(conn_state,
1562 intel_backlight_invert_pwm_level(connector, level));
1563 }
1564
1565 static int intel_pwm_setup_backlight(struct intel_connector *connector, enum pipe pipe)
1566 {
1567 struct intel_panel *panel = &connector->panel;
1568 int ret = panel->backlight.pwm_funcs->setup(connector, pipe);
1569
1570 if (ret < 0)
1571 return ret;
1572
1573 panel->backlight.min = panel->backlight.pwm_level_min;
1574 panel->backlight.max = panel->backlight.pwm_level_max;
1575 panel->backlight.level = intel_pwm_get_backlight(connector, pipe);
1576 panel->backlight.enabled = panel->backlight.pwm_enabled;
1577
1578 return 0;
1579 }
1580
1581 void intel_backlight_update(struct intel_atomic_state *state,
1582 struct intel_encoder *encoder,
1583 const struct intel_crtc_state *crtc_state,
1584 const struct drm_connector_state *conn_state)
1585 {
1586 struct intel_connector *connector = to_intel_connector(conn_state->connector);
1587 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1588 struct intel_panel *panel = &connector->panel;
1589
1590 if (!panel->backlight.present)
1591 return;
1592
1593 mutex_lock(&dev_priv->backlight_lock);
1594 if (!panel->backlight.enabled)
1595 __intel_backlight_enable(crtc_state, conn_state);
1596
1597 mutex_unlock(&dev_priv->backlight_lock);
1598 }
1599
1600 int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe)
1601 {
1602 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1603 struct intel_panel *panel = &connector->panel;
1604 int ret;
1605
1606 if (!connector->panel.vbt.backlight.present) {
1607 if (dev_priv->quirks & QUIRK_BACKLIGHT_PRESENT) {
1608 drm_dbg_kms(&dev_priv->drm,
1609 "no backlight present per VBT, but present per quirk\n");
1610 } else {
1611 drm_dbg_kms(&dev_priv->drm,
1612 "no backlight present per VBT\n");
1613 return 0;
1614 }
1615 }
1616
1617
1618 if (drm_WARN_ON(&dev_priv->drm, !panel->backlight.funcs))
1619 return -ENODEV;
1620
1621
1622 mutex_lock(&dev_priv->backlight_lock);
1623 ret = panel->backlight.funcs->setup(connector, pipe);
1624 mutex_unlock(&dev_priv->backlight_lock);
1625
1626 if (ret) {
1627 drm_dbg_kms(&dev_priv->drm,
1628 "failed to setup backlight for connector %s\n",
1629 connector->base.name);
1630 return ret;
1631 }
1632
1633 panel->backlight.present = true;
1634
1635 drm_dbg_kms(&dev_priv->drm,
1636 "Connector %s backlight initialized, %s, brightness %u/%u\n",
1637 connector->base.name,
1638 str_enabled_disabled(panel->backlight.enabled),
1639 panel->backlight.level, panel->backlight.max);
1640
1641 return 0;
1642 }
1643
1644 void intel_backlight_destroy(struct intel_panel *panel)
1645 {
1646
1647 if (panel->backlight.pwm)
1648 pwm_put(panel->backlight.pwm);
1649
1650 panel->backlight.present = false;
1651 }
1652
1653 static const struct intel_panel_bl_funcs bxt_pwm_funcs = {
1654 .setup = bxt_setup_backlight,
1655 .enable = bxt_enable_backlight,
1656 .disable = bxt_disable_backlight,
1657 .set = bxt_set_backlight,
1658 .get = bxt_get_backlight,
1659 .hz_to_pwm = bxt_hz_to_pwm,
1660 };
1661
1662 static const struct intel_panel_bl_funcs cnp_pwm_funcs = {
1663 .setup = cnp_setup_backlight,
1664 .enable = cnp_enable_backlight,
1665 .disable = cnp_disable_backlight,
1666 .set = bxt_set_backlight,
1667 .get = bxt_get_backlight,
1668 .hz_to_pwm = cnp_hz_to_pwm,
1669 };
1670
1671 static const struct intel_panel_bl_funcs lpt_pwm_funcs = {
1672 .setup = lpt_setup_backlight,
1673 .enable = lpt_enable_backlight,
1674 .disable = lpt_disable_backlight,
1675 .set = lpt_set_backlight,
1676 .get = lpt_get_backlight,
1677 .hz_to_pwm = lpt_hz_to_pwm,
1678 };
1679
1680 static const struct intel_panel_bl_funcs spt_pwm_funcs = {
1681 .setup = lpt_setup_backlight,
1682 .enable = lpt_enable_backlight,
1683 .disable = lpt_disable_backlight,
1684 .set = lpt_set_backlight,
1685 .get = lpt_get_backlight,
1686 .hz_to_pwm = spt_hz_to_pwm,
1687 };
1688
1689 static const struct intel_panel_bl_funcs pch_pwm_funcs = {
1690 .setup = pch_setup_backlight,
1691 .enable = pch_enable_backlight,
1692 .disable = pch_disable_backlight,
1693 .set = pch_set_backlight,
1694 .get = pch_get_backlight,
1695 .hz_to_pwm = pch_hz_to_pwm,
1696 };
1697
1698 static const struct intel_panel_bl_funcs ext_pwm_funcs = {
1699 .setup = ext_pwm_setup_backlight,
1700 .enable = ext_pwm_enable_backlight,
1701 .disable = ext_pwm_disable_backlight,
1702 .set = ext_pwm_set_backlight,
1703 .get = ext_pwm_get_backlight,
1704 };
1705
1706 static const struct intel_panel_bl_funcs vlv_pwm_funcs = {
1707 .setup = vlv_setup_backlight,
1708 .enable = vlv_enable_backlight,
1709 .disable = vlv_disable_backlight,
1710 .set = vlv_set_backlight,
1711 .get = vlv_get_backlight,
1712 .hz_to_pwm = vlv_hz_to_pwm,
1713 };
1714
1715 static const struct intel_panel_bl_funcs i965_pwm_funcs = {
1716 .setup = i965_setup_backlight,
1717 .enable = i965_enable_backlight,
1718 .disable = i965_disable_backlight,
1719 .set = i9xx_set_backlight,
1720 .get = i9xx_get_backlight,
1721 .hz_to_pwm = i965_hz_to_pwm,
1722 };
1723
1724 static const struct intel_panel_bl_funcs i9xx_pwm_funcs = {
1725 .setup = i9xx_setup_backlight,
1726 .enable = i9xx_enable_backlight,
1727 .disable = i9xx_disable_backlight,
1728 .set = i9xx_set_backlight,
1729 .get = i9xx_get_backlight,
1730 .hz_to_pwm = i9xx_hz_to_pwm,
1731 };
1732
1733 static const struct intel_panel_bl_funcs pwm_bl_funcs = {
1734 .setup = intel_pwm_setup_backlight,
1735 .enable = intel_pwm_enable_backlight,
1736 .disable = intel_pwm_disable_backlight,
1737 .set = intel_pwm_set_backlight,
1738 .get = intel_pwm_get_backlight,
1739 };
1740
1741
1742 void intel_backlight_init_funcs(struct intel_panel *panel)
1743 {
1744 struct intel_connector *connector =
1745 container_of(panel, struct intel_connector, panel);
1746 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1747
1748 if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI &&
1749 intel_dsi_dcs_init_backlight_funcs(connector) == 0)
1750 return;
1751
1752 if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) {
1753 panel->backlight.pwm_funcs = &bxt_pwm_funcs;
1754 } else if (INTEL_PCH_TYPE(dev_priv) >= PCH_CNP) {
1755 panel->backlight.pwm_funcs = &cnp_pwm_funcs;
1756 } else if (INTEL_PCH_TYPE(dev_priv) >= PCH_LPT) {
1757 if (HAS_PCH_LPT(dev_priv))
1758 panel->backlight.pwm_funcs = &lpt_pwm_funcs;
1759 else
1760 panel->backlight.pwm_funcs = &spt_pwm_funcs;
1761 } else if (HAS_PCH_SPLIT(dev_priv)) {
1762 panel->backlight.pwm_funcs = &pch_pwm_funcs;
1763 } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
1764 if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI) {
1765 panel->backlight.pwm_funcs = &ext_pwm_funcs;
1766 } else {
1767 panel->backlight.pwm_funcs = &vlv_pwm_funcs;
1768 }
1769 } else if (DISPLAY_VER(dev_priv) == 4) {
1770 panel->backlight.pwm_funcs = &i965_pwm_funcs;
1771 } else {
1772 panel->backlight.pwm_funcs = &i9xx_pwm_funcs;
1773 }
1774
1775 if (connector->base.connector_type == DRM_MODE_CONNECTOR_eDP) {
1776 if (intel_dp_aux_init_backlight_funcs(connector) == 0)
1777 return;
1778
1779 if (!(dev_priv->quirks & QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK))
1780 connector->panel.backlight.power = intel_pps_backlight_power;
1781 }
1782
1783
1784 panel->backlight.funcs = &pwm_bl_funcs;
1785 }