drivers: s2mu004-rgb: fade led
Adapted to 4.4.y Credits to Ktoonsez for the original implementation Signed-off-by: BlackMesa123 <brother12@hotmail.it>
This commit is contained in:
parent
89af40d1bb
commit
ffb8ecdc83
|
@ -25,6 +25,10 @@
|
||||||
#include <linux/mfd/samsung/s2mu004-private.h>
|
#include <linux/mfd/samsung/s2mu004-private.h>
|
||||||
#include <linux/leds-s2mu004-rgb.h>
|
#include <linux/leds-s2mu004-rgb.h>
|
||||||
|
|
||||||
|
unsigned int led_enable_fade = 1;
|
||||||
|
unsigned int led_fade_time_up = 800;
|
||||||
|
unsigned int led_fade_time_down = 800;
|
||||||
|
|
||||||
struct s2mu004_rgb_drvdata {
|
struct s2mu004_rgb_drvdata {
|
||||||
struct s2mu004_rgb_pdata *pdata;
|
struct s2mu004_rgb_pdata *pdata;
|
||||||
struct i2c_client *i2c;
|
struct i2c_client *i2c;
|
||||||
|
@ -75,12 +79,12 @@ static int s2mu004_rgb_ramp(struct s2mu004_rgb_drvdata *ddata,
|
||||||
int value;
|
int value;
|
||||||
int col = ddata->pdata->col[led];
|
int col = ddata->pdata->col[led];
|
||||||
|
|
||||||
if (ramp_up > 800)
|
if (ramp_up > led_fade_time_up)
|
||||||
ramp_up = ((ramp_up - 800) >> 1) + 800;
|
ramp_up = ((ramp_up - led_fade_time_up) >> 1) + led_fade_time_up;
|
||||||
ramp_up /= 100;
|
ramp_up /= 100;
|
||||||
|
|
||||||
if (ramp_down > 800)
|
if (ramp_down > led_fade_time_down)
|
||||||
ramp_down = ((ramp_down - 800) >> 1) + 800;
|
ramp_down = ((ramp_down - led_fade_time_down) >> 1) + led_fade_time_down;
|
||||||
ramp_down /= 100;
|
ramp_down /= 100;
|
||||||
|
|
||||||
value = (ramp_down) | (ramp_up << 4);
|
value = (ramp_down) | (ramp_up << 4);
|
||||||
|
@ -148,12 +152,22 @@ static ssize_t store_s2mu004_rgb_pattern(struct device *dev,
|
||||||
ddata->ratio[LED_RED], LED_BLINK);
|
ddata->ratio[LED_RED], LED_BLINK);
|
||||||
break;
|
break;
|
||||||
case MISSED_NOTI:
|
case MISSED_NOTI:
|
||||||
s2mu004_rgb_blink(ddata, LED_BLUE, 500, 5000);
|
if (led_enable_fade) {
|
||||||
|
s2mu004_rgb_ramp(ddata, LED_BLUE, led_fade_time_up, led_fade_time_down);
|
||||||
|
s2mu004_rgb_blink(ddata, LED_BLUE, led_fade_time_up, 5000);
|
||||||
|
} else {
|
||||||
|
s2mu004_rgb_blink(ddata, LED_BLUE, 500, 5000);
|
||||||
|
}
|
||||||
s2mu004_rgb_set_state(ddata, LED_BLUE,
|
s2mu004_rgb_set_state(ddata, LED_BLUE,
|
||||||
ddata->ratio[LED_BLUE], LED_BLINK);
|
ddata->ratio[LED_BLUE], LED_BLINK);
|
||||||
break;
|
break;
|
||||||
case LOW_BATTERY:
|
case LOW_BATTERY:
|
||||||
s2mu004_rgb_blink(ddata, LED_RED, 500, 5000);
|
if (led_enable_fade) {
|
||||||
|
s2mu004_rgb_ramp(ddata, LED_RED, led_fade_time_up, led_fade_time_down);
|
||||||
|
s2mu004_rgb_blink(ddata, LED_RED, led_fade_time_up, 5000);
|
||||||
|
} else {
|
||||||
|
s2mu004_rgb_blink(ddata, LED_RED, 500, 5000);
|
||||||
|
}
|
||||||
s2mu004_rgb_set_state(ddata, LED_RED,
|
s2mu004_rgb_set_state(ddata, LED_RED,
|
||||||
ddata->ratio[LED_RED], LED_BLINK);
|
ddata->ratio[LED_RED], LED_BLINK);
|
||||||
break;
|
break;
|
||||||
|
@ -162,8 +176,13 @@ static ssize_t store_s2mu004_rgb_pattern(struct device *dev,
|
||||||
ddata->ratio[LED_GREEN], LED_ALWAYS_ON);
|
ddata->ratio[LED_GREEN], LED_ALWAYS_ON);
|
||||||
break;
|
break;
|
||||||
case POWERING:
|
case POWERING:
|
||||||
s2mu004_rgb_ramp(ddata, LED_GREEN, 800, 800);
|
if (led_enable_fade) {
|
||||||
s2mu004_rgb_blink(ddata, LED_GREEN, 200, 200);
|
s2mu004_rgb_ramp(ddata, LED_GREEN, led_fade_time_up, led_fade_time_down);
|
||||||
|
s2mu004_rgb_blink(ddata, LED_GREEN, led_fade_time_up, 5000);
|
||||||
|
} else {
|
||||||
|
s2mu004_rgb_ramp(ddata, LED_GREEN, 800, 800);
|
||||||
|
s2mu004_rgb_blink(ddata, LED_GREEN, 200, 200);
|
||||||
|
}
|
||||||
s2mu004_rgb_set_state(ddata, LED_BLUE,
|
s2mu004_rgb_set_state(ddata, LED_BLUE,
|
||||||
ddata->ratio[LED_BLUE], LED_ALWAYS_ON);
|
ddata->ratio[LED_BLUE], LED_ALWAYS_ON);
|
||||||
s2mu004_rgb_set_state(ddata, LED_GREEN,
|
s2mu004_rgb_set_state(ddata, LED_GREEN,
|
||||||
|
@ -203,6 +222,9 @@ static ssize_t store_s2mu004_rgb_blink(struct device *dev,
|
||||||
|
|
||||||
for (i = 0; i < ddata->pdata->nleds; i++) {
|
for (i = 0; i < ddata->pdata->nleds; i++) {
|
||||||
if (br[i]) {
|
if (br[i]) {
|
||||||
|
if (led_enable_fade && on > 0)
|
||||||
|
s2mu004_rgb_ramp(ddata, i, led_fade_time_up, led_fade_time_down);
|
||||||
|
|
||||||
if (!off)
|
if (!off)
|
||||||
s2mu004_rgb_set_state(ddata, i, br[i], LED_ALWAYS_ON);
|
s2mu004_rgb_set_state(ddata, i, br[i], LED_ALWAYS_ON);
|
||||||
else {
|
else {
|
||||||
|
@ -257,6 +279,64 @@ static ssize_t store_s2mu004_rgb_lowpower(struct device *dev,
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t led_fade_show(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
ret = snprintf(buf, 30, "%d\n", led_enable_fade);
|
||||||
|
pr_info("[LED] %s: led_fade=%d\n", __func__, led_enable_fade);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
static ssize_t led_fade_store(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
int enabled = 0;
|
||||||
|
retval = sscanf(buf, "%1d", &enabled);
|
||||||
|
if (retval != 0 && (enabled == 0 || enabled == 1))
|
||||||
|
led_enable_fade = enabled;
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
static ssize_t led_fade_time_up_show(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
ret = snprintf(buf, 30, "%d\n", led_fade_time_up);
|
||||||
|
pr_info("[LED] %s: led_fade=%d\n", __func__, led_fade_time_up);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
static ssize_t led_fade_time_up_store(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
int val = 0;
|
||||||
|
retval = sscanf(buf, "%1d", &val);
|
||||||
|
if (retval != 0 && val >= 100 && val <= 4000)
|
||||||
|
led_fade_time_up = val;
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
static ssize_t led_fade_time_down_show(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
ret = snprintf(buf, 30, "%d\n", led_fade_time_down);
|
||||||
|
pr_info("[LED] %s: led_fade=%d\n", __func__, led_fade_time_down);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
static ssize_t led_fade_time_down_store(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
int val = 0;
|
||||||
|
retval = sscanf(buf, "%1d", &val);
|
||||||
|
if (retval != 0 && val >= 100 && val <= 4000)
|
||||||
|
led_fade_time_down = val;
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
#define ATTR_STORE_RGB(name, type) \
|
#define ATTR_STORE_RGB(name, type) \
|
||||||
static ssize_t store_led_##name(struct device *dev, \
|
static ssize_t store_led_##name(struct device *dev, \
|
||||||
struct device_attribute *devattr, const char *buf, size_t count)\
|
struct device_attribute *devattr, const char *buf, size_t count)\
|
||||||
|
@ -281,6 +361,9 @@ static DEVICE_ATTR(led_pattern, 0660, NULL, store_s2mu004_rgb_pattern);
|
||||||
static DEVICE_ATTR(led_blink, 0660, NULL, store_s2mu004_rgb_blink);
|
static DEVICE_ATTR(led_blink, 0660, NULL, store_s2mu004_rgb_blink);
|
||||||
static DEVICE_ATTR(led_brightness, 0660, NULL, store_s2mu004_rgb_brightness);
|
static DEVICE_ATTR(led_brightness, 0660, NULL, store_s2mu004_rgb_brightness);
|
||||||
static DEVICE_ATTR(led_lowpower, 0660, NULL, store_s2mu004_rgb_lowpower);
|
static DEVICE_ATTR(led_lowpower, 0660, NULL, store_s2mu004_rgb_lowpower);
|
||||||
|
static DEVICE_ATTR(led_fade, 0664, led_fade_show, led_fade_store);
|
||||||
|
static DEVICE_ATTR(led_fade_time_up, 0664, led_fade_time_up_show, led_fade_time_up_store);
|
||||||
|
static DEVICE_ATTR(led_fade_time_down, 0664, led_fade_time_down_show, led_fade_time_down_store);
|
||||||
|
|
||||||
static struct attribute *sec_led_attributes[] = {
|
static struct attribute *sec_led_attributes[] = {
|
||||||
&dev_attr_led_r.attr,
|
&dev_attr_led_r.attr,
|
||||||
|
@ -290,6 +373,9 @@ static struct attribute *sec_led_attributes[] = {
|
||||||
&dev_attr_led_blink.attr,
|
&dev_attr_led_blink.attr,
|
||||||
&dev_attr_led_brightness.attr,
|
&dev_attr_led_brightness.attr,
|
||||||
&dev_attr_led_lowpower.attr,
|
&dev_attr_led_lowpower.attr,
|
||||||
|
&dev_attr_led_fade.attr,
|
||||||
|
&dev_attr_led_fade_time_up.attr,
|
||||||
|
&dev_attr_led_fade_time_down.attr,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user