diff options
author | Sylwester Nawrocki <s.nawrocki@samsung.com> | 2013-01-29 04:52:29 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-02-05 14:50:54 -0500 |
commit | 44e2b09ca468c7c91fa4bb8058fcda38f344974a (patch) | |
tree | 2b04c9fecf4ddd1b7241335b63772385e64e3d2b /drivers/media | |
parent | b71b56b264ae27f32784973d15bfdfbc7df6d579 (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.c | 29 |
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) | |||
380 | err: | 385 | err: |
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 | ||
386 | static void dump_regs(struct csis_state *state, const char *label) | 391 | static 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); |