aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2013-01-18 13:34:37 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-02-05 14:54:03 -0500
commit0e23cbbe478809fe8499dab9b2a26bb6154c773b (patch)
treea6c11d84319fe299377121a5171e948cb77994e4
parent8b164105d87d1c0101dfbf8d2bacee82c70d91aa (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.c53
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 */
711static 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
711static int fimc_md_get_clocks(struct fimc_md *fmd) 724static 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
730static 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
742static int __fimc_md_set_camclk(struct fimc_md *fmd, 761static int __fimc_md_set_camclk(struct fimc_md *fmd,