Linux Audio

Check our new training course

Loading...
v4.17
  1/*
  2 *  linux/arch/arm/mach-realview/hotplug.c
  3 *
  4 *  Copyright (C) 2002 ARM Ltd.
  5 *  All Rights Reserved
  6 *
  7 * This program is free software; you can redistribute it and/or modify
  8 * it under the terms of the GNU General Public License version 2 as
  9 * published by the Free Software Foundation.
 10 */
 11#include <linux/kernel.h>
 12#include <linux/errno.h>
 13#include <linux/smp.h>
 14
 
 15#include <asm/cp15.h>
 16#include <asm/smp_plat.h>
 17
 
 
 18static inline void cpu_enter_lowpower(void)
 19{
 20	unsigned int v;
 21
 
 22	asm volatile(
 23	"	mcr	p15, 0, %1, c7, c5, 0\n"
 24	"	mcr	p15, 0, %1, c7, c10, 4\n"
 25	/*
 26	 * Turn off coherency
 27	 */
 28	"	mrc	p15, 0, %0, c1, c0, 1\n"
 29	"	bic	%0, %0, #0x20\n"
 30	"	mcr	p15, 0, %0, c1, c0, 1\n"
 31	"	mrc	p15, 0, %0, c1, c0, 0\n"
 32	"	bic	%0, %0, %2\n"
 33	"	mcr	p15, 0, %0, c1, c0, 0\n"
 34	  : "=&r" (v)
 35	  : "r" (0), "Ir" (CR_C)
 36	  : "cc");
 37}
 38
 39static inline void cpu_leave_lowpower(void)
 40{
 41	unsigned int v;
 42
 43	asm volatile(	"mrc	p15, 0, %0, c1, c0, 0\n"
 44	"	orr	%0, %0, %1\n"
 45	"	mcr	p15, 0, %0, c1, c0, 0\n"
 46	"	mrc	p15, 0, %0, c1, c0, 1\n"
 47	"	orr	%0, %0, #0x20\n"
 48	"	mcr	p15, 0, %0, c1, c0, 1\n"
 49	  : "=&r" (v)
 50	  : "Ir" (CR_C)
 51	  : "cc");
 52}
 53
 54static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
 55{
 56	/*
 57	 * there is no power-control hardware on this platform, so all
 58	 * we can do is put the core into WFI; this is safe as the calling
 59	 * code will have already disabled interrupts
 60	 */
 61	for (;;) {
 62		/*
 63		 * here's the WFI
 64		 */
 65		asm(".word	0xe320f003\n"
 66		    :
 67		    :
 68		    : "memory", "cc");
 69
 70		if (pen_release == cpu_logical_map(cpu)) {
 71			/*
 72			 * OK, proper wakeup, we're done
 73			 */
 74			break;
 75		}
 76
 77		/*
 78		 * Getting here, means that we have come out of WFI without
 79		 * having been woken up - this shouldn't happen
 80		 *
 81		 * Just note it happening - when we're woken, we can report
 82		 * its occurrence.
 83		 */
 84		(*spurious)++;
 85	}
 86}
 87
 
 
 
 
 
 88/*
 89 * platform-specific code to shutdown a CPU
 90 *
 91 * Called with IRQs disabled
 92 */
 93void realview_cpu_die(unsigned int cpu)
 94{
 95	int spurious = 0;
 96
 97	/*
 98	 * we're ready for shutdown now, so do it
 99	 */
100	cpu_enter_lowpower();
101	platform_do_lowpower(cpu, &spurious);
102
103	/*
104	 * bring this CPU back into the world of cache
105	 * coherency, and then restore interrupts
106	 */
107	cpu_leave_lowpower();
108
109	if (spurious)
110		pr_warn("CPU%u: %u spurious wakeup calls\n", cpu, spurious);
 
 
 
 
 
 
 
 
 
111}
v3.5.6
  1/*
  2 *  linux/arch/arm/mach-realview/hotplug.c
  3 *
  4 *  Copyright (C) 2002 ARM Ltd.
  5 *  All Rights Reserved
  6 *
  7 * This program is free software; you can redistribute it and/or modify
  8 * it under the terms of the GNU General Public License version 2 as
  9 * published by the Free Software Foundation.
 10 */
 11#include <linux/kernel.h>
 12#include <linux/errno.h>
 13#include <linux/smp.h>
 14
 15#include <asm/cacheflush.h>
 16#include <asm/cp15.h>
 17#include <asm/smp_plat.h>
 18
 19extern volatile int pen_release;
 20
 21static inline void cpu_enter_lowpower(void)
 22{
 23	unsigned int v;
 24
 25	flush_cache_all();
 26	asm volatile(
 27	"	mcr	p15, 0, %1, c7, c5, 0\n"
 28	"	mcr	p15, 0, %1, c7, c10, 4\n"
 29	/*
 30	 * Turn off coherency
 31	 */
 32	"	mrc	p15, 0, %0, c1, c0, 1\n"
 33	"	bic	%0, %0, #0x20\n"
 34	"	mcr	p15, 0, %0, c1, c0, 1\n"
 35	"	mrc	p15, 0, %0, c1, c0, 0\n"
 36	"	bic	%0, %0, %2\n"
 37	"	mcr	p15, 0, %0, c1, c0, 0\n"
 38	  : "=&r" (v)
 39	  : "r" (0), "Ir" (CR_C)
 40	  : "cc");
 41}
 42
 43static inline void cpu_leave_lowpower(void)
 44{
 45	unsigned int v;
 46
 47	asm volatile(	"mrc	p15, 0, %0, c1, c0, 0\n"
 48	"	orr	%0, %0, %1\n"
 49	"	mcr	p15, 0, %0, c1, c0, 0\n"
 50	"	mrc	p15, 0, %0, c1, c0, 1\n"
 51	"	orr	%0, %0, #0x20\n"
 52	"	mcr	p15, 0, %0, c1, c0, 1\n"
 53	  : "=&r" (v)
 54	  : "Ir" (CR_C)
 55	  : "cc");
 56}
 57
 58static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
 59{
 60	/*
 61	 * there is no power-control hardware on this platform, so all
 62	 * we can do is put the core into WFI; this is safe as the calling
 63	 * code will have already disabled interrupts
 64	 */
 65	for (;;) {
 66		/*
 67		 * here's the WFI
 68		 */
 69		asm(".word	0xe320f003\n"
 70		    :
 71		    :
 72		    : "memory", "cc");
 73
 74		if (pen_release == cpu_logical_map(cpu)) {
 75			/*
 76			 * OK, proper wakeup, we're done
 77			 */
 78			break;
 79		}
 80
 81		/*
 82		 * Getting here, means that we have come out of WFI without
 83		 * having been woken up - this shouldn't happen
 84		 *
 85		 * Just note it happening - when we're woken, we can report
 86		 * its occurrence.
 87		 */
 88		(*spurious)++;
 89	}
 90}
 91
 92int platform_cpu_kill(unsigned int cpu)
 93{
 94	return 1;
 95}
 96
 97/*
 98 * platform-specific code to shutdown a CPU
 99 *
100 * Called with IRQs disabled
101 */
102void platform_cpu_die(unsigned int cpu)
103{
104	int spurious = 0;
105
106	/*
107	 * we're ready for shutdown now, so do it
108	 */
109	cpu_enter_lowpower();
110	platform_do_lowpower(cpu, &spurious);
111
112	/*
113	 * bring this CPU back into the world of cache
114	 * coherency, and then restore interrupts
115	 */
116	cpu_leave_lowpower();
117
118	if (spurious)
119		pr_warn("CPU%u: %u spurious wakeup calls\n", cpu, spurious);
120}
121
122int platform_cpu_disable(unsigned int cpu)
123{
124	/*
125	 * we don't allow CPU 0 to be shutdown (it is still too special
126	 * e.g. clock tick interrupts)
127	 */
128	return cpu == 0 ? -EPERM : 0;
129}