diff options
author | XpLoDWilD <xplodgui@gmail.com> | 2012-06-12 19:38:38 +0200 |
---|---|---|
committer | XpLoDWilD <xplodgui@gmail.com> | 2012-06-12 19:38:38 +0200 |
commit | 7a8d0b300548ea86f031c38eb0aafd69b8c037c8 (patch) | |
tree | c124da37cfc99c20bd2587897f1265cbcdbdd724 /drivers/leds | |
parent | da7511a1a880ae805643c99b90924970018caf78 (diff) | |
download | kernel_samsung_smdk4412-7a8d0b300548ea86f031c38eb0aafd69b8c037c8.tar.gz kernel_samsung_smdk4412-7a8d0b300548ea86f031c38eb0aafd69b8c037c8.tar.bz2 kernel_samsung_smdk4412-7a8d0b300548ea86f031c38eb0aafd69b8c037c8.zip |
Make led fade switchable (echo "0">led_fade to disable fading, 1 to enable)
Diffstat (limited to 'drivers/leds')
-rw-r--r-- | drivers/leds/leds-an30259a.c | 72 |
1 files changed, 59 insertions, 13 deletions
diff --git a/drivers/leds/leds-an30259a.c b/drivers/leds/leds-an30259a.c index 224767380cd..90dc15b96f2 100644 --- a/drivers/leds/leds-an30259a.c +++ b/drivers/leds/leds-an30259a.c @@ -140,8 +140,10 @@ struct i2c_client *b_client; #ifdef SEC_LED_SPECIFIC extern struct class *sec_class; struct device *led_dev; +int hacksung_enable_fade; /*path : /sys/class/sec/led/led_pattern*/ /*path : /sys/class/sec/led/led_blink*/ +/*path : /sys/class/sec/led/led_fade*/ /*path : /sys/class/leds/led_r/brightness*/ /*path : /sys/class/leds/led_g/brightness*/ /*path : /sys/class/leds/led_b/brightness*/ @@ -408,12 +410,21 @@ static void an30259a_set_led_blink(enum an30259a_led_enum led, } else leds_on(led, true, true, brightness); - leds_set_slope_mode(client, led, 0, 15, 7, 0, - (delay_on_time + AN30259A_TIME_UNIT - 1) / - AN30259A_TIME_UNIT, - (delay_off_time + AN30259A_TIME_UNIT - 1) / - AN30259A_TIME_UNIT, - 1, 1, 1, 1); + if (hacksung_enable_fade == 1) { + leds_set_slope_mode(client, led, 0, 15, 7, 0, + (delay_on_time + AN30259A_TIME_UNIT - 1) / + AN30259A_TIME_UNIT, + (delay_off_time + AN30259A_TIME_UNIT - 1) / + AN30259A_TIME_UNIT, + 1, 1, 1, 1); + } else { + leds_set_slope_mode(client, led, 0, 15, 15, 0, + (delay_on_time + AN30259A_TIME_UNIT - 1) / + AN30259A_TIME_UNIT, + (delay_off_time + AN30259A_TIME_UNIT - 1) / + AN30259A_TIME_UNIT, + 0, 0, 0, 0); + } } static ssize_t store_an30259a_led_br_lev(struct device *dev, @@ -501,6 +512,28 @@ static ssize_t store_an30259a_led_blink(struct device *dev, return count; } +static ssize_t store_an30259a_led_fade(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + int retval; + int enabled = 0; + struct an30259a_data *data = dev_get_drvdata(dev); + + retval = sscanf(buf, "%d", &enabled); + + if (retval == 0) { + dev_err(&data->client->dev, "fail to get led_fade value.\n"); + return count; + } + + hacksung_enable_fade = enabled; + + printk(KERN_DEBUG "led_fade is called\n"); + + return count; +} + static ssize_t store_led_r(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) @@ -682,6 +715,8 @@ static DEVICE_ATTR(led_pattern, 0664, NULL, \ store_an30259a_led_pattern); static DEVICE_ATTR(led_blink, 0664, NULL, \ store_an30259a_led_blink); +static DEVICE_ATTR(led_fade, 0664, NULL, \ + store_an30259a_led_fade); static DEVICE_ATTR(led_br_lev, 0664, NULL, \ store_an30259a_led_br_lev); @@ -704,6 +739,7 @@ static struct attribute *sec_led_attributes[] = { &dev_attr_led_b.attr, &dev_attr_led_pattern.attr, &dev_attr_led_blink.attr, + &dev_attr_led_fade.attr, &dev_attr_led_br_lev.attr, NULL, }; @@ -804,6 +840,8 @@ static int __devinit an30259a_probe(struct i2c_client *client, } #ifdef SEC_LED_SPECIFIC + hacksung_enable_fade = 1; + led_dev = device_create(sec_class, NULL, 0, data, "led"); if (IS_ERR(led_dev)) { dev_err(&client->dev, @@ -825,16 +863,23 @@ exit: static int __devexit an30259a_remove(struct i2c_client *client) { struct an30259a_data *data = i2c_get_clientdata(client); - int i; dev_dbg(&client->adapter->dev, "%s\n", __func__); - // clear leds on shutdown - an30259a_set_led_blink(LED_R, 0, 0, 0); - an30259a_set_led_blink(LED_G, 0, 0, 0); - an30259a_set_led_blink(LED_B, 0, 0, 0); - leds_i2c_write_all(data->client); - msleep(200); + // this is not an ugly hack to shutdown led. + data->shadow_reg[AN30259A_REG_LEDON] &= ~(LED_ON << 0); + data->shadow_reg[AN30259A_REG_LEDON] &= ~(LED_ON << 1); + data->shadow_reg[AN30259A_REG_LEDON] &= ~(LED_ON << 2); + data->shadow_reg[AN30259A_REG_LED1CNT2 + 0 * 4] &= ~AN30259A_MASK_DELAY; + data->shadow_reg[AN30259A_REG_LED1CNT2 + 1 * 4] &= ~AN30259A_MASK_DELAY; + data->shadow_reg[AN30259A_REG_LED1CNT2 + 2 * 4] &= ~AN30259A_MASK_DELAY; + data->shadow_reg[AN30259A_REG_LEDON] &= ~(LED_SLOPE_MODE << 0); + data->shadow_reg[AN30259A_REG_LEDON] &= ~(LED_SLOPE_MODE << 1); + data->shadow_reg[AN30259A_REG_LEDON] &= ~(LED_SLOPE_MODE << 2); + data->shadow_reg[AN30259A_REG_LED1CC + 0] = 0; + data->shadow_reg[AN30259A_REG_LED1CC + 1] = 0; + data->shadow_reg[AN30259A_REG_LED1CC + 2] = 0; + msleep(200); #ifdef SEC_LED_SPECIFIC sysfs_remove_group(&led_dev->kobj, &sec_led_attr_group); @@ -845,6 +890,7 @@ static int __devexit an30259a_remove(struct i2c_client *client) led_classdev_unregister(&data->leds[i].cdev); cancel_work_sync(&data->leds[i].brightness_work); } + mutex_destroy(&data->mutex); kfree(data); return 0; |