xref: /OK3568_Linux_fs/kernel/drivers/clk/ti/clk-43xx.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * AM43XX Clock init
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2013 Texas Instruments, Inc
5*4882a593Smuzhiyun  *     Tero Kristo (t-kristo@ti.com)
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or
8*4882a593Smuzhiyun  * modify it under the terms of the GNU General Public License as
9*4882a593Smuzhiyun  * published by the Free Software Foundation version 2.
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * This program is distributed "as is" WITHOUT ANY WARRANTY of any
12*4882a593Smuzhiyun  * kind, whether express or implied; without even the implied warranty
13*4882a593Smuzhiyun  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14*4882a593Smuzhiyun  * GNU General Public License for more details.
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <linux/kernel.h>
18*4882a593Smuzhiyun #include <linux/list.h>
19*4882a593Smuzhiyun #include <linux/clk.h>
20*4882a593Smuzhiyun #include <linux/clk-provider.h>
21*4882a593Smuzhiyun #include <linux/clk/ti.h>
22*4882a593Smuzhiyun #include <dt-bindings/clock/am4.h>
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #include "clock.h"
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun static const struct omap_clkctrl_reg_data am4_l3s_tsc_clkctrl_regs[] __initconst = {
27*4882a593Smuzhiyun 	{ AM4_L3S_TSC_ADC_TSC_CLKCTRL, NULL, CLKF_SW_SUP, "adc_tsc_fck" },
28*4882a593Smuzhiyun 	{ 0 },
29*4882a593Smuzhiyun };
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun static const char * const am4_synctimer_32kclk_parents[] __initconst = {
32*4882a593Smuzhiyun 	"mux_synctimer32k_ck",
33*4882a593Smuzhiyun 	NULL,
34*4882a593Smuzhiyun };
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun static const struct omap_clkctrl_bit_data am4_counter_32k_bit_data[] __initconst = {
37*4882a593Smuzhiyun 	{ 8, TI_CLK_GATE, am4_synctimer_32kclk_parents, NULL },
38*4882a593Smuzhiyun 	{ 0 },
39*4882a593Smuzhiyun };
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun static const struct omap_clkctrl_reg_data am4_l4_wkup_aon_clkctrl_regs[] __initconst = {
42*4882a593Smuzhiyun 	{ AM4_L4_WKUP_AON_WKUP_M3_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "sys_clkin_ck" },
43*4882a593Smuzhiyun 	{ AM4_L4_WKUP_AON_COUNTER_32K_CLKCTRL, am4_counter_32k_bit_data, CLKF_SW_SUP, "l4-wkup-aon-clkctrl:0008:8" },
44*4882a593Smuzhiyun 	{ 0 },
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun static const char * const am4_gpio0_dbclk_parents[] __initconst = {
48*4882a593Smuzhiyun 	"gpio0_dbclk_mux_ck",
49*4882a593Smuzhiyun 	NULL,
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun static const struct omap_clkctrl_bit_data am4_gpio1_bit_data[] __initconst = {
53*4882a593Smuzhiyun 	{ 8, TI_CLK_GATE, am4_gpio0_dbclk_parents, NULL },
54*4882a593Smuzhiyun 	{ 0 },
55*4882a593Smuzhiyun };
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun static const struct omap_clkctrl_reg_data am4_l4_wkup_clkctrl_regs[] __initconst = {
58*4882a593Smuzhiyun 	{ AM4_L4_WKUP_L4_WKUP_CLKCTRL, NULL, CLKF_SW_SUP, "sys_clkin_ck" },
59*4882a593Smuzhiyun 	{ AM4_L4_WKUP_TIMER1_CLKCTRL, NULL, CLKF_SW_SUP, "timer1_fck" },
60*4882a593Smuzhiyun 	{ AM4_L4_WKUP_WD_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "wdt1_fck" },
61*4882a593Smuzhiyun 	{ AM4_L4_WKUP_I2C1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_wkupdm_ck" },
62*4882a593Smuzhiyun 	{ AM4_L4_WKUP_UART1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_wkupdm_ck" },
63*4882a593Smuzhiyun 	{ AM4_L4_WKUP_SMARTREFLEX0_CLKCTRL, NULL, CLKF_SW_SUP, "smartreflex0_fck" },
64*4882a593Smuzhiyun 	{ AM4_L4_WKUP_SMARTREFLEX1_CLKCTRL, NULL, CLKF_SW_SUP, "smartreflex1_fck" },
65*4882a593Smuzhiyun 	{ AM4_L4_WKUP_CONTROL_CLKCTRL, NULL, CLKF_SW_SUP, "sys_clkin_ck" },
66*4882a593Smuzhiyun 	{ AM4_L4_WKUP_GPIO1_CLKCTRL, am4_gpio1_bit_data, CLKF_SW_SUP, "sys_clkin_ck" },
67*4882a593Smuzhiyun 	{ 0 },
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun static const struct omap_clkctrl_reg_data am4_mpu_clkctrl_regs[] __initconst = {
71*4882a593Smuzhiyun 	{ AM4_MPU_MPU_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_mpu_m2_ck" },
72*4882a593Smuzhiyun 	{ 0 },
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun static const struct omap_clkctrl_reg_data am4_gfx_l3_clkctrl_regs[] __initconst = {
76*4882a593Smuzhiyun 	{ AM4_GFX_L3_GFX_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "gfx_fck_div_ck" },
77*4882a593Smuzhiyun 	{ 0 },
78*4882a593Smuzhiyun };
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun static const struct omap_clkctrl_reg_data am4_l4_rtc_clkctrl_regs[] __initconst = {
81*4882a593Smuzhiyun 	{ AM4_L4_RTC_RTC_CLKCTRL, NULL, CLKF_SW_SUP, "clkdiv32k_ick" },
82*4882a593Smuzhiyun 	{ 0 },
83*4882a593Smuzhiyun };
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun static const struct omap_clkctrl_reg_data am4_l3_clkctrl_regs[] __initconst = {
86*4882a593Smuzhiyun 	{ AM4_L3_L3_MAIN_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
87*4882a593Smuzhiyun 	{ AM4_L3_AES_CLKCTRL, NULL, CLKF_SW_SUP, "aes0_fck" },
88*4882a593Smuzhiyun 	{ AM4_L3_DES_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
89*4882a593Smuzhiyun 	{ AM4_L3_L3_INSTR_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
90*4882a593Smuzhiyun 	{ AM4_L3_OCMCRAM_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
91*4882a593Smuzhiyun 	{ AM4_L3_SHAM_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
92*4882a593Smuzhiyun 	{ AM4_L3_TPCC_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
93*4882a593Smuzhiyun 	{ AM4_L3_TPTC0_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
94*4882a593Smuzhiyun 	{ AM4_L3_TPTC1_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
95*4882a593Smuzhiyun 	{ AM4_L3_TPTC2_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
96*4882a593Smuzhiyun 	{ AM4_L3_L4_HS_CLKCTRL, NULL, CLKF_SW_SUP, "l4hs_gclk" },
97*4882a593Smuzhiyun 	{ 0 },
98*4882a593Smuzhiyun };
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun static const char * const am4_usb_otg_ss0_refclk960m_parents[] __initconst = {
101*4882a593Smuzhiyun 	"dpll_per_clkdcoldo",
102*4882a593Smuzhiyun 	NULL,
103*4882a593Smuzhiyun };
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun static const struct omap_clkctrl_bit_data am4_usb_otg_ss0_bit_data[] __initconst = {
106*4882a593Smuzhiyun 	{ 8, TI_CLK_GATE, am4_usb_otg_ss0_refclk960m_parents, NULL },
107*4882a593Smuzhiyun 	{ 0 },
108*4882a593Smuzhiyun };
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun static const struct omap_clkctrl_bit_data am4_usb_otg_ss1_bit_data[] __initconst = {
111*4882a593Smuzhiyun 	{ 8, TI_CLK_GATE, am4_usb_otg_ss0_refclk960m_parents, NULL },
112*4882a593Smuzhiyun 	{ 0 },
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun static const struct omap_clkctrl_reg_data am4_l3s_clkctrl_regs[] __initconst = {
116*4882a593Smuzhiyun 	{ AM4_L3S_VPFE0_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
117*4882a593Smuzhiyun 	{ AM4_L3S_VPFE1_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
118*4882a593Smuzhiyun 	{ AM4_L3S_GPMC_CLKCTRL, NULL, CLKF_SW_SUP, "l3s_gclk" },
119*4882a593Smuzhiyun 	{ AM4_L3S_MCASP0_CLKCTRL, NULL, CLKF_SW_SUP, "mcasp0_fck" },
120*4882a593Smuzhiyun 	{ AM4_L3S_MCASP1_CLKCTRL, NULL, CLKF_SW_SUP, "mcasp1_fck" },
121*4882a593Smuzhiyun 	{ AM4_L3S_MMC3_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
122*4882a593Smuzhiyun 	{ AM4_L3S_QSPI_CLKCTRL, NULL, CLKF_SW_SUP, "l3s_gclk" },
123*4882a593Smuzhiyun 	{ AM4_L3S_USB_OTG_SS0_CLKCTRL, am4_usb_otg_ss0_bit_data, CLKF_SW_SUP, "l3s_gclk" },
124*4882a593Smuzhiyun 	{ AM4_L3S_USB_OTG_SS1_CLKCTRL, am4_usb_otg_ss1_bit_data, CLKF_SW_SUP, "l3s_gclk" },
125*4882a593Smuzhiyun 	{ 0 },
126*4882a593Smuzhiyun };
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun static const struct omap_clkctrl_reg_data am4_pruss_ocp_clkctrl_regs[] __initconst = {
129*4882a593Smuzhiyun 	{ AM4_PRUSS_OCP_PRUSS_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "pruss_ocp_gclk" },
130*4882a593Smuzhiyun 	{ 0 },
131*4882a593Smuzhiyun };
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun static const char * const am4_gpio1_dbclk_parents[] __initconst = {
134*4882a593Smuzhiyun 	"clkdiv32k_ick",
135*4882a593Smuzhiyun 	NULL,
136*4882a593Smuzhiyun };
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun static const struct omap_clkctrl_bit_data am4_gpio2_bit_data[] __initconst = {
139*4882a593Smuzhiyun 	{ 8, TI_CLK_GATE, am4_gpio1_dbclk_parents, NULL },
140*4882a593Smuzhiyun 	{ 0 },
141*4882a593Smuzhiyun };
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun static const struct omap_clkctrl_bit_data am4_gpio3_bit_data[] __initconst = {
144*4882a593Smuzhiyun 	{ 8, TI_CLK_GATE, am4_gpio1_dbclk_parents, NULL },
145*4882a593Smuzhiyun 	{ 0 },
146*4882a593Smuzhiyun };
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun static const struct omap_clkctrl_bit_data am4_gpio4_bit_data[] __initconst = {
149*4882a593Smuzhiyun 	{ 8, TI_CLK_GATE, am4_gpio1_dbclk_parents, NULL },
150*4882a593Smuzhiyun 	{ 0 },
151*4882a593Smuzhiyun };
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun static const struct omap_clkctrl_bit_data am4_gpio5_bit_data[] __initconst = {
154*4882a593Smuzhiyun 	{ 8, TI_CLK_GATE, am4_gpio1_dbclk_parents, NULL },
155*4882a593Smuzhiyun 	{ 0 },
156*4882a593Smuzhiyun };
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun static const struct omap_clkctrl_bit_data am4_gpio6_bit_data[] __initconst = {
159*4882a593Smuzhiyun 	{ 8, TI_CLK_GATE, am4_gpio1_dbclk_parents, NULL },
160*4882a593Smuzhiyun 	{ 0 },
161*4882a593Smuzhiyun };
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun static const struct omap_clkctrl_reg_data am4_l4ls_clkctrl_regs[] __initconst = {
164*4882a593Smuzhiyun 	{ AM4_L4LS_L4_LS_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
165*4882a593Smuzhiyun 	{ AM4_L4LS_D_CAN0_CLKCTRL, NULL, CLKF_SW_SUP, "dcan0_fck" },
166*4882a593Smuzhiyun 	{ AM4_L4LS_D_CAN1_CLKCTRL, NULL, CLKF_SW_SUP, "dcan1_fck" },
167*4882a593Smuzhiyun 	{ AM4_L4LS_EPWMSS0_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
168*4882a593Smuzhiyun 	{ AM4_L4LS_EPWMSS1_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
169*4882a593Smuzhiyun 	{ AM4_L4LS_EPWMSS2_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
170*4882a593Smuzhiyun 	{ AM4_L4LS_EPWMSS3_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
171*4882a593Smuzhiyun 	{ AM4_L4LS_EPWMSS4_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
172*4882a593Smuzhiyun 	{ AM4_L4LS_EPWMSS5_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
173*4882a593Smuzhiyun 	{ AM4_L4LS_ELM_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
174*4882a593Smuzhiyun 	{ AM4_L4LS_GPIO2_CLKCTRL, am4_gpio2_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
175*4882a593Smuzhiyun 	{ AM4_L4LS_GPIO3_CLKCTRL, am4_gpio3_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
176*4882a593Smuzhiyun 	{ AM4_L4LS_GPIO4_CLKCTRL, am4_gpio4_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
177*4882a593Smuzhiyun 	{ AM4_L4LS_GPIO5_CLKCTRL, am4_gpio5_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
178*4882a593Smuzhiyun 	{ AM4_L4LS_GPIO6_CLKCTRL, am4_gpio6_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
179*4882a593Smuzhiyun 	{ AM4_L4LS_HDQ1W_CLKCTRL, NULL, CLKF_SW_SUP, "func_12m_clk" },
180*4882a593Smuzhiyun 	{ AM4_L4LS_I2C2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
181*4882a593Smuzhiyun 	{ AM4_L4LS_I2C3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
182*4882a593Smuzhiyun 	{ AM4_L4LS_MAILBOX_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
183*4882a593Smuzhiyun 	{ AM4_L4LS_MMC1_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
184*4882a593Smuzhiyun 	{ AM4_L4LS_MMC2_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
185*4882a593Smuzhiyun 	{ AM4_L4LS_RNG_CLKCTRL, NULL, CLKF_SW_SUP, "rng_fck" },
186*4882a593Smuzhiyun 	{ AM4_L4LS_SPI0_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
187*4882a593Smuzhiyun 	{ AM4_L4LS_SPI1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
188*4882a593Smuzhiyun 	{ AM4_L4LS_SPI2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
189*4882a593Smuzhiyun 	{ AM4_L4LS_SPI3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
190*4882a593Smuzhiyun 	{ AM4_L4LS_SPI4_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
191*4882a593Smuzhiyun 	{ AM4_L4LS_SPINLOCK_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
192*4882a593Smuzhiyun 	{ AM4_L4LS_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "timer2_fck" },
193*4882a593Smuzhiyun 	{ AM4_L4LS_TIMER3_CLKCTRL, NULL, CLKF_SW_SUP, "timer3_fck" },
194*4882a593Smuzhiyun 	{ AM4_L4LS_TIMER4_CLKCTRL, NULL, CLKF_SW_SUP, "timer4_fck" },
195*4882a593Smuzhiyun 	{ AM4_L4LS_TIMER5_CLKCTRL, NULL, CLKF_SW_SUP, "timer5_fck" },
196*4882a593Smuzhiyun 	{ AM4_L4LS_TIMER6_CLKCTRL, NULL, CLKF_SW_SUP, "timer6_fck" },
197*4882a593Smuzhiyun 	{ AM4_L4LS_TIMER7_CLKCTRL, NULL, CLKF_SW_SUP, "timer7_fck" },
198*4882a593Smuzhiyun 	{ AM4_L4LS_TIMER8_CLKCTRL, NULL, CLKF_SW_SUP, "timer8_fck" },
199*4882a593Smuzhiyun 	{ AM4_L4LS_TIMER9_CLKCTRL, NULL, CLKF_SW_SUP, "timer9_fck" },
200*4882a593Smuzhiyun 	{ AM4_L4LS_TIMER10_CLKCTRL, NULL, CLKF_SW_SUP, "timer10_fck" },
201*4882a593Smuzhiyun 	{ AM4_L4LS_TIMER11_CLKCTRL, NULL, CLKF_SW_SUP, "timer11_fck" },
202*4882a593Smuzhiyun 	{ AM4_L4LS_UART2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
203*4882a593Smuzhiyun 	{ AM4_L4LS_UART3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
204*4882a593Smuzhiyun 	{ AM4_L4LS_UART4_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
205*4882a593Smuzhiyun 	{ AM4_L4LS_UART5_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
206*4882a593Smuzhiyun 	{ AM4_L4LS_UART6_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
207*4882a593Smuzhiyun 	{ AM4_L4LS_OCP2SCP0_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
208*4882a593Smuzhiyun 	{ AM4_L4LS_OCP2SCP1_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
209*4882a593Smuzhiyun 	{ 0 },
210*4882a593Smuzhiyun };
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun static const struct omap_clkctrl_reg_data am4_emif_clkctrl_regs[] __initconst = {
213*4882a593Smuzhiyun 	{ AM4_EMIF_EMIF_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_ddr_m2_ck" },
214*4882a593Smuzhiyun 	{ 0 },
215*4882a593Smuzhiyun };
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun static const struct omap_clkctrl_reg_data am4_dss_clkctrl_regs[] __initconst = {
218*4882a593Smuzhiyun 	{ AM4_DSS_DSS_CORE_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_SET_RATE_PARENT, "disp_clk" },
219*4882a593Smuzhiyun 	{ 0 },
220*4882a593Smuzhiyun };
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun static const struct omap_clkctrl_reg_data am4_cpsw_125mhz_clkctrl_regs[] __initconst = {
223*4882a593Smuzhiyun 	{ AM4_CPSW_125MHZ_CPGMAC0_CLKCTRL, NULL, CLKF_SW_SUP, "cpsw_125mhz_gclk" },
224*4882a593Smuzhiyun 	{ 0 },
225*4882a593Smuzhiyun };
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun const struct omap_clkctrl_data am4_clkctrl_data[] __initconst = {
228*4882a593Smuzhiyun 	{ 0x44df2920, am4_l3s_tsc_clkctrl_regs },
229*4882a593Smuzhiyun 	{ 0x44df2a28, am4_l4_wkup_aon_clkctrl_regs },
230*4882a593Smuzhiyun 	{ 0x44df2a20, am4_l4_wkup_clkctrl_regs },
231*4882a593Smuzhiyun 	{ 0x44df8320, am4_mpu_clkctrl_regs },
232*4882a593Smuzhiyun 	{ 0x44df8420, am4_gfx_l3_clkctrl_regs },
233*4882a593Smuzhiyun 	{ 0x44df8520, am4_l4_rtc_clkctrl_regs },
234*4882a593Smuzhiyun 	{ 0x44df8820, am4_l3_clkctrl_regs },
235*4882a593Smuzhiyun 	{ 0x44df8868, am4_l3s_clkctrl_regs },
236*4882a593Smuzhiyun 	{ 0x44df8b20, am4_pruss_ocp_clkctrl_regs },
237*4882a593Smuzhiyun 	{ 0x44df8c20, am4_l4ls_clkctrl_regs },
238*4882a593Smuzhiyun 	{ 0x44df8f20, am4_emif_clkctrl_regs },
239*4882a593Smuzhiyun 	{ 0x44df9220, am4_dss_clkctrl_regs },
240*4882a593Smuzhiyun 	{ 0x44df9320, am4_cpsw_125mhz_clkctrl_regs },
241*4882a593Smuzhiyun 	{ 0 },
242*4882a593Smuzhiyun };
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun const struct omap_clkctrl_data am438x_clkctrl_data[] __initconst = {
245*4882a593Smuzhiyun 	{ 0x44df2920, am4_l3s_tsc_clkctrl_regs },
246*4882a593Smuzhiyun 	{ 0x44df2a28, am4_l4_wkup_aon_clkctrl_regs },
247*4882a593Smuzhiyun 	{ 0x44df2a20, am4_l4_wkup_clkctrl_regs },
248*4882a593Smuzhiyun 	{ 0x44df8320, am4_mpu_clkctrl_regs },
249*4882a593Smuzhiyun 	{ 0x44df8420, am4_gfx_l3_clkctrl_regs },
250*4882a593Smuzhiyun 	{ 0x44df8820, am4_l3_clkctrl_regs },
251*4882a593Smuzhiyun 	{ 0x44df8868, am4_l3s_clkctrl_regs },
252*4882a593Smuzhiyun 	{ 0x44df8b20, am4_pruss_ocp_clkctrl_regs },
253*4882a593Smuzhiyun 	{ 0x44df8c20, am4_l4ls_clkctrl_regs },
254*4882a593Smuzhiyun 	{ 0x44df8f20, am4_emif_clkctrl_regs },
255*4882a593Smuzhiyun 	{ 0x44df9220, am4_dss_clkctrl_regs },
256*4882a593Smuzhiyun 	{ 0x44df9320, am4_cpsw_125mhz_clkctrl_regs },
257*4882a593Smuzhiyun 	{ 0 },
258*4882a593Smuzhiyun };
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun static struct ti_dt_clk am43xx_clks[] = {
261*4882a593Smuzhiyun 	DT_CLK(NULL, "timer_32k_ck", "clkdiv32k_ick"),
262*4882a593Smuzhiyun 	DT_CLK(NULL, "timer_sys_ck", "sys_clkin_ck"),
263*4882a593Smuzhiyun 	DT_CLK(NULL, "gpio0_dbclk", "l4-wkup-clkctrl:0148:8"),
264*4882a593Smuzhiyun 	DT_CLK(NULL, "gpio1_dbclk", "l4ls-clkctrl:0058:8"),
265*4882a593Smuzhiyun 	DT_CLK(NULL, "gpio2_dbclk", "l4ls-clkctrl:0060:8"),
266*4882a593Smuzhiyun 	DT_CLK(NULL, "gpio3_dbclk", "l4ls-clkctrl:0068:8"),
267*4882a593Smuzhiyun 	DT_CLK(NULL, "gpio4_dbclk", "l4ls-clkctrl:0070:8"),
268*4882a593Smuzhiyun 	DT_CLK(NULL, "gpio5_dbclk", "l4ls-clkctrl:0078:8"),
269*4882a593Smuzhiyun 	DT_CLK(NULL, "synctimer_32kclk", "l4-wkup-aon-clkctrl:0008:8"),
270*4882a593Smuzhiyun 	DT_CLK(NULL, "usb_otg_ss0_refclk960m", "l3s-clkctrl:01f8:8"),
271*4882a593Smuzhiyun 	DT_CLK(NULL, "usb_otg_ss1_refclk960m", "l3s-clkctrl:0200:8"),
272*4882a593Smuzhiyun 	{ .node_name = NULL },
273*4882a593Smuzhiyun };
274*4882a593Smuzhiyun 
am43xx_dt_clk_init(void)275*4882a593Smuzhiyun int __init am43xx_dt_clk_init(void)
276*4882a593Smuzhiyun {
277*4882a593Smuzhiyun 	struct clk *clk1, *clk2;
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 	if (ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT)
280*4882a593Smuzhiyun 		ti_dt_clocks_register(am43xx_compat_clks);
281*4882a593Smuzhiyun 	else
282*4882a593Smuzhiyun 		ti_dt_clocks_register(am43xx_clks);
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 	omap2_clk_disable_autoidle_all();
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	ti_clk_add_aliases();
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	/*
289*4882a593Smuzhiyun 	 * cpsw_cpts_rft_clk  has got the choice of 3 clocksources
290*4882a593Smuzhiyun 	 * dpll_core_m4_ck, dpll_core_m5_ck and dpll_disp_m2_ck.
291*4882a593Smuzhiyun 	 * By default dpll_core_m4_ck is selected, witn this as clock
292*4882a593Smuzhiyun 	 * source the CPTS doesnot work properly. It gives clockcheck errors
293*4882a593Smuzhiyun 	 * while running PTP.
294*4882a593Smuzhiyun 	 * clockcheck: clock jumped backward or running slower than expected!
295*4882a593Smuzhiyun 	 * By selecting dpll_core_m5_ck as the clocksource fixes this issue.
296*4882a593Smuzhiyun 	 * In AM335x dpll_core_m5_ck is the default clocksource.
297*4882a593Smuzhiyun 	 */
298*4882a593Smuzhiyun 	clk1 = clk_get_sys(NULL, "cpsw_cpts_rft_clk");
299*4882a593Smuzhiyun 	clk2 = clk_get_sys(NULL, "dpll_core_m5_ck");
300*4882a593Smuzhiyun 	clk_set_parent(clk1, clk2);
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 	return 0;
303*4882a593Smuzhiyun }
304