1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * 4 * (c) 2004 Sascha Hauer <sascha@saschahauer.de> 5 */ 6 7 8 #include <common.h> 9 #if defined (CONFIG_IMX) 10 11 #include <asm/arch/imx-regs.h> 12 13 /* ------------------------------------------------------------------------- */ 14 /* NOTE: This describes the proper use of this file. 15 * 16 * CONFIG_SYS_CLK_FREQ should be defined as the input frequency of the PLL. 17 * SH FIXME: 16780000 in our case 18 * get_FCLK(), get_HCLK(), get_PCLK() and get_UCLK() return the clock of 19 * the specified bus in HZ. 20 */ 21 /* ------------------------------------------------------------------------- */ 22 get_systemPLLCLK(void)23ulong get_systemPLLCLK(void) 24 { 25 /* FIXME: We assume System_SEL = 0 here */ 26 u32 spctl0 = SPCTL0; 27 u32 mfi = (spctl0 >> 10) & 0xf; 28 u32 mfn = spctl0 & 0x3f; 29 u32 mfd = (spctl0 >> 16) & 0x3f; 30 u32 pd = (spctl0 >> 26) & 0xf; 31 32 mfi = mfi<=5 ? 5 : mfi; 33 34 return (2*(CONFIG_SYSPLL_CLK_FREQ>>10)*( (mfi<<10) + (mfn<<10)/(mfd+1)))/(pd+1); 35 } 36 get_mcuPLLCLK(void)37ulong get_mcuPLLCLK(void) 38 { 39 /* FIXME: We assume System_SEL = 0 here */ 40 u32 mpctl0 = MPCTL0; 41 u32 mfi = (mpctl0 >> 10) & 0xf; 42 u32 mfn = mpctl0 & 0x3f; 43 u32 mfd = (mpctl0 >> 16) & 0x3f; 44 u32 pd = (mpctl0 >> 26) & 0xf; 45 46 mfi = mfi<=5 ? 5 : mfi; 47 48 return (2*(CONFIG_SYS_CLK_FREQ>>10)*( (mfi<<10) + (mfn<<10)/(mfd+1)))/(pd+1); 49 } 50 get_FCLK(void)51ulong get_FCLK(void) 52 { 53 return (( CSCR>>15)&1) ? get_mcuPLLCLK()>>1 : get_mcuPLLCLK(); 54 } 55 56 /* return HCLK frequency */ get_HCLK(void)57ulong get_HCLK(void) 58 { 59 u32 bclkdiv = (( CSCR >> 10 ) & 0xf) + 1; 60 printf("bclkdiv: %d\n", bclkdiv); 61 return get_systemPLLCLK() / bclkdiv; 62 } 63 64 /* return BCLK frequency */ get_BCLK(void)65ulong get_BCLK(void) 66 { 67 return get_HCLK(); 68 } 69 get_PERCLK1(void)70ulong get_PERCLK1(void) 71 { 72 return get_systemPLLCLK() / (((PCDR) & 0xf)+1); 73 } 74 get_PERCLK2(void)75ulong get_PERCLK2(void) 76 { 77 return get_systemPLLCLK() / (((PCDR>>4) & 0xf)+1); 78 } 79 get_PERCLK3(void)80ulong get_PERCLK3(void) 81 { 82 return get_systemPLLCLK() / (((PCDR>>16) & 0x7f)+1); 83 } 84 85 #endif /* defined (CONFIG_IMX) */ 86