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*/ 43uint 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*/ 81uint 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 100int 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_f("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} 117