aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2013-01-29 04:52:29 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-02-05 14:50:54 -0500
commit44e2b09ca468c7c91fa4bb8058fcda38f344974a (patch)
tree2b04c9fecf4ddd1b7241335b63772385e64e3d2b /drivers/media
parentb71b56b264ae27f32784973d15bfdfbc7df6d579 (diff)
[media] s5p-csis: 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')
-rw-r--r--drivers/media/platform/s5p-fimc/mipi-csis.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/drivers/media/platform/s5p-fimc/mipi-csis.c b/drivers/media/platform/s5p-fimc/mipi-csis.c
index 7e36ad92dd94..613482fd74a9 100644
--- a/drivers/media/platform/s5p-fimc/mipi-csis.c
+++ b/drivers/media/platform/s5p-fimc/mipi-csis.c
@@ -352,11 +352,11 @@ static void s5pcsis_clk_put(struct csis_state *state)
352 int i; 352 int i;
353 353
354 for (i = 0; i < NUM_CSIS_CLOCKS; i++) { 354 for (i = 0; i < NUM_CSIS_CLOCKS; i++) {
355 if (IS_ERR_OR_NULL(state->clock[i])) 355 if (IS_ERR(state->clock[i]))
356 continue; 356 continue;
357 clk_unprepare(state->clock[i]); 357 clk_unprepare(state->clock[i]);
358 clk_put(state->clock[i]); 358 clk_put(state->clock[i]);
359 state->clock[i] = NULL; 359 state->clock[i] = ERR_PTR(-EINVAL);
360 } 360 }
361} 361}
362 362
@@ -365,14 +365,19 @@ static int s5pcsis_clk_get(struct csis_state *state)
365 struct device *dev = &state->pdev->dev; 365 struct device *dev = &state->pdev->dev;
366 int i, ret; 366 int i, ret;
367 367
368 for (i = 0; i < NUM_CSIS_CLOCKS; i++)
369 state->clock[i] = ERR_PTR(-EINVAL);
370
368 for (i = 0; i < NUM_CSIS_CLOCKS; i++) { 371 for (i = 0; i < NUM_CSIS_CLOCKS; i++) {
369 state->clock[i] = clk_get(dev, csi_clock_name[i]); 372 state->clock[i] = clk_get(dev, csi_clock_name[i]);
370 if (IS_ERR(state->clock[i])) 373 if (IS_ERR(state->clock[i])) {
374 ret = PTR_ERR(state->clock[i]);
371 goto err; 375 goto err;
376 }
372 ret = clk_prepare(state->clock[i]); 377 ret = clk_prepare(state->clock[i]);
373 if (ret < 0) { 378 if (ret < 0) {
374 clk_put(state->clock[i]); 379 clk_put(state->clock[i]);
375 state->clock[i] = NULL; 380 state->clock[i] = ERR_PTR(-EINVAL);
376 goto err; 381 goto err;
377 } 382 }
378 } 383 }
@@ -380,7 +385,7 @@ static int s5pcsis_clk_get(struct csis_state *state)
380err: 385err:
381 s5pcsis_clk_put(state); 386 s5pcsis_clk_put(state);
382 dev_err(dev, "failed to get clock: %s\n", csi_clock_name[i]); 387 dev_err(dev, "failed to get clock: %s\n", csi_clock_name[i]);
383 return -ENXIO; 388 return ret;
384} 389}
385 390
386static void dump_regs(struct csis_state *state, const char *label) 391static void dump_regs(struct csis_state *state, const char *label)
@@ -749,14 +754,20 @@ static int s5pcsis_probe(struct platform_device *pdev)
749 return ret; 754 return ret;
750 755
751 ret = s5pcsis_clk_get(state); 756 ret = s5pcsis_clk_get(state);
752 if (ret) 757 if (ret < 0)
753 goto e_clkput; 758 return ret;
754 759
755 clk_enable(state->clock[CSIS_CLK_MUX]);
756 if (pdata->clk_rate) 760 if (pdata->clk_rate)
757 clk_set_rate(state->clock[CSIS_CLK_MUX], pdata->clk_rate); 761 ret = clk_set_rate(state->clock[CSIS_CLK_MUX],
762 pdata->clk_rate);
758 else 763 else
759 dev_WARN(&pdev->dev, "No clock frequency specified!\n"); 764 dev_WARN(&pdev->dev, "No clock frequency specified!\n");
765 if (ret < 0)
766 goto e_clkput;
767
768 ret = clk_enable(state->clock[CSIS_CLK_MUX]);
769 if (ret < 0)
770 goto e_clkput;
760 771
761 ret = devm_request_irq(&pdev->dev, state->irq, s5pcsis_irq_handler, 772 ret = devm_request_irq(&pdev->dev, state->irq, s5pcsis_irq_handler,
762 0, dev_name(&pdev->dev), state); 773 0, dev_name(&pdev->dev), state);