On Tue, 09 Oct 2018, Jani Nikula <jani.nikula@xxxxxxxxx> wrote: > Almost all of the connector destroy functions do the same thing. The > differences are in the edid, detect_edid and panel cleanups, but those > are safely NULL when not initialized. Roll out a common connector > destroy hook. > > Inspired by commit bc3213c44415 ("drm/i915: Drop the eDP check from > intel_dp_connector_destroy()"). > > Cc: Ville Syrjala <ville.syrjala@xxxxxxxxxxxxxxx> > Signed-off-by: Jani Nikula <jani.nikula@xxxxxxxxx> > --- > drivers/gpu/drm/i915/intel_crt.c | 8 +------- > drivers/gpu/drm/i915/intel_display.c | 20 +++++++++++++++++++- > drivers/gpu/drm/i915/intel_dp.c | 18 +----------------- > drivers/gpu/drm/i915/intel_dp_mst.c | 14 +------------- > drivers/gpu/drm/i915/intel_drv.h | 1 + > drivers/gpu/drm/i915/intel_dvo.c | 9 +-------- > drivers/gpu/drm/i915/intel_hdmi.c | 5 ++--- > drivers/gpu/drm/i915/intel_lvds.c | 23 +---------------------- > drivers/gpu/drm/i915/intel_sdvo.c | 16 ++++------------ > drivers/gpu/drm/i915/intel_tv.c | 9 +-------- > drivers/gpu/drm/i915/vlv_dsi.c | 12 +----------- > 11 files changed, 33 insertions(+), 102 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c > index 0c6bf82bb059..ab3d6b074222 100644 > --- a/drivers/gpu/drm/i915/intel_crt.c > +++ b/drivers/gpu/drm/i915/intel_crt.c > @@ -849,12 +849,6 @@ intel_crt_detect(struct drm_connector *connector, > return status; > } > > -static void intel_crt_destroy(struct drm_connector *connector) > -{ > - drm_connector_cleanup(connector); > - kfree(connector); > -} > - > static int intel_crt_get_modes(struct drm_connector *connector) > { > struct drm_device *dev = connector->dev; > @@ -909,7 +903,7 @@ static const struct drm_connector_funcs intel_crt_connector_funcs = { > .fill_modes = drm_helper_probe_single_connector_modes, > .late_register = intel_connector_register, > .early_unregister = intel_connector_unregister, > - .destroy = intel_crt_destroy, > + .destroy = intel_connector_destroy, > .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, > }; > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > index e14e3268a84c..a145efba9157 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -6365,7 +6365,7 @@ struct intel_connector *intel_connector_alloc(void) > * This should only be used after intel_connector_alloc has returned > * successfully, and before drm_connector_init returns successfully. > * Otherwise the destroy callbacks for the connector and the state should > - * take care of proper cleanup/free > + * take care of proper cleanup/free (see intel_connector_destroy). > */ > void intel_connector_free(struct intel_connector *connector) > { > @@ -6373,6 +6373,24 @@ void intel_connector_free(struct intel_connector *connector) > kfree(connector); > } > > +/* > + * Connector type independent destroy hook for drm_connector_funcs. > + */ > +void intel_connector_destroy(struct drm_connector *connector) > +{ > + struct intel_connector *intel_connector = to_intel_connector(connector); > + > + kfree(intel_connector->detect_edid); > + > + if (!IS_ERR_OR_NULL(intel_connector->edid)) > + kfree(intel_connector->edid); > + > + intel_panel_fini(&intel_connector->panel); > + > + drm_connector_cleanup(connector); > + kfree(connector); > +} > + > /* Simple connector->get_hw_state implementation for encoders that support only > * one connector and no cloning and hence the encoder state determines the state > * of the connector. */ > diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c > index d12f987a6c43..0855b9785f7b 100644 > --- a/drivers/gpu/drm/i915/intel_dp.c > +++ b/drivers/gpu/drm/i915/intel_dp.c > @@ -5251,22 +5251,6 @@ intel_dp_connector_unregister(struct drm_connector *connector) > intel_connector_unregister(connector); > } > > -static void > -intel_dp_connector_destroy(struct drm_connector *connector) > -{ > - struct intel_connector *intel_connector = to_intel_connector(connector); > - > - kfree(intel_connector->detect_edid); > - > - if (!IS_ERR_OR_NULL(intel_connector->edid)) > - kfree(intel_connector->edid); > - > - intel_panel_fini(&intel_connector->panel); > - > - drm_connector_cleanup(connector); > - kfree(connector); > -} > - > void intel_dp_encoder_destroy(struct drm_encoder *encoder) > { > struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder); > @@ -5613,7 +5597,7 @@ static const struct drm_connector_funcs intel_dp_connector_funcs = { > .atomic_set_property = intel_digital_connector_atomic_set_property, > .late_register = intel_dp_connector_register, > .early_unregister = intel_dp_connector_unregister, > - .destroy = intel_dp_connector_destroy, > + .destroy = intel_connector_destroy, > .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > .atomic_duplicate_state = intel_digital_connector_duplicate_state, > }; > diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c > index 43db2e9ac575..9ad497e8ae36 100644 > --- a/drivers/gpu/drm/i915/intel_dp_mst.c > +++ b/drivers/gpu/drm/i915/intel_dp_mst.c > @@ -329,24 +329,12 @@ intel_dp_mst_detect(struct drm_connector *connector, bool force) > return drm_dp_mst_detect_port(connector, &intel_dp->mst_mgr, intel_connector->port); > } > > -static void > -intel_dp_mst_connector_destroy(struct drm_connector *connector) > -{ > - struct intel_connector *intel_connector = to_intel_connector(connector); > - > - if (!IS_ERR_OR_NULL(intel_connector->edid)) > - kfree(intel_connector->edid); > - > - drm_connector_cleanup(connector); > - kfree(connector); > -} > - > static const struct drm_connector_funcs intel_dp_mst_connector_funcs = { > .detect = intel_dp_mst_detect, > .fill_modes = drm_helper_probe_single_connector_modes, > .late_register = intel_connector_register, > .early_unregister = intel_connector_unregister, > - .destroy = intel_dp_mst_connector_destroy, > + .destroy = intel_connector_destroy, > .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, > }; > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h > index 8050d06c722a..4b8fec74ad49 100644 > --- a/drivers/gpu/drm/i915/intel_drv.h > +++ b/drivers/gpu/drm/i915/intel_drv.h > @@ -1510,6 +1510,7 @@ void intel_encoder_destroy(struct drm_encoder *encoder); > int intel_connector_init(struct intel_connector *); > struct intel_connector *intel_connector_alloc(void); > void intel_connector_free(struct intel_connector *connector); > +void intel_connector_destroy(struct drm_connector *connector); > bool intel_connector_get_hw_state(struct intel_connector *connector); > void intel_connector_attach_encoder(struct intel_connector *connector, > struct intel_encoder *encoder); > diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c > index 4e142ff49708..be3c0a5f447d 100644 > --- a/drivers/gpu/drm/i915/intel_dvo.c > +++ b/drivers/gpu/drm/i915/intel_dvo.c > @@ -333,18 +333,11 @@ static int intel_dvo_get_modes(struct drm_connector *connector) > return 0; > } > > -static void intel_dvo_destroy(struct drm_connector *connector) > -{ > - drm_connector_cleanup(connector); > - intel_panel_fini(&to_intel_connector(connector)->panel); > - kfree(connector); > -} > - > static const struct drm_connector_funcs intel_dvo_connector_funcs = { > .detect = intel_dvo_detect, > .late_register = intel_connector_register, > .early_unregister = intel_connector_unregister, > - .destroy = intel_dvo_destroy, > + .destroy = intel_connector_destroy, > .fill_modes = drm_helper_probe_single_connector_modes, > .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, > diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c > index 454f570275e9..2c53efc463e6 100644 > --- a/drivers/gpu/drm/i915/intel_hdmi.c > +++ b/drivers/gpu/drm/i915/intel_hdmi.c > @@ -2073,9 +2073,8 @@ static void intel_hdmi_destroy(struct drm_connector *connector) > { > if (intel_attached_hdmi(connector)->cec_notifier) > cec_notifier_put(intel_attached_hdmi(connector)->cec_notifier); > - kfree(to_intel_connector(connector)->detect_edid); > - drm_connector_cleanup(connector); > - kfree(connector); > + > + intel_connector_destroy(connector); > } > > static const struct drm_connector_funcs intel_hdmi_connector_funcs = { > diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c > index f9f3b0885ba5..1fe970cf9909 100644 > --- a/drivers/gpu/drm/i915/intel_lvds.c > +++ b/drivers/gpu/drm/i915/intel_lvds.c > @@ -477,27 +477,6 @@ static int intel_lvds_get_modes(struct drm_connector *connector) > return 1; > } > > -/** > - * intel_lvds_destroy - unregister and free LVDS structures > - * @connector: connector to free > - * > - * Unregister the DDC bus for this connector then free the driver private > - * structure. > - */ > -static void intel_lvds_destroy(struct drm_connector *connector) > -{ > - struct intel_lvds_connector *lvds_connector = > - to_lvds_connector(connector); > - > - if (!IS_ERR_OR_NULL(lvds_connector->base.edid)) > - kfree(lvds_connector->base.edid); > - > - intel_panel_fini(&lvds_connector->base.panel); > - > - drm_connector_cleanup(connector); > - kfree(connector); > -} > - > static const struct drm_connector_helper_funcs intel_lvds_connector_helper_funcs = { > .get_modes = intel_lvds_get_modes, > .mode_valid = intel_lvds_mode_valid, > @@ -511,7 +490,7 @@ static const struct drm_connector_funcs intel_lvds_connector_funcs = { > .atomic_set_property = intel_digital_connector_atomic_set_property, > .late_register = intel_connector_register, > .early_unregister = intel_connector_unregister, > - .destroy = intel_lvds_destroy, > + .destroy = intel_connector_destroy, > .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > .atomic_duplicate_state = intel_digital_connector_duplicate_state, > }; > diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c > index 701372e512a8..1824d94ae123 100644 > --- a/drivers/gpu/drm/i915/intel_sdvo.c > +++ b/drivers/gpu/drm/i915/intel_sdvo.c > @@ -2058,14 +2058,6 @@ static int intel_sdvo_get_modes(struct drm_connector *connector) > return !list_empty(&connector->probed_modes); > } > > -static void intel_sdvo_destroy(struct drm_connector *connector) > -{ > - struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); > - > - drm_connector_cleanup(connector); > - kfree(intel_sdvo_connector); > -} > - > static int > intel_sdvo_connector_atomic_get_property(struct drm_connector *connector, > const struct drm_connector_state *state, > @@ -2228,7 +2220,7 @@ static const struct drm_connector_funcs intel_sdvo_connector_funcs = { > .atomic_set_property = intel_sdvo_connector_atomic_set_property, > .late_register = intel_sdvo_connector_register, > .early_unregister = intel_sdvo_connector_unregister, > - .destroy = intel_sdvo_destroy, > + .destroy = intel_connector_destroy, Okay, this works by accident. I'll probably drop the sdvo hunks. BR, Jani. > .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > .atomic_duplicate_state = intel_sdvo_connector_duplicate_state, > }; > @@ -2583,7 +2575,7 @@ intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type) > return true; > > err: > - intel_sdvo_destroy(connector); > + intel_connector_destroy(connector); > return false; > } > > @@ -2675,7 +2667,7 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device) > return true; > > err: > - intel_sdvo_destroy(connector); > + intel_connector_destroy(connector); > return false; > } > > @@ -2745,7 +2737,7 @@ static void intel_sdvo_output_cleanup(struct intel_sdvo *intel_sdvo) > &dev->mode_config.connector_list, head) { > if (intel_attached_encoder(connector) == &intel_sdvo->base) { > drm_connector_unregister(connector); > - intel_sdvo_destroy(connector); > + intel_connector_destroy(connector); > } > } > } > diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c > index b5b04cb892e9..8b9ce0dc78e5 100644 > --- a/drivers/gpu/drm/i915/intel_tv.c > +++ b/drivers/gpu/drm/i915/intel_tv.c > @@ -1377,17 +1377,10 @@ intel_tv_get_modes(struct drm_connector *connector) > return count; > } > > -static void > -intel_tv_destroy(struct drm_connector *connector) > -{ > - drm_connector_cleanup(connector); > - kfree(connector); > -} > - > static const struct drm_connector_funcs intel_tv_connector_funcs = { > .late_register = intel_connector_register, > .early_unregister = intel_connector_unregister, > - .destroy = intel_tv_destroy, > + .destroy = intel_connector_destroy, > .fill_modes = drm_helper_probe_single_connector_modes, > .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, > diff --git a/drivers/gpu/drm/i915/vlv_dsi.c b/drivers/gpu/drm/i915/vlv_dsi.c > index 435a2c35ee8c..5accd0c360f9 100644 > --- a/drivers/gpu/drm/i915/vlv_dsi.c > +++ b/drivers/gpu/drm/i915/vlv_dsi.c > @@ -1642,16 +1642,6 @@ static int intel_dsi_get_modes(struct drm_connector *connector) > return 1; > } > > -static void intel_dsi_connector_destroy(struct drm_connector *connector) > -{ > - struct intel_connector *intel_connector = to_intel_connector(connector); > - > - DRM_DEBUG_KMS("\n"); > - intel_panel_fini(&intel_connector->panel); > - drm_connector_cleanup(connector); > - kfree(connector); > -} > - > static void intel_dsi_encoder_destroy(struct drm_encoder *encoder) > { > struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); > @@ -1676,7 +1666,7 @@ static const struct drm_connector_helper_funcs intel_dsi_connector_helper_funcs > static const struct drm_connector_funcs intel_dsi_connector_funcs = { > .late_register = intel_connector_register, > .early_unregister = intel_connector_unregister, > - .destroy = intel_dsi_connector_destroy, > + .destroy = intel_connector_destroy, > .fill_modes = drm_helper_probe_single_connector_modes, > .atomic_get_property = intel_digital_connector_atomic_get_property, > .atomic_set_property = intel_digital_connector_atomic_set_property, -- Jani Nikula, Intel Open Source Graphics Center _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx