Almost forgot to respond to this one! Reviewed-by: Lyude Paul <lyude@xxxxxxxxxx> On Wed, 2018-01-17 at 21:21 +0200, Ville Syrjala wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > 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. > > Reviewed-by: Jani Nikula <jani.nikula@xxxxxxxxx> > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > --- > 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 5c8e260ca2bc..5ea1dc3f63bf 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; _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx