mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
Merge branch 'for-arm-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds into next/drivers
From Bryan Wu <[email protected]>: Based on Linus Walleij's ARM LED consolidation work, this patchset introduce a new generic led trigger for CPU not only for ARM but also for others. For enabling CPU idle event, CPU arch code should call ledtrig_cpu() stub to trigger idle start or idle end event. These patches convert old style LED driver in arch/arm to gpio_led or new led driver interface. Against 3.5 release and build successfully for all the machines. Test ledtrig-cpu driver on OMAP4 Panda board. v9 --> v10 * fix compiling issue on versatile_defconfig reported by Russell King * rebase to 3.5 kernel and move patches to new git tree v8 --> v9: * use mutex to replace rw_sema pointed out by Tim Gardner * add a new struct led_trigger_cpu * add lock_is_inited to record mutex lock initialization v6 --> v7: * add a patch to unify the led-trigger name * fix some typo pointed * use BUG_ON to detect CPU numbers during building stage v5 --> v6: * replace __get_cpu_var() to per_cpu() * remove smp_processor_id() which is wrong with for_each_possible_cpu() * test on real OMAP4 Panda board * add comments about CPU hotplug in the CPU LED trigger driver v4 --> v5: * rebase all the patches on top of latest linux-next * replace on_each_cpu() with for_each_possible_cpu() * add some description of ledtrig_cpu() API * remove old leds code from driver nwflash.c, which should use a new led trigger then * this trigger driver can be built as module now v3 --> v4: * fix a typo pointed by Jochen Friedrich * fix some building errors * add Reviewed-by and Tested-by into patch log v2 --> v3: * almost rewrote the whole ledtrig-cpu driver, which is more simple * every CPU will have a per-CPU trigger * cpu trigger can be assigned to any leds * fix a lockdep issue in led-trigger common code * other fix according to review v1 --> v2: * remove select operations in Kconfig of every machines * add back supporting of led in core module of mach-integrator * solidate name scheme in ledtrig-cpu.c * add comments of CPU_LED_* cpu led events * fold patches of RealView and Versatile together * add machine_is_ check during assabet led driver init * add some Acked-by in patch logs * remove code for simpad machine in machine-sa11000, since Jochen Friedrich introduced gpiolib and gpio-led driver for simpad * on Assabet and Netwinder machine, LED operations is reversed like: setting bit means turn off leds clearing bit means turn on leds * add a new function to read CM_CTRL register for led driver * 'for-arm-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds: ARM: use new LEDS CPU trigger stub to replace old one ARM: mach-sa1100: retire custom LED code ARM: mach-omap1: retire custom LED code ARM: mach-pnx4008: remove including old leds event API header file ARM: plat-samsung: remove including old leds event API header file ARM: mach-pxa: retire custom LED code char: nwflash: remove old led event code ARM: mach-footbridge: retire custom LED code ARM: mach-ebsa110: retire custom LED code ARM: mach-clps711x: retire custom LED code of P720T machine ARM: mach-integrator: retire custom LED code ARM: mach-integrator: move CM_CTRL to header file for accessing by other functions ARM: mach-orion5x: convert custom LED code to gpio_led and LED CPU trigger ARM: mach-shark: retire custom LED code ARM: mach-ks8695: remove leds driver, since nobody use it ARM: mach-realview and mach-versatile: retire custom LED code ARM: at91: convert old leds drivers to gpio_led and led_trigger drivers led-triggers: create a trigger for CPU activity Conflicts: arch/arm/mach-clps711x/p720t.c arch/arm/mach-sa1100/leds-cerf.c arch/arm/mach-sa1100/leds-lart.c Let's hope this is the last time we pull this and it doesn't cause more trouble. I have verified that version 10 causes no build warnings or errors any more, and the patches still look good. Signed-off-by: Arnd Bergmann <[email protected]>
This commit is contained in:
commit
19e4ab54e7
97 changed files with 1441 additions and 2983 deletions
|
|
@ -506,6 +506,16 @@ config LEDS_TRIGGER_BACKLIGHT
|
|||
|
||||
If unsure, say N.
|
||||
|
||||
config LEDS_TRIGGER_CPU
|
||||
bool "LED CPU Trigger"
|
||||
depends on LEDS_TRIGGERS
|
||||
help
|
||||
This allows LEDs to be controlled by active CPUs. This shows
|
||||
the active CPUs across an array of LEDs so you can see which
|
||||
CPUs are active on the system at any given moment.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config LEDS_TRIGGER_GPIO
|
||||
tristate "LED GPIO Trigger"
|
||||
depends on LEDS_TRIGGERS
|
||||
|
|
|
|||
|
|
@ -61,5 +61,6 @@ obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK) += ledtrig-ide-disk.o
|
|||
obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) += ledtrig-heartbeat.o
|
||||
obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT) += ledtrig-backlight.o
|
||||
obj-$(CONFIG_LEDS_TRIGGER_GPIO) += ledtrig-gpio.o
|
||||
obj-$(CONFIG_LEDS_TRIGGER_CPU) += ledtrig-cpu.o
|
||||
obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o
|
||||
obj-$(CONFIG_LEDS_TRIGGER_TRANSIENT) += ledtrig-transient.o
|
||||
|
|
|
|||
163
drivers/leds/ledtrig-cpu.c
Normal file
163
drivers/leds/ledtrig-cpu.c
Normal file
|
|
@ -0,0 +1,163 @@
|
|||
/*
|
||||
* ledtrig-cpu.c - LED trigger based on CPU activity
|
||||
*
|
||||
* This LED trigger will be registered for each possible CPU and named as
|
||||
* cpu0, cpu1, cpu2, cpu3, etc.
|
||||
*
|
||||
* It can be bound to any LED just like other triggers using either a
|
||||
* board file or via sysfs interface.
|
||||
*
|
||||
* An API named ledtrig_cpu is exported for any user, who want to add CPU
|
||||
* activity indication in their code
|
||||
*
|
||||
* Copyright 2011 Linus Walleij <linus.walleij@linaro.org>
|
||||
* Copyright 2011 - 2012 Bryan Wu <bryan.wu@canonical.com>
|
||||
*
|
||||
* 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/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/rwsem.h>
|
||||
#include "leds.h"
|
||||
|
||||
#define MAX_NAME_LEN 8
|
||||
|
||||
struct led_trigger_cpu {
|
||||
char name[MAX_NAME_LEN];
|
||||
struct led_trigger *_trig;
|
||||
struct mutex lock;
|
||||
int lock_is_inited;
|
||||
};
|
||||
|
||||
static DEFINE_PER_CPU(struct led_trigger_cpu, cpu_trig);
|
||||
|
||||
/**
|
||||
* ledtrig_cpu - emit a CPU event as a trigger
|
||||
* @evt: CPU event to be emitted
|
||||
*
|
||||
* Emit a CPU event on a CPU core, which will trigger a
|
||||
* binded LED to turn on or turn off.
|
||||
*/
|
||||
void ledtrig_cpu(enum cpu_led_event ledevt)
|
||||
{
|
||||
struct led_trigger_cpu *trig = &__get_cpu_var(cpu_trig);
|
||||
|
||||
/* mutex lock should be initialized before calling mutex_call() */
|
||||
if (!trig->lock_is_inited)
|
||||
return;
|
||||
|
||||
mutex_lock(&trig->lock);
|
||||
|
||||
/* Locate the correct CPU LED */
|
||||
switch (ledevt) {
|
||||
case CPU_LED_IDLE_END:
|
||||
case CPU_LED_START:
|
||||
/* Will turn the LED on, max brightness */
|
||||
led_trigger_event(trig->_trig, LED_FULL);
|
||||
break;
|
||||
|
||||
case CPU_LED_IDLE_START:
|
||||
case CPU_LED_STOP:
|
||||
case CPU_LED_HALTED:
|
||||
/* Will turn the LED off */
|
||||
led_trigger_event(trig->_trig, LED_OFF);
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Will leave the LED as it is */
|
||||
break;
|
||||
}
|
||||
|
||||
mutex_unlock(&trig->lock);
|
||||
}
|
||||
EXPORT_SYMBOL(ledtrig_cpu);
|
||||
|
||||
static int ledtrig_cpu_syscore_suspend(void)
|
||||
{
|
||||
ledtrig_cpu(CPU_LED_STOP);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ledtrig_cpu_syscore_resume(void)
|
||||
{
|
||||
ledtrig_cpu(CPU_LED_START);
|
||||
}
|
||||
|
||||
static void ledtrig_cpu_syscore_shutdown(void)
|
||||
{
|
||||
ledtrig_cpu(CPU_LED_HALTED);
|
||||
}
|
||||
|
||||
static struct syscore_ops ledtrig_cpu_syscore_ops = {
|
||||
.shutdown = ledtrig_cpu_syscore_shutdown,
|
||||
.suspend = ledtrig_cpu_syscore_suspend,
|
||||
.resume = ledtrig_cpu_syscore_resume,
|
||||
};
|
||||
|
||||
static int __init ledtrig_cpu_init(void)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
/* Supports up to 9999 cpu cores */
|
||||
BUILD_BUG_ON(CONFIG_NR_CPUS > 9999);
|
||||
|
||||
/*
|
||||
* Registering CPU led trigger for each CPU core here
|
||||
* ignores CPU hotplug, but after this CPU hotplug works
|
||||
* fine with this trigger.
|
||||
*/
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct led_trigger_cpu *trig = &per_cpu(cpu_trig, cpu);
|
||||
|
||||
mutex_init(&trig->lock);
|
||||
|
||||
snprintf(trig->name, MAX_NAME_LEN, "cpu%d", cpu);
|
||||
|
||||
mutex_lock(&trig->lock);
|
||||
led_trigger_register_simple(trig->name, &trig->_trig);
|
||||
trig->lock_is_inited = 1;
|
||||
mutex_unlock(&trig->lock);
|
||||
}
|
||||
|
||||
register_syscore_ops(&ledtrig_cpu_syscore_ops);
|
||||
|
||||
pr_info("ledtrig-cpu: registered to indicate activity on CPUs\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
module_init(ledtrig_cpu_init);
|
||||
|
||||
static void __exit ledtrig_cpu_exit(void)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct led_trigger_cpu *trig = &per_cpu(cpu_trig, cpu);
|
||||
|
||||
mutex_lock(&trig->lock);
|
||||
|
||||
led_trigger_unregister_simple(trig->_trig);
|
||||
trig->_trig = NULL;
|
||||
memset(trig->name, 0, MAX_NAME_LEN);
|
||||
trig->lock_is_inited = 0;
|
||||
|
||||
mutex_unlock(&trig->lock);
|
||||
mutex_destroy(&trig->lock);
|
||||
}
|
||||
|
||||
unregister_syscore_ops(&ledtrig_cpu_syscore_ops);
|
||||
}
|
||||
module_exit(ledtrig_cpu_exit);
|
||||
|
||||
MODULE_AUTHOR("Linus Walleij <[email protected]>");
|
||||
MODULE_AUTHOR("Bryan Wu <[email protected]>");
|
||||
MODULE_DESCRIPTION("CPU LED trigger");
|
||||
MODULE_LICENSE("GPL");
|
||||
Loading…
Reference in a new issue