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>
60 downclock_mode->clock < fixed_mode->clock; in is_downclock_mode()
67 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_edid_downclock_mode()
70 int best_clock = fixed_mode->clock; in intel_panel_edid_downclock_mode()
72 list_for_each_entry(scan, &connector->base.probed_modes, head) { in intel_panel_edid_downclock_mode()
81 scan->clock < best_clock) { in intel_panel_edid_downclock_mode()
86 best_clock = scan->clock; in intel_panel_edid_downclock_mode()
94 downclock_mode = drm_mode_duplicate(&dev_priv->drm, best_mode); in intel_panel_edid_downclock_mode()
98 drm_dbg_kms(&dev_priv->drm, in intel_panel_edid_downclock_mode()
100 connector->base.base.id, connector->base.name); in intel_panel_edid_downclock_mode()
109 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_edid_fixed_mode()
113 if (list_empty(&connector->base.probed_modes)) in intel_panel_edid_fixed_mode()
117 list_for_each_entry(scan, &connector->base.probed_modes, head) { in intel_panel_edid_fixed_mode()
118 if ((scan->type & DRM_MODE_TYPE_PREFERRED) == 0) in intel_panel_edid_fixed_mode()
121 fixed_mode = drm_mode_duplicate(&dev_priv->drm, scan); in intel_panel_edid_fixed_mode()
125 drm_dbg_kms(&dev_priv->drm, in intel_panel_edid_fixed_mode()
127 connector->base.base.id, connector->base.name); in intel_panel_edid_fixed_mode()
133 scan = list_first_entry(&connector->base.probed_modes, in intel_panel_edid_fixed_mode()
136 fixed_mode = drm_mode_duplicate(&dev_priv->drm, scan); in intel_panel_edid_fixed_mode()
140 fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; in intel_panel_edid_fixed_mode()
142 drm_dbg_kms(&dev_priv->drm, in intel_panel_edid_fixed_mode()
144 connector->base.base.id, connector->base.name); in intel_panel_edid_fixed_mode()
153 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_vbt_fixed_mode()
154 struct drm_display_info *info = &connector->base.display_info; in intel_panel_vbt_fixed_mode()
157 if (!dev_priv->vbt.lfp_lvds_vbt_mode) in intel_panel_vbt_fixed_mode()
160 fixed_mode = drm_mode_duplicate(&dev_priv->drm, in intel_panel_vbt_fixed_mode()
161 dev_priv->vbt.lfp_lvds_vbt_mode); in intel_panel_vbt_fixed_mode()
165 fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; in intel_panel_vbt_fixed_mode()
167 drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s] using mode from VBT: ", in intel_panel_vbt_fixed_mode()
168 connector->base.base.id, connector->base.name); in intel_panel_vbt_fixed_mode()
171 info->width_mm = fixed_mode->width_mm; in intel_panel_vbt_fixed_mode()
172 info->height_mm = fixed_mode->height_mm; in intel_panel_vbt_fixed_mode()
182 &crtc_state->hw.adjusted_mode; in intel_pch_panel_fitting()
186 if (adjusted_mode->crtc_hdisplay == crtc_state->pipe_src_w && in intel_pch_panel_fitting()
187 adjusted_mode->crtc_vdisplay == crtc_state->pipe_src_h && in intel_pch_panel_fitting()
188 crtc_state->output_format != INTEL_OUTPUT_FORMAT_YCBCR420) in intel_pch_panel_fitting()
191 switch (conn_state->scaling_mode) { in intel_pch_panel_fitting()
193 width = crtc_state->pipe_src_w; in intel_pch_panel_fitting()
194 height = crtc_state->pipe_src_h; in intel_pch_panel_fitting()
195 x = (adjusted_mode->crtc_hdisplay - width + 1)/2; in intel_pch_panel_fitting()
196 y = (adjusted_mode->crtc_vdisplay - height + 1)/2; in intel_pch_panel_fitting()
202 u32 scaled_width = adjusted_mode->crtc_hdisplay in intel_pch_panel_fitting()
203 * crtc_state->pipe_src_h; in intel_pch_panel_fitting()
204 u32 scaled_height = crtc_state->pipe_src_w in intel_pch_panel_fitting()
205 * adjusted_mode->crtc_vdisplay; in intel_pch_panel_fitting()
207 width = scaled_height / crtc_state->pipe_src_h; in intel_pch_panel_fitting()
210 x = (adjusted_mode->crtc_hdisplay - width + 1) / 2; in intel_pch_panel_fitting()
212 height = adjusted_mode->crtc_vdisplay; in intel_pch_panel_fitting()
214 height = scaled_width / crtc_state->pipe_src_w; in intel_pch_panel_fitting()
217 y = (adjusted_mode->crtc_vdisplay - height + 1) / 2; in intel_pch_panel_fitting()
219 width = adjusted_mode->crtc_hdisplay; in intel_pch_panel_fitting()
222 width = adjusted_mode->crtc_hdisplay; in intel_pch_panel_fitting()
223 height = adjusted_mode->crtc_vdisplay; in intel_pch_panel_fitting()
229 WARN_ON(adjusted_mode->crtc_hdisplay != crtc_state->pipe_src_w); in intel_pch_panel_fitting()
230 WARN_ON(adjusted_mode->crtc_vdisplay != crtc_state->pipe_src_h); in intel_pch_panel_fitting()
234 width = adjusted_mode->crtc_hdisplay; in intel_pch_panel_fitting()
235 height = adjusted_mode->crtc_vdisplay; in intel_pch_panel_fitting()
239 MISSING_CASE(conn_state->scaling_mode); in intel_pch_panel_fitting()
240 return -EINVAL; in intel_pch_panel_fitting()
243 drm_rect_init(&crtc_state->pch_pfit.dst, in intel_pch_panel_fitting()
245 crtc_state->pch_pfit.enabled = true; in intel_pch_panel_fitting()
257 sync_width = adjusted_mode->crtc_hsync_end - adjusted_mode->crtc_hsync_start; in centre_horizontally()
258 blank_width = adjusted_mode->crtc_hblank_end - adjusted_mode->crtc_hblank_start; in centre_horizontally()
259 sync_pos = (blank_width - sync_width + 1) / 2; in centre_horizontally()
261 border = (adjusted_mode->crtc_hdisplay - width + 1) / 2; in centre_horizontally()
264 adjusted_mode->crtc_hdisplay = width; in centre_horizontally()
265 adjusted_mode->crtc_hblank_start = width + border; in centre_horizontally()
266 adjusted_mode->crtc_hblank_end = adjusted_mode->crtc_hblank_start + blank_width; in centre_horizontally()
268 adjusted_mode->crtc_hsync_start = adjusted_mode->crtc_hblank_start + sync_pos; in centre_horizontally()
269 adjusted_mode->crtc_hsync_end = adjusted_mode->crtc_hsync_start + sync_width; in centre_horizontally()
279 sync_width = adjusted_mode->crtc_vsync_end - adjusted_mode->crtc_vsync_start; in centre_vertically()
280 blank_width = adjusted_mode->crtc_vblank_end - adjusted_mode->crtc_vblank_start; in centre_vertically()
281 sync_pos = (blank_width - sync_width + 1) / 2; in centre_vertically()
283 border = (adjusted_mode->crtc_vdisplay - height + 1) / 2; in centre_vertically()
285 adjusted_mode->crtc_vdisplay = height; in centre_vertically()
286 adjusted_mode->crtc_vblank_start = height + border; in centre_vertically()
287 adjusted_mode->crtc_vblank_end = adjusted_mode->crtc_vblank_start + blank_width; in centre_vertically()
289 adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vblank_start + sync_pos; in centre_vertically()
290 adjusted_mode->crtc_vsync_end = adjusted_mode->crtc_vsync_start + sync_width; in centre_vertically()
310 &crtc_state->hw.adjusted_mode; in i965_scale_aspect()
311 u32 scaled_width = adjusted_mode->crtc_hdisplay * in i965_scale_aspect()
312 crtc_state->pipe_src_h; in i965_scale_aspect()
313 u32 scaled_height = crtc_state->pipe_src_w * in i965_scale_aspect()
314 adjusted_mode->crtc_vdisplay; in i965_scale_aspect()
323 else if (adjusted_mode->crtc_hdisplay != crtc_state->pipe_src_w) in i965_scale_aspect()
331 struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; in i9xx_scale_aspect()
332 u32 scaled_width = adjusted_mode->crtc_hdisplay * in i9xx_scale_aspect()
333 crtc_state->pipe_src_h; in i9xx_scale_aspect()
334 u32 scaled_height = crtc_state->pipe_src_w * in i9xx_scale_aspect()
335 adjusted_mode->crtc_vdisplay; in i9xx_scale_aspect()
346 crtc_state->pipe_src_h); in i9xx_scale_aspect()
349 if (crtc_state->pipe_src_h != adjusted_mode->crtc_vdisplay) { in i9xx_scale_aspect()
350 bits = panel_fitter_scaling(crtc_state->pipe_src_h, in i9xx_scale_aspect()
351 adjusted_mode->crtc_vdisplay); in i9xx_scale_aspect()
362 crtc_state->pipe_src_w); in i9xx_scale_aspect()
365 if (crtc_state->pipe_src_w != adjusted_mode->crtc_hdisplay) { in i9xx_scale_aspect()
366 bits = panel_fitter_scaling(crtc_state->pipe_src_w, in i9xx_scale_aspect()
367 adjusted_mode->crtc_hdisplay); in i9xx_scale_aspect()
387 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in intel_gmch_panel_fitting()
388 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); in intel_gmch_panel_fitting()
390 struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; in intel_gmch_panel_fitting()
393 if (adjusted_mode->crtc_hdisplay == crtc_state->pipe_src_w && in intel_gmch_panel_fitting()
394 adjusted_mode->crtc_vdisplay == crtc_state->pipe_src_h) in intel_gmch_panel_fitting()
397 switch (conn_state->scaling_mode) { in intel_gmch_panel_fitting()
403 centre_horizontally(adjusted_mode, crtc_state->pipe_src_w); in intel_gmch_panel_fitting()
404 centre_vertically(adjusted_mode, crtc_state->pipe_src_h); in intel_gmch_panel_fitting()
420 if (crtc_state->pipe_src_h != adjusted_mode->crtc_vdisplay || in intel_gmch_panel_fitting()
421 crtc_state->pipe_src_w != adjusted_mode->crtc_hdisplay) { in intel_gmch_panel_fitting()
433 MISSING_CASE(conn_state->scaling_mode); in intel_gmch_panel_fitting()
434 return -EINVAL; in intel_gmch_panel_fitting()
440 pfit_control |= PFIT_PIPE(crtc->pipe) | PFIT_FILTER_FUZZY; in intel_gmch_panel_fitting()
448 /* Make sure pre-965 set dither correctly for 18bpp panels. */ in intel_gmch_panel_fitting()
449 if (DISPLAY_VER(dev_priv) < 4 && crtc_state->pipe_bpp == 18) in intel_gmch_panel_fitting()
452 crtc_state->gmch_pfit.control = pfit_control; in intel_gmch_panel_fitting()
453 crtc_state->gmch_pfit.pgm_ratios = pfit_pgm_ratios; in intel_gmch_panel_fitting()
454 crtc_state->gmch_pfit.lvds_border_bits = border; in intel_gmch_panel_fitting()
460 * scale - scale values from one range to another
483 target_val = mul_u32_u32(source_val - source_min, in scale()
484 target_max - target_min); in scale()
485 target_val = DIV_ROUND_CLOSEST_ULL(target_val, source_max - source_min); in scale()
496 struct intel_panel *panel = &connector->panel; in clamp_user_to_hw()
499 hw_level = scale(user_level, 0, user_max, 0, panel->backlight.max); in clamp_user_to_hw()
500 hw_level = clamp(hw_level, panel->backlight.min, panel->backlight.max); in clamp_user_to_hw()
509 struct intel_panel *panel = &connector->panel; in scale_hw_to_user()
511 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_invert_pwm_level()
518 struct intel_panel *panel = &connector->panel; in intel_panel_invert_pwm_level()
520 drm_WARN_ON(&dev_priv->drm, panel->backlight.pwm_level_max == 0); in intel_panel_invert_pwm_level()
522 if (dev_priv->params.invert_brightness < 0) in intel_panel_invert_pwm_level()
525 if (dev_priv->params.invert_brightness > 0 || in intel_panel_invert_pwm_level()
526 dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS) { in intel_panel_invert_pwm_level()
527 return panel->backlight.pwm_level_max - val + panel->backlight.pwm_level_min; in intel_panel_invert_pwm_level()
535 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_panel_set_pwm_level()
536 struct drm_i915_private *i915 = to_i915(connector->base.dev); in intel_panel_set_pwm_level()
537 struct intel_panel *panel = &connector->panel; in intel_panel_set_pwm_level()
539 drm_dbg_kms(&i915->drm, "set backlight PWM = %d\n", val); in intel_panel_set_pwm_level()
540 panel->backlight.pwm_funcs->set(conn_state, val); in intel_panel_set_pwm_level()
545 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_backlight_level_to_pwm()
546 struct intel_panel *panel = &connector->panel; in intel_panel_backlight_level_to_pwm()
548 drm_WARN_ON_ONCE(&dev_priv->drm, in intel_panel_backlight_level_to_pwm()
549 panel->backlight.max == 0 || panel->backlight.pwm_level_max == 0); in intel_panel_backlight_level_to_pwm()
551 val = scale(val, panel->backlight.min, panel->backlight.max, in intel_panel_backlight_level_to_pwm()
552 panel->backlight.pwm_level_min, panel->backlight.pwm_level_max); in intel_panel_backlight_level_to_pwm()
559 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_backlight_level_from_pwm()
560 struct intel_panel *panel = &connector->panel; in intel_panel_backlight_level_from_pwm()
562 drm_WARN_ON_ONCE(&dev_priv->drm, in intel_panel_backlight_level_from_pwm()
563 panel->backlight.max == 0 || panel->backlight.pwm_level_max == 0); in intel_panel_backlight_level_from_pwm()
565 if (dev_priv->params.invert_brightness > 0 || in intel_panel_backlight_level_from_pwm()
566 (dev_priv->params.invert_brightness == 0 && dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS)) in intel_panel_backlight_level_from_pwm()
567 val = panel->backlight.pwm_level_max - (val - panel->backlight.pwm_level_min); in intel_panel_backlight_level_from_pwm()
569 return scale(val, panel->backlight.pwm_level_min, panel->backlight.pwm_level_max, in intel_panel_backlight_level_from_pwm()
570 panel->backlight.min, panel->backlight.max); in intel_panel_backlight_level_from_pwm()
575 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in lpt_get_backlight()
582 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in pch_get_backlight()
589 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i9xx_get_backlight()
590 struct intel_panel *panel = &connector->panel; in i9xx_get_backlight()
597 if (panel->backlight.combination_mode) { in i9xx_get_backlight()
600 pci_read_config_byte(to_pci_dev(dev_priv->drm.dev), LBPC, &lbpc); in i9xx_get_backlight()
609 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in vlv_get_backlight()
611 if (drm_WARN_ON(&dev_priv->drm, pipe != PIPE_A && pipe != PIPE_B)) in vlv_get_backlight()
619 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in bxt_get_backlight()
620 struct intel_panel *panel = &connector->panel; in bxt_get_backlight()
623 BXT_BLC_PWM_DUTY(panel->backlight.controller)); in bxt_get_backlight()
628 struct intel_panel *panel = &connector->panel; in ext_pwm_get_backlight()
631 pwm_get_state(panel->backlight.pwm, &state); in ext_pwm_get_backlight()
637 struct intel_connector *connector = to_intel_connector(conn_state->connector); in lpt_set_backlight()
638 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in lpt_set_backlight()
646 struct intel_connector *connector = to_intel_connector(conn_state->connector); in pch_set_backlight()
647 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in pch_set_backlight()
656 struct intel_connector *connector = to_intel_connector(conn_state->connector); in i9xx_set_backlight()
657 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i9xx_set_backlight()
658 struct intel_panel *panel = &connector->panel; in i9xx_set_backlight()
661 drm_WARN_ON(&dev_priv->drm, panel->backlight.pwm_level_max == 0); in i9xx_set_backlight()
663 if (panel->backlight.combination_mode) { in i9xx_set_backlight()
666 lbpc = level * 0xfe / panel->backlight.pwm_level_max + 1; in i9xx_set_backlight()
668 pci_write_config_byte(to_pci_dev(dev_priv->drm.dev), LBPC, lbpc); in i9xx_set_backlight()
684 struct intel_connector *connector = to_intel_connector(conn_state->connector); in vlv_set_backlight()
685 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in vlv_set_backlight()
686 enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe; in vlv_set_backlight()
695 struct intel_connector *connector = to_intel_connector(conn_state->connector); in bxt_set_backlight()
696 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in bxt_set_backlight()
697 struct intel_panel *panel = &connector->panel; in bxt_set_backlight()
700 BXT_BLC_PWM_DUTY(panel->backlight.controller), level); in bxt_set_backlight()
705 struct intel_panel *panel = &to_intel_connector(conn_state->connector)->panel; in ext_pwm_set_backlight()
707 pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100); in ext_pwm_set_backlight()
708 pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state); in ext_pwm_set_backlight()
714 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_panel_actually_set_backlight()
715 struct drm_i915_private *i915 = to_i915(connector->base.dev); in intel_panel_actually_set_backlight()
716 struct intel_panel *panel = &connector->panel; in intel_panel_actually_set_backlight()
718 drm_dbg_kms(&i915->drm, "set backlight level = %d\n", level); in intel_panel_actually_set_backlight()
720 panel->backlight.funcs->set(conn_state, level); in intel_panel_actually_set_backlight()
723 /* set backlight brightness to level in range [0..max], assuming hw min is
729 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_panel_set_backlight_acpi()
730 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_set_backlight_acpi()
731 struct intel_panel *panel = &connector->panel; in intel_panel_set_backlight_acpi()
736 * connection_mutex isn't held across the entire backlight in intel_panel_set_backlight_acpi()
740 if (!panel->backlight.present || !conn_state->crtc) in intel_panel_set_backlight_acpi()
743 mutex_lock(&dev_priv->backlight_lock); in intel_panel_set_backlight_acpi()
745 drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0); in intel_panel_set_backlight_acpi()
748 panel->backlight.level = hw_level; in intel_panel_set_backlight_acpi()
750 if (panel->backlight.device) in intel_panel_set_backlight_acpi()
751 panel->backlight.device->props.brightness = in intel_panel_set_backlight_acpi()
753 panel->backlight.level, in intel_panel_set_backlight_acpi()
754 panel->backlight.device->props.max_brightness); in intel_panel_set_backlight_acpi()
756 if (panel->backlight.enabled) in intel_panel_set_backlight_acpi()
759 mutex_unlock(&dev_priv->backlight_lock); in intel_panel_set_backlight_acpi()
764 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in lpt_disable_backlight()
765 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in lpt_disable_backlight()
771 * Although we don't support or enable CPU PWM with LPT/SPT based in lpt_disable_backlight()
775 * This needs rework if we need to add support for CPU PWM on PCH split in lpt_disable_backlight()
780 drm_dbg_kms(&dev_priv->drm, in lpt_disable_backlight()
781 "cpu backlight was enabled, disabling\n"); in lpt_disable_backlight()
792 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in pch_disable_backlight()
793 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in pch_disable_backlight()
812 struct drm_i915_private *dev_priv = to_i915(old_conn_state->connector->dev); in i965_disable_backlight()
823 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in vlv_disable_backlight()
824 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in vlv_disable_backlight()
825 enum pipe pipe = to_intel_crtc(old_conn_state->crtc)->pipe; in vlv_disable_backlight()
837 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in bxt_disable_backlight()
838 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in bxt_disable_backlight()
839 struct intel_panel *panel = &connector->panel; in bxt_disable_backlight()
845 BXT_BLC_PWM_CTL(panel->backlight.controller)); in bxt_disable_backlight()
846 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller), in bxt_disable_backlight()
849 if (panel->backlight.controller == 1) { in bxt_disable_backlight()
858 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in cnp_disable_backlight()
859 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in cnp_disable_backlight()
860 struct intel_panel *panel = &connector->panel; in cnp_disable_backlight()
866 BXT_BLC_PWM_CTL(panel->backlight.controller)); in cnp_disable_backlight()
867 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller), in cnp_disable_backlight()
873 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in ext_pwm_disable_backlight()
874 struct intel_panel *panel = &connector->panel; in ext_pwm_disable_backlight()
876 panel->backlight.pwm_state.enabled = false; in ext_pwm_disable_backlight()
877 pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state); in ext_pwm_disable_backlight()
882 struct intel_connector *connector = to_intel_connector(old_conn_state->connector); in intel_panel_disable_backlight()
883 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_disable_backlight()
884 struct intel_panel *panel = &connector->panel; in intel_panel_disable_backlight()
886 if (!panel->backlight.present) in intel_panel_disable_backlight()
890 * Do not disable backlight on the vga_switcheroo path. When switching in intel_panel_disable_backlight()
892 * backlight. This will leave the backlight on unnecessarily when in intel_panel_disable_backlight()
895 if (dev_priv->drm.switch_power_state == DRM_SWITCH_POWER_CHANGING) { in intel_panel_disable_backlight()
896 drm_dbg_kms(&dev_priv->drm, in intel_panel_disable_backlight()
897 "Skipping backlight disable on vga switch\n"); in intel_panel_disable_backlight()
901 mutex_lock(&dev_priv->backlight_lock); in intel_panel_disable_backlight()
903 if (panel->backlight.device) in intel_panel_disable_backlight()
904 panel->backlight.device->props.power = FB_BLANK_POWERDOWN; in intel_panel_disable_backlight()
905 panel->backlight.enabled = false; in intel_panel_disable_backlight()
906 panel->backlight.funcs->disable(old_conn_state, 0); in intel_panel_disable_backlight()
908 mutex_unlock(&dev_priv->backlight_lock); in intel_panel_disable_backlight()
914 struct intel_connector *connector = to_intel_connector(conn_state->connector); in lpt_enable_backlight()
915 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in lpt_enable_backlight()
916 struct intel_panel *panel = &connector->panel; in lpt_enable_backlight()
921 drm_dbg_kms(&dev_priv->drm, "pch backlight already enabled\n"); in lpt_enable_backlight()
928 if (panel->backlight.alternate_pwm_increment) in lpt_enable_backlight()
935 if (panel->backlight.alternate_pwm_increment) in lpt_enable_backlight()
942 pch_ctl2 = panel->backlight.pwm_level_max << 16; in lpt_enable_backlight()
946 if (panel->backlight.active_low_pwm) in lpt_enable_backlight()
965 struct intel_connector *connector = to_intel_connector(conn_state->connector); in pch_enable_backlight()
966 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in pch_enable_backlight()
967 struct intel_panel *panel = &connector->panel; in pch_enable_backlight()
968 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; in pch_enable_backlight()
973 drm_dbg_kms(&dev_priv->drm, "cpu backlight already enabled\n"); in pch_enable_backlight()
980 drm_dbg_kms(&dev_priv->drm, "pch backlight already enabled\n"); in pch_enable_backlight()
996 pch_ctl2 = panel->backlight.pwm_level_max << 16; in pch_enable_backlight()
1000 if (panel->backlight.active_low_pwm) in pch_enable_backlight()
1012 struct intel_connector *connector = to_intel_connector(conn_state->connector); in i9xx_enable_backlight()
1013 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i9xx_enable_backlight()
1014 struct intel_panel *panel = &connector->panel; in i9xx_enable_backlight()
1019 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n"); in i9xx_enable_backlight()
1023 freq = panel->backlight.pwm_level_max; in i9xx_enable_backlight()
1024 if (panel->backlight.combination_mode) in i9xx_enable_backlight()
1028 if (panel->backlight.combination_mode) in i9xx_enable_backlight()
1030 if (IS_PINEVIEW(dev_priv) && panel->backlight.active_low_pwm) in i9xx_enable_backlight()
1040 * Needed to enable backlight on some 855gm models. BLC_HIST_CTL is in i9xx_enable_backlight()
1042 * that has backlight. in i9xx_enable_backlight()
1051 struct intel_connector *connector = to_intel_connector(conn_state->connector); in i965_enable_backlight()
1052 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i965_enable_backlight()
1053 struct intel_panel *panel = &connector->panel; in i965_enable_backlight()
1054 enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe; in i965_enable_backlight()
1059 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n"); in i965_enable_backlight()
1064 freq = panel->backlight.pwm_level_max; in i965_enable_backlight()
1065 if (panel->backlight.combination_mode) in i965_enable_backlight()
1072 if (panel->backlight.combination_mode) in i965_enable_backlight()
1074 if (panel->backlight.active_low_pwm) in i965_enable_backlight()
1086 struct intel_connector *connector = to_intel_connector(conn_state->connector); in vlv_enable_backlight()
1087 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in vlv_enable_backlight()
1088 struct intel_panel *panel = &connector->panel; in vlv_enable_backlight()
1089 enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe; in vlv_enable_backlight()
1094 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n"); in vlv_enable_backlight()
1099 ctl = panel->backlight.pwm_level_max << 16; in vlv_enable_backlight()
1106 if (panel->backlight.active_low_pwm) in vlv_enable_backlight()
1117 struct intel_connector *connector = to_intel_connector(conn_state->connector); in bxt_enable_backlight()
1118 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in bxt_enable_backlight()
1119 struct intel_panel *panel = &connector->panel; in bxt_enable_backlight()
1120 enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe; in bxt_enable_backlight()
1124 if (panel->backlight.controller == 1) { in bxt_enable_backlight()
1127 drm_dbg_kms(&dev_priv->drm, in bxt_enable_backlight()
1134 if (panel->backlight.util_pin_active_low) in bxt_enable_backlight()
1141 BXT_BLC_PWM_CTL(panel->backlight.controller)); in bxt_enable_backlight()
1143 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n"); in bxt_enable_backlight()
1146 BXT_BLC_PWM_CTL(panel->backlight.controller), in bxt_enable_backlight()
1151 BXT_BLC_PWM_FREQ(panel->backlight.controller), in bxt_enable_backlight()
1152 panel->backlight.pwm_level_max); in bxt_enable_backlight()
1157 if (panel->backlight.active_low_pwm) in bxt_enable_backlight()
1160 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller), in bxt_enable_backlight()
1163 BXT_BLC_PWM_CTL(panel->backlight.controller)); in bxt_enable_backlight()
1164 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller), in bxt_enable_backlight()
1171 struct intel_connector *connector = to_intel_connector(conn_state->connector); in cnp_enable_backlight()
1172 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in cnp_enable_backlight()
1173 struct intel_panel *panel = &connector->panel; in cnp_enable_backlight()
1177 BXT_BLC_PWM_CTL(panel->backlight.controller)); in cnp_enable_backlight()
1179 drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n"); in cnp_enable_backlight()
1182 BXT_BLC_PWM_CTL(panel->backlight.controller), in cnp_enable_backlight()
1187 BXT_BLC_PWM_FREQ(panel->backlight.controller), in cnp_enable_backlight()
1188 panel->backlight.pwm_level_max); in cnp_enable_backlight()
1193 if (panel->backlight.active_low_pwm) in cnp_enable_backlight()
1196 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller), in cnp_enable_backlight()
1199 BXT_BLC_PWM_CTL(panel->backlight.controller)); in cnp_enable_backlight()
1200 intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller), in cnp_enable_backlight()
1207 struct intel_connector *connector = to_intel_connector(conn_state->connector); in ext_pwm_enable_backlight()
1208 struct intel_panel *panel = &connector->panel; in ext_pwm_enable_backlight()
1210 pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100); in ext_pwm_enable_backlight()
1211 panel->backlight.pwm_state.enabled = true; in ext_pwm_enable_backlight()
1212 pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state); in ext_pwm_enable_backlight()
1218 struct intel_connector *connector = to_intel_connector(conn_state->connector); in __intel_panel_enable_backlight()
1219 struct intel_panel *panel = &connector->panel; in __intel_panel_enable_backlight()
1221 WARN_ON(panel->backlight.max == 0); in __intel_panel_enable_backlight()
1223 if (panel->backlight.level <= panel->backlight.min) { in __intel_panel_enable_backlight()
1224 panel->backlight.level = panel->backlight.max; in __intel_panel_enable_backlight()
1225 if (panel->backlight.device) in __intel_panel_enable_backlight()
1226 panel->backlight.device->props.brightness = in __intel_panel_enable_backlight()
1228 panel->backlight.level, in __intel_panel_enable_backlight()
1229 panel->backlight.device->props.max_brightness); in __intel_panel_enable_backlight()
1232 panel->backlight.funcs->enable(crtc_state, conn_state, panel->backlight.level); in __intel_panel_enable_backlight()
1233 panel->backlight.enabled = true; in __intel_panel_enable_backlight()
1234 if (panel->backlight.device) in __intel_panel_enable_backlight()
1235 panel->backlight.device->props.power = FB_BLANK_UNBLANK; in __intel_panel_enable_backlight()
1241 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_panel_enable_backlight()
1242 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_enable_backlight()
1243 struct intel_panel *panel = &connector->panel; in intel_panel_enable_backlight()
1244 enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe; in intel_panel_enable_backlight()
1246 if (!panel->backlight.present) in intel_panel_enable_backlight()
1249 drm_dbg_kms(&dev_priv->drm, "pipe %c\n", pipe_name(pipe)); in intel_panel_enable_backlight()
1251 mutex_lock(&dev_priv->backlight_lock); in intel_panel_enable_backlight()
1255 mutex_unlock(&dev_priv->backlight_lock); in intel_panel_enable_backlight()
1261 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_get_backlight()
1262 struct intel_panel *panel = &connector->panel; in intel_panel_get_backlight()
1265 mutex_lock(&dev_priv->backlight_lock); in intel_panel_get_backlight()
1267 if (panel->backlight.enabled) in intel_panel_get_backlight()
1268 val = panel->backlight.funcs->get(connector, intel_connector_get_pipe(connector)); in intel_panel_get_backlight()
1270 mutex_unlock(&dev_priv->backlight_lock); in intel_panel_get_backlight()
1272 drm_dbg_kms(&dev_priv->drm, "get backlight PWM = %d\n", val); in intel_panel_get_backlight()
1280 struct intel_panel *panel = &connector->panel; in scale_user_to_hw()
1283 panel->backlight.min, panel->backlight.max); in scale_user_to_hw()
1286 /* set backlight brightness to level in range [0..max], scaling wrt hw min */
1290 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_panel_set_backlight()
1291 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_set_backlight()
1292 struct intel_panel *panel = &connector->panel; in intel_panel_set_backlight()
1295 if (!panel->backlight.present) in intel_panel_set_backlight()
1298 mutex_lock(&dev_priv->backlight_lock); in intel_panel_set_backlight()
1300 drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0); in intel_panel_set_backlight()
1303 panel->backlight.level = hw_level; in intel_panel_set_backlight()
1305 if (panel->backlight.enabled) in intel_panel_set_backlight()
1308 mutex_unlock(&dev_priv->backlight_lock); in intel_panel_set_backlight()
1314 struct intel_panel *panel = &connector->panel; in intel_backlight_device_update_status()
1315 struct drm_device *dev = connector->base.dev; in intel_backlight_device_update_status()
1317 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); in intel_backlight_device_update_status()
1319 bd->props.brightness, bd->props.max_brightness); in intel_backlight_device_update_status()
1320 intel_panel_set_backlight(connector->base.state, bd->props.brightness, in intel_backlight_device_update_status()
1321 bd->props.max_brightness); in intel_backlight_device_update_status()
1324 * Allow flipping bl_power as a sub-state of enabled. Sadly the in intel_backlight_device_update_status()
1325 * backlight class device does not make it easy to to differentiate in intel_backlight_device_update_status()
1329 if (panel->backlight.enabled) { in intel_backlight_device_update_status()
1330 if (panel->backlight.power) { in intel_backlight_device_update_status()
1331 bool enable = bd->props.power == FB_BLANK_UNBLANK && in intel_backlight_device_update_status()
1332 bd->props.brightness != 0; in intel_backlight_device_update_status()
1333 panel->backlight.power(connector, enable); in intel_backlight_device_update_status()
1336 bd->props.power = FB_BLANK_POWERDOWN; in intel_backlight_device_update_status()
1339 drm_modeset_unlock(&dev->mode_config.connection_mutex); in intel_backlight_device_update_status()
1346 struct drm_device *dev = connector->base.dev; in intel_backlight_device_get_brightness()
1351 with_intel_runtime_pm(&dev_priv->runtime_pm, wakeref) { in intel_backlight_device_get_brightness()
1354 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); in intel_backlight_device_get_brightness()
1358 hw_level, bd->props.max_brightness); in intel_backlight_device_get_brightness()
1360 drm_modeset_unlock(&dev->mode_config.connection_mutex); in intel_backlight_device_get_brightness()
1373 struct drm_i915_private *i915 = to_i915(connector->base.dev); in intel_backlight_device_register()
1374 struct intel_panel *panel = &connector->panel; in intel_backlight_device_register()
1380 if (WARN_ON(panel->backlight.device)) in intel_backlight_device_register()
1381 return -ENODEV; in intel_backlight_device_register()
1383 if (!panel->backlight.present) in intel_backlight_device_register()
1386 WARN_ON(panel->backlight.max == 0); in intel_backlight_device_register()
1392 * Note: Everything should work even if the backlight device max in intel_backlight_device_register()
1395 props.max_brightness = panel->backlight.max; in intel_backlight_device_register()
1397 panel->backlight.level, in intel_backlight_device_register()
1400 if (panel->backlight.enabled) in intel_backlight_device_register()
1407 return -ENOMEM; in intel_backlight_device_register()
1409 bd = backlight_device_register(name, connector->base.kdev, connector, in intel_backlight_device_register()
1414 * prevents registration of multiple backlight devices in the in intel_backlight_device_register()
1416 * compatibility. Use unique names for subsequent backlight devices as a in intel_backlight_device_register()
1419 if (IS_ERR(bd) && PTR_ERR(bd) == -EEXIST) { in intel_backlight_device_register()
1421 name = kasprintf(GFP_KERNEL, "card%d-%s-backlight", in intel_backlight_device_register()
1422 i915->drm.primary->index, connector->base.name); in intel_backlight_device_register()
1424 return -ENOMEM; in intel_backlight_device_register()
1426 bd = backlight_device_register(name, connector->base.kdev, connector, in intel_backlight_device_register()
1431 drm_err(&i915->drm, in intel_backlight_device_register()
1432 "[CONNECTOR:%d:%s] backlight device %s register failed: %ld\n", in intel_backlight_device_register()
1433 connector->base.base.id, connector->base.name, name, PTR_ERR(bd)); in intel_backlight_device_register()
1438 panel->backlight.device = bd; in intel_backlight_device_register()
1440 drm_dbg_kms(&i915->drm, in intel_backlight_device_register()
1441 "[CONNECTOR:%d:%s] backlight device %s registered\n", in intel_backlight_device_register()
1442 connector->base.base.id, connector->base.name, name); in intel_backlight_device_register()
1452 struct intel_panel *panel = &connector->panel; in intel_backlight_device_unregister()
1454 if (panel->backlight.device) { in intel_backlight_device_unregister()
1455 backlight_device_unregister(panel->backlight.device); in intel_backlight_device_unregister()
1456 panel->backlight.device = NULL; in intel_backlight_device_unregister()
1462 * CNP: PWM clock frequency is 19.2 MHz or 24 MHz.
1463 * PWM increment = 1
1467 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in cnp_hz_to_pwm()
1469 return DIV_ROUND_CLOSEST(KHz(RUNTIME_INFO(dev_priv)->rawclk_freq), in cnp_hz_to_pwm()
1474 * BXT: PWM clock frequency = 19.2 MHz.
1482 * SPT: This value represents the period of the PWM stream in clock periods
1484 * SCHICKEN_1 bit 0). PWM clock is 24 MHz.
1488 struct intel_panel *panel = &connector->panel; in spt_hz_to_pwm()
1491 if (panel->backlight.alternate_pwm_increment) in spt_hz_to_pwm()
1500 * LPT: This value represents the period of the PWM stream in clock periods
1506 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in lpt_hz_to_pwm()
1507 struct intel_panel *panel = &connector->panel; in lpt_hz_to_pwm()
1510 if (panel->backlight.alternate_pwm_increment) in lpt_hz_to_pwm()
1524 * ILK/SNB/IVB: This value represents the period of the PWM stream in PCH
1529 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in pch_hz_to_pwm()
1531 return DIV_ROUND_CLOSEST(KHz(RUNTIME_INFO(dev_priv)->rawclk_freq), in pch_hz_to_pwm()
1537 * clock frequency/32) in total for a complete cycle of modulated backlight
1545 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i9xx_hz_to_pwm()
1549 clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq); in i9xx_hz_to_pwm()
1551 clock = KHz(dev_priv->cdclk.hw.cdclk); in i9xx_hz_to_pwm()
1557 * Gen4: This value represents the period of the PWM stream in display core
1563 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i965_hz_to_pwm()
1567 clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq); in i965_hz_to_pwm()
1569 clock = KHz(dev_priv->cdclk.hw.cdclk); in i965_hz_to_pwm()
1575 * VLV: This value represents the period of the PWM stream in display core
1581 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in vlv_hz_to_pwm()
1591 clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq); in vlv_hz_to_pwm()
1600 u16 pwm_freq_hz = dev_priv->vbt.backlight.pwm_freq_hz; in get_vbt_pwm_freq()
1603 drm_dbg_kms(&dev_priv->drm, in get_vbt_pwm_freq()
1604 "VBT defined backlight frequency %u Hz\n", in get_vbt_pwm_freq()
1608 drm_dbg_kms(&dev_priv->drm, in get_vbt_pwm_freq()
1609 "default backlight frequency %u Hz\n", in get_vbt_pwm_freq()
1618 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in get_backlight_max_vbt()
1619 struct intel_panel *panel = &connector->panel; in get_backlight_max_vbt()
1621 u32 pwm; in get_backlight_max_vbt() local
1623 if (!panel->backlight.pwm_funcs->hz_to_pwm) { in get_backlight_max_vbt()
1624 drm_dbg_kms(&dev_priv->drm, in get_backlight_max_vbt()
1625 "backlight frequency conversion not supported\n"); in get_backlight_max_vbt()
1629 pwm = panel->backlight.pwm_funcs->hz_to_pwm(connector, pwm_freq_hz); in get_backlight_max_vbt()
1630 if (!pwm) { in get_backlight_max_vbt()
1631 drm_dbg_kms(&dev_priv->drm, in get_backlight_max_vbt()
1632 "backlight frequency conversion failed\n"); in get_backlight_max_vbt()
1636 return pwm; in get_backlight_max_vbt()
1644 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in get_backlight_min_vbt()
1645 struct intel_panel *panel = &connector->panel; in get_backlight_min_vbt()
1648 drm_WARN_ON(&dev_priv->drm, panel->backlight.pwm_level_max == 0); in get_backlight_min_vbt()
1657 min = clamp_t(int, dev_priv->vbt.backlight.min_brightness, 0, 64); in get_backlight_min_vbt()
1658 if (min != dev_priv->vbt.backlight.min_brightness) { in get_backlight_min_vbt()
1659 drm_dbg_kms(&dev_priv->drm, in get_backlight_min_vbt()
1660 "clamping VBT min backlight %d/255 to %d/255\n", in get_backlight_min_vbt()
1661 dev_priv->vbt.backlight.min_brightness, min); in get_backlight_min_vbt()
1665 return scale(min, 0, 255, 0, panel->backlight.pwm_level_max); in get_backlight_min_vbt()
1670 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in lpt_setup_backlight()
1671 struct intel_panel *panel = &connector->panel; in lpt_setup_backlight()
1679 panel->backlight.alternate_pwm_increment = alt; in lpt_setup_backlight()
1682 panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY; in lpt_setup_backlight()
1685 panel->backlight.pwm_level_max = pch_ctl2 >> 16; in lpt_setup_backlight()
1689 if (!panel->backlight.pwm_level_max) in lpt_setup_backlight()
1690 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector); in lpt_setup_backlight()
1692 if (!panel->backlight.pwm_level_max) in lpt_setup_backlight()
1693 return -ENODEV; in lpt_setup_backlight()
1695 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in lpt_setup_backlight()
1697 panel->backlight.pwm_enabled = pch_ctl1 & BLM_PCH_PWM_ENABLE; in lpt_setup_backlight()
1699 cpu_mode = panel->backlight.pwm_enabled && HAS_PCH_LPT(dev_priv) && in lpt_setup_backlight()
1706 drm_dbg_kms(&dev_priv->drm, in lpt_setup_backlight()
1707 "CPU backlight register was enabled, switching to PCH override\n"); in lpt_setup_backlight()
1709 /* Write converted CPU PWM value to PCH override register */ in lpt_setup_backlight()
1710 lpt_set_backlight(connector->base.state, val); in lpt_setup_backlight()
1723 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in pch_setup_backlight()
1724 struct intel_panel *panel = &connector->panel; in pch_setup_backlight()
1728 panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY; in pch_setup_backlight()
1731 panel->backlight.pwm_level_max = pch_ctl2 >> 16; in pch_setup_backlight()
1733 if (!panel->backlight.pwm_level_max) in pch_setup_backlight()
1734 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector); in pch_setup_backlight()
1736 if (!panel->backlight.pwm_level_max) in pch_setup_backlight()
1737 return -ENODEV; in pch_setup_backlight()
1739 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in pch_setup_backlight()
1742 panel->backlight.pwm_enabled = (cpu_ctl2 & BLM_PWM_ENABLE) && in pch_setup_backlight()
1750 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i9xx_setup_backlight()
1751 struct intel_panel *panel = &connector->panel; in i9xx_setup_backlight()
1757 panel->backlight.combination_mode = ctl & BLM_LEGACY_MODE; in i9xx_setup_backlight()
1760 panel->backlight.active_low_pwm = ctl & BLM_POLARITY_PNV; in i9xx_setup_backlight()
1762 panel->backlight.pwm_level_max = ctl >> 17; in i9xx_setup_backlight()
1764 if (!panel->backlight.pwm_level_max) { in i9xx_setup_backlight()
1765 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector); in i9xx_setup_backlight()
1766 panel->backlight.pwm_level_max >>= 1; in i9xx_setup_backlight()
1769 if (!panel->backlight.pwm_level_max) in i9xx_setup_backlight()
1770 return -ENODEV; in i9xx_setup_backlight()
1772 if (panel->backlight.combination_mode) in i9xx_setup_backlight()
1773 panel->backlight.pwm_level_max *= 0xff; in i9xx_setup_backlight()
1775 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in i9xx_setup_backlight()
1779 val = clamp(val, panel->backlight.pwm_level_min, panel->backlight.pwm_level_max); in i9xx_setup_backlight()
1781 panel->backlight.pwm_enabled = val != 0; in i9xx_setup_backlight()
1788 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in i965_setup_backlight()
1789 struct intel_panel *panel = &connector->panel; in i965_setup_backlight()
1793 panel->backlight.combination_mode = ctl2 & BLM_COMBINATION_MODE; in i965_setup_backlight()
1794 panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965; in i965_setup_backlight()
1797 panel->backlight.pwm_level_max = ctl >> 16; in i965_setup_backlight()
1799 if (!panel->backlight.pwm_level_max) in i965_setup_backlight()
1800 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector); in i965_setup_backlight()
1802 if (!panel->backlight.pwm_level_max) in i965_setup_backlight()
1803 return -ENODEV; in i965_setup_backlight()
1805 if (panel->backlight.combination_mode) in i965_setup_backlight()
1806 panel->backlight.pwm_level_max *= 0xff; in i965_setup_backlight()
1808 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in i965_setup_backlight()
1810 panel->backlight.pwm_enabled = ctl2 & BLM_PWM_ENABLE; in i965_setup_backlight()
1817 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in vlv_setup_backlight()
1818 struct intel_panel *panel = &connector->panel; in vlv_setup_backlight()
1821 if (drm_WARN_ON(&dev_priv->drm, pipe != PIPE_A && pipe != PIPE_B)) in vlv_setup_backlight()
1822 return -ENODEV; in vlv_setup_backlight()
1825 panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965; in vlv_setup_backlight()
1828 panel->backlight.pwm_level_max = ctl >> 16; in vlv_setup_backlight()
1830 if (!panel->backlight.pwm_level_max) in vlv_setup_backlight()
1831 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector); in vlv_setup_backlight()
1833 if (!panel->backlight.pwm_level_max) in vlv_setup_backlight()
1834 return -ENODEV; in vlv_setup_backlight()
1836 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in vlv_setup_backlight()
1838 panel->backlight.pwm_enabled = ctl2 & BLM_PWM_ENABLE; in vlv_setup_backlight()
1846 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in bxt_setup_backlight()
1847 struct intel_panel *panel = &connector->panel; in bxt_setup_backlight()
1850 panel->backlight.controller = dev_priv->vbt.backlight.controller; in bxt_setup_backlight()
1853 BXT_BLC_PWM_CTL(panel->backlight.controller)); in bxt_setup_backlight()
1856 if (panel->backlight.controller == 1) { in bxt_setup_backlight()
1858 panel->backlight.util_pin_active_low = in bxt_setup_backlight()
1862 panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY; in bxt_setup_backlight()
1863 panel->backlight.pwm_level_max = in bxt_setup_backlight()
1864 intel_de_read(dev_priv, BXT_BLC_PWM_FREQ(panel->backlight.controller)); in bxt_setup_backlight()
1866 if (!panel->backlight.pwm_level_max) in bxt_setup_backlight()
1867 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector); in bxt_setup_backlight()
1869 if (!panel->backlight.pwm_level_max) in bxt_setup_backlight()
1870 return -ENODEV; in bxt_setup_backlight()
1872 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in bxt_setup_backlight()
1874 panel->backlight.pwm_enabled = pwm_ctl & BXT_BLC_PWM_ENABLE; in bxt_setup_backlight()
1882 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in cnp_setup_backlight()
1883 struct intel_panel *panel = &connector->panel; in cnp_setup_backlight()
1887 * CNP has the BXT implementation of backlight, but with only one in cnp_setup_backlight()
1891 panel->backlight.controller = 0; in cnp_setup_backlight()
1894 BXT_BLC_PWM_CTL(panel->backlight.controller)); in cnp_setup_backlight()
1896 panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY; in cnp_setup_backlight()
1897 panel->backlight.pwm_level_max = in cnp_setup_backlight()
1898 intel_de_read(dev_priv, BXT_BLC_PWM_FREQ(panel->backlight.controller)); in cnp_setup_backlight()
1900 if (!panel->backlight.pwm_level_max) in cnp_setup_backlight()
1901 panel->backlight.pwm_level_max = get_backlight_max_vbt(connector); in cnp_setup_backlight()
1903 if (!panel->backlight.pwm_level_max) in cnp_setup_backlight()
1904 return -ENODEV; in cnp_setup_backlight()
1906 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in cnp_setup_backlight()
1908 panel->backlight.pwm_enabled = pwm_ctl & BXT_BLC_PWM_ENABLE; in cnp_setup_backlight()
1916 struct drm_device *dev = connector->base.dev; in ext_pwm_setup_backlight()
1918 struct intel_panel *panel = &connector->panel; in ext_pwm_setup_backlight()
1922 /* Get the right PWM chip for DSI backlight according to VBT */ in ext_pwm_setup_backlight()
1923 if (dev_priv->vbt.dsi.config->pwm_blc == PPS_BLC_PMIC) { in ext_pwm_setup_backlight()
1924 panel->backlight.pwm = pwm_get(dev->dev, "pwm_pmic_backlight"); in ext_pwm_setup_backlight()
1927 panel->backlight.pwm = pwm_get(dev->dev, "pwm_soc_backlight"); in ext_pwm_setup_backlight()
1931 if (IS_ERR(panel->backlight.pwm)) { in ext_pwm_setup_backlight()
1932 drm_err(&dev_priv->drm, "Failed to get the %s PWM chip\n", in ext_pwm_setup_backlight()
1934 panel->backlight.pwm = NULL; in ext_pwm_setup_backlight()
1935 return -ENODEV; in ext_pwm_setup_backlight()
1938 panel->backlight.pwm_level_max = 100; /* 100% */ in ext_pwm_setup_backlight()
1939 panel->backlight.pwm_level_min = get_backlight_min_vbt(connector); in ext_pwm_setup_backlight()
1941 if (pwm_is_enabled(panel->backlight.pwm)) { in ext_pwm_setup_backlight()
1942 /* PWM is already enabled, use existing settings */ in ext_pwm_setup_backlight()
1943 pwm_get_state(panel->backlight.pwm, &panel->backlight.pwm_state); in ext_pwm_setup_backlight()
1945 level = pwm_get_relative_duty_cycle(&panel->backlight.pwm_state, in ext_pwm_setup_backlight()
1948 panel->backlight.pwm_enabled = true; in ext_pwm_setup_backlight()
1950 drm_dbg_kms(&dev_priv->drm, "PWM already enabled at freq %ld, VBT freq %d, level %d\n", in ext_pwm_setup_backlight()
1951 NSEC_PER_SEC / (unsigned long)panel->backlight.pwm_state.period, in ext_pwm_setup_backlight()
1955 panel->backlight.pwm_state.period = in ext_pwm_setup_backlight()
1959 drm_info(&dev_priv->drm, "Using %s PWM for LCD backlight control\n", in ext_pwm_setup_backlight()
1966 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_pwm_set_backlight()
1967 struct intel_panel *panel = &connector->panel; in intel_pwm_set_backlight()
1969 panel->backlight.pwm_funcs->set(conn_state, in intel_pwm_set_backlight()
1975 struct intel_panel *panel = &connector->panel; in intel_pwm_get_backlight()
1978 panel->backlight.pwm_funcs->get(connector, pipe)); in intel_pwm_get_backlight()
1984 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_pwm_enable_backlight()
1985 struct intel_panel *panel = &connector->panel; in intel_pwm_enable_backlight()
1987 panel->backlight.pwm_funcs->enable(crtc_state, conn_state, in intel_pwm_enable_backlight()
1993 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_pwm_disable_backlight()
1994 struct intel_panel *panel = &connector->panel; in intel_pwm_disable_backlight()
1996 panel->backlight.pwm_funcs->disable(conn_state, in intel_pwm_disable_backlight()
2002 struct intel_panel *panel = &connector->panel; in intel_pwm_setup_backlight()
2003 int ret = panel->backlight.pwm_funcs->setup(connector, pipe); in intel_pwm_setup_backlight()
2008 panel->backlight.min = panel->backlight.pwm_level_min; in intel_pwm_setup_backlight()
2009 panel->backlight.max = panel->backlight.pwm_level_max; in intel_pwm_setup_backlight()
2010 panel->backlight.level = intel_pwm_get_backlight(connector, pipe); in intel_pwm_setup_backlight()
2011 panel->backlight.enabled = panel->backlight.pwm_enabled; in intel_pwm_setup_backlight()
2021 struct intel_connector *connector = to_intel_connector(conn_state->connector); in intel_panel_update_backlight()
2022 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_update_backlight()
2023 struct intel_panel *panel = &connector->panel; in intel_panel_update_backlight()
2025 if (!panel->backlight.present) in intel_panel_update_backlight()
2028 mutex_lock(&dev_priv->backlight_lock); in intel_panel_update_backlight()
2029 if (!panel->backlight.enabled) in intel_panel_update_backlight()
2032 mutex_unlock(&dev_priv->backlight_lock); in intel_panel_update_backlight()
2037 struct drm_i915_private *dev_priv = to_i915(connector->dev); in intel_panel_setup_backlight()
2039 struct intel_panel *panel = &intel_connector->panel; in intel_panel_setup_backlight()
2042 if (!dev_priv->vbt.backlight.present) { in intel_panel_setup_backlight()
2043 if (dev_priv->quirks & QUIRK_BACKLIGHT_PRESENT) { in intel_panel_setup_backlight()
2044 drm_dbg_kms(&dev_priv->drm, in intel_panel_setup_backlight()
2045 "no backlight present per VBT, but present per quirk\n"); in intel_panel_setup_backlight()
2047 drm_dbg_kms(&dev_priv->drm, in intel_panel_setup_backlight()
2048 "no backlight present per VBT\n"); in intel_panel_setup_backlight()
2054 if (drm_WARN_ON(&dev_priv->drm, !panel->backlight.funcs)) in intel_panel_setup_backlight()
2055 return -ENODEV; in intel_panel_setup_backlight()
2058 mutex_lock(&dev_priv->backlight_lock); in intel_panel_setup_backlight()
2059 ret = panel->backlight.funcs->setup(intel_connector, pipe); in intel_panel_setup_backlight()
2060 mutex_unlock(&dev_priv->backlight_lock); in intel_panel_setup_backlight()
2063 drm_dbg_kms(&dev_priv->drm, in intel_panel_setup_backlight()
2064 "failed to setup backlight for connector %s\n", in intel_panel_setup_backlight()
2065 connector->name); in intel_panel_setup_backlight()
2069 panel->backlight.present = true; in intel_panel_setup_backlight()
2071 drm_dbg_kms(&dev_priv->drm, in intel_panel_setup_backlight()
2072 "Connector %s backlight initialized, %s, brightness %u/%u\n", in intel_panel_setup_backlight()
2073 connector->name, in intel_panel_setup_backlight()
2074 enableddisabled(panel->backlight.enabled), in intel_panel_setup_backlight()
2075 panel->backlight.level, panel->backlight.max); in intel_panel_setup_backlight()
2082 /* dispose of the pwm */ in intel_panel_destroy_backlight()
2083 if (panel->backlight.pwm) in intel_panel_destroy_backlight()
2084 pwm_put(panel->backlight.pwm); in intel_panel_destroy_backlight()
2086 panel->backlight.present = false; in intel_panel_destroy_backlight()
2177 /* Set up chip specific backlight functions */
2183 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); in intel_panel_init_backlight_funcs()
2185 if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI && in intel_panel_init_backlight_funcs()
2190 panel->backlight.pwm_funcs = &bxt_pwm_funcs; in intel_panel_init_backlight_funcs()
2192 panel->backlight.pwm_funcs = &cnp_pwm_funcs; in intel_panel_init_backlight_funcs()
2195 panel->backlight.pwm_funcs = &lpt_pwm_funcs; in intel_panel_init_backlight_funcs()
2197 panel->backlight.pwm_funcs = &spt_pwm_funcs; in intel_panel_init_backlight_funcs()
2199 panel->backlight.pwm_funcs = &pch_pwm_funcs; in intel_panel_init_backlight_funcs()
2201 if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI) { in intel_panel_init_backlight_funcs()
2202 panel->backlight.pwm_funcs = &ext_pwm_funcs; in intel_panel_init_backlight_funcs()
2204 panel->backlight.pwm_funcs = &vlv_pwm_funcs; in intel_panel_init_backlight_funcs()
2207 panel->backlight.pwm_funcs = &i965_pwm_funcs; in intel_panel_init_backlight_funcs()
2209 panel->backlight.pwm_funcs = &i9xx_pwm_funcs; in intel_panel_init_backlight_funcs()
2212 if (connector->base.connector_type == DRM_MODE_CONNECTOR_eDP && in intel_panel_init_backlight_funcs()
2216 /* We're using a standard PWM backlight interface */ in intel_panel_init_backlight_funcs()
2217 panel->backlight.funcs = &pwm_bl_funcs; in intel_panel_init_backlight_funcs()
2223 struct drm_i915_private *i915 = to_i915(connector->dev); in intel_panel_detect()
2237 panel->fixed_mode = fixed_mode; in intel_panel_init()
2238 panel->downclock_mode = downclock_mode; in intel_panel_init()
2250 if (panel->fixed_mode) in intel_panel_fini()
2251 drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode); in intel_panel_fini()
2253 if (panel->downclock_mode) in intel_panel_fini()
2254 drm_mode_destroy(intel_connector->base.dev, in intel_panel_fini()
2255 panel->downclock_mode); in intel_panel_fini()