aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/leds/leds-an30259a.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/leds/leds-an30259a.c')
-rw-r--r--drivers/leds/leds-an30259a.c62
1 files changed, 41 insertions, 21 deletions
diff --git a/drivers/leds/leds-an30259a.c b/drivers/leds/leds-an30259a.c
index 5d351c4..965ef3e 100644
--- a/drivers/leds/leds-an30259a.c
+++ b/drivers/leds/leds-an30259a.c
@@ -82,6 +82,9 @@
#define MAX_NUM_LEDS 3
+u8 LED_DYNAMIC_CURRENT = 0x8;
+u8 LED_LOWPOWER_MODE = 0x0;
+
static struct an30259_led_conf led_conf[] = {
{
.name = "led_r",
@@ -317,7 +320,6 @@ static void an30259a_reset_register_work(struct work_struct *work)
static void an30259a_start_led_pattern(int mode)
{
int retval;
-
struct i2c_client *client;
struct work_struct *reset = 0;
client = b_client;
@@ -329,6 +331,12 @@ static void an30259a_start_led_pattern(int mode)
if (mode == LED_OFF)
return;
+ /* Set to low power consumption mode */
+ if (LED_LOWPOWER_MODE == 1)
+ LED_DYNAMIC_CURRENT = 0x8;
+ else
+ LED_DYNAMIC_CURRENT = 0x1;
+
switch (mode) {
/* leds_set_slope_mode(client, LED_SEL, DELAY, MAX, MID, MIN,
SLPTT1, SLPTT2, DT1, DT2, DT3, DT4) */
@@ -437,6 +445,27 @@ static void an30259a_set_led_blink(enum an30259a_led_enum led,
}
}
+static ssize_t store_an30259a_led_lowpower(struct device *dev,
+ struct device_attribute *devattr,
+ const char *buf, size_t count)
+{
+ int retval;
+ u8 led_lowpower;
+ struct an30259a_data *data = dev_get_drvdata(dev);
+
+ retval = kstrtou8(buf, 0, &led_lowpower);
+ if (retval != 0) {
+ dev_err(&data->client->dev, "fail to get led_lowpower.\n");
+ return count;
+ }
+
+ LED_LOWPOWER_MODE = led_lowpower;
+
+ printk(KERN_DEBUG "led_lowpower mode set to %i\n", led_lowpower);
+
+ return count;
+}
+
static ssize_t store_an30259a_led_br_lev(struct device *dev,
struct device_attribute *devattr,
const char *buf, size_t count)
@@ -449,7 +478,7 @@ static ssize_t store_an30259a_led_br_lev(struct device *dev,
retval = strict_strtoul(buf, 16, &brightness_lev);
if (retval != 0) {
- dev_err(&data->client->dev, "fail to get led_pattern mode.\n");
+ dev_err(&data->client->dev, "fail to get led_br_lev.\n");
return count;
}
@@ -517,7 +546,8 @@ static ssize_t store_an30259a_led_blink(struct device *dev,
leds_i2c_write_all(data->client);
- printk(KERN_DEBUG "led_blink is called\n");
+ printk(KERN_DEBUG "led_blink is called, Color:0x%X Brightness:%i\n",
+ led_brightness, LED_DYNAMIC_CURRENT);
return count;
}
@@ -739,6 +769,9 @@ static DEVICE_ATTR(led_fade, 0664, show_an30259a_led_fade, \
store_an30259a_led_fade);
static DEVICE_ATTR(led_br_lev, 0664, NULL, \
store_an30259a_led_br_lev);
+static DEVICE_ATTR(led_lowpower, 0664, NULL, \
+ store_an30259a_led_lowpower);
+
#endif
static struct attribute *led_class_attrs[] = {
@@ -761,6 +794,7 @@ static struct attribute *sec_led_attributes[] = {
&dev_attr_led_blink.attr,
&dev_attr_led_fade.attr,
&dev_attr_led_br_lev.attr,
+ &dev_attr_led_lowpower.attr,
NULL,
};
@@ -867,11 +901,14 @@ static int __devinit an30259a_probe(struct i2c_client *client,
dev_err(&client->dev,
"Failed to create device for samsung specific led\n");
ret = -ENODEV;
+ goto exit;
}
ret = sysfs_create_group(&led_dev->kobj, &sec_led_attr_group);
- if (ret)
+ if (ret) {
dev_err(&client->dev,
"Failed to create sysfs group for samsung specific led\n");
+ goto exit;
+ }
#endif
return ret;
exit:
@@ -885,22 +922,6 @@ 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__);
-
- // 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);
#endif
@@ -910,7 +931,6 @@ 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;