| From ba98413bf45edbf33672e2539e321b851b2cfbd1 Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan+linaro@kernel.org> |
| Date: Mon, 6 Mar 2023 11:35:33 +0100 |
| Subject: drm/meson: fix missing component unbind on bind errors |
| |
| From: Johan Hovold <johan+linaro@kernel.org> |
| |
| commit ba98413bf45edbf33672e2539e321b851b2cfbd1 upstream. |
| |
| Make sure to unbind all subcomponents when binding the aggregate device |
| fails. |
| |
| Fixes: a41e82e6c457 ("drm/meson: Add support for components") |
| Cc: stable@vger.kernel.org # 4.12 |
| Cc: Neil Armstrong <neil.armstrong@linaro.org> |
| Signed-off-by: Johan Hovold <johan+linaro@kernel.org> |
| Acked-by: Neil Armstrong <neil.armstrong@linaro.org> |
| Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20230306103533.4915-1-johan+linaro@kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/meson/meson_drv.c | 13 ++++++++----- |
| 1 file changed, 8 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/gpu/drm/meson/meson_drv.c |
| +++ b/drivers/gpu/drm/meson/meson_drv.c |
| @@ -325,23 +325,23 @@ static int meson_drv_bind_master(struct |
| |
| ret = meson_encoder_hdmi_init(priv); |
| if (ret) |
| - goto exit_afbcd; |
| + goto unbind_all; |
| |
| ret = meson_plane_create(priv); |
| if (ret) |
| - goto exit_afbcd; |
| + goto unbind_all; |
| |
| ret = meson_overlay_create(priv); |
| if (ret) |
| - goto exit_afbcd; |
| + goto unbind_all; |
| |
| ret = meson_crtc_create(priv); |
| if (ret) |
| - goto exit_afbcd; |
| + goto unbind_all; |
| |
| ret = request_irq(priv->vsync_irq, meson_irq, 0, drm->driver->name, drm); |
| if (ret) |
| - goto exit_afbcd; |
| + goto unbind_all; |
| |
| drm_mode_config_reset(drm); |
| |
| @@ -359,6 +359,9 @@ static int meson_drv_bind_master(struct |
| |
| uninstall_irq: |
| free_irq(priv->vsync_irq, drm); |
| +unbind_all: |
| + if (has_components) |
| + component_unbind_all(drm->dev, drm); |
| exit_afbcd: |
| if (priv->afbcd.ops) |
| priv->afbcd.ops->exit(priv); |