Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0bd77f37 authored by Evgeny Novikov's avatar Evgeny Novikov Committed by Greg Kroah-Hartman
Browse files

media: vpss: clean up resources in init



[ Upstream commit 9c487b0b0ea7ff22127fe99a7f67657d8730ff94 ]

If platform_driver_register() fails within vpss_init() resources are not
cleaned up. The patch fixes this issue by introducing the corresponding
error handling.

Found by Linux Driver Verification project (linuxtesting.org).

Signed-off-by: default avatarEvgeny Novikov <novikov@ispras.ru>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 3264112e
Loading
Loading
Loading
Loading
+16 −4
Original line number Original line Diff line number Diff line
@@ -519,19 +519,31 @@ static void vpss_exit(void)


static int __init vpss_init(void)
static int __init vpss_init(void)
{
{
	int ret;

	if (!request_mem_region(VPSS_CLK_CTRL, 4, "vpss_clock_control"))
	if (!request_mem_region(VPSS_CLK_CTRL, 4, "vpss_clock_control"))
		return -EBUSY;
		return -EBUSY;


	oper_cfg.vpss_regs_base2 = ioremap(VPSS_CLK_CTRL, 4);
	oper_cfg.vpss_regs_base2 = ioremap(VPSS_CLK_CTRL, 4);
	if (unlikely(!oper_cfg.vpss_regs_base2)) {
	if (unlikely(!oper_cfg.vpss_regs_base2)) {
		release_mem_region(VPSS_CLK_CTRL, 4);
		ret = -ENOMEM;
		return -ENOMEM;
		goto err_ioremap;
	}
	}


	writel(VPSS_CLK_CTRL_VENCCLKEN |
	writel(VPSS_CLK_CTRL_VENCCLKEN |
	       VPSS_CLK_CTRL_DACCLKEN, oper_cfg.vpss_regs_base2);
	       VPSS_CLK_CTRL_DACCLKEN, oper_cfg.vpss_regs_base2);


	return platform_driver_register(&vpss_driver);
	ret = platform_driver_register(&vpss_driver);
	if (ret)
		goto err_pd_register;

	return 0;

err_pd_register:
	iounmap(oper_cfg.vpss_regs_base2);
err_ioremap:
	release_mem_region(VPSS_CLK_CTRL, 4);
	return ret;
}
}
subsys_initcall(vpss_init);
subsys_initcall(vpss_init);
module_exit(vpss_exit);
module_exit(vpss_exit);