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