diff options
| author | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2007-09-28 19:01:19 +0000 | 
|---|---|---|
| committer | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2007-09-28 19:01:19 +0000 | 
| commit | aeb4ac40138bcd71a7e8c38efce30fd4296655bb (patch) | |
| tree | 313c299691ca9cd52535afb9fe7044db34c1a59e | |
| parent | 269c5ad7a11719ec8313cd80482944f43e93e845 (diff) | |
[adm5120] morse LED trigger cleanups
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@9054 3c298f89-4303-0410-b956-a3cf2f4a3e73
| -rw-r--r-- | target/linux/adm5120/files/drivers/leds/ledtrig-morse.c | 50 | 
1 files changed, 30 insertions, 20 deletions
| diff --git a/target/linux/adm5120/files/drivers/leds/ledtrig-morse.c b/target/linux/adm5120/files/drivers/leds/ledtrig-morse.c index 1f215bc27..13998ea10 100644 --- a/target/linux/adm5120/files/drivers/leds/ledtrig-morse.c +++ b/target/linux/adm5120/files/drivers/leds/ledtrig-morse.c @@ -32,6 +32,15 @@  #include "leds.h" +#define MORSE_DELAY_BASE	(HZ/2) + +#define MORSE_STATE_BLINK_START	0 +#define MORSE_STATE_BLINK_STOP	1 + +#define MORSE_DIT_LEN	1 +#define MORSE_DAH_LEN	3 +#define MORSE_SPACE_LEN	7 +  struct morse_trig_data {  	unsigned long delay;  	char *msg; @@ -64,17 +73,17 @@ static inline unsigned char tomorse(char c) {  static inline unsigned long dit_len(struct morse_trig_data *morse_data)  { -	return morse_data->delay; +	return MORSE_DIT_LEN*morse_data->delay;  }  static inline unsigned long dah_len(struct morse_trig_data *morse_data)  { -	return 3*morse_data->delay; +	return MORSE_DAH_LEN*morse_data->delay;  }  static inline unsigned long space_len(struct morse_trig_data *morse_data)  { -	return 7*morse_data->delay; +	return MORSE_SPACE_LEN*morse_data->delay;  }  static void morse_timer_function(unsigned long data) @@ -88,17 +97,17 @@ static void morse_timer_function(unsigned long data)  		goto set_led;  	switch (morse_data->state) { -	case 0: +	case MORSE_STATE_BLINK_START:  		/* Starting a new blink.  We have a valid code in morse. */  		delay = (morse_data->morse & 001) ? dah_len(morse_data):  			dit_len(morse_data);  		brightness = LED_FULL; -		morse_data->state = 1; +		morse_data->state = MORSE_STATE_BLINK_STOP;  		morse_data->morse >>= 1;  		break; -	case 1: +	case MORSE_STATE_BLINK_STOP:  		/* Coming off of a blink. */ -		morse_data->state = 0; +		morse_data->state = MORSE_STATE_BLINK_START;  		if (morse_data->morse > 1) {  			/* Not done yet, just a one-dit pause. */ @@ -122,7 +131,8 @@ static void morse_timer_function(unsigned long data)  		if (!(morse_data->morse = tomorse(*morse_data->msgpos))) {  			delay = space_len(morse_data); -			morse_data->state = 1;	/* And get us back here */ +			/* And get us back here */ +			morse_data->state = MORSE_STATE_BLINK_STOP;  		}  		morse_data->msgpos++;  		break; @@ -193,12 +203,12 @@ static ssize_t morse_msg_store(struct class_device *dev, const char *buf,  	memcpy(m,buf,size);  	m[size]='\0'; -	if (!morse_data->msg) +	if (morse_data->msg)  		kfree(morse_data->msg);  	morse_data->msg = m;  	morse_data->msgpos = NULL; -	morse_data->state = 1; +	morse_data->state = MORSE_STATE_BLINK_STOP;  	mod_timer(&morse_data->timer, jiffies + 1); @@ -217,12 +227,10 @@ static void morse_trig_activate(struct led_classdev *led_cdev)  	if (!morse_data)  		return; -	led_cdev->trigger_data = morse_data; - -	morse_data->delay = (HZ/2); +	morse_data->delay = MORSE_DELAY_BASE;  	init_timer(&morse_data->timer);  	morse_data->timer.function = morse_timer_function; -	morse_data->timer.data = (unsigned long) led_cdev; +	morse_data->timer.data = (unsigned long)led_cdev;  	rc = class_device_create_file(led_cdev->class_dev,  				&class_device_attr_delay); @@ -232,13 +240,14 @@ static void morse_trig_activate(struct led_classdev *led_cdev)  				&class_device_attr_message);  	if (rc) goto err_delay; +	led_cdev->trigger_data = morse_data; +  	return;  err_delay:  	class_device_remove_file(led_cdev->class_dev,  				&class_device_attr_delay);  err: -	led_cdev->trigger_data = NULL;  	kfree(morse_data);  } @@ -255,15 +264,16 @@ static void morse_trig_deactivate(struct led_classdev *led_cdev)  		&class_device_attr_delay);  	del_timer_sync(&morse_data->timer); -	if (!morse_data->msg) +	if (morse_data->msg)  		kfree(morse_data->msg); +  	kfree(morse_data);  }  static struct led_trigger morse_led_trigger = { -	.name     = "morse", -	.activate = morse_trig_activate, -	.deactivate = morse_trig_deactivate, +	.name		= "morse", +	.activate	= morse_trig_activate, +	.deactivate	= morse_trig_deactivate,  };  static int __init morse_trig_init(void) @@ -279,6 +289,6 @@ static void __exit morse_trig_exit(void)  module_init(morse_trig_init);  module_exit(morse_trig_exit); -MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>"); +MODULE_AUTHOR("Gabor Juhos <juhosg at openwrt.org>");  MODULE_DESCRIPTION("Morse LED trigger");  MODULE_LICENSE("GPL"); | 
