drivers/gpu/drm/via/via_analog.c | 10 ++++------ drivers/gpu/drm/via/via_display.c | 26 +++++++++++++++++++++++--- drivers/gpu/drm/via/via_display.h | 2 ++ drivers/gpu/drm/via/via_hdmi.c | 10 ++++------ drivers/gpu/drm/via/via_lvds.c | 12 +++++------- 5 files changed, 38 insertions(+), 22 deletions(-)
New commits: commit 89d94daaf0c587181a91a77bbbf904fa01c19a9f Author: James Simmons <jsimm...@infradead.org> Date: Tue Mar 26 14:03:31 2013 -0400 Update the way encoder and connectors are memory allocated to handle multiple connectors being mapped to a encoder diff --git a/drivers/gpu/drm/via/via_analog.c b/drivers/gpu/drm/via/via_analog.c index e7e18ce..8fabeac 100644 --- a/drivers/gpu/drm/via/via_analog.c +++ b/drivers/gpu/drm/via/via_analog.c @@ -29,7 +29,7 @@ * Routines for controlling stuff on the analog port */ static const struct drm_encoder_funcs via_dac_enc_funcs = { - .destroy = drm_encoder_cleanup, + .destroy = via_encoder_cleanup, }; /* Manage the power state of the DAC */ @@ -116,15 +116,13 @@ via_analog_init(struct drm_device *dev) { struct via_connector *con; struct via_encoder *enc; - void *par; - par = kzalloc(sizeof(*enc) + sizeof(*con), GFP_KERNEL); - if (!par) { + enc = kzalloc(sizeof(*enc) + sizeof(*con), GFP_KERNEL); + if (!enc) { DRM_ERROR("Failed to allocate connector and encoder\n"); return; } - con = par + sizeof(*enc); - enc = par; + con = &enc->cons[0]; /* Piece together our connector */ drm_connector_init(dev, &con->base, &via_analog_connector_funcs, diff --git a/drivers/gpu/drm/via/via_display.c b/drivers/gpu/drm/via/via_display.c index 99046d9..2533698 100644 --- a/drivers/gpu/drm/via/via_display.c +++ b/drivers/gpu/drm/via/via_display.c @@ -281,6 +281,14 @@ via_best_encoder(struct drm_connector *connector) return encoder; } +void via_encoder_cleanup(struct drm_encoder *encoder) +{ + struct via_encoder *enc = container_of(encoder, struct via_encoder, base); + + drm_encoder_cleanup(encoder); + kfree(enc); +} + /* * Shared connector routines. */ @@ -335,12 +343,9 @@ via_connector_set_property(struct drm_connector *connector, void via_connector_destroy(struct drm_connector *connector) { - struct via_connector *con = container_of(connector, struct via_connector, base); - drm_mode_connector_update_edid_property(connector, NULL); drm_sysfs_connector_remove(connector); drm_connector_cleanup(connector); - kfree(con); } /* Power sequence relations */ @@ -546,7 +551,22 @@ via_modeset_init(struct drm_device *dev) void via_modeset_fini(struct drm_device *dev) { + struct drm_connector *connector, *ot; + struct drm_encoder *encoder, *enct; + via_framebuffer_fini(dev); + + /* We need to cleanup the connectors before the encoders */ + list_for_each_entry_safe(connector, ot, + &dev->mode_config.connector_list, head) { + connector->funcs->destroy(connector); + } + + list_for_each_entry_safe(encoder, enct, &dev->mode_config.encoder_list, + head) { + encoder->funcs->destroy(encoder); + } + drm_mode_config_cleanup(dev); via_i2c_exit(); diff --git a/drivers/gpu/drm/via/via_display.h b/drivers/gpu/drm/via/via_display.h index 02408a5..a54a3fb 100644 --- a/drivers/gpu/drm/via/via_display.h +++ b/drivers/gpu/drm/via/via_display.h @@ -89,6 +89,7 @@ struct via_encoder { struct drm_encoder base; uint32_t flags; int diPort; + struct via_connector cons[]; }; static inline void @@ -148,6 +149,7 @@ extern void via_set_sync_polarity(struct drm_encoder *encoder, struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode); extern struct drm_encoder* via_best_encoder(struct drm_connector *connector); +extern void via_encoder_cleanup(struct drm_encoder *encoder); extern void via_encoder_prepare(struct drm_encoder *encoder); extern void via_encoder_disable(struct drm_encoder *encoder); extern void via_encoder_commit(struct drm_encoder *encoder); diff --git a/drivers/gpu/drm/via/via_hdmi.c b/drivers/gpu/drm/via/via_hdmi.c index 77e648f..dffc503 100644 --- a/drivers/gpu/drm/via/via_hdmi.c +++ b/drivers/gpu/drm/via/via_hdmi.c @@ -33,7 +33,7 @@ * Routines for controlling stuff on the HDMI port */ static const struct drm_encoder_funcs via_hdmi_enc_funcs = { - .destroy = drm_encoder_cleanup, + .destroy = via_encoder_cleanup, }; static void @@ -653,15 +653,13 @@ via_hdmi_init(struct drm_device *dev, int diport) { struct via_connector *con; struct via_encoder *enc; - void *par; - par = kzalloc(sizeof(*enc) + sizeof(*con), GFP_KERNEL); - if (!par) { + enc = kzalloc(sizeof(*enc) + sizeof(*con), GFP_KERNEL); + if (!enc) { DRM_ERROR("Failed to allocate connector and encoder\n"); return; } - con = par + sizeof(*enc); - enc = par; + con = &enc->cons[0]; /* Piece together our connector */ drm_connector_init(dev, &con->base, &via_hdmi_connector_funcs, diff --git a/drivers/gpu/drm/via/via_lvds.c b/drivers/gpu/drm/via/via_lvds.c index 30ebad5..d8ed81c 100644 --- a/drivers/gpu/drm/via/via_lvds.c +++ b/drivers/gpu/drm/via/via_lvds.c @@ -336,7 +336,7 @@ const struct drm_encoder_helper_funcs via_lvds_helper_funcs = { }; const struct drm_encoder_funcs via_lvds_enc_funcs = { - .destroy = drm_encoder_cleanup, + .destroy = via_encoder_cleanup, }; /* detect this connector connect status */ @@ -643,15 +643,13 @@ via_lvds_init(struct drm_device *dev) struct via_encoder *enc; struct edid *edid; u8 reg_value; - void *par; - par = kzalloc(sizeof(*enc) + sizeof(*con), GFP_KERNEL); - if (!par) { + enc = kzalloc(sizeof(*enc) + sizeof(*con), GFP_KERNEL); + if (!enc) { DRM_INFO("Failed to allocate LVDS output\n"); return; } - con = par + sizeof(*enc); - enc = par; + con = &enc->cons[0]; drm_connector_init(dev, &con->base, &via_lcd_connector_funcs, DRM_MODE_CONNECTOR_LVDS); @@ -776,5 +774,5 @@ via_lvds_init(struct drm_device *dev) no_device: drm_sysfs_connector_remove(&con->base); drm_connector_cleanup(&con->base); - kfree(par); + kfree(enc); } _______________________________________________ Openchrome-devel mailing list Openchrome-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/openchrome-devel