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

Commit b71b56b2 authored by Sylwester Nawrocki's avatar Sylwester Nawrocki Committed by Mauro Carvalho Chehab
Browse files

[media] s5p-fimc: Check return value of clk_enable/clk_set_rate



clk_set_rate(), clk_enable() functions can fail, so check the return
values to avoid surprises. While at it use ERR_PTR() value to indicate
an invalid clock.

Signed-off-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 7b43a6f3
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -808,11 +808,11 @@ static void fimc_clk_put(struct fimc_dev *fimc)
{
	int i;
	for (i = 0; i < MAX_FIMC_CLOCKS; i++) {
		if (IS_ERR_OR_NULL(fimc->clock[i]))
		if (IS_ERR(fimc->clock[i]))
			continue;
		clk_unprepare(fimc->clock[i]);
		clk_put(fimc->clock[i]);
		fimc->clock[i] = NULL;
		fimc->clock[i] = ERR_PTR(-EINVAL);
	}
}

@@ -820,14 +820,19 @@ static int fimc_clk_get(struct fimc_dev *fimc)
{
	int i, ret;

	for (i = 0; i < MAX_FIMC_CLOCKS; i++)
		fimc->clock[i] = ERR_PTR(-EINVAL);

	for (i = 0; i < MAX_FIMC_CLOCKS; i++) {
		fimc->clock[i] = clk_get(&fimc->pdev->dev, fimc_clocks[i]);
		if (IS_ERR(fimc->clock[i]))
		if (IS_ERR(fimc->clock[i])) {
			ret = PTR_ERR(fimc->clock[i]);
			goto err;
		}
		ret = clk_prepare(fimc->clock[i]);
		if (ret < 0) {
			clk_put(fimc->clock[i]);
			fimc->clock[i] = NULL;
			fimc->clock[i] = ERR_PTR(-EINVAL);
			goto err;
		}
	}
@@ -921,8 +926,14 @@ static int fimc_probe(struct platform_device *pdev)
	ret = fimc_clk_get(fimc);
	if (ret)
		return ret;
	clk_set_rate(fimc->clock[CLK_BUS], drv_data->lclk_frequency);
	clk_enable(fimc->clock[CLK_BUS]);

	ret = clk_set_rate(fimc->clock[CLK_BUS], drv_data->lclk_frequency);
	if (ret < 0)
		return ret;

	ret = clk_enable(fimc->clock[CLK_BUS]);
	if (ret < 0)
		return ret;

	ret = devm_request_irq(&pdev->dev, res->start, fimc_irq_handler,
			       0, dev_name(&pdev->dev), fimc);
@@ -956,6 +967,7 @@ static int fimc_probe(struct platform_device *pdev)
err_sd:
	fimc_unregister_capture_subdev(fimc);
err_clk:
	clk_disable(fimc->clock[CLK_BUS]);
	fimc_clk_put(fimc);
	return ret;
}