diff options
author | Douglas Anderson <dianders@chromium.org> | 2016-03-07 14:00:51 -0800 |
---|---|---|
committer | Philipp Zabel <p.zabel@pengutronix.de> | 2016-03-31 11:24:26 +0200 |
commit | 788c8ddb4f67e7eb6dec9fa1d9189ff5e736a01b (patch) | |
tree | 7d3efc887259d09462187d643b95b0a79e7ef20d /drivers/gpu/drm/imx/dw_hdmi-imx.c | |
parent | 6ac217eef5d46fe9e3d6f85ea2e303422615a18c (diff) | |
download | linux-stable-788c8ddb4f67e7eb6dec9fa1d9189ff5e736a01b.tar.gz linux-stable-788c8ddb4f67e7eb6dec9fa1d9189ff5e736a01b.tar.bz2 linux-stable-788c8ddb4f67e7eb6dec9fa1d9189ff5e736a01b.zip |
drm/imx: dw_hdmi: Call drm_encoder_cleanup() in error path
The drm_encoder_cleanup() was missing both from the error path of
dw_hdmi_imx_bind(). This caused a crash when slub_debug was
enabled and we ended up deferring probe of HDMI at boot.
This call isn't needed from unbind() because if dw_hdmi_bind() returns
no error then it takes over the job of freeing the encoder (in
dw_hdmi_unbind).
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Diffstat (limited to 'drivers/gpu/drm/imx/dw_hdmi-imx.c')
-rw-r--r-- | drivers/gpu/drm/imx/dw_hdmi-imx.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/gpu/drm/imx/dw_hdmi-imx.c b/drivers/gpu/drm/imx/dw_hdmi-imx.c index 2a95d10e9d92..c69c3142819c 100644 --- a/drivers/gpu/drm/imx/dw_hdmi-imx.c +++ b/drivers/gpu/drm/imx/dw_hdmi-imx.c @@ -245,7 +245,16 @@ static int dw_hdmi_imx_bind(struct device *dev, struct device *master, drm_encoder_init(drm, encoder, &dw_hdmi_imx_encoder_funcs, DRM_MODE_ENCODER_TMDS, NULL); - return dw_hdmi_bind(dev, master, data, encoder, iores, irq, plat_data); + ret = dw_hdmi_bind(dev, master, data, encoder, iores, irq, plat_data); + + /* + * If dw_hdmi_bind() fails we'll never call dw_hdmi_unbind(), + * which would have called the encoder cleanup. Do it manually. + */ + if (ret) + drm_encoder_cleanup(encoder); + + return ret; } static void dw_hdmi_imx_unbind(struct device *dev, struct device *master, |