Merge with /home/wd/git/u-boot/master
[platform/kernel/u-boot.git] / cpu / mips / 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 #include <common.h>
25 #include <asm/inca-ip.h>
26
27
28 /*******************************************************************************
29 *
30 * get_cpuclk - returns the frequency of the CPU.
31 *
32 * Gets the value directly from the INCA-IP hardware.
33 *
34 * RETURNS:
35 *          150.000.000 for 150 MHz
36 *          133.333.333 for 133 Mhz (= 400MHz/3)
37 *          100.000.000 for 100 Mhz (= 400MHz/4)
38 * NOTE:
39 *   This functions should be used by the hardware driver to get the correct
40 *   frequency of the CPU. Don't use the macros, which are set to init the CPU
41 *   frequency in the ROM code.
42 */
43 uint incaip_get_cpuclk (void)
44 {
45         /*-------------------------------------------------------------------------*/
46         /* CPU Clock Input Multiplexer (MUX I)                                     */
47         /* Multiplexer MUX I selects the maximum input clock to the CPU.           */
48         /*-------------------------------------------------------------------------*/
49         if (*((volatile ulong *) INCA_IP_CGU_CGU_MUXCR) &
50             INCA_IP_CGU_CGU_MUXCR_MUXI) {
51                 /* MUX I set to 150 MHz clock */
52                 return 150000000;
53         } else {
54                 /* MUX I set to 100/133 MHz clock */
55                 if (*((volatile ulong *) INCA_IP_CGU_CGU_DIVCR) & 0x40) {
56                         /* Division value is 1/3, maximum CPU operating */
57                         /* frequency is 133.3 MHz                       */
58                         return 133333333;
59                 } else {
60                         /* Division value is 1/4, maximum CPU operating */
61                         /* frequency is 100 MHz                         */
62                         return 100000000;
63                 }
64         }
65 }
66
67 /*******************************************************************************
68 *
69 * get_fpiclk - returns the frequency of the FPI bus.
70 *
71 * Gets the value directly from the INCA-IP hardware.
72 *
73 * RETURNS: Frquency in Hz
74 *
75 * NOTE:
76 *   This functions should be used by the hardware driver to get the correct
77 *   frequency of the CPU. Don't use the macros, which are set to init the CPU
78 *   frequency in the ROM code.
79 *   The calculation for the
80 */
81 uint incaip_get_fpiclk (void)
82 {
83         uint clkCPU;
84
85         clkCPU = incaip_get_cpuclk ();
86
87         switch (*((volatile ulong *) INCA_IP_CGU_CGU_DIVCR) & 0xC) {
88         case 0x4:
89                 return clkCPU >> 1;     /* devided by 2 */
90                 break;
91         case 0x8:
92                 return clkCPU >> 2;     /* devided by 4 */
93                 break;
94         default:
95                 return clkCPU;
96                 break;
97         }
98 }
99
100 int incaip_set_cpuclk (void)
101 {
102         extern void ebu_init(long);
103         extern void cgu_init(long);
104         extern void sdram_init(long);
105         char tmp[64];
106         ulong cpuclk;
107
108         if (getenv_r ("cpuclk", tmp, sizeof (tmp)) > 0) {
109                 cpuclk = simple_strtoul (tmp, NULL, 10) * 1000000;
110                 cgu_init (cpuclk);
111                 ebu_init (cpuclk);
112                 sdram_init (cpuclk);
113         }
114
115         return 0;
116 }