1
0
Fork 0

drm/meson: Fix some error handling paths in 'meson_drv_bind_master()'

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

Fixes: bbbe775ec5 ("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
hifive-unleashed-5.1
Christophe JAILLET 2018-03-12 21:15:10 +01:00 committed by Neil Armstrong
parent dcacf65139
commit 2c18107b9d
1 changed files with 16 additions and 8 deletions

View File

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