All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Németh Márton" <nm127@freemail.hu>
To: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: Richard Purdie <rpurdie@rpsys.net>,
	linux-input@atrey.karlin.mff.cuni.cz,
	linux-kernel@vger.kernel.org, Rodrigo Pereira <rodripe@gmail.com>
Subject: Re: [PATCH 2/3] leds-clevo-mail: hw accelerated LED blink extension
Date: Tue, 17 Jul 2007 20:13:02 +0200	[thread overview]
Message-ID: <469D06AE.2070608@freemail.hu> (raw)
In-Reply-To: <469C977A.8000908@freemail.hu>

From: Márton Németh <nm127@freemail.hu>

Extends the leds subsystem with a blink_set() callback function which can
optionally implemented by a LED driver. If implemented, the driver can use the
hardware acceleration for blinking a LED.

Signed-off-by: Márton Németh <nm127@freemail.hu>
---
diff -uprN linux-2.6.22.orig/Documentation/leds-class.txt linux-2.6.22/Documentation/leds-class.txt
--- linux-2.6.22.orig/Documentation/leds-class.txt	2007-07-09 01:32:17.000000000 +0200
+++ linux-2.6.22/Documentation/leds-class.txt	2007-07-17 17:07:44.000000000 +0200
@@ -47,6 +47,17 @@ overhead, I suggest these become part of
  above leaves scope for further attributes should they be needed.


+Hardware accelerated blink of LEDs
+==================================
+
+Some LEDs can be programmed to blink without any CPU interaction. To
+support this feature, a LED driver can optionally implement the
+blink_set() function (see <linux/leds.h>). If implemeted, the
+ledtrig-timer tries to use it. The blink_set() function should return
+0 if the blink setting is supported, or -EINVAL otherwise, which means
+that the LED will be turned on and off from software.
+
+
  Known Issues
  ============

@@ -55,10 +66,6 @@ would cause nightmare dependency issues.
  compared to the benefits the simple trigger functionality brings. The
  rest of the LED subsystem can be modular.

-Some leds can be programmed to flash in hardware. As this isn't a generic
-LED device property, this should be exported as a device specific sysfs
-attribute rather than part of the class if this functionality is required.
-

  Future Development
  ==================
diff -uprN linux-2.6.22.orig/drivers/leds/ledtrig-timer.c linux-2.6.22/drivers/leds/ledtrig-timer.c
--- linux-2.6.22.orig/drivers/leds/ledtrig-timer.c	2007-07-09 01:32:17.000000000 +0200
+++ linux-2.6.22/drivers/leds/ledtrig-timer.c	2007-07-17 17:45:56.000000000 +0200
@@ -76,8 +76,21 @@ static ssize_t led_delay_on_store(struct
  		count++;

  	if (count == size) {
-		timer_data->delay_on = state;
-		mod_timer(&timer_data->timer, jiffies + 1);
+		if (timer_data->delay_on != state) {
+			/* the new value differs from the previous */
+			timer_data->delay_on = state;
+
+			/* deactivate previous settings */
+			del_timer_sync(&timer_data->timer);
+
+			/* try to activate hardware acceleration, if any */
+			if (!led_cdev->blink_set ||
+			    led_cdev->blink_set(led_cdev,
+				timer_data->delay_on, timer_data->delay_off)) {
+				/* no hardware acceleration, blink via timer */
+				mod_timer(&timer_data->timer, jiffies + 1);
+			}
+		}
  		ret = count;
  	}

@@ -108,8 +121,21 @@ static ssize_t led_delay_off_store(struc
  		count++;

  	if (count == size) {
-		timer_data->delay_off = state;
-		mod_timer(&timer_data->timer, jiffies + 1);
+		if (timer_data->delay_off != state) {
+			/* the new value differs from the previous */
+			timer_data->delay_off = state;
+
+			/* deactivate previous settings */
+			del_timer_sync(&timer_data->timer);
+
+			/* try to activate hardware acceleration, if any */
+			if (!led_cdev->blink_set ||
+			    led_cdev->blink_set(led_cdev,
+				timer_data->delay_on, timer_data->delay_off)) {
+				/* no hardware acceleration, blink via timer */
+				mod_timer(&timer_data->timer, jiffies + 1);
+			}
+		}
  		ret = count;
  	}

diff -uprN linux-2.6.22.orig/include/linux/leds.h linux-2.6.22/include/linux/leds.h
--- linux-2.6.22.orig/include/linux/leds.h	2007-07-09 01:32:17.000000000 +0200
+++ linux-2.6.22/include/linux/leds.h	2007-07-17 10:52:18.000000000 +0200
@@ -38,6 +38,11 @@ struct led_classdev {
  	void		(*brightness_set)(struct led_classdev *led_cdev,
  					  enum led_brightness brightness);

+	/* Activate hardware accelerated blink */
+	int		(*blink_set)(struct led_classdev *led_cdev,
+				     int delay_on, int delay_off);
+
+
  	struct class_device	*class_dev;
  	struct list_head	 node;			/* LED Device list */
  	char			*default_trigger;	/* Trigger to use */

  parent reply	other threads:[~2007-07-17 18:13 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-07-17 10:18 [PATCH 2/3] leds-clevo-mail: hw accelerated LED blink extension Németh Márton
2007-07-17 13:04 ` Dmitry Torokhov
2007-07-17 18:13 ` Németh Márton [this message]
  -- strict thread matches above, loose matches on Subject: below --
2007-10-19 18:52 Németh Márton
2007-10-21 12:54 ` Németh Márton
2007-10-23 21:49   ` Richard Purdie

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=469D06AE.2070608@freemail.hu \
    --to=nm127@freemail.hu \
    --cc=dmitry.torokhov@gmail.com \
    --cc=linux-input@atrey.karlin.mff.cuni.cz \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rodripe@gmail.com \
    --cc=rpurdie@rpsys.net \
    /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.