184ad6884SPeter Tyser /* 284ad6884SPeter Tyser * 384ad6884SPeter Tyser * (c) 2004 Sascha Hauer <sascha@saschahauer.de> 484ad6884SPeter Tyser * 5*1a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 684ad6884SPeter Tyser */ 784ad6884SPeter Tyser 884ad6884SPeter Tyser 984ad6884SPeter Tyser #include <common.h> 1084ad6884SPeter Tyser #if defined (CONFIG_IMX) 1184ad6884SPeter Tyser 1284ad6884SPeter Tyser #include <asm/arch/imx-regs.h> 1384ad6884SPeter Tyser 1484ad6884SPeter Tyser /* ------------------------------------------------------------------------- */ 1584ad6884SPeter Tyser /* NOTE: This describes the proper use of this file. 1684ad6884SPeter Tyser * 1784ad6884SPeter Tyser * CONFIG_SYS_CLK_FREQ should be defined as the input frequency of the PLL. 1884ad6884SPeter Tyser * SH FIXME: 16780000 in our case 1984ad6884SPeter Tyser * get_FCLK(), get_HCLK(), get_PCLK() and get_UCLK() return the clock of 2084ad6884SPeter Tyser * the specified bus in HZ. 2184ad6884SPeter Tyser */ 2284ad6884SPeter Tyser /* ------------------------------------------------------------------------- */ 2384ad6884SPeter Tyser get_systemPLLCLK(void)2484ad6884SPeter Tyserulong get_systemPLLCLK(void) 2584ad6884SPeter Tyser { 2684ad6884SPeter Tyser /* FIXME: We assume System_SEL = 0 here */ 2784ad6884SPeter Tyser u32 spctl0 = SPCTL0; 2884ad6884SPeter Tyser u32 mfi = (spctl0 >> 10) & 0xf; 2984ad6884SPeter Tyser u32 mfn = spctl0 & 0x3f; 3084ad6884SPeter Tyser u32 mfd = (spctl0 >> 16) & 0x3f; 3184ad6884SPeter Tyser u32 pd = (spctl0 >> 26) & 0xf; 3284ad6884SPeter Tyser 3384ad6884SPeter Tyser mfi = mfi<=5 ? 5 : mfi; 3484ad6884SPeter Tyser 3584ad6884SPeter Tyser return (2*(CONFIG_SYSPLL_CLK_FREQ>>10)*( (mfi<<10) + (mfn<<10)/(mfd+1)))/(pd+1); 3684ad6884SPeter Tyser } 3784ad6884SPeter Tyser get_mcuPLLCLK(void)3884ad6884SPeter Tyserulong get_mcuPLLCLK(void) 3984ad6884SPeter Tyser { 4084ad6884SPeter Tyser /* FIXME: We assume System_SEL = 0 here */ 4184ad6884SPeter Tyser u32 mpctl0 = MPCTL0; 4284ad6884SPeter Tyser u32 mfi = (mpctl0 >> 10) & 0xf; 4384ad6884SPeter Tyser u32 mfn = mpctl0 & 0x3f; 4484ad6884SPeter Tyser u32 mfd = (mpctl0 >> 16) & 0x3f; 4584ad6884SPeter Tyser u32 pd = (mpctl0 >> 26) & 0xf; 4684ad6884SPeter Tyser 4784ad6884SPeter Tyser mfi = mfi<=5 ? 5 : mfi; 4884ad6884SPeter Tyser 4984ad6884SPeter Tyser return (2*(CONFIG_SYS_CLK_FREQ>>10)*( (mfi<<10) + (mfn<<10)/(mfd+1)))/(pd+1); 5084ad6884SPeter Tyser } 5184ad6884SPeter Tyser get_FCLK(void)5284ad6884SPeter Tyserulong get_FCLK(void) 5384ad6884SPeter Tyser { 5484ad6884SPeter Tyser return (( CSCR>>15)&1) ? get_mcuPLLCLK()>>1 : get_mcuPLLCLK(); 5584ad6884SPeter Tyser } 5684ad6884SPeter Tyser 5784ad6884SPeter Tyser /* return HCLK frequency */ get_HCLK(void)5884ad6884SPeter Tyserulong get_HCLK(void) 5984ad6884SPeter Tyser { 6084ad6884SPeter Tyser u32 bclkdiv = (( CSCR >> 10 ) & 0xf) + 1; 6184ad6884SPeter Tyser printf("bclkdiv: %d\n", bclkdiv); 6284ad6884SPeter Tyser return get_systemPLLCLK() / bclkdiv; 6384ad6884SPeter Tyser } 6484ad6884SPeter Tyser 6584ad6884SPeter Tyser /* return BCLK frequency */ get_BCLK(void)6684ad6884SPeter Tyserulong get_BCLK(void) 6784ad6884SPeter Tyser { 6884ad6884SPeter Tyser return get_HCLK(); 6984ad6884SPeter Tyser } 7084ad6884SPeter Tyser get_PERCLK1(void)7184ad6884SPeter Tyserulong get_PERCLK1(void) 7284ad6884SPeter Tyser { 7384ad6884SPeter Tyser return get_systemPLLCLK() / (((PCDR) & 0xf)+1); 7484ad6884SPeter Tyser } 7584ad6884SPeter Tyser get_PERCLK2(void)7684ad6884SPeter Tyserulong get_PERCLK2(void) 7784ad6884SPeter Tyser { 7884ad6884SPeter Tyser return get_systemPLLCLK() / (((PCDR>>4) & 0xf)+1); 7984ad6884SPeter Tyser } 8084ad6884SPeter Tyser get_PERCLK3(void)8184ad6884SPeter Tyserulong get_PERCLK3(void) 8284ad6884SPeter Tyser { 8384ad6884SPeter Tyser return get_systemPLLCLK() / (((PCDR>>16) & 0x7f)+1); 8484ad6884SPeter Tyser } 8584ad6884SPeter Tyser 8684ad6884SPeter Tyser #endif /* defined (CONFIG_IMX) */ 87