io.c 17.6 KB
Newer Older
1 2 3 4 5 6
/*
 * linux/arch/arm/mach-omap2/io.c
 *
 * OMAP2 I/O mapping code
 *
 * Copyright (C) 2005 Nokia Corporation
7
 * Copyright (C) 2007-2009 Texas Instruments
8 9 10 11
 *
 * Author:
 *	Juha Yrjola <juha.yrjola@nokia.com>
 *	Syed Khasim <x0khasim@ti.com>
12
 *
13 14
 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
 *
15 16 17 18 19 20 21
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
22
#include <linux/io.h>
23
#include <linux/clk.h>
24

25 26 27
#include <asm/tlb.h>
#include <asm/mach/map.h>

28
#include <linux/omap-dma.h>
29

30
#include "omap_hwmod.h"
31
#include "soc.h"
32
#include "iomap.h"
33
#include "voltage.h"
34
#include "powerdomain.h"
35
#include "clockdomain.h"
36
#include "common.h"
37
#include "clock.h"
38 39 40
#include "clock2xxx.h"
#include "clock3xxx.h"
#include "clock44xx.h"
41
#include "omap-pm.h"
42
#include "sdrc.h"
43
#include "control.h"
44
#include "serial.h"
45
#include "sram.h"
46 47
#include "cm2xxx.h"
#include "cm3xxx.h"
48 49 50 51 52
#include "prm.h"
#include "cm.h"
#include "prcm_mpu44xx.h"
#include "prminst44xx.h"
#include "cminst44xx.h"
53 54 55
#include "prm2xxx.h"
#include "prm3xxx.h"
#include "prm44xx.h"
56
#include "opp2xxx.h"
57

58
/*
59
 * omap_clk_soc_init: points to a function that does the SoC-specific
60 61
 * clock initializations
 */
62
static int (*omap_clk_soc_init)(void);
63

64 65 66 67
/*
 * The machine specific code may provide the extra mapping besides the
 * default mapping provided here.
 */
68

69
#if defined(CONFIG_SOC_OMAP2420) || defined(CONFIG_SOC_OMAP2430)
70
static struct map_desc omap24xx_io_desc[] __initdata = {
71 72 73 74 75 76
	{
		.virtual	= L3_24XX_VIRT,
		.pfn		= __phys_to_pfn(L3_24XX_PHYS),
		.length		= L3_24XX_SIZE,
		.type		= MT_DEVICE
	},
77
	{
78 79 80 81
		.virtual	= L4_24XX_VIRT,
		.pfn		= __phys_to_pfn(L4_24XX_PHYS),
		.length		= L4_24XX_SIZE,
		.type		= MT_DEVICE
82
	},
83 84
};

85
#ifdef CONFIG_SOC_OMAP2420
86 87
static struct map_desc omap242x_io_desc[] __initdata = {
	{
88 89 90
		.virtual	= DSP_MEM_2420_VIRT,
		.pfn		= __phys_to_pfn(DSP_MEM_2420_PHYS),
		.length		= DSP_MEM_2420_SIZE,
91 92 93
		.type		= MT_DEVICE
	},
	{
94 95 96
		.virtual	= DSP_IPI_2420_VIRT,
		.pfn		= __phys_to_pfn(DSP_IPI_2420_PHYS),
		.length		= DSP_IPI_2420_SIZE,
97
		.type		= MT_DEVICE
98
	},
99
	{
100 101 102
		.virtual	= DSP_MMU_2420_VIRT,
		.pfn		= __phys_to_pfn(DSP_MMU_2420_PHYS),
		.length		= DSP_MMU_2420_SIZE,
103 104 105 106 107 108
		.type		= MT_DEVICE
	},
};

#endif

109
#ifdef CONFIG_SOC_OMAP2430
110
static struct map_desc omap243x_io_desc[] __initdata = {
111 112 113 114 115 116 117 118 119 120 121 122
	{
		.virtual	= L4_WK_243X_VIRT,
		.pfn		= __phys_to_pfn(L4_WK_243X_PHYS),
		.length		= L4_WK_243X_SIZE,
		.type		= MT_DEVICE
	},
	{
		.virtual	= OMAP243X_GPMC_VIRT,
		.pfn		= __phys_to_pfn(OMAP243X_GPMC_PHYS),
		.length		= OMAP243X_GPMC_SIZE,
		.type		= MT_DEVICE
	},
123 124 125 126 127 128 129 130 131 132 133 134 135
	{
		.virtual	= OMAP243X_SDRC_VIRT,
		.pfn		= __phys_to_pfn(OMAP243X_SDRC_PHYS),
		.length		= OMAP243X_SDRC_SIZE,
		.type		= MT_DEVICE
	},
	{
		.virtual	= OMAP243X_SMS_VIRT,
		.pfn		= __phys_to_pfn(OMAP243X_SMS_PHYS),
		.length		= OMAP243X_SMS_SIZE,
		.type		= MT_DEVICE
	},
};
136 137
#endif
#endif
138

139
#ifdef	CONFIG_ARCH_OMAP3
140
static struct map_desc omap34xx_io_desc[] __initdata = {
141
	{
142 143 144
		.virtual	= L3_34XX_VIRT,
		.pfn		= __phys_to_pfn(L3_34XX_PHYS),
		.length		= L3_34XX_SIZE,
145 146 147
		.type		= MT_DEVICE
	},
	{
148 149 150
		.virtual	= L4_34XX_VIRT,
		.pfn		= __phys_to_pfn(L4_34XX_PHYS),
		.length		= L4_34XX_SIZE,
151 152
		.type		= MT_DEVICE
	},
153 154 155 156
	{
		.virtual	= OMAP34XX_GPMC_VIRT,
		.pfn		= __phys_to_pfn(OMAP34XX_GPMC_PHYS),
		.length		= OMAP34XX_GPMC_SIZE,
157
		.type		= MT_DEVICE
158 159 160 161 162 163 164 165 166 167 168
	},
	{
		.virtual	= OMAP343X_SMS_VIRT,
		.pfn		= __phys_to_pfn(OMAP343X_SMS_PHYS),
		.length		= OMAP343X_SMS_SIZE,
		.type		= MT_DEVICE
	},
	{
		.virtual	= OMAP343X_SDRC_VIRT,
		.pfn		= __phys_to_pfn(OMAP343X_SDRC_PHYS),
		.length		= OMAP343X_SDRC_SIZE,
169
		.type		= MT_DEVICE
170 171 172 173 174 175 176 177 178 179 180 181 182
	},
	{
		.virtual	= L4_PER_34XX_VIRT,
		.pfn		= __phys_to_pfn(L4_PER_34XX_PHYS),
		.length		= L4_PER_34XX_SIZE,
		.type		= MT_DEVICE
	},
	{
		.virtual	= L4_EMU_34XX_VIRT,
		.pfn		= __phys_to_pfn(L4_EMU_34XX_PHYS),
		.length		= L4_EMU_34XX_SIZE,
		.type		= MT_DEVICE
	},
183
};
184
#endif
185

186
#ifdef CONFIG_SOC_TI81XX
187
static struct map_desc omapti81xx_io_desc[] __initdata = {
188 189 190 191 192 193 194 195 196
	{
		.virtual	= L4_34XX_VIRT,
		.pfn		= __phys_to_pfn(L4_34XX_PHYS),
		.length		= L4_34XX_SIZE,
		.type		= MT_DEVICE
	}
};
#endif

197
#if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX)
198
static struct map_desc omapam33xx_io_desc[] __initdata = {
199 200 201 202 203 204
	{
		.virtual	= L4_34XX_VIRT,
		.pfn		= __phys_to_pfn(L4_34XX_PHYS),
		.length		= L4_34XX_SIZE,
		.type		= MT_DEVICE
	},
205 206 207 208 209 210
	{
		.virtual	= L4_WK_AM33XX_VIRT,
		.pfn		= __phys_to_pfn(L4_WK_AM33XX_PHYS),
		.length		= L4_WK_AM33XX_SIZE,
		.type		= MT_DEVICE
	}
211 212 213
};
#endif

214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
#ifdef	CONFIG_ARCH_OMAP4
static struct map_desc omap44xx_io_desc[] __initdata = {
	{
		.virtual	= L3_44XX_VIRT,
		.pfn		= __phys_to_pfn(L3_44XX_PHYS),
		.length		= L3_44XX_SIZE,
		.type		= MT_DEVICE,
	},
	{
		.virtual	= L4_44XX_VIRT,
		.pfn		= __phys_to_pfn(L4_44XX_PHYS),
		.length		= L4_44XX_SIZE,
		.type		= MT_DEVICE,
	},
	{
		.virtual	= L4_PER_44XX_VIRT,
		.pfn		= __phys_to_pfn(L4_PER_44XX_PHYS),
		.length		= L4_PER_44XX_SIZE,
		.type		= MT_DEVICE,
	},
234 235 236 237 238
#ifdef CONFIG_OMAP4_ERRATA_I688
	{
		.virtual	= OMAP4_SRAM_VA,
		.pfn		= __phys_to_pfn(OMAP4_SRAM_PA),
		.length		= PAGE_SIZE,
239
		.type		= MT_MEMORY_RW_SO,
240 241 242
	},
#endif

243 244
};
#endif
245

246
#if defined(CONFIG_SOC_OMAP5) || defined(CONFIG_SOC_DRA7XX)
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
static struct map_desc omap54xx_io_desc[] __initdata = {
	{
		.virtual	= L3_54XX_VIRT,
		.pfn		= __phys_to_pfn(L3_54XX_PHYS),
		.length		= L3_54XX_SIZE,
		.type		= MT_DEVICE,
	},
	{
		.virtual	= L4_54XX_VIRT,
		.pfn		= __phys_to_pfn(L4_54XX_PHYS),
		.length		= L4_54XX_SIZE,
		.type		= MT_DEVICE,
	},
	{
		.virtual	= L4_WK_54XX_VIRT,
		.pfn		= __phys_to_pfn(L4_WK_54XX_PHYS),
		.length		= L4_WK_54XX_SIZE,
		.type		= MT_DEVICE,
	},
	{
		.virtual	= L4_PER_54XX_VIRT,
		.pfn		= __phys_to_pfn(L4_PER_54XX_PHYS),
		.length		= L4_PER_54XX_SIZE,
		.type		= MT_DEVICE,
	},
272 273 274 275 276
#ifdef CONFIG_OMAP4_ERRATA_I688
	{
		.virtual	= OMAP4_SRAM_VA,
		.pfn		= __phys_to_pfn(OMAP4_SRAM_PA),
		.length		= PAGE_SIZE,
277
		.type		= MT_MEMORY_RW_SO,
278 279
	},
#endif
280 281 282
};
#endif

283
#ifdef CONFIG_SOC_OMAP2420
284
void __init omap242x_map_io(void)
285
{
286 287
	iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc));
	iotable_init(omap242x_io_desc, ARRAY_SIZE(omap242x_io_desc));
288
}
289 290
#endif

291
#ifdef CONFIG_SOC_OMAP2430
292
void __init omap243x_map_io(void)
293
{
294 295
	iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc));
	iotable_init(omap243x_io_desc, ARRAY_SIZE(omap243x_io_desc));
296
}
297 298
#endif

299
#ifdef CONFIG_ARCH_OMAP3
300
void __init omap3_map_io(void)
301
{
302
	iotable_init(omap34xx_io_desc, ARRAY_SIZE(omap34xx_io_desc));
303
}
304
#endif
305

306
#ifdef CONFIG_SOC_TI81XX
307
void __init ti81xx_map_io(void)
308
{
309
	iotable_init(omapti81xx_io_desc, ARRAY_SIZE(omapti81xx_io_desc));
310 311 312
}
#endif

313
#if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX)
314
void __init am33xx_map_io(void)
315
{
316
	iotable_init(omapam33xx_io_desc, ARRAY_SIZE(omapam33xx_io_desc));
317 318 319
}
#endif

320
#ifdef CONFIG_ARCH_OMAP4
321
void __init omap4_map_io(void)
322
{
323
	iotable_init(omap44xx_io_desc, ARRAY_SIZE(omap44xx_io_desc));
324
	omap_barriers_init();
325
}
326
#endif
327

328
#if defined(CONFIG_SOC_OMAP5) ||  defined(CONFIG_SOC_DRA7XX)
329
void __init omap5_map_io(void)
330 331
{
	iotable_init(omap54xx_io_desc, ARRAY_SIZE(omap54xx_io_desc));
332
	omap_barriers_init();
333 334
}
#endif
335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
/*
 * omap2_init_reprogram_sdrc - reprogram SDRC timing parameters
 *
 * Sets the CORE DPLL3 M2 divider to the same value that it's at
 * currently.  This has the effect of setting the SDRC SDRAM AC timing
 * registers to the values currently defined by the kernel.  Currently
 * only defined for OMAP3; will return 0 if called on OMAP2.  Returns
 * -EINVAL if the dpll3_m2_ck cannot be found, 0 if called on OMAP2,
 * or passes along the return value of clk_set_rate().
 */
static int __init _omap2_init_reprogram_sdrc(void)
{
	struct clk *dpll3_m2_ck;
	int v = -EINVAL;
	long rate;

	if (!cpu_is_omap34xx())
		return 0;

	dpll3_m2_ck = clk_get(NULL, "dpll3_m2_ck");
355
	if (IS_ERR(dpll3_m2_ck))
356 357 358 359 360 361 362 363 364 365 366 367 368
		return -EINVAL;

	rate = clk_get_rate(dpll3_m2_ck);
	pr_info("Reprogramming SDRC clock to %ld Hz\n", rate);
	v = clk_set_rate(dpll3_m2_ck, rate);
	if (v)
		pr_err("dpll3_m2_clk rate change failed: %d\n", v);

	clk_put(dpll3_m2_ck);

	return v;
}

P
Paul Walmsley 已提交
369 370 371 372 373
static int _set_hwmod_postsetup_state(struct omap_hwmod *oh, void *data)
{
	return omap_hwmod_set_postsetup_state(oh, *(u8 *)data);
}

374 375 376
static void __init omap_hwmod_init_postsetup(void)
{
	u8 postsetup_state;
P
Paul Walmsley 已提交
377 378 379 380 381 382 383 384

	/* Set the default postsetup state for all hwmods */
#ifdef CONFIG_PM_RUNTIME
	postsetup_state = _HWMOD_STATE_IDLE;
#else
	postsetup_state = _HWMOD_STATE_ENABLED;
#endif
	omap_hwmod_for_each(_set_hwmod_postsetup_state, &postsetup_state);
385

386
	omap_pm_if_early_init();
387 388
}

389
static void __init __maybe_unused omap_common_late_init(void)
390 391 392
{
	omap_mux_late_init();
	omap2_common_pm_late_init();
393
	omap_soc_device_init();
394 395
}

396
#ifdef CONFIG_SOC_OMAP2420
397 398
void __init omap2420_init_early(void)
{
399 400 401 402 403
	omap2_set_globals_tap(OMAP242X_CLASS, OMAP2_L4_IO_ADDRESS(0x48014000));
	omap2_set_globals_sdrc(OMAP2_L3_IO_ADDRESS(OMAP2420_SDRC_BASE),
			       OMAP2_L3_IO_ADDRESS(OMAP2420_SMS_BASE));
	omap2_set_globals_control(OMAP2_L4_IO_ADDRESS(OMAP242X_CTRL_BASE),
				  NULL);
404 405
	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP2420_PRM_BASE));
	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP2420_CM_BASE), NULL);
406
	omap2xxx_check_revision();
407
	omap2xxx_prm_init();
408
	omap2xxx_cm_init();
409 410 411 412 413
	omap2xxx_voltagedomains_init();
	omap242x_powerdomains_init();
	omap242x_clockdomains_init();
	omap2420_hwmod_init();
	omap_hwmod_init_postsetup();
414 415
	omap_clk_soc_init = omap2420_dt_clk_init;
	rate_table = omap2420_rate_table;
416
}
417 418 419

void __init omap2420_init_late(void)
{
420
	omap_common_late_init();
421
	omap2_pm_init();
422
	omap2_clk_enable_autoidle_all();
423
}
424
#endif
425

426
#ifdef CONFIG_SOC_OMAP2430
427 428
void __init omap2430_init_early(void)
{
429 430 431 432 433
	omap2_set_globals_tap(OMAP243X_CLASS, OMAP2_L4_IO_ADDRESS(0x4900a000));
	omap2_set_globals_sdrc(OMAP2_L3_IO_ADDRESS(OMAP243X_SDRC_BASE),
			       OMAP2_L3_IO_ADDRESS(OMAP243X_SMS_BASE));
	omap2_set_globals_control(OMAP2_L4_IO_ADDRESS(OMAP243X_CTRL_BASE),
				  NULL);
434 435
	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP2430_PRM_BASE));
	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP2430_CM_BASE), NULL);
436
	omap2xxx_check_revision();
437
	omap2xxx_prm_init();
438
	omap2xxx_cm_init();
439 440 441 442 443
	omap2xxx_voltagedomains_init();
	omap243x_powerdomains_init();
	omap243x_clockdomains_init();
	omap2430_hwmod_init();
	omap_hwmod_init_postsetup();
444 445
	omap_clk_soc_init = omap2430_dt_clk_init;
	rate_table = omap2430_rate_table;
446
}
447 448 449

void __init omap2430_init_late(void)
{
450
	omap_common_late_init();
451
	omap2_pm_init();
452
	omap2_clk_enable_autoidle_all();
453
}
454
#endif
455 456 457 458 459

/*
 * Currently only board-omap3beagle.c should call this because of the
 * same machine_id for 34xx and 36xx beagle.. Will get fixed with DT.
 */
460
#ifdef CONFIG_ARCH_OMAP3
461 462
void __init omap3_init_early(void)
{
463 464 465 466 467
	omap2_set_globals_tap(OMAP343X_CLASS, OMAP2_L4_IO_ADDRESS(0x4830A000));
	omap2_set_globals_sdrc(OMAP2_L3_IO_ADDRESS(OMAP343X_SDRC_BASE),
			       OMAP2_L3_IO_ADDRESS(OMAP343X_SMS_BASE));
	omap2_set_globals_control(OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE),
				  NULL);
468 469
	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP3430_PRM_BASE));
	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP3430_CM_BASE), NULL);
470 471
	omap3xxx_check_revision();
	omap3xxx_check_features();
472
	omap3xxx_prm_init();
473
	omap3xxx_cm_init();
474 475 476 477 478
	omap3xxx_voltagedomains_init();
	omap3xxx_powerdomains_init();
	omap3xxx_clockdomains_init();
	omap3xxx_hwmod_init();
	omap_hwmod_init_postsetup();
479
	omap_clk_soc_init = omap3xxx_clk_init;
480 481 482 483
}

void __init omap3430_init_early(void)
{
484
	omap3_init_early();
485 486
	if (of_have_populated_dt())
		omap_clk_soc_init = omap3430_dt_clk_init;
487 488 489 490
}

void __init omap35xx_init_early(void)
{
491
	omap3_init_early();
492 493
	if (of_have_populated_dt())
		omap_clk_soc_init = omap3430_dt_clk_init;
494 495 496 497
}

void __init omap3630_init_early(void)
{
498
	omap3_init_early();
499 500
	if (of_have_populated_dt())
		omap_clk_soc_init = omap3630_dt_clk_init;
501 502 503 504
}

void __init am35xx_init_early(void)
{
505
	omap3_init_early();
506 507
	if (of_have_populated_dt())
		omap_clk_soc_init = am35xx_dt_clk_init;
508 509
}

510
void __init ti81xx_init_early(void)
511
{
512 513 514 515
	omap2_set_globals_tap(OMAP343X_CLASS,
			      OMAP2_L4_IO_ADDRESS(TI81XX_TAP_BASE));
	omap2_set_globals_control(OMAP2_L4_IO_ADDRESS(TI81XX_CTRL_BASE),
				  NULL);
516 517
	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(TI81XX_PRCM_BASE));
	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(TI81XX_PRCM_BASE), NULL);
518 519
	omap3xxx_check_revision();
	ti81xx_check_features();
520 521 522 523 524
	omap3xxx_voltagedomains_init();
	omap3xxx_powerdomains_init();
	omap3xxx_clockdomains_init();
	omap3xxx_hwmod_init();
	omap_hwmod_init_postsetup();
525 526 527 528
	if (of_have_populated_dt())
		omap_clk_soc_init = ti81xx_dt_clk_init;
	else
		omap_clk_soc_init = omap3xxx_clk_init;
529
}
530 531 532

void __init omap3_init_late(void)
{
533
	omap_common_late_init();
534
	omap3_pm_init();
535
	omap2_clk_enable_autoidle_all();
536 537 538 539
}

void __init omap3430_init_late(void)
{
540
	omap_common_late_init();
541
	omap3_pm_init();
542
	omap2_clk_enable_autoidle_all();
543 544 545 546
}

void __init omap35xx_init_late(void)
{
547
	omap_common_late_init();
548
	omap3_pm_init();
549
	omap2_clk_enable_autoidle_all();
550 551 552 553
}

void __init omap3630_init_late(void)
{
554
	omap_common_late_init();
555
	omap3_pm_init();
556
	omap2_clk_enable_autoidle_all();
557 558 559 560
}

void __init am35xx_init_late(void)
{
561
	omap_common_late_init();
562
	omap3_pm_init();
563
	omap2_clk_enable_autoidle_all();
564 565 566 567
}

void __init ti81xx_init_late(void)
{
568
	omap_common_late_init();
569
	omap3_pm_init();
570
	omap2_clk_enable_autoidle_all();
571
}
572
#endif
573

574 575 576
#ifdef CONFIG_SOC_AM33XX
void __init am33xx_init_early(void)
{
577 578 579 580
	omap2_set_globals_tap(AM335X_CLASS,
			      AM33XX_L4_WK_IO_ADDRESS(AM33XX_TAP_BASE));
	omap2_set_globals_control(AM33XX_L4_WK_IO_ADDRESS(AM33XX_CTRL_BASE),
				  NULL);
581 582
	omap2_set_globals_prm(AM33XX_L4_WK_IO_ADDRESS(AM33XX_PRCM_BASE));
	omap2_set_globals_cm(AM33XX_L4_WK_IO_ADDRESS(AM33XX_PRCM_BASE), NULL);
583
	omap3xxx_check_revision();
584
	am33xx_check_features();
585
	am33xx_powerdomains_init();
586
	am33xx_clockdomains_init();
587 588
	am33xx_hwmod_init();
	omap_hwmod_init_postsetup();
589
	omap_clk_soc_init = am33xx_dt_clk_init;
590
}
591 592 593 594 595

void __init am33xx_init_late(void)
{
	omap_common_late_init();
}
596 597
#endif

A
Afzal Mohammed 已提交
598 599 600 601 602 603 604 605 606
#ifdef CONFIG_SOC_AM43XX
void __init am43xx_init_early(void)
{
	omap2_set_globals_tap(AM335X_CLASS,
			      AM33XX_L4_WK_IO_ADDRESS(AM33XX_TAP_BASE));
	omap2_set_globals_control(AM33XX_L4_WK_IO_ADDRESS(AM33XX_CTRL_BASE),
				  NULL);
	omap2_set_globals_prm(AM33XX_L4_WK_IO_ADDRESS(AM43XX_PRCM_BASE));
	omap2_set_globals_cm(AM33XX_L4_WK_IO_ADDRESS(AM43XX_PRCM_BASE), NULL);
A
Ambresh K 已提交
607 608
	omap_prm_base_init();
	omap_cm_base_init();
A
Afzal Mohammed 已提交
609
	omap3xxx_check_revision();
610
	am33xx_check_features();
A
Ambresh K 已提交
611 612 613 614
	am43xx_powerdomains_init();
	am43xx_clockdomains_init();
	am43xx_hwmod_init();
	omap_hwmod_init_postsetup();
615
	omap_l2_cache_init();
T
Tero Kristo 已提交
616
	omap_clk_soc_init = am43xx_dt_clk_init;
A
Afzal Mohammed 已提交
617
}
618 619 620 621 622

void __init am43xx_init_late(void)
{
	omap_common_late_init();
}
A
Afzal Mohammed 已提交
623 624
#endif

625
#ifdef CONFIG_ARCH_OMAP4
626 627
void __init omap4430_init_early(void)
{
628 629 630 631
	omap2_set_globals_tap(OMAP443X_CLASS,
			      OMAP2_L4_IO_ADDRESS(OMAP443X_SCM_BASE));
	omap2_set_globals_control(OMAP2_L4_IO_ADDRESS(OMAP443X_SCM_BASE),
				  OMAP2_L4_IO_ADDRESS(OMAP443X_CTRL_BASE));
632 633 634 635 636 637
	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP4430_PRM_BASE));
	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP4430_CM_BASE),
			     OMAP2_L4_IO_ADDRESS(OMAP4430_CM2_BASE));
	omap2_set_globals_prcm_mpu(OMAP2_L4_IO_ADDRESS(OMAP4430_PRCM_MPU_BASE));
	omap_prm_base_init();
	omap_cm_base_init();
638 639
	omap4xxx_check_revision();
	omap4xxx_check_features();
640
	omap4_pm_init_early();
641
	omap44xx_prm_init();
642 643 644 645 646
	omap44xx_voltagedomains_init();
	omap44xx_powerdomains_init();
	omap44xx_clockdomains_init();
	omap44xx_hwmod_init();
	omap_hwmod_init_postsetup();
647
	omap_l2_cache_init();
648
	omap_clk_soc_init = omap4xxx_dt_clk_init;
649
}
650 651 652

void __init omap4430_init_late(void)
{
653
	omap_common_late_init();
654
	omap4_pm_init();
655
	omap2_clk_enable_autoidle_all();
656
}
657
#endif
658

659 660 661
#ifdef CONFIG_SOC_OMAP5
void __init omap5_init_early(void)
{
662 663 664 665
	omap2_set_globals_tap(OMAP54XX_CLASS,
			      OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE));
	omap2_set_globals_control(OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE),
				  OMAP2_L4_IO_ADDRESS(OMAP54XX_CTRL_BASE));
666 667 668 669 670 671
	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP54XX_PRM_BASE));
	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_AON_BASE),
			     OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_BASE));
	omap2_set_globals_prcm_mpu(OMAP2_L4_IO_ADDRESS(OMAP54XX_PRCM_MPU_BASE));
	omap_prm_base_init();
	omap_cm_base_init();
672
	omap44xx_prm_init();
673
	omap5xxx_check_revision();
674 675 676 677 678
	omap54xx_voltagedomains_init();
	omap54xx_powerdomains_init();
	omap54xx_clockdomains_init();
	omap54xx_hwmod_init();
	omap_hwmod_init_postsetup();
679
	omap_clk_soc_init = omap5xxx_dt_clk_init;
680
}
681 682 683 684 685

void __init omap5_init_late(void)
{
	omap_common_late_init();
}
686 687
#endif

688 689 690 691 692 693 694 695 696 697 698 699
#ifdef CONFIG_SOC_DRA7XX
void __init dra7xx_init_early(void)
{
	omap2_set_globals_tap(-1, OMAP2_L4_IO_ADDRESS(DRA7XX_TAP_BASE));
	omap2_set_globals_control(OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE),
				  OMAP2_L4_IO_ADDRESS(DRA7XX_CTRL_BASE));
	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP54XX_PRM_BASE));
	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(DRA7XX_CM_CORE_AON_BASE),
			     OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_BASE));
	omap2_set_globals_prcm_mpu(OMAP2_L4_IO_ADDRESS(OMAP54XX_PRCM_MPU_BASE));
	omap_prm_base_init();
	omap_cm_base_init();
700
	omap44xx_prm_init();
701
	dra7xxx_check_revision();
702 703 704 705
	dra7xx_powerdomains_init();
	dra7xx_clockdomains_init();
	dra7xx_hwmod_init();
	omap_hwmod_init_postsetup();
T
Tero Kristo 已提交
706
	omap_clk_soc_init = dra7xx_dt_clk_init;
707
}
708 709 710 711 712

void __init dra7xx_init_late(void)
{
	omap_common_late_init();
}
713 714 715
#endif


716
void __init omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0,
717 718
				      struct omap_sdrc_params *sdrc_cs1)
{
719 720
	omap_sram_init();

721
	if (cpu_is_omap24xx() || omap3_has_sdrc()) {
722 723 724
		omap2_sdrc_init(sdrc_cs0, sdrc_cs1);
		_omap2_init_reprogram_sdrc();
	}
725
}
726 727 728 729 730 731 732 733

int __init omap_clk_init(void)
{
	int ret = 0;

	if (!omap_clk_soc_init)
		return 0;

734 735
	ti_clk_init_features();

736 737 738 739 740 741
	ret = of_prcm_init();
	if (!ret)
		ret = omap_clk_soc_init();

	return ret;
}