1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * omap_hwmod_33xx_data.c: Hardware modules present on the AM33XX chips
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (C) {2012} Texas Instruments Incorporated - https://www.ti.com/
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * This file is automatically generated from the AM33XX hardware databases.
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 "omap_hwmod.h"
18*4882a593Smuzhiyun #include "omap_hwmod_common_data.h"
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun #include "control.h"
21*4882a593Smuzhiyun #include "cm33xx.h"
22*4882a593Smuzhiyun #include "prm33xx.h"
23*4882a593Smuzhiyun #include "prm-regbits-33xx.h"
24*4882a593Smuzhiyun #include "omap_hwmod_33xx_43xx_common_data.h"
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun /*
27*4882a593Smuzhiyun * IP blocks
28*4882a593Smuzhiyun */
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun /* emif */
31*4882a593Smuzhiyun static struct omap_hwmod am33xx_emif_hwmod = {
32*4882a593Smuzhiyun .name = "emif",
33*4882a593Smuzhiyun .class = &am33xx_emif_hwmod_class,
34*4882a593Smuzhiyun .clkdm_name = "l3_clkdm",
35*4882a593Smuzhiyun .flags = HWMOD_INIT_NO_IDLE,
36*4882a593Smuzhiyun .main_clk = "dpll_ddr_m2_div2_ck",
37*4882a593Smuzhiyun .prcm = {
38*4882a593Smuzhiyun .omap4 = {
39*4882a593Smuzhiyun .clkctrl_offs = AM33XX_CM_PER_EMIF_CLKCTRL_OFFSET,
40*4882a593Smuzhiyun .modulemode = MODULEMODE_SWCTRL,
41*4882a593Smuzhiyun },
42*4882a593Smuzhiyun },
43*4882a593Smuzhiyun };
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun /* l4_hs */
46*4882a593Smuzhiyun static struct omap_hwmod am33xx_l4_hs_hwmod = {
47*4882a593Smuzhiyun .name = "l4_hs",
48*4882a593Smuzhiyun .class = &am33xx_l4_hwmod_class,
49*4882a593Smuzhiyun .clkdm_name = "l4hs_clkdm",
50*4882a593Smuzhiyun .flags = HWMOD_INIT_NO_IDLE,
51*4882a593Smuzhiyun .main_clk = "l4hs_gclk",
52*4882a593Smuzhiyun .prcm = {
53*4882a593Smuzhiyun .omap4 = {
54*4882a593Smuzhiyun .clkctrl_offs = AM33XX_CM_PER_L4HS_CLKCTRL_OFFSET,
55*4882a593Smuzhiyun .modulemode = MODULEMODE_SWCTRL,
56*4882a593Smuzhiyun },
57*4882a593Smuzhiyun },
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun static struct omap_hwmod_rst_info am33xx_wkup_m3_resets[] = {
61*4882a593Smuzhiyun { .name = "wkup_m3", .rst_shift = 3, .st_shift = 5 },
62*4882a593Smuzhiyun };
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun /* wkup_m3 */
65*4882a593Smuzhiyun static struct omap_hwmod am33xx_wkup_m3_hwmod = {
66*4882a593Smuzhiyun .name = "wkup_m3",
67*4882a593Smuzhiyun .class = &am33xx_wkup_m3_hwmod_class,
68*4882a593Smuzhiyun .clkdm_name = "l4_wkup_aon_clkdm",
69*4882a593Smuzhiyun /* Keep hardreset asserted */
70*4882a593Smuzhiyun .flags = HWMOD_INIT_NO_RESET | HWMOD_NO_IDLEST,
71*4882a593Smuzhiyun .main_clk = "dpll_core_m4_div2_ck",
72*4882a593Smuzhiyun .prcm = {
73*4882a593Smuzhiyun .omap4 = {
74*4882a593Smuzhiyun .clkctrl_offs = AM33XX_CM_WKUP_WKUP_M3_CLKCTRL_OFFSET,
75*4882a593Smuzhiyun .rstctrl_offs = AM33XX_RM_WKUP_RSTCTRL_OFFSET,
76*4882a593Smuzhiyun .rstst_offs = AM33XX_RM_WKUP_RSTST_OFFSET,
77*4882a593Smuzhiyun .modulemode = MODULEMODE_SWCTRL,
78*4882a593Smuzhiyun },
79*4882a593Smuzhiyun },
80*4882a593Smuzhiyun .rst_lines = am33xx_wkup_m3_resets,
81*4882a593Smuzhiyun .rst_lines_cnt = ARRAY_SIZE(am33xx_wkup_m3_resets),
82*4882a593Smuzhiyun };
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun /*
86*4882a593Smuzhiyun * Modules omap_hwmod structures
87*4882a593Smuzhiyun *
88*4882a593Smuzhiyun * The following IPs are excluded for the moment because:
89*4882a593Smuzhiyun * - They do not need an explicit SW control using omap_hwmod API.
90*4882a593Smuzhiyun * - They still need to be validated with the driver
91*4882a593Smuzhiyun * properly adapted to omap_hwmod / omap_device
92*4882a593Smuzhiyun *
93*4882a593Smuzhiyun * - cEFUSE (doesn't fall under any ocp_if)
94*4882a593Smuzhiyun * - clkdiv32k
95*4882a593Smuzhiyun * - ocp watch point
96*4882a593Smuzhiyun */
97*4882a593Smuzhiyun #if 0
98*4882a593Smuzhiyun /*
99*4882a593Smuzhiyun * 'cefuse' class
100*4882a593Smuzhiyun */
101*4882a593Smuzhiyun static struct omap_hwmod_class am33xx_cefuse_hwmod_class = {
102*4882a593Smuzhiyun .name = "cefuse",
103*4882a593Smuzhiyun };
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun static struct omap_hwmod am33xx_cefuse_hwmod = {
106*4882a593Smuzhiyun .name = "cefuse",
107*4882a593Smuzhiyun .class = &am33xx_cefuse_hwmod_class,
108*4882a593Smuzhiyun .clkdm_name = "l4_cefuse_clkdm",
109*4882a593Smuzhiyun .main_clk = "cefuse_fck",
110*4882a593Smuzhiyun .prcm = {
111*4882a593Smuzhiyun .omap4 = {
112*4882a593Smuzhiyun .clkctrl_offs = AM33XX_CM_CEFUSE_CEFUSE_CLKCTRL_OFFSET,
113*4882a593Smuzhiyun .modulemode = MODULEMODE_SWCTRL,
114*4882a593Smuzhiyun },
115*4882a593Smuzhiyun },
116*4882a593Smuzhiyun };
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun /*
119*4882a593Smuzhiyun * 'clkdiv32k' class
120*4882a593Smuzhiyun */
121*4882a593Smuzhiyun static struct omap_hwmod_class am33xx_clkdiv32k_hwmod_class = {
122*4882a593Smuzhiyun .name = "clkdiv32k",
123*4882a593Smuzhiyun };
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun static struct omap_hwmod am33xx_clkdiv32k_hwmod = {
126*4882a593Smuzhiyun .name = "clkdiv32k",
127*4882a593Smuzhiyun .class = &am33xx_clkdiv32k_hwmod_class,
128*4882a593Smuzhiyun .clkdm_name = "clk_24mhz_clkdm",
129*4882a593Smuzhiyun .main_clk = "clkdiv32k_ick",
130*4882a593Smuzhiyun .prcm = {
131*4882a593Smuzhiyun .omap4 = {
132*4882a593Smuzhiyun .clkctrl_offs = AM33XX_CM_PER_CLKDIV32K_CLKCTRL_OFFSET,
133*4882a593Smuzhiyun .modulemode = MODULEMODE_SWCTRL,
134*4882a593Smuzhiyun },
135*4882a593Smuzhiyun },
136*4882a593Smuzhiyun };
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun /* ocpwp */
139*4882a593Smuzhiyun static struct omap_hwmod_class am33xx_ocpwp_hwmod_class = {
140*4882a593Smuzhiyun .name = "ocpwp",
141*4882a593Smuzhiyun };
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun static struct omap_hwmod am33xx_ocpwp_hwmod = {
144*4882a593Smuzhiyun .name = "ocpwp",
145*4882a593Smuzhiyun .class = &am33xx_ocpwp_hwmod_class,
146*4882a593Smuzhiyun .clkdm_name = "l4ls_clkdm",
147*4882a593Smuzhiyun .main_clk = "l4ls_gclk",
148*4882a593Smuzhiyun .prcm = {
149*4882a593Smuzhiyun .omap4 = {
150*4882a593Smuzhiyun .clkctrl_offs = AM33XX_CM_PER_OCPWP_CLKCTRL_OFFSET,
151*4882a593Smuzhiyun .modulemode = MODULEMODE_SWCTRL,
152*4882a593Smuzhiyun },
153*4882a593Smuzhiyun },
154*4882a593Smuzhiyun };
155*4882a593Smuzhiyun #endif
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun /*
158*4882a593Smuzhiyun * 'debugss' class
159*4882a593Smuzhiyun * debug sub system
160*4882a593Smuzhiyun */
161*4882a593Smuzhiyun static struct omap_hwmod_opt_clk debugss_opt_clks[] = {
162*4882a593Smuzhiyun { .role = "dbg_sysclk", .clk = "dbg_sysclk_ck" },
163*4882a593Smuzhiyun { .role = "dbg_clka", .clk = "dbg_clka_ck" },
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun static struct omap_hwmod_class am33xx_debugss_hwmod_class = {
167*4882a593Smuzhiyun .name = "debugss",
168*4882a593Smuzhiyun };
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun static struct omap_hwmod am33xx_debugss_hwmod = {
171*4882a593Smuzhiyun .name = "debugss",
172*4882a593Smuzhiyun .class = &am33xx_debugss_hwmod_class,
173*4882a593Smuzhiyun .clkdm_name = "l3_aon_clkdm",
174*4882a593Smuzhiyun .main_clk = "trace_clk_div_ck",
175*4882a593Smuzhiyun .prcm = {
176*4882a593Smuzhiyun .omap4 = {
177*4882a593Smuzhiyun .clkctrl_offs = AM33XX_CM_WKUP_DEBUGSS_CLKCTRL_OFFSET,
178*4882a593Smuzhiyun .modulemode = MODULEMODE_SWCTRL,
179*4882a593Smuzhiyun },
180*4882a593Smuzhiyun },
181*4882a593Smuzhiyun .opt_clks = debugss_opt_clks,
182*4882a593Smuzhiyun .opt_clks_cnt = ARRAY_SIZE(debugss_opt_clks),
183*4882a593Smuzhiyun };
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun static struct omap_hwmod am33xx_control_hwmod = {
186*4882a593Smuzhiyun .name = "control",
187*4882a593Smuzhiyun .class = &am33xx_control_hwmod_class,
188*4882a593Smuzhiyun .clkdm_name = "l4_wkup_clkdm",
189*4882a593Smuzhiyun .flags = HWMOD_INIT_NO_IDLE,
190*4882a593Smuzhiyun .main_clk = "dpll_core_m4_div2_ck",
191*4882a593Smuzhiyun .prcm = {
192*4882a593Smuzhiyun .omap4 = {
193*4882a593Smuzhiyun .clkctrl_offs = AM33XX_CM_WKUP_CONTROL_CLKCTRL_OFFSET,
194*4882a593Smuzhiyun .modulemode = MODULEMODE_SWCTRL,
195*4882a593Smuzhiyun },
196*4882a593Smuzhiyun },
197*4882a593Smuzhiyun };
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun /*
201*4882a593Smuzhiyun * Interfaces
202*4882a593Smuzhiyun */
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun /* l3 main -> emif */
205*4882a593Smuzhiyun static struct omap_hwmod_ocp_if am33xx_l3_main__emif = {
206*4882a593Smuzhiyun .master = &am33xx_l3_main_hwmod,
207*4882a593Smuzhiyun .slave = &am33xx_emif_hwmod,
208*4882a593Smuzhiyun .clk = "dpll_core_m4_ck",
209*4882a593Smuzhiyun .user = OCP_USER_MPU | OCP_USER_SDMA,
210*4882a593Smuzhiyun };
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun /* l3 main -> l4 hs */
213*4882a593Smuzhiyun static struct omap_hwmod_ocp_if am33xx_l3_main__l4_hs = {
214*4882a593Smuzhiyun .master = &am33xx_l3_main_hwmod,
215*4882a593Smuzhiyun .slave = &am33xx_l4_hs_hwmod,
216*4882a593Smuzhiyun .clk = "l3s_gclk",
217*4882a593Smuzhiyun .user = OCP_USER_MPU | OCP_USER_SDMA,
218*4882a593Smuzhiyun };
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun /* wkup m3 -> l4 wkup */
221*4882a593Smuzhiyun static struct omap_hwmod_ocp_if am33xx_wkup_m3__l4_wkup = {
222*4882a593Smuzhiyun .master = &am33xx_wkup_m3_hwmod,
223*4882a593Smuzhiyun .slave = &am33xx_l4_wkup_hwmod,
224*4882a593Smuzhiyun .clk = "dpll_core_m4_div2_ck",
225*4882a593Smuzhiyun .user = OCP_USER_MPU | OCP_USER_SDMA,
226*4882a593Smuzhiyun };
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun /* l4 wkup -> wkup m3 */
229*4882a593Smuzhiyun static struct omap_hwmod_ocp_if am33xx_l4_wkup__wkup_m3 = {
230*4882a593Smuzhiyun .master = &am33xx_l4_wkup_hwmod,
231*4882a593Smuzhiyun .slave = &am33xx_wkup_m3_hwmod,
232*4882a593Smuzhiyun .clk = "dpll_core_m4_div2_ck",
233*4882a593Smuzhiyun .user = OCP_USER_MPU | OCP_USER_SDMA,
234*4882a593Smuzhiyun };
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun /* l3_main -> debugss */
237*4882a593Smuzhiyun static struct omap_hwmod_ocp_if am33xx_l3_main__debugss = {
238*4882a593Smuzhiyun .master = &am33xx_l3_main_hwmod,
239*4882a593Smuzhiyun .slave = &am33xx_debugss_hwmod,
240*4882a593Smuzhiyun .clk = "dpll_core_m4_ck",
241*4882a593Smuzhiyun .user = OCP_USER_MPU,
242*4882a593Smuzhiyun };
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun /* l4 wkup -> smartreflex0 */
245*4882a593Smuzhiyun static struct omap_hwmod_ocp_if am33xx_l4_wkup__smartreflex0 = {
246*4882a593Smuzhiyun .master = &am33xx_l4_wkup_hwmod,
247*4882a593Smuzhiyun .slave = &am33xx_smartreflex0_hwmod,
248*4882a593Smuzhiyun .clk = "dpll_core_m4_div2_ck",
249*4882a593Smuzhiyun .user = OCP_USER_MPU,
250*4882a593Smuzhiyun };
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun /* l4 wkup -> smartreflex1 */
253*4882a593Smuzhiyun static struct omap_hwmod_ocp_if am33xx_l4_wkup__smartreflex1 = {
254*4882a593Smuzhiyun .master = &am33xx_l4_wkup_hwmod,
255*4882a593Smuzhiyun .slave = &am33xx_smartreflex1_hwmod,
256*4882a593Smuzhiyun .clk = "dpll_core_m4_div2_ck",
257*4882a593Smuzhiyun .user = OCP_USER_MPU,
258*4882a593Smuzhiyun };
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun /* l4 wkup -> control */
261*4882a593Smuzhiyun static struct omap_hwmod_ocp_if am33xx_l4_wkup__control = {
262*4882a593Smuzhiyun .master = &am33xx_l4_wkup_hwmod,
263*4882a593Smuzhiyun .slave = &am33xx_control_hwmod,
264*4882a593Smuzhiyun .clk = "dpll_core_m4_div2_ck",
265*4882a593Smuzhiyun .user = OCP_USER_MPU,
266*4882a593Smuzhiyun };
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun static struct omap_hwmod_ocp_if *am33xx_hwmod_ocp_ifs[] __initdata = {
269*4882a593Smuzhiyun &am33xx_l3_main__emif,
270*4882a593Smuzhiyun &am33xx_mpu__l3_main,
271*4882a593Smuzhiyun &am33xx_mpu__prcm,
272*4882a593Smuzhiyun &am33xx_l3_s__l4_ls,
273*4882a593Smuzhiyun &am33xx_l3_s__l4_wkup,
274*4882a593Smuzhiyun &am33xx_l3_main__l4_hs,
275*4882a593Smuzhiyun &am33xx_l3_main__l3_s,
276*4882a593Smuzhiyun &am33xx_l3_main__l3_instr,
277*4882a593Smuzhiyun &am33xx_l3_s__l3_main,
278*4882a593Smuzhiyun &am33xx_wkup_m3__l4_wkup,
279*4882a593Smuzhiyun &am33xx_l3_main__debugss,
280*4882a593Smuzhiyun &am33xx_l4_wkup__wkup_m3,
281*4882a593Smuzhiyun &am33xx_l4_wkup__control,
282*4882a593Smuzhiyun &am33xx_l4_wkup__smartreflex0,
283*4882a593Smuzhiyun &am33xx_l4_wkup__smartreflex1,
284*4882a593Smuzhiyun &am33xx_l3_s__gpmc,
285*4882a593Smuzhiyun &am33xx_l3_main__ocmc,
286*4882a593Smuzhiyun NULL,
287*4882a593Smuzhiyun };
288*4882a593Smuzhiyun
am33xx_hwmod_init(void)289*4882a593Smuzhiyun int __init am33xx_hwmod_init(void)
290*4882a593Smuzhiyun {
291*4882a593Smuzhiyun omap_hwmod_am33xx_reg();
292*4882a593Smuzhiyun omap_hwmod_init();
293*4882a593Smuzhiyun return omap_hwmod_register_links(am33xx_hwmod_ocp_ifs);
294*4882a593Smuzhiyun }
295