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