aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-omap2')
-rw-r--r--arch/arm/mach-omap2/clock.c34
-rw-r--r--arch/arm/mach-omap2/clock.h1
-rw-r--r--arch/arm/mach-omap2/clock44xx_data.c7
3 files changed, 41 insertions, 1 deletions
diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c
index 61ee23596ea8..759c72a48f7f 100644
--- a/arch/arm/mach-omap2/clock.c
+++ b/arch/arm/mach-omap2/clock.c
@@ -70,9 +70,41 @@
70u8 cpu_mask; 70u8 cpu_mask;
71 71
72/*------------------------------------------------------------------------- 72/*-------------------------------------------------------------------------
73 * OMAP2/3 specific clock functions 73 * OMAP2/3/4 specific clock functions
74 *-------------------------------------------------------------------------*/ 74 *-------------------------------------------------------------------------*/
75 75
76void omap2_init_dpll_parent(struct clk *clk)
77{
78 u32 v;
79 struct dpll_data *dd;
80
81 dd = clk->dpll_data;
82 if (!dd)
83 return;
84
85 /* Return bypass rate if DPLL is bypassed */
86 v = __raw_readl(dd->control_reg);
87 v &= dd->enable_mask;
88 v >>= __ffs(dd->enable_mask);
89
90 /* Reparent in case the dpll is in bypass */
91 if (cpu_is_omap24xx()) {
92 if (v == OMAP2XXX_EN_DPLL_LPBYPASS ||
93 v == OMAP2XXX_EN_DPLL_FRBYPASS)
94 clk_reparent(clk, dd->clk_bypass);
95 } else if (cpu_is_omap34xx()) {
96 if (v == OMAP3XXX_EN_DPLL_LPBYPASS ||
97 v == OMAP3XXX_EN_DPLL_FRBYPASS)
98 clk_reparent(clk, dd->clk_bypass);
99 } else if (cpu_is_omap44xx()) {
100 if (v == OMAP4XXX_EN_DPLL_LPBYPASS ||
101 v == OMAP4XXX_EN_DPLL_FRBYPASS ||
102 v == OMAP4XXX_EN_DPLL_MNBYPASS)
103 clk_reparent(clk, dd->clk_bypass);
104 }
105 return;
106}
107
76/** 108/**
77 * _omap2xxx_clk_commit - commit clock parent/rate changes in hardware 109 * _omap2xxx_clk_commit - commit clock parent/rate changes in hardware
78 * @clk: struct clk * 110 * @clk: struct clk *
diff --git a/arch/arm/mach-omap2/clock.h b/arch/arm/mach-omap2/clock.h
index 8418f3a22e60..93c48df3b5b1 100644
--- a/arch/arm/mach-omap2/clock.h
+++ b/arch/arm/mach-omap2/clock.h
@@ -82,6 +82,7 @@ unsigned long omap2_fixed_divisor_recalc(struct clk *clk);
82long omap2_clksel_round_rate(struct clk *clk, unsigned long target_rate); 82long omap2_clksel_round_rate(struct clk *clk, unsigned long target_rate);
83int omap2_clksel_set_rate(struct clk *clk, unsigned long rate); 83int omap2_clksel_set_rate(struct clk *clk, unsigned long rate);
84u32 omap2_get_dpll_rate(struct clk *clk); 84u32 omap2_get_dpll_rate(struct clk *clk);
85void omap2_init_dpll_parent(struct clk *clk);
85int omap2_wait_clock_ready(void __iomem *reg, u32 cval, const char *name); 86int omap2_wait_clock_ready(void __iomem *reg, u32 cval, const char *name);
86void omap2_clk_prepare_for_reboot(void); 87void omap2_clk_prepare_for_reboot(void);
87int omap2_dflt_clk_enable(struct clk *clk); 88int omap2_dflt_clk_enable(struct clk *clk);
diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c
index 9ae526ee0daf..2210e227d78a 100644
--- a/arch/arm/mach-omap2/clock44xx_data.c
+++ b/arch/arm/mach-omap2/clock44xx_data.c
@@ -278,6 +278,7 @@ static struct clk dpll_abe_ck = {
278 .name = "dpll_abe_ck", 278 .name = "dpll_abe_ck",
279 .parent = &abe_dpll_refclk_mux_ck, 279 .parent = &abe_dpll_refclk_mux_ck,
280 .dpll_data = &dpll_abe_dd, 280 .dpll_data = &dpll_abe_dd,
281 .init = &omap2_init_dpll_parent,
281 .ops = &clkops_noncore_dpll_ops, 282 .ops = &clkops_noncore_dpll_ops,
282 .recalc = &omap3_dpll_recalc, 283 .recalc = &omap3_dpll_recalc,
283 .round_rate = &omap2_dpll_round_rate, 284 .round_rate = &omap2_dpll_round_rate,
@@ -439,6 +440,7 @@ static struct clk dpll_core_ck = {
439 .name = "dpll_core_ck", 440 .name = "dpll_core_ck",
440 .parent = &dpll_sys_ref_clk, 441 .parent = &dpll_sys_ref_clk,
441 .dpll_data = &dpll_core_dd, 442 .dpll_data = &dpll_core_dd,
443 .init = &omap2_init_dpll_parent,
442 .ops = &clkops_null, 444 .ops = &clkops_null,
443 .recalc = &omap3_dpll_recalc, 445 .recalc = &omap3_dpll_recalc,
444 .flags = CLOCK_IN_OMAP4430, 446 .flags = CLOCK_IN_OMAP4430,
@@ -665,6 +667,7 @@ static struct clk dpll_iva_ck = {
665 .name = "dpll_iva_ck", 667 .name = "dpll_iva_ck",
666 .parent = &dpll_sys_ref_clk, 668 .parent = &dpll_sys_ref_clk,
667 .dpll_data = &dpll_iva_dd, 669 .dpll_data = &dpll_iva_dd,
670 .init = &omap2_init_dpll_parent,
668 .ops = &clkops_noncore_dpll_ops, 671 .ops = &clkops_noncore_dpll_ops,
669 .recalc = &omap3_dpll_recalc, 672 .recalc = &omap3_dpll_recalc,
670 .round_rate = &omap2_dpll_round_rate, 673 .round_rate = &omap2_dpll_round_rate,
@@ -727,6 +730,7 @@ static struct clk dpll_mpu_ck = {
727 .name = "dpll_mpu_ck", 730 .name = "dpll_mpu_ck",
728 .parent = &dpll_sys_ref_clk, 731 .parent = &dpll_sys_ref_clk,
729 .dpll_data = &dpll_mpu_dd, 732 .dpll_data = &dpll_mpu_dd,
733 .init = &omap2_init_dpll_parent,
730 .ops = &clkops_noncore_dpll_ops, 734 .ops = &clkops_noncore_dpll_ops,
731 .recalc = &omap3_dpll_recalc, 735 .recalc = &omap3_dpll_recalc,
732 .round_rate = &omap2_dpll_round_rate, 736 .round_rate = &omap2_dpll_round_rate,
@@ -802,6 +806,7 @@ static struct clk dpll_per_ck = {
802 .name = "dpll_per_ck", 806 .name = "dpll_per_ck",
803 .parent = &dpll_sys_ref_clk, 807 .parent = &dpll_sys_ref_clk,
804 .dpll_data = &dpll_per_dd, 808 .dpll_data = &dpll_per_dd,
809 .init = &omap2_init_dpll_parent,
805 .ops = &clkops_noncore_dpll_ops, 810 .ops = &clkops_noncore_dpll_ops,
806 .recalc = &omap3_dpll_recalc, 811 .recalc = &omap3_dpll_recalc,
807 .round_rate = &omap2_dpll_round_rate, 812 .round_rate = &omap2_dpll_round_rate,
@@ -924,6 +929,7 @@ static struct clk dpll_unipro_ck = {
924 .name = "dpll_unipro_ck", 929 .name = "dpll_unipro_ck",
925 .parent = &dpll_sys_ref_clk, 930 .parent = &dpll_sys_ref_clk,
926 .dpll_data = &dpll_unipro_dd, 931 .dpll_data = &dpll_unipro_dd,
932 .init = &omap2_init_dpll_parent,
927 .ops = &clkops_noncore_dpll_ops, 933 .ops = &clkops_noncore_dpll_ops,
928 .recalc = &omap3_dpll_recalc, 934 .recalc = &omap3_dpll_recalc,
929 .round_rate = &omap2_dpll_round_rate, 935 .round_rate = &omap2_dpll_round_rate,
@@ -981,6 +987,7 @@ static struct clk dpll_usb_ck = {
981 .name = "dpll_usb_ck", 987 .name = "dpll_usb_ck",
982 .parent = &dpll_sys_ref_clk, 988 .parent = &dpll_sys_ref_clk,
983 .dpll_data = &dpll_usb_dd, 989 .dpll_data = &dpll_usb_dd,
990 .init = &omap2_init_dpll_parent,
984 .ops = &clkops_noncore_dpll_ops, 991 .ops = &clkops_noncore_dpll_ops,
985 .recalc = &omap3_dpll_recalc, 992 .recalc = &omap3_dpll_recalc,
986 .round_rate = &omap2_dpll_round_rate, 993 .round_rate = &omap2_dpll_round_rate,