aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2013-01-29 04:42:28 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-02-05 14:50:25 -0500
commitb71b56b264ae27f32784973d15bfdfbc7df6d579 (patch)
treea0185918fe6ead4e004a5dbfa42a5a5a3eb1051f /drivers/media/platform
parent7b43a6f3f517109c2912d82f7f666a84420689bc (diff)
[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: Sylwester Nawrocki <s.nawrocki@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/platform')
-rw-r--r--drivers/media/platform/s5p-fimc/fimc-core.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/media/platform/s5p-fimc/fimc-core.c b/drivers/media/platform/s5p-fimc/fimc-core.c
index 6d5b03a7b5e5..a9625414ea95 100644
--- a/drivers/media/platform/s5p-fimc/fimc-core.c
+++ b/drivers/media/platform/s5p-fimc/fimc-core.c
@@ -808,11 +808,11 @@ static void fimc_clk_put(struct fimc_dev *fimc)
808{ 808{
809 int i; 809 int i;
810 for (i = 0; i < MAX_FIMC_CLOCKS; i++) { 810 for (i = 0; i < MAX_FIMC_CLOCKS; i++) {
811 if (IS_ERR_OR_NULL(fimc->clock[i])) 811 if (IS_ERR(fimc->clock[i]))
812 continue; 812 continue;
813 clk_unprepare(fimc->clock[i]); 813 clk_unprepare(fimc->clock[i]);
814 clk_put(fimc->clock[i]); 814 clk_put(fimc->clock[i]);
815 fimc->clock[i] = NULL; 815 fimc->clock[i] = ERR_PTR(-EINVAL);
816 } 816 }
817} 817}
818 818
@@ -820,14 +820,19 @@ static int fimc_clk_get(struct fimc_dev *fimc)
820{ 820{
821 int i, ret; 821 int i, ret;
822 822
823 for (i = 0; i < MAX_FIMC_CLOCKS; i++)
824 fimc->clock[i] = ERR_PTR(-EINVAL);
825
823 for (i = 0; i < MAX_FIMC_CLOCKS; i++) { 826 for (i = 0; i < MAX_FIMC_CLOCKS; i++) {
824 fimc->clock[i] = clk_get(&fimc->pdev->dev, fimc_clocks[i]); 827 fimc->clock[i] = clk_get(&fimc->pdev->dev, fimc_clocks[i]);
825 if (IS_ERR(fimc->clock[i])) 828 if (IS_ERR(fimc->clock[i])) {
829 ret = PTR_ERR(fimc->clock[i]);
826 goto err; 830 goto err;
831 }
827 ret = clk_prepare(fimc->clock[i]); 832 ret = clk_prepare(fimc->clock[i]);
828 if (ret < 0) { 833 if (ret < 0) {
829 clk_put(fimc->clock[i]); 834 clk_put(fimc->clock[i]);
830 fimc->clock[i] = NULL; 835 fimc->clock[i] = ERR_PTR(-EINVAL);
831 goto err; 836 goto err;
832 } 837 }
833 } 838 }
@@ -921,8 +926,14 @@ static int fimc_probe(struct platform_device *pdev)
921 ret = fimc_clk_get(fimc); 926 ret = fimc_clk_get(fimc);
922 if (ret) 927 if (ret)
923 return ret; 928 return ret;
924 clk_set_rate(fimc->clock[CLK_BUS], drv_data->lclk_frequency); 929
925 clk_enable(fimc->clock[CLK_BUS]); 930 ret = clk_set_rate(fimc->clock[CLK_BUS], drv_data->lclk_frequency);
931 if (ret < 0)
932 return ret;
933
934 ret = clk_enable(fimc->clock[CLK_BUS]);
935 if (ret < 0)
936 return ret;
926 937
927 ret = devm_request_irq(&pdev->dev, res->start, fimc_irq_handler, 938 ret = devm_request_irq(&pdev->dev, res->start, fimc_irq_handler,
928 0, dev_name(&pdev->dev), fimc); 939 0, dev_name(&pdev->dev), fimc);
@@ -956,6 +967,7 @@ err_pm:
956err_sd: 967err_sd:
957 fimc_unregister_capture_subdev(fimc); 968 fimc_unregister_capture_subdev(fimc);
958err_clk: 969err_clk:
970 clk_disable(fimc->clock[CLK_BUS]);
959 fimc_clk_put(fimc); 971 fimc_clk_put(fimc);
960 return ret; 972 return ret;
961} 973}