All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <4F9E8D8C.9090704@canonical.com>

diff --git a/a/1.txt b/N1/1.txt
index 70b951d..3733c64 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -3,7 +3,7 @@ On 04/30/2012 01:37 AM, Bryan Wu wrote:
 > custom RealView LED trigger code to turn LEDs on and off in
 > response to CPU activity and replace it with a standard trigger.
 > 
-> (bryan.wu at canonical.com:
+> (bryan.wu@canonical.com:
 > It introduces several syscore stubs into this trigger.
 > It also provides ledtrig_cpu trigger event stub in <linux/leds.h>.
 > Although it was inspired by ARM work, it can be used in other arch.)
@@ -124,11 +124,4 @@ I've attached the changes I think you should make.
 
 rtg
 -- 
-Tim Gardner tim.gardner at canonical.com
--------------- next part --------------
-A non-text attachment was scrubbed...
-Name: 0001-led-triggers-create-a-trigger-for-CPU-activity.patch
-Type: text/x-patch
-Size: 7256 bytes
-Desc: not available
-URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120430/71b769f5/attachment.bin>
+Tim Gardner tim.gardner@canonical.com
diff --git a/N1/2.hdr b/N1/2.hdr
new file mode 100644
index 0000000..4c87cf3
--- /dev/null
+++ b/N1/2.hdr
@@ -0,0 +1,5 @@
+Content-Type: text/x-patch;
+ name="0001-led-triggers-create-a-trigger-for-CPU-activity.patch"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: attachment;
+ filename*0="0001-led-triggers-create-a-trigger-for-CPU-activity.patch"
diff --git a/N1/2.txt b/N1/2.txt
new file mode 100644
index 0000000..2a20813
--- /dev/null
+++ b/N1/2.txt
@@ -0,0 +1,254 @@
+>From 37cb1dc95f0af9d9916e856111bd19ecf6688c1c Mon Sep 17 00:00:00 2001
+From: Bryan Wu <bryan.wu@canonical.com>
+Date: Mon, 30 Apr 2012 15:37:07 +0800
+Subject: [PATCH] led-triggers: create a trigger for CPU activity
+
+Attempting to consolidate the ARM LED code, this removes the
+custom RealView LED trigger code to turn LEDs on and off in
+response to CPU activity and replace it with a standard trigger.
+
+(bryan.wu@canonical.com:
+It introduces several syscore stubs into this trigger.
+It also provides ledtrig_cpu trigger event stub in <linux/leds.h>.
+Although it was inspired by ARM work, it can be used in other arch.)
+
+Cc: Richard Purdie <rpurdie@rpsys.net>
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
+Reviewed-by: Jamie Iles <jamie@jamieiles.com>
+Tested-by: Jochen Friedrich <jochen@scram.de>
+Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
+---
+ drivers/leds/Kconfig       |   10 +++
+ drivers/leds/Makefile      |    1 +
+ drivers/leds/ledtrig-cpu.c |  162 ++++++++++++++++++++++++++++++++++++++++++++
+ include/linux/leds.h       |   16 +++++
+ 4 files changed, 189 insertions(+)
+ create mode 100644 drivers/leds/ledtrig-cpu.c
+
+diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
+index ff4b8cf..b006d09 100644
+--- a/drivers/leds/Kconfig
++++ b/drivers/leds/Kconfig
+@@ -448,6 +448,16 @@ config LEDS_TRIGGER_BACKLIGHT
+ 
+ 	  If unsure, say N.
+ 
++config LEDS_TRIGGER_CPU
++	tristate "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
+diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
+index 890481c..0a3d5ad 100644
+--- a/drivers/leds/Makefile
++++ b/drivers/leds/Makefile
+@@ -55,4 +55,5 @@ 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
+diff --git a/drivers/leds/ledtrig-cpu.c b/drivers/leds/ledtrig-cpu.c
+new file mode 100644
+index 0000000..47f5fa5
+--- /dev/null
++++ b/drivers/leds/ledtrig-cpu.c
+@@ -0,0 +1,162 @@
++/*
++ * 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/mutex.h>
++#include "leds.h"
++
++#define MAX_NAME_LEN	8
++
++static DEFINE_PER_CPU(struct led_trigger *, cpu_trig);
++static DEFINE_PER_CPU(char [MAX_NAME_LEN], trig_name);
++static DEFINE_PER_CPU(struct mutex, trig_lock);
++
++/**
++ * 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 mutex *lock = this_cpu_ptr(&trig_lock);
++	struct led_trigger *trig;
++
++	mutex_lock(lock);
++
++	trig = __get_cpu_var(cpu_trig);
++
++	/* 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, 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, LED_OFF);
++		break;
++
++	default:
++		/* Will leave the LED as it is */
++		break;
++	}
++
++	mutex_unlock(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 *trig;
++		char *name = per_cpu(trig_name, cpu);
++		struct mutex *lock = &per_cpu(trig_lock, cpu);
++
++		mutex_init(lock);
++
++		snprintf(name, MAX_NAME_LEN, "cpu%d", cpu);
++
++		mutex_lock(lock);
++		led_trigger_register_simple(name, &trig);
++		per_cpu(cpu_trig, cpu) = trig;
++		mutex_unlock(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 mutex *lock = &per_cpu(trig_lock, cpu);
++		struct led_trigger *trig;
++		char *name;
++
++		mutex_lock(lock);
++
++		trig = per_cpu(cpu_trig, cpu);
++		name = per_cpu(trig_name, cpu);
++
++		led_trigger_unregister_simple(trig);
++		per_cpu(cpu_trig, cpu) = NULL;
++		memset(name, 0, MAX_NAME_LEN);
++
++		mutex_unlock(lock);
++	}
++
++	unregister_syscore_ops(&ledtrig_cpu_syscore_ops);
++}
++module_exit(ledtrig_cpu_exit);
++
++MODULE_AUTHOR("Linus Walleij <linus.walleij@linaro.org>");
++MODULE_AUTHOR("Bryan Wu <bryan.wu@canonical.com>");
++MODULE_DESCRIPTION("CPU LED trigger");
++MODULE_LICENSE("GPL");
+diff --git a/include/linux/leds.h b/include/linux/leds.h
+index 5884def..5fae540 100644
+--- a/include/linux/leds.h
++++ b/include/linux/leds.h
+@@ -210,4 +210,20 @@ struct gpio_led_platform_data {
+ struct platform_device *gpio_led_register_device(
+ 		int id, const struct gpio_led_platform_data *pdata);
+ 
++enum cpu_led_event {
++	CPU_LED_IDLE_START,	/* CPU enters idle */
++	CPU_LED_IDLE_END,	/* CPU idle ends */
++	CPU_LED_START,		/* Machine starts, especially resume */
++	CPU_LED_STOP,		/* Machine stops, especially suspend */
++	CPU_LED_HALTED,		/* Machine shutdown */
++};
++#if defined(CONFIG_LEDS_TRIGGER_CPU) || defined(CONFIG_LEDS_TRIGGER_CPU_MODULE)
++extern void ledtrig_cpu(enum cpu_led_event evt);
++#else
++static inline void ledtrig_cpu(enum cpu_led_event evt)
++{
++	return;
++}
++#endif
++
+ #endif		/* __LINUX_LEDS_H_INCLUDED */
+-- 
+1.7.9.5
diff --git a/a/content_digest b/N1/content_digest
index 8f101e0..ad54452 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -1,17 +1,25 @@
  "ref\01335771444-26361-1-git-send-email-bryan.wu@canonical.com\0"
  "ref\01335771444-26361-3-git-send-email-bryan.wu@canonical.com\0"
- "From\0tim.gardner@canonical.com (Tim Gardner)\0"
- "Subject\0[PATCH 02/19] led-triggers: create a trigger for CPU activity\0"
+ "From\0Tim Gardner <tim.gardner@canonical.com>\0"
+ "Subject\0Re: [PATCH 02/19] led-triggers: create a trigger for CPU activity\0"
  "Date\0Mon, 30 Apr 2012 07:03:08 -0600\0"
- "To\0linux-arm-kernel@lists.infradead.org\0"
- "\00:1\0"
+ "To\0Bryan Wu <bryan.wu@canonical.com>\0"
+ "Cc\0linux@arm.linux.org.uk"
+  rpurdie@rpsys.net
+  linux-arm-kernel@lists.infradead.org
+  linux-kernel@vger.kernel.org
+  linus.walleij@linaro.org
+  akpm@linux-foundation.org
+  arnd.bergmann@linaro.org
+ " nicolas.pitre@linaro.org\0"
+ "\01:1\0"
  "b\0"
  "On 04/30/2012 01:37 AM, Bryan Wu wrote:\n"
  "> Attempting to consolidate the ARM LED code, this removes the\n"
  "> custom RealView LED trigger code to turn LEDs on and off in\n"
  "> response to CPU activity and replace it with a standard trigger.\n"
  "> \n"
- "> (bryan.wu at canonical.com:\n"
+ "> (bryan.wu@canonical.com:\n"
  "> It introduces several syscore stubs into this trigger.\n"
  "> It also provides ledtrig_cpu trigger event stub in <linux/leds.h>.\n"
  "> Although it was inspired by ARM work, it can be used in other arch.)\n"
@@ -132,13 +140,263 @@
  "\n"
  "rtg\n"
  "-- \n"
- "Tim Gardner tim.gardner at canonical.com\n"
- "-------------- next part --------------\n"
- "A non-text attachment was scrubbed...\n"
- "Name: 0001-led-triggers-create-a-trigger-for-CPU-activity.patch\n"
- "Type: text/x-patch\n"
- "Size: 7256 bytes\n"
- "Desc: not available\n"
- URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120430/71b769f5/attachment.bin>
+ Tim Gardner tim.gardner@canonical.com
+ "\01:2\0"
+ "fn\00001-led-triggers-create-a-trigger-for-CPU-activity.patch\0"
+ "b\0"
+ ">From 37cb1dc95f0af9d9916e856111bd19ecf6688c1c Mon Sep 17 00:00:00 2001\n"
+ "From: Bryan Wu <bryan.wu@canonical.com>\n"
+ "Date: Mon, 30 Apr 2012 15:37:07 +0800\n"
+ "Subject: [PATCH] led-triggers: create a trigger for CPU activity\n"
+ "\n"
+ "Attempting to consolidate the ARM LED code, this removes the\n"
+ "custom RealView LED trigger code to turn LEDs on and off in\n"
+ "response to CPU activity and replace it with a standard trigger.\n"
+ "\n"
+ "(bryan.wu@canonical.com:\n"
+ "It introduces several syscore stubs into this trigger.\n"
+ "It also provides ledtrig_cpu trigger event stub in <linux/leds.h>.\n"
+ "Although it was inspired by ARM work, it can be used in other arch.)\n"
+ "\n"
+ "Cc: Richard Purdie <rpurdie@rpsys.net>\n"
+ "Signed-off-by: Linus Walleij <linus.walleij@linaro.org>\n"
+ "Signed-off-by: Bryan Wu <bryan.wu@canonical.com>\n"
+ "Reviewed-by: Jamie Iles <jamie@jamieiles.com>\n"
+ "Tested-by: Jochen Friedrich <jochen@scram.de>\n"
+ "Signed-off-by: Tim Gardner <tim.gardner@canonical.com>\n"
+ "---\n"
+ " drivers/leds/Kconfig       |   10 +++\n"
+ " drivers/leds/Makefile      |    1 +\n"
+ " drivers/leds/ledtrig-cpu.c |  162 ++++++++++++++++++++++++++++++++++++++++++++\n"
+ " include/linux/leds.h       |   16 +++++\n"
+ " 4 files changed, 189 insertions(+)\n"
+ " create mode 100644 drivers/leds/ledtrig-cpu.c\n"
+ "\n"
+ "diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig\n"
+ "index ff4b8cf..b006d09 100644\n"
+ "--- a/drivers/leds/Kconfig\n"
+ "+++ b/drivers/leds/Kconfig\n"
+ "@@ -448,6 +448,16 @@ config LEDS_TRIGGER_BACKLIGHT\n"
+ " \n"
+ " \t  If unsure, say N.\n"
+ " \n"
+ "+config LEDS_TRIGGER_CPU\n"
+ "+\ttristate \"LED CPU Trigger\"\n"
+ "+\tdepends on LEDS_TRIGGERS\n"
+ "+\thelp\n"
+ "+\t  This allows LEDs to be controlled by active CPUs. This shows\n"
+ "+\t  the active CPUs across an array of LEDs so you can see which\n"
+ "+\t  CPUs are active on the system at any given moment.\n"
+ "+\n"
+ "+\t  If unsure, say N.\n"
+ "+\n"
+ " config LEDS_TRIGGER_GPIO\n"
+ " \ttristate \"LED GPIO Trigger\"\n"
+ " \tdepends on LEDS_TRIGGERS\n"
+ "diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile\n"
+ "index 890481c..0a3d5ad 100644\n"
+ "--- a/drivers/leds/Makefile\n"
+ "+++ b/drivers/leds/Makefile\n"
+ "@@ -55,4 +55,5 @@ obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK)\t+= ledtrig-ide-disk.o\n"
+ " obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT)\t+= ledtrig-heartbeat.o\n"
+ " obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT)\t+= ledtrig-backlight.o\n"
+ " obj-$(CONFIG_LEDS_TRIGGER_GPIO)\t\t+= ledtrig-gpio.o\n"
+ "+obj-$(CONFIG_LEDS_TRIGGER_CPU)\t\t+= ledtrig-cpu.o\n"
+ " obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON)\t+= ledtrig-default-on.o\n"
+ "diff --git a/drivers/leds/ledtrig-cpu.c b/drivers/leds/ledtrig-cpu.c\n"
+ "new file mode 100644\n"
+ "index 0000000..47f5fa5\n"
+ "--- /dev/null\n"
+ "+++ b/drivers/leds/ledtrig-cpu.c\n"
+ "@@ -0,0 +1,162 @@\n"
+ "+/*\n"
+ "+ * ledtrig-cpu.c - LED trigger based on CPU activity\n"
+ "+ *\n"
+ "+ * This LED trigger will be registered for each possible CPU and named as\n"
+ "+ * cpu0, cpu1, cpu2, cpu3, etc.\n"
+ "+ *\n"
+ "+ * It can be bound to any LED just like other triggers using either a\n"
+ "+ * board file or via sysfs interface.\n"
+ "+ *\n"
+ "+ * An API named ledtrig_cpu is exported for any user, who want to add CPU\n"
+ "+ * activity indication in their code\n"
+ "+ *\n"
+ "+ * Copyright 2011 Linus Walleij <linus.walleij@linaro.org>\n"
+ "+ * Copyright 2011 - 2012 Bryan Wu <bryan.wu@canonical.com>\n"
+ "+ *\n"
+ "+ * This program is free software; you can redistribute it and/or modify\n"
+ "+ * it under the terms of the GNU General Public License version 2 as\n"
+ "+ * published by the Free Software Foundation.\n"
+ "+ *\n"
+ "+ */\n"
+ "+\n"
+ "+#include <linux/module.h>\n"
+ "+#include <linux/kernel.h>\n"
+ "+#include <linux/init.h>\n"
+ "+#include <linux/slab.h>\n"
+ "+#include <linux/percpu.h>\n"
+ "+#include <linux/syscore_ops.h>\n"
+ "+#include <linux/mutex.h>\n"
+ "+#include \"leds.h\"\n"
+ "+\n"
+ "+#define MAX_NAME_LEN\t8\n"
+ "+\n"
+ "+static DEFINE_PER_CPU(struct led_trigger *, cpu_trig);\n"
+ "+static DEFINE_PER_CPU(char [MAX_NAME_LEN], trig_name);\n"
+ "+static DEFINE_PER_CPU(struct mutex, trig_lock);\n"
+ "+\n"
+ "+/**\n"
+ "+ * ledtrig_cpu - emit a CPU event as a trigger\n"
+ "+ * @evt: CPU event to be emitted\n"
+ "+ *\n"
+ "+ * Emit a CPU event on a CPU core, which will trigger a\n"
+ "+ * binded LED to turn on or turn off.\n"
+ "+ */\n"
+ "+void ledtrig_cpu(enum cpu_led_event ledevt)\n"
+ "+{\n"
+ "+\tstruct mutex *lock = this_cpu_ptr(&trig_lock);\n"
+ "+\tstruct led_trigger *trig;\n"
+ "+\n"
+ "+\tmutex_lock(lock);\n"
+ "+\n"
+ "+\ttrig = __get_cpu_var(cpu_trig);\n"
+ "+\n"
+ "+\t/* Locate the correct CPU LED */\n"
+ "+\tswitch (ledevt) {\n"
+ "+\tcase CPU_LED_IDLE_END:\n"
+ "+\tcase CPU_LED_START:\n"
+ "+\t\t/* Will turn the LED on, max brightness */\n"
+ "+\t\tled_trigger_event(trig, LED_FULL);\n"
+ "+\t\tbreak;\n"
+ "+\n"
+ "+\tcase CPU_LED_IDLE_START:\n"
+ "+\tcase CPU_LED_STOP:\n"
+ "+\tcase CPU_LED_HALTED:\n"
+ "+\t\t/* Will turn the LED off */\n"
+ "+\t\tled_trigger_event(trig, LED_OFF);\n"
+ "+\t\tbreak;\n"
+ "+\n"
+ "+\tdefault:\n"
+ "+\t\t/* Will leave the LED as it is */\n"
+ "+\t\tbreak;\n"
+ "+\t}\n"
+ "+\n"
+ "+\tmutex_unlock(lock);\n"
+ "+}\n"
+ "+EXPORT_SYMBOL(ledtrig_cpu);\n"
+ "+\n"
+ "+static int ledtrig_cpu_syscore_suspend(void)\n"
+ "+{\n"
+ "+\tledtrig_cpu(CPU_LED_STOP);\n"
+ "+\treturn 0;\n"
+ "+}\n"
+ "+\n"
+ "+static void ledtrig_cpu_syscore_resume(void)\n"
+ "+{\n"
+ "+\tledtrig_cpu(CPU_LED_START);\n"
+ "+}\n"
+ "+\n"
+ "+static void ledtrig_cpu_syscore_shutdown(void)\n"
+ "+{\n"
+ "+\tledtrig_cpu(CPU_LED_HALTED);\n"
+ "+}\n"
+ "+\n"
+ "+static struct syscore_ops ledtrig_cpu_syscore_ops = {\n"
+ "+\t.shutdown\t= ledtrig_cpu_syscore_shutdown,\n"
+ "+\t.suspend\t= ledtrig_cpu_syscore_suspend,\n"
+ "+\t.resume\t\t= ledtrig_cpu_syscore_resume,\n"
+ "+};\n"
+ "+\n"
+ "+static int __init ledtrig_cpu_init(void)\n"
+ "+{\n"
+ "+\tint cpu;\n"
+ "+\n"
+ "+\t/* Supports up to 9999 cpu cores */\n"
+ "+\tBUILD_BUG_ON(CONFIG_NR_CPUS > 9999);\n"
+ "+\n"
+ "+\t/*\n"
+ "+\t * Registering CPU led trigger for each CPU core here\n"
+ "+\t * ignores CPU hotplug, but after this CPU hotplug works\n"
+ "+\t * fine with this trigger.\n"
+ "+\t */\n"
+ "+\tfor_each_possible_cpu(cpu) {\n"
+ "+\t\tstruct led_trigger *trig;\n"
+ "+\t\tchar *name = per_cpu(trig_name, cpu);\n"
+ "+\t\tstruct mutex *lock = &per_cpu(trig_lock, cpu);\n"
+ "+\n"
+ "+\t\tmutex_init(lock);\n"
+ "+\n"
+ "+\t\tsnprintf(name, MAX_NAME_LEN, \"cpu%d\", cpu);\n"
+ "+\n"
+ "+\t\tmutex_lock(lock);\n"
+ "+\t\tled_trigger_register_simple(name, &trig);\n"
+ "+\t\tper_cpu(cpu_trig, cpu) = trig;\n"
+ "+\t\tmutex_unlock(lock);\n"
+ "+\t}\n"
+ "+\n"
+ "+\tregister_syscore_ops(&ledtrig_cpu_syscore_ops);\n"
+ "+\n"
+ "+\tpr_info(\"ledtrig-cpu: registered to indicate activity on CPUs\\n\");\n"
+ "+\n"
+ "+\treturn 0;\n"
+ "+}\n"
+ "+module_init(ledtrig_cpu_init);\n"
+ "+\n"
+ "+static void __exit ledtrig_cpu_exit(void)\n"
+ "+{\n"
+ "+\tint cpu;\n"
+ "+\n"
+ "+\tfor_each_possible_cpu(cpu) {\n"
+ "+\t\tstruct mutex *lock = &per_cpu(trig_lock, cpu);\n"
+ "+\t\tstruct led_trigger *trig;\n"
+ "+\t\tchar *name;\n"
+ "+\n"
+ "+\t\tmutex_lock(lock);\n"
+ "+\n"
+ "+\t\ttrig = per_cpu(cpu_trig, cpu);\n"
+ "+\t\tname = per_cpu(trig_name, cpu);\n"
+ "+\n"
+ "+\t\tled_trigger_unregister_simple(trig);\n"
+ "+\t\tper_cpu(cpu_trig, cpu) = NULL;\n"
+ "+\t\tmemset(name, 0, MAX_NAME_LEN);\n"
+ "+\n"
+ "+\t\tmutex_unlock(lock);\n"
+ "+\t}\n"
+ "+\n"
+ "+\tunregister_syscore_ops(&ledtrig_cpu_syscore_ops);\n"
+ "+}\n"
+ "+module_exit(ledtrig_cpu_exit);\n"
+ "+\n"
+ "+MODULE_AUTHOR(\"Linus Walleij <linus.walleij@linaro.org>\");\n"
+ "+MODULE_AUTHOR(\"Bryan Wu <bryan.wu@canonical.com>\");\n"
+ "+MODULE_DESCRIPTION(\"CPU LED trigger\");\n"
+ "+MODULE_LICENSE(\"GPL\");\n"
+ "diff --git a/include/linux/leds.h b/include/linux/leds.h\n"
+ "index 5884def..5fae540 100644\n"
+ "--- a/include/linux/leds.h\n"
+ "+++ b/include/linux/leds.h\n"
+ "@@ -210,4 +210,20 @@ struct gpio_led_platform_data {\n"
+ " struct platform_device *gpio_led_register_device(\n"
+ " \t\tint id, const struct gpio_led_platform_data *pdata);\n"
+ " \n"
+ "+enum cpu_led_event {\n"
+ "+\tCPU_LED_IDLE_START,\t/* CPU enters idle */\n"
+ "+\tCPU_LED_IDLE_END,\t/* CPU idle ends */\n"
+ "+\tCPU_LED_START,\t\t/* Machine starts, especially resume */\n"
+ "+\tCPU_LED_STOP,\t\t/* Machine stops, especially suspend */\n"
+ "+\tCPU_LED_HALTED,\t\t/* Machine shutdown */\n"
+ "+};\n"
+ "+#if defined(CONFIG_LEDS_TRIGGER_CPU) || defined(CONFIG_LEDS_TRIGGER_CPU_MODULE)\n"
+ "+extern void ledtrig_cpu(enum cpu_led_event evt);\n"
+ "+#else\n"
+ "+static inline void ledtrig_cpu(enum cpu_led_event evt)\n"
+ "+{\n"
+ "+\treturn;\n"
+ "+}\n"
+ "+#endif\n"
+ "+\n"
+ " #endif\t\t/* __LINUX_LEDS_H_INCLUDED */\n"
+ "-- \n"
+ 1.7.9.5
 
-7a32afbd41e40a8599246fec5907e3dc357dd2ed95f90cd4f0b5cf4d20795056
+21e05cb560bc797bbe8410c28ef99b0e84a6f8e9b9cd3be8f8abd1e87b9d5e10

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.