Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
  1/*
  2 *
  3 * Copyright (C) 2013 Texas Instruments Incorporated
  4 *
  5 * Hwmod common for AM335x and AM43x
  6 *
  7 * This program is free software; you can redistribute it and/or
  8 * modify it under the terms of the GNU General Public License as
  9 * published by the Free Software Foundation version 2.
 10 *
 11 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
 12 * kind, whether express or implied; without even the implied warranty
 13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 14 * GNU General Public License for more details.
 15 */
 16
 17#include <linux/types.h>
 18
 19#include "omap_hwmod.h"
 20#include "cm33xx.h"
 21#include "prm33xx.h"
 22#include "omap_hwmod_33xx_43xx_common_data.h"
 23#include "prcm43xx.h"
 24#include "common.h"
 25
 26#define CLKCTRL(oh, clkctrl) ((oh).prcm.omap4.clkctrl_offs = (clkctrl))
 27#define RSTCTRL(oh, rstctrl) ((oh).prcm.omap4.rstctrl_offs = (rstctrl))
 28#define RSTST(oh, rstst) ((oh).prcm.omap4.rstst_offs = (rstst))
 29#define PRCM_FLAGS(oh, flag) ((oh).prcm.omap4.flags = (flag))
 30
 31/*
 32 * 'l3' class
 33 * instance(s): l3_main, l3_s, l3_instr
 34 */
 35static struct omap_hwmod_class am33xx_l3_hwmod_class = {
 36	.name		= "l3",
 37};
 38
 39struct omap_hwmod am33xx_l3_main_hwmod = {
 40	.name		= "l3_main",
 41	.class		= &am33xx_l3_hwmod_class,
 42	.clkdm_name	= "l3_clkdm",
 43	.flags		= HWMOD_INIT_NO_IDLE,
 44	.main_clk	= "l3_gclk",
 45	.prcm		= {
 46		.omap4	= {
 47			.modulemode	= MODULEMODE_SWCTRL,
 48		},
 49	},
 50};
 51
 52/* l3_s */
 53struct omap_hwmod am33xx_l3_s_hwmod = {
 54	.name		= "l3_s",
 55	.class		= &am33xx_l3_hwmod_class,
 56	.clkdm_name	= "l3s_clkdm",
 57};
 58
 59/* l3_instr */
 60struct omap_hwmod am33xx_l3_instr_hwmod = {
 61	.name		= "l3_instr",
 62	.class		= &am33xx_l3_hwmod_class,
 63	.clkdm_name	= "l3_clkdm",
 64	.flags		= HWMOD_INIT_NO_IDLE,
 65	.main_clk	= "l3_gclk",
 66	.prcm		= {
 67		.omap4	= {
 68			.modulemode	= MODULEMODE_SWCTRL,
 69		},
 70	},
 71};
 72
 73/*
 74 * 'l4' class
 75 * instance(s): l4_ls, l4_hs, l4_wkup, l4_fw
 76 */
 77struct omap_hwmod_class am33xx_l4_hwmod_class = {
 78	.name		= "l4",
 79};
 80
 81/* l4_ls */
 82struct omap_hwmod am33xx_l4_ls_hwmod = {
 83	.name		= "l4_ls",
 84	.class		= &am33xx_l4_hwmod_class,
 85	.clkdm_name	= "l4ls_clkdm",
 86	.flags		= HWMOD_INIT_NO_IDLE,
 87	.main_clk	= "l4ls_gclk",
 88	.prcm		= {
 89		.omap4	= {
 90			.modulemode	= MODULEMODE_SWCTRL,
 91		},
 92	},
 93};
 94
 95/* l4_wkup */
 96struct omap_hwmod am33xx_l4_wkup_hwmod = {
 97	.name		= "l4_wkup",
 98	.class		= &am33xx_l4_hwmod_class,
 99	.clkdm_name	= "l4_wkup_clkdm",
100	.flags		= HWMOD_INIT_NO_IDLE,
101	.prcm		= {
102		.omap4	= {
103			.modulemode	= MODULEMODE_SWCTRL,
104		},
105	},
106};
107
108/*
109 * 'mpu' class
110 */
111static struct omap_hwmod_class am33xx_mpu_hwmod_class = {
112	.name	= "mpu",
113};
114
115struct omap_hwmod am33xx_mpu_hwmod = {
116	.name		= "mpu",
117	.class		= &am33xx_mpu_hwmod_class,
118	.clkdm_name	= "mpu_clkdm",
119	.flags		= HWMOD_INIT_NO_IDLE,
120	.main_clk	= "dpll_mpu_m2_ck",
121	.prcm		= {
122		.omap4	= {
123			.modulemode	= MODULEMODE_SWCTRL,
124		},
125	},
126};
127
128/*
129 * 'wakeup m3' class
130 * Wakeup controller sub-system under wakeup domain
131 */
132struct omap_hwmod_class am33xx_wkup_m3_hwmod_class = {
133	.name		= "wkup_m3",
134};
135
136/* gfx */
137/* Pseudo hwmod for reset control purpose only */
138static struct omap_hwmod_class am33xx_gfx_hwmod_class = {
139	.name	= "gfx",
140};
141
142static struct omap_hwmod_rst_info am33xx_gfx_resets[] = {
143	{ .name = "gfx", .rst_shift = 0, .st_shift = 0},
144};
145
146struct omap_hwmod am33xx_gfx_hwmod = {
147	.name		= "gfx",
148	.class		= &am33xx_gfx_hwmod_class,
149	.clkdm_name	= "gfx_l3_clkdm",
150	.main_clk	= "gfx_fck_div_ck",
151	.prcm		= {
152		.omap4	= {
153			.modulemode	= MODULEMODE_SWCTRL,
154		},
155	},
156	.rst_lines	= am33xx_gfx_resets,
157	.rst_lines_cnt	= ARRAY_SIZE(am33xx_gfx_resets),
158};
159
160/*
161 * 'prcm' class
162 * power and reset manager (whole prcm infrastructure)
163 */
164static struct omap_hwmod_class am33xx_prcm_hwmod_class = {
165	.name	= "prcm",
166};
167
168/* prcm */
169struct omap_hwmod am33xx_prcm_hwmod = {
170	.name		= "prcm",
171	.class		= &am33xx_prcm_hwmod_class,
172	.clkdm_name	= "l4_wkup_clkdm",
173};
174
175/*
176 * 'emif' class
177 * instance(s): emif
178 */
179static struct omap_hwmod_class_sysconfig am33xx_emif_sysc = {
180	.rev_offs	= 0x0000,
181};
182
183struct omap_hwmod_class am33xx_emif_hwmod_class = {
184	.name		= "emif",
185	.sysc		= &am33xx_emif_sysc,
186};
187
188
189
190/* ocmcram */
191static struct omap_hwmod_class am33xx_ocmcram_hwmod_class = {
192	.name = "ocmcram",
193};
194
195struct omap_hwmod am33xx_ocmcram_hwmod = {
196	.name		= "ocmcram",
197	.class		= &am33xx_ocmcram_hwmod_class,
198	.clkdm_name	= "l3_clkdm",
199	.flags		= HWMOD_INIT_NO_IDLE,
200	.main_clk	= "l3_gclk",
201	.prcm		= {
202		.omap4	= {
203			.modulemode	= MODULEMODE_SWCTRL,
204		},
205	},
206};
207
208/* 'smartreflex' class */
209static struct omap_hwmod_class am33xx_smartreflex_hwmod_class = {
210	.name		= "smartreflex",
211};
212
213/* smartreflex0 */
214struct omap_hwmod am33xx_smartreflex0_hwmod = {
215	.name		= "smartreflex0",
216	.class		= &am33xx_smartreflex_hwmod_class,
217	.clkdm_name	= "l4_wkup_clkdm",
218	.main_clk	= "smartreflex0_fck",
219	.prcm		= {
220		.omap4	= {
221			.modulemode	= MODULEMODE_SWCTRL,
222		},
223	},
224};
225
226/* smartreflex1 */
227struct omap_hwmod am33xx_smartreflex1_hwmod = {
228	.name		= "smartreflex1",
229	.class		= &am33xx_smartreflex_hwmod_class,
230	.clkdm_name	= "l4_wkup_clkdm",
231	.main_clk	= "smartreflex1_fck",
232	.prcm		= {
233		.omap4	= {
234			.modulemode	= MODULEMODE_SWCTRL,
235		},
236	},
237};
238
239/*
240 * 'control' module class
241 */
242struct omap_hwmod_class am33xx_control_hwmod_class = {
243	.name		= "control",
244};
245
246
247/* gpmc */
248static struct omap_hwmod_class_sysconfig gpmc_sysc = {
249	.rev_offs	= 0x0,
250	.sysc_offs	= 0x10,
251	.syss_offs	= 0x14,
252	.sysc_flags	= (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE |
253			SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
254	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
255	.sysc_fields	= &omap_hwmod_sysc_type1,
256};
257
258static struct omap_hwmod_class am33xx_gpmc_hwmod_class = {
259	.name		= "gpmc",
260	.sysc		= &gpmc_sysc,
261};
262
263struct omap_hwmod am33xx_gpmc_hwmod = {
264	.name		= "gpmc",
265	.class		= &am33xx_gpmc_hwmod_class,
266	.clkdm_name	= "l3s_clkdm",
267	/* Skip reset for CONFIG_OMAP_GPMC_DEBUG for bootloader timings */
268	.flags		= DEBUG_OMAP_GPMC_HWMOD_FLAGS,
269	.main_clk	= "l3s_gclk",
270	.prcm		= {
271		.omap4	= {
272			.modulemode	= MODULEMODE_SWCTRL,
273		},
274	},
275};
276
277
278/*
279 * 'rtc' class
280 * rtc subsystem
281 */
282static struct omap_hwmod_class_sysconfig am33xx_rtc_sysc = {
283	.rev_offs	= 0x0074,
284	.sysc_offs	= 0x0078,
285	.sysc_flags	= SYSC_HAS_SIDLEMODE,
286	.idlemodes	= (SIDLE_FORCE | SIDLE_NO |
287			  SIDLE_SMART | SIDLE_SMART_WKUP),
288	.sysc_fields	= &omap_hwmod_sysc_type3,
289};
290
291static struct omap_hwmod_class am33xx_rtc_hwmod_class = {
292	.name		= "rtc",
293	.sysc		= &am33xx_rtc_sysc,
294	.unlock		= &omap_hwmod_rtc_unlock,
295	.lock		= &omap_hwmod_rtc_lock,
296};
297
298struct omap_hwmod am33xx_rtc_hwmod = {
299	.name		= "rtc",
300	.class		= &am33xx_rtc_hwmod_class,
301	.clkdm_name	= "l4_rtc_clkdm",
302	.main_clk	= "clk_32768_ck",
303	.prcm		= {
304		.omap4	= {
305			.modulemode	= MODULEMODE_SWCTRL,
306		},
307	},
308};
309
310static void omap_hwmod_am33xx_clkctrl(void)
311{
312	CLKCTRL(am33xx_smartreflex0_hwmod,
313		AM33XX_CM_WKUP_SMARTREFLEX0_CLKCTRL_OFFSET);
314	CLKCTRL(am33xx_smartreflex1_hwmod,
315		AM33XX_CM_WKUP_SMARTREFLEX1_CLKCTRL_OFFSET);
316	CLKCTRL(am33xx_rtc_hwmod, AM33XX_CM_RTC_RTC_CLKCTRL_OFFSET);
317	PRCM_FLAGS(am33xx_rtc_hwmod, HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET);
318	CLKCTRL(am33xx_gpmc_hwmod, AM33XX_CM_PER_GPMC_CLKCTRL_OFFSET);
319	CLKCTRL(am33xx_l4_ls_hwmod, AM33XX_CM_PER_L4LS_CLKCTRL_OFFSET);
320	CLKCTRL(am33xx_l4_wkup_hwmod, AM33XX_CM_WKUP_L4WKUP_CLKCTRL_OFFSET);
321	CLKCTRL(am33xx_l3_main_hwmod, AM33XX_CM_PER_L3_CLKCTRL_OFFSET);
322	CLKCTRL(am33xx_gfx_hwmod, AM33XX_CM_GFX_GFX_CLKCTRL_OFFSET);
323	CLKCTRL(am33xx_mpu_hwmod , AM33XX_CM_MPU_MPU_CLKCTRL_OFFSET);
324	CLKCTRL(am33xx_l3_instr_hwmod , AM33XX_CM_PER_L3_INSTR_CLKCTRL_OFFSET);
325	CLKCTRL(am33xx_ocmcram_hwmod , AM33XX_CM_PER_OCMCRAM_CLKCTRL_OFFSET);
326}
327
328static void omap_hwmod_am33xx_rst(void)
329{
330	RSTCTRL(am33xx_gfx_hwmod, AM33XX_RM_GFX_RSTCTRL_OFFSET);
331	RSTST(am33xx_gfx_hwmod, AM33XX_RM_GFX_RSTST_OFFSET);
332}
333
334void omap_hwmod_am33xx_reg(void)
335{
336	omap_hwmod_am33xx_clkctrl();
337	omap_hwmod_am33xx_rst();
338}
339
340static void omap_hwmod_am43xx_clkctrl(void)
341{
342	CLKCTRL(am33xx_smartreflex0_hwmod,
343		AM43XX_CM_WKUP_SMARTREFLEX0_CLKCTRL_OFFSET);
344	CLKCTRL(am33xx_smartreflex1_hwmod,
345		AM43XX_CM_WKUP_SMARTREFLEX1_CLKCTRL_OFFSET);
346	CLKCTRL(am33xx_rtc_hwmod, AM43XX_CM_RTC_RTC_CLKCTRL_OFFSET);
347	CLKCTRL(am33xx_gpmc_hwmod, AM43XX_CM_PER_GPMC_CLKCTRL_OFFSET);
348	CLKCTRL(am33xx_l4_ls_hwmod, AM43XX_CM_PER_L4LS_CLKCTRL_OFFSET);
349	CLKCTRL(am33xx_l4_wkup_hwmod, AM43XX_CM_WKUP_L4WKUP_CLKCTRL_OFFSET);
350	CLKCTRL(am33xx_l3_main_hwmod, AM43XX_CM_PER_L3_CLKCTRL_OFFSET);
351	CLKCTRL(am33xx_gfx_hwmod, AM43XX_CM_GFX_GFX_CLKCTRL_OFFSET);
352	CLKCTRL(am33xx_mpu_hwmod , AM43XX_CM_MPU_MPU_CLKCTRL_OFFSET);
353	CLKCTRL(am33xx_l3_instr_hwmod , AM43XX_CM_PER_L3_INSTR_CLKCTRL_OFFSET);
354	CLKCTRL(am33xx_ocmcram_hwmod , AM43XX_CM_PER_OCMCRAM_CLKCTRL_OFFSET);
355}
356
357static void omap_hwmod_am43xx_rst(void)
358{
359	RSTCTRL(am33xx_gfx_hwmod, AM43XX_RM_GFX_RSTCTRL_OFFSET);
360	RSTST(am33xx_gfx_hwmod, AM43XX_RM_GFX_RSTST_OFFSET);
361}
362
363void omap_hwmod_am43xx_reg(void)
364{
365	omap_hwmod_am43xx_clkctrl();
366	omap_hwmod_am43xx_rst();
367}