]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
drm/i915: Add lspcon resume function
authorShashank Sharma <shashank.sharma@intel.com>
Tue, 28 Mar 2017 07:42:18 +0000 (15:42 +0800)
committerThadeu Lima de Souza Cascardo <cascardo@canonical.com>
Thu, 6 Apr 2017 08:23:44 +0000 (09:23 +0100)
BugLink: https://bugs.launchpad.net/bugs/1676747
As per the software design, we are driving lspcon in
PCON mode. But while resuming from suspend, lspcon can go
in LS mode (which is its default operating mode on power on)

This patch adds a resume function for lspcon, which makes sure
its operating in PCON mode, post resume.

V2: Address review comments from Imre
- move lspcon_resume call to encoder->reset()
- use early returns

Signed-off-by: Shashank Sharma <shashank.sharma@intel.com>
Reviewed-by: Imre Deak <imre.deak@intel.com>
Acked-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1476455212-27893-6-git-send-email-shashank.sharma@intel.com
(cherry picked from commit 910530c0630541aa5d2f20ea15f3108bfe2c1693)
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Acked-by: Tim Gardner <tim.gardner@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
ubuntu/i915/intel_dp.c
ubuntu/i915/intel_drv.h
ubuntu/i915/intel_lspcon.c

index 92320f6a628d4cf0e5469821c78b9182b71aea19..c61759ef00c818996a54937e2d0d0055872a8022 100644 (file)
@@ -4895,11 +4895,16 @@ static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
 void intel_dp_encoder_reset(struct drm_encoder *encoder)
 {
        struct drm_i915_private *dev_priv = to_i915(encoder->dev);
-       struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
+       struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
+       struct intel_lspcon *lspcon = &intel_dig_port->lspcon;
+       struct intel_dp *intel_dp = &intel_dig_port->dp;
 
        if (!HAS_DDI(dev_priv))
                intel_dp->DP = I915_READ(intel_dp->output_reg);
 
+       if (IS_GEN9(dev_priv) && lspcon->active)
+               lspcon_resume(lspcon);
+
        if (to_intel_encoder(encoder)->type != INTEL_OUTPUT_EDP)
                return;
 
index 0956da76fd82589f0fc57f13f12021faa78b5074..0fcd23566bcc7ee706c4bfee120dd2b06f5ffe2b 100644 (file)
@@ -1704,4 +1704,5 @@ void intel_color_load_luts(struct drm_crtc_state *crtc_state);
 
 /* intel_lspcon.c */
 bool lspcon_init(struct intel_digital_port *intel_dig_port);
+void lspcon_resume(struct intel_lspcon *lspcon);
 #endif /* __INTEL_DRV_H__ */
index 628ae6fbdcb1200727a25719b15ea01ab8abf4be..d606f1a8f3b686e6d9a449126fd8f76dc668c38a 100644 (file)
@@ -89,6 +89,14 @@ static bool lspcon_probe(struct intel_lspcon *lspcon)
        return true;
 }
 
+void lspcon_resume(struct intel_lspcon *lspcon)
+{
+       if (lspcon_change_mode(lspcon, DRM_LSPCON_MODE_PCON, true))
+               DRM_ERROR("LSPCON resume failed\n");
+       else
+               DRM_DEBUG_KMS("LSPCON resume success\n");
+}
+
 bool lspcon_init(struct intel_digital_port *intel_dig_port)
 {
        struct intel_dp *dp = &intel_dig_port->dp;