Lines Matching +full:display +full:- +full:pipe
1 // SPDX-License-Identifier: MIT
28 * scale - scale values from one range to another
52 target_val = mul_u32_u32(source_val - source_min, in scale()
53 target_max - target_min); in scale()
54 target_val = DIV_ROUND_CLOSEST_ULL(target_val, source_max - source_min); in scale()
67 struct intel_panel *panel = &connector->panel; in clamp_user_to_hw()
70 hw_level = scale(user_level, 0, user_max, 0, panel->backlight.max); in clamp_user_to_hw()
71 hw_level = clamp(hw_level, panel->backlight.min, panel->backlight.max); in clamp_user_to_hw()
80 struct intel_panel *panel = &connector->panel; in scale_hw_to_user()
82 return scale(hw_level, panel->backlight.min, panel->backlight.max, in scale_hw_to_user()
88 struct intel_display *display = to_intel_display(connector); in intel_backlight_invert_pwm_level() local
89 struct intel_panel *panel = &connector->panel; in intel_backlight_invert_pwm_level()
91 drm_WARN_ON(display->drm, panel->backlight.pwm_level_max == 0); in intel_backlight_invert_pwm_level()
93 if (display->params.invert_brightness < 0) in intel_backlight_invert_pwm_level()
96 if (display->params.invert_brightness > 0 || in intel_backlight_invert_pwm_level()
97 intel_has_quirk(display, QUIRK_INVERT_BRIGHTNESS)) { in intel_backlight_invert_pwm_level()
98 return panel->backlight.pwm_level_max - val + panel->backlight.pwm_level_min; in intel_backlight_invert_pwm_level()
106 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_backlight_set_pwm_level()
107 struct intel_display *display = to_intel_display(connector); in intel_backlight_set_pwm_level() local
108 struct intel_panel *panel = &connector->panel; in intel_backlight_set_pwm_level()
110 drm_dbg_kms(display->drm, "[CONNECTOR:%d:%s] set backlight PWM = %d\n", in intel_backlight_set_pwm_level()
111 connector->base.base.id, connector->base.name, val); in intel_backlight_set_pwm_level()
112 panel->backlight.pwm_funcs->set(conn_state, val); in intel_backlight_set_pwm_level()
117 struct intel_display *display = to_intel_display(connector); in intel_backlight_level_to_pwm() local
118 struct intel_panel *panel = &connector->panel; in intel_backlight_level_to_pwm()
120 drm_WARN_ON_ONCE(display->drm, in intel_backlight_level_to_pwm()
121 panel->backlight.max == 0 || panel->backlight.pwm_level_max == 0); in intel_backlight_level_to_pwm()
123 val = scale(val, panel->backlight.min, panel->backlight.max, in intel_backlight_level_to_pwm()
124 panel->backlight.pwm_level_min, panel->backlight.pwm_level_max); in intel_backlight_level_to_pwm()
131 struct intel_display *display = to_intel_display(connector); in intel_backlight_level_from_pwm() local
132 struct intel_panel *panel = &connector->panel; in intel_backlight_level_from_pwm()
134 drm_WARN_ON_ONCE(display->drm, in intel_backlight_level_from_pwm()
135 panel->backlight.max == 0 || panel->backlight.pwm_level_max == 0); in intel_backlight_level_from_pwm()
137 if (display->params.invert_brightness > 0 || in intel_backlight_level_from_pwm()
138 (display->params.invert_brightness == 0 && in intel_backlight_level_from_pwm()
139 intel_has_quirk(display, QUIRK_INVERT_BRIGHTNESS))) in intel_backlight_level_from_pwm()
140 val = panel->backlight.pwm_level_max - (val - panel->backlight.pwm_level_min); in intel_backlight_level_from_pwm()
142 return scale(val, panel->backlight.pwm_level_min, panel->backlight.pwm_level_max, in intel_backlight_level_from_pwm()
143 panel->backlight.min, panel->backlight.max); in intel_backlight_level_from_pwm()
146 static u32 lpt_get_backlight(struct intel_connector *connector, enum pipe unused) in lpt_get_backlight()
148 struct intel_display *display = to_intel_display(connector); in lpt_get_backlight() local
150 return intel_de_read(display, BLC_PWM_PCH_CTL2) & BACKLIGHT_DUTY_CYCLE_MASK; in lpt_get_backlight()
153 static u32 pch_get_backlight(struct intel_connector *connector, enum pipe unused) in pch_get_backlight()
155 struct intel_display *display = to_intel_display(connector); in pch_get_backlight() local
157 return intel_de_read(display, BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; in pch_get_backlight()
160 static u32 i9xx_get_backlight(struct intel_connector *connector, enum pipe unused) in i9xx_get_backlight()
162 struct intel_display *display = to_intel_display(connector); in i9xx_get_backlight() local
163 struct intel_panel *panel = &connector->panel; in i9xx_get_backlight()
166 val = intel_de_read(display, BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; in i9xx_get_backlight()
167 if (DISPLAY_VER(display) < 4) in i9xx_get_backlight()
170 if (panel->backlight.combination_mode) { in i9xx_get_backlight()
171 struct pci_dev *pdev = to_pci_dev(display->drm->dev); in i9xx_get_backlight()
181 static u32 vlv_get_backlight(struct intel_connector *connector, enum pipe pipe) in vlv_get_backlight() argument
183 struct intel_display *display = to_intel_display(connector); in vlv_get_backlight() local
185 if (drm_WARN_ON(display->drm, pipe != PIPE_A && pipe != PIPE_B)) in vlv_get_backlight()
188 return intel_de_read(display, VLV_BLC_PWM_CTL(pipe)) & BACKLIGHT_DUTY_CYCLE_MASK; in vlv_get_backlight()
191 static u32 bxt_get_backlight(struct intel_connector *connector, enum pipe unused) in bxt_get_backlight()
193 struct intel_display *display = to_intel_display(connector); in bxt_get_backlight() local
194 struct intel_panel *panel = &connector->panel; in bxt_get_backlight()
196 return intel_de_read(display, BXT_BLC_PWM_DUTY(panel->backlight.controller)); in bxt_get_backlight()
199 static u32 ext_pwm_get_backlight(struct intel_connector *connector, enum pipe unused) in ext_pwm_get_backlight()
201 struct intel_panel *panel = &connector->panel; in ext_pwm_get_backlight()
204 pwm_get_state(panel->backlight.pwm, &state); in ext_pwm_get_backlight()
210 struct intel_connector *connector = to_intel_connector(conn_state->connector); in lpt_set_backlight()
211 struct intel_display *display = to_intel_display(connector); in lpt_set_backlight() local
214 val = intel_de_read(display, BLC_PWM_PCH_CTL2) & ~BACKLIGHT_DUTY_CYCLE_MASK; in lpt_set_backlight()
215 intel_de_write(display, BLC_PWM_PCH_CTL2, val | level); in lpt_set_backlight()
220 struct intel_connector *connector = to_intel_connector(conn_state->connector); in pch_set_backlight()
221 struct intel_display *display = to_intel_display(connector); in pch_set_backlight() local
224 tmp = intel_de_read(display, BLC_PWM_CPU_CTL) & ~BACKLIGHT_DUTY_CYCLE_MASK; in pch_set_backlight()
225 intel_de_write(display, BLC_PWM_CPU_CTL, tmp | level); in pch_set_backlight()
230 struct intel_connector *connector = to_intel_connector(conn_state->connector); in i9xx_set_backlight()
231 struct intel_display *display = to_intel_display(connector); in i9xx_set_backlight() local
232 struct intel_panel *panel = &connector->panel; in i9xx_set_backlight()
235 drm_WARN_ON(display->drm, panel->backlight.pwm_level_max == 0); in i9xx_set_backlight()
237 if (panel->backlight.combination_mode) { in i9xx_set_backlight()
238 struct pci_dev *pdev = to_pci_dev(display->drm->dev); in i9xx_set_backlight()
241 lbpc = level * 0xfe / panel->backlight.pwm_level_max + 1; in i9xx_set_backlight()
246 if (DISPLAY_VER(display) == 4) { in i9xx_set_backlight()
253 tmp = intel_de_read(display, BLC_PWM_CTL) & ~mask; in i9xx_set_backlight()
254 intel_de_write(display, BLC_PWM_CTL, tmp | level); in i9xx_set_backlight()
259 struct intel_connector *connector = to_intel_connector(conn_state->connector); in vlv_set_backlight()
260 struct intel_display *display = to_intel_display(connector); in vlv_set_backlight() local
261 enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe; in vlv_set_backlight() local
264 tmp = intel_de_read(display, VLV_BLC_PWM_CTL(pipe)) & ~BACKLIGHT_DUTY_CYCLE_MASK; in vlv_set_backlight()
265 intel_de_write(display, VLV_BLC_PWM_CTL(pipe), tmp | level); in vlv_set_backlight()
270 struct intel_connector *connector = to_intel_connector(conn_state->connector); in bxt_set_backlight()
271 struct intel_display *display = to_intel_display(connector); in bxt_set_backlight() local
272 struct intel_panel *panel = &connector->panel; in bxt_set_backlight()
274 intel_de_write(display, BXT_BLC_PWM_DUTY(panel->backlight.controller), level); in bxt_set_backlight()
279 struct intel_panel *panel = &to_intel_connector(conn_state->connector)->panel; in ext_pwm_set_backlight()
281 pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100); in ext_pwm_set_backlight()
282 pwm_apply_might_sleep(panel->backlight.pwm, &panel->backlight.pwm_state); in ext_pwm_set_backlight()
288 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_panel_actually_set_backlight()
289 struct intel_display *display = to_intel_display(connector); in intel_panel_actually_set_backlight() local
290 struct intel_panel *panel = &connector->panel; in intel_panel_actually_set_backlight()
292 drm_dbg_kms(display->drm, "[CONNECTOR:%d:%s] set backlight level = %d\n", in intel_panel_actually_set_backlight()
293 connector->base.base.id, connector->base.name, level); in intel_panel_actually_set_backlight()
295 panel->backlight.funcs->set(conn_state, level); in intel_panel_actually_set_backlight()
304 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_backlight_set_acpi()
305 struct intel_display *display = to_intel_display(connector); in intel_backlight_set_acpi() local
306 struct intel_panel *panel = &connector->panel; in intel_backlight_set_acpi()
315 if (!panel->backlight.present || !conn_state->crtc) in intel_backlight_set_acpi()
318 mutex_lock(&display->backlight.lock); in intel_backlight_set_acpi()
320 drm_WARN_ON(display->drm, panel->backlight.max == 0); in intel_backlight_set_acpi()
323 panel->backlight.level = hw_level; in intel_backlight_set_acpi()
325 if (panel->backlight.device) in intel_backlight_set_acpi()
326 panel->backlight.device->props.brightness = in intel_backlight_set_acpi()
328 panel->backlight.level, in intel_backlight_set_acpi()
329 panel->backlight.device->props.max_brightness); in intel_backlight_set_acpi()
331 if (panel->backlight.enabled) in intel_backlight_set_acpi()
334 mutex_unlock(&display->backlight.lock); in intel_backlight_set_acpi()
339 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in lpt_disable_backlight()
340 struct intel_display *display = to_intel_display(connector); in lpt_disable_backlight() local
353 tmp = intel_de_read(display, BLC_PWM_CPU_CTL2); in lpt_disable_backlight()
355 drm_dbg_kms(display->drm, "[CONNECTOR:%d:%s] CPU backlight was enabled, disabling\n", in lpt_disable_backlight()
356 connector->base.base.id, connector->base.name); in lpt_disable_backlight()
357 intel_de_write(display, BLC_PWM_CPU_CTL2, tmp & ~BLM_PWM_ENABLE); in lpt_disable_backlight()
360 intel_de_rmw(display, BLC_PWM_PCH_CTL1, BLM_PCH_PWM_ENABLE, 0); in lpt_disable_backlight()
365 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in pch_disable_backlight()
366 struct intel_display *display = to_intel_display(connector); in pch_disable_backlight() local
370 intel_de_rmw(display, BLC_PWM_CPU_CTL2, BLM_PWM_ENABLE, 0); in pch_disable_backlight()
372 intel_de_rmw(display, BLC_PWM_PCH_CTL1, BLM_PCH_PWM_ENABLE, 0); in pch_disable_backlight()
382 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in i965_disable_backlight()
383 struct intel_display *display = to_intel_display(connector); in i965_disable_backlight() local
387 intel_de_rmw(display, BLC_PWM_CTL2, BLM_PWM_ENABLE, 0); in i965_disable_backlight()
392 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in vlv_disable_backlight()
393 struct intel_display *display = to_intel_display(connector); in vlv_disable_backlight() local
394 enum pipe pipe = to_intel_crtc(old_conn_state->crtc)->pipe; in vlv_disable_backlight() local
398 intel_de_rmw(display, VLV_BLC_PWM_CTL2(pipe), BLM_PWM_ENABLE, 0); in vlv_disable_backlight()
403 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in bxt_disable_backlight()
404 struct intel_display *display = to_intel_display(connector); in bxt_disable_backlight() local
405 struct intel_panel *panel = &connector->panel; in bxt_disable_backlight()
409 intel_de_rmw(display, BXT_BLC_PWM_CTL(panel->backlight.controller), in bxt_disable_backlight()
412 if (panel->backlight.controller == 1) in bxt_disable_backlight()
413 intel_de_rmw(display, UTIL_PIN_CTL, UTIL_PIN_ENABLE, 0); in bxt_disable_backlight()
418 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in cnp_disable_backlight()
419 struct intel_display *display = to_intel_display(connector); in cnp_disable_backlight() local
420 struct intel_panel *panel = &connector->panel; in cnp_disable_backlight()
424 intel_de_rmw(display, BXT_BLC_PWM_CTL(panel->backlight.controller), in cnp_disable_backlight()
430 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in ext_pwm_disable_backlight()
431 struct intel_panel *panel = &connector->panel; in ext_pwm_disable_backlight()
435 panel->backlight.pwm_state.enabled = false; in ext_pwm_disable_backlight()
436 pwm_apply_might_sleep(panel->backlight.pwm, &panel->backlight.pwm_state); in ext_pwm_disable_backlight()
441 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in intel_backlight_disable()
442 struct intel_display *display = to_intel_display(connector); in intel_backlight_disable() local
443 struct intel_panel *panel = &connector->panel; in intel_backlight_disable()
445 if (!panel->backlight.present) in intel_backlight_disable()
454 if (display->drm->switch_power_state == DRM_SWITCH_POWER_CHANGING) { in intel_backlight_disable()
455 drm_dbg_kms(display->drm, "[CONNECTOR:%d:%s] Skipping backlight disable on vga switch\n", in intel_backlight_disable()
456 connector->base.base.id, connector->base.name); in intel_backlight_disable()
460 mutex_lock(&display->backlight.lock); in intel_backlight_disable()
462 if (panel->backlight.device) in intel_backlight_disable()
463 panel->backlight.device->props.power = BACKLIGHT_POWER_OFF; in intel_backlight_disable()
464 panel->backlight.enabled = false; in intel_backlight_disable()
465 panel->backlight.funcs->disable(old_conn_state, 0); in intel_backlight_disable()
467 mutex_unlock(&display->backlight.lock); in intel_backlight_disable()
473 struct intel_connector *connector = to_intel_connector(conn_state->connector); in lpt_enable_backlight()
474 struct intel_display *display = to_intel_display(connector); in lpt_enable_backlight() local
475 struct drm_i915_private *i915 = to_i915(connector->base.dev); in lpt_enable_backlight()
476 struct intel_panel *panel = &connector->panel; in lpt_enable_backlight()
479 pch_ctl1 = intel_de_read(display, BLC_PWM_PCH_CTL1); in lpt_enable_backlight()
481 drm_dbg_kms(display->drm, in lpt_enable_backlight()
483 connector->base.base.id, connector->base.name); in lpt_enable_backlight()
485 intel_de_write(display, BLC_PWM_PCH_CTL1, pch_ctl1); in lpt_enable_backlight()
489 intel_de_rmw(display, SOUTH_CHICKEN2, LPT_PWM_GRANULARITY, in lpt_enable_backlight()
490 panel->backlight.alternate_pwm_increment ? in lpt_enable_backlight()
493 intel_de_rmw(display, SOUTH_CHICKEN1, SPT_PWM_GRANULARITY, in lpt_enable_backlight()
494 panel->backlight.alternate_pwm_increment ? in lpt_enable_backlight()
497 pch_ctl2 = panel->backlight.pwm_level_max << 16; in lpt_enable_backlight()
498 intel_de_write(display, BLC_PWM_PCH_CTL2, pch_ctl2); in lpt_enable_backlight()
501 if (panel->backlight.active_low_pwm) in lpt_enable_backlight()
508 intel_de_write(display, BLC_PWM_PCH_CTL1, pch_ctl1); in lpt_enable_backlight()
509 intel_de_posting_read(display, BLC_PWM_PCH_CTL1); in lpt_enable_backlight()
510 intel_de_write(display, BLC_PWM_PCH_CTL1, pch_ctl1 | BLM_PCH_PWM_ENABLE); in lpt_enable_backlight()
519 struct intel_connector *connector = to_intel_connector(conn_state->connector); in pch_enable_backlight()
520 struct intel_display *display = to_intel_display(connector); in pch_enable_backlight() local
521 struct intel_panel *panel = &connector->panel; in pch_enable_backlight()
522 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; in pch_enable_backlight()
525 cpu_ctl2 = intel_de_read(display, BLC_PWM_CPU_CTL2); in pch_enable_backlight()
527 drm_dbg_kms(display->drm, in pch_enable_backlight()
529 connector->base.base.id, connector->base.name); in pch_enable_backlight()
531 intel_de_write(display, BLC_PWM_CPU_CTL2, cpu_ctl2); in pch_enable_backlight()
534 pch_ctl1 = intel_de_read(display, BLC_PWM_PCH_CTL1); in pch_enable_backlight()
536 drm_dbg_kms(display->drm, in pch_enable_backlight()
538 connector->base.base.id, connector->base.name); in pch_enable_backlight()
540 intel_de_write(display, BLC_PWM_PCH_CTL1, pch_ctl1); in pch_enable_backlight()
547 intel_de_write(display, BLC_PWM_CPU_CTL2, cpu_ctl2); in pch_enable_backlight()
548 intel_de_posting_read(display, BLC_PWM_CPU_CTL2); in pch_enable_backlight()
549 intel_de_write(display, BLC_PWM_CPU_CTL2, cpu_ctl2 | BLM_PWM_ENABLE); in pch_enable_backlight()
554 pch_ctl2 = panel->backlight.pwm_level_max << 16; in pch_enable_backlight()
555 intel_de_write(display, BLC_PWM_PCH_CTL2, pch_ctl2); in pch_enable_backlight()
558 if (panel->backlight.active_low_pwm) in pch_enable_backlight()
561 intel_de_write(display, BLC_PWM_PCH_CTL1, pch_ctl1); in pch_enable_backlight()
562 intel_de_posting_read(display, BLC_PWM_PCH_CTL1); in pch_enable_backlight()
563 intel_de_write(display, BLC_PWM_PCH_CTL1, pch_ctl1 | BLM_PCH_PWM_ENABLE); in pch_enable_backlight()
569 struct intel_connector *connector = to_intel_connector(conn_state->connector); in i9xx_enable_backlight()
570 struct intel_display *display = to_intel_display(connector); in i9xx_enable_backlight() local
571 struct intel_panel *panel = &connector->panel; in i9xx_enable_backlight()
574 ctl = intel_de_read(display, BLC_PWM_CTL); in i9xx_enable_backlight()
576 drm_dbg_kms(display->drm, in i9xx_enable_backlight()
578 connector->base.base.id, connector->base.name); in i9xx_enable_backlight()
579 intel_de_write(display, BLC_PWM_CTL, 0); in i9xx_enable_backlight()
582 freq = panel->backlight.pwm_level_max; in i9xx_enable_backlight()
583 if (panel->backlight.combination_mode) in i9xx_enable_backlight()
587 if (panel->backlight.combination_mode) in i9xx_enable_backlight()
589 if (display->platform.pineview && panel->backlight.active_low_pwm) in i9xx_enable_backlight()
592 intel_de_write(display, BLC_PWM_CTL, ctl); in i9xx_enable_backlight()
593 intel_de_posting_read(display, BLC_PWM_CTL); in i9xx_enable_backlight()
603 if (DISPLAY_VER(display) == 2) in i9xx_enable_backlight()
604 intel_de_write(display, BLC_HIST_CTL, BLM_HISTOGRAM_ENABLE); in i9xx_enable_backlight()
610 struct intel_connector *connector = to_intel_connector(conn_state->connector); in i965_enable_backlight()
611 struct intel_display *display = to_intel_display(connector); in i965_enable_backlight() local
612 struct intel_panel *panel = &connector->panel; in i965_enable_backlight()
613 enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe; in i965_enable_backlight() local
616 ctl2 = intel_de_read(display, BLC_PWM_CTL2); in i965_enable_backlight()
618 drm_dbg_kms(display->drm, in i965_enable_backlight()
620 connector->base.base.id, connector->base.name); in i965_enable_backlight()
622 intel_de_write(display, BLC_PWM_CTL2, ctl2); in i965_enable_backlight()
625 freq = panel->backlight.pwm_level_max; in i965_enable_backlight()
626 if (panel->backlight.combination_mode) in i965_enable_backlight()
630 intel_de_write(display, BLC_PWM_CTL, ctl); in i965_enable_backlight()
632 ctl2 = BLM_PIPE(pipe); in i965_enable_backlight()
633 if (panel->backlight.combination_mode) in i965_enable_backlight()
635 if (panel->backlight.active_low_pwm) in i965_enable_backlight()
637 intel_de_write(display, BLC_PWM_CTL2, ctl2); in i965_enable_backlight()
638 intel_de_posting_read(display, BLC_PWM_CTL2); in i965_enable_backlight()
639 intel_de_write(display, BLC_PWM_CTL2, ctl2 | BLM_PWM_ENABLE); in i965_enable_backlight()
647 struct intel_connector *connector = to_intel_connector(conn_state->connector); in vlv_enable_backlight()
648 struct intel_display *display = to_intel_display(connector); in vlv_enable_backlight() local
649 struct intel_panel *panel = &connector->panel; in vlv_enable_backlight()
650 enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe; in vlv_enable_backlight() local
653 ctl2 = intel_de_read(display, VLV_BLC_PWM_CTL2(pipe)); in vlv_enable_backlight()
655 drm_dbg_kms(display->drm, in vlv_enable_backlight()
657 connector->base.base.id, connector->base.name); in vlv_enable_backlight()
659 intel_de_write(display, VLV_BLC_PWM_CTL2(pipe), ctl2); in vlv_enable_backlight()
662 ctl = panel->backlight.pwm_level_max << 16; in vlv_enable_backlight()
663 intel_de_write(display, VLV_BLC_PWM_CTL(pipe), ctl); in vlv_enable_backlight()
669 if (panel->backlight.active_low_pwm) in vlv_enable_backlight()
671 intel_de_write(display, VLV_BLC_PWM_CTL2(pipe), ctl2); in vlv_enable_backlight()
672 intel_de_posting_read(display, VLV_BLC_PWM_CTL2(pipe)); in vlv_enable_backlight()
673 intel_de_write(display, VLV_BLC_PWM_CTL2(pipe), ctl2 | BLM_PWM_ENABLE); in vlv_enable_backlight()
679 struct intel_connector *connector = to_intel_connector(conn_state->connector); in bxt_enable_backlight()
680 struct intel_display *display = to_intel_display(connector); in bxt_enable_backlight() local
681 struct intel_panel *panel = &connector->panel; in bxt_enable_backlight()
682 enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe; in bxt_enable_backlight() local
686 if (panel->backlight.controller == 1) { in bxt_enable_backlight()
687 val = intel_de_read(display, UTIL_PIN_CTL); in bxt_enable_backlight()
689 drm_dbg_kms(display->drm, in bxt_enable_backlight()
691 connector->base.base.id, connector->base.name); in bxt_enable_backlight()
693 intel_de_write(display, UTIL_PIN_CTL, val); in bxt_enable_backlight()
697 if (panel->backlight.util_pin_active_low) in bxt_enable_backlight()
699 intel_de_write(display, UTIL_PIN_CTL, in bxt_enable_backlight()
700 val | UTIL_PIN_PIPE(pipe) | UTIL_PIN_MODE_PWM | UTIL_PIN_ENABLE); in bxt_enable_backlight()
703 pwm_ctl = intel_de_read(display, BXT_BLC_PWM_CTL(panel->backlight.controller)); in bxt_enable_backlight()
705 drm_dbg_kms(display->drm, in bxt_enable_backlight()
707 connector->base.base.id, connector->base.name); in bxt_enable_backlight()
709 intel_de_write(display, BXT_BLC_PWM_CTL(panel->backlight.controller), in bxt_enable_backlight()
713 intel_de_write(display, BXT_BLC_PWM_FREQ(panel->backlight.controller), in bxt_enable_backlight()
714 panel->backlight.pwm_level_max); in bxt_enable_backlight()
719 if (panel->backlight.active_low_pwm) in bxt_enable_backlight()
722 intel_de_write(display, BXT_BLC_PWM_CTL(panel->backlight.controller), pwm_ctl); in bxt_enable_backlight()
723 intel_de_posting_read(display, BXT_BLC_PWM_CTL(panel->backlight.controller)); in bxt_enable_backlight()
724 intel_de_write(display, BXT_BLC_PWM_CTL(panel->backlight.controller), in bxt_enable_backlight()
731 struct intel_connector *connector = to_intel_connector(conn_state->connector); in cnp_enable_backlight()
732 struct intel_display *display = to_intel_display(connector); in cnp_enable_backlight() local
733 struct intel_panel *panel = &connector->panel; in cnp_enable_backlight()
736 pwm_ctl = intel_de_read(display, BXT_BLC_PWM_CTL(panel->backlight.controller)); in cnp_enable_backlight()
738 drm_dbg_kms(display->drm, "backlight already enabled\n"); in cnp_enable_backlight()
740 intel_de_write(display, BXT_BLC_PWM_CTL(panel->backlight.controller), in cnp_enable_backlight()
744 intel_de_write(display, BXT_BLC_PWM_FREQ(panel->backlight.controller), in cnp_enable_backlight()
745 panel->backlight.pwm_level_max); in cnp_enable_backlight()
750 if (panel->backlight.active_low_pwm) in cnp_enable_backlight()
753 intel_de_write(display, BXT_BLC_PWM_CTL(panel->backlight.controller), pwm_ctl); in cnp_enable_backlight()
754 intel_de_posting_read(display, BXT_BLC_PWM_CTL(panel->backlight.controller)); in cnp_enable_backlight()
755 intel_de_write(display, BXT_BLC_PWM_CTL(panel->backlight.controller), in cnp_enable_backlight()
762 struct intel_connector *connector = to_intel_connector(conn_state->connector); in ext_pwm_enable_backlight()
763 struct intel_panel *panel = &connector->panel; in ext_pwm_enable_backlight()
765 pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100); in ext_pwm_enable_backlight()
766 panel->backlight.pwm_state.enabled = true; in ext_pwm_enable_backlight()
767 pwm_apply_might_sleep(panel->backlight.pwm, &panel->backlight.pwm_state); in ext_pwm_enable_backlight()
773 struct intel_connector *connector = to_intel_connector(conn_state->connector); in __intel_backlight_enable()
774 struct intel_panel *panel = &connector->panel; in __intel_backlight_enable()
776 WARN_ON(panel->backlight.max == 0); in __intel_backlight_enable()
778 if (panel->backlight.level < panel->backlight.min) { in __intel_backlight_enable()
779 panel->backlight.level = panel->backlight.min; in __intel_backlight_enable()
780 if (panel->backlight.device) in __intel_backlight_enable()
781 panel->backlight.device->props.brightness = in __intel_backlight_enable()
783 panel->backlight.level, in __intel_backlight_enable()
784 panel->backlight.device->props.max_brightness); in __intel_backlight_enable()
787 panel->backlight.funcs->enable(crtc_state, conn_state, panel->backlight.level); in __intel_backlight_enable()
788 panel->backlight.enabled = true; in __intel_backlight_enable()
789 if (panel->backlight.device) in __intel_backlight_enable()
790 panel->backlight.device->props.power = BACKLIGHT_POWER_ON; in __intel_backlight_enable()
796 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_backlight_enable()
797 struct intel_display *display = to_intel_display(connector); in intel_backlight_enable() local
798 struct intel_panel *panel = &connector->panel; in intel_backlight_enable()
799 enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe; in intel_backlight_enable() local
801 if (!panel->backlight.present) in intel_backlight_enable()
804 drm_dbg_kms(display->drm, "pipe %c\n", pipe_name(pipe)); in intel_backlight_enable()
806 mutex_lock(&display->backlight.lock); in intel_backlight_enable()
810 mutex_unlock(&display->backlight.lock); in intel_backlight_enable()
816 struct intel_display *display = to_intel_display(connector); in intel_panel_get_backlight() local
817 struct intel_panel *panel = &connector->panel; in intel_panel_get_backlight()
820 mutex_lock(&display->backlight.lock); in intel_panel_get_backlight()
822 if (panel->backlight.enabled) in intel_panel_get_backlight()
823 val = panel->backlight.funcs->get(connector, intel_connector_get_pipe(connector)); in intel_panel_get_backlight()
825 mutex_unlock(&display->backlight.lock); in intel_panel_get_backlight()
827 drm_dbg_kms(display->drm, "get backlight PWM = %d\n", val); in intel_panel_get_backlight()
835 struct intel_panel *panel = &connector->panel; in scale_user_to_hw()
838 panel->backlight.min, panel->backlight.max); in scale_user_to_hw()
845 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_panel_set_backlight()
846 struct intel_display *display = to_intel_display(connector); in intel_panel_set_backlight() local
847 struct intel_panel *panel = &connector->panel; in intel_panel_set_backlight()
850 if (!panel->backlight.present) in intel_panel_set_backlight()
853 mutex_lock(&display->backlight.lock); in intel_panel_set_backlight()
855 drm_WARN_ON(display->drm, panel->backlight.max == 0); in intel_panel_set_backlight()
858 panel->backlight.level = hw_level; in intel_panel_set_backlight()
860 if (panel->backlight.enabled) in intel_panel_set_backlight()
863 mutex_unlock(&display->backlight.lock); in intel_panel_set_backlight()
869 struct intel_display *display = to_intel_display(connector); in intel_backlight_device_update_status() local
870 struct intel_panel *panel = &connector->panel; in intel_backlight_device_update_status()
872 drm_modeset_lock(&display->drm->mode_config.connection_mutex, NULL); in intel_backlight_device_update_status()
874 drm_dbg_kms(display->drm, "updating intel_backlight, brightness=%d/%d\n", in intel_backlight_device_update_status()
875 bd->props.brightness, bd->props.max_brightness); in intel_backlight_device_update_status()
876 intel_panel_set_backlight(connector->base.state, bd->props.brightness, in intel_backlight_device_update_status()
877 bd->props.max_brightness); in intel_backlight_device_update_status()
880 * Allow flipping bl_power as a sub-state of enabled. Sadly the in intel_backlight_device_update_status()
885 if (panel->backlight.enabled) { in intel_backlight_device_update_status()
886 if (panel->backlight.power) { in intel_backlight_device_update_status()
887 bool enable = bd->props.power == BACKLIGHT_POWER_ON && in intel_backlight_device_update_status()
888 bd->props.brightness != 0; in intel_backlight_device_update_status()
889 panel->backlight.power(connector, enable); in intel_backlight_device_update_status()
892 bd->props.power = BACKLIGHT_POWER_OFF; in intel_backlight_device_update_status()
895 drm_modeset_unlock(&display->drm->mode_config.connection_mutex); in intel_backlight_device_update_status()
903 struct intel_display *display = to_intel_display(connector); in intel_backlight_device_get_brightness() local
904 struct drm_i915_private *i915 = to_i915(connector->base.dev); in intel_backlight_device_get_brightness()
908 with_intel_runtime_pm(&i915->runtime_pm, wakeref) { in intel_backlight_device_get_brightness()
911 drm_modeset_lock(&display->drm->mode_config.connection_mutex, NULL); in intel_backlight_device_get_brightness()
915 hw_level, bd->props.max_brightness); in intel_backlight_device_get_brightness()
917 drm_modeset_unlock(&display->drm->mode_config.connection_mutex); in intel_backlight_device_get_brightness()
930 struct intel_display *display = to_intel_display(connector); in intel_backlight_device_register() local
931 struct intel_panel *panel = &connector->panel; in intel_backlight_device_register()
937 if (WARN_ON(panel->backlight.device)) in intel_backlight_device_register()
938 return -ENODEV; in intel_backlight_device_register()
940 if (!panel->backlight.present) in intel_backlight_device_register()
943 WARN_ON(panel->backlight.max == 0); in intel_backlight_device_register()
946 drm_info(display->drm, in intel_backlight_device_register()
958 props.max_brightness = panel->backlight.max; in intel_backlight_device_register()
960 panel->backlight.level, in intel_backlight_device_register()
963 if (panel->backlight.enabled) in intel_backlight_device_register()
970 return -ENOMEM; in intel_backlight_device_register()
974 put_device(&bd->dev); in intel_backlight_device_register()
983 name = kasprintf(GFP_KERNEL, "card%d-%s-backlight", in intel_backlight_device_register()
984 display->drm->primary->index, in intel_backlight_device_register()
985 connector->base.name); in intel_backlight_device_register()
987 return -ENOMEM; in intel_backlight_device_register()
989 bd = backlight_device_register(name, connector->base.kdev, connector, in intel_backlight_device_register()
993 drm_err(display->drm, in intel_backlight_device_register()
995 connector->base.base.id, connector->base.name, name, PTR_ERR(bd)); in intel_backlight_device_register()
1000 panel->backlight.device = bd; in intel_backlight_device_register()
1002 drm_dbg_kms(display->drm, in intel_backlight_device_register()
1004 connector->base.base.id, connector->base.name, name); in intel_backlight_device_register()
1014 struct intel_panel *panel = &connector->panel; in intel_backlight_device_unregister()
1016 if (panel->backlight.device) { in intel_backlight_device_unregister()
1017 backlight_device_unregister(panel->backlight.device); in intel_backlight_device_unregister()
1018 panel->backlight.device = NULL; in intel_backlight_device_unregister()
1029 struct intel_display *display = to_intel_display(connector); in cnp_hz_to_pwm() local
1031 return DIV_ROUND_CLOSEST(KHz(DISPLAY_RUNTIME_INFO(display)->rawclk_freq), in cnp_hz_to_pwm()
1050 struct intel_panel *panel = &connector->panel; in spt_hz_to_pwm()
1053 if (panel->backlight.alternate_pwm_increment) in spt_hz_to_pwm()
1068 struct drm_i915_private *i915 = to_i915(connector->base.dev); in lpt_hz_to_pwm()
1069 struct intel_panel *panel = &connector->panel; in lpt_hz_to_pwm()
1072 if (panel->backlight.alternate_pwm_increment) in lpt_hz_to_pwm()
1087 * display raw clocks multiplied by 128.
1091 struct intel_display *display = to_intel_display(connector); in pch_hz_to_pwm() local
1093 return DIV_ROUND_CLOSEST(KHz(DISPLAY_RUNTIME_INFO(display)->rawclk_freq), in pch_hz_to_pwm()
1098 * Gen2: This field determines the number of time base events (display core
1102 * Gen3: A time base event equals the display core clock ([DevPNV] HRAW clock)
1107 struct intel_display *display = to_intel_display(connector); in i9xx_hz_to_pwm() local
1110 if (display->platform.pineview) in i9xx_hz_to_pwm()
1111 clock = KHz(DISPLAY_RUNTIME_INFO(display)->rawclk_freq); in i9xx_hz_to_pwm()
1113 clock = KHz(display->cdclk.hw.cdclk); in i9xx_hz_to_pwm()
1119 * Gen4: This value represents the period of the PWM stream in display core
1125 struct intel_display *display = to_intel_display(connector); in i965_hz_to_pwm() local
1128 if (display->platform.g4x) in i965_hz_to_pwm()
1129 clock = KHz(DISPLAY_RUNTIME_INFO(display)->rawclk_freq); in i965_hz_to_pwm()
1131 clock = KHz(display->cdclk.hw.cdclk); in i965_hz_to_pwm()
1137 * VLV: This value represents the period of the PWM stream in display core
1143 struct intel_display *display = to_intel_display(connector); in vlv_hz_to_pwm() local
1146 if ((intel_de_read(display, CBR1_VLV) & CBR_PWM_CLOCK_MUX_SELECT) == 0) { in vlv_hz_to_pwm()
1147 if (display->platform.cherryview) in vlv_hz_to_pwm()
1153 clock = KHz(DISPLAY_RUNTIME_INFO(display)->rawclk_freq); in vlv_hz_to_pwm()
1162 struct intel_display *display = to_intel_display(connector); in get_vbt_pwm_freq() local
1163 u16 pwm_freq_hz = connector->panel.vbt.backlight.pwm_freq_hz; in get_vbt_pwm_freq()
1166 drm_dbg_kms(display->drm, in get_vbt_pwm_freq()
1171 drm_dbg_kms(display->drm, in get_vbt_pwm_freq()
1181 struct intel_display *display = to_intel_display(connector); in get_backlight_max_vbt() local
1182 struct intel_panel *panel = &connector->panel; in get_backlight_max_vbt()
1186 if (!panel->backlight.pwm_funcs->hz_to_pwm) { in get_backlight_max_vbt()
1187 drm_dbg_kms(display->drm, in get_backlight_max_vbt()
1192 pwm = panel->backlight.pwm_funcs->hz_to_pwm(connector, pwm_freq_hz); in get_backlight_max_vbt()
1194 drm_dbg_kms(display->drm, in get_backlight_max_vbt()
1203 * Note: The setup hooks can't assume pipe is set!
1207 struct intel_display *display = to_intel_display(connector); in get_backlight_min_vbt() local
1208 struct intel_panel *panel = &connector->panel; in get_backlight_min_vbt()
1211 drm_WARN_ON(display->drm, panel->backlight.pwm_level_max == 0); in get_backlight_min_vbt()
1220 min = clamp_t(int, connector->panel.vbt.backlight.min_brightness, 0, 64); in get_backlight_min_vbt()
1221 if (min != connector->panel.vbt.backlight.min_brightness) { in get_backlight_min_vbt()
1222 drm_dbg_kms(display->drm, in get_backlight_min_vbt()
1224 connector->panel.vbt.backlight.min_brightness, min); in get_backlight_min_vbt()
1228 return scale(min, 0, 255, 0, panel->backlight.pwm_level_max); in get_backlight_min_vbt()
1231 static int lpt_setup_backlight(struct intel_connector *connector, enum pipe unused) in lpt_setup_backlight()
1233 struct intel_display *display = to_intel_display(connector); in lpt_setup_backlight() local
1234 struct drm_i915_private *i915 = to_i915(connector->base.dev); in lpt_setup_backlight()
1235 struct intel_panel *panel = &connector->panel; in lpt_setup_backlight()
1240 alt = intel_de_read(display, SOUTH_CHICKEN2) & LPT_PWM_GRANULARITY; in lpt_setup_backlight()
1242 alt = intel_de_read(display, SOUTH_CHICKEN1) & SPT_PWM_GRANULARITY; in lpt_setup_backlight()
1243 panel->backlight.alternate_pwm_increment = alt; in lpt_setup_backlight()
1245 pch_ctl1 = intel_de_read(display, BLC_PWM_PCH_CTL1); in lpt_setup_backlight()
1246 panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY; in lpt_setup_backlight()
1248 pch_ctl2 = intel_de_read(display, BLC_PWM_PCH_CTL2); in lpt_setup_backlight()
1249 panel->backlight.pwm_level_max = pch_ctl2 >> 16; in lpt_setup_backlight()
1251 cpu_ctl2 = intel_de_read(display, BLC_PWM_CPU_CTL2); in lpt_setup_backlight()
1253 if (!panel->backlight.pwm_level_max) in lpt_setup_backlight()
1254 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector); in lpt_setup_backlight()
1256 if (!panel->backlight.pwm_level_max) in lpt_setup_backlight()
1257 return -ENODEV; in lpt_setup_backlight()
1259 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in lpt_setup_backlight()
1261 panel->backlight.pwm_enabled = pch_ctl1 & BLM_PCH_PWM_ENABLE; in lpt_setup_backlight()
1263 cpu_mode = panel->backlight.pwm_enabled && HAS_PCH_LPT(i915) && in lpt_setup_backlight()
1270 drm_dbg_kms(display->drm, in lpt_setup_backlight()
1274 lpt_set_backlight(connector->base.state, val); in lpt_setup_backlight()
1275 intel_de_write(display, BLC_PWM_PCH_CTL1, in lpt_setup_backlight()
1278 intel_de_write(display, BLC_PWM_CPU_CTL2, in lpt_setup_backlight()
1282 drm_dbg_kms(display->drm, in lpt_setup_backlight()
1284 connector->base.base.id, connector->base.name); in lpt_setup_backlight()
1289 static int pch_setup_backlight(struct intel_connector *connector, enum pipe unused) in pch_setup_backlight()
1291 struct intel_display *display = to_intel_display(connector); in pch_setup_backlight() local
1292 struct intel_panel *panel = &connector->panel; in pch_setup_backlight()
1295 pch_ctl1 = intel_de_read(display, BLC_PWM_PCH_CTL1); in pch_setup_backlight()
1296 panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY; in pch_setup_backlight()
1298 pch_ctl2 = intel_de_read(display, BLC_PWM_PCH_CTL2); in pch_setup_backlight()
1299 panel->backlight.pwm_level_max = pch_ctl2 >> 16; in pch_setup_backlight()
1301 if (!panel->backlight.pwm_level_max) in pch_setup_backlight()
1302 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector); in pch_setup_backlight()
1304 if (!panel->backlight.pwm_level_max) in pch_setup_backlight()
1305 return -ENODEV; in pch_setup_backlight()
1307 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in pch_setup_backlight()
1309 cpu_ctl2 = intel_de_read(display, BLC_PWM_CPU_CTL2); in pch_setup_backlight()
1310 panel->backlight.pwm_enabled = (cpu_ctl2 & BLM_PWM_ENABLE) && in pch_setup_backlight()
1313 drm_dbg_kms(display->drm, in pch_setup_backlight()
1315 connector->base.base.id, connector->base.name); in pch_setup_backlight()
1320 static int i9xx_setup_backlight(struct intel_connector *connector, enum pipe unused) in i9xx_setup_backlight()
1322 struct intel_display *display = to_intel_display(connector); in i9xx_setup_backlight() local
1323 struct intel_panel *panel = &connector->panel; in i9xx_setup_backlight()
1326 ctl = intel_de_read(display, BLC_PWM_CTL); in i9xx_setup_backlight()
1328 if (DISPLAY_VER(display) == 2 || display->platform.i915gm || display->platform.i945gm) in i9xx_setup_backlight()
1329 panel->backlight.combination_mode = ctl & BLM_LEGACY_MODE; in i9xx_setup_backlight()
1331 if (display->platform.pineview) in i9xx_setup_backlight()
1332 panel->backlight.active_low_pwm = ctl & BLM_POLARITY_PNV; in i9xx_setup_backlight()
1334 panel->backlight.pwm_level_max = ctl >> 17; in i9xx_setup_backlight()
1336 if (!panel->backlight.pwm_level_max) { in i9xx_setup_backlight()
1337 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector); in i9xx_setup_backlight()
1338 panel->backlight.pwm_level_max >>= 1; in i9xx_setup_backlight()
1341 if (!panel->backlight.pwm_level_max) in i9xx_setup_backlight()
1342 return -ENODEV; in i9xx_setup_backlight()
1344 if (panel->backlight.combination_mode) in i9xx_setup_backlight()
1345 panel->backlight.pwm_level_max *= 0xff; in i9xx_setup_backlight()
1347 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in i9xx_setup_backlight()
1351 val = clamp(val, panel->backlight.pwm_level_min, panel->backlight.pwm_level_max); in i9xx_setup_backlight()
1353 panel->backlight.pwm_enabled = val != 0; in i9xx_setup_backlight()
1355 drm_dbg_kms(display->drm, in i9xx_setup_backlight()
1357 connector->base.base.id, connector->base.name); in i9xx_setup_backlight()
1362 static int i965_setup_backlight(struct intel_connector *connector, enum pipe unused) in i965_setup_backlight()
1364 struct intel_display *display = to_intel_display(connector); in i965_setup_backlight() local
1365 struct intel_panel *panel = &connector->panel; in i965_setup_backlight()
1368 ctl2 = intel_de_read(display, BLC_PWM_CTL2); in i965_setup_backlight()
1369 panel->backlight.combination_mode = ctl2 & BLM_COMBINATION_MODE; in i965_setup_backlight()
1370 panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965; in i965_setup_backlight()
1372 ctl = intel_de_read(display, BLC_PWM_CTL); in i965_setup_backlight()
1373 panel->backlight.pwm_level_max = ctl >> 16; in i965_setup_backlight()
1375 if (!panel->backlight.pwm_level_max) in i965_setup_backlight()
1376 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector); in i965_setup_backlight()
1378 if (!panel->backlight.pwm_level_max) in i965_setup_backlight()
1379 return -ENODEV; in i965_setup_backlight()
1381 if (panel->backlight.combination_mode) in i965_setup_backlight()
1382 panel->backlight.pwm_level_max *= 0xff; in i965_setup_backlight()
1384 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in i965_setup_backlight()
1386 panel->backlight.pwm_enabled = ctl2 & BLM_PWM_ENABLE; in i965_setup_backlight()
1388 drm_dbg_kms(display->drm, in i965_setup_backlight()
1390 connector->base.base.id, connector->base.name); in i965_setup_backlight()
1395 static int vlv_setup_backlight(struct intel_connector *connector, enum pipe pipe) in vlv_setup_backlight() argument
1397 struct intel_display *display = to_intel_display(connector); in vlv_setup_backlight() local
1398 struct intel_panel *panel = &connector->panel; in vlv_setup_backlight()
1401 if (drm_WARN_ON(display->drm, pipe != PIPE_A && pipe != PIPE_B)) in vlv_setup_backlight()
1402 return -ENODEV; in vlv_setup_backlight()
1404 ctl2 = intel_de_read(display, VLV_BLC_PWM_CTL2(pipe)); in vlv_setup_backlight()
1405 panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965; in vlv_setup_backlight()
1407 ctl = intel_de_read(display, VLV_BLC_PWM_CTL(pipe)); in vlv_setup_backlight()
1408 panel->backlight.pwm_level_max = ctl >> 16; in vlv_setup_backlight()
1410 if (!panel->backlight.pwm_level_max) in vlv_setup_backlight()
1411 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector); in vlv_setup_backlight()
1413 if (!panel->backlight.pwm_level_max) in vlv_setup_backlight()
1414 return -ENODEV; in vlv_setup_backlight()
1416 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in vlv_setup_backlight()
1418 panel->backlight.pwm_enabled = ctl2 & BLM_PWM_ENABLE; in vlv_setup_backlight()
1420 drm_dbg_kms(display->drm, in vlv_setup_backlight()
1421 "[CONNECTOR:%d:%s] Using native PWM for backlight control (on pipe %c)\n", in vlv_setup_backlight()
1422 connector->base.base.id, connector->base.name, pipe_name(pipe)); in vlv_setup_backlight()
1428 bxt_setup_backlight(struct intel_connector *connector, enum pipe unused) in bxt_setup_backlight()
1430 struct intel_display *display = to_intel_display(connector); in bxt_setup_backlight() local
1431 struct intel_panel *panel = &connector->panel; in bxt_setup_backlight()
1434 panel->backlight.controller = connector->panel.vbt.backlight.controller; in bxt_setup_backlight()
1436 pwm_ctl = intel_de_read(display, in bxt_setup_backlight()
1437 BXT_BLC_PWM_CTL(panel->backlight.controller)); in bxt_setup_backlight()
1440 if (panel->backlight.controller == 1) { in bxt_setup_backlight()
1441 val = intel_de_read(display, UTIL_PIN_CTL); in bxt_setup_backlight()
1442 panel->backlight.util_pin_active_low = in bxt_setup_backlight()
1446 panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY; in bxt_setup_backlight()
1447 panel->backlight.pwm_level_max = in bxt_setup_backlight()
1448 intel_de_read(display, BXT_BLC_PWM_FREQ(panel->backlight.controller)); in bxt_setup_backlight()
1450 if (!panel->backlight.pwm_level_max) in bxt_setup_backlight()
1451 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector); in bxt_setup_backlight()
1453 if (!panel->backlight.pwm_level_max) in bxt_setup_backlight()
1454 return -ENODEV; in bxt_setup_backlight()
1456 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in bxt_setup_backlight()
1458 panel->backlight.pwm_enabled = pwm_ctl & BXT_BLC_PWM_ENABLE; in bxt_setup_backlight()
1460 drm_dbg_kms(display->drm, in bxt_setup_backlight()
1462 connector->base.base.id, connector->base.name, in bxt_setup_backlight()
1463 panel->backlight.controller); in bxt_setup_backlight()
1468 static int cnp_num_backlight_controllers(struct intel_display *display) in cnp_num_backlight_controllers() argument
1470 struct drm_i915_private *i915 = to_i915(display->drm); in cnp_num_backlight_controllers()
1484 static bool cnp_backlight_controller_is_valid(struct intel_display *display, int controller) in cnp_backlight_controller_is_valid() argument
1486 struct drm_i915_private *i915 = to_i915(display->drm); in cnp_backlight_controller_is_valid()
1488 if (controller < 0 || controller >= cnp_num_backlight_controllers(display)) in cnp_backlight_controller_is_valid()
1494 return intel_de_read(display, SOUTH_CHICKEN1) & ICP_SECOND_PPS_IO_SELECT; in cnp_backlight_controller_is_valid()
1500 cnp_setup_backlight(struct intel_connector *connector, enum pipe unused) in cnp_setup_backlight()
1502 struct intel_display *display = to_intel_display(connector); in cnp_setup_backlight() local
1503 struct intel_panel *panel = &connector->panel; in cnp_setup_backlight()
1510 panel->backlight.controller = connector->panel.vbt.backlight.controller; in cnp_setup_backlight()
1511 if (!cnp_backlight_controller_is_valid(display, panel->backlight.controller)) { in cnp_setup_backlight()
1512 drm_dbg_kms(display->drm, in cnp_setup_backlight()
1514 connector->base.base.id, connector->base.name, in cnp_setup_backlight()
1515 panel->backlight.controller); in cnp_setup_backlight()
1516 panel->backlight.controller = 0; in cnp_setup_backlight()
1519 pwm_ctl = intel_de_read(display, in cnp_setup_backlight()
1520 BXT_BLC_PWM_CTL(panel->backlight.controller)); in cnp_setup_backlight()
1522 panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY; in cnp_setup_backlight()
1523 panel->backlight.pwm_level_max = in cnp_setup_backlight()
1524 intel_de_read(display, BXT_BLC_PWM_FREQ(panel->backlight.controller)); in cnp_setup_backlight()
1526 if (!panel->backlight.pwm_level_max) in cnp_setup_backlight()
1527 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector); in cnp_setup_backlight()
1529 if (!panel->backlight.pwm_level_max) in cnp_setup_backlight()
1530 return -ENODEV; in cnp_setup_backlight()
1532 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in cnp_setup_backlight()
1534 panel->backlight.pwm_enabled = pwm_ctl & BXT_BLC_PWM_ENABLE; in cnp_setup_backlight()
1536 drm_dbg_kms(display->drm, in cnp_setup_backlight()
1538 connector->base.base.id, connector->base.name, in cnp_setup_backlight()
1539 panel->backlight.controller); in cnp_setup_backlight()
1545 enum pipe pipe) in ext_pwm_setup_backlight() argument
1547 struct intel_display *display = to_intel_display(connector); in ext_pwm_setup_backlight() local
1548 struct intel_panel *panel = &connector->panel; in ext_pwm_setup_backlight()
1553 if (connector->panel.vbt.dsi.config->pwm_blc == PPS_BLC_PMIC) { in ext_pwm_setup_backlight()
1554 panel->backlight.pwm = pwm_get(display->drm->dev, in ext_pwm_setup_backlight()
1558 panel->backlight.pwm = pwm_get(display->drm->dev, in ext_pwm_setup_backlight()
1563 if (IS_ERR(panel->backlight.pwm)) { in ext_pwm_setup_backlight()
1564 drm_err(display->drm, in ext_pwm_setup_backlight()
1566 connector->base.base.id, connector->base.name, desc); in ext_pwm_setup_backlight()
1567 panel->backlight.pwm = NULL; in ext_pwm_setup_backlight()
1568 return -ENODEV; in ext_pwm_setup_backlight()
1571 panel->backlight.pwm_level_max = 100; /* 100% */ in ext_pwm_setup_backlight()
1572 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in ext_pwm_setup_backlight()
1574 if (pwm_is_enabled(panel->backlight.pwm)) { in ext_pwm_setup_backlight()
1576 pwm_get_state(panel->backlight.pwm, &panel->backlight.pwm_state); in ext_pwm_setup_backlight()
1578 level = pwm_get_relative_duty_cycle(&panel->backlight.pwm_state, in ext_pwm_setup_backlight()
1581 panel->backlight.pwm_enabled = true; in ext_pwm_setup_backlight()
1583 drm_dbg_kms(display->drm, in ext_pwm_setup_backlight()
1585 connector->base.base.id, connector->base.name, in ext_pwm_setup_backlight()
1586 NSEC_PER_SEC / (unsigned long)panel->backlight.pwm_state.period, in ext_pwm_setup_backlight()
1590 panel->backlight.pwm_state.period = in ext_pwm_setup_backlight()
1594 drm_dbg_kms(display->drm, in ext_pwm_setup_backlight()
1596 connector->base.base.id, connector->base.name, desc); in ext_pwm_setup_backlight()
1603 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_pwm_set_backlight()
1604 struct intel_panel *panel = &connector->panel; in intel_pwm_set_backlight()
1606 panel->backlight.pwm_funcs->set(conn_state, in intel_pwm_set_backlight()
1610 static u32 intel_pwm_get_backlight(struct intel_connector *connector, enum pipe pipe) in intel_pwm_get_backlight() argument
1612 struct intel_panel *panel = &connector->panel; in intel_pwm_get_backlight()
1615 panel->backlight.pwm_funcs->get(connector, pipe)); in intel_pwm_get_backlight()
1621 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_pwm_enable_backlight()
1622 struct intel_panel *panel = &connector->panel; in intel_pwm_enable_backlight()
1624 panel->backlight.pwm_funcs->enable(crtc_state, conn_state, in intel_pwm_enable_backlight()
1630 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_pwm_disable_backlight()
1631 struct intel_panel *panel = &connector->panel; in intel_pwm_disable_backlight()
1633 panel->backlight.pwm_funcs->disable(conn_state, in intel_pwm_disable_backlight()
1637 static int intel_pwm_setup_backlight(struct intel_connector *connector, enum pipe pipe) in intel_pwm_setup_backlight() argument
1639 struct intel_panel *panel = &connector->panel; in intel_pwm_setup_backlight()
1642 ret = panel->backlight.pwm_funcs->setup(connector, pipe); in intel_pwm_setup_backlight()
1646 panel->backlight.min = panel->backlight.pwm_level_min; in intel_pwm_setup_backlight()
1647 panel->backlight.max = panel->backlight.pwm_level_max; in intel_pwm_setup_backlight()
1648 panel->backlight.level = intel_pwm_get_backlight(connector, pipe); in intel_pwm_setup_backlight()
1649 panel->backlight.enabled = panel->backlight.pwm_enabled; in intel_pwm_setup_backlight()
1659 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_backlight_update()
1660 struct intel_display *display = to_intel_display(connector); in intel_backlight_update() local
1661 struct intel_panel *panel = &connector->panel; in intel_backlight_update()
1663 if (!panel->backlight.present) in intel_backlight_update()
1666 mutex_lock(&display->backlight.lock); in intel_backlight_update()
1667 if (!panel->backlight.enabled) in intel_backlight_update()
1670 mutex_unlock(&display->backlight.lock); in intel_backlight_update()
1673 int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe) in intel_backlight_setup() argument
1675 struct intel_display *display = to_intel_display(connector); in intel_backlight_setup() local
1676 struct intel_panel *panel = &connector->panel; in intel_backlight_setup()
1679 if (!connector->panel.vbt.backlight.present) { in intel_backlight_setup()
1680 if (intel_has_quirk(display, QUIRK_BACKLIGHT_PRESENT)) { in intel_backlight_setup()
1681 drm_dbg_kms(display->drm, in intel_backlight_setup()
1683 connector->base.base.id, connector->base.name); in intel_backlight_setup()
1685 drm_dbg_kms(display->drm, in intel_backlight_setup()
1687 connector->base.base.id, connector->base.name); in intel_backlight_setup()
1693 if (drm_WARN_ON(display->drm, !panel->backlight.funcs)) in intel_backlight_setup()
1694 return -ENODEV; in intel_backlight_setup()
1697 mutex_lock(&display->backlight.lock); in intel_backlight_setup()
1698 ret = panel->backlight.funcs->setup(connector, pipe); in intel_backlight_setup()
1699 mutex_unlock(&display->backlight.lock); in intel_backlight_setup()
1702 drm_dbg_kms(display->drm, in intel_backlight_setup()
1704 connector->base.base.id, connector->base.name); in intel_backlight_setup()
1708 panel->backlight.present = true; in intel_backlight_setup()
1710 drm_dbg_kms(display->drm, in intel_backlight_setup()
1712 connector->base.base.id, connector->base.name, in intel_backlight_setup()
1713 str_enabled_disabled(panel->backlight.enabled), in intel_backlight_setup()
1714 panel->backlight.level, panel->backlight.max); in intel_backlight_setup()
1722 if (panel->backlight.pwm) in intel_backlight_destroy()
1723 pwm_put(panel->backlight.pwm); in intel_backlight_destroy()
1725 panel->backlight.present = false; in intel_backlight_destroy()
1821 struct intel_display *display = to_intel_display(connector); in intel_backlight_init_funcs() local
1822 struct drm_i915_private *i915 = to_i915(connector->base.dev); in intel_backlight_init_funcs()
1824 if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI && in intel_backlight_init_funcs()
1828 if (display->platform.geminilake || display->platform.broxton) { in intel_backlight_init_funcs()
1829 panel->backlight.pwm_funcs = &bxt_pwm_funcs; in intel_backlight_init_funcs()
1831 panel->backlight.pwm_funcs = &cnp_pwm_funcs; in intel_backlight_init_funcs()
1834 panel->backlight.pwm_funcs = &lpt_pwm_funcs; in intel_backlight_init_funcs()
1836 panel->backlight.pwm_funcs = &spt_pwm_funcs; in intel_backlight_init_funcs()
1838 panel->backlight.pwm_funcs = &pch_pwm_funcs; in intel_backlight_init_funcs()
1839 } else if (display->platform.valleyview || display->platform.cherryview) { in intel_backlight_init_funcs()
1840 if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI) { in intel_backlight_init_funcs()
1841 panel->backlight.pwm_funcs = &ext_pwm_funcs; in intel_backlight_init_funcs()
1843 panel->backlight.pwm_funcs = &vlv_pwm_funcs; in intel_backlight_init_funcs()
1845 } else if (DISPLAY_VER(display) == 4) { in intel_backlight_init_funcs()
1846 panel->backlight.pwm_funcs = &i965_pwm_funcs; in intel_backlight_init_funcs()
1848 panel->backlight.pwm_funcs = &i9xx_pwm_funcs; in intel_backlight_init_funcs()
1851 if (connector->base.connector_type == DRM_MODE_CONNECTOR_eDP) { in intel_backlight_init_funcs()
1855 if (!intel_has_quirk(display, QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK)) in intel_backlight_init_funcs()
1856 connector->panel.backlight.power = intel_pps_backlight_power; in intel_backlight_init_funcs()
1860 panel->backlight.funcs = &pwm_bl_funcs; in intel_backlight_init_funcs()