ARM: use new LEDS CPU trigger stub to replace old one
Cc: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
This commit is contained in:
parent
18775a7bea
commit
fa8bbb13ab
|
@ -1739,59 +1739,6 @@ config FORCE_MAX_ZONEORDER
|
||||||
This config option is actually maximum order plus one. For example,
|
This config option is actually maximum order plus one. For example,
|
||||||
a value of 11 means that the largest free memory block is 2^10 pages.
|
a value of 11 means that the largest free memory block is 2^10 pages.
|
||||||
|
|
||||||
config LEDS
|
|
||||||
bool "Timer and CPU usage LEDs"
|
|
||||||
depends on ARCH_CDB89712 || ARCH_EBSA110 || \
|
|
||||||
ARCH_EBSA285 || ARCH_INTEGRATOR || \
|
|
||||||
ARCH_LUBBOCK || MACH_MAINSTONE || ARCH_NETWINDER || \
|
|
||||||
ARCH_OMAP || ARCH_P720T || ARCH_PXA_IDP || \
|
|
||||||
ARCH_SA1100 || ARCH_SHARK || ARCH_VERSATILE || \
|
|
||||||
ARCH_AT91 || ARCH_DAVINCI || \
|
|
||||||
ARCH_KS8695 || MACH_RD88F5182 || ARCH_REALVIEW
|
|
||||||
help
|
|
||||||
If you say Y here, the LEDs on your machine will be used
|
|
||||||
to provide useful information about your current system status.
|
|
||||||
|
|
||||||
If you are compiling a kernel for a NetWinder or EBSA-285, you will
|
|
||||||
be able to select which LEDs are active using the options below. If
|
|
||||||
you are compiling a kernel for the EBSA-110 or the LART however, the
|
|
||||||
red LED will simply flash regularly to indicate that the system is
|
|
||||||
still functional. It is safe to say Y here if you have a CATS
|
|
||||||
system, but the driver will do nothing.
|
|
||||||
|
|
||||||
config LEDS_TIMER
|
|
||||||
bool "Timer LED" if (!ARCH_CDB89712 && !ARCH_OMAP) || \
|
|
||||||
OMAP_OSK_MISTRAL || MACH_OMAP_H2 \
|
|
||||||
|| MACH_OMAP_PERSEUS2
|
|
||||||
depends on LEDS
|
|
||||||
depends on !GENERIC_CLOCKEVENTS
|
|
||||||
default y if ARCH_EBSA110
|
|
||||||
help
|
|
||||||
If you say Y here, one of the system LEDs (the green one on the
|
|
||||||
NetWinder, the amber one on the EBSA285, or the red one on the LART)
|
|
||||||
will flash regularly to indicate that the system is still
|
|
||||||
operational. This is mainly useful to kernel hackers who are
|
|
||||||
debugging unstable kernels.
|
|
||||||
|
|
||||||
The LART uses the same LED for both Timer LED and CPU usage LED
|
|
||||||
functions. You may choose to use both, but the Timer LED function
|
|
||||||
will overrule the CPU usage LED.
|
|
||||||
|
|
||||||
config LEDS_CPU
|
|
||||||
bool "CPU usage LED" if (!ARCH_CDB89712 && !ARCH_EBSA110 && \
|
|
||||||
!ARCH_OMAP) \
|
|
||||||
|| OMAP_OSK_MISTRAL || MACH_OMAP_H2 \
|
|
||||||
|| MACH_OMAP_PERSEUS2
|
|
||||||
depends on LEDS
|
|
||||||
help
|
|
||||||
If you say Y here, the red LED will be used to give a good real
|
|
||||||
time indication of CPU usage, by lighting whenever the idle task
|
|
||||||
is not currently executing.
|
|
||||||
|
|
||||||
The LART uses the same LED for both Timer LED and CPU usage LED
|
|
||||||
functions. You may choose to use both, but the Timer LED function
|
|
||||||
will overrule the CPU usage LED.
|
|
||||||
|
|
||||||
config ALIGNMENT_TRAP
|
config ALIGNMENT_TRAP
|
||||||
bool
|
bool
|
||||||
depends on CPU_CP15_MMU
|
depends on CPU_CP15_MMU
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/arm/include/asm/leds.h
|
|
||||||
*
|
|
||||||
* Copyright (C) 1998 Russell King
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* Event-driven interface for LEDs on machines
|
|
||||||
* Added led_start and led_stop- Alex Holden, 28th Dec 1998.
|
|
||||||
*/
|
|
||||||
#ifndef ASM_ARM_LEDS_H
|
|
||||||
#define ASM_ARM_LEDS_H
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
led_idle_start,
|
|
||||||
led_idle_end,
|
|
||||||
led_timer,
|
|
||||||
led_start,
|
|
||||||
led_stop,
|
|
||||||
led_claim, /* override idle & timer leds */
|
|
||||||
led_release, /* restore idle & timer leds */
|
|
||||||
led_start_timer_mode,
|
|
||||||
led_stop_timer_mode,
|
|
||||||
led_green_on,
|
|
||||||
led_green_off,
|
|
||||||
led_amber_on,
|
|
||||||
led_amber_off,
|
|
||||||
led_red_on,
|
|
||||||
led_red_off,
|
|
||||||
led_blue_on,
|
|
||||||
led_blue_off,
|
|
||||||
/*
|
|
||||||
* I want this between led_timer and led_start, but
|
|
||||||
* someone has decided to export this to user space
|
|
||||||
*/
|
|
||||||
led_halted
|
|
||||||
} led_event_t;
|
|
||||||
|
|
||||||
/* Use this routine to handle LEDs */
|
|
||||||
|
|
||||||
#ifdef CONFIG_LEDS
|
|
||||||
extern void (*leds_event)(led_event_t);
|
|
||||||
#else
|
|
||||||
#define leds_event(e)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -21,7 +21,6 @@ obj-y := elf.o entry-armv.o entry-common.o irq.o opcodes.o \
|
||||||
|
|
||||||
obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += compat.o
|
obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += compat.o
|
||||||
|
|
||||||
obj-$(CONFIG_LEDS) += leds.o
|
|
||||||
obj-$(CONFIG_OC_ETM) += etm.o
|
obj-$(CONFIG_OC_ETM) += etm.o
|
||||||
obj-$(CONFIG_CPU_IDLE) += cpuidle.o
|
obj-$(CONFIG_CPU_IDLE) += cpuidle.o
|
||||||
obj-$(CONFIG_ISA_DMA_API) += dma.o
|
obj-$(CONFIG_ISA_DMA_API) += dma.o
|
||||||
|
|
|
@ -1,121 +0,0 @@
|
||||||
/*
|
|
||||||
* LED support code, ripped out of arch/arm/kernel/time.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1994-2001 Russell King
|
|
||||||
*
|
|
||||||
* 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/export.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/device.h>
|
|
||||||
#include <linux/syscore_ops.h>
|
|
||||||
#include <linux/string.h>
|
|
||||||
|
|
||||||
#include <asm/leds.h>
|
|
||||||
|
|
||||||
static void dummy_leds_event(led_event_t evt)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void (*leds_event)(led_event_t) = dummy_leds_event;
|
|
||||||
|
|
||||||
struct leds_evt_name {
|
|
||||||
const char name[8];
|
|
||||||
int on;
|
|
||||||
int off;
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct leds_evt_name evt_names[] = {
|
|
||||||
{ "amber", led_amber_on, led_amber_off },
|
|
||||||
{ "blue", led_blue_on, led_blue_off },
|
|
||||||
{ "green", led_green_on, led_green_off },
|
|
||||||
{ "red", led_red_on, led_red_off },
|
|
||||||
};
|
|
||||||
|
|
||||||
static ssize_t leds_store(struct device *dev,
|
|
||||||
struct device_attribute *attr,
|
|
||||||
const char *buf, size_t size)
|
|
||||||
{
|
|
||||||
int ret = -EINVAL, len = strcspn(buf, " ");
|
|
||||||
|
|
||||||
if (len > 0 && buf[len] == '\0')
|
|
||||||
len--;
|
|
||||||
|
|
||||||
if (strncmp(buf, "claim", len) == 0) {
|
|
||||||
leds_event(led_claim);
|
|
||||||
ret = size;
|
|
||||||
} else if (strncmp(buf, "release", len) == 0) {
|
|
||||||
leds_event(led_release);
|
|
||||||
ret = size;
|
|
||||||
} else {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(evt_names); i++) {
|
|
||||||
if (strlen(evt_names[i].name) != len ||
|
|
||||||
strncmp(buf, evt_names[i].name, len) != 0)
|
|
||||||
continue;
|
|
||||||
if (strncmp(buf+len, " on", 3) == 0) {
|
|
||||||
leds_event(evt_names[i].on);
|
|
||||||
ret = size;
|
|
||||||
} else if (strncmp(buf+len, " off", 4) == 0) {
|
|
||||||
leds_event(evt_names[i].off);
|
|
||||||
ret = size;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static DEVICE_ATTR(event, 0200, NULL, leds_store);
|
|
||||||
|
|
||||||
static struct bus_type leds_subsys = {
|
|
||||||
.name = "leds",
|
|
||||||
.dev_name = "leds",
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct device leds_device = {
|
|
||||||
.id = 0,
|
|
||||||
.bus = &leds_subsys,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int leds_suspend(void)
|
|
||||||
{
|
|
||||||
leds_event(led_stop);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void leds_resume(void)
|
|
||||||
{
|
|
||||||
leds_event(led_start);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void leds_shutdown(void)
|
|
||||||
{
|
|
||||||
leds_event(led_halted);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct syscore_ops leds_syscore_ops = {
|
|
||||||
.shutdown = leds_shutdown,
|
|
||||||
.suspend = leds_suspend,
|
|
||||||
.resume = leds_resume,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init leds_init(void)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
ret = subsys_system_register(&leds_subsys, NULL);
|
|
||||||
if (ret == 0)
|
|
||||||
ret = device_register(&leds_device);
|
|
||||||
if (ret == 0)
|
|
||||||
ret = device_create_file(&leds_device, &dev_attr_event);
|
|
||||||
if (ret == 0)
|
|
||||||
register_syscore_ops(&leds_syscore_ops);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
device_initcall(leds_init);
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(leds_event);
|
|
|
@ -31,9 +31,9 @@
|
||||||
#include <linux/random.h>
|
#include <linux/random.h>
|
||||||
#include <linux/hw_breakpoint.h>
|
#include <linux/hw_breakpoint.h>
|
||||||
#include <linux/cpuidle.h>
|
#include <linux/cpuidle.h>
|
||||||
|
#include <linux/leds.h>
|
||||||
|
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/leds.h>
|
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/thread_notify.h>
|
#include <asm/thread_notify.h>
|
||||||
#include <asm/stacktrace.h>
|
#include <asm/stacktrace.h>
|
||||||
|
@ -189,7 +189,7 @@ void cpu_idle(void)
|
||||||
while (1) {
|
while (1) {
|
||||||
tick_nohz_idle_enter();
|
tick_nohz_idle_enter();
|
||||||
rcu_idle_enter();
|
rcu_idle_enter();
|
||||||
leds_event(led_idle_start);
|
ledtrig_cpu(CPU_LED_IDLE_START);
|
||||||
while (!need_resched()) {
|
while (!need_resched()) {
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
if (cpu_is_offline(smp_processor_id()))
|
if (cpu_is_offline(smp_processor_id()))
|
||||||
|
@ -220,7 +220,7 @@ void cpu_idle(void)
|
||||||
} else
|
} else
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
}
|
}
|
||||||
leds_event(led_idle_end);
|
ledtrig_cpu(CPU_LED_IDLE_END);
|
||||||
rcu_idle_exit();
|
rcu_idle_exit();
|
||||||
tick_nohz_idle_exit();
|
tick_nohz_idle_exit();
|
||||||
schedule_preempt_disabled();
|
schedule_preempt_disabled();
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#include <linux/timer.h>
|
#include <linux/timer.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
||||||
#include <asm/leds.h>
|
|
||||||
#include <asm/thread_info.h>
|
#include <asm/thread_info.h>
|
||||||
#include <asm/sched_clock.h>
|
#include <asm/sched_clock.h>
|
||||||
#include <asm/stacktrace.h>
|
#include <asm/stacktrace.h>
|
||||||
|
@ -80,21 +79,6 @@ u32 arch_gettimeoffset(void)
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_ARCH_USES_GETTIMEOFFSET */
|
#endif /* CONFIG_ARCH_USES_GETTIMEOFFSET */
|
||||||
|
|
||||||
#ifdef CONFIG_LEDS_TIMER
|
|
||||||
static inline void do_leds(void)
|
|
||||||
{
|
|
||||||
static unsigned int count = HZ/2;
|
|
||||||
|
|
||||||
if (--count == 0) {
|
|
||||||
count = HZ/2;
|
|
||||||
leds_event(led_timer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define do_leds()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef CONFIG_GENERIC_CLOCKEVENTS
|
#ifndef CONFIG_GENERIC_CLOCKEVENTS
|
||||||
/*
|
/*
|
||||||
* Kernel system timer support.
|
* Kernel system timer support.
|
||||||
|
@ -102,7 +86,6 @@ static inline void do_leds(void)
|
||||||
void timer_tick(void)
|
void timer_tick(void)
|
||||||
{
|
{
|
||||||
profile_tick(CPU_PROFILING);
|
profile_tick(CPU_PROFILING);
|
||||||
do_leds();
|
|
||||||
xtime_update(1);
|
xtime_update(1);
|
||||||
#ifndef CONFIG_SMP
|
#ifndef CONFIG_SMP
|
||||||
update_process_times(user_mode(get_irq_regs()));
|
update_process_times(user_mode(get_irq_regs()));
|
||||||
|
|
Loading…
Reference in New Issue