1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (C) Copyright 2007 3*4882a593Smuzhiyun * Stelian Pop <stelian@popies.net> 4*4882a593Smuzhiyun * Lead Tech Design <www.leadtechdesign.com> 5*4882a593Smuzhiyun * Copyright (C) 2009 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun #ifndef __ASM_ARM_ARCH_CLK_H__ 10*4882a593Smuzhiyun #define __ASM_ARM_ARCH_CLK_H__ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <asm/arch/hardware.h> 13*4882a593Smuzhiyun #include <asm/arch/at91_pmc.h> 14*4882a593Smuzhiyun #include <asm/global_data.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define GCK_CSS_SLOW_CLK 0 17*4882a593Smuzhiyun #define GCK_CSS_MAIN_CLK 1 18*4882a593Smuzhiyun #define GCK_CSS_PLLA_CLK 2 19*4882a593Smuzhiyun #define GCK_CSS_UPLL_CLK 3 20*4882a593Smuzhiyun #define GCK_CSS_MCK_CLK 4 21*4882a593Smuzhiyun #define GCK_CSS_AUDIO_CLK 5 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define AT91_UTMI_PLL_CLK_FREQ 480000000 24*4882a593Smuzhiyun get_cpu_clk_rate(void)25*4882a593Smuzhiyunstatic inline unsigned long get_cpu_clk_rate(void) 26*4882a593Smuzhiyun { 27*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR; 28*4882a593Smuzhiyun return gd->arch.cpu_clk_rate_hz; 29*4882a593Smuzhiyun } 30*4882a593Smuzhiyun get_main_clk_rate(void)31*4882a593Smuzhiyunstatic inline unsigned long get_main_clk_rate(void) 32*4882a593Smuzhiyun { 33*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR; 34*4882a593Smuzhiyun return gd->arch.main_clk_rate_hz; 35*4882a593Smuzhiyun } 36*4882a593Smuzhiyun get_mck_clk_rate(void)37*4882a593Smuzhiyunstatic inline unsigned long get_mck_clk_rate(void) 38*4882a593Smuzhiyun { 39*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR; 40*4882a593Smuzhiyun return gd->arch.mck_rate_hz; 41*4882a593Smuzhiyun } 42*4882a593Smuzhiyun get_plla_clk_rate(void)43*4882a593Smuzhiyunstatic inline unsigned long get_plla_clk_rate(void) 44*4882a593Smuzhiyun { 45*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR; 46*4882a593Smuzhiyun return gd->arch.plla_rate_hz; 47*4882a593Smuzhiyun } 48*4882a593Smuzhiyun get_pllb_clk_rate(void)49*4882a593Smuzhiyunstatic inline unsigned long get_pllb_clk_rate(void) 50*4882a593Smuzhiyun { 51*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR; 52*4882a593Smuzhiyun return gd->arch.pllb_rate_hz; 53*4882a593Smuzhiyun } 54*4882a593Smuzhiyun get_pllb_init(void)55*4882a593Smuzhiyunstatic inline u32 get_pllb_init(void) 56*4882a593Smuzhiyun { 57*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR; 58*4882a593Smuzhiyun return gd->arch.at91_pllb_usb_init; 59*4882a593Smuzhiyun } 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun #ifdef CPU_HAS_H32MXDIV get_h32mxdiv(void)62*4882a593Smuzhiyunstatic inline unsigned int get_h32mxdiv(void) 63*4882a593Smuzhiyun { 64*4882a593Smuzhiyun struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun return readl(&pmc->mckr) & AT91_PMC_MCKR_H32MXDIV; 67*4882a593Smuzhiyun } 68*4882a593Smuzhiyun #else get_h32mxdiv(void)69*4882a593Smuzhiyunstatic inline unsigned int get_h32mxdiv(void) 70*4882a593Smuzhiyun { 71*4882a593Smuzhiyun return 0; 72*4882a593Smuzhiyun } 73*4882a593Smuzhiyun #endif 74*4882a593Smuzhiyun get_macb_pclk_rate(unsigned int dev_id)75*4882a593Smuzhiyunstatic inline unsigned long get_macb_pclk_rate(unsigned int dev_id) 76*4882a593Smuzhiyun { 77*4882a593Smuzhiyun if (get_h32mxdiv()) 78*4882a593Smuzhiyun return get_mck_clk_rate() / 2; 79*4882a593Smuzhiyun else 80*4882a593Smuzhiyun return get_mck_clk_rate(); 81*4882a593Smuzhiyun } 82*4882a593Smuzhiyun get_usart_clk_rate(unsigned int dev_id)83*4882a593Smuzhiyunstatic inline unsigned long get_usart_clk_rate(unsigned int dev_id) 84*4882a593Smuzhiyun { 85*4882a593Smuzhiyun if (get_h32mxdiv()) 86*4882a593Smuzhiyun return get_mck_clk_rate() / 2; 87*4882a593Smuzhiyun else 88*4882a593Smuzhiyun return get_mck_clk_rate(); 89*4882a593Smuzhiyun } 90*4882a593Smuzhiyun get_lcdc_clk_rate(unsigned int dev_id)91*4882a593Smuzhiyunstatic inline unsigned long get_lcdc_clk_rate(unsigned int dev_id) 92*4882a593Smuzhiyun { 93*4882a593Smuzhiyun return get_mck_clk_rate(); 94*4882a593Smuzhiyun } 95*4882a593Smuzhiyun get_spi_clk_rate(unsigned int dev_id)96*4882a593Smuzhiyunstatic inline unsigned long get_spi_clk_rate(unsigned int dev_id) 97*4882a593Smuzhiyun { 98*4882a593Smuzhiyun if (get_h32mxdiv()) 99*4882a593Smuzhiyun return get_mck_clk_rate() / 2; 100*4882a593Smuzhiyun else 101*4882a593Smuzhiyun return get_mck_clk_rate(); 102*4882a593Smuzhiyun } 103*4882a593Smuzhiyun get_twi_clk_rate(unsigned int dev_id)104*4882a593Smuzhiyunstatic inline unsigned long get_twi_clk_rate(unsigned int dev_id) 105*4882a593Smuzhiyun { 106*4882a593Smuzhiyun if (get_h32mxdiv()) 107*4882a593Smuzhiyun return get_mck_clk_rate() / 2; 108*4882a593Smuzhiyun else 109*4882a593Smuzhiyun return get_mck_clk_rate(); 110*4882a593Smuzhiyun } 111*4882a593Smuzhiyun get_mci_clk_rate(void)112*4882a593Smuzhiyunstatic inline unsigned long get_mci_clk_rate(void) 113*4882a593Smuzhiyun { 114*4882a593Smuzhiyun if (get_h32mxdiv()) 115*4882a593Smuzhiyun return get_mck_clk_rate() / 2; 116*4882a593Smuzhiyun else 117*4882a593Smuzhiyun return get_mck_clk_rate(); 118*4882a593Smuzhiyun } 119*4882a593Smuzhiyun get_pit_clk_rate(void)120*4882a593Smuzhiyunstatic inline unsigned long get_pit_clk_rate(void) 121*4882a593Smuzhiyun { 122*4882a593Smuzhiyun if (get_h32mxdiv()) 123*4882a593Smuzhiyun return get_mck_clk_rate() / 2; 124*4882a593Smuzhiyun else 125*4882a593Smuzhiyun return get_mck_clk_rate(); 126*4882a593Smuzhiyun } 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun int at91_clock_init(unsigned long main_clock); 129*4882a593Smuzhiyun void at91_periph_clk_enable(int id); 130*4882a593Smuzhiyun void at91_periph_clk_disable(int id); 131*4882a593Smuzhiyun int at91_enable_periph_generated_clk(u32 id, u32 clk_source, u32 div); 132*4882a593Smuzhiyun u32 at91_get_periph_generated_clk(u32 id); 133*4882a593Smuzhiyun void at91_system_clk_enable(int sys_clk); 134*4882a593Smuzhiyun void at91_system_clk_disable(int sys_clk); 135*4882a593Smuzhiyun int at91_upll_clk_enable(void); 136*4882a593Smuzhiyun int at91_upll_clk_disable(void); 137*4882a593Smuzhiyun void at91_usb_clk_init(u32 value); 138*4882a593Smuzhiyun int at91_pllb_clk_enable(u32 pllbr); 139*4882a593Smuzhiyun int at91_pllb_clk_disable(void); 140*4882a593Smuzhiyun void at91_pllicpr_init(u32 icpr); 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun #endif /* __ASM_ARM_ARCH_CLK_H__ */ 143