add /etc/openwrt_version
[openwrt/svn-archive/archive.git] / package / uboot-ifxmips / files / cpu / mips / danube / incaip_clock.c
1 /*
2 * (C) Copyright 2003
3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4 *
5 * See file CREDITS for list of people who contributed to this
6 * project.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21 * MA 02111-1307 USA
22 */
23
24 #ifdef CONFIG_INCA_IP
25
26 #include <common.h>
27 #include <asm/inca-ip.h>
28
29
30 /*******************************************************************************
31 *
32 * get_cpuclk - returns the frequency of the CPU.
33 *
34 * Gets the value directly from the INCA-IP hardware.
35 *
36 * RETURNS:
37 * 150.000.000 for 150 MHz
38 * 133.333.333 for 133 Mhz (= 400MHz/3)
39 * 100.000.000 for 100 Mhz (= 400MHz/4)
40 * NOTE:
41 * This functions should be used by the hardware driver to get the correct
42 * frequency of the CPU. Don't use the macros, which are set to init the CPU
43 * frequency in the ROM code.
44 */
45 uint incaip_get_cpuclk (void)
46 {
47 /*-------------------------------------------------------------------------*/
48 /* CPU Clock Input Multiplexer (MUX I) */
49 /* Multiplexer MUX I selects the maximum input clock to the CPU. */
50 /*-------------------------------------------------------------------------*/
51 if (*((volatile ulong *) INCA_IP_CGU_CGU_MUXCR) &
52 INCA_IP_CGU_CGU_MUXCR_MUXI) {
53 /* MUX I set to 150 MHz clock */
54 return 150000000;
55 } else {
56 /* MUX I set to 100/133 MHz clock */
57 if (*((volatile ulong *) INCA_IP_CGU_CGU_DIVCR) & 0x40) {
58 /* Division value is 1/3, maximum CPU operating */
59 /* frequency is 133.3 MHz */
60 return 133333333;
61 } else {
62 /* Division value is 1/4, maximum CPU operating */
63 /* frequency is 100 MHz */
64 return 100000000;
65 }
66 }
67 }
68
69 /*******************************************************************************
70 *
71 * get_fpiclk - returns the frequency of the FPI bus.
72 *
73 * Gets the value directly from the INCA-IP hardware.
74 *
75 * RETURNS: Frquency in Hz
76 *
77 * NOTE:
78 * This functions should be used by the hardware driver to get the correct
79 * frequency of the CPU. Don't use the macros, which are set to init the CPU
80 * frequency in the ROM code.
81 * The calculation for the
82 */
83 uint incaip_get_fpiclk (void)
84 {
85 uint clkCPU;
86
87 clkCPU = incaip_get_cpuclk ();
88
89 switch (*((volatile ulong *) INCA_IP_CGU_CGU_DIVCR) & 0xC) {
90 case 0x4:
91 return clkCPU >> 1; /* devided by 2 */
92 break;
93 case 0x8:
94 return clkCPU >> 2; /* devided by 4 */
95 break;
96 default:
97 return clkCPU;
98 break;
99 }
100 }
101
102 int incaip_set_cpuclk (void)
103 {
104 extern void ebu_init(long);
105 extern void cgu_init(long);
106 extern void sdram_init(long);
107 char tmp[64];
108 ulong cpuclk;
109
110 if (getenv_r ("cpuclk", tmp, sizeof (tmp)) > 0) {
111 cpuclk = simple_strtoul (tmp, NULL, 10) * 1000000;
112 cgu_init (cpuclk);
113 ebu_init (cpuclk);
114 sdram_init (cpuclk);
115 }
116
117 return 0;
118 }
119
120 #endif /* CONFIG_INCA_IP */