static void bd2802_set_blink(struct bd2802_led *led, enum led_ids id, enum led_colors color) { u8 reg; if (bd2802_is_all_off(led) && !led->adf_on) bd2802_reset_cancel(led); reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT1SETUP); bd2802_write_byte(led->client, reg, BD2802_CURRENT_000); reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT2SETUP); bd2802_write_byte(led->client, reg, led->rgb_current); reg = bd2802_get_reg_addr(id, color, BD2802_REG_WAVEPATTERN); bd2802_write_byte(led->client, reg, led->wave_pattern); bd2802_enable(led, id); bd2802_update_state(led, id, color, BD2802_BLINK); }
static void bd2802_set_on(struct bd2802_led *led, enum led_ids id, enum led_colors color) { u8 reg; if (bd2802_is_all_off(led) && !led->adf_on) bd2802_reset_cancel(led); reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT1SETUP); bd2802_write_byte(led->client, reg, BD2802_CURRENT_032); reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT2SETUP); bd2802_write_byte(led->client, reg, BD2802_CURRENT_000); reg = bd2802_get_reg_addr(id, color, BD2802_REG_WAVEPATTERN); bd2802_write_byte(led->client, reg, BD2802_PATTERN_FULL); bd2802_enable(led, id); bd2802_update_state(led, id, color, BD2802_ON); }
// LGE_B_DOM_E 20110106 [email protected], Justin LED onoff static ssize_t bd2802_store_led_onoff(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev)); int value; if (!count) return -EINVAL; value = simple_strtoul(buf, NULL, 10); DBG("value=%d\n",value); if (value==1 || value == 255) { led->led_state = BD2802_DIMMING; // Huexxx: enable dimmed... led->white_current = min_current; // Huexxx: enable dimmed... led->blue_current = BD2802_CURRENT_000; led->blink_enable=0; bd2802_reset_cancel(led); bd2802_on(led); bd2802_enable(led); led_enabled = 1; } else if (value==0) { bd2802_off(led); gpio_set_value(RGB_LED_CNTL, 0); led->led_state=BD2802_OFF; led_enabled = 0; } else { if (value > 1) { return -EINVAL; DBG("Value is not valid\n"); } } return count; }
static int bd2802_bl_resume(struct i2c_client *client) { struct bd2802_led *led = i2c_get_clientdata(client); DBG("\n"); led->led_state = BD2802_ON; led->white_current = BD2802_CURRENT_WHITE_MAX; led->blue_current = BD2802_CURRENT_000; /* if (system_rev >=4) //OVER REV.D { bd2802_write_byte(led->client, BD2812_DCDCDRIVER, 0x00); bd2802_write_byte(led->client, BD2812_PIN_FUNC_SETUP, 0x0F); }*/ bd2802_on(led); bd2802_enable(led); //hrtimer_start(&led->touchkey_timer, ktime_set(0, 500000000), HRTIMER_MODE_REL); /*5 sec */ hrtimer_start(&led->ledmin_timer, ktime_set(5, 0), HRTIMER_MODE_REL); return 0; }
static ssize_t bd2802_store_led_testmode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev)); int value; if (!count) return -EINVAL; value = simple_strtoul(buf, NULL, 10); DBG("value=%d led->led_state=%d\n",value,led->led_state); if ((value==1)&&(led->led_state!=BD2802_TEST_ON)) { led->led_state=BD2802_TEST_ON; led->white_current = BD2802_CURRENT_WHITE_MAX; led->blue_current = BD2802_CURRENT_000; bd2802_reset_cancel(led); bd2802_on(led); bd2802_enable(led); DBG("TEST LED ON\n"); } else if ((value==0)&&(led->led_state!=BD2802_TEST_OFF)) { bd2802_off(led); gpio_set_value(RGB_LED_CNTL, 0); led->led_state=BD2802_TEST_OFF; DBG("TEST LED OFF\n"); } else { if (value > 1) { return -EINVAL; DBG("Value is not valid\n"); } } return count; }
void touchkey_pressed(enum key_leds id) { struct bd2802_led *led = i2c_get_clientdata(bd2802_i2c_client); DBG("led->led_state=%d\n",led->led_state); if (led->led_state==BD2802_SEQ || led->led_state==BD2802_SYNC) return; hrtimer_cancel(&led->touchkey_timer); hrtimer_cancel(&led->ledmin_timer); if (led->led_state == BD2802_DIMMING) { led->white_current = BD2802_CURRENT_WHITE_MAX; led->blue_current = BD2802_CURRENT_000; bd2802_on(led); led->led_state = BD2802_ON; } /* LGE_UPDATE_S 2011-10-26 [[email protected]] : Turn off LED backlight for power consumption */ else if (led->led_state == BD2802_OFF) { led->white_current = BD2802_CURRENT_WHITE_MAX; led->blue_current = BD2802_CURRENT_000; led->led_state = BD2802_ON; bd2802_on(led); bd2802_enable(led); } /* LGE_UPDATE_E 2011-10-26 [[email protected]] : Turn off LED backlight for power consumption */ if (led->key_led != id) bd2802_turn_white(led,led->key_led); led->key_led=id; DBG("led->key_led =%d\n",led->key_led); led->blue_current = BD2802_CURRENT_BLUE_MAX; bd2802_turn_blue(led, led->key_led); bd2802_turn_blue(led, HIDDEN1); bd2802_turn_blue(led, HIDDEN2); hrtimer_start(&led->touchkey_timer, ktime_set(0, 500000000), HRTIMER_MODE_REL); /*5 sec */ }
static ssize_t bd2802_store_blink_enable(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev)); int value; if (!count) return -EINVAL; value = simple_strtoul(buf, NULL, 10); //LGE_UPDATE // return count; //LGE_UPDATE if (led->blink_enable==value) { return count; } if (led->led_state==BD2802_SEQ) return count; led->blink_enable=value; down_write(&led->rwsem); bd2802_blink_enable(led); bd2802_enable(led); up_write(&led->rwsem); DBG("blink_enable = %d\n", led->blink_enable); return count; }
static int __devinit bd2802_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct bd2802_led *led; int ret, i; pr_warning("%s() -- start\n", __func__); led = kzalloc(sizeof(struct bd2802_led), GFP_KERNEL); if (!led) { dev_err(&client->dev, "failed to allocate driver data\n"); return -ENOMEM; } led->client = client; i2c_set_clientdata(client, led); INIT_WORK(&led->work, bd2802_work_func); INIT_WORK(&led->touchkey_work, bd2802_touchkey_work_func); INIT_WORK(&led->ledmin_work, bd2802_ledmin_work_func); led->bd2802_wq = create_singlethread_workqueue("bd2802_wq"); if (!led->bd2802_wq) return -ENOMEM; led->touchkey_wq = create_singlethread_workqueue("touchkey_wq"); if (!led->touchkey_wq) return -ENOMEM; led->ledmin_wq = create_singlethread_workqueue("ledmin_wq"); if (!led->ledmin_wq) return -ENOMEM; bd2802_i2c_client = led->client; /* Default attributes */ led->wave_pattern = BD2802_PATTERN_FULL; led->blink_enable =0; led->led_state = BD2802_SEQ; led->key_led = ALL; led->key_direction= FORWARD; led->led_counter=0; #if defined(BLINK_ON_BOOTING) led->white_current = BD2802_CURRENT_WHITE_MAX; led->blue_current = BD2802_CURRENT_000; #else led->white_current = BD2802_CURRENT_WHITE_MAX; led->blue_current = BD2802_CURRENT_BLUE_MAX; #endif init_rwsem(&led->rwsem); for (i = 0; i < ARRAY_SIZE(bd2802_attributes); i++) { ret = device_create_file(&led->client->dev, bd2802_attributes[i]); if (ret) { dev_err(&led->client->dev, "failed: sysfs file %s\n", bd2802_attributes[i]->attr.name); goto failed_unregister_dev_file; } } hrtimer_init(&led->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); led->timer.function = bd2802_timer_func; #if defined(BLINK_ON_BOOTING) #else hrtimer_start(&led->timer, ktime_set(4, 0), HRTIMER_MODE_REL); #endif hrtimer_init(&led->touchkey_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); led->touchkey_timer.function = bd2802_touchkey_timer_func; hrtimer_init(&led->ledmin_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); led->ledmin_timer.function = bd2802_ledmin_timer_func; #ifdef CONFIG_HAS_EARLYSUSPEND led->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN; led->early_suspend.suspend = bd2802_early_suspend; led->early_suspend.resume = bd2802_late_resume; register_early_suspend(&led->early_suspend); #endif bd2802_configure(led); #if defined(BLINK_ON_BOOTING) led->blink_enable =1; #endif bd2802_on(led); bd2802_enable(led); //LGE_UPDATE led->led_state=BD2802_ON; //LGE_UPDATE return 0; failed_unregister_dev_file: for (i--; i >= 0; i--) device_remove_file(&led->client->dev, bd2802_attributes[i]); return ret; }