On Thu, Jan 15, 2015 at 3:10 PM, Jan Safrata <jan.nikitenko@xxxxxxxxx> wrote: > Fixes to allow removal of gma500_gfx module (after frame buffer > console unbind) when used with Atom E6xx gpu chipset. > > The oaktrail_lvds_init() uses i2c_adap only to read edid > and therefore it should call i2c_put_adapter() after. > Added the missing call. > > The psb_intel_lvds_destroy() is shared for multiple > chipsets cleanup, but there is defined ddc_bus member > in different lower level structures - in case of oaktrail > lvds it is gma_encoder->ddc_bus instead of lvds_priv->ddc_bus. > In case of oaktrail lvds the gma_encoder->ddc_bus was not destroyed. > This patch adds the missing call of psb_intel_i2c_destroy() > and avoids the NULL pointer dereference of lvds_priv which is not > used in case of oaktrail lvds. > > Tested on SECO QuadMo747-E6xx-EXTREME Qseven platform. > > Signed-off-by: Jan Safrata <jan.nikitenko@xxxxxxxxx> > Cc: Patrik Jakobsson <patrik.r.jakobsson@xxxxxxxxx> Reviewed-by: Patrik Jakobsson <patrik.r.jakobsson@xxxxxxxxx> > --- > drivers/gpu/drm/gma500/oaktrail_lvds.c | 4 +++- > drivers/gpu/drm/gma500/psb_intel_lvds.c | 6 +++++- > 2 files changed, 8 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/gma500/oaktrail_lvds.c b/drivers/gpu/drm/gma500/oaktrail_lvds.c > index 83bbc27..be26846 100644 > --- a/drivers/gpu/drm/gma500/oaktrail_lvds.c > +++ b/drivers/gpu/drm/gma500/oaktrail_lvds.c > @@ -362,8 +362,10 @@ void oaktrail_lvds_init(struct drm_device *dev, > edid = NULL; > mutex_lock(&dev->mode_config.mutex); > i2c_adap = i2c_get_adapter(dev_priv->ops->i2c_bus); > - if (i2c_adap) > + if (i2c_adap) { > edid = drm_get_edid(connector, i2c_adap); > + i2c_put_adapter(i2c_adap); > + } > if (edid == NULL && dev_priv->lpc_gpio_base) { > oaktrail_lvds_i2c_init(encoder); > if (gma_encoder->ddc_bus != NULL) { > diff --git a/drivers/gpu/drm/gma500/psb_intel_lvds.c b/drivers/gpu/drm/gma500/psb_intel_lvds.c > index 88aad95..71bae07 100644 > --- a/drivers/gpu/drm/gma500/psb_intel_lvds.c > +++ b/drivers/gpu/drm/gma500/psb_intel_lvds.c > @@ -561,8 +561,12 @@ void psb_intel_lvds_destroy(struct drm_connector *connector) > struct gma_encoder *gma_encoder = gma_attached_encoder(connector); > struct psb_intel_lvds_priv *lvds_priv = gma_encoder->dev_priv; > > - if (lvds_priv->ddc_bus) > + if (lvds_priv && lvds_priv->ddc_bus) > psb_intel_i2c_destroy(lvds_priv->ddc_bus); > + if (gma_encoder->ddc_bus) { > + psb_intel_i2c_destroy(gma_encoder->ddc_bus); > + gma_encoder->ddc_bus = NULL; > + } > drm_connector_unregister(connector); > drm_connector_cleanup(connector); > kfree(connector); > -- > 1.8.5.5 > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel