xref: /openbmc/u-boot/arch/arm/mach-at91/include/mach/clk.h (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
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 Yamada static 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 Yamada static 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 Yamada static 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 Yamada static 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 Yamada static 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 Yamada static 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 Yamada static 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 Yamada static 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 Yamada static 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 Yamada static 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 Yamada static 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 Yamada static 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 Yamada static 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 Yamada static 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 Yamada static 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