Message ID | 1486551058-22596-7-git-send-email-vidya.srinivas@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, 8 Feb 2017 16:20:55 +0530 Vidya Srinivas <vidya.srinivas@intel.com> wrote: > From: Uma Shankar <uma.shankar@intel.com> > > Fix BXT DSI disable sequence as per latest updates in BSpec. > > Signed-off-by: Uma Shankar <uma.shankar@intel.com> > Signed-off-by: Vidya Srinivas <vidya.srinivas@intel.com> > --- > drivers/gpu/drm/i915/intel_dsi.c | 29 +++++++++++++++++++++++++---- > 1 file changed, 25 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c > index 538755b..808158f 100644 > --- a/drivers/gpu/drm/i915/intel_dsi.c > +++ b/drivers/gpu/drm/i915/intel_dsi.c > @@ -632,8 +632,10 @@ static void intel_dsi_disable(struct intel_encoder *encoder) > for_each_dsi_port(port, intel_dsi->ports) > wait_for_dsi_fifo_empty(intel_dsi, port); > > - intel_dsi_port_disable(encoder); > - msleep(2); > + if (!IS_BROXTON(dev_priv)) { > + intel_dsi_port_disable(encoder); > + usleep_range(2000, 2500); > + } > } > > for_each_dsi_port(port, intel_dsi->ports) { > @@ -641,7 +643,11 @@ static void intel_dsi_disable(struct intel_encoder *encoder) > I915_WRITE(MIPI_DEVICE_READY(port), 0x0); > > intel_dsi_reset_clocks(encoder, port); > - I915_WRITE(MIPI_EOT_DISABLE(port), CLOCKSTOP); > + temp = 0; > + if (intel_dsi->clock_stop) { > + temp |= CLOCKSTOP; > + I915_WRITE(MIPI_EOT_DISABLE(port), temp); > + } This could be simplified to just if (intel_dsi->clock_stop) I915_WRITE(MIPI_EOT_DISABLE(port), CLOCKSTOP); > > temp = I915_READ(MIPI_DSI_FUNC_PRG(port)); > temp &= ~VID_MODE_FORMAT_MASK; > @@ -707,12 +713,25 @@ static void intel_dsi_post_disable(struct intel_encoder *encoder, > struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); > struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); > u32 val; > + enum port port; > > DRM_DEBUG_KMS("\n"); > > intel_dsi_disable(encoder); > > - intel_dsi_clear_device_ready(encoder); > + if (IS_BROXTON(dev_priv)) { > + /* > + * Reset the DSI Device ready first for both ports > + * and then port control registers for both ports > + */ > + for_each_dsi_port(port, intel_dsi->ports) > + I915_WRITE(MIPI_DEVICE_READY(port), 0); > + > + for_each_dsi_port(port, intel_dsi->ports) > + I915_WRITE(BXT_MIPI_PORT_CTRL(port), 0); > + } else { > + intel_dsi_clear_device_ready(encoder); > + } > > if (IS_BROXTON(dev_priv)) { > /* Power down DSI regulator to save power */ > @@ -737,6 +756,8 @@ static void intel_dsi_post_disable(struct intel_encoder *encoder, > > drm_panel_unprepare(intel_dsi->panel); > > + /* Disable Panel */ > + drm_panel_power_off(intel_dsi->panel); This depends on the previous patch, which I don't think is the direction we want to go. If the code is reworked to not use the drm_panel interface, then this would need to change also. > msleep(intel_dsi->panel_off_delay); > Do we need to call intel_disable_dsi_pll(encoder) here as part of the power off? > /* Panel Disable over CRC PMIC */
> -----Original Message----- > From: Paauwe, Bob J > Sent: Wednesday, February 15, 2017 11:55 PM > To: Srinivas, Vidya <vidya.srinivas@intel.com> > Cc: intel-gfx@lists.freedesktop.org; Nikula, Jani <jani.nikula@intel.com> > Subject: Re: [Intel-gfx] [PATCH 6/9] drm/i915/bxt: Fix BXT DSI disable > sequence > > On Wed, 8 Feb 2017 16:20:55 +0530 > Vidya Srinivas <vidya.srinivas@intel.com> wrote: > > > From: Uma Shankar <uma.shankar@intel.com> > > > > Fix BXT DSI disable sequence as per latest updates in BSpec. > > > > Signed-off-by: Uma Shankar <uma.shankar@intel.com> > > Signed-off-by: Vidya Srinivas <vidya.srinivas@intel.com> > > --- > > drivers/gpu/drm/i915/intel_dsi.c | 29 +++++++++++++++++++++++++---- > > 1 file changed, 25 insertions(+), 4 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/intel_dsi.c > > b/drivers/gpu/drm/i915/intel_dsi.c > > index 538755b..808158f 100644 > > --- a/drivers/gpu/drm/i915/intel_dsi.c > > +++ b/drivers/gpu/drm/i915/intel_dsi.c > > @@ -632,8 +632,10 @@ static void intel_dsi_disable(struct intel_encoder > *encoder) > > for_each_dsi_port(port, intel_dsi->ports) > > wait_for_dsi_fifo_empty(intel_dsi, port); > > > > - intel_dsi_port_disable(encoder); > > - msleep(2); > > + if (!IS_BROXTON(dev_priv)) { > > + intel_dsi_port_disable(encoder); > > + usleep_range(2000, 2500); > > + } > > } > > > > for_each_dsi_port(port, intel_dsi->ports) { @@ -641,7 +643,11 @@ > > static void intel_dsi_disable(struct intel_encoder *encoder) > > I915_WRITE(MIPI_DEVICE_READY(port), 0x0); > > > > intel_dsi_reset_clocks(encoder, port); > > - I915_WRITE(MIPI_EOT_DISABLE(port), CLOCKSTOP); > > + temp = 0; > > + if (intel_dsi->clock_stop) { > > + temp |= CLOCKSTOP; > > + I915_WRITE(MIPI_EOT_DISABLE(port), temp); > > + } > > This could be simplified to just > if (intel_dsi->clock_stop) > I915_WRITE(MIPI_EOT_DISABLE(port), CLOCKSTOP); > Yes, thanks Bob. I will fix this and resend. > > > > temp = I915_READ(MIPI_DSI_FUNC_PRG(port)); > > temp &= ~VID_MODE_FORMAT_MASK; > > @@ -707,12 +713,25 @@ static void intel_dsi_post_disable(struct > intel_encoder *encoder, > > struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); > > struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); > > u32 val; > > + enum port port; > > > > DRM_DEBUG_KMS("\n"); > > > > intel_dsi_disable(encoder); > > > > - intel_dsi_clear_device_ready(encoder); > > + if (IS_BROXTON(dev_priv)) { > > + /* > > + * Reset the DSI Device ready first for both ports > > + * and then port control registers for both ports > > + */ > > + for_each_dsi_port(port, intel_dsi->ports) > > + I915_WRITE(MIPI_DEVICE_READY(port), 0); > > + > > + for_each_dsi_port(port, intel_dsi->ports) > > + I915_WRITE(BXT_MIPI_PORT_CTRL(port), 0); > > + } else { > > + intel_dsi_clear_device_ready(encoder); > > + } > > > > if (IS_BROXTON(dev_priv)) { > > /* Power down DSI regulator to save power */ @@ -737,6 > +756,8 @@ > > static void intel_dsi_post_disable(struct intel_encoder *encoder, > > > > drm_panel_unprepare(intel_dsi->panel); > > > > + /* Disable Panel */ > > + drm_panel_power_off(intel_dsi->panel); > > This depends on the previous patch, which I don't think is the direction we > want to go. If the code is reworked to not use the drm_panel interface, then > this would need to change also. > Yes, I am planning a different approach to remove the drm_panel interface Dependency. Will re-submit an updated series. Thanks Bob for the review and useful comments. Regards Vidya > > msleep(intel_dsi->panel_off_delay); > > > > Do we need to call intel_disable_dsi_pll(encoder) here as part of the power > off? > > > /* Panel Disable over CRC PMIC */ > > > > -- > -- > Bob Paauwe > Bob.J.Paauwe@intel.com > IOTG / PED Software Organization > Intel Corp. Folsom, CA > (916) 356-6193
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c index 538755b..808158f 100644 --- a/drivers/gpu/drm/i915/intel_dsi.c +++ b/drivers/gpu/drm/i915/intel_dsi.c @@ -632,8 +632,10 @@ static void intel_dsi_disable(struct intel_encoder *encoder) for_each_dsi_port(port, intel_dsi->ports) wait_for_dsi_fifo_empty(intel_dsi, port); - intel_dsi_port_disable(encoder); - msleep(2); + if (!IS_BROXTON(dev_priv)) { + intel_dsi_port_disable(encoder); + usleep_range(2000, 2500); + } } for_each_dsi_port(port, intel_dsi->ports) { @@ -641,7 +643,11 @@ static void intel_dsi_disable(struct intel_encoder *encoder) I915_WRITE(MIPI_DEVICE_READY(port), 0x0); intel_dsi_reset_clocks(encoder, port); - I915_WRITE(MIPI_EOT_DISABLE(port), CLOCKSTOP); + temp = 0; + if (intel_dsi->clock_stop) { + temp |= CLOCKSTOP; + I915_WRITE(MIPI_EOT_DISABLE(port), temp); + } temp = I915_READ(MIPI_DSI_FUNC_PRG(port)); temp &= ~VID_MODE_FORMAT_MASK; @@ -707,12 +713,25 @@ static void intel_dsi_post_disable(struct intel_encoder *encoder, struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); u32 val; + enum port port; DRM_DEBUG_KMS("\n"); intel_dsi_disable(encoder); - intel_dsi_clear_device_ready(encoder); + if (IS_BROXTON(dev_priv)) { + /* + * Reset the DSI Device ready first for both ports + * and then port control registers for both ports + */ + for_each_dsi_port(port, intel_dsi->ports) + I915_WRITE(MIPI_DEVICE_READY(port), 0); + + for_each_dsi_port(port, intel_dsi->ports) + I915_WRITE(BXT_MIPI_PORT_CTRL(port), 0); + } else { + intel_dsi_clear_device_ready(encoder); + } if (IS_BROXTON(dev_priv)) { /* Power down DSI regulator to save power */ @@ -737,6 +756,8 @@ static void intel_dsi_post_disable(struct intel_encoder *encoder, drm_panel_unprepare(intel_dsi->panel); + /* Disable Panel */ + drm_panel_power_off(intel_dsi->panel); msleep(intel_dsi->panel_off_delay); /* Panel Disable over CRC PMIC */