leds-clevo-mail: hw accelerated LED blink extension
Subsystems (3)
PATCH 2/3 leds-clevo-mail: hw accelerated LED blink extension
From: Márton Németh <[email protected]>
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 <[email protected]>
---
Documentation/leds-class.txt +11 -4
@@ -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 +1 if the blink setting is supported, or 0 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 ==================
drivers/leds/ledtrig-timer.c +30 -4
@@ -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; }
include/linux/leds.h +5 -0
@@ -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 */
Documentation/leds-class.txt overhead, I suggest these become part of · line 58
Quoted 10 lines · Németh Márton
Documentation/leds-class.txt +9
-0+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 +1 if the blink setting is supported, or 0 otherwise, which means that +the LED will be turned on and off from software.
Normally object methods in kernel return 0 on success and error code (such as -EINVAL for unsupported parameters) on error.
Signature · 1 line
Dmitry
From: Márton Németh <[email protected]>
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 <[email protected]>
---
Documentation/leds-class.txt +11 -4
@@ -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 ==================
drivers/leds/ledtrig-timer.c +30 -4
@@ -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; }
include/linux/leds.h +5 -0
@@ -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 */