Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 92e015cb authored by Márton Németh's avatar Márton Németh Committed by Richard Purdie
Browse files

leds: hw acceleration for Clevo mail LED driver



Add support for hardware accelerated LED blinking for the mail LED
commonly found on Clevo notebooks.

Signed-off-by: default avatarMárton Németh <nm127@freemail.hu>
Signed-off-by: default avatarRichard Purdie <rpurdie@rpsys.net>
parent 4c79141d
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -122,9 +122,11 @@ config LEDS_CLEVO_MAIL
	  programs through the leds subsystem. This LED have three
	  known mode: off, blink at 0.5Hz and blink at 1Hz.

	  As this LED cannot change it's brightness it blinks instead.
	  The brightness value 0 means off, 1..127 means blink at 0.5Hz
	  and 128..255 means blink at 1Hz.
	  The driver supports two kinds of interface: using ledtrig-timer
	  or through /sys/class/leds/clevo::mail/brightness. As this LED
	  cannot change it's brightness it blinks instead. The brightness
	  value 0 means off, 1..127 means blink at 0.5Hz and 128..255 means
	  blink at 1Hz.

	  This module can drive the mail LED for the following notebooks:

+37 −0
Original line number Diff line number Diff line
@@ -92,9 +92,46 @@ static void clevo_mail_led_set(struct led_classdev *led_cdev,

}

static int clevo_mail_led_blink(struct led_classdev *led_cdev,
				unsigned long* delay_on,
				unsigned long* delay_off)
{
	int status = -EINVAL;

	if (*delay_on == 0 /* ms */ && *delay_off == 0 /* ms */) {
		/* Special case: the leds subsystem requested us to
		 * chose one user friendly blinking of the LED, and
		 * start it. Let's blink the led slowly (0.5Hz).
		 */
		*delay_on = 1000; /* ms */
		*delay_off = 1000; /* ms */
		i8042_command(NULL, CLEVO_MAIL_LED_BLINK_0_5HZ);
		status = 0;

	} else if (*delay_on == 500 /* ms */ && *delay_off == 500 /* ms */) {
		/* blink the led with 1Hz */
		i8042_command(NULL, CLEVO_MAIL_LED_BLINK_1HZ);
		status = 0;

	} else if (*delay_on == 1000 /* ms */ && *delay_off == 1000 /* ms */) {
		/* blink the led with 0.5Hz */
		i8042_command(NULL, CLEVO_MAIL_LED_BLINK_0_5HZ);
		status = 0;

	} else {
		printk(KERN_DEBUG KBUILD_MODNAME
		       ": clevo_mail_led_blink(..., %lu, %lu),"
		       " returning -EINVAL (unsupported)\n",
		       *delay_on, *delay_off);
	}

	return status;
}

static struct led_classdev clevo_mail_led = {
	.name			= "clevo::mail",
	.brightness_set		= clevo_mail_led_set,
	.blink_set		= clevo_mail_led_blink,
};

static int __init clevo_mail_led_probe(struct platform_device *pdev)