| From 6d9f5105553a2b7d8a1f325dd64d24c3c50d535f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 23 Sep 2021 17:33:54 -0700 |
| Subject: drm/panel: innolux-p079zca: Delete panel on attach() failure |
| |
| From: Brian Norris <briannorris@chromium.org> |
| |
| [ Upstream commit 32a267e9c057e1636e7afdd20599aa5741a73079 ] |
| |
| If we fail to attach (e.g., because 1 of 2 dual-DSI controllers aren't |
| ready), we leave a dangling drm_panel reference to freed memory. Clean |
| that up on failure. |
| |
| This problem exists since the driver's introduction, but is especially |
| relevant after refactored for dual-DSI variants. |
| |
| Fixes: 14c8f2e9f8ea ("drm/panel: add Innolux P079ZCA panel driver") |
| Fixes: 7ad4e4636c54 ("drm/panel: p079zca: Refactor panel driver to support multiple panels") |
| Signed-off-by: Brian Norris <briannorris@chromium.org> |
| Signed-off-by: Sam Ravnborg <sam@ravnborg.org> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20210923173336.2.I9023cf8811a3abf4964ed84eb681721d8bb489d6@changeid |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/panel/panel-innolux-p079zca.c | 10 +++++++++- |
| 1 file changed, 9 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/gpu/drm/panel/panel-innolux-p079zca.c b/drivers/gpu/drm/panel/panel-innolux-p079zca.c |
| index aea3162253914..f194b62e290ca 100644 |
| --- a/drivers/gpu/drm/panel/panel-innolux-p079zca.c |
| +++ b/drivers/gpu/drm/panel/panel-innolux-p079zca.c |
| @@ -484,6 +484,7 @@ static void innolux_panel_del(struct innolux_panel *innolux) |
| static int innolux_panel_probe(struct mipi_dsi_device *dsi) |
| { |
| const struct panel_desc *desc; |
| + struct innolux_panel *innolux; |
| int err; |
| |
| desc = of_device_get_match_data(&dsi->dev); |
| @@ -495,7 +496,14 @@ static int innolux_panel_probe(struct mipi_dsi_device *dsi) |
| if (err < 0) |
| return err; |
| |
| - return mipi_dsi_attach(dsi); |
| + err = mipi_dsi_attach(dsi); |
| + if (err < 0) { |
| + innolux = mipi_dsi_get_drvdata(dsi); |
| + innolux_panel_del(innolux); |
| + return err; |
| + } |
| + |
| + return 0; |
| } |
| |
| static int innolux_panel_remove(struct mipi_dsi_device *dsi) |
| -- |
| 2.34.1 |
| |