diff options
Diffstat (limited to 'arch/arm/mach-omap1/clock_data.c')
-rw-r--r-- | arch/arm/mach-omap1/clock_data.c | 61 |
1 files changed, 42 insertions, 19 deletions
diff --git a/arch/arm/mach-omap1/clock_data.c b/arch/arm/mach-omap1/clock_data.c index 92400b9eb69f..9ff90a744a21 100644 --- a/arch/arm/mach-omap1/clock_data.c +++ b/arch/arm/mach-omap1/clock_data.c | |||
@@ -16,6 +16,8 @@ | |||
16 | 16 | ||
17 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
18 | #include <linux/clk.h> | 18 | #include <linux/clk.h> |
19 | #include <linux/cpufreq.h> | ||
20 | #include <linux/delay.h> | ||
19 | #include <linux/io.h> | 21 | #include <linux/io.h> |
20 | 22 | ||
21 | #include <asm/mach-types.h> /* for machine_is_* */ | 23 | #include <asm/mach-types.h> /* for machine_is_* */ |
@@ -767,6 +769,15 @@ static struct clk_functions omap1_clk_functions = { | |||
767 | .clk_disable_unused = omap1_clk_disable_unused, | 769 | .clk_disable_unused = omap1_clk_disable_unused, |
768 | }; | 770 | }; |
769 | 771 | ||
772 | static void __init omap1_show_rates(void) | ||
773 | { | ||
774 | pr_notice("Clocking rate (xtal/DPLL1/MPU): " | ||
775 | "%ld.%01ld/%ld.%01ld/%ld.%01ld MHz\n", | ||
776 | ck_ref.rate / 1000000, (ck_ref.rate / 100000) % 10, | ||
777 | ck_dpll1.rate / 1000000, (ck_dpll1.rate / 100000) % 10, | ||
778 | arm_ck.rate / 1000000, (arm_ck.rate / 100000) % 10); | ||
779 | } | ||
780 | |||
770 | int __init omap1_clk_init(void) | 781 | int __init omap1_clk_init(void) |
771 | { | 782 | { |
772 | struct omap_clk *c; | 783 | struct omap_clk *c; |
@@ -835,9 +846,12 @@ int __init omap1_clk_init(void) | |||
835 | /* We want to be in syncronous scalable mode */ | 846 | /* We want to be in syncronous scalable mode */ |
836 | omap_writew(0x1000, ARM_SYSST); | 847 | omap_writew(0x1000, ARM_SYSST); |
837 | 848 | ||
838 | #ifdef CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER | 849 | |
839 | /* Use values set by bootloader. Determine PLL rate and recalculate | 850 | /* |
840 | * dependent clocks as if kernel had changed PLL or divisors. | 851 | * Initially use the values set by bootloader. Determine PLL rate and |
852 | * recalculate dependent clocks as if kernel had changed PLL or | ||
853 | * divisors. See also omap1_clk_late_init() that can reprogram dpll1 | ||
854 | * after the SRAM is initialized. | ||
841 | */ | 855 | */ |
842 | { | 856 | { |
843 | unsigned pll_ctl_val = omap_readw(DPLL_CTL); | 857 | unsigned pll_ctl_val = omap_readw(DPLL_CTL); |
@@ -862,25 +876,10 @@ int __init omap1_clk_init(void) | |||
862 | } | 876 | } |
863 | } | 877 | } |
864 | } | 878 | } |
865 | #else | ||
866 | /* Find the highest supported frequency and enable it */ | ||
867 | if (omap1_select_table_rate(&virtual_ck_mpu, ~0)) { | ||
868 | printk(KERN_ERR "System frequencies not set. Check your config.\n"); | ||
869 | /* Guess sane values (60MHz) */ | ||
870 | omap_writew(0x2290, DPLL_CTL); | ||
871 | omap_writew(cpu_is_omap7xx() ? 0x3005 : 0x1005, ARM_CKCTL); | ||
872 | ck_dpll1.rate = 60000000; | ||
873 | } | ||
874 | #endif | ||
875 | propagate_rate(&ck_dpll1); | 879 | propagate_rate(&ck_dpll1); |
876 | /* Cache rates for clocks connected to ck_ref (not dpll1) */ | 880 | /* Cache rates for clocks connected to ck_ref (not dpll1) */ |
877 | propagate_rate(&ck_ref); | 881 | propagate_rate(&ck_ref); |
878 | printk(KERN_INFO "Clocking rate (xtal/DPLL1/MPU): " | 882 | omap1_show_rates(); |
879 | "%ld.%01ld/%ld.%01ld/%ld.%01ld MHz\n", | ||
880 | ck_ref.rate / 1000000, (ck_ref.rate / 100000) % 10, | ||
881 | ck_dpll1.rate / 1000000, (ck_dpll1.rate / 100000) % 10, | ||
882 | arm_ck.rate / 1000000, (arm_ck.rate / 100000) % 10); | ||
883 | |||
884 | if (machine_is_omap_perseus2() || machine_is_omap_fsample()) { | 883 | if (machine_is_omap_perseus2() || machine_is_omap_fsample()) { |
885 | /* Select slicer output as OMAP input clock */ | 884 | /* Select slicer output as OMAP input clock */ |
886 | omap_writew(omap_readw(OMAP7XX_PCC_UPLD_CTRL) & ~0x1, | 885 | omap_writew(omap_readw(OMAP7XX_PCC_UPLD_CTRL) & ~0x1, |
@@ -925,3 +924,27 @@ int __init omap1_clk_init(void) | |||
925 | 924 | ||
926 | return 0; | 925 | return 0; |
927 | } | 926 | } |
927 | |||
928 | #define OMAP1_DPLL1_SANE_VALUE 60000000 | ||
929 | |||
930 | void __init omap1_clk_late_init(void) | ||
931 | { | ||
932 | unsigned long rate = ck_dpll1.rate; | ||
933 | |||
934 | if (rate >= OMAP1_DPLL1_SANE_VALUE) | ||
935 | return; | ||
936 | |||
937 | /* System booting at unusable rate, force reprogramming of DPLL1 */ | ||
938 | ck_dpll1_p->rate = 0; | ||
939 | |||
940 | /* Find the highest supported frequency and enable it */ | ||
941 | if (omap1_select_table_rate(&virtual_ck_mpu, ~0)) { | ||
942 | pr_err("System frequencies not set, using default. Check your config.\n"); | ||
943 | omap_writew(0x2290, DPLL_CTL); | ||
944 | omap_writew(cpu_is_omap7xx() ? 0x2005 : 0x0005, ARM_CKCTL); | ||
945 | ck_dpll1.rate = OMAP1_DPLL1_SANE_VALUE; | ||
946 | } | ||
947 | propagate_rate(&ck_dpll1); | ||
948 | omap1_show_rates(); | ||
949 | loops_per_jiffy = cpufreq_scale(loops_per_jiffy, rate, ck_dpll1.rate); | ||
950 | } | ||