Blame view

kernel/linux-imx6_3.14.28/arch/arm/mach-omap2/omap-hotplug.c 1.46 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
  /*
   * OMAP4 SMP cpu-hotplug support
   *
   * Copyright (C) 2010 Texas Instruments, Inc.
   * Author:
   *      Santosh Shilimkar <santosh.shilimkar@ti.com>
   *
   * Platform file needed for the OMAP4 SMP. This file is based on arm
   * realview smp platform.
   * Copyright (c) 2002 ARM Limited.
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
  
  #include <linux/kernel.h>
  #include <linux/errno.h>
  #include <linux/smp.h>
  #include <linux/io.h>
  
  #include "omap-wakeupgen.h"
  #include "common.h"
  #include "powerdomain.h"
  
  /*
   * platform-specific code to shutdown a CPU
   * Called with IRQs disabled
   */
  void __ref omap4_cpu_die(unsigned int cpu)
  {
  	unsigned int boot_cpu = 0;
  	void __iomem *base = omap_get_wakeupgen_base();
  
  	/*
  	 * we're ready for shutdown now, so do it
  	 */
  	if (omap_secure_apis_support()) {
  		if (omap_modify_auxcoreboot0(0x0, 0x200) != 0x0)
  			pr_err("Secure clear status failed
  ");
  	} else {
  		__raw_writel(0, base + OMAP_AUX_CORE_BOOT_0);
  	}
  
  
  	for (;;) {
  		/*
  		 * Enter into low power state
  		 */
  		omap4_hotplug_cpu(cpu, PWRDM_POWER_OFF);
  
  		if (omap_secure_apis_support())
  			boot_cpu = omap_read_auxcoreboot0();
  		else
  			boot_cpu =
  				__raw_readl(base + OMAP_AUX_CORE_BOOT_0) >> 5;
  
  		if (boot_cpu == smp_processor_id()) {
  			/*
  			 * OK, proper wakeup, we're done
  			 */
  			break;
  		}
  		pr_debug("CPU%u: spurious wakeup call
  ", cpu);
  	}
  }