static void led_work_func(struct work_struct *work) { struct pm8xxx_led_data *ldata; int rc, offset; u8 level; ldata = container_of(work, struct pm8xxx_led_data, led_work); LED_INFO("%s: bank %d sync %d\n", __func__, ldata->bank, ldata->led_sync); pwm_disable(ldata->pwm_led); if (ldata->gpio_status_switch != NULL) ldata->gpio_status_switch(0); if(ldata->led_sync) { if (!strcmp(ldata->cdev.name, "green")){ if (green_back_led_data->gpio_status_switch != NULL) green_back_led_data->gpio_status_switch(0); pwm_disable(green_back_led_data->pwm_led); level = ( 0 << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(green_back_led_data->id); green_back_led_data->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; green_back_led_data->reg |= level; rc = pm8xxx_writeb(green_back_led_data->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), green_back_led_data->reg); } if (!strcmp(ldata->cdev.name, "amber")){ if (amber_back_led_data->gpio_status_switch != NULL) amber_back_led_data->gpio_status_switch(0); pwm_disable(amber_back_led_data->pwm_led); level = ( 0 << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(amber_back_led_data->id); amber_back_led_data->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; amber_back_led_data->reg |= level; rc = pm8xxx_writeb(amber_back_led_data->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), amber_back_led_data->reg); } } }
void pm8xxx_led_current_set_for_key(int brightness_key) { int rc, offset; static u8 level, register_key; LED_INFO("%s brightness_key: %d\n", __func__,brightness_key); #ifdef CONFIG_BB_MOD printk("[BB] current_set_for_key %d \n", brightness_key); #endif if (brightness_key) { flag_hold_virtual_key = 1; level = (40 << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(for_key_led_data->id); register_key = pm8xxxx_led_pwm_mode(for_key_led_data->id); register_key &= ~PM8XXX_DRV_LED_CTRL_MASK; register_key |= level; rc = pm8xxx_writeb(for_key_led_data->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), register_key); if (rc) LED_ERR("%s can't set (%d) led value rc=%d\n", __func__, PM8XXX_ID_LED_0, rc); pwm_config(for_key_led_data->pwm_led, 320000, 640000); pwm_enable(for_key_led_data->pwm_led); } else { pwm_disable(for_key_led_data->pwm_led); level = (0 << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(for_key_led_data->id); register_key = pm8xxxx_led_pwm_mode(for_key_led_data->id); register_key &= ~PM8XXX_DRV_LED_CTRL_MASK; register_key |= level; rc = pm8xxx_writeb(for_key_led_data->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), register_key); if (rc) LED_ERR("%s can't set (%d) led value rc=%d\n", __func__, PM8XXX_ID_LED_0, rc); if (virtual_key_state != 0){ level = 0; register_key = 0; level = (40 << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(for_key_led_data->id); register_key = pm8xxxx_led_pwm_mode(for_key_led_data->id); register_key &= ~PM8XXX_DRV_LED_CTRL_MASK; register_key |= level; rc = pm8xxx_writeb(for_key_led_data->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), register_key); if (rc) LED_ERR("%s can't set (%d) led value rc=%d\n", __func__, PM8XXX_ID_LED_0, rc); pwm_config(for_key_led_data->pwm_led, 64000, 64000); pwm_enable(for_key_led_data->pwm_led); } flag_hold_virtual_key = 0; } }
static int __devinit get_init_value(struct pm8xxx_led_data *led, u8 *val) { int rc = -1 , offset = 0; u16 addr = 0; switch (led->id) { case PM8XXX_ID_LED_KB_LIGHT: addr = SSBI_REG_ADDR_DRV_KEYPAD; break; case PM8XXX_ID_LED_0: case PM8XXX_ID_LED_1: case PM8XXX_ID_LED_2: offset = PM8XXX_LED_OFFSET(led->id); addr = SSBI_REG_ADDR_LED_CTRL(offset); break; case PM8XXX_ID_FLASH_LED_0: addr = SSBI_REG_ADDR_FLASH_DRV0; break; case PM8XXX_ID_FLASH_LED_1: addr = SSBI_REG_ADDR_FLASH_DRV1; break; default: return rc; } rc = pm8xxx_readb(led->dev->parent, addr, val); if (rc) dev_err(led->cdev.dev, "can't get led(%d) level rc=%d\n", led->id, rc); return rc; }
static void led_fade_do_work(struct work_struct *work) { struct pm8xxx_led_data *led; int rc, offset; u8 level; led = container_of(work, struct pm8xxx_led_data, fade_delayed_work.work); level = (0 << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(led->id); led->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; led->reg |= level; rc = pm8xxx_writeb(led->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), led->reg); if (rc) LED_ERR("%s can't set (%d) led value rc=%d\n", __func__, led->id, rc); }
static void led_lc_set(struct pm8xxx_led_data *led, enum led_brightness value) { int rc, offset; u8 level; level = (value << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(led->id); led->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; led->reg |= level; rc = pm8xxx_writeb(led->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), led->reg); if (rc) dev_err(led->cdev.dev, "can't set (%d) led value rc=%d\n", led->id, rc); }
static ssize_t pm8xxx_led_blink_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct led_classdev *led_cdev; struct pm8xxx_led_data *ldata; int val; int level, offset; int led_is_green; val = -1; sscanf(buf, "%u", &val); if (val < 0 || val > 255) return -EINVAL; current_blink= val; led_cdev = (struct led_classdev *) dev_get_drvdata(dev); ldata = container_of(led_cdev, struct pm8xxx_led_data, cdev); LED_INFO("%s: bank %d blink %d sync %d\n", __func__, ldata->bank, val, ldata->led_sync); printk("%s: [BB] bank %d blink %d sync %d\n", __func__, ldata->bank, val, ldata->led_sync); if (!strcmp(ldata->cdev.name, "green")) { led_is_green = 1; } if (!strcmp(ldata->cdev.name, "amber")) { led_is_green = 0; } switch (val) { case BLINK_STOP: if (ldata->gpio_status_switch != NULL) ldata->gpio_status_switch(0); pwm_disable(ldata->pwm_led); if(ldata->led_sync) { if (!strcmp(ldata->cdev.name, "green")) { if (green_back_led_data->gpio_status_switch != NULL) green_back_led_data->gpio_status_switch(0); pwm_disable(green_back_led_data->pwm_led); } if (!strcmp(ldata->cdev.name, "amber")) { if (amber_back_led_data->gpio_status_switch != NULL) amber_back_led_data->gpio_status_switch(0); pwm_disable(amber_back_led_data->pwm_led); } } if (blink_buttons > 0) { if (led_is_green == 1) { green_blink_value = 0; } else { amber_blink_value = 0; } pm8xxx_buttons_blink(0); } break; case BLINK_UNCHANGE: pwm_disable(ldata->pwm_led); if (led_cdev->brightness) { if (ldata->gpio_status_switch != NULL) ldata->gpio_status_switch(1); pwm_config(ldata->pwm_led, 6400 * ldata->pwm_coefficient / 100, 6400); pwm_enable(ldata->pwm_led); if(ldata->led_sync) { if (!strcmp(ldata->cdev.name, "green")) { if (green_back_led_data->gpio_status_switch != NULL) green_back_led_data->gpio_status_switch(1); pwm_config(green_back_led_data->pwm_led, 64000, 64000); pwm_enable(green_back_led_data->pwm_led); } if (!strcmp(ldata->cdev.name, "amber")) { if (amber_back_led_data->gpio_status_switch != NULL) amber_back_led_data->gpio_status_switch(1); pwm_config(amber_back_led_data->pwm_led, 64000, 64000); pwm_enable(amber_back_led_data->pwm_led); } } if (blink_buttons > 0 && val > 0) { if (led_is_green == 1) { green_blink_value = 1; } else { amber_blink_value = 1; } pm8xxx_buttons_blink(1); } } else { pwm_disable(ldata->pwm_led); if (ldata->gpio_status_switch != NULL) ldata->gpio_status_switch(0); if(ldata->led_sync) { if (!strcmp(ldata->cdev.name, "green")){ if (green_back_led_data->gpio_status_switch != NULL) green_back_led_data->gpio_status_switch(0); pwm_disable(green_back_led_data->pwm_led); level = ( 0 << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(green_back_led_data->id); green_back_led_data->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; green_back_led_data->reg |= level; pm8xxx_writeb(green_back_led_data->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), green_back_led_data->reg); } if (!strcmp(ldata->cdev.name, "amber")){ if (amber_back_led_data->gpio_status_switch != NULL) amber_back_led_data->gpio_status_switch(0); pwm_disable(amber_back_led_data->pwm_led); level = ( 0 << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(amber_back_led_data->id); amber_back_led_data->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; amber_back_led_data->reg |= level; pm8xxx_writeb(amber_back_led_data->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), amber_back_led_data->reg); } } if (blink_buttons > 0) { if (led_is_green == 1) { green_blink_value = 0; } else { amber_blink_value = 0; } pm8xxx_buttons_blink(0); } } break; case BLINK_64MS_PER_2SEC: if (ldata->gpio_status_switch != NULL) ldata->gpio_status_switch(1); pwm_disable(ldata->pwm_led); pwm_config(ldata->pwm_led, ldata->blink_duty_per_2sec, 2000000); pwm_enable(ldata->pwm_led); if(ldata->led_sync) { if (!strcmp(ldata->cdev.name, "green")) { if (green_back_led_data->gpio_status_switch != NULL) green_back_led_data->gpio_status_switch(1); pwm_disable(green_back_led_data->pwm_led); pwm_config(green_back_led_data->pwm_led, ldata->blink_duty_per_2sec, 2000000); pwm_enable(green_back_led_data->pwm_led); } if (!strcmp(ldata->cdev.name, "amber")) { if (amber_back_led_data->gpio_status_switch != NULL) amber_back_led_data->gpio_status_switch(1); pwm_disable(amber_back_led_data->pwm_led); pwm_config(amber_back_led_data->pwm_led, ldata->blink_duty_per_2sec, 2000000); pwm_enable(amber_back_led_data->pwm_led); } } if (blink_buttons > 0 && val > 0) { if (led_is_green == 1) { green_blink_value = 1; } else { amber_blink_value = 1; } pm8xxx_buttons_blink(1); } break; case BLINK_64MS_ON_310MS_PER_2SEC: cancel_delayed_work_sync(&ldata->blink_delayed_work); pwm_disable(ldata->pwm_led); ldata->duty_time_ms = 64; ldata->period_us = 2000000; if(ldata->led_sync) { if (!strcmp(ldata->cdev.name, "green")) { pwm_disable(green_back_led_data->pwm_led); green_back_led_data->duty_time_ms = 64; green_back_led_data->period_us = 2000000; } if (!strcmp(ldata->cdev.name, "amber")) { pwm_disable(amber_back_led_data->pwm_led); amber_back_led_data->duty_time_ms = 64; amber_back_led_data->period_us = 2000000; } } queue_delayed_work(g_led_work_queue, &ldata->blink_delayed_work, msecs_to_jiffies(310)); break; case BLINK_64MS_ON_2SEC_PER_2SEC: cancel_delayed_work_sync(&ldata->blink_delayed_work); pwm_disable(ldata->pwm_led); ldata->duty_time_ms = 64; ldata->period_us = 2000000; if(ldata->led_sync) { if (!strcmp(ldata->cdev.name, "green")) { pwm_disable(green_back_led_data->pwm_led); green_back_led_data->duty_time_ms = 64; green_back_led_data->period_us = 2000000; } if (!strcmp(ldata->cdev.name, "amber")) { pwm_disable(amber_back_led_data->pwm_led); amber_back_led_data->duty_time_ms = 64; amber_back_led_data->period_us = 2000000; } } queue_delayed_work(g_led_work_queue, &ldata->blink_delayed_work, msecs_to_jiffies(1000)); break; case BLINK_1SEC_PER_2SEC: pwm_disable(ldata->pwm_led); pwm_config(ldata->pwm_led, 1000000, 2000000); pwm_enable(ldata->pwm_led); if(ldata->led_sync) { if (!strcmp(ldata->cdev.name, "green")) { pwm_disable(green_back_led_data->pwm_led); pwm_config(green_back_led_data->pwm_led, 1000000, 2000000); pwm_enable(green_back_led_data->pwm_led); } if (!strcmp(ldata->cdev.name, "amber")) { pwm_disable(amber_back_led_data->pwm_led); pwm_config(amber_back_led_data->pwm_led, 1000000, 2000000); pwm_enable(amber_back_led_data->pwm_led); } } break; default: LED_ERR("%s: bank %d did not support blink type %d\n", __func__, ldata->bank, val); return -EINVAL; } return count; }
static void pm8xxx_led_gpio_set(struct led_classdev *led_cdev, enum led_brightness brightness) { int rc, offset; u8 level; struct pm8xxx_led_data *led = container_of(led_cdev, struct pm8xxx_led_data, cdev); LED_INFO("%s, bank:%d, brightness:%d sync: %d\n", __func__, led->bank, brightness, led->led_sync); if (led->gpio_status_switch != NULL) led->gpio_status_switch(0); pwm_disable(led->pwm_led); if(led->led_sync) { if (!strcmp(led->cdev.name, "green")){ if (green_back_led_data->gpio_status_switch != NULL) green_back_led_data->gpio_status_switch(0); pwm_disable(green_back_led_data->pwm_led); level = ( 0 << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(green_back_led_data->id); green_back_led_data->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; green_back_led_data->reg |= level; rc = pm8xxx_writeb(green_back_led_data->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), green_back_led_data->reg); } if (!strcmp(led->cdev.name, "amber")){ if (amber_back_led_data->gpio_status_switch != NULL) amber_back_led_data->gpio_status_switch(0); pwm_disable(amber_back_led_data->pwm_led); level = ( 0 << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(amber_back_led_data->id); amber_back_led_data->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; amber_back_led_data->reg |= level; rc = pm8xxx_writeb(amber_back_led_data->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), amber_back_led_data->reg); } } if (brightness) { if (led->gpio_status_switch != NULL) led->gpio_status_switch(1); pwm_config(led->pwm_led, 6400 * led->pwm_coefficient / 100, 6400); pwm_enable(led->pwm_led); if(led->led_sync) { if (!strcmp(led->cdev.name, "green")) { if (green_back_led_data->gpio_status_switch != NULL) green_back_led_data->gpio_status_switch(1); level = (green_back_led_data->out_current << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(green_back_led_data->id); green_back_led_data->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; green_back_led_data->reg |= level; rc = pm8xxx_writeb(green_back_led_data->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), green_back_led_data->reg); pwm_config(green_back_led_data->pwm_led, 64000, 64000); pwm_enable(green_back_led_data->pwm_led); } if (!strcmp(led->cdev.name, "amber")) { if (amber_back_led_data->gpio_status_switch != NULL) amber_back_led_data->gpio_status_switch(1); level = (amber_back_led_data->out_current << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(amber_back_led_data->id); amber_back_led_data->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; amber_back_led_data->reg |= level; rc = pm8xxx_writeb(amber_back_led_data->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), amber_back_led_data->reg); pwm_config(amber_back_led_data->pwm_led, 64000, 64000); pwm_enable(amber_back_led_data->pwm_led); } } } }
static void pm8xxx_led_current_set_flagged(struct led_classdev *led_cdev, enum led_brightness brightness, int blink) { struct pm8xxx_led_data *led = container_of(led_cdev, struct pm8xxx_led_data, cdev); int rc, offset; u8 level; int *pduties; LED_INFO("%s, bank:%d, brightness:%d\n", __func__, led->bank, brightness); cancel_delayed_work_sync(&led->fade_delayed_work); virtual_key_state = brightness; if (flag_hold_virtual_key == 1) { LED_INFO("%s, key control \n", __func__); return; } if(brightness) { level = (led->out_current << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(led->id); led->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; led->reg |= level; rc = pm8xxx_writeb(led->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), led->reg); if (rc) LED_ERR("%s can't set (%d) led value rc=%d\n", __func__, led->id, rc); if (led->function_flags & LED_BRETH_FUNCTION) { if (blink == 0) { buttons_led_is_on = 1; // no blink needed pduties = &dutys_array[0]; pm8xxx_pwm_lut_config(led->pwm_led, led->period_us, pduties, led->duty_time_ms, led->start_index, led->duites_size, 0, 0, led->lut_flag); } else { pduties = &dutys_array[0]; // LUT_LOOP for blinking pm8xxx_pwm_lut_config(led->pwm_led, led->period_us, pduties, led->duty_time_ms, // slower, 2x led->start_index, led->duites_size * 8, // 16 duty entries -> original size * 2, + 6 * 8 zeroes for pause 0, 0, PM_PWM_LUT_LOOP | PM_PWM_LUT_PAUSE_HI_EN); } pm8xxx_pwm_lut_enable(led->pwm_led, 0); pm8xxx_pwm_lut_enable(led->pwm_led, 1); } else { pwm_config(led->pwm_led, 6400 * led->pwm_coefficient / 100, 6400); pwm_enable(led->pwm_led); } } else { if (led->function_flags & LED_BRETH_FUNCTION) { buttons_led_is_on = 0; wake_lock_timeout(&pmic_led_wake_lock, HZ*2); pduties = &dutys_array[8]; pm8xxx_pwm_lut_config(led->pwm_led, led->period_us, pduties, led->duty_time_ms, led->start_index, led->duites_size, 0, 0, led->lut_flag); pm8xxx_pwm_lut_enable(led->pwm_led, 0); pm8xxx_pwm_lut_enable(led->pwm_led, 1); queue_delayed_work(g_led_work_queue, &led->fade_delayed_work, msecs_to_jiffies(led->duty_time_ms*led->duites_size)); } else { pwm_disable(led->pwm_led); level = (0 << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(led->id); led->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; led->reg |= level; rc = pm8xxx_writeb(led->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), led->reg); if (rc) LED_ERR("%s can't set (%d) led value rc=%d\n", __func__, led->id, rc); } } }
extern void pm8xxx_led_current_set(struct led_classdev *led_cdev, enum led_brightness brightness) { struct pm8xxx_led_data *led = container_of(led_cdev, struct pm8xxx_led_data, cdev); int rc, offset; u8 level; int *pduties; LED_INFO("%s, bank:%d, brightness:%d\n", __func__, led->bank, brightness); cancel_delayed_work_sync(&led->fade_delayed_work); virtual_key_state = brightness; if (flag_hold_virtual_key == 1) { LED_INFO("%s, key control \n", __func__); return; } if(brightness) { level = (led->out_current << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(led->id); led->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; led->reg |= level; rc = pm8xxx_writeb(led->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), led->reg); if (rc) LED_ERR("%s can't set (%d) led value rc=%d\n", __func__, led->id, rc); if (led->function_flags & LED_BRETH_FUNCTION) { pduties = led->duties; pm8xxx_pwm_lut_config(led->pwm_led, led->period_us, pduties, led->duty_time_ms, led->start_index, led->duites_size, 0, 0, led->lut_flag); pm8xxx_pwm_lut_enable(led->pwm_led, 0); pm8xxx_pwm_lut_enable(led->pwm_led, 1); } else { pwm_config(led->pwm_led, 64000, 64000); pwm_enable(led->pwm_led); } } else { if (led->function_flags & LED_BRETH_FUNCTION) { wake_lock_timeout(&pmic_led_wake_lock, HZ*2); pduties = led->duties + led->duites_size; pm8xxx_pwm_lut_config(led->pwm_led, led->period_us, pduties, led->duty_time_ms, led->start_index, led->duites_size, 0, 0, led->lut_flag); pm8xxx_pwm_lut_enable(led->pwm_led, 0); pm8xxx_pwm_lut_enable(led->pwm_led, 1); queue_delayed_work(g_led_work_queue, &led->fade_delayed_work, msecs_to_jiffies(led->duty_time_ms*led->duites_size)); } else { pwm_disable(led->pwm_led); level = (0 << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(led->id); led->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; led->reg |= level; rc = pm8xxx_writeb(led->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), led->reg); if (rc) LED_ERR("%s can't set (%d) led value rc=%d\n", __func__, led->id, rc); } } // checking for buttons device if (led_cdev_buttons == led_cdev) { printk("[BB] led_current_set %d \n", brightness); if (brightness>0) { // screen turning off together with buttons led buttons_turning_on_with_screen_on = 1; } else { // screen turning off together without buttons led buttons_turning_on_with_screen_on = 0; } } // no blink needed pm8xxx_led_current_set_flagged( led_cdev, brightness, 0); }
static void pm8xxx_led_current_set(struct led_classdev *led_cdev, enum led_brightness brightness) { struct pm8xxx_led_data *led = container_of(led_cdev, struct pm8xxx_led_data, cdev); int rc, offset; u8 level; int *pduties; LED_INFO("%s, bank:%d, brightness:%d\n", __func__, led->bank, brightness); cancel_delayed_work_sync(&led->fade_delayed_work); virtual_key_state = brightness; if (flag_hold_virtual_key == 1) { LED_INFO("%s, key control \n", __func__); return; } if(brightness) { level = (led->out_current << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(led->id); led->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; led->reg |= level; rc = pm8xxx_writeb(led->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), led->reg); if (rc) LED_ERR("%s can't set (%d) led value rc=%d\n", __func__, led->id, rc); if (led->function_flags & LED_BRETH_FUNCTION) { pduties = led->duties; pm8xxx_pwm_lut_config(led->pwm_led, led->period_us, pduties, led->duty_time_ms, led->start_index, led->duites_size, 0, 0, led->lut_flag); pm8xxx_pwm_lut_enable(led->pwm_led, 0); pm8xxx_pwm_lut_enable(led->pwm_led, 1); } else { pwm_config(led->pwm_led, 64000, 64000); pwm_enable(led->pwm_led); } } else { if (led->function_flags & LED_BRETH_FUNCTION) { pduties = led->duties + led->duites_size; pm8xxx_pwm_lut_config(led->pwm_led, led->period_us, pduties, led->duty_time_ms, led->start_index, led->duites_size, 0, 0, led->lut_flag); pm8xxx_pwm_lut_enable(led->pwm_led, 0); pm8xxx_pwm_lut_enable(led->pwm_led, 1); queue_delayed_work(g_led_work_queue, &led->fade_delayed_work, msecs_to_jiffies(led->duty_time_ms*led->duites_size)); } else { pwm_disable(led->pwm_led); level = (0 << PM8XXX_DRV_LED_CTRL_SHIFT) & PM8XXX_DRV_LED_CTRL_MASK; offset = PM8XXX_LED_OFFSET(led->id); led->reg &= ~PM8XXX_DRV_LED_CTRL_MASK; led->reg |= level; rc = pm8xxx_writeb(led->dev->parent, SSBI_REG_ADDR_LED_CTRL(offset), led->reg); if (rc) LED_ERR("%s can't set (%d) led value rc=%d\n", __func__, led->id, rc); } } }