lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0089/1039] drm/panel: innolux-p079zca: Delete panel on attach() failure
    Date
    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


    \
     
     \ /
      Last update: 2022-01-25 01:11    [W:4.034 / U:0.668 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site