drm/meson: Fix some error handling paths in 'meson_drv_bind_master()'
authorChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Mon, 12 Mar 2018 20:15:10 +0000 (21:15 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 May 2018 05:52:33 +0000 (07:52 +0200)
[ Upstream commit 2c18107b9d58972588cd45d89b8f58d0f033c110 ]

If one of these functions fail, we whould free 'drm', as alreadry done in
the other error handling paths, below and above.

Fixes: bbbe775ec5b5 ("drm: Add support for Amlogic Meson Graphic Controller")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Acked-by: Neil Armstrong <narmstrong@baylibre.com>
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
Link: https://patchwork.freedesktop.org/patch/msgid/df47e03d36c2cf7bc37ec3105fc47c16555bd946.1520885192.git.christophe.jaillet@wanadoo.fr
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/meson/meson_drv.c

index 7742c7d81ed8fbaac2e036a3c5d061ff553eed73..7c1930d8b419d8a4439ba2cf65a7d580280fdccf 100644 (file)
@@ -180,35 +180,43 @@ static int meson_drv_bind_master(struct device *dev, bool has_components)
 
        res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vpu");
        regs = devm_ioremap_resource(dev, res);
-       if (IS_ERR(regs))
-               return PTR_ERR(regs);
+       if (IS_ERR(regs)) {
+               ret = PTR_ERR(regs);
+               goto free_drm;
+       }
 
        priv->io_base = regs;
 
        res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hhi");
        /* Simply ioremap since it may be a shared register zone */
        regs = devm_ioremap(dev, res->start, resource_size(res));
-       if (!regs)
-               return -EADDRNOTAVAIL;
+       if (!regs) {
+               ret = -EADDRNOTAVAIL;
+               goto free_drm;
+       }
 
        priv->hhi = devm_regmap_init_mmio(dev, regs,
                                          &meson_regmap_config);
        if (IS_ERR(priv->hhi)) {
                dev_err(&pdev->dev, "Couldn't create the HHI regmap\n");
-               return PTR_ERR(priv->hhi);
+               ret = PTR_ERR(priv->hhi);
+               goto free_drm;
        }
 
        res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dmc");
        /* Simply ioremap since it may be a shared register zone */
        regs = devm_ioremap(dev, res->start, resource_size(res));
-       if (!regs)
-               return -EADDRNOTAVAIL;
+       if (!regs) {
+               ret = -EADDRNOTAVAIL;
+               goto free_drm;
+       }
 
        priv->dmc = devm_regmap_init_mmio(dev, regs,
                                          &meson_regmap_config);
        if (IS_ERR(priv->dmc)) {
                dev_err(&pdev->dev, "Couldn't create the DMC regmap\n");
-               return PTR_ERR(priv->dmc);
+               ret = PTR_ERR(priv->dmc);
+               goto free_drm;
        }
 
        priv->vsync_irq = platform_get_irq(pdev, 0);