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