From patchwork Wed Jun 22 17:33:03 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 2179 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 5C0EF23F08 for ; Wed, 22 Jun 2011 17:38:05 +0000 (UTC) Received: from mail-vw0-f52.google.com (mail-vw0-f52.google.com [209.85.212.52]) by fiordland.canonical.com (Postfix) with ESMTP id 0A09BA18330 for ; Wed, 22 Jun 2011 17:38:04 +0000 (UTC) Received: by vws16 with SMTP id 16so1160127vws.11 for ; Wed, 22 Jun 2011 10:38:04 -0700 (PDT) Received: by 10.52.95.194 with SMTP id dm2mr1345243vdb.47.1308764284093; Wed, 22 Jun 2011 10:38:04 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.52.183.130 with SMTP id em2cs153577vdc; Wed, 22 Jun 2011 10:38:03 -0700 (PDT) Received: by 10.14.185.133 with SMTP id u5mr765704eem.107.1308764282974; Wed, 22 Jun 2011 10:38:02 -0700 (PDT) Received: from eu1sys200aog107.obsmtp.com (eu1sys200aog107.obsmtp.com [207.126.144.123]) by mx.google.com with SMTP id e62si1539864eee.68.2011.06.22.10.33.09 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 22 Jun 2011 10:38:02 -0700 (PDT) Received-SPF: neutral (google.com: 207.126.144.123 is neither permitted nor denied by best guess record for domain of linus.walleij@stericsson.com) client-ip=207.126.144.123; Authentication-Results: mx.google.com; spf=neutral (google.com: 207.126.144.123 is neither permitted nor denied by best guess record for domain of linus.walleij@stericsson.com) smtp.mail=linus.walleij@stericsson.com Received: from beta.dmz-eu.st.com ([164.129.1.35]) (using TLSv1) by eu1sys200aob107.postini.com ([207.126.147.11]) with SMTP ID DSNKTgInVVpvhgeMTZx3OS/i3FH5OmT4CYpD@postini.com; Wed, 22 Jun 2011 17:38:02 UTC Received: from zeta.dmz-eu.st.com (ns2.st.com [164.129.230.9]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 22222D3; Wed, 22 Jun 2011 17:33:08 +0000 (GMT) Received: from relay2.stm.gmessaging.net (unknown [10.230.100.18]) by zeta.dmz-eu.st.com (STMicroelectronics) with ESMTP id C8769485E; Wed, 22 Jun 2011 17:33:07 +0000 (GMT) Received: from exdcvycastm003.EQ1STM.local (alteon-source-exch [10.230.100.61]) (using TLSv1 with cipher RC4-MD5 (128/128 bits)) (Client CN "exdcvycastm003", Issuer "exdcvycastm003" (not verified)) by relay2.stm.gmessaging.net (Postfix) with ESMTPS id 90784A8074; Wed, 22 Jun 2011 19:33:00 +0200 (CEST) Received: from localhost.localdomain (10.230.100.153) by smtp.stericsson.com (10.230.100.1) with Microsoft SMTP Server (TLS) id 8.3.83.0; Wed, 22 Jun 2011 19:33:07 +0200 From: Linus Walleij To: Cc: Lee Jones , Linus Walleij , Bryan Wu , Richard Purdie Subject: [PATCH 1/3] leds: create a trigger for ARM CPU activity Date: Wed, 22 Jun 2011 19:33:03 +0200 Message-ID: <1308763983-24749-1-git-send-email-linus.walleij@stericsson.com> X-Mailer: git-send-email 1.7.3.2 MIME-Version: 1.0 From: Linus Walleij 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. It uses the existing kernel hooks deep inside to get CPU activity. Cc: Bryan Wu Cc: Richard Purdie Signed-off-by: Linus Walleij --- drivers/leds/Kconfig | 15 +++++ drivers/leds/Makefile | 1 + drivers/leds/ledtrig-arm-cpu.c | 114 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 130 insertions(+), 0 deletions(-) create mode 100644 drivers/leds/ledtrig-arm-cpu.c diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 713d43b..f725ae2 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -446,6 +446,21 @@ config LEDS_TRIGGER_BACKLIGHT If unsure, say N. +# Notice that this uses the CONFIG_LEDS i.e. the "old" LEDS +config LEDS_TRIGGER_ARM_CPU + bool "LED ARM CPU Trigger" + depends on LEDS_TRIGGERS && ARM + select LEDS + select LEDS_CPU + default y if ARCH_REALVIEW + default y if ARCH_VERSATILE + help + This allows LEDs to be controlled by active ARM CPUs. This + shows the active CPUs across an array of LEDs so you can see + what 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 bbfd2e3..a32a99c 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -53,4 +53,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_ARM_CPU) += ledtrig-arm-cpu.o obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o diff --git a/drivers/leds/ledtrig-arm-cpu.c b/drivers/leds/ledtrig-arm-cpu.c new file mode 100644 index 0000000..7776d61 --- /dev/null +++ b/drivers/leds/ledtrig-arm-cpu.c @@ -0,0 +1,114 @@ +/* + * ledtrig-arm-cpu.c - LED trigger based on ARM CPU activity + * + * Copyright 2011 Linus Walleij + * + * 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 +#include +#include +#include +#include +#include +#include +#include "leds.h" + +struct arm_cpu_trig_data { + struct led_classdev *led; +}; + +static DEFINE_PER_CPU(struct arm_cpu_trig_data *, arm_cpu_triggers); + +void arm_cpu_leds_event(led_event_t ledevt) +{ + struct arm_cpu_trig_data *trigdata = __get_cpu_var(arm_cpu_triggers); + + if (!trigdata) + return; + + /* Locate the correct CPU LED */ + + switch (ledevt) { + case led_halted: + case led_idle_start: + /* Will turn the LED off */ + if (trigdata->led) + led_set_brightness(trigdata->led, LED_OFF); + break; + + case led_idle_end: + /* Will turn the LED on, max brightness */ + if (trigdata->led) + led_set_brightness(trigdata->led, + trigdata->led->max_brightness); + break; + + default: + /* Will leave the LED as it is */ + break; + } +} + +static void arm_cpu_trig_activate_cpu(void *data) +{ + struct arm_cpu_trig_data *arm_cpu_data; + struct led_classdev *led = data; + int my_cpu = smp_processor_id(); + unsigned long target_cpu = (unsigned long) led->trigger_data; + + if (target_cpu != my_cpu) + return; + + arm_cpu_data = kzalloc(sizeof(*arm_cpu_data), GFP_KERNEL); + if (!arm_cpu_data) + return; + + dev_info(led->dev, "led %s indicate activity on CPU %d\n", + led->name, my_cpu); + + arm_cpu_data->led = led; + __get_cpu_var(arm_cpu_triggers) = arm_cpu_data; +} + +static void arm_cpu_trig_activate(struct led_classdev *led) +{ + on_each_cpu(arm_cpu_trig_activate_cpu, led, 1); + + /* Hook into ARM core kernel event callback */ + leds_event = arm_cpu_leds_event; +} + +static void arm_cpu_trig_deactivate(struct led_classdev *led) +{ + struct arm_cpu_trig_data *arm_cpu_data = led->trigger_data; + + if (arm_cpu_data) + kfree(arm_cpu_data); +} + +static struct led_trigger arm_cpu_led_trigger = { + .name = "arm-cpu", + .activate = arm_cpu_trig_activate, + .deactivate = arm_cpu_trig_deactivate, +}; + +static int __init arm_cpu_trig_init(void) +{ + return led_trigger_register(&arm_cpu_led_trigger); +} +module_init(arm_cpu_trig_init); + +static void __exit arm_cpu_trig_exit(void) +{ + led_trigger_unregister(&arm_cpu_led_trigger); +} +module_exit(arm_cpu_trig_exit); + +MODULE_AUTHOR("Linus Walleij "); +MODULE_DESCRIPTION("ARM CPU LED trigger"); +MODULE_LICENSE("GPL");