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
#include "cm33xx.h"
49 50 51 52 53
#include "prm.h"
#include "cm.h"
#include "prcm_mpu44xx.h"
#include "prminst44xx.h"
#include "cminst44xx.h"
54 55 56
#include "prm2xxx.h"
#include "prm3xxx.h"
#include "prm44xx.h"
57
#include "opp2xxx.h"
58

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

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

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

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

#endif

110
#ifdef CONFIG_SOC_OMAP2430
111
static struct map_desc omap243x_io_desc[] __initdata = {
112 113 114 115 116 117 118 119 120 121 122 123
	{
		.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
	},
124 125 126 127 128 129 130 131 132 133 134 135 136
	{
		.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
	},
};
137 138
#endif
#endif
139

140
#ifdef	CONFIG_ARCH_OMAP3
141
static struct map_desc omap34xx_io_desc[] __initdata = {
142
	{
143 144 145
		.virtual	= L3_34XX_VIRT,
		.pfn		= __phys_to_pfn(L3_34XX_PHYS),
		.length		= L3_34XX_SIZE,
146 147 148
		.type		= MT_DEVICE
	},
	{
149 150 151
		.virtual	= L4_34XX_VIRT,
		.pfn		= __phys_to_pfn(L4_34XX_PHYS),
		.length		= L4_34XX_SIZE,
152 153
		.type		= MT_DEVICE
	},
154 155 156 157
	{
		.virtual	= OMAP34XX_GPMC_VIRT,
		.pfn		= __phys_to_pfn(OMAP34XX_GPMC_PHYS),
		.length		= OMAP34XX_GPMC_SIZE,
158
		.type		= MT_DEVICE
159 160 161 162 163 164 165 166 167 168 169
	},
	{
		.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,
170
		.type		= MT_DEVICE
171 172 173 174 175 176 177 178 179 180 181 182 183
	},
	{
		.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
	},
184
};
185
#endif
186

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

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

215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
#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,
	},
};
#endif
237

238
#if defined(CONFIG_SOC_OMAP5) || defined(CONFIG_SOC_DRA7XX)
239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
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,
	},
};
#endif

267
#ifdef CONFIG_SOC_OMAP2420
268
void __init omap242x_map_io(void)
269
{
270 271
	iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc));
	iotable_init(omap242x_io_desc, ARRAY_SIZE(omap242x_io_desc));
272
}
273 274
#endif

275
#ifdef CONFIG_SOC_OMAP2430
276
void __init omap243x_map_io(void)
277
{
278 279
	iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc));
	iotable_init(omap243x_io_desc, ARRAY_SIZE(omap243x_io_desc));
280
}
281 282
#endif

283
#ifdef CONFIG_ARCH_OMAP3
284
void __init omap3_map_io(void)
285
{
286
	iotable_init(omap34xx_io_desc, ARRAY_SIZE(omap34xx_io_desc));
287
}
288
#endif
289

290
#ifdef CONFIG_SOC_TI81XX
291
void __init ti81xx_map_io(void)
292
{
293
	iotable_init(omapti81xx_io_desc, ARRAY_SIZE(omapti81xx_io_desc));
294 295 296
}
#endif

297
#if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX)
298
void __init am33xx_map_io(void)
299
{
300
	iotable_init(omapam33xx_io_desc, ARRAY_SIZE(omapam33xx_io_desc));
301 302 303
}
#endif

304
#ifdef CONFIG_ARCH_OMAP4
305
void __init omap4_map_io(void)
306
{
307
	iotable_init(omap44xx_io_desc, ARRAY_SIZE(omap44xx_io_desc));
308
	omap_barriers_init();
309
}
310
#endif
311

312
#if defined(CONFIG_SOC_OMAP5) ||  defined(CONFIG_SOC_DRA7XX)
313
void __init omap5_map_io(void)
314 315
{
	iotable_init(omap54xx_io_desc, ARRAY_SIZE(omap54xx_io_desc));
316
	omap_barriers_init();
317 318
}
#endif
319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338
/*
 * 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");
339
	if (IS_ERR(dpll3_m2_ck))
340 341 342 343 344 345 346 347 348 349 350 351 352
		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 已提交
353 354 355 356 357
static int _set_hwmod_postsetup_state(struct omap_hwmod *oh, void *data)
{
	return omap_hwmod_set_postsetup_state(oh, *(u8 *)data);
}

358 359 360
static void __init omap_hwmod_init_postsetup(void)
{
	u8 postsetup_state;
P
Paul Walmsley 已提交
361 362 363 364 365 366 367 368

	/* 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);
369

370
	omap_pm_if_early_init();
371 372
}

373
static void __init __maybe_unused omap_common_late_init(void)
374 375 376
{
	omap_mux_late_init();
	omap2_common_pm_late_init();
377
	omap_soc_device_init();
378 379
}

380
#ifdef CONFIG_SOC_OMAP2420
381 382
void __init omap2420_init_early(void)
{
383 384 385 386 387
	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);
388 389
	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP2420_PRM_BASE));
	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP2420_CM_BASE), NULL);
390
	omap2xxx_check_revision();
391
	omap2xxx_prm_init();
392
	omap2xxx_cm_init();
393 394 395 396 397
	omap2xxx_voltagedomains_init();
	omap242x_powerdomains_init();
	omap242x_clockdomains_init();
	omap2420_hwmod_init();
	omap_hwmod_init_postsetup();
398 399
	omap_clk_soc_init = omap2420_dt_clk_init;
	rate_table = omap2420_rate_table;
400
}
401 402 403

void __init omap2420_init_late(void)
{
404
	omap_common_late_init();
405
	omap2_pm_init();
406
	omap2_clk_enable_autoidle_all();
407
}
408
#endif
409

410
#ifdef CONFIG_SOC_OMAP2430
411 412
void __init omap2430_init_early(void)
{
413 414 415 416 417
	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);
418 419
	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP2430_PRM_BASE));
	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP2430_CM_BASE), NULL);
420
	omap2xxx_check_revision();
421
	omap2xxx_prm_init();
422
	omap2xxx_cm_init();
423 424 425 426 427
	omap2xxx_voltagedomains_init();
	omap243x_powerdomains_init();
	omap243x_clockdomains_init();
	omap2430_hwmod_init();
	omap_hwmod_init_postsetup();
428 429
	omap_clk_soc_init = omap2430_dt_clk_init;
	rate_table = omap2430_rate_table;
430
}
431 432 433

void __init omap2430_init_late(void)
{
434
	omap_common_late_init();
435
	omap2_pm_init();
436
	omap2_clk_enable_autoidle_all();
437
}
438
#endif
439 440 441 442 443

/*
 * Currently only board-omap3beagle.c should call this because of the
 * same machine_id for 34xx and 36xx beagle.. Will get fixed with DT.
 */
444
#ifdef CONFIG_ARCH_OMAP3
445 446
void __init omap3_init_early(void)
{
447 448 449 450 451
	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);
452 453
	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP3430_PRM_BASE));
	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP3430_CM_BASE), NULL);
454 455
	omap3xxx_check_revision();
	omap3xxx_check_features();
456
	omap3xxx_prm_init();
457
	omap3xxx_cm_init();
458 459 460 461 462
	omap3xxx_voltagedomains_init();
	omap3xxx_powerdomains_init();
	omap3xxx_clockdomains_init();
	omap3xxx_hwmod_init();
	omap_hwmod_init_postsetup();
463
	omap_clk_soc_init = omap3xxx_clk_init;
464 465 466 467
}

void __init omap3430_init_early(void)
{
468
	omap3_init_early();
469 470
	if (of_have_populated_dt())
		omap_clk_soc_init = omap3430_dt_clk_init;
471 472 473 474
}

void __init omap35xx_init_early(void)
{
475
	omap3_init_early();
476 477
	if (of_have_populated_dt())
		omap_clk_soc_init = omap3430_dt_clk_init;
478 479 480 481
}

void __init omap3630_init_early(void)
{
482
	omap3_init_early();
483 484
	if (of_have_populated_dt())
		omap_clk_soc_init = omap3630_dt_clk_init;
485 486 487 488
}

void __init am35xx_init_early(void)
{
489
	omap3_init_early();
490 491
	if (of_have_populated_dt())
		omap_clk_soc_init = am35xx_dt_clk_init;
492 493
}

494
void __init ti81xx_init_early(void)
495
{
496 497 498 499
	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);
500 501
	omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(TI81XX_PRCM_BASE));
	omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(TI81XX_PRCM_BASE), NULL);
502 503
	omap3xxx_check_revision();
	ti81xx_check_features();
504 505 506 507 508
	omap3xxx_voltagedomains_init();
	omap3xxx_powerdomains_init();
	omap3xxx_clockdomains_init();
	omap3xxx_hwmod_init();
	omap_hwmod_init_postsetup();
509 510 511 512
	if (of_have_populated_dt())
		omap_clk_soc_init = ti81xx_dt_clk_init;
	else
		omap_clk_soc_init = omap3xxx_clk_init;
513
}
514 515 516

void __init omap3_init_late(void)
{
517
	omap_common_late_init();
518
	omap3_pm_init();
519
	omap2_clk_enable_autoidle_all();
520 521 522 523
}

void __init omap3430_init_late(void)
{
524
	omap_common_late_init();
525
	omap3_pm_init();
526
	omap2_clk_enable_autoidle_all();
527 528 529 530
}

void __init omap35xx_init_late(void)
{
531
	omap_common_late_init();
532
	omap3_pm_init();
533
	omap2_clk_enable_autoidle_all();
534 535 536 537
}

void __init omap3630_init_late(void)
{
538
	omap_common_late_init();
539
	omap3_pm_init();
540
	omap2_clk_enable_autoidle_all();
541 542 543 544
}

void __init am35xx_init_late(void)
{
545
	omap_common_late_init();
546
	omap3_pm_init();
547
	omap2_clk_enable_autoidle_all();
548 549 550 551
}

void __init ti81xx_init_late(void)
{
552
	omap_common_late_init();
553
	omap3_pm_init();
554
	omap2_clk_enable_autoidle_all();
555
}
556
#endif
557

558 559 560
#ifdef CONFIG_SOC_AM33XX
void __init am33xx_init_early(void)
{
561 562 563 564
	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);
565 566
	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);
567
	omap3xxx_check_revision();
568
	am33xx_check_features();
569
	am33xx_cm_init();
570
	am33xx_powerdomains_init();
571
	am33xx_clockdomains_init();
572 573
	am33xx_hwmod_init();
	omap_hwmod_init_postsetup();
574
	omap_clk_soc_init = am33xx_dt_clk_init;
575
}
576 577 578 579 580

void __init am33xx_init_late(void)
{
	omap_common_late_init();
}
581 582
#endif

A
Afzal Mohammed 已提交
583 584 585 586 587 588 589 590 591
#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 已提交
592 593
	omap_prm_base_init();
	omap_cm_base_init();
A
Afzal Mohammed 已提交
594
	omap3xxx_check_revision();
595
	am33xx_check_features();
596
	omap44xx_prm_init();
597
	omap4_cm_init();
A
Ambresh K 已提交
598 599 600 601
	am43xx_powerdomains_init();
	am43xx_clockdomains_init();
	am43xx_hwmod_init();
	omap_hwmod_init_postsetup();
602
	omap_l2_cache_init();
T
Tero Kristo 已提交
603
	omap_clk_soc_init = am43xx_dt_clk_init;
A
Afzal Mohammed 已提交
604
}
605 606 607 608 609

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

612
#ifdef CONFIG_ARCH_OMAP4
613 614
void __init omap4430_init_early(void)
{
615 616 617 618
	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));
619 620 621 622 623 624
	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();
625 626
	omap4xxx_check_revision();
	omap4xxx_check_features();
627
	omap4_cm_init();
628
	omap4_pm_init_early();
629
	omap44xx_prm_init();
630 631 632 633 634
	omap44xx_voltagedomains_init();
	omap44xx_powerdomains_init();
	omap44xx_clockdomains_init();
	omap44xx_hwmod_init();
	omap_hwmod_init_postsetup();
635
	omap_l2_cache_init();
636
	omap_clk_soc_init = omap4xxx_dt_clk_init;
637
}
638 639 640

void __init omap4430_init_late(void)
{
641
	omap_common_late_init();
642
	omap4_pm_init();
643
	omap2_clk_enable_autoidle_all();
644
}
645
#endif
646

647 648 649
#ifdef CONFIG_SOC_OMAP5
void __init omap5_init_early(void)
{
650 651 652 653
	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));
654 655 656 657
	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));
658
	omap4_pm_init_early();
659 660
	omap_prm_base_init();
	omap_cm_base_init();
661
	omap44xx_prm_init();
662
	omap5xxx_check_revision();
663
	omap4_cm_init();
664 665 666 667 668
	omap54xx_voltagedomains_init();
	omap54xx_powerdomains_init();
	omap54xx_clockdomains_init();
	omap54xx_hwmod_init();
	omap_hwmod_init_postsetup();
669
	omap_clk_soc_init = omap5xxx_dt_clk_init;
670
}
671 672 673 674

void __init omap5_init_late(void)
{
	omap_common_late_init();
675 676
	omap4_pm_init();
	omap2_clk_enable_autoidle_all();
677
}
678 679
#endif

680 681 682 683 684 685 686 687 688 689
#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));
690
	omap4_pm_init_early();
691 692
	omap_prm_base_init();
	omap_cm_base_init();
693
	omap44xx_prm_init();
694
	dra7xxx_check_revision();
695
	omap4_cm_init();
696 697 698 699
	dra7xx_powerdomains_init();
	dra7xx_clockdomains_init();
	dra7xx_hwmod_init();
	omap_hwmod_init_postsetup();
T
Tero Kristo 已提交
700
	omap_clk_soc_init = dra7xx_dt_clk_init;
701
}
702 703 704 705

void __init dra7xx_init_late(void)
{
	omap_common_late_init();
706 707
	omap4_pm_init();
	omap2_clk_enable_autoidle_all();
708
}
709 710 711
#endif


712
void __init omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0,
713 714
				      struct omap_sdrc_params *sdrc_cs1)
{
715 716
	omap_sram_init();

717
	if (cpu_is_omap24xx() || omap3_has_sdrc()) {
718 719 720
		omap2_sdrc_init(sdrc_cs0, sdrc_cs1);
		_omap2_init_reprogram_sdrc();
	}
721
}
722 723 724 725 726 727 728 729

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

	if (!omap_clk_soc_init)
		return 0;

730 731
	ti_clk_init_features();

732
	ret = of_prcm_init();
733 734 735 736 737 738 739 740 741 742
	if (ret)
		return ret;

	of_clk_init(NULL);

	ti_dt_clk_init_retry_clks();

	ti_dt_clockdomains_setup();

	ret = omap_clk_soc_init();
743 744 745

	return ret;
}