On Fri, 12 Jan 2018, Ville Syrjala <ville.syrj...@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrj...@linux.intel.com>
>
> Allow encoders to customize their hotplug processing by moving the
> intel_hpd_irq_event() code into an encoder hotplug vfunc. Currently
> only SDVO needs this to re-enable hotplug signalling in the SDVO
> chip. We'll use this same hook for DP/HDMI link management later.
>
> Signed-off-by: Ville Syrjälä <ville.syrj...@linux.intel.com>

Nice!

Reviewed-by: Jani Nikula <jani.nik...@intel.com>


> ---
>  drivers/gpu/drm/i915/intel_crt.c     |  4 +++-
>  drivers/gpu/drm/i915/intel_ddi.c     |  1 +
>  drivers/gpu/drm/i915/intel_dp.c      |  1 +
>  drivers/gpu/drm/i915/intel_drv.h     |  6 ++++--
>  drivers/gpu/drm/i915/intel_hdmi.c    |  1 +
>  drivers/gpu/drm/i915/intel_hotplug.c | 24 ++++++++++++------------
>  drivers/gpu/drm/i915/intel_sdvo.c    | 12 ++++++++++--
>  7 files changed, 32 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_crt.c 
> b/drivers/gpu/drm/i915/intel_crt.c
> index 9f31aea51dff..9bc47cff5409 100644
> --- a/drivers/gpu/drm/i915/intel_crt.c
> +++ b/drivers/gpu/drm/i915/intel_crt.c
> @@ -966,8 +966,10 @@ void intel_crt_init(struct drm_i915_private *dev_priv)
>       crt->base.power_domain = POWER_DOMAIN_PORT_CRT;
>  
>       if (I915_HAS_HOTPLUG(dev_priv) &&
> -         !dmi_check_system(intel_spurious_crt_detect))
> +         !dmi_check_system(intel_spurious_crt_detect)) {
>               crt->base.hpd_pin = HPD_CRT;
> +             crt->base.hotplug = intel_encoder_hotplug;
> +     }
>  
>       if (HAS_DDI(dev_priv)) {
>               crt->base.port = PORT_E;
> diff --git a/drivers/gpu/drm/i915/intel_ddi.c 
> b/drivers/gpu/drm/i915/intel_ddi.c
> index 6260a882fbe4..1aeae3e97013 100644
> --- a/drivers/gpu/drm/i915/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/intel_ddi.c
> @@ -2866,6 +2866,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, 
> enum port port)
>       drm_encoder_init(&dev_priv->drm, encoder, &intel_ddi_funcs,
>                        DRM_MODE_ENCODER_TMDS, "DDI %c", port_name(port));
>  
> +     intel_encoder->hotplug = intel_encoder_hotplug;
>       intel_encoder->compute_output_type = intel_ddi_compute_output_type;
>       intel_encoder->compute_config = intel_ddi_compute_config;
>       intel_encoder->enable = intel_enable_ddi;
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 68229f53d5b8..6bbf14410c2a 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -6400,6 +6400,7 @@ bool intel_dp_init(struct drm_i915_private *dev_priv,
>                            "DP %c", port_name(port)))
>               goto err_encoder_init;
>  
> +     intel_encoder->hotplug = intel_encoder_hotplug;
>       intel_encoder->compute_config = intel_dp_compute_config;
>       intel_encoder->get_hw_state = intel_dp_get_hw_state;
>       intel_encoder->get_config = intel_dp_get_config;
> diff --git a/drivers/gpu/drm/i915/intel_drv.h 
> b/drivers/gpu/drm/i915/intel_drv.h
> index 731dc36d7129..7537b2d542fd 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -214,7 +214,8 @@ struct intel_encoder {
>       enum intel_output_type type;
>       enum port port;
>       unsigned int cloneable;
> -     void (*hot_plug)(struct intel_encoder *);
> +     bool (*hotplug)(struct intel_encoder *encoder,
> +                     struct intel_connector *connector);
>       enum intel_output_type (*compute_output_type)(struct intel_encoder *,
>                                                     struct intel_crtc_state *,
>                                                     struct 
> drm_connector_state *);
> @@ -1690,7 +1691,8 @@ int intel_dsi_dcs_init_backlight_funcs(struct 
> intel_connector *intel_connector);
>  void intel_dvo_init(struct drm_i915_private *dev_priv);
>  /* intel_hotplug.c */
>  void intel_hpd_poll_init(struct drm_i915_private *dev_priv);
> -
> +bool intel_encoder_hotplug(struct intel_encoder *encoder,
> +                        struct intel_connector *connector);
>  
>  /* legacy fbdev emulation in intel_fbdev.c */
>  #ifdef CONFIG_DRM_FBDEV_EMULATION
> diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
> b/drivers/gpu/drm/i915/intel_hdmi.c
> index 691f15b59124..4a93cfd7a28e 100644
> --- a/drivers/gpu/drm/i915/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> @@ -2348,6 +2348,7 @@ void intel_hdmi_init(struct drm_i915_private *dev_priv,
>                        &intel_hdmi_enc_funcs, DRM_MODE_ENCODER_TMDS,
>                        "HDMI %c", port_name(port));
>  
> +     intel_encoder->hotplug = intel_encoder_hotplug;
>       intel_encoder->compute_config = intel_hdmi_compute_config;
>       if (HAS_PCH_SPLIT(dev_priv)) {
>               intel_encoder->disable = pch_disable_hdmi;
> diff --git a/drivers/gpu/drm/i915/intel_hotplug.c 
> b/drivers/gpu/drm/i915/intel_hotplug.c
> index 875d5d218d5c..0191c7831a06 100644
> --- a/drivers/gpu/drm/i915/intel_hotplug.c
> +++ b/drivers/gpu/drm/i915/intel_hotplug.c
> @@ -263,24 +263,25 @@ static void intel_hpd_irq_storm_reenable_work(struct 
> work_struct *work)
>       intel_runtime_pm_put(dev_priv);
>  }
>  
> -static bool intel_hpd_irq_event(struct drm_device *dev,
> -                             struct drm_connector *connector)
> +bool intel_encoder_hotplug(struct intel_encoder *encoder,
> +                        struct intel_connector *connector)
>  {
> +     struct drm_device *dev = connector->base.dev;
>       enum drm_connector_status old_status;
>  
>       WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
> -     old_status = connector->status;
> +     old_status = connector->base.status;
>  
> -     connector->status = drm_helper_probe_detect(connector, NULL, false);
> +     connector->base.status = drm_helper_probe_detect(&connector->base, 
> NULL, false);
>  
> -     if (old_status == connector->status)
> +     if (old_status == connector->base.status)
>               return false;
>  
>       DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n",
> -                   connector->base.id,
> -                   connector->name,
> +                   connector->base.base.id,
> +                   connector->base.name,
>                     drm_get_connector_status_name(old_status),
> -                   drm_get_connector_status_name(connector->status));
> +                   drm_get_connector_status_name(connector->base.status));
>  
>       return true;
>  }
> @@ -370,10 +371,9 @@ static void i915_hotplug_work_func(struct work_struct 
> *work)
>               if (hpd_event_bits & (1 << intel_encoder->hpd_pin)) {
>                       DRM_DEBUG_KMS("Connector %s (pin %i) received hotplug 
> event.\n",
>                                     connector->name, intel_encoder->hpd_pin);
> -                     if (intel_encoder->hot_plug)
> -                             intel_encoder->hot_plug(intel_encoder);
> -                     if (intel_hpd_irq_event(dev, connector))
> -                             changed = true;
> +
> +                     changed |= intel_encoder->hotplug(intel_encoder,
> +                                                       intel_connector);
>               }
>       }
>       drm_connector_list_iter_end(&conn_iter);
> diff --git a/drivers/gpu/drm/i915/intel_sdvo.c 
> b/drivers/gpu/drm/i915/intel_sdvo.c
> index 2b8764897d68..5b1ad42ec446 100644
> --- a/drivers/gpu/drm/i915/intel_sdvo.c
> +++ b/drivers/gpu/drm/i915/intel_sdvo.c
> @@ -1692,7 +1692,15 @@ static void intel_sdvo_enable_hotplug(struct 
> intel_encoder *encoder)
>       struct intel_sdvo *intel_sdvo = to_sdvo(encoder);
>  
>       intel_sdvo_write_cmd(intel_sdvo, SDVO_CMD_SET_ACTIVE_HOT_PLUG,
> -                     &intel_sdvo->hotplug_active, 2);
> +                          &intel_sdvo->hotplug_active, 2);
> +}
> +
> +static bool intel_sdvo_hotplug(struct intel_encoder *encoder,
> +                            struct intel_connector *connector)
> +{
> +     intel_sdvo_enable_hotplug(encoder);
> +
> +     return intel_encoder_hotplug(encoder, connector);
>  }
>  
>  static bool
> @@ -2496,7 +2504,7 @@ intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int 
> device)
>               /* Some SDVO devices have one-shot hotplug interrupts.
>                * Ensure that they get re-enabled when an interrupt happens.
>                */
> -             intel_encoder->hot_plug = intel_sdvo_enable_hotplug;
> +             intel_encoder->hotplug = intel_sdvo_hotplug;
>               intel_sdvo_enable_hotplug(intel_encoder);
>       } else {
>               intel_connector->polled = DRM_CONNECTOR_POLL_CONNECT | 
> DRM_CONNECTOR_POLL_DISCONNECT;

-- 
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to