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.15
  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 __ref 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}