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

drm/tegra: rgb: Fix some error handling paths in tegra_dc_rgb_probe()

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

Fixes: 59d29c0ec93f ("drm/tegra: Allocate resources at probe time")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Link: https://patchwork.freedesktop.org/patch/msgid/0001f61eb89048bc36241629b564195689cf54b6.1693667005.git.christophe.jaillet@wanadoo.fr

authored by

Christophe JAILLET and committed by
Thierry Reding
bc456b5d 643ae131

+11 -5
+11 -5
drivers/gpu/drm/tegra/rgb.c
··· 225 225 rgb->clk = devm_clk_get(dc->dev, NULL); 226 226 if (IS_ERR(rgb->clk)) { 227 227 dev_err(dc->dev, "failed to get clock\n"); 228 - return PTR_ERR(rgb->clk); 228 + err = PTR_ERR(rgb->clk); 229 + goto remove; 229 230 } 230 231 231 232 rgb->clk_parent = devm_clk_get(dc->dev, "parent"); 232 233 if (IS_ERR(rgb->clk_parent)) { 233 234 dev_err(dc->dev, "failed to get parent clock\n"); 234 - return PTR_ERR(rgb->clk_parent); 235 + err = PTR_ERR(rgb->clk_parent); 236 + goto remove; 235 237 } 236 238 237 239 err = clk_set_parent(rgb->clk, rgb->clk_parent); 238 240 if (err < 0) { 239 241 dev_err(dc->dev, "failed to set parent clock: %d\n", err); 240 - return err; 242 + goto remove; 241 243 } 242 244 243 245 rgb->pll_d_out0 = clk_get_sys(NULL, "pll_d_out0"); 244 246 if (IS_ERR(rgb->pll_d_out0)) { 245 247 err = PTR_ERR(rgb->pll_d_out0); 246 248 dev_err(dc->dev, "failed to get pll_d_out0: %d\n", err); 247 - return err; 249 + goto remove; 248 250 } 249 251 250 252 if (dc->soc->has_pll_d2_out0) { ··· 254 252 if (IS_ERR(rgb->pll_d2_out0)) { 255 253 err = PTR_ERR(rgb->pll_d2_out0); 256 254 dev_err(dc->dev, "failed to get pll_d2_out0: %d\n", err); 257 - return err; 255 + goto remove; 258 256 } 259 257 } 260 258 261 259 dc->rgb = &rgb->output; 262 260 263 261 return 0; 262 + 263 + remove: 264 + tegra_output_remove(&rgb->output); 265 + return err; 264 266 } 265 267 266 268 void tegra_dc_rgb_remove(struct tegra_dc *dc)