18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * OMAP SRAM detection and management 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2005 Nokia Corporation 68c2ecf20Sopenharmony_ci * Written by Tony Lindgren <tony@atomide.com> 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/module.h> 108c2ecf20Sopenharmony_ci#include <linux/kernel.h> 118c2ecf20Sopenharmony_ci#include <linux/init.h> 128c2ecf20Sopenharmony_ci#include <linux/io.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <asm/fncpy.h> 158c2ecf20Sopenharmony_ci#include <asm/tlb.h> 168c2ecf20Sopenharmony_ci#include <asm/cacheflush.h> 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#include <asm/mach/map.h> 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include "soc.h" 218c2ecf20Sopenharmony_ci#include "sram.h" 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#define OMAP1_SRAM_PA 0x20000000 248c2ecf20Sopenharmony_ci#define SRAM_BOOTLOADER_SZ 0x80 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci/* 278c2ecf20Sopenharmony_ci * The amount of SRAM depends on the core type. 288c2ecf20Sopenharmony_ci * Note that we cannot try to test for SRAM here because writes 298c2ecf20Sopenharmony_ci * to secure SRAM will hang the system. Also the SRAM is not 308c2ecf20Sopenharmony_ci * yet mapped at this point. 318c2ecf20Sopenharmony_ci */ 328c2ecf20Sopenharmony_cistatic void __init omap_detect_and_map_sram(void) 338c2ecf20Sopenharmony_ci{ 348c2ecf20Sopenharmony_ci unsigned long omap_sram_skip = SRAM_BOOTLOADER_SZ; 358c2ecf20Sopenharmony_ci unsigned long omap_sram_start = OMAP1_SRAM_PA; 368c2ecf20Sopenharmony_ci unsigned long omap_sram_size; 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci if (cpu_is_omap7xx()) 398c2ecf20Sopenharmony_ci omap_sram_size = 0x32000; /* 200K */ 408c2ecf20Sopenharmony_ci else if (cpu_is_omap15xx()) 418c2ecf20Sopenharmony_ci omap_sram_size = 0x30000; /* 192K */ 428c2ecf20Sopenharmony_ci else if (cpu_is_omap1610() || cpu_is_omap1611() || 438c2ecf20Sopenharmony_ci cpu_is_omap1621() || cpu_is_omap1710()) 448c2ecf20Sopenharmony_ci omap_sram_size = 0x4000; /* 16K */ 458c2ecf20Sopenharmony_ci else { 468c2ecf20Sopenharmony_ci pr_err("Could not detect SRAM size\n"); 478c2ecf20Sopenharmony_ci omap_sram_size = 0x4000; 488c2ecf20Sopenharmony_ci } 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci omap_map_sram(omap_sram_start, omap_sram_size, 518c2ecf20Sopenharmony_ci omap_sram_skip, 1); 528c2ecf20Sopenharmony_ci} 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistatic void (*_omap_sram_reprogram_clock)(u32 dpllctl, u32 ckctl); 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_civoid omap_sram_reprogram_clock(u32 dpllctl, u32 ckctl) 578c2ecf20Sopenharmony_ci{ 588c2ecf20Sopenharmony_ci BUG_ON(!_omap_sram_reprogram_clock); 598c2ecf20Sopenharmony_ci /* On 730, bit 13 must always be 1 */ 608c2ecf20Sopenharmony_ci if (cpu_is_omap7xx()) 618c2ecf20Sopenharmony_ci ckctl |= 0x2000; 628c2ecf20Sopenharmony_ci _omap_sram_reprogram_clock(dpllctl, ckctl); 638c2ecf20Sopenharmony_ci} 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ciint __init omap_sram_init(void) 668c2ecf20Sopenharmony_ci{ 678c2ecf20Sopenharmony_ci omap_detect_and_map_sram(); 688c2ecf20Sopenharmony_ci _omap_sram_reprogram_clock = 698c2ecf20Sopenharmony_ci omap_sram_push(omap1_sram_reprogram_clock, 708c2ecf20Sopenharmony_ci omap1_sram_reprogram_clock_sz); 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci return 0; 738c2ecf20Sopenharmony_ci} 74