162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/arm/mach-omap2/io.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * OMAP2 I/O mapping code 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (C) 2005 Nokia Corporation 862306a36Sopenharmony_ci * Copyright (C) 2007-2009 Texas Instruments 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * Author: 1162306a36Sopenharmony_ci * Juha Yrjola <juha.yrjola@nokia.com> 1262306a36Sopenharmony_ci * Syed Khasim <x0khasim@ti.com> 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com> 1562306a36Sopenharmony_ci */ 1662306a36Sopenharmony_ci#include <linux/module.h> 1762306a36Sopenharmony_ci#include <linux/kernel.h> 1862306a36Sopenharmony_ci#include <linux/init.h> 1962306a36Sopenharmony_ci#include <linux/io.h> 2062306a36Sopenharmony_ci#include <linux/clk.h> 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include <asm/tlb.h> 2362306a36Sopenharmony_ci#include <asm/mach/map.h> 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#include <linux/omap-dma.h> 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#include "omap_hwmod.h" 2862306a36Sopenharmony_ci#include "soc.h" 2962306a36Sopenharmony_ci#include "iomap.h" 3062306a36Sopenharmony_ci#include "voltage.h" 3162306a36Sopenharmony_ci#include "powerdomain.h" 3262306a36Sopenharmony_ci#include "clockdomain.h" 3362306a36Sopenharmony_ci#include "common.h" 3462306a36Sopenharmony_ci#include "clock.h" 3562306a36Sopenharmony_ci#include "sdrc.h" 3662306a36Sopenharmony_ci#include "control.h" 3762306a36Sopenharmony_ci#include "sram.h" 3862306a36Sopenharmony_ci#include "cm2xxx.h" 3962306a36Sopenharmony_ci#include "cm3xxx.h" 4062306a36Sopenharmony_ci#include "cm33xx.h" 4162306a36Sopenharmony_ci#include "cm44xx.h" 4262306a36Sopenharmony_ci#include "prm.h" 4362306a36Sopenharmony_ci#include "cm.h" 4462306a36Sopenharmony_ci#include "prcm_mpu44xx.h" 4562306a36Sopenharmony_ci#include "prminst44xx.h" 4662306a36Sopenharmony_ci#include "prm2xxx.h" 4762306a36Sopenharmony_ci#include "prm3xxx.h" 4862306a36Sopenharmony_ci#include "prm33xx.h" 4962306a36Sopenharmony_ci#include "prm44xx.h" 5062306a36Sopenharmony_ci#include "opp2xxx.h" 5162306a36Sopenharmony_ci#include "omap-secure.h" 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci/* 5462306a36Sopenharmony_ci * omap_clk_soc_init: points to a function that does the SoC-specific 5562306a36Sopenharmony_ci * clock initializations 5662306a36Sopenharmony_ci */ 5762306a36Sopenharmony_cistatic int (*omap_clk_soc_init)(void); 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/* 6062306a36Sopenharmony_ci * The machine specific code may provide the extra mapping besides the 6162306a36Sopenharmony_ci * default mapping provided here. 6262306a36Sopenharmony_ci */ 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci#if defined(CONFIG_SOC_OMAP2420) || defined(CONFIG_SOC_OMAP2430) 6562306a36Sopenharmony_cistatic struct map_desc omap24xx_io_desc[] __initdata = { 6662306a36Sopenharmony_ci { 6762306a36Sopenharmony_ci .virtual = L3_24XX_VIRT, 6862306a36Sopenharmony_ci .pfn = __phys_to_pfn(L3_24XX_PHYS), 6962306a36Sopenharmony_ci .length = L3_24XX_SIZE, 7062306a36Sopenharmony_ci .type = MT_DEVICE 7162306a36Sopenharmony_ci }, 7262306a36Sopenharmony_ci { 7362306a36Sopenharmony_ci .virtual = L4_24XX_VIRT, 7462306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_24XX_PHYS), 7562306a36Sopenharmony_ci .length = L4_24XX_SIZE, 7662306a36Sopenharmony_ci .type = MT_DEVICE 7762306a36Sopenharmony_ci }, 7862306a36Sopenharmony_ci}; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci#ifdef CONFIG_SOC_OMAP2420 8162306a36Sopenharmony_cistatic struct map_desc omap242x_io_desc[] __initdata = { 8262306a36Sopenharmony_ci { 8362306a36Sopenharmony_ci .virtual = DSP_MEM_2420_VIRT, 8462306a36Sopenharmony_ci .pfn = __phys_to_pfn(DSP_MEM_2420_PHYS), 8562306a36Sopenharmony_ci .length = DSP_MEM_2420_SIZE, 8662306a36Sopenharmony_ci .type = MT_DEVICE 8762306a36Sopenharmony_ci }, 8862306a36Sopenharmony_ci { 8962306a36Sopenharmony_ci .virtual = DSP_IPI_2420_VIRT, 9062306a36Sopenharmony_ci .pfn = __phys_to_pfn(DSP_IPI_2420_PHYS), 9162306a36Sopenharmony_ci .length = DSP_IPI_2420_SIZE, 9262306a36Sopenharmony_ci .type = MT_DEVICE 9362306a36Sopenharmony_ci }, 9462306a36Sopenharmony_ci { 9562306a36Sopenharmony_ci .virtual = DSP_MMU_2420_VIRT, 9662306a36Sopenharmony_ci .pfn = __phys_to_pfn(DSP_MMU_2420_PHYS), 9762306a36Sopenharmony_ci .length = DSP_MMU_2420_SIZE, 9862306a36Sopenharmony_ci .type = MT_DEVICE 9962306a36Sopenharmony_ci }, 10062306a36Sopenharmony_ci}; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci#endif 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci#ifdef CONFIG_SOC_OMAP2430 10562306a36Sopenharmony_cistatic struct map_desc omap243x_io_desc[] __initdata = { 10662306a36Sopenharmony_ci { 10762306a36Sopenharmony_ci .virtual = L4_WK_243X_VIRT, 10862306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_WK_243X_PHYS), 10962306a36Sopenharmony_ci .length = L4_WK_243X_SIZE, 11062306a36Sopenharmony_ci .type = MT_DEVICE 11162306a36Sopenharmony_ci }, 11262306a36Sopenharmony_ci { 11362306a36Sopenharmony_ci .virtual = OMAP243X_GPMC_VIRT, 11462306a36Sopenharmony_ci .pfn = __phys_to_pfn(OMAP243X_GPMC_PHYS), 11562306a36Sopenharmony_ci .length = OMAP243X_GPMC_SIZE, 11662306a36Sopenharmony_ci .type = MT_DEVICE 11762306a36Sopenharmony_ci }, 11862306a36Sopenharmony_ci { 11962306a36Sopenharmony_ci .virtual = OMAP243X_SDRC_VIRT, 12062306a36Sopenharmony_ci .pfn = __phys_to_pfn(OMAP243X_SDRC_PHYS), 12162306a36Sopenharmony_ci .length = OMAP243X_SDRC_SIZE, 12262306a36Sopenharmony_ci .type = MT_DEVICE 12362306a36Sopenharmony_ci }, 12462306a36Sopenharmony_ci { 12562306a36Sopenharmony_ci .virtual = OMAP243X_SMS_VIRT, 12662306a36Sopenharmony_ci .pfn = __phys_to_pfn(OMAP243X_SMS_PHYS), 12762306a36Sopenharmony_ci .length = OMAP243X_SMS_SIZE, 12862306a36Sopenharmony_ci .type = MT_DEVICE 12962306a36Sopenharmony_ci }, 13062306a36Sopenharmony_ci}; 13162306a36Sopenharmony_ci#endif 13262306a36Sopenharmony_ci#endif 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP3 13562306a36Sopenharmony_cistatic struct map_desc omap34xx_io_desc[] __initdata = { 13662306a36Sopenharmony_ci { 13762306a36Sopenharmony_ci .virtual = L3_34XX_VIRT, 13862306a36Sopenharmony_ci .pfn = __phys_to_pfn(L3_34XX_PHYS), 13962306a36Sopenharmony_ci .length = L3_34XX_SIZE, 14062306a36Sopenharmony_ci .type = MT_DEVICE 14162306a36Sopenharmony_ci }, 14262306a36Sopenharmony_ci { 14362306a36Sopenharmony_ci .virtual = L4_34XX_VIRT, 14462306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_34XX_PHYS), 14562306a36Sopenharmony_ci .length = L4_34XX_SIZE, 14662306a36Sopenharmony_ci .type = MT_DEVICE 14762306a36Sopenharmony_ci }, 14862306a36Sopenharmony_ci { 14962306a36Sopenharmony_ci .virtual = OMAP34XX_GPMC_VIRT, 15062306a36Sopenharmony_ci .pfn = __phys_to_pfn(OMAP34XX_GPMC_PHYS), 15162306a36Sopenharmony_ci .length = OMAP34XX_GPMC_SIZE, 15262306a36Sopenharmony_ci .type = MT_DEVICE 15362306a36Sopenharmony_ci }, 15462306a36Sopenharmony_ci { 15562306a36Sopenharmony_ci .virtual = OMAP343X_SMS_VIRT, 15662306a36Sopenharmony_ci .pfn = __phys_to_pfn(OMAP343X_SMS_PHYS), 15762306a36Sopenharmony_ci .length = OMAP343X_SMS_SIZE, 15862306a36Sopenharmony_ci .type = MT_DEVICE 15962306a36Sopenharmony_ci }, 16062306a36Sopenharmony_ci { 16162306a36Sopenharmony_ci .virtual = OMAP343X_SDRC_VIRT, 16262306a36Sopenharmony_ci .pfn = __phys_to_pfn(OMAP343X_SDRC_PHYS), 16362306a36Sopenharmony_ci .length = OMAP343X_SDRC_SIZE, 16462306a36Sopenharmony_ci .type = MT_DEVICE 16562306a36Sopenharmony_ci }, 16662306a36Sopenharmony_ci { 16762306a36Sopenharmony_ci .virtual = L4_PER_34XX_VIRT, 16862306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_PER_34XX_PHYS), 16962306a36Sopenharmony_ci .length = L4_PER_34XX_SIZE, 17062306a36Sopenharmony_ci .type = MT_DEVICE 17162306a36Sopenharmony_ci }, 17262306a36Sopenharmony_ci { 17362306a36Sopenharmony_ci .virtual = L4_EMU_34XX_VIRT, 17462306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_EMU_34XX_PHYS), 17562306a36Sopenharmony_ci .length = L4_EMU_34XX_SIZE, 17662306a36Sopenharmony_ci .type = MT_DEVICE 17762306a36Sopenharmony_ci }, 17862306a36Sopenharmony_ci}; 17962306a36Sopenharmony_ci#endif 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci#ifdef CONFIG_SOC_TI81XX 18262306a36Sopenharmony_cistatic struct map_desc omapti81xx_io_desc[] __initdata = { 18362306a36Sopenharmony_ci { 18462306a36Sopenharmony_ci .virtual = L4_34XX_VIRT, 18562306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_34XX_PHYS), 18662306a36Sopenharmony_ci .length = L4_34XX_SIZE, 18762306a36Sopenharmony_ci .type = MT_DEVICE 18862306a36Sopenharmony_ci } 18962306a36Sopenharmony_ci}; 19062306a36Sopenharmony_ci#endif 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci#if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX) 19362306a36Sopenharmony_cistatic struct map_desc omapam33xx_io_desc[] __initdata = { 19462306a36Sopenharmony_ci { 19562306a36Sopenharmony_ci .virtual = L4_34XX_VIRT, 19662306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_34XX_PHYS), 19762306a36Sopenharmony_ci .length = L4_34XX_SIZE, 19862306a36Sopenharmony_ci .type = MT_DEVICE 19962306a36Sopenharmony_ci }, 20062306a36Sopenharmony_ci { 20162306a36Sopenharmony_ci .virtual = L4_WK_AM33XX_VIRT, 20262306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_WK_AM33XX_PHYS), 20362306a36Sopenharmony_ci .length = L4_WK_AM33XX_SIZE, 20462306a36Sopenharmony_ci .type = MT_DEVICE 20562306a36Sopenharmony_ci } 20662306a36Sopenharmony_ci}; 20762306a36Sopenharmony_ci#endif 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP4 21062306a36Sopenharmony_cistatic struct map_desc omap44xx_io_desc[] __initdata = { 21162306a36Sopenharmony_ci { 21262306a36Sopenharmony_ci .virtual = L3_44XX_VIRT, 21362306a36Sopenharmony_ci .pfn = __phys_to_pfn(L3_44XX_PHYS), 21462306a36Sopenharmony_ci .length = L3_44XX_SIZE, 21562306a36Sopenharmony_ci .type = MT_DEVICE, 21662306a36Sopenharmony_ci }, 21762306a36Sopenharmony_ci { 21862306a36Sopenharmony_ci .virtual = L4_44XX_VIRT, 21962306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_44XX_PHYS), 22062306a36Sopenharmony_ci .length = L4_44XX_SIZE, 22162306a36Sopenharmony_ci .type = MT_DEVICE, 22262306a36Sopenharmony_ci }, 22362306a36Sopenharmony_ci { 22462306a36Sopenharmony_ci .virtual = L4_PER_44XX_VIRT, 22562306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_PER_44XX_PHYS), 22662306a36Sopenharmony_ci .length = L4_PER_44XX_SIZE, 22762306a36Sopenharmony_ci .type = MT_DEVICE, 22862306a36Sopenharmony_ci }, 22962306a36Sopenharmony_ci}; 23062306a36Sopenharmony_ci#endif 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci#ifdef CONFIG_SOC_OMAP5 23362306a36Sopenharmony_cistatic struct map_desc omap54xx_io_desc[] __initdata = { 23462306a36Sopenharmony_ci { 23562306a36Sopenharmony_ci .virtual = L3_54XX_VIRT, 23662306a36Sopenharmony_ci .pfn = __phys_to_pfn(L3_54XX_PHYS), 23762306a36Sopenharmony_ci .length = L3_54XX_SIZE, 23862306a36Sopenharmony_ci .type = MT_DEVICE, 23962306a36Sopenharmony_ci }, 24062306a36Sopenharmony_ci { 24162306a36Sopenharmony_ci .virtual = L4_54XX_VIRT, 24262306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_54XX_PHYS), 24362306a36Sopenharmony_ci .length = L4_54XX_SIZE, 24462306a36Sopenharmony_ci .type = MT_DEVICE, 24562306a36Sopenharmony_ci }, 24662306a36Sopenharmony_ci { 24762306a36Sopenharmony_ci .virtual = L4_WK_54XX_VIRT, 24862306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_WK_54XX_PHYS), 24962306a36Sopenharmony_ci .length = L4_WK_54XX_SIZE, 25062306a36Sopenharmony_ci .type = MT_DEVICE, 25162306a36Sopenharmony_ci }, 25262306a36Sopenharmony_ci { 25362306a36Sopenharmony_ci .virtual = L4_PER_54XX_VIRT, 25462306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_PER_54XX_PHYS), 25562306a36Sopenharmony_ci .length = L4_PER_54XX_SIZE, 25662306a36Sopenharmony_ci .type = MT_DEVICE, 25762306a36Sopenharmony_ci }, 25862306a36Sopenharmony_ci}; 25962306a36Sopenharmony_ci#endif 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci#ifdef CONFIG_SOC_DRA7XX 26262306a36Sopenharmony_cistatic struct map_desc dra7xx_io_desc[] __initdata = { 26362306a36Sopenharmony_ci { 26462306a36Sopenharmony_ci .virtual = L4_CFG_MPU_DRA7XX_VIRT, 26562306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_CFG_MPU_DRA7XX_PHYS), 26662306a36Sopenharmony_ci .length = L4_CFG_MPU_DRA7XX_SIZE, 26762306a36Sopenharmony_ci .type = MT_DEVICE, 26862306a36Sopenharmony_ci }, 26962306a36Sopenharmony_ci { 27062306a36Sopenharmony_ci .virtual = L3_MAIN_SN_DRA7XX_VIRT, 27162306a36Sopenharmony_ci .pfn = __phys_to_pfn(L3_MAIN_SN_DRA7XX_PHYS), 27262306a36Sopenharmony_ci .length = L3_MAIN_SN_DRA7XX_SIZE, 27362306a36Sopenharmony_ci .type = MT_DEVICE, 27462306a36Sopenharmony_ci }, 27562306a36Sopenharmony_ci { 27662306a36Sopenharmony_ci .virtual = L4_PER1_DRA7XX_VIRT, 27762306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_PER1_DRA7XX_PHYS), 27862306a36Sopenharmony_ci .length = L4_PER1_DRA7XX_SIZE, 27962306a36Sopenharmony_ci .type = MT_DEVICE, 28062306a36Sopenharmony_ci }, 28162306a36Sopenharmony_ci { 28262306a36Sopenharmony_ci .virtual = L4_PER2_DRA7XX_VIRT, 28362306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_PER2_DRA7XX_PHYS), 28462306a36Sopenharmony_ci .length = L4_PER2_DRA7XX_SIZE, 28562306a36Sopenharmony_ci .type = MT_DEVICE, 28662306a36Sopenharmony_ci }, 28762306a36Sopenharmony_ci { 28862306a36Sopenharmony_ci .virtual = L4_PER3_DRA7XX_VIRT, 28962306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_PER3_DRA7XX_PHYS), 29062306a36Sopenharmony_ci .length = L4_PER3_DRA7XX_SIZE, 29162306a36Sopenharmony_ci .type = MT_DEVICE, 29262306a36Sopenharmony_ci }, 29362306a36Sopenharmony_ci { 29462306a36Sopenharmony_ci .virtual = L4_CFG_DRA7XX_VIRT, 29562306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_CFG_DRA7XX_PHYS), 29662306a36Sopenharmony_ci .length = L4_CFG_DRA7XX_SIZE, 29762306a36Sopenharmony_ci .type = MT_DEVICE, 29862306a36Sopenharmony_ci }, 29962306a36Sopenharmony_ci { 30062306a36Sopenharmony_ci .virtual = L4_WKUP_DRA7XX_VIRT, 30162306a36Sopenharmony_ci .pfn = __phys_to_pfn(L4_WKUP_DRA7XX_PHYS), 30262306a36Sopenharmony_ci .length = L4_WKUP_DRA7XX_SIZE, 30362306a36Sopenharmony_ci .type = MT_DEVICE, 30462306a36Sopenharmony_ci }, 30562306a36Sopenharmony_ci}; 30662306a36Sopenharmony_ci#endif 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci#ifdef CONFIG_SOC_OMAP2420 30962306a36Sopenharmony_civoid __init omap242x_map_io(void) 31062306a36Sopenharmony_ci{ 31162306a36Sopenharmony_ci iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc)); 31262306a36Sopenharmony_ci iotable_init(omap242x_io_desc, ARRAY_SIZE(omap242x_io_desc)); 31362306a36Sopenharmony_ci} 31462306a36Sopenharmony_ci#endif 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci#ifdef CONFIG_SOC_OMAP2430 31762306a36Sopenharmony_civoid __init omap243x_map_io(void) 31862306a36Sopenharmony_ci{ 31962306a36Sopenharmony_ci iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc)); 32062306a36Sopenharmony_ci iotable_init(omap243x_io_desc, ARRAY_SIZE(omap243x_io_desc)); 32162306a36Sopenharmony_ci} 32262306a36Sopenharmony_ci#endif 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP3 32562306a36Sopenharmony_civoid __init omap3_map_io(void) 32662306a36Sopenharmony_ci{ 32762306a36Sopenharmony_ci iotable_init(omap34xx_io_desc, ARRAY_SIZE(omap34xx_io_desc)); 32862306a36Sopenharmony_ci} 32962306a36Sopenharmony_ci#endif 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci#ifdef CONFIG_SOC_TI81XX 33262306a36Sopenharmony_civoid __init ti81xx_map_io(void) 33362306a36Sopenharmony_ci{ 33462306a36Sopenharmony_ci iotable_init(omapti81xx_io_desc, ARRAY_SIZE(omapti81xx_io_desc)); 33562306a36Sopenharmony_ci} 33662306a36Sopenharmony_ci#endif 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci#if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX) 33962306a36Sopenharmony_civoid __init am33xx_map_io(void) 34062306a36Sopenharmony_ci{ 34162306a36Sopenharmony_ci iotable_init(omapam33xx_io_desc, ARRAY_SIZE(omapam33xx_io_desc)); 34262306a36Sopenharmony_ci} 34362306a36Sopenharmony_ci#endif 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP4 34662306a36Sopenharmony_civoid __init omap4_map_io(void) 34762306a36Sopenharmony_ci{ 34862306a36Sopenharmony_ci iotable_init(omap44xx_io_desc, ARRAY_SIZE(omap44xx_io_desc)); 34962306a36Sopenharmony_ci omap_barriers_init(); 35062306a36Sopenharmony_ci} 35162306a36Sopenharmony_ci#endif 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci#ifdef CONFIG_SOC_OMAP5 35462306a36Sopenharmony_civoid __init omap5_map_io(void) 35562306a36Sopenharmony_ci{ 35662306a36Sopenharmony_ci iotable_init(omap54xx_io_desc, ARRAY_SIZE(omap54xx_io_desc)); 35762306a36Sopenharmony_ci omap_barriers_init(); 35862306a36Sopenharmony_ci} 35962306a36Sopenharmony_ci#endif 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci#ifdef CONFIG_SOC_DRA7XX 36262306a36Sopenharmony_civoid __init dra7xx_map_io(void) 36362306a36Sopenharmony_ci{ 36462306a36Sopenharmony_ci iotable_init(dra7xx_io_desc, ARRAY_SIZE(dra7xx_io_desc)); 36562306a36Sopenharmony_ci omap_barriers_init(); 36662306a36Sopenharmony_ci} 36762306a36Sopenharmony_ci#endif 36862306a36Sopenharmony_ci/* 36962306a36Sopenharmony_ci * omap2_init_reprogram_sdrc - reprogram SDRC timing parameters 37062306a36Sopenharmony_ci * 37162306a36Sopenharmony_ci * Sets the CORE DPLL3 M2 divider to the same value that it's at 37262306a36Sopenharmony_ci * currently. This has the effect of setting the SDRC SDRAM AC timing 37362306a36Sopenharmony_ci * registers to the values currently defined by the kernel. Currently 37462306a36Sopenharmony_ci * only defined for OMAP3; will return 0 if called on OMAP2. Returns 37562306a36Sopenharmony_ci * -EINVAL if the dpll3_m2_ck cannot be found, 0 if called on OMAP2, 37662306a36Sopenharmony_ci * or passes along the return value of clk_set_rate(). 37762306a36Sopenharmony_ci */ 37862306a36Sopenharmony_cistatic int __init _omap2_init_reprogram_sdrc(void) 37962306a36Sopenharmony_ci{ 38062306a36Sopenharmony_ci struct clk *dpll3_m2_ck; 38162306a36Sopenharmony_ci int v = -EINVAL; 38262306a36Sopenharmony_ci long rate; 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci if (!cpu_is_omap34xx()) 38562306a36Sopenharmony_ci return 0; 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci dpll3_m2_ck = clk_get(NULL, "dpll3_m2_ck"); 38862306a36Sopenharmony_ci if (IS_ERR(dpll3_m2_ck)) 38962306a36Sopenharmony_ci return -EINVAL; 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci rate = clk_get_rate(dpll3_m2_ck); 39262306a36Sopenharmony_ci pr_info("Reprogramming SDRC clock to %ld Hz\n", rate); 39362306a36Sopenharmony_ci v = clk_set_rate(dpll3_m2_ck, rate); 39462306a36Sopenharmony_ci if (v) 39562306a36Sopenharmony_ci pr_err("dpll3_m2_clk rate change failed: %d\n", v); 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci clk_put(dpll3_m2_ck); 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci return v; 40062306a36Sopenharmony_ci} 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci#ifdef CONFIG_OMAP_HWMOD 40362306a36Sopenharmony_cistatic int _set_hwmod_postsetup_state(struct omap_hwmod *oh, void *data) 40462306a36Sopenharmony_ci{ 40562306a36Sopenharmony_ci return omap_hwmod_set_postsetup_state(oh, *(u8 *)data); 40662306a36Sopenharmony_ci} 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_cistatic void __init __maybe_unused omap_hwmod_init_postsetup(void) 40962306a36Sopenharmony_ci{ 41062306a36Sopenharmony_ci u8 postsetup_state = _HWMOD_STATE_DEFAULT; 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci /* Set the default postsetup state for all hwmods */ 41362306a36Sopenharmony_ci omap_hwmod_for_each(_set_hwmod_postsetup_state, &postsetup_state); 41462306a36Sopenharmony_ci} 41562306a36Sopenharmony_ci#else 41662306a36Sopenharmony_cistatic inline void omap_hwmod_init_postsetup(void) 41762306a36Sopenharmony_ci{ 41862306a36Sopenharmony_ci} 41962306a36Sopenharmony_ci#endif 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_ci#ifdef CONFIG_SOC_OMAP2420 42262306a36Sopenharmony_civoid __init omap2420_init_early(void) 42362306a36Sopenharmony_ci{ 42462306a36Sopenharmony_ci omap2_set_globals_tap(OMAP242X_CLASS, OMAP2_L4_IO_ADDRESS(0x48014000)); 42562306a36Sopenharmony_ci omap2_set_globals_sdrc(OMAP2_L3_IO_ADDRESS(OMAP2420_SDRC_BASE), 42662306a36Sopenharmony_ci OMAP2_L3_IO_ADDRESS(OMAP2420_SMS_BASE)); 42762306a36Sopenharmony_ci omap2_control_base_init(); 42862306a36Sopenharmony_ci omap2xxx_check_revision(); 42962306a36Sopenharmony_ci omap2_prcm_base_init(); 43062306a36Sopenharmony_ci omap2xxx_voltagedomains_init(); 43162306a36Sopenharmony_ci omap242x_powerdomains_init(); 43262306a36Sopenharmony_ci omap242x_clockdomains_init(); 43362306a36Sopenharmony_ci omap2420_hwmod_init(); 43462306a36Sopenharmony_ci omap_hwmod_init_postsetup(); 43562306a36Sopenharmony_ci omap_clk_soc_init = omap2420_dt_clk_init; 43662306a36Sopenharmony_ci rate_table = omap2420_rate_table; 43762306a36Sopenharmony_ci} 43862306a36Sopenharmony_ci#endif 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci#ifdef CONFIG_SOC_OMAP2430 44162306a36Sopenharmony_civoid __init omap2430_init_early(void) 44262306a36Sopenharmony_ci{ 44362306a36Sopenharmony_ci omap2_set_globals_tap(OMAP243X_CLASS, OMAP2_L4_IO_ADDRESS(0x4900a000)); 44462306a36Sopenharmony_ci omap2_set_globals_sdrc(OMAP2_L3_IO_ADDRESS(OMAP243X_SDRC_BASE), 44562306a36Sopenharmony_ci OMAP2_L3_IO_ADDRESS(OMAP243X_SMS_BASE)); 44662306a36Sopenharmony_ci omap2_control_base_init(); 44762306a36Sopenharmony_ci omap2xxx_check_revision(); 44862306a36Sopenharmony_ci omap2_prcm_base_init(); 44962306a36Sopenharmony_ci omap2xxx_voltagedomains_init(); 45062306a36Sopenharmony_ci omap243x_powerdomains_init(); 45162306a36Sopenharmony_ci omap243x_clockdomains_init(); 45262306a36Sopenharmony_ci omap2430_hwmod_init(); 45362306a36Sopenharmony_ci omap_hwmod_init_postsetup(); 45462306a36Sopenharmony_ci omap_clk_soc_init = omap2430_dt_clk_init; 45562306a36Sopenharmony_ci rate_table = omap2430_rate_table; 45662306a36Sopenharmony_ci} 45762306a36Sopenharmony_ci#endif 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_ci/* 46062306a36Sopenharmony_ci * Currently only board-omap3beagle.c should call this because of the 46162306a36Sopenharmony_ci * same machine_id for 34xx and 36xx beagle.. Will get fixed with DT. 46262306a36Sopenharmony_ci */ 46362306a36Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP3 46462306a36Sopenharmony_cistatic void __init omap3_init_early(void) 46562306a36Sopenharmony_ci{ 46662306a36Sopenharmony_ci omap2_set_globals_tap(OMAP343X_CLASS, OMAP2_L4_IO_ADDRESS(0x4830A000)); 46762306a36Sopenharmony_ci omap2_set_globals_sdrc(OMAP2_L3_IO_ADDRESS(OMAP343X_SDRC_BASE), 46862306a36Sopenharmony_ci OMAP2_L3_IO_ADDRESS(OMAP343X_SMS_BASE)); 46962306a36Sopenharmony_ci omap2_control_base_init(); 47062306a36Sopenharmony_ci omap3xxx_check_revision(); 47162306a36Sopenharmony_ci omap3xxx_check_features(); 47262306a36Sopenharmony_ci omap2_prcm_base_init(); 47362306a36Sopenharmony_ci omap3xxx_voltagedomains_init(); 47462306a36Sopenharmony_ci omap3xxx_powerdomains_init(); 47562306a36Sopenharmony_ci omap3xxx_clockdomains_init(); 47662306a36Sopenharmony_ci omap3xxx_hwmod_init(); 47762306a36Sopenharmony_ci omap_hwmod_init_postsetup(); 47862306a36Sopenharmony_ci omap_secure_init(); 47962306a36Sopenharmony_ci} 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_civoid __init omap3430_init_early(void) 48262306a36Sopenharmony_ci{ 48362306a36Sopenharmony_ci omap3_init_early(); 48462306a36Sopenharmony_ci omap_clk_soc_init = omap3430_dt_clk_init; 48562306a36Sopenharmony_ci} 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_civoid __init omap3630_init_early(void) 48862306a36Sopenharmony_ci{ 48962306a36Sopenharmony_ci omap3_init_early(); 49062306a36Sopenharmony_ci omap_clk_soc_init = omap3630_dt_clk_init; 49162306a36Sopenharmony_ci} 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_civoid __init am35xx_init_early(void) 49462306a36Sopenharmony_ci{ 49562306a36Sopenharmony_ci omap3_init_early(); 49662306a36Sopenharmony_ci omap_clk_soc_init = am35xx_dt_clk_init; 49762306a36Sopenharmony_ci} 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_civoid __init omap3_init_late(void) 50062306a36Sopenharmony_ci{ 50162306a36Sopenharmony_ci omap_pm_soc_init = omap3_pm_init; 50262306a36Sopenharmony_ci} 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_civoid __init ti81xx_init_late(void) 50562306a36Sopenharmony_ci{ 50662306a36Sopenharmony_ci omap_pm_soc_init = omap_pm_nop_init; 50762306a36Sopenharmony_ci} 50862306a36Sopenharmony_ci#endif 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ci#ifdef CONFIG_SOC_TI81XX 51162306a36Sopenharmony_civoid __init ti814x_init_early(void) 51262306a36Sopenharmony_ci{ 51362306a36Sopenharmony_ci omap2_set_globals_tap(TI814X_CLASS, 51462306a36Sopenharmony_ci OMAP2_L4_IO_ADDRESS(TI81XX_TAP_BASE)); 51562306a36Sopenharmony_ci omap2_control_base_init(); 51662306a36Sopenharmony_ci omap3xxx_check_revision(); 51762306a36Sopenharmony_ci ti81xx_check_features(); 51862306a36Sopenharmony_ci omap2_prcm_base_init(); 51962306a36Sopenharmony_ci omap3xxx_voltagedomains_init(); 52062306a36Sopenharmony_ci omap3xxx_powerdomains_init(); 52162306a36Sopenharmony_ci ti814x_clockdomains_init(); 52262306a36Sopenharmony_ci dm814x_hwmod_init(); 52362306a36Sopenharmony_ci omap_hwmod_init_postsetup(); 52462306a36Sopenharmony_ci omap_clk_soc_init = dm814x_dt_clk_init; 52562306a36Sopenharmony_ci omap_secure_init(); 52662306a36Sopenharmony_ci} 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_civoid __init ti816x_init_early(void) 52962306a36Sopenharmony_ci{ 53062306a36Sopenharmony_ci omap2_set_globals_tap(TI816X_CLASS, 53162306a36Sopenharmony_ci OMAP2_L4_IO_ADDRESS(TI81XX_TAP_BASE)); 53262306a36Sopenharmony_ci omap2_control_base_init(); 53362306a36Sopenharmony_ci omap3xxx_check_revision(); 53462306a36Sopenharmony_ci ti81xx_check_features(); 53562306a36Sopenharmony_ci omap2_prcm_base_init(); 53662306a36Sopenharmony_ci omap3xxx_voltagedomains_init(); 53762306a36Sopenharmony_ci omap3xxx_powerdomains_init(); 53862306a36Sopenharmony_ci ti816x_clockdomains_init(); 53962306a36Sopenharmony_ci dm816x_hwmod_init(); 54062306a36Sopenharmony_ci omap_hwmod_init_postsetup(); 54162306a36Sopenharmony_ci omap_clk_soc_init = dm816x_dt_clk_init; 54262306a36Sopenharmony_ci omap_secure_init(); 54362306a36Sopenharmony_ci} 54462306a36Sopenharmony_ci#endif 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_ci#ifdef CONFIG_SOC_AM33XX 54762306a36Sopenharmony_civoid __init am33xx_init_early(void) 54862306a36Sopenharmony_ci{ 54962306a36Sopenharmony_ci omap2_set_globals_tap(AM335X_CLASS, 55062306a36Sopenharmony_ci AM33XX_L4_WK_IO_ADDRESS(AM33XX_TAP_BASE)); 55162306a36Sopenharmony_ci omap2_control_base_init(); 55262306a36Sopenharmony_ci omap3xxx_check_revision(); 55362306a36Sopenharmony_ci am33xx_check_features(); 55462306a36Sopenharmony_ci omap2_prcm_base_init(); 55562306a36Sopenharmony_ci am33xx_powerdomains_init(); 55662306a36Sopenharmony_ci am33xx_clockdomains_init(); 55762306a36Sopenharmony_ci omap_clk_soc_init = am33xx_dt_clk_init; 55862306a36Sopenharmony_ci omap_secure_init(); 55962306a36Sopenharmony_ci} 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_civoid __init am33xx_init_late(void) 56262306a36Sopenharmony_ci{ 56362306a36Sopenharmony_ci omap_pm_soc_init = amx3_common_pm_init; 56462306a36Sopenharmony_ci} 56562306a36Sopenharmony_ci#endif 56662306a36Sopenharmony_ci 56762306a36Sopenharmony_ci#ifdef CONFIG_SOC_AM43XX 56862306a36Sopenharmony_civoid __init am43xx_init_early(void) 56962306a36Sopenharmony_ci{ 57062306a36Sopenharmony_ci omap2_set_globals_tap(AM335X_CLASS, 57162306a36Sopenharmony_ci AM33XX_L4_WK_IO_ADDRESS(AM33XX_TAP_BASE)); 57262306a36Sopenharmony_ci omap2_control_base_init(); 57362306a36Sopenharmony_ci omap3xxx_check_revision(); 57462306a36Sopenharmony_ci am33xx_check_features(); 57562306a36Sopenharmony_ci omap2_prcm_base_init(); 57662306a36Sopenharmony_ci am43xx_powerdomains_init(); 57762306a36Sopenharmony_ci am43xx_clockdomains_init(); 57862306a36Sopenharmony_ci omap_l2_cache_init(); 57962306a36Sopenharmony_ci omap_clk_soc_init = am43xx_dt_clk_init; 58062306a36Sopenharmony_ci omap_secure_init(); 58162306a36Sopenharmony_ci} 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_civoid __init am43xx_init_late(void) 58462306a36Sopenharmony_ci{ 58562306a36Sopenharmony_ci omap_pm_soc_init = amx3_common_pm_init; 58662306a36Sopenharmony_ci} 58762306a36Sopenharmony_ci#endif 58862306a36Sopenharmony_ci 58962306a36Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP4 59062306a36Sopenharmony_civoid __init omap4430_init_early(void) 59162306a36Sopenharmony_ci{ 59262306a36Sopenharmony_ci omap2_set_globals_tap(OMAP443X_CLASS, 59362306a36Sopenharmony_ci OMAP2_L4_IO_ADDRESS(OMAP443X_SCM_BASE)); 59462306a36Sopenharmony_ci omap2_set_globals_prcm_mpu(OMAP2_L4_IO_ADDRESS(OMAP4430_PRCM_MPU_BASE)); 59562306a36Sopenharmony_ci omap2_control_base_init(); 59662306a36Sopenharmony_ci omap4xxx_check_revision(); 59762306a36Sopenharmony_ci omap4xxx_check_features(); 59862306a36Sopenharmony_ci omap2_prcm_base_init(); 59962306a36Sopenharmony_ci omap4_sar_ram_init(); 60062306a36Sopenharmony_ci omap4_mpuss_early_init(); 60162306a36Sopenharmony_ci omap4_pm_init_early(); 60262306a36Sopenharmony_ci omap44xx_voltagedomains_init(); 60362306a36Sopenharmony_ci omap44xx_powerdomains_init(); 60462306a36Sopenharmony_ci omap44xx_clockdomains_init(); 60562306a36Sopenharmony_ci omap_l2_cache_init(); 60662306a36Sopenharmony_ci omap_clk_soc_init = omap4xxx_dt_clk_init; 60762306a36Sopenharmony_ci omap_secure_init(); 60862306a36Sopenharmony_ci} 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_civoid __init omap4430_init_late(void) 61162306a36Sopenharmony_ci{ 61262306a36Sopenharmony_ci omap_pm_soc_init = omap4_pm_init; 61362306a36Sopenharmony_ci} 61462306a36Sopenharmony_ci#endif 61562306a36Sopenharmony_ci 61662306a36Sopenharmony_ci#ifdef CONFIG_SOC_OMAP5 61762306a36Sopenharmony_civoid __init omap5_init_early(void) 61862306a36Sopenharmony_ci{ 61962306a36Sopenharmony_ci omap2_set_globals_tap(OMAP54XX_CLASS, 62062306a36Sopenharmony_ci OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE)); 62162306a36Sopenharmony_ci omap2_set_globals_prcm_mpu(OMAP2_L4_IO_ADDRESS(OMAP54XX_PRCM_MPU_BASE)); 62262306a36Sopenharmony_ci omap2_control_base_init(); 62362306a36Sopenharmony_ci omap2_prcm_base_init(); 62462306a36Sopenharmony_ci omap5xxx_check_revision(); 62562306a36Sopenharmony_ci omap4_sar_ram_init(); 62662306a36Sopenharmony_ci omap4_mpuss_early_init(); 62762306a36Sopenharmony_ci omap4_pm_init_early(); 62862306a36Sopenharmony_ci omap54xx_voltagedomains_init(); 62962306a36Sopenharmony_ci omap54xx_powerdomains_init(); 63062306a36Sopenharmony_ci omap54xx_clockdomains_init(); 63162306a36Sopenharmony_ci omap_clk_soc_init = omap5xxx_dt_clk_init; 63262306a36Sopenharmony_ci omap_secure_init(); 63362306a36Sopenharmony_ci} 63462306a36Sopenharmony_ci 63562306a36Sopenharmony_civoid __init omap5_init_late(void) 63662306a36Sopenharmony_ci{ 63762306a36Sopenharmony_ci omap_pm_soc_init = omap4_pm_init; 63862306a36Sopenharmony_ci} 63962306a36Sopenharmony_ci#endif 64062306a36Sopenharmony_ci 64162306a36Sopenharmony_ci#ifdef CONFIG_SOC_DRA7XX 64262306a36Sopenharmony_civoid __init dra7xx_init_early(void) 64362306a36Sopenharmony_ci{ 64462306a36Sopenharmony_ci omap2_set_globals_tap(DRA7XX_CLASS, 64562306a36Sopenharmony_ci OMAP2_L4_IO_ADDRESS(DRA7XX_TAP_BASE)); 64662306a36Sopenharmony_ci omap2_set_globals_prcm_mpu(OMAP2_L4_IO_ADDRESS(OMAP54XX_PRCM_MPU_BASE)); 64762306a36Sopenharmony_ci omap2_control_base_init(); 64862306a36Sopenharmony_ci omap4_pm_init_early(); 64962306a36Sopenharmony_ci omap2_prcm_base_init(); 65062306a36Sopenharmony_ci dra7xxx_check_revision(); 65162306a36Sopenharmony_ci dra7xx_powerdomains_init(); 65262306a36Sopenharmony_ci dra7xx_clockdomains_init(); 65362306a36Sopenharmony_ci omap_clk_soc_init = dra7xx_dt_clk_init; 65462306a36Sopenharmony_ci omap_secure_init(); 65562306a36Sopenharmony_ci} 65662306a36Sopenharmony_ci 65762306a36Sopenharmony_civoid __init dra7xx_init_late(void) 65862306a36Sopenharmony_ci{ 65962306a36Sopenharmony_ci omap_pm_soc_init = omap4_pm_init; 66062306a36Sopenharmony_ci} 66162306a36Sopenharmony_ci#endif 66262306a36Sopenharmony_ci 66362306a36Sopenharmony_ci 66462306a36Sopenharmony_civoid __init omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0, 66562306a36Sopenharmony_ci struct omap_sdrc_params *sdrc_cs1) 66662306a36Sopenharmony_ci{ 66762306a36Sopenharmony_ci omap_sram_init(); 66862306a36Sopenharmony_ci 66962306a36Sopenharmony_ci if (cpu_is_omap24xx() || omap3_has_sdrc()) { 67062306a36Sopenharmony_ci omap2_sdrc_init(sdrc_cs0, sdrc_cs1); 67162306a36Sopenharmony_ci _omap2_init_reprogram_sdrc(); 67262306a36Sopenharmony_ci } 67362306a36Sopenharmony_ci} 67462306a36Sopenharmony_ci 67562306a36Sopenharmony_ciint __init omap_clk_init(void) 67662306a36Sopenharmony_ci{ 67762306a36Sopenharmony_ci int ret = 0; 67862306a36Sopenharmony_ci 67962306a36Sopenharmony_ci if (!omap_clk_soc_init) 68062306a36Sopenharmony_ci return 0; 68162306a36Sopenharmony_ci 68262306a36Sopenharmony_ci ti_clk_init_features(); 68362306a36Sopenharmony_ci 68462306a36Sopenharmony_ci omap2_clk_setup_ll_ops(); 68562306a36Sopenharmony_ci 68662306a36Sopenharmony_ci ret = omap_control_init(); 68762306a36Sopenharmony_ci if (ret) 68862306a36Sopenharmony_ci return ret; 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ci ret = omap_prcm_init(); 69162306a36Sopenharmony_ci if (ret) 69262306a36Sopenharmony_ci return ret; 69362306a36Sopenharmony_ci 69462306a36Sopenharmony_ci of_clk_init(NULL); 69562306a36Sopenharmony_ci 69662306a36Sopenharmony_ci ti_dt_clk_init_retry_clks(); 69762306a36Sopenharmony_ci 69862306a36Sopenharmony_ci ti_dt_clockdomains_setup(); 69962306a36Sopenharmony_ci 70062306a36Sopenharmony_ci ret = omap_clk_soc_init(); 70162306a36Sopenharmony_ci 70262306a36Sopenharmony_ci return ret; 70362306a36Sopenharmony_ci} 704