18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * OMAP4 SMP cpu-hotplug support 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2010 Texas Instruments, Inc. 68c2ecf20Sopenharmony_ci * Author: 78c2ecf20Sopenharmony_ci * Santosh Shilimkar <santosh.shilimkar@ti.com> 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * Platform file needed for the OMAP4 SMP. This file is based on arm 108c2ecf20Sopenharmony_ci * realview smp platform. 118c2ecf20Sopenharmony_ci * Copyright (c) 2002 ARM Limited. 128c2ecf20Sopenharmony_ci */ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <linux/kernel.h> 158c2ecf20Sopenharmony_ci#include <linux/errno.h> 168c2ecf20Sopenharmony_ci#include <linux/smp.h> 178c2ecf20Sopenharmony_ci#include <linux/io.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include "omap-wakeupgen.h" 208c2ecf20Sopenharmony_ci#include "common.h" 218c2ecf20Sopenharmony_ci#include "powerdomain.h" 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci/* 248c2ecf20Sopenharmony_ci * platform-specific code to shutdown a CPU 258c2ecf20Sopenharmony_ci * Called with IRQs disabled 268c2ecf20Sopenharmony_ci */ 278c2ecf20Sopenharmony_civoid omap4_cpu_die(unsigned int cpu) 288c2ecf20Sopenharmony_ci{ 298c2ecf20Sopenharmony_ci unsigned int boot_cpu = 0; 308c2ecf20Sopenharmony_ci void __iomem *base = omap_get_wakeupgen_base(); 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci /* 338c2ecf20Sopenharmony_ci * we're ready for shutdown now, so do it 348c2ecf20Sopenharmony_ci */ 358c2ecf20Sopenharmony_ci if (omap_secure_apis_support()) { 368c2ecf20Sopenharmony_ci if (omap_modify_auxcoreboot0(0x0, 0x200) != 0x0) 378c2ecf20Sopenharmony_ci pr_err("Secure clear status failed\n"); 388c2ecf20Sopenharmony_ci } else { 398c2ecf20Sopenharmony_ci writel_relaxed(0, base + OMAP_AUX_CORE_BOOT_0); 408c2ecf20Sopenharmony_ci } 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci for (;;) { 448c2ecf20Sopenharmony_ci /* 458c2ecf20Sopenharmony_ci * Enter into low power state 468c2ecf20Sopenharmony_ci */ 478c2ecf20Sopenharmony_ci omap4_hotplug_cpu(cpu, PWRDM_POWER_OFF); 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci if (omap_secure_apis_support()) 508c2ecf20Sopenharmony_ci boot_cpu = omap_read_auxcoreboot0() >> 9; 518c2ecf20Sopenharmony_ci else 528c2ecf20Sopenharmony_ci boot_cpu = 538c2ecf20Sopenharmony_ci readl_relaxed(base + OMAP_AUX_CORE_BOOT_0) >> 5; 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci if (boot_cpu == smp_processor_id()) { 568c2ecf20Sopenharmony_ci /* 578c2ecf20Sopenharmony_ci * OK, proper wakeup, we're done 588c2ecf20Sopenharmony_ci */ 598c2ecf20Sopenharmony_ci break; 608c2ecf20Sopenharmony_ci } 618c2ecf20Sopenharmony_ci pr_debug("CPU%u: spurious wakeup call\n", cpu); 628c2ecf20Sopenharmony_ci } 638c2ecf20Sopenharmony_ci} 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci/* Needed by kexec and platform_can_cpu_hotplug() */ 668c2ecf20Sopenharmony_ciint omap4_cpu_kill(unsigned int cpu) 678c2ecf20Sopenharmony_ci{ 688c2ecf20Sopenharmony_ci return 1; 698c2ecf20Sopenharmony_ci} 70