diff options
author | Sylwester Nawrocki <s.nawrocki@samsung.com> | 2013-01-18 13:34:37 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-02-05 14:54:03 -0500 |
commit | 0e23cbbe478809fe8499dab9b2a26bb6154c773b (patch) | |
tree | a6c11d84319fe299377121a5171e948cb77994e4 | |
parent | 8b164105d87d1c0101dfbf8d2bacee82c70d91aa (diff) |
[media] s5p-fimc: Add clk_prepare/unprepare for sclk_cam clocks
Add clk_prepare(), clk_unprepare() calls for the sclk_cam clocks
to ensure the driver works on platforms with the common clocks
API enabled.
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>
-rw-r--r-- | drivers/media/platform/s5p-fimc/fimc-mdevice.c | 53 |
1 files changed, 36 insertions, 17 deletions
diff --git a/drivers/media/platform/s5p-fimc/fimc-mdevice.c b/drivers/media/platform/s5p-fimc/fimc-mdevice.c index 2b0587204868..d940454a0297 100644 --- a/drivers/media/platform/s5p-fimc/fimc-mdevice.c +++ b/drivers/media/platform/s5p-fimc/fimc-mdevice.c | |||
@@ -708,35 +708,54 @@ static int fimc_md_create_links(struct fimc_md *fmd) | |||
708 | /* | 708 | /* |
709 | * The peripheral sensor clock management. | 709 | * The peripheral sensor clock management. |
710 | */ | 710 | */ |
711 | static void fimc_md_put_clocks(struct fimc_md *fmd) | ||
712 | { | ||
713 | int i = FIMC_MAX_CAMCLKS; | ||
714 | |||
715 | while (--i >= 0) { | ||
716 | if (IS_ERR(fmd->camclk[i].clock)) | ||
717 | continue; | ||
718 | clk_unprepare(fmd->camclk[i].clock); | ||
719 | clk_put(fmd->camclk[i].clock); | ||
720 | fmd->camclk[i].clock = ERR_PTR(-EINVAL); | ||
721 | } | ||
722 | } | ||
723 | |||
711 | static int fimc_md_get_clocks(struct fimc_md *fmd) | 724 | static int fimc_md_get_clocks(struct fimc_md *fmd) |
712 | { | 725 | { |
726 | struct device *dev = NULL; | ||
713 | char clk_name[32]; | 727 | char clk_name[32]; |
714 | struct clk *clock; | 728 | struct clk *clock; |
715 | int i; | 729 | int ret, i; |
730 | |||
731 | for (i = 0; i < FIMC_MAX_CAMCLKS; i++) | ||
732 | fmd->camclk[i].clock = ERR_PTR(-EINVAL); | ||
733 | |||
734 | if (fmd->pdev->dev.of_node) | ||
735 | dev = &fmd->pdev->dev; | ||
716 | 736 | ||
717 | for (i = 0; i < FIMC_MAX_CAMCLKS; i++) { | 737 | for (i = 0; i < FIMC_MAX_CAMCLKS; i++) { |
718 | snprintf(clk_name, sizeof(clk_name), "sclk_cam%u", i); | 738 | snprintf(clk_name, sizeof(clk_name), "sclk_cam%u", i); |
719 | clock = clk_get(NULL, clk_name); | 739 | clock = clk_get(dev, clk_name); |
740 | |||
720 | if (IS_ERR(clock)) { | 741 | if (IS_ERR(clock)) { |
721 | v4l2_err(&fmd->v4l2_dev, "Failed to get clock: %s", | 742 | dev_err(&fmd->pdev->dev, "Failed to get clock: %s\n", |
722 | clk_name); | 743 | clk_name); |
723 | return -ENXIO; | 744 | ret = PTR_ERR(clock); |
745 | break; | ||
746 | } | ||
747 | ret = clk_prepare(clock); | ||
748 | if (ret < 0) { | ||
749 | clk_put(clock); | ||
750 | fmd->camclk[i].clock = ERR_PTR(-EINVAL); | ||
751 | break; | ||
724 | } | 752 | } |
725 | fmd->camclk[i].clock = clock; | 753 | fmd->camclk[i].clock = clock; |
726 | } | 754 | } |
727 | return 0; | 755 | if (ret) |
728 | } | 756 | fimc_md_put_clocks(fmd); |
729 | |||
730 | static void fimc_md_put_clocks(struct fimc_md *fmd) | ||
731 | { | ||
732 | int i = FIMC_MAX_CAMCLKS; | ||
733 | 757 | ||
734 | while (--i >= 0) { | 758 | return ret; |
735 | if (IS_ERR_OR_NULL(fmd->camclk[i].clock)) | ||
736 | continue; | ||
737 | clk_put(fmd->camclk[i].clock); | ||
738 | fmd->camclk[i].clock = NULL; | ||
739 | } | ||
740 | } | 759 | } |
741 | 760 | ||
742 | static int __fimc_md_set_camclk(struct fimc_md *fmd, | 761 | static int __fimc_md_set_camclk(struct fimc_md *fmd, |