Lines Matching +full:pwm +full:- +full:backlight
2 * Copyright © 2006-2010 Intel Corporation
28 * Chris Wilson <chris@chris-wilson.co.uk>
35 #include <linux/pwm.h>
59 downclock_mode->clock < fixed_mode->clock; in is_downclock_mode()
66 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_edid_downclock_mode()
69 int best_clock = fixed_mode->clock; in intel_panel_edid_downclock_mode()
71 list_for_each_entry(scan, &connector->base.probed_modes, head) { in intel_panel_edid_downclock_mode()
80 scan->clock < best_clock) { in intel_panel_edid_downclock_mode()
85 best_clock = scan->clock; in intel_panel_edid_downclock_mode()
93 downclock_mode = drm_mode_duplicate(&dev_priv->drm, best_mode); in intel_panel_edid_downclock_mode()
97 drm_dbg_kms(&dev_priv->drm, in intel_panel_edid_downclock_mode()
99 connector->base.base.id, connector->base.name); in intel_panel_edid_downclock_mode()
108 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_edid_fixed_mode()
112 if (list_empty(&connector->base.probed_modes)) in intel_panel_edid_fixed_mode()
116 list_for_each_entry(scan, &connector->base.probed_modes, head) { in intel_panel_edid_fixed_mode()
117 if ((scan->type & DRM_MODE_TYPE_PREFERRED) == 0) in intel_panel_edid_fixed_mode()
120 fixed_mode = drm_mode_duplicate(&dev_priv->drm, scan); in intel_panel_edid_fixed_mode()
124 drm_dbg_kms(&dev_priv->drm, in intel_panel_edid_fixed_mode()
126 connector->base.base.id, connector->base.name); in intel_panel_edid_fixed_mode()
132 scan = list_first_entry(&connector->base.probed_modes, in intel_panel_edid_fixed_mode()
135 fixed_mode = drm_mode_duplicate(&dev_priv->drm, scan); in intel_panel_edid_fixed_mode()
139 fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; in intel_panel_edid_fixed_mode()
141 drm_dbg_kms(&dev_priv->drm, in intel_panel_edid_fixed_mode()
143 connector->base.base.id, connector->base.name); in intel_panel_edid_fixed_mode()
152 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_vbt_fixed_mode()
153 struct drm_display_info *info = &connector->base.display_info; in intel_panel_vbt_fixed_mode()
156 if (!dev_priv->vbt.lfp_lvds_vbt_mode) in intel_panel_vbt_fixed_mode()
159 fixed_mode = drm_mode_duplicate(&dev_priv->drm, in intel_panel_vbt_fixed_mode()
160 dev_priv->vbt.lfp_lvds_vbt_mode); in intel_panel_vbt_fixed_mode()
164 fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; in intel_panel_vbt_fixed_mode()
166 drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s] using mode from VBT: ", in intel_panel_vbt_fixed_mode()
167 connector->base.base.id, connector->base.name); in intel_panel_vbt_fixed_mode()
170 info->width_mm = fixed_mode->width_mm; in intel_panel_vbt_fixed_mode()
171 info->height_mm = fixed_mode->height_mm; in intel_panel_vbt_fixed_mode()
181 &crtc_state->hw.adjusted_mode; in intel_pch_panel_fitting()
185 if (adjusted_mode->crtc_hdisplay == crtc_state->pipe_src_w && in intel_pch_panel_fitting()
186 adjusted_mode->crtc_vdisplay == crtc_state->pipe_src_h && in intel_pch_panel_fitting()
187 crtc_state->output_format != INTEL_OUTPUT_FORMAT_YCBCR420) in intel_pch_panel_fitting()
190 switch (conn_state->scaling_mode) { in intel_pch_panel_fitting()
192 width = crtc_state->pipe_src_w; in intel_pch_panel_fitting()
193 height = crtc_state->pipe_src_h; in intel_pch_panel_fitting()
194 x = (adjusted_mode->crtc_hdisplay - width + 1)/2; in intel_pch_panel_fitting()
195 y = (adjusted_mode->crtc_vdisplay - height + 1)/2; in intel_pch_panel_fitting()
201 u32 scaled_width = adjusted_mode->crtc_hdisplay in intel_pch_panel_fitting()
202 * crtc_state->pipe_src_h; in intel_pch_panel_fitting()
203 u32 scaled_height = crtc_state->pipe_src_w in intel_pch_panel_fitting()
204 * adjusted_mode->crtc_vdisplay; in intel_pch_panel_fitting()
206 width = scaled_height / crtc_state->pipe_src_h; in intel_pch_panel_fitting()
209 x = (adjusted_mode->crtc_hdisplay - width + 1) / 2; in intel_pch_panel_fitting()
211 height = adjusted_mode->crtc_vdisplay; in intel_pch_panel_fitting()
213 height = scaled_width / crtc_state->pipe_src_w; in intel_pch_panel_fitting()
216 y = (adjusted_mode->crtc_vdisplay - height + 1) / 2; in intel_pch_panel_fitting()
218 width = adjusted_mode->crtc_hdisplay; in intel_pch_panel_fitting()
221 width = adjusted_mode->crtc_hdisplay; in intel_pch_panel_fitting()
222 height = adjusted_mode->crtc_vdisplay; in intel_pch_panel_fitting()
228 WARN_ON(adjusted_mode->crtc_hdisplay != crtc_state->pipe_src_w); in intel_pch_panel_fitting()
229 WARN_ON(adjusted_mode->crtc_vdisplay != crtc_state->pipe_src_h); in intel_pch_panel_fitting()
233 width = adjusted_mode->crtc_hdisplay; in intel_pch_panel_fitting()
234 height = adjusted_mode->crtc_vdisplay; in intel_pch_panel_fitting()
238 MISSING_CASE(conn_state->scaling_mode); in intel_pch_panel_fitting()
239 return -EINVAL; in intel_pch_panel_fitting()
242 drm_rect_init(&crtc_state->pch_pfit.dst, in intel_pch_panel_fitting()
244 crtc_state->pch_pfit.enabled = true; in intel_pch_panel_fitting()
256 sync_width = adjusted_mode->crtc_hsync_end - adjusted_mode->crtc_hsync_start; in centre_horizontally()
257 blank_width = adjusted_mode->crtc_hblank_end - adjusted_mode->crtc_hblank_start; in centre_horizontally()
258 sync_pos = (blank_width - sync_width + 1) / 2; in centre_horizontally()
260 border = (adjusted_mode->crtc_hdisplay - width + 1) / 2; in centre_horizontally()
263 adjusted_mode->crtc_hdisplay = width; in centre_horizontally()
264 adjusted_mode->crtc_hblank_start = width + border; in centre_horizontally()
265 adjusted_mode->crtc_hblank_end = adjusted_mode->crtc_hblank_start + blank_width; in centre_horizontally()
267 adjusted_mode->crtc_hsync_start = adjusted_mode->crtc_hblank_start + sync_pos; in centre_horizontally()
268 adjusted_mode->crtc_hsync_end = adjusted_mode->crtc_hsync_start + sync_width; in centre_horizontally()
278 sync_width = adjusted_mode->crtc_vsync_end - adjusted_mode->crtc_vsync_start; in centre_vertically()
279 blank_width = adjusted_mode->crtc_vblank_end - adjusted_mode->crtc_vblank_start; in centre_vertically()
280 sync_pos = (blank_width - sync_width + 1) / 2; in centre_vertically()
282 border = (adjusted_mode->crtc_vdisplay - height + 1) / 2; in centre_vertically()
284 adjusted_mode->crtc_vdisplay = height; in centre_vertically()
285 adjusted_mode->crtc_vblank_start = height + border; in centre_vertically()
286 adjusted_mode->crtc_vblank_end = adjusted_mode->crtc_vblank_start + blank_width; in centre_vertically()
288 adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vblank_start + sync_pos; in centre_vertically()
289 adjusted_mode->crtc_vsync_end = adjusted_mode->crtc_vsync_start + sync_width; in centre_vertically()
309 &crtc_state->hw.adjusted_mode; in i965_scale_aspect()
310 u32 scaled_width = adjusted_mode->crtc_hdisplay * in i965_scale_aspect()
311 crtc_state->pipe_src_h; in i965_scale_aspect()
312 u32 scaled_height = crtc_state->pipe_src_w * in i965_scale_aspect()
313 adjusted_mode->crtc_vdisplay; in i965_scale_aspect()
322 else if (adjusted_mode->crtc_hdisplay != crtc_state->pipe_src_w) in i965_scale_aspect()
330 struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; in i9xx_scale_aspect()
331 u32 scaled_width = adjusted_mode->crtc_hdisplay * in i9xx_scale_aspect()
332 crtc_state->pipe_src_h; in i9xx_scale_aspect()
333 u32 scaled_height = crtc_state->pipe_src_w * in i9xx_scale_aspect()
334 adjusted_mode->crtc_vdisplay; in i9xx_scale_aspect()
345 crtc_state->pipe_src_h); in i9xx_scale_aspect()
348 if (crtc_state->pipe_src_h != adjusted_mode->crtc_vdisplay) { in i9xx_scale_aspect()
349 bits = panel_fitter_scaling(crtc_state->pipe_src_h, in i9xx_scale_aspect()
350 adjusted_mode->crtc_vdisplay); in i9xx_scale_aspect()
361 crtc_state->pipe_src_w); in i9xx_scale_aspect()
364 if (crtc_state->pipe_src_w != adjusted_mode->crtc_hdisplay) { in i9xx_scale_aspect()
365 bits = panel_fitter_scaling(crtc_state->pipe_src_w, in i9xx_scale_aspect()
366 adjusted_mode->crtc_hdisplay); in i9xx_scale_aspect()
386 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in intel_gmch_panel_fitting()
387 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); in intel_gmch_panel_fitting()
389 struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; in intel_gmch_panel_fitting()
392 if (adjusted_mode->crtc_hdisplay == crtc_state->pipe_src_w && in intel_gmch_panel_fitting()
393 adjusted_mode->crtc_vdisplay == crtc_state->pipe_src_h) in intel_gmch_panel_fitting()
396 switch (conn_state->scaling_mode) { in intel_gmch_panel_fitting()
402 centre_horizontally(adjusted_mode, crtc_state->pipe_src_w); in intel_gmch_panel_fitting()
403 centre_vertically(adjusted_mode, crtc_state->pipe_src_h); in intel_gmch_panel_fitting()
419 if (crtc_state->pipe_src_h != adjusted_mode->crtc_vdisplay || in intel_gmch_panel_fitting()
420 crtc_state->pipe_src_w != adjusted_mode->crtc_hdisplay) { in intel_gmch_panel_fitting()
432 MISSING_CASE(conn_state->scaling_mode); in intel_gmch_panel_fitting()
433 return -EINVAL; in intel_gmch_panel_fitting()
439 pfit_control |= PFIT_PIPE(crtc->pipe) | PFIT_FILTER_FUZZY; in intel_gmch_panel_fitting()
447 /* Make sure pre-965 set dither correctly for 18bpp panels. */ in intel_gmch_panel_fitting()
448 if (INTEL_GEN(dev_priv) < 4 && crtc_state->pipe_bpp == 18) in intel_gmch_panel_fitting()
451 crtc_state->gmch_pfit.control = pfit_control; in intel_gmch_panel_fitting()
452 crtc_state->gmch_pfit.pgm_ratios = pfit_pgm_ratios; in intel_gmch_panel_fitting()
453 crtc_state->gmch_pfit.lvds_border_bits = border; in intel_gmch_panel_fitting()
459 * scale - scale values from one range to another
482 target_val = mul_u32_u32(source_val - source_min, in scale()
483 target_max - target_min); in scale()
484 target_val = DIV_ROUND_CLOSEST_ULL(target_val, source_max - source_min); in scale()
495 struct intel_panel *panel = &connector->panel; in clamp_user_to_hw()
498 hw_level = scale(user_level, 0, user_max, 0, panel->backlight.max); in clamp_user_to_hw()
499 hw_level = clamp(hw_level, panel->backlight.min, panel->backlight.max); in clamp_user_to_hw()
508 struct intel_panel *panel = &connector->panel; in scale_hw_to_user()
510 return scale(hw_level, panel->backlight.min, panel->backlight.max, in scale_hw_to_user()
517 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_compute_brightness()
518 struct intel_panel *panel = &connector->panel; in intel_panel_compute_brightness()
520 drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0); in intel_panel_compute_brightness()
522 if (dev_priv->params.invert_brightness < 0) in intel_panel_compute_brightness()
525 if (dev_priv->params.invert_brightness > 0 || in intel_panel_compute_brightness()
526 dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS) { in intel_panel_compute_brightness()
527 return panel->backlight.max - val + panel->backlight.min; in intel_panel_compute_brightness()
535 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in lpt_get_backlight()
542 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in pch_get_backlight()
549 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i9xx_get_backlight()
550 struct intel_panel *panel = &connector->panel; in i9xx_get_backlight()
557 if (panel->backlight.combination_mode) { in i9xx_get_backlight()
560 pci_read_config_byte(dev_priv->drm.pdev, LBPC, &lbpc); in i9xx_get_backlight()
569 if (drm_WARN_ON(&dev_priv->drm, pipe != PIPE_A && pipe != PIPE_B)) in _vlv_get_backlight()
577 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in vlv_get_backlight()
585 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in bxt_get_backlight()
586 struct intel_panel *panel = &connector->panel; in bxt_get_backlight()
589 BXT_BLC_PWM_DUTY(panel->backlight.controller)); in bxt_get_backlight()
594 struct intel_panel *panel = &connector->panel; in pwm_get_backlight()
597 pwm_get_state(panel->backlight.pwm, &state); in pwm_get_backlight()
603 struct intel_connector *connector = to_intel_connector(conn_state->connector); in lpt_set_backlight()
604 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in lpt_set_backlight()
612 struct intel_connector *connector = to_intel_connector(conn_state->connector); in pch_set_backlight()
613 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in pch_set_backlight()
622 struct intel_connector *connector = to_intel_connector(conn_state->connector); in i9xx_set_backlight()
623 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i9xx_set_backlight()
624 struct intel_panel *panel = &connector->panel; in i9xx_set_backlight()
627 drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0); in i9xx_set_backlight()
629 if (panel->backlight.combination_mode) { in i9xx_set_backlight()
632 lbpc = level * 0xfe / panel->backlight.max + 1; in i9xx_set_backlight()
634 pci_write_config_byte(dev_priv->drm.pdev, LBPC, lbpc); in i9xx_set_backlight()
650 struct intel_connector *connector = to_intel_connector(conn_state->connector); in vlv_set_backlight()
651 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in vlv_set_backlight()
652 enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe; in vlv_set_backlight()
661 struct intel_connector *connector = to_intel_connector(conn_state->connector); in bxt_set_backlight()
662 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in bxt_set_backlight()
663 struct intel_panel *panel = &connector->panel; in bxt_set_backlight()
666 BXT_BLC_PWM_DUTY(panel->backlight.controller), level); in bxt_set_backlight()
671 struct intel_panel *panel = &to_intel_connector(conn_state->connector)->panel; in pwm_set_backlight()
673 pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100); in pwm_set_backlight()
674 pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state); in pwm_set_backlight()
680 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_panel_actually_set_backlight()
681 struct drm_i915_private *i915 = to_i915(connector->base.dev); in intel_panel_actually_set_backlight()
682 struct intel_panel *panel = &connector->panel; in intel_panel_actually_set_backlight()
684 drm_dbg_kms(&i915->drm, "set backlight PWM = %d\n", level); in intel_panel_actually_set_backlight()
687 panel->backlight.set(conn_state, level); in intel_panel_actually_set_backlight()
690 /* set backlight brightness to level in range [0..max], assuming hw min is
696 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_panel_set_backlight_acpi()
697 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_set_backlight_acpi()
698 struct intel_panel *panel = &connector->panel; in intel_panel_set_backlight_acpi()
703 * connection_mutex isn't held across the entire backlight in intel_panel_set_backlight_acpi()
707 if (!panel->backlight.present || !conn_state->crtc) in intel_panel_set_backlight_acpi()
710 mutex_lock(&dev_priv->backlight_lock); in intel_panel_set_backlight_acpi()
712 drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0); in intel_panel_set_backlight_acpi()
715 panel->backlight.level = hw_level; in intel_panel_set_backlight_acpi()
717 if (panel->backlight.device) in intel_panel_set_backlight_acpi()
718 panel->backlight.device->props.brightness = in intel_panel_set_backlight_acpi()
720 panel->backlight.level, in intel_panel_set_backlight_acpi()
721 panel->backlight.device->props.max_brightness); in intel_panel_set_backlight_acpi()
723 if (panel->backlight.enabled) in intel_panel_set_backlight_acpi()
726 mutex_unlock(&dev_priv->backlight_lock); in intel_panel_set_backlight_acpi()
731 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in lpt_disable_backlight()
732 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in lpt_disable_backlight()
738 * Although we don't support or enable CPU PWM with LPT/SPT based in lpt_disable_backlight()
742 * This needs rework if we need to add support for CPU PWM on PCH split in lpt_disable_backlight()
747 drm_dbg_kms(&dev_priv->drm, in lpt_disable_backlight()
748 "cpu backlight was enabled, disabling\n"); in lpt_disable_backlight()
759 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in pch_disable_backlight()
760 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in pch_disable_backlight()
779 struct drm_i915_private *dev_priv = to_i915(old_conn_state->connector->dev); in i965_disable_backlight()
790 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in vlv_disable_backlight()
791 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in vlv_disable_backlight()
792 enum pipe pipe = to_intel_crtc(old_conn_state->crtc)->pipe; in vlv_disable_backlight()
804 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in bxt_disable_backlight()
805 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in bxt_disable_backlight()
806 struct intel_panel *panel = &connector->panel; in bxt_disable_backlight()
812 BXT_BLC_PWM_CTL(panel->backlight.controller)); in bxt_disable_backlight()
813 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller), in bxt_disable_backlight()
816 if (panel->backlight.controller == 1) { in bxt_disable_backlight()
825 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in cnp_disable_backlight()
826 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in cnp_disable_backlight()
827 struct intel_panel *panel = &connector->panel; in cnp_disable_backlight()
833 BXT_BLC_PWM_CTL(panel->backlight.controller)); in cnp_disable_backlight()
834 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller), in cnp_disable_backlight()
840 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in pwm_disable_backlight()
841 struct intel_panel *panel = &connector->panel; in pwm_disable_backlight()
843 panel->backlight.pwm_state.enabled = false; in pwm_disable_backlight()
844 pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state); in pwm_disable_backlight()
849 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in intel_panel_disable_backlight()
850 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_disable_backlight()
851 struct intel_panel *panel = &connector->panel; in intel_panel_disable_backlight()
853 if (!panel->backlight.present) in intel_panel_disable_backlight()
857 * Do not disable backlight on the vga_switcheroo path. When switching in intel_panel_disable_backlight()
859 * backlight. This will leave the backlight on unnecessarily when in intel_panel_disable_backlight()
862 if (dev_priv->drm.switch_power_state == DRM_SWITCH_POWER_CHANGING) { in intel_panel_disable_backlight()
863 drm_dbg_kms(&dev_priv->drm, in intel_panel_disable_backlight()
864 "Skipping backlight disable on vga switch\n"); in intel_panel_disable_backlight()
868 mutex_lock(&dev_priv->backlight_lock); in intel_panel_disable_backlight()
870 if (panel->backlight.device) in intel_panel_disable_backlight()
871 panel->backlight.device->props.power = FB_BLANK_POWERDOWN; in intel_panel_disable_backlight()
872 panel->backlight.enabled = false; in intel_panel_disable_backlight()
873 panel->backlight.disable(old_conn_state); in intel_panel_disable_backlight()
875 mutex_unlock(&dev_priv->backlight_lock); in intel_panel_disable_backlight()
881 struct intel_connector *connector = to_intel_connector(conn_state->connector); in lpt_enable_backlight()
882 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in lpt_enable_backlight()
883 struct intel_panel *panel = &connector->panel; in lpt_enable_backlight()
888 drm_dbg_kms(&dev_priv->drm, "pch backlight already enabled\n"); in lpt_enable_backlight()
895 if (panel->backlight.alternate_pwm_increment) in lpt_enable_backlight()
902 if (panel->backlight.alternate_pwm_increment) in lpt_enable_backlight()
909 pch_ctl2 = panel->backlight.max << 16; in lpt_enable_backlight()
913 if (panel->backlight.active_low_pwm) in lpt_enable_backlight()
926 intel_panel_actually_set_backlight(conn_state, panel->backlight.level); in lpt_enable_backlight()
932 struct intel_connector *connector = to_intel_connector(conn_state->connector); in pch_enable_backlight()
933 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in pch_enable_backlight()
934 struct intel_panel *panel = &connector->panel; in pch_enable_backlight()
935 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; in pch_enable_backlight()
940 drm_dbg_kms(&dev_priv->drm, "cpu backlight already enabled\n"); in pch_enable_backlight()
947 drm_dbg_kms(&dev_priv->drm, "pch backlight already enabled\n"); in pch_enable_backlight()
961 intel_panel_actually_set_backlight(conn_state, panel->backlight.level); in pch_enable_backlight()
963 pch_ctl2 = panel->backlight.max << 16; in pch_enable_backlight()
967 if (panel->backlight.active_low_pwm) in pch_enable_backlight()
979 struct intel_connector *connector = to_intel_connector(conn_state->connector); in i9xx_enable_backlight()
980 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i9xx_enable_backlight()
981 struct intel_panel *panel = &connector->panel; in i9xx_enable_backlight()
986 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n"); in i9xx_enable_backlight()
990 freq = panel->backlight.max; in i9xx_enable_backlight()
991 if (panel->backlight.combination_mode) in i9xx_enable_backlight()
995 if (panel->backlight.combination_mode) in i9xx_enable_backlight()
997 if (IS_PINEVIEW(dev_priv) && panel->backlight.active_low_pwm) in i9xx_enable_backlight()
1004 intel_panel_actually_set_backlight(conn_state, panel->backlight.level); in i9xx_enable_backlight()
1007 * Needed to enable backlight on some 855gm models. BLC_HIST_CTL is in i9xx_enable_backlight()
1009 * that has backlight. in i9xx_enable_backlight()
1018 struct intel_connector *connector = to_intel_connector(conn_state->connector); in i965_enable_backlight()
1019 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i965_enable_backlight()
1020 struct intel_panel *panel = &connector->panel; in i965_enable_backlight()
1021 enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe; in i965_enable_backlight()
1026 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n"); in i965_enable_backlight()
1031 freq = panel->backlight.max; in i965_enable_backlight()
1032 if (panel->backlight.combination_mode) in i965_enable_backlight()
1039 if (panel->backlight.combination_mode) in i965_enable_backlight()
1041 if (panel->backlight.active_low_pwm) in i965_enable_backlight()
1047 intel_panel_actually_set_backlight(conn_state, panel->backlight.level); in i965_enable_backlight()
1053 struct intel_connector *connector = to_intel_connector(conn_state->connector); in vlv_enable_backlight()
1054 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in vlv_enable_backlight()
1055 struct intel_panel *panel = &connector->panel; in vlv_enable_backlight()
1056 enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe; in vlv_enable_backlight()
1061 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n"); in vlv_enable_backlight()
1066 ctl = panel->backlight.max << 16; in vlv_enable_backlight()
1070 intel_panel_actually_set_backlight(conn_state, panel->backlight.level); in vlv_enable_backlight()
1073 if (panel->backlight.active_low_pwm) in vlv_enable_backlight()
1084 struct intel_connector *connector = to_intel_connector(conn_state->connector); in bxt_enable_backlight()
1085 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in bxt_enable_backlight()
1086 struct intel_panel *panel = &connector->panel; in bxt_enable_backlight()
1087 enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe; in bxt_enable_backlight()
1091 if (panel->backlight.controller == 1) { in bxt_enable_backlight()
1094 drm_dbg_kms(&dev_priv->drm, in bxt_enable_backlight()
1101 if (panel->backlight.util_pin_active_low) in bxt_enable_backlight()
1108 BXT_BLC_PWM_CTL(panel->backlight.controller)); in bxt_enable_backlight()
1110 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n"); in bxt_enable_backlight()
1113 BXT_BLC_PWM_CTL(panel->backlight.controller), in bxt_enable_backlight()
1118 BXT_BLC_PWM_FREQ(panel->backlight.controller), in bxt_enable_backlight()
1119 panel->backlight.max); in bxt_enable_backlight()
1121 intel_panel_actually_set_backlight(conn_state, panel->backlight.level); in bxt_enable_backlight()
1124 if (panel->backlight.active_low_pwm) in bxt_enable_backlight()
1127 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller), in bxt_enable_backlight()
1130 BXT_BLC_PWM_CTL(panel->backlight.controller)); in bxt_enable_backlight()
1131 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller), in bxt_enable_backlight()
1138 struct intel_connector *connector = to_intel_connector(conn_state->connector); in cnp_enable_backlight()
1139 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in cnp_enable_backlight()
1140 struct intel_panel *panel = &connector->panel; in cnp_enable_backlight()
1144 BXT_BLC_PWM_CTL(panel->backlight.controller)); in cnp_enable_backlight()
1146 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n"); in cnp_enable_backlight()
1149 BXT_BLC_PWM_CTL(panel->backlight.controller), in cnp_enable_backlight()
1154 BXT_BLC_PWM_FREQ(panel->backlight.controller), in cnp_enable_backlight()
1155 panel->backlight.max); in cnp_enable_backlight()
1157 intel_panel_actually_set_backlight(conn_state, panel->backlight.level); in cnp_enable_backlight()
1160 if (panel->backlight.active_low_pwm) in cnp_enable_backlight()
1163 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller), in cnp_enable_backlight()
1166 BXT_BLC_PWM_CTL(panel->backlight.controller)); in cnp_enable_backlight()
1167 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller), in cnp_enable_backlight()
1174 struct intel_connector *connector = to_intel_connector(conn_state->connector); in pwm_enable_backlight()
1175 struct intel_panel *panel = &connector->panel; in pwm_enable_backlight()
1176 int level = panel->backlight.level; in pwm_enable_backlight()
1179 pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100); in pwm_enable_backlight()
1180 panel->backlight.pwm_state.enabled = true; in pwm_enable_backlight()
1181 pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state); in pwm_enable_backlight()
1187 struct intel_connector *connector = to_intel_connector(conn_state->connector); in __intel_panel_enable_backlight()
1188 struct intel_panel *panel = &connector->panel; in __intel_panel_enable_backlight()
1190 WARN_ON(panel->backlight.max == 0); in __intel_panel_enable_backlight()
1192 if (panel->backlight.level <= panel->backlight.min) { in __intel_panel_enable_backlight()
1193 panel->backlight.level = panel->backlight.max; in __intel_panel_enable_backlight()
1194 if (panel->backlight.device) in __intel_panel_enable_backlight()
1195 panel->backlight.device->props.brightness = in __intel_panel_enable_backlight()
1197 panel->backlight.level, in __intel_panel_enable_backlight()
1198 panel->backlight.device->props.max_brightness); in __intel_panel_enable_backlight()
1201 panel->backlight.enable(crtc_state, conn_state); in __intel_panel_enable_backlight()
1202 panel->backlight.enabled = true; in __intel_panel_enable_backlight()
1203 if (panel->backlight.device) in __intel_panel_enable_backlight()
1204 panel->backlight.device->props.power = FB_BLANK_UNBLANK; in __intel_panel_enable_backlight()
1210 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_panel_enable_backlight()
1211 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_enable_backlight()
1212 struct intel_panel *panel = &connector->panel; in intel_panel_enable_backlight()
1213 enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe; in intel_panel_enable_backlight()
1215 if (!panel->backlight.present) in intel_panel_enable_backlight()
1218 drm_dbg_kms(&dev_priv->drm, "pipe %c\n", pipe_name(pipe)); in intel_panel_enable_backlight()
1220 mutex_lock(&dev_priv->backlight_lock); in intel_panel_enable_backlight()
1224 mutex_unlock(&dev_priv->backlight_lock); in intel_panel_enable_backlight()
1230 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_get_backlight()
1231 struct intel_panel *panel = &connector->panel; in intel_panel_get_backlight()
1234 mutex_lock(&dev_priv->backlight_lock); in intel_panel_get_backlight()
1236 if (panel->backlight.enabled) { in intel_panel_get_backlight()
1237 val = panel->backlight.get(connector); in intel_panel_get_backlight()
1241 mutex_unlock(&dev_priv->backlight_lock); in intel_panel_get_backlight()
1243 drm_dbg_kms(&dev_priv->drm, "get backlight PWM = %d\n", val); in intel_panel_get_backlight()
1251 struct intel_panel *panel = &connector->panel; in scale_user_to_hw()
1254 panel->backlight.min, panel->backlight.max); in scale_user_to_hw()
1257 /* set backlight brightness to level in range [0..max], scaling wrt hw min */
1261 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_panel_set_backlight()
1262 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_set_backlight()
1263 struct intel_panel *panel = &connector->panel; in intel_panel_set_backlight()
1266 if (!panel->backlight.present) in intel_panel_set_backlight()
1269 mutex_lock(&dev_priv->backlight_lock); in intel_panel_set_backlight()
1271 drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0); in intel_panel_set_backlight()
1274 panel->backlight.level = hw_level; in intel_panel_set_backlight()
1276 if (panel->backlight.enabled) in intel_panel_set_backlight()
1279 mutex_unlock(&dev_priv->backlight_lock); in intel_panel_set_backlight()
1285 struct intel_panel *panel = &connector->panel; in intel_backlight_device_update_status()
1286 struct drm_device *dev = connector->base.dev; in intel_backlight_device_update_status()
1288 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); in intel_backlight_device_update_status()
1290 bd->props.brightness, bd->props.max_brightness); in intel_backlight_device_update_status()
1291 intel_panel_set_backlight(connector->base.state, bd->props.brightness, in intel_backlight_device_update_status()
1292 bd->props.max_brightness); in intel_backlight_device_update_status()
1295 * Allow flipping bl_power as a sub-state of enabled. Sadly the in intel_backlight_device_update_status()
1296 * backlight class device does not make it easy to to differentiate in intel_backlight_device_update_status()
1300 if (panel->backlight.enabled) { in intel_backlight_device_update_status()
1301 if (panel->backlight.power) { in intel_backlight_device_update_status()
1302 bool enable = bd->props.power == FB_BLANK_UNBLANK && in intel_backlight_device_update_status()
1303 bd->props.brightness != 0; in intel_backlight_device_update_status()
1304 panel->backlight.power(connector, enable); in intel_backlight_device_update_status()
1307 bd->props.power = FB_BLANK_POWERDOWN; in intel_backlight_device_update_status()
1310 drm_modeset_unlock(&dev->mode_config.connection_mutex); in intel_backlight_device_update_status()
1317 struct drm_device *dev = connector->base.dev; in intel_backlight_device_get_brightness()
1322 with_intel_runtime_pm(&dev_priv->runtime_pm, wakeref) { in intel_backlight_device_get_brightness()
1325 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); in intel_backlight_device_get_brightness()
1329 hw_level, bd->props.max_brightness); in intel_backlight_device_get_brightness()
1331 drm_modeset_unlock(&dev->mode_config.connection_mutex); in intel_backlight_device_get_brightness()
1344 struct drm_i915_private *i915 = to_i915(connector->base.dev); in intel_backlight_device_register()
1345 struct intel_panel *panel = &connector->panel; in intel_backlight_device_register()
1348 if (WARN_ON(panel->backlight.device)) in intel_backlight_device_register()
1349 return -ENODEV; in intel_backlight_device_register()
1351 if (!panel->backlight.present) in intel_backlight_device_register()
1354 WARN_ON(panel->backlight.max == 0); in intel_backlight_device_register()
1360 * Note: Everything should work even if the backlight device max in intel_backlight_device_register()
1363 props.max_brightness = panel->backlight.max; in intel_backlight_device_register()
1365 panel->backlight.level, in intel_backlight_device_register()
1368 if (panel->backlight.enabled) in intel_backlight_device_register()
1375 * registration of multiple backlight devices in the driver. in intel_backlight_device_register()
1377 panel->backlight.device = in intel_backlight_device_register()
1379 connector->base.kdev, in intel_backlight_device_register()
1383 if (IS_ERR(panel->backlight.device)) { in intel_backlight_device_register()
1384 drm_err(&i915->drm, "Failed to register backlight: %ld\n", in intel_backlight_device_register()
1385 PTR_ERR(panel->backlight.device)); in intel_backlight_device_register()
1386 panel->backlight.device = NULL; in intel_backlight_device_register()
1387 return -ENODEV; in intel_backlight_device_register()
1390 drm_dbg_kms(&i915->drm, in intel_backlight_device_register()
1391 "Connector %s backlight sysfs interface registered\n", in intel_backlight_device_register()
1392 connector->base.name); in intel_backlight_device_register()
1399 struct intel_panel *panel = &connector->panel; in intel_backlight_device_unregister()
1401 if (panel->backlight.device) { in intel_backlight_device_unregister()
1402 backlight_device_unregister(panel->backlight.device); in intel_backlight_device_unregister()
1403 panel->backlight.device = NULL; in intel_backlight_device_unregister()
1409 * CNP: PWM clock frequency is 19.2 MHz or 24 MHz.
1410 * PWM increment = 1
1414 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in cnp_hz_to_pwm()
1416 return DIV_ROUND_CLOSEST(KHz(RUNTIME_INFO(dev_priv)->rawclk_freq), in cnp_hz_to_pwm()
1421 * BXT: PWM clock frequency = 19.2 MHz.
1429 * SPT: This value represents the period of the PWM stream in clock periods
1431 * SCHICKEN_1 bit 0). PWM clock is 24 MHz.
1435 struct intel_panel *panel = &connector->panel; in spt_hz_to_pwm()
1438 if (panel->backlight.alternate_pwm_increment) in spt_hz_to_pwm()
1447 * LPT: This value represents the period of the PWM stream in clock periods
1453 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in lpt_hz_to_pwm()
1454 struct intel_panel *panel = &connector->panel; in lpt_hz_to_pwm()
1457 if (panel->backlight.alternate_pwm_increment) in lpt_hz_to_pwm()
1471 * ILK/SNB/IVB: This value represents the period of the PWM stream in PCH
1476 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in pch_hz_to_pwm()
1478 return DIV_ROUND_CLOSEST(KHz(RUNTIME_INFO(dev_priv)->rawclk_freq), in pch_hz_to_pwm()
1484 * clock frequency/32) in total for a complete cycle of modulated backlight
1492 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i9xx_hz_to_pwm()
1496 clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq); in i9xx_hz_to_pwm()
1498 clock = KHz(dev_priv->cdclk.hw.cdclk); in i9xx_hz_to_pwm()
1504 * Gen4: This value represents the period of the PWM stream in display core
1510 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i965_hz_to_pwm()
1514 clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq); in i965_hz_to_pwm()
1516 clock = KHz(dev_priv->cdclk.hw.cdclk); in i965_hz_to_pwm()
1522 * VLV: This value represents the period of the PWM stream in display core
1528 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in vlv_hz_to_pwm()
1538 clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq); in vlv_hz_to_pwm()
1547 u16 pwm_freq_hz = dev_priv->vbt.backlight.pwm_freq_hz; in get_vbt_pwm_freq()
1550 drm_dbg_kms(&dev_priv->drm, in get_vbt_pwm_freq()
1551 "VBT defined backlight frequency %u Hz\n", in get_vbt_pwm_freq()
1555 drm_dbg_kms(&dev_priv->drm, in get_vbt_pwm_freq()
1556 "default backlight frequency %u Hz\n", in get_vbt_pwm_freq()
1565 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in get_backlight_max_vbt()
1566 struct intel_panel *panel = &connector->panel; in get_backlight_max_vbt()
1568 u32 pwm; in get_backlight_max_vbt() local
1570 if (!panel->backlight.hz_to_pwm) { in get_backlight_max_vbt()
1571 drm_dbg_kms(&dev_priv->drm, in get_backlight_max_vbt()
1572 "backlight frequency conversion not supported\n"); in get_backlight_max_vbt()
1576 pwm = panel->backlight.hz_to_pwm(connector, pwm_freq_hz); in get_backlight_max_vbt()
1577 if (!pwm) { in get_backlight_max_vbt()
1578 drm_dbg_kms(&dev_priv->drm, in get_backlight_max_vbt()
1579 "backlight frequency conversion failed\n"); in get_backlight_max_vbt()
1583 return pwm; in get_backlight_max_vbt()
1591 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in get_backlight_min_vbt()
1592 struct intel_panel *panel = &connector->panel; in get_backlight_min_vbt()
1595 drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0); in get_backlight_min_vbt()
1604 min = clamp_t(int, dev_priv->vbt.backlight.min_brightness, 0, 64); in get_backlight_min_vbt()
1605 if (min != dev_priv->vbt.backlight.min_brightness) { in get_backlight_min_vbt()
1606 drm_dbg_kms(&dev_priv->drm, in get_backlight_min_vbt()
1607 "clamping VBT min backlight %d/255 to %d/255\n", in get_backlight_min_vbt()
1608 dev_priv->vbt.backlight.min_brightness, min); in get_backlight_min_vbt()
1612 return scale(min, 0, 255, 0, panel->backlight.max); in get_backlight_min_vbt()
1617 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in lpt_setup_backlight()
1618 struct intel_panel *panel = &connector->panel; in lpt_setup_backlight()
1626 panel->backlight.alternate_pwm_increment = alt; in lpt_setup_backlight()
1629 panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY; in lpt_setup_backlight()
1632 panel->backlight.max = pch_ctl2 >> 16; in lpt_setup_backlight()
1636 if (!panel->backlight.max) in lpt_setup_backlight()
1637 panel->backlight.max = get_backlight_max_vbt(connector); in lpt_setup_backlight()
1639 if (!panel->backlight.max) in lpt_setup_backlight()
1640 return -ENODEV; in lpt_setup_backlight()
1642 panel->backlight.min = get_backlight_min_vbt(connector); in lpt_setup_backlight()
1644 panel->backlight.enabled = pch_ctl1 & BLM_PCH_PWM_ENABLE; in lpt_setup_backlight()
1646 cpu_mode = panel->backlight.enabled && HAS_PCH_LPT(dev_priv) && in lpt_setup_backlight()
1654 panel->backlight.level = clamp(val, panel->backlight.min, in lpt_setup_backlight()
1655 panel->backlight.max); in lpt_setup_backlight()
1658 drm_dbg_kms(&dev_priv->drm, in lpt_setup_backlight()
1659 "CPU backlight register was enabled, switching to PCH override\n"); in lpt_setup_backlight()
1661 /* Write converted CPU PWM value to PCH override register */ in lpt_setup_backlight()
1662 lpt_set_backlight(connector->base.state, panel->backlight.level); in lpt_setup_backlight()
1675 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in pch_setup_backlight()
1676 struct intel_panel *panel = &connector->panel; in pch_setup_backlight()
1680 panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY; in pch_setup_backlight()
1683 panel->backlight.max = pch_ctl2 >> 16; in pch_setup_backlight()
1685 if (!panel->backlight.max) in pch_setup_backlight()
1686 panel->backlight.max = get_backlight_max_vbt(connector); in pch_setup_backlight()
1688 if (!panel->backlight.max) in pch_setup_backlight()
1689 return -ENODEV; in pch_setup_backlight()
1691 panel->backlight.min = get_backlight_min_vbt(connector); in pch_setup_backlight()
1695 panel->backlight.level = clamp(val, panel->backlight.min, in pch_setup_backlight()
1696 panel->backlight.max); in pch_setup_backlight()
1699 panel->backlight.enabled = (cpu_ctl2 & BLM_PWM_ENABLE) && in pch_setup_backlight()
1707 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i9xx_setup_backlight()
1708 struct intel_panel *panel = &connector->panel; in i9xx_setup_backlight()
1714 panel->backlight.combination_mode = ctl & BLM_LEGACY_MODE; in i9xx_setup_backlight()
1717 panel->backlight.active_low_pwm = ctl & BLM_POLARITY_PNV; in i9xx_setup_backlight()
1719 panel->backlight.max = ctl >> 17; in i9xx_setup_backlight()
1721 if (!panel->backlight.max) { in i9xx_setup_backlight()
1722 panel->backlight.max = get_backlight_max_vbt(connector); in i9xx_setup_backlight()
1723 panel->backlight.max >>= 1; in i9xx_setup_backlight()
1726 if (!panel->backlight.max) in i9xx_setup_backlight()
1727 return -ENODEV; in i9xx_setup_backlight()
1729 if (panel->backlight.combination_mode) in i9xx_setup_backlight()
1730 panel->backlight.max *= 0xff; in i9xx_setup_backlight()
1732 panel->backlight.min = get_backlight_min_vbt(connector); in i9xx_setup_backlight()
1736 panel->backlight.level = clamp(val, panel->backlight.min, in i9xx_setup_backlight()
1737 panel->backlight.max); in i9xx_setup_backlight()
1739 panel->backlight.enabled = val != 0; in i9xx_setup_backlight()
1746 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i965_setup_backlight()
1747 struct intel_panel *panel = &connector->panel; in i965_setup_backlight()
1751 panel->backlight.combination_mode = ctl2 & BLM_COMBINATION_MODE; in i965_setup_backlight()
1752 panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965; in i965_setup_backlight()
1755 panel->backlight.max = ctl >> 16; in i965_setup_backlight()
1757 if (!panel->backlight.max) in i965_setup_backlight()
1758 panel->backlight.max = get_backlight_max_vbt(connector); in i965_setup_backlight()
1760 if (!panel->backlight.max) in i965_setup_backlight()
1761 return -ENODEV; in i965_setup_backlight()
1763 if (panel->backlight.combination_mode) in i965_setup_backlight()
1764 panel->backlight.max *= 0xff; in i965_setup_backlight()
1766 panel->backlight.min = get_backlight_min_vbt(connector); in i965_setup_backlight()
1770 panel->backlight.level = clamp(val, panel->backlight.min, in i965_setup_backlight()
1771 panel->backlight.max); in i965_setup_backlight()
1773 panel->backlight.enabled = ctl2 & BLM_PWM_ENABLE; in i965_setup_backlight()
1780 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in vlv_setup_backlight()
1781 struct intel_panel *panel = &connector->panel; in vlv_setup_backlight()
1784 if (drm_WARN_ON(&dev_priv->drm, pipe != PIPE_A && pipe != PIPE_B)) in vlv_setup_backlight()
1785 return -ENODEV; in vlv_setup_backlight()
1788 panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965; in vlv_setup_backlight()
1791 panel->backlight.max = ctl >> 16; in vlv_setup_backlight()
1793 if (!panel->backlight.max) in vlv_setup_backlight()
1794 panel->backlight.max = get_backlight_max_vbt(connector); in vlv_setup_backlight()
1796 if (!panel->backlight.max) in vlv_setup_backlight()
1797 return -ENODEV; in vlv_setup_backlight()
1799 panel->backlight.min = get_backlight_min_vbt(connector); in vlv_setup_backlight()
1803 panel->backlight.level = clamp(val, panel->backlight.min, in vlv_setup_backlight()
1804 panel->backlight.max); in vlv_setup_backlight()
1806 panel->backlight.enabled = ctl2 & BLM_PWM_ENABLE; in vlv_setup_backlight()
1814 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in bxt_setup_backlight()
1815 struct intel_panel *panel = &connector->panel; in bxt_setup_backlight()
1818 panel->backlight.controller = dev_priv->vbt.backlight.controller; in bxt_setup_backlight()
1821 BXT_BLC_PWM_CTL(panel->backlight.controller)); in bxt_setup_backlight()
1824 if (panel->backlight.controller == 1) { in bxt_setup_backlight()
1826 panel->backlight.util_pin_active_low = in bxt_setup_backlight()
1830 panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY; in bxt_setup_backlight()
1831 panel->backlight.max = in bxt_setup_backlight()
1833 BXT_BLC_PWM_FREQ(panel->backlight.controller)); in bxt_setup_backlight()
1835 if (!panel->backlight.max) in bxt_setup_backlight()
1836 panel->backlight.max = get_backlight_max_vbt(connector); in bxt_setup_backlight()
1838 if (!panel->backlight.max) in bxt_setup_backlight()
1839 return -ENODEV; in bxt_setup_backlight()
1841 panel->backlight.min = get_backlight_min_vbt(connector); in bxt_setup_backlight()
1845 panel->backlight.level = clamp(val, panel->backlight.min, in bxt_setup_backlight()
1846 panel->backlight.max); in bxt_setup_backlight()
1848 panel->backlight.enabled = pwm_ctl & BXT_BLC_PWM_ENABLE; in bxt_setup_backlight()
1856 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in cnp_setup_backlight()
1857 struct intel_panel *panel = &connector->panel; in cnp_setup_backlight()
1861 * CNP has the BXT implementation of backlight, but with only one in cnp_setup_backlight()
1865 panel->backlight.controller = 0; in cnp_setup_backlight()
1868 BXT_BLC_PWM_CTL(panel->backlight.controller)); in cnp_setup_backlight()
1870 panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY; in cnp_setup_backlight()
1871 panel->backlight.max = in cnp_setup_backlight()
1873 BXT_BLC_PWM_FREQ(panel->backlight.controller)); in cnp_setup_backlight()
1875 if (!panel->backlight.max) in cnp_setup_backlight()
1876 panel->backlight.max = get_backlight_max_vbt(connector); in cnp_setup_backlight()
1878 if (!panel->backlight.max) in cnp_setup_backlight()
1879 return -ENODEV; in cnp_setup_backlight()
1881 panel->backlight.min = get_backlight_min_vbt(connector); in cnp_setup_backlight()
1885 panel->backlight.level = clamp(val, panel->backlight.min, in cnp_setup_backlight()
1886 panel->backlight.max); in cnp_setup_backlight()
1888 panel->backlight.enabled = pwm_ctl & BXT_BLC_PWM_ENABLE; in cnp_setup_backlight()
1896 struct drm_device *dev = connector->base.dev; in pwm_setup_backlight()
1898 struct intel_panel *panel = &connector->panel; in pwm_setup_backlight()
1902 /* Get the right PWM chip for DSI backlight according to VBT */ in pwm_setup_backlight()
1903 if (dev_priv->vbt.dsi.config->pwm_blc == PPS_BLC_PMIC) { in pwm_setup_backlight()
1904 panel->backlight.pwm = pwm_get(dev->dev, "pwm_pmic_backlight"); in pwm_setup_backlight()
1907 panel->backlight.pwm = pwm_get(dev->dev, "pwm_soc_backlight"); in pwm_setup_backlight()
1911 if (IS_ERR(panel->backlight.pwm)) { in pwm_setup_backlight()
1912 drm_err(&dev_priv->drm, "Failed to get the %s PWM chip\n", in pwm_setup_backlight()
1914 panel->backlight.pwm = NULL; in pwm_setup_backlight()
1915 return -ENODEV; in pwm_setup_backlight()
1918 panel->backlight.max = 100; /* 100% */ in pwm_setup_backlight()
1919 panel->backlight.min = get_backlight_min_vbt(connector); in pwm_setup_backlight()
1921 if (pwm_is_enabled(panel->backlight.pwm)) { in pwm_setup_backlight()
1922 /* PWM is already enabled, use existing settings */ in pwm_setup_backlight()
1923 pwm_get_state(panel->backlight.pwm, &panel->backlight.pwm_state); in pwm_setup_backlight()
1925 level = pwm_get_relative_duty_cycle(&panel->backlight.pwm_state, in pwm_setup_backlight()
1928 panel->backlight.level = clamp(level, panel->backlight.min, in pwm_setup_backlight()
1929 panel->backlight.max); in pwm_setup_backlight()
1930 panel->backlight.enabled = true; in pwm_setup_backlight()
1932 drm_dbg_kms(&dev_priv->drm, "PWM already enabled at freq %ld, VBT freq %d, level %d\n", in pwm_setup_backlight()
1933 NSEC_PER_SEC / (unsigned long)panel->backlight.pwm_state.period, in pwm_setup_backlight()
1937 panel->backlight.pwm_state.period = in pwm_setup_backlight()
1941 drm_info(&dev_priv->drm, "Using %s PWM for LCD backlight control\n", in pwm_setup_backlight()
1951 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_panel_update_backlight()
1952 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_update_backlight()
1953 struct intel_panel *panel = &connector->panel; in intel_panel_update_backlight()
1955 if (!panel->backlight.present) in intel_panel_update_backlight()
1958 mutex_lock(&dev_priv->backlight_lock); in intel_panel_update_backlight()
1959 if (!panel->backlight.enabled) in intel_panel_update_backlight()
1962 mutex_unlock(&dev_priv->backlight_lock); in intel_panel_update_backlight()
1967 struct drm_i915_private *dev_priv = to_i915(connector->dev); in intel_panel_setup_backlight()
1969 struct intel_panel *panel = &intel_connector->panel; in intel_panel_setup_backlight()
1972 if (!dev_priv->vbt.backlight.present) { in intel_panel_setup_backlight()
1973 if (dev_priv->quirks & QUIRK_BACKLIGHT_PRESENT) { in intel_panel_setup_backlight()
1974 drm_dbg_kms(&dev_priv->drm, in intel_panel_setup_backlight()
1975 "no backlight present per VBT, but present per quirk\n"); in intel_panel_setup_backlight()
1977 drm_dbg_kms(&dev_priv->drm, in intel_panel_setup_backlight()
1978 "no backlight present per VBT\n"); in intel_panel_setup_backlight()
1984 if (drm_WARN_ON(&dev_priv->drm, !panel->backlight.setup)) in intel_panel_setup_backlight()
1985 return -ENODEV; in intel_panel_setup_backlight()
1988 mutex_lock(&dev_priv->backlight_lock); in intel_panel_setup_backlight()
1989 ret = panel->backlight.setup(intel_connector, pipe); in intel_panel_setup_backlight()
1990 mutex_unlock(&dev_priv->backlight_lock); in intel_panel_setup_backlight()
1993 drm_dbg_kms(&dev_priv->drm, in intel_panel_setup_backlight()
1994 "failed to setup backlight for connector %s\n", in intel_panel_setup_backlight()
1995 connector->name); in intel_panel_setup_backlight()
1999 panel->backlight.present = true; in intel_panel_setup_backlight()
2001 drm_dbg_kms(&dev_priv->drm, in intel_panel_setup_backlight()
2002 "Connector %s backlight initialized, %s, brightness %u/%u\n", in intel_panel_setup_backlight()
2003 connector->name, in intel_panel_setup_backlight()
2004 enableddisabled(panel->backlight.enabled), in intel_panel_setup_backlight()
2005 panel->backlight.level, panel->backlight.max); in intel_panel_setup_backlight()
2012 /* dispose of the pwm */ in intel_panel_destroy_backlight()
2013 if (panel->backlight.pwm) in intel_panel_destroy_backlight()
2014 pwm_put(panel->backlight.pwm); in intel_panel_destroy_backlight()
2016 panel->backlight.present = false; in intel_panel_destroy_backlight()
2019 /* Set up chip specific backlight functions */
2025 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_init_backlight_funcs()
2027 if (connector->base.connector_type == DRM_MODE_CONNECTOR_eDP && in intel_panel_init_backlight_funcs()
2031 if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI && in intel_panel_init_backlight_funcs()
2036 panel->backlight.setup = bxt_setup_backlight; in intel_panel_init_backlight_funcs()
2037 panel->backlight.enable = bxt_enable_backlight; in intel_panel_init_backlight_funcs()
2038 panel->backlight.disable = bxt_disable_backlight; in intel_panel_init_backlight_funcs()
2039 panel->backlight.set = bxt_set_backlight; in intel_panel_init_backlight_funcs()
2040 panel->backlight.get = bxt_get_backlight; in intel_panel_init_backlight_funcs()
2041 panel->backlight.hz_to_pwm = bxt_hz_to_pwm; in intel_panel_init_backlight_funcs()
2043 panel->backlight.setup = cnp_setup_backlight; in intel_panel_init_backlight_funcs()
2044 panel->backlight.enable = cnp_enable_backlight; in intel_panel_init_backlight_funcs()
2045 panel->backlight.disable = cnp_disable_backlight; in intel_panel_init_backlight_funcs()
2046 panel->backlight.set = bxt_set_backlight; in intel_panel_init_backlight_funcs()
2047 panel->backlight.get = bxt_get_backlight; in intel_panel_init_backlight_funcs()
2048 panel->backlight.hz_to_pwm = cnp_hz_to_pwm; in intel_panel_init_backlight_funcs()
2050 panel->backlight.setup = lpt_setup_backlight; in intel_panel_init_backlight_funcs()
2051 panel->backlight.enable = lpt_enable_backlight; in intel_panel_init_backlight_funcs()
2052 panel->backlight.disable = lpt_disable_backlight; in intel_panel_init_backlight_funcs()
2053 panel->backlight.set = lpt_set_backlight; in intel_panel_init_backlight_funcs()
2054 panel->backlight.get = lpt_get_backlight; in intel_panel_init_backlight_funcs()
2056 panel->backlight.hz_to_pwm = lpt_hz_to_pwm; in intel_panel_init_backlight_funcs()
2058 panel->backlight.hz_to_pwm = spt_hz_to_pwm; in intel_panel_init_backlight_funcs()
2060 panel->backlight.setup = pch_setup_backlight; in intel_panel_init_backlight_funcs()
2061 panel->backlight.enable = pch_enable_backlight; in intel_panel_init_backlight_funcs()
2062 panel->backlight.disable = pch_disable_backlight; in intel_panel_init_backlight_funcs()
2063 panel->backlight.set = pch_set_backlight; in intel_panel_init_backlight_funcs()
2064 panel->backlight.get = pch_get_backlight; in intel_panel_init_backlight_funcs()
2065 panel->backlight.hz_to_pwm = pch_hz_to_pwm; in intel_panel_init_backlight_funcs()
2067 if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI) { in intel_panel_init_backlight_funcs()
2068 panel->backlight.setup = pwm_setup_backlight; in intel_panel_init_backlight_funcs()
2069 panel->backlight.enable = pwm_enable_backlight; in intel_panel_init_backlight_funcs()
2070 panel->backlight.disable = pwm_disable_backlight; in intel_panel_init_backlight_funcs()
2071 panel->backlight.set = pwm_set_backlight; in intel_panel_init_backlight_funcs()
2072 panel->backlight.get = pwm_get_backlight; in intel_panel_init_backlight_funcs()
2074 panel->backlight.setup = vlv_setup_backlight; in intel_panel_init_backlight_funcs()
2075 panel->backlight.enable = vlv_enable_backlight; in intel_panel_init_backlight_funcs()
2076 panel->backlight.disable = vlv_disable_backlight; in intel_panel_init_backlight_funcs()
2077 panel->backlight.set = vlv_set_backlight; in intel_panel_init_backlight_funcs()
2078 panel->backlight.get = vlv_get_backlight; in intel_panel_init_backlight_funcs()
2079 panel->backlight.hz_to_pwm = vlv_hz_to_pwm; in intel_panel_init_backlight_funcs()
2082 panel->backlight.setup = i965_setup_backlight; in intel_panel_init_backlight_funcs()
2083 panel->backlight.enable = i965_enable_backlight; in intel_panel_init_backlight_funcs()
2084 panel->backlight.disable = i965_disable_backlight; in intel_panel_init_backlight_funcs()
2085 panel->backlight.set = i9xx_set_backlight; in intel_panel_init_backlight_funcs()
2086 panel->backlight.get = i9xx_get_backlight; in intel_panel_init_backlight_funcs()
2087 panel->backlight.hz_to_pwm = i965_hz_to_pwm; in intel_panel_init_backlight_funcs()
2089 panel->backlight.setup = i9xx_setup_backlight; in intel_panel_init_backlight_funcs()
2090 panel->backlight.enable = i9xx_enable_backlight; in intel_panel_init_backlight_funcs()
2091 panel->backlight.disable = i9xx_disable_backlight; in intel_panel_init_backlight_funcs()
2092 panel->backlight.set = i9xx_set_backlight; in intel_panel_init_backlight_funcs()
2093 panel->backlight.get = i9xx_get_backlight; in intel_panel_init_backlight_funcs()
2094 panel->backlight.hz_to_pwm = i9xx_hz_to_pwm; in intel_panel_init_backlight_funcs()
2101 struct drm_i915_private *i915 = to_i915(connector->dev); in intel_panel_detect()
2115 panel->fixed_mode = fixed_mode; in intel_panel_init()
2116 panel->downclock_mode = downclock_mode; in intel_panel_init()
2128 if (panel->fixed_mode) in intel_panel_fini()
2129 drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode); in intel_panel_fini()
2131 if (panel->downclock_mode) in intel_panel_fini()
2132 drm_mode_destroy(intel_connector->base.dev, in intel_panel_fini()
2133 panel->downclock_mode); in intel_panel_fini()