058217278ad348475ccb784623a8f6fe587db584
[openembedded.git] /
1 From 26b873e74231529962132d9d80c8921b584f6e84 Mon Sep 17 00:00:00 2001
2 From: Tuukka Toivonen <tuukka.o.toivonen@nokia.com>
3 Date: Thu, 2 Jul 2009 16:17:55 +0200
4 Subject: [PATCH 17/75] omap3isp: set CAM_MCLK to 172.8 MHz, allows exact 9.6 MHz for camera xclka/b
5
6 Camera cam_xclka and cam_xclkb clocks are generated by dividing
7 CAM_MCLK with an integer. We want to use 9.6 MHz for cameras,
8 so CAM_MCLK should be multiple of it. Otherwise the generated
9 frequency is slightly off due to rounding.
10
11 Signed-off-by: Tuukka Toivonen <tuukka.o.toivonen@nokia.com>
12 ---
13  drivers/media/video/isp/isp.c    |   14 ++++++++++++++
14  drivers/media/video/isp/isp.h    |    1 +
15  drivers/media/video/isp/ispreg.h |    2 +-
16  3 files changed, 16 insertions(+), 1 deletions(-)
17
18 diff --git a/drivers/media/video/isp/isp.c b/drivers/media/video/isp/isp.c
19 index ceed870..9d46c01 100644
20 --- a/drivers/media/video/isp/isp.c
21 +++ b/drivers/media/video/isp/isp.c
22 @@ -2333,6 +2333,11 @@ static int isp_enable_clocks(struct device *dev)
23                 dev_err(dev, "clk_enable cam_ick failed\n");
24                 goto out_clk_enable_ick;
25         }
26 +       r = clk_set_rate(isp->dpll4_m5_ck, CM_CAM_MCLK_HZ/2);
27 +       if (r) {
28 +               dev_err(dev, "clk_set_rate for dpll4_m5_ck failed\n");
29 +               goto out_clk_enable_mclk;
30 +       }
31         r = clk_enable(isp->cam_mclk);
32         if (r) {
33                 dev_err(dev, "clk_enable cam_mclk failed\n");
34 @@ -2499,6 +2504,7 @@ static int isp_remove(struct platform_device *pdev)
35  
36         clk_put(isp->cam_ick);
37         clk_put(isp->cam_mclk);
38 +       clk_put(isp->dpll4_m5_ck);
39         clk_put(isp->csi2_fck);
40         clk_put(isp->l3_ick);
41  
42 @@ -2674,6 +2680,12 @@ static int isp_probe(struct platform_device *pdev)
43                 ret_err = PTR_ERR(isp->cam_mclk);
44                 goto out_clk_get_mclk;
45         }
46 +       isp->dpll4_m5_ck = clk_get(&camera_dev, "dpll4_m5_ck");
47 +       if (IS_ERR(isp->dpll4_m5_ck)) {
48 +               dev_err(isp->dev, "clk_get dpll4_m5_ck failed\n");
49 +               ret_err = PTR_ERR(isp->dpll4_m5_ck);
50 +               goto out_clk_get_dpll4_m5_ck;
51 +       }
52         isp->csi2_fck = clk_get(&camera_dev, "csi2_96m_fck");
53         if (IS_ERR(isp->csi2_fck)) {
54                 dev_err(isp->dev, "clk_get csi2_96m_fck failed\n");
55 @@ -2734,6 +2746,8 @@ out_request_irq:
56  out_clk_get_l3_ick:
57         clk_put(isp->csi2_fck);
58  out_clk_get_csi2_fclk:
59 +       clk_put(isp->dpll4_m5_ck);
60 +out_clk_get_dpll4_m5_ck:
61         clk_put(isp->cam_mclk);
62  out_clk_get_mclk:
63         clk_put(isp->cam_ick);
64 diff --git a/drivers/media/video/isp/isp.h b/drivers/media/video/isp/isp.h
65 index dc85d61..6b100b6 100644
66 --- a/drivers/media/video/isp/isp.h
67 +++ b/drivers/media/video/isp/isp.h
68 @@ -414,6 +414,7 @@ struct isp_device {
69         int ref_count;
70         struct clk *cam_ick;
71         struct clk *cam_mclk;
72 +       struct clk *dpll4_m5_ck;
73         struct clk *csi2_fck;
74         struct clk *l3_ick;
75         struct isp_interface_config *config;
76 diff --git a/drivers/media/video/isp/ispreg.h b/drivers/media/video/isp/ispreg.h
77 index 676a33d..1240e0e 100644
78 --- a/drivers/media/video/isp/ispreg.h
79 +++ b/drivers/media/video/isp/ispreg.h
80 @@ -116,7 +116,7 @@
81  #define ISP_32B_BOUNDARY_BUF           0xFFFFFFE0
82  #define ISP_32B_BOUNDARY_OFFSET                0x0000FFE0
83  
84 -#define CM_CAM_MCLK_HZ                 216000000
85 +#define CM_CAM_MCLK_HZ                 172800000       /* Hz */
86  
87  /* ISP Submodules offset */
88  
89 -- 
90 1.6.6.1
91