Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/tegra: dsi: Fix some error handling paths in tegra_dsi_probe()

If an error occurs after calling tegra_output_probe(),
tegra_output_remove() should be called as already done in the remove
function.

Fixes: dec727399a4b ("drm/tegra: Add DSI support")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Link: https://patchwork.freedesktop.org/patch/msgid/16820073278d031f6c474a08d5f22a255158585e.1693667005.git.christophe.jaillet@wanadoo.fr

authored by

Christophe JAILLET and committed by
Thierry Reding
830c1ded 0800880f

+35 -19
+35 -19
drivers/gpu/drm/tegra/dsi.c
··· 1596 1596 1597 1597 if (!pdev->dev.pm_domain) { 1598 1598 dsi->rst = devm_reset_control_get(&pdev->dev, "dsi"); 1599 - if (IS_ERR(dsi->rst)) 1600 - return PTR_ERR(dsi->rst); 1599 + if (IS_ERR(dsi->rst)) { 1600 + err = PTR_ERR(dsi->rst); 1601 + goto remove; 1602 + } 1601 1603 } 1602 1604 1603 1605 dsi->clk = devm_clk_get(&pdev->dev, NULL); 1604 - if (IS_ERR(dsi->clk)) 1605 - return dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk), 1606 - "cannot get DSI clock\n"); 1606 + if (IS_ERR(dsi->clk)) { 1607 + err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk), 1608 + "cannot get DSI clock\n"); 1609 + goto remove; 1610 + } 1607 1611 1608 1612 dsi->clk_lp = devm_clk_get(&pdev->dev, "lp"); 1609 - if (IS_ERR(dsi->clk_lp)) 1610 - return dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_lp), 1611 - "cannot get low-power clock\n"); 1613 + if (IS_ERR(dsi->clk_lp)) { 1614 + err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_lp), 1615 + "cannot get low-power clock\n"); 1616 + goto remove; 1617 + } 1612 1618 1613 1619 dsi->clk_parent = devm_clk_get(&pdev->dev, "parent"); 1614 - if (IS_ERR(dsi->clk_parent)) 1615 - return dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_parent), 1616 - "cannot get parent clock\n"); 1620 + if (IS_ERR(dsi->clk_parent)) { 1621 + err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_parent), 1622 + "cannot get parent clock\n"); 1623 + goto remove; 1624 + } 1617 1625 1618 1626 dsi->vdd = devm_regulator_get(&pdev->dev, "avdd-dsi-csi"); 1619 - if (IS_ERR(dsi->vdd)) 1620 - return dev_err_probe(&pdev->dev, PTR_ERR(dsi->vdd), 1621 - "cannot get VDD supply\n"); 1627 + if (IS_ERR(dsi->vdd)) { 1628 + err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->vdd), 1629 + "cannot get VDD supply\n"); 1630 + goto remove; 1631 + } 1622 1632 1623 1633 err = tegra_dsi_setup_clocks(dsi); 1624 1634 if (err < 0) { 1625 1635 dev_err(&pdev->dev, "cannot setup clocks\n"); 1626 - return err; 1636 + goto remove; 1627 1637 } 1628 1638 1629 1639 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1630 1640 dsi->regs = devm_ioremap_resource(&pdev->dev, regs); 1631 - if (IS_ERR(dsi->regs)) 1632 - return PTR_ERR(dsi->regs); 1641 + if (IS_ERR(dsi->regs)) { 1642 + err = PTR_ERR(dsi->regs); 1643 + goto remove; 1644 + } 1633 1645 1634 1646 dsi->mipi = tegra_mipi_request(&pdev->dev, pdev->dev.of_node); 1635 - if (IS_ERR(dsi->mipi)) 1636 - return PTR_ERR(dsi->mipi); 1647 + if (IS_ERR(dsi->mipi)) { 1648 + err = PTR_ERR(dsi->mipi); 1649 + goto remove; 1650 + } 1637 1651 1638 1652 dsi->host.ops = &tegra_dsi_host_ops; 1639 1653 dsi->host.dev = &pdev->dev; ··· 1678 1664 mipi_dsi_host_unregister(&dsi->host); 1679 1665 mipi_free: 1680 1666 tegra_mipi_free(dsi->mipi); 1667 + remove: 1668 + tegra_output_remove(&dsi->output); 1681 1669 return err; 1682 1670 } 1683 1671