All of lore.kernel.org
 help / color / mirror / Atom feed
From: bryan.wu@canonical.com (Bryan Wu)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 06/17] mach-shark: retire custom LED code
Date: Wed,  6 Jul 2011 20:34:36 +0800	[thread overview]
Message-ID: <1309955687-19365-7-git-send-email-bryan.wu@canonical.com> (raw)
In-Reply-To: <1309955687-19365-1-git-send-email-bryan.wu@canonical.com>

The CPU activity LED is now handled by the trigger in the leds
subsystem, retire this old CONFIG_LEDS-based code.

Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
---
 arch/arm/Kconfig             |    6 +
 arch/arm/mach-shark/Makefile |    4 +-
 arch/arm/mach-shark/core.c   |    1 -
 arch/arm/mach-shark/leds.c   |  222 ++++++++++++++++--------------------------
 4 files changed, 90 insertions(+), 143 deletions(-)

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 9adc278..df971c7 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -783,6 +783,12 @@ config ARCH_SHARK
 	select ZONE_DMA
 	select PCI
 	select ARCH_USES_GETTIMEOFFSET
+	select NEW_LEDS
+	select LEDS_CLASS
+	select LEDS_TRIGGERS
+	select LEDS_TRIGGER_CPU
+	select LEDS_TRIGGER_HEARTBEAT
+	select LEDS_TRIGGER_DEFAULT_ON
 	help
 	  Support for the StrongARM based Digital DNARD machine, also known
 	  as "Shark" (<http://www.shark-linux.de/shark.html>).
diff --git a/arch/arm/mach-shark/Makefile b/arch/arm/mach-shark/Makefile
index 45be9b0..2965718 100644
--- a/arch/arm/mach-shark/Makefile
+++ b/arch/arm/mach-shark/Makefile
@@ -4,9 +4,7 @@
 
 # Object file lists.
 
-obj-y			:= core.o dma.o irq.o pci.o
+obj-y			:= core.o dma.o irq.o pci.o leds.o
 obj-m			:=
 obj-n			:=
 obj-			:=
-
-obj-$(CONFIG_LEDS)	+= leds.o
diff --git a/arch/arm/mach-shark/core.c b/arch/arm/mach-shark/core.c
index 5cf7f94..f4b6288 100644
--- a/arch/arm/mach-shark/core.c
+++ b/arch/arm/mach-shark/core.c
@@ -13,7 +13,6 @@
 
 #include <asm/setup.h>
 #include <asm/mach-types.h>
-#include <asm/leds.h>
 #include <asm/param.h>
 
 #include <asm/mach/map.h>
diff --git a/arch/arm/mach-shark/leds.c b/arch/arm/mach-shark/leds.c
index c9e32de..77cf16b 100644
--- a/arch/arm/mach-shark/leds.c
+++ b/arch/arm/mach-shark/leds.c
@@ -1,166 +1,110 @@
 /*
- * arch/arm/mach-shark/leds.c
- * by Alexander Schulz
- *
- * derived from:
- * arch/arm/kernel/leds-footbridge.c
- * Copyright (C) 1998-1999 Russell King
- *
  * DIGITAL Shark LED control routines.
  *
- * The leds use is as follows:
- *  - Green front - toggles state every 50 timer interrupts
- *  - Amber front - Unused, this is a dual color led (Amber/Green)
- *  - Amber back  - On if system is not idle
+ * Driver for the 3 user LEDs found on the Shark
+ * Based on Versatile and RealView machine LED code
  *
- * Changelog:
+ * License terms: GNU General Public License (GPL) version 2
+ * Author: Bryan Wu <bryan.wu@canonical.com>
  */
 #include <linux/kernel.h>
-#include <linux/module.h>
 #include <linux/init.h>
-#include <linux/spinlock.h>
-#include <linux/ioport.h>
 #include <linux/io.h>
+#include <linux/ioport.h>
+#include <linux/slab.h>
+#include <linux/leds.h>
 
-#include <asm/leds.h>
-#include <asm/system.h>
+struct shark_led {
+	struct led_classdev cdev;
+	u8 mask;
+};
 
-#define LED_STATE_ENABLED	1
-#define LED_STATE_CLAIMED	2
+/*
+ * The triggers lines up below will only be used if the
+ * LED triggers are compiled in.
+ */
+static const struct {
+	const char *name;
+	const char *trigger;
+} shark_leds[] = {
+	{ "shark:amber0", "default-on", },	/* Bit 5 */
+	{ "shark:green", "heartbeat", },	/* Bit 6 */
+	{ "shark:amber1", "cpu" },		/* Bit 7 */
+};
+
+static u16 led_reg_read(void)
+{
+	outw(0x09, 0x24);
+	return inw(0x26);
+}
 
-#define SEQUOIA_LED_GREEN       (1<<6)
-#define SEQUOIA_LED_AMBER       (1<<5)
-#define SEQUOIA_LED_BACK        (1<<7)
+static void led_reg_write(u16 value)
+{
+	outw(0x09, 0x24);
+	outw(value, 0x26);
+}
 
-static char led_state;
-static short hw_led_state;
-static short saved_state;
+static void shark_led_set(struct led_classdev *cdev,
+			      enum led_brightness b)
+{
+	struct shark_led *led = container_of(cdev,
+						 struct shark_led, cdev);
+	u16 reg = led_reg_read();
 
-static DEFINE_SPINLOCK(leds_lock);
+	if (b != LED_OFF)
+		reg |= led->mask;
+	else
+		reg &= ~led->mask;
 
-short sequoia_read(int addr) {
-  outw(addr,0x24);
-  return inw(0x26);
+	led_reg_write(reg);
 }
 
-void sequoia_write(short value,short addr) {
-  outw(addr,0x24);
-  outw(value,0x26);
+static enum led_brightness shark_led_get(struct led_classdev *cdev)
+{
+	struct shark_led *led = container_of(cdev,
+						 struct shark_led, cdev);
+	u16 reg = led_reg_read();
+
+	return (reg & led->mask) ? LED_FULL : LED_OFF;
 }
 
-static void sequoia_leds_event(led_event_t evt)
+static int __init shark_leds_init(void)
 {
-	unsigned long flags;
-
-	spin_lock_irqsave(&leds_lock, flags);
-
-	hw_led_state = sequoia_read(0x09);
-
-	switch (evt) {
-	case led_start:
-		hw_led_state |= SEQUOIA_LED_GREEN;
-		hw_led_state |= SEQUOIA_LED_AMBER;
-#ifdef CONFIG_LEDS_CPU
-		hw_led_state |= SEQUOIA_LED_BACK;
-#else
-		hw_led_state &= ~SEQUOIA_LED_BACK;
-#endif
-		led_state |= LED_STATE_ENABLED;
-		break;
-
-	case led_stop:
-		hw_led_state &= ~SEQUOIA_LED_BACK;
-		hw_led_state |= SEQUOIA_LED_GREEN;
-		hw_led_state |= SEQUOIA_LED_AMBER;
-		led_state &= ~LED_STATE_ENABLED;
-		break;
-
-	case led_claim:
-		led_state |= LED_STATE_CLAIMED;
-		saved_state = hw_led_state;
-		hw_led_state &= ~SEQUOIA_LED_BACK;
-		hw_led_state |= SEQUOIA_LED_GREEN;
-		hw_led_state |= SEQUOIA_LED_AMBER;
-		break;
-
-	case led_release:
-		led_state &= ~LED_STATE_CLAIMED;
-		hw_led_state = saved_state;
-		break;
-
-#ifdef CONFIG_LEDS_TIMER
-	case led_timer:
-		if (!(led_state & LED_STATE_CLAIMED))
-			hw_led_state ^= SEQUOIA_LED_GREEN;
-		break;
-#endif
-
-#ifdef CONFIG_LEDS_CPU
-	case led_idle_start:
-		if (!(led_state & LED_STATE_CLAIMED))
-			hw_led_state &= ~SEQUOIA_LED_BACK;
-		break;
-
-	case led_idle_end:
-		if (!(led_state & LED_STATE_CLAIMED))
-			hw_led_state |= SEQUOIA_LED_BACK;
-		break;
-#endif
-
-	case led_green_on:
-		if (led_state & LED_STATE_CLAIMED)
-			hw_led_state &= ~SEQUOIA_LED_GREEN;
-		break;
-
-	case led_green_off:
-		if (led_state & LED_STATE_CLAIMED)
-			hw_led_state |= SEQUOIA_LED_GREEN;
-		break;
-
-	case led_amber_on:
-		if (led_state & LED_STATE_CLAIMED)
-			hw_led_state &= ~SEQUOIA_LED_AMBER;
-		break;
-
-	case led_amber_off:
-		if (led_state & LED_STATE_CLAIMED)
-			hw_led_state |= SEQUOIA_LED_AMBER;
-		break;
-
-	case led_red_on:
-		if (led_state & LED_STATE_CLAIMED)
-			hw_led_state |= SEQUOIA_LED_BACK;
-		break;
-
-	case led_red_off:
-		if (led_state & LED_STATE_CLAIMED)
-			hw_led_state &= ~SEQUOIA_LED_BACK;
-		break;
-
-	default:
-		break;
-	}
+	int i;
+	u16 reg;
 
-	if  (led_state & LED_STATE_ENABLED)
-		sequoia_write(hw_led_state,0x09);
+	for (i = 0; i < ARRAY_SIZE(shark_leds); i++) {
+		struct shark_led *led;
 
-	spin_unlock_irqrestore(&leds_lock, flags);
-}
+		led = kzalloc(sizeof(*led), GFP_KERNEL);
+		if (!led)
+			break;
 
-static int __init leds_init(void)
-{
-	extern void (*leds_event)(led_event_t);
-	short temp;
-	
-	leds_event = sequoia_leds_event;
+		led->cdev.name = shark_leds[i].name;
+		led->cdev.brightness_set = shark_led_set;
+		led->cdev.brightness_get = shark_led_get;
+		led->cdev.default_trigger = shark_leds[i].trigger;
+
+		/* Count in 5 bits offset */
+		led->mask = BIT(i + 5);
+
+		if (led_classdev_register(NULL, &led->cdev) < 0) {
+			kfree(led);
+			break;
+		}
+	}
 
 	/* Make LEDs independent of power-state */
-	request_region(0x24,4,"sequoia");
-	temp = sequoia_read(0x09);
-	temp |= 1<<10;
-	sequoia_write(temp,0x09);
-	leds_event(led_start);
+	request_region(0x24, 4, "led_reg");
+	reg = led_reg_read();
+	reg |= 1 << 10;
+	led_reg_write(reg);
+
 	return 0;
 }
 
-__initcall(leds_init);
+/*
+ * Since we may have triggers on any subsystem, defer registration
+ * until after subsystem_init.
+ */
+fs_initcall(shark_leds_init);
-- 
1.7.5

  parent reply	other threads:[~2011-07-06 12:34 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-07-06 12:34 [PATCH 00/17] Introduce a led trigger for CPU activity Bryan Wu
2011-07-06 12:34 ` [PATCH 01/17] leds: create a " Bryan Wu
2011-07-06 13:16   ` Eric Miao
2011-07-06 13:35     ` Russell King - ARM Linux
2011-07-06 14:11       ` Nicolas Pitre
2011-07-07 12:58     ` Bryan Wu
2011-07-06 12:34 ` [PATCH 02/17] arm: at91: convert old leds drivers to gpio_led and led_trigger drivers Bryan Wu
2011-07-06 12:34 ` [PATCH 03/17] mach-realview: retire custom LED code Bryan Wu
2011-07-10  9:27   ` Russell King - ARM Linux
2011-07-11 14:13     ` Bryan Wu
2011-07-06 12:34 ` [PATCH 04/17] mach-versatile: " Bryan Wu
2011-07-10  9:28   ` Russell King - ARM Linux
2011-07-11 14:02     ` Bryan Wu
2011-07-12 11:12       ` Linus Walleij
2011-07-06 12:34 ` [PATCH 05/17] mach-ks8695: remove leds driver, since nobody use it Bryan Wu
2011-07-08 20:23   ` Andrew Victor
2011-07-11 11:11     ` Sergei Shtylyov
2011-07-11 13:48       ` Bryan Wu
2011-07-11 14:00         ` Nicolas Pitre
2011-07-11 14:07           ` Bryan Wu
2011-07-11 14:30             ` Andrew Victor
2011-07-06 12:34 ` Bryan Wu [this message]
2011-07-10  9:30   ` [PATCH 06/17] mach-shark: retire custom LED code Russell King - ARM Linux
2011-07-11 14:19     ` Bryan Wu
2011-07-06 12:34 ` [PATCH 07/17] mach-orion5x: convert custom LED code to gpio_led and LED CPU trigger Bryan Wu
2011-07-06 14:05   ` Nicolas Pitre
2011-07-06 12:34 ` [PATCH 08/17] mach-integrator: retire custom LED code Bryan Wu
2011-07-10  9:33   ` Russell King - ARM Linux
2011-07-19 16:20     ` Linus Walleij
2011-07-06 12:34 ` [PATCH 09/17] mach-clps711x: retire custom LED code of P720T machine Bryan Wu
2011-07-06 12:34 ` [PATCH 10/17] mach-ebsa110: retire custom LED code Bryan Wu
2011-07-10  9:36   ` Russell King - ARM Linux
2011-07-06 12:34 ` [PATCH 11/17] mach-footbridge: " Bryan Wu
2011-07-10  9:37   ` Russell King - ARM Linux
2011-07-11 14:25     ` Bryan Wu
2011-07-06 12:34 ` [PATCH 12/17] mach-pxa: " Bryan Wu
2011-07-10  9:37   ` Russell King - ARM Linux
2011-07-11 14:28     ` Bryan Wu
2011-07-06 12:34 ` [PATCH 13/17] plat-samsung: remove including old leds event API header file Bryan Wu
2011-07-06 12:34 ` [PATCH 14/17] mach-pnx4008: " Bryan Wu
2011-07-06 12:34 ` [PATCH 15/17] mach-omap1: retire custom LED code Bryan Wu
2011-07-07 14:29   ` Tony Lindgren
2011-07-06 12:34 ` [PATCH 16/17] mach-sa1100: " Bryan Wu
2011-07-06 14:04   ` Jochen Friedrich
2011-07-07 13:40     ` Bryan Wu
2011-07-07 16:23       ` Jochen Friedrich
2011-07-08  3:00         ` Bryan Wu
2011-07-08 16:10           ` Jochen Friedrich
2011-07-08 17:07             ` Russell King - ARM Linux
2011-07-10  9:24   ` Russell King - ARM Linux
2011-07-11  8:28     ` Jochen Friedrich
2011-07-11 14:38       ` Bryan Wu
2011-07-11 14:36     ` Bryan Wu
2011-07-11 21:09       ` Russell King - ARM Linux
2011-07-11 21:52         ` Arnd Bergmann
2011-07-12  0:31           ` Bryan Wu
2011-07-12  7:30             ` Russell King - ARM Linux
2011-07-12 12:52               ` Arnd Bergmann
2011-07-06 12:34 ` [PATCH 17/17] ARM: use new LEDS CPU trigger stub to replace old one Bryan Wu
2011-07-06 14:26   ` Arnd Bergmann
2011-07-06 13:13 ` [PATCH 00/17] Introduce a led trigger for CPU activity Eric Miao
2011-07-06 13:16   ` Russell King - ARM Linux
2011-07-06 13:19     ` Eric Miao
2011-07-06 13:47     ` Nicolas Pitre
2011-07-07 12:54     ` Bryan Wu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1309955687-19365-7-git-send-email-bryan.wu@canonical.com \
    --to=bryan.wu@canonical.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.