mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-16 23:45:31 +08:00
fcaf20360a
Based on 1 normalized pattern(s): the code contained herein is licensed under the gnu general public license you may obtain a copy of the gnu general public license version 2 or later at the following locations http www opensource org licenses gpl license html http www gnu org copyleft gpl html extracted by the scancode license scanner the SPDX license identifier GPL-2.0-or-later has been chosen to replace the boilerplate/reference in 161 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Richard Fontana <rfontana@redhat.com> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190527070033.383790741@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
65 lines
1.3 KiB
C
65 lines
1.3 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Copyright 2011 Freescale Semiconductor, Inc.
|
|
* Copyright 2011 Linaro Ltd.
|
|
*/
|
|
|
|
#include <linux/errno.h>
|
|
#include <linux/jiffies.h>
|
|
#include <asm/cp15.h>
|
|
#include <asm/proc-fns.h>
|
|
|
|
#include "common.h"
|
|
|
|
static inline void cpu_enter_lowpower(void)
|
|
{
|
|
unsigned int v;
|
|
|
|
asm volatile(
|
|
"mcr p15, 0, %1, c7, c5, 0\n"
|
|
" mcr p15, 0, %1, c7, c10, 4\n"
|
|
/*
|
|
* Turn off coherency
|
|
*/
|
|
" mrc p15, 0, %0, c1, c0, 1\n"
|
|
" bic %0, %0, %3\n"
|
|
" mcr p15, 0, %0, c1, c0, 1\n"
|
|
" mrc p15, 0, %0, c1, c0, 0\n"
|
|
" bic %0, %0, %2\n"
|
|
" mcr p15, 0, %0, c1, c0, 0\n"
|
|
: "=&r" (v)
|
|
: "r" (0), "Ir" (CR_C), "Ir" (0x40)
|
|
: "cc");
|
|
}
|
|
|
|
/*
|
|
* platform-specific code to shutdown a CPU
|
|
*
|
|
* Called with IRQs disabled
|
|
*/
|
|
void imx_cpu_die(unsigned int cpu)
|
|
{
|
|
cpu_enter_lowpower();
|
|
/*
|
|
* We use the cpu jumping argument register to sync with
|
|
* imx_cpu_kill() which is running on cpu0 and waiting for
|
|
* the register being cleared to kill the cpu.
|
|
*/
|
|
imx_set_cpu_arg(cpu, ~0);
|
|
|
|
while (1)
|
|
cpu_do_idle();
|
|
}
|
|
|
|
int imx_cpu_kill(unsigned int cpu)
|
|
{
|
|
unsigned long timeout = jiffies + msecs_to_jiffies(50);
|
|
|
|
while (imx_get_cpu_arg(cpu) == 0)
|
|
if (time_after(jiffies, timeout))
|
|
return 0;
|
|
imx_enable_cpu(cpu, false);
|
|
imx_set_cpu_arg(cpu, 0);
|
|
return 1;
|
|
}
|