summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Andreyanau <a.andreyanau@sam-solutions.com>2013-06-19 11:59:24 +0300
committerJustin Waters <justin.waters@timesys.com>2013-11-07 12:19:32 -0500
commit1ad79d753fa292bdf44196ff526bb8c1e18dbd89 (patch)
treeb24ac75c6318230a56fd831f2e7db6ad3a98a203
parent55c101abfc963a4b5e20aa6a8d479d1e9f2bf5a5 (diff)
Added support for clocking the camera, connected to csi2 interface. Fixed clko2_clk parent clock source.
Signed-off-by: Andrei Andreyanau <a.andreyanau@sam-solutions.com> modified: arch/arm/mach-mx6/clock.c Signed-off-by: Christian Hemp <c.hemp@phytec.de>
-rw-r--r--arch/arm/mach-mx6/clock.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/arch/arm/mach-mx6/clock.c b/arch/arm/mach-mx6/clock.c
index 7f83ef0530a4..abbec14d2e8f 100644
--- a/arch/arm/mach-mx6/clock.c
+++ b/arch/arm/mach-mx6/clock.c
@@ -968,7 +968,12 @@ static int _clk_audio_video_set_rate(struct clk *clk, unsigned long rate)
int rev = mx6q_revision();
u32 test_div_sel = 2;
u32 control3 = 0;
+ bool use_160mhz = false;
+ if (clk == &pll4_audio_main_clk && rate == 160000000) {
+ use_160mhz = true;
+ }
+
if ((rev < IMX_CHIP_REVISION_1_1) && !cpu_is_mx6dl())
min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ;
else if (clk == &pll4_audio_main_clk)
@@ -976,7 +981,7 @@ static int _clk_audio_video_set_rate(struct clk *clk, unsigned long rate)
else
min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ / 16;
- if ((rate < min_clk_rate) || (rate > AUDIO_VIDEO_MAX_CLK_FREQ))
+ if (((rate < min_clk_rate) || (rate > AUDIO_VIDEO_MAX_CLK_FREQ)) && !use_160mhz)
return -EINVAL;
if (clk == &pll4_audio_main_clk)
@@ -1018,8 +1023,17 @@ static int _clk_audio_video_set_rate(struct clk *clk, unsigned long rate)
reg = __raw_readl(pllbase)
& ~ANADIG_PLL_SYS_DIV_SELECT_MASK
& ~ANADIG_PLL_AV_TEST_DIV_SEL_MASK;
+ if (use_160mhz) {
+ printk(" Changing DIV from %d to 26 (test_div_sel=%d)\n", div, test_div_sel);
+ div = 26;
+ test_div_sel = 0;
+ }
reg |= div |
(test_div_sel << ANADIG_PLL_AV_TEST_DIV_SEL_OFFSET);
+ if (use_160mhz) {
+ mfn = 0x0aac0000; // Setting 160MHz more pricesely
+ mfd = 0x0fffffff;
+ }
__raw_writel(reg, pllbase);
__raw_writel(mfn, pllbase + PLL_NUM_DIV_OFFSET);
__raw_writel(mfd, pllbase + PLL_DENOM_DIV_OFFSET);
@@ -1048,6 +1062,10 @@ static unsigned long _clk_audio_video_round_rate(struct clk *clk,
unsigned long final_rate;
int rev = mx6q_revision();
+ if (clk == &pll4_audio_main_clk && rate == 160000000) {
+ return rate;
+ }
+
if ((rev < IMX_CHIP_REVISION_1_1) && !cpu_is_mx6dl())
min_clk_rate = AUDIO_VIDEO_MIN_CLK_FREQ;
else if (clk == &pll4_audio_main_clk)
@@ -5425,7 +5443,7 @@ int __init mx6_clocks_init(unsigned long ckil, unsigned long osc,
pcie_clk[0].disable(&pcie_clk[0]);
/* Initialize Audio and Video PLLs to valid frequency. */
- clk_set_rate(&pll4_audio_main_clk, 176000000);
+ clk_set_rate(&pll4_audio_main_clk, 160000000);
clk_set_rate(&pll5_video_main_clk, 650000000);
clk_set_parent(&ipu1_di_clk[0], &pll5_video_main_clk);
@@ -5488,14 +5506,16 @@ int __init mx6_clocks_init(unsigned long ckil, unsigned long osc,
#endif
/* PCLK camera - J5 */
- clk_set_parent(&clko2_clk, &osc_clk);
- clk_set_rate(&clko2_clk, 2400000);
+ clk_set_parent(&esai_clk, &pll4_audio_main_clk);
+ clk_set_rate(&esai_clk, clk_round_rate(&esai_clk, clk_get_rate(&pll4_audio_main_clk)));
+ clk_set_parent(&clko2_clk, &esai_clk);
+ clk_set_rate(&clko2_clk, clk_round_rate(&clko2_clk, clk_get_rate(&esai_clk)));
#if defined(CONFIG_MACH_MX6Q_PHYFLEX) || defined(CONFIG_MACH_MX6Q_PHYCARD)
+ clk_set_parent(&clko_clk, &pll4_audio_main_clk);
+#else
clk_set_parent(&clko_clk, &ahb_clk);
clk_set_rate(&clko_clk, 2400000);
-#else
- clk_set_parent(&clko_clk, &pll4_audio_main_clk);
#endif
/*