mirror of
				https://source.denx.de/u-boot/u-boot.git
				synced 2025-10-31 08:21:36 +01:00 
			
		
		
		
	In order to finish moving this symbol to Kconfig for all platforms, we need to do a few more things. First, for all platforms that define this to a function, introduce CONFIG_DYNAMIC_SYS_CLK_FREQ, similar to CONFIG_DYNAMIC_DDR_CLK_FREQ and populate clock_legacy.h. This entails also switching all users from CONFIG_SYS_CLK_FREQ to get_board_sys_clk() and updating a few preprocessor tests. With that done, all platforms that define a value here can be converted to Kconfig, and a fall-back of zero is sufficiently safe to use (and what is used today in cases where code may or may not have this available). Make sure that code which calls this function includes <clock_legacy.h> to get the prototype. Signed-off-by: Tom Rini <trini@konsulko.com>
		
			
				
	
	
		
			100 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0+
 | |
| /*
 | |
|  * Copyright (C) 2004 Texas Instruments.
 | |
|  * Copyright (C) 2009 David Brownell
 | |
|  */
 | |
| 
 | |
| #include <common.h>
 | |
| #include <clock_legacy.h>
 | |
| #include <init.h>
 | |
| #include <asm/arch/hardware.h>
 | |
| #include <asm/global_data.h>
 | |
| #include <asm/io.h>
 | |
| 
 | |
| DECLARE_GLOBAL_DATA_PTR;
 | |
| 
 | |
| /* offsets from PLL controller base */
 | |
| #define PLLC_PLLCTL	0x100
 | |
| #define PLLC_PLLM	0x110
 | |
| #define PLLC_PREDIV	0x114
 | |
| #define PLLC_PLLDIV1	0x118
 | |
| #define PLLC_PLLDIV2	0x11c
 | |
| #define PLLC_PLLDIV3	0x120
 | |
| #define PLLC_POSTDIV	0x128
 | |
| #define PLLC_BPDIV	0x12c
 | |
| #define PLLC_PLLDIV4	0x160
 | |
| #define PLLC_PLLDIV5	0x164
 | |
| #define PLLC_PLLDIV6	0x168
 | |
| #define PLLC_PLLDIV7	0x16c
 | |
| #define PLLC_PLLDIV8	0x170
 | |
| #define PLLC_PLLDIV9	0x174
 | |
| 
 | |
| unsigned int sysdiv[9] = {
 | |
| 	PLLC_PLLDIV1, PLLC_PLLDIV2, PLLC_PLLDIV3, PLLC_PLLDIV4, PLLC_PLLDIV5,
 | |
| 	PLLC_PLLDIV6, PLLC_PLLDIV7, PLLC_PLLDIV8, PLLC_PLLDIV9
 | |
| };
 | |
| 
 | |
| int clk_get(enum davinci_clk_ids id)
 | |
| {
 | |
| 	int pre_div;
 | |
| 	int pllm;
 | |
| 	int post_div;
 | |
| 	int pll_out;
 | |
| 	unsigned int pll_base;
 | |
| 
 | |
| 	pll_out = CONFIG_SYS_OSCIN_FREQ;
 | |
| 
 | |
| 	if (id == DAVINCI_AUXCLK_CLKID)
 | |
| 		goto out;
 | |
| 
 | |
| 	if ((id >> 16) == 1)
 | |
| 		pll_base = (unsigned int)davinci_pllc1_regs;
 | |
| 	else
 | |
| 		pll_base = (unsigned int)davinci_pllc0_regs;
 | |
| 
 | |
| 	id &= 0xFFFF;
 | |
| 
 | |
| 	/*
 | |
| 	 * Lets keep this simple. Combining operations can result in
 | |
| 	 * unexpected approximations
 | |
| 	 */
 | |
| 	pre_div = (readl(pll_base + PLLC_PREDIV) &
 | |
| 		DAVINCI_PLLC_DIV_MASK) + 1;
 | |
| 	pllm = readl(pll_base + PLLC_PLLM) + 1;
 | |
| 
 | |
| 	pll_out /= pre_div;
 | |
| 	pll_out *= pllm;
 | |
| 
 | |
| 	if (id == DAVINCI_PLLM_CLKID)
 | |
| 		goto out;
 | |
| 
 | |
| 	post_div = (readl(pll_base + PLLC_POSTDIV) &
 | |
| 		DAVINCI_PLLC_DIV_MASK) + 1;
 | |
| 
 | |
| 	pll_out /= post_div;
 | |
| 
 | |
| 	if (id == DAVINCI_PLLC_CLKID)
 | |
| 		goto out;
 | |
| 
 | |
| 	pll_out /= (readl(pll_base + sysdiv[id - 1]) &
 | |
| 		DAVINCI_PLLC_DIV_MASK) + 1;
 | |
| 
 | |
| out:
 | |
| 	return pll_out;
 | |
| }
 | |
| 
 | |
| int set_cpu_clk_info(void)
 | |
| {
 | |
| 	gd->bd->bi_arm_freq = clk_get(DAVINCI_ARM_CLKID) / 1000000;
 | |
| 	/* DDR PHY uses an x2 input clock */
 | |
| 	gd->bd->bi_ddr_freq = cpu_is_da830() ? 0 :
 | |
| 				(clk_get(DAVINCI_DDR_CLKID) / 1000000);
 | |
| 	gd->bd->bi_dsp_freq = 0;
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| unsigned long get_board_sys_clk(void)
 | |
| {
 | |
| 	return clk_get(DAVINCI_ARM_CLKID);
 | |
| }
 |