summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLily Zhang <r58066@freescale.com>2011-01-17 11:32:49 +0800
committerLily Zhang <r58066@freescale.com>2011-01-17 11:57:13 +0800
commitb91b7b51b4f8b04e4504f57917db865c509e552e (patch)
tree061cf78d29bf424cff638fde4c464dd093334957
parenta3928359c9d8109ca50ea6dfb20f541ab45973e4 (diff)
ENGR00138037 mx53: use round_rate to set asrc serial clk
The parent clk of asrc serial clk is PLL4. After PLL4 clk is changed as 455MHZ in U-Boot, asrc serial clk is not right. So the patch uses round_rate to set asrc serial clk and make it pass clk rate check. This patch also moves asrc serial clk set from board file to clock file. Signed-off-by: Lily Zhang <r58066@freescale.com>
-rw-r--r--arch/arm/mach-mx5/clock.c19
-rw-r--r--arch/arm/mach-mx5/mx53_ard.c1
-rw-r--r--arch/arm/mach-mx5/mx53_evk.c1
-rw-r--r--arch/arm/mach-mx5/mx53_loco.c1
-rw-r--r--arch/arm/mach-mx5/mx53_smd.c1
5 files changed, 19 insertions, 4 deletions
diff --git a/arch/arm/mach-mx5/clock.c b/arch/arm/mach-mx5/clock.c
index d0be51fd5c92..84be46452e61 100644
--- a/arch/arm/mach-mx5/clock.c
+++ b/arch/arm/mach-mx5/clock.c
@@ -4249,6 +4249,21 @@ static int _clk_asrc_set_rate(struct clk *clk, unsigned long rate)
return 0;
}
+static unsigned long _clk_asrc_round_rate(struct clk *clk,
+ unsigned long rate)
+{
+ u32 pre, post;
+ u32 parent_rate = clk_get_rate(clk->parent);
+ u32 div = parent_rate / rate;
+
+ if (parent_rate % rate)
+ div++;
+
+ __calc_pre_post_dividers(div, &pre, &post);
+
+ return parent_rate / (pre * post);
+}
+
static struct clk asrc_clk[] = {
{
.id = 0,
@@ -4256,6 +4271,7 @@ static struct clk asrc_clk[] = {
.set_parent = _clk_asrc_set_parent,
.get_rate = _clk_asrc_get_rate,
.set_rate = _clk_asrc_set_rate,
+ .round_rate = _clk_asrc_round_rate,
.enable_reg = MXC_CCM_CCGR7,
.enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
.enable = _clk_enable,
@@ -5016,6 +5032,9 @@ int __init mx53_clocks_init(unsigned long ckil, unsigned long osc, unsigned long
clk_set_rate(&emi_enfc_clk, clk_round_rate(&emi_enfc_clk,
MAX_NFC_CLK));
+ /* set the freq of asrc_serial_clk */
+ clk_set_rate(&asrc_clk[0], clk_round_rate(&asrc_clk[0],
+ 1190000));
base = ioremap(MX53_BASE_ADDR(GPT1_BASE_ADDR), SZ_4K);
mxc_timer_init(&gpt_clk[0], base, MXC_INT_GPT);
return 0;
diff --git a/arch/arm/mach-mx5/mx53_ard.c b/arch/arm/mach-mx5/mx53_ard.c
index 9da099fc6882..b0ca6f5f9650 100644
--- a/arch/arm/mach-mx5/mx53_ard.c
+++ b/arch/arm/mach-mx5/mx53_ard.c
@@ -1287,7 +1287,6 @@ static void __init mxc_board_init(void)
mxc_asrc_data.asrc_core_clk = clk_get(NULL, "asrc_clk");
clk_put(mxc_asrc_data.asrc_core_clk);
mxc_asrc_data.asrc_audio_clk = clk_get(NULL, "asrc_serial_clk");
- clk_set_rate(mxc_asrc_data.asrc_audio_clk, 1190000);
clk_put(mxc_asrc_data.asrc_audio_clk);
mxc_register_device(&mxc_asrc_device, &mxc_asrc_data);
}
diff --git a/arch/arm/mach-mx5/mx53_evk.c b/arch/arm/mach-mx5/mx53_evk.c
index f97ccdd9ae67..adf435ebe3b0 100644
--- a/arch/arm/mach-mx5/mx53_evk.c
+++ b/arch/arm/mach-mx5/mx53_evk.c
@@ -1585,7 +1585,6 @@ static void __init mxc_board_init(void)
mxc_asrc_data.asrc_core_clk = clk_get(NULL, "asrc_clk");
clk_put(mxc_asrc_data.asrc_core_clk);
mxc_asrc_data.asrc_audio_clk = clk_get(NULL, "asrc_serial_clk");
- clk_set_rate(mxc_asrc_data.asrc_audio_clk, 1190000);
clk_put(mxc_asrc_data.asrc_audio_clk);
mxc_register_device(&mxc_asrc_device, &mxc_asrc_data);
}
diff --git a/arch/arm/mach-mx5/mx53_loco.c b/arch/arm/mach-mx5/mx53_loco.c
index adc0fd6f17b5..45e83178f808 100644
--- a/arch/arm/mach-mx5/mx53_loco.c
+++ b/arch/arm/mach-mx5/mx53_loco.c
@@ -871,7 +871,6 @@ static void __init mxc_board_init(void)
mxc_asrc_data.asrc_core_clk = clk_get(NULL, "asrc_clk");
clk_put(mxc_asrc_data.asrc_core_clk);
mxc_asrc_data.asrc_audio_clk = clk_get(NULL, "asrc_serial_clk");
- clk_set_rate(mxc_asrc_data.asrc_audio_clk, 1190000);
clk_put(mxc_asrc_data.asrc_audio_clk);
mxc_register_device(&mxc_asrc_device, &mxc_asrc_data);
}
diff --git a/arch/arm/mach-mx5/mx53_smd.c b/arch/arm/mach-mx5/mx53_smd.c
index 6c9f3bfcf66d..cea9b774a654 100644
--- a/arch/arm/mach-mx5/mx53_smd.c
+++ b/arch/arm/mach-mx5/mx53_smd.c
@@ -1158,7 +1158,6 @@ static void __init mxc_board_init(void)
mxc_asrc_data.asrc_core_clk = clk_get(NULL, "asrc_clk");
clk_put(mxc_asrc_data.asrc_core_clk);
mxc_asrc_data.asrc_audio_clk = clk_get(NULL, "asrc_serial_clk");
- clk_set_rate(mxc_asrc_data.asrc_audio_clk, 1190000);
clk_put(mxc_asrc_data.asrc_audio_clk);
mxc_register_device(&mxc_asrc_device, &mxc_asrc_data);
}