static void aw2013_brightness_work(struct work_struct *work) { struct aw2013_led *led = container_of(work, struct aw2013_led, brightness_work); u8 val; mutex_lock(&led->pdata->led->lock); /* enable regulators if they are disabled */ if (!led->pdata->led->poweron) { if (aw2013_power_on(led->pdata->led, true)) { dev_err(&led->pdata->led->client->dev, "power on failed"); mutex_unlock(&led->pdata->led->lock); return; } } if (led->cdev.brightness > 0) { if (led->cdev.brightness > led->cdev.max_brightness) led->cdev.brightness = led->cdev.max_brightness; aw2013_write(led, AW_REG_GLOBAL_CONTROL, AW_LED_MOUDLE_ENABLE_MASK); aw2013_write(led, AW_REG_LED_CONFIG_BASE + led->id, led->pdata->max_current); aw2013_write(led, AW_REG_LED_BRIGHTNESS_BASE + led->id, led->cdev.brightness); aw2013_read(led, AW_REG_LED_ENABLE, &val); aw2013_write(led, AW_REG_LED_ENABLE, val | (1 << led->id)); } else { aw2013_read(led, AW_REG_LED_ENABLE, &val); aw2013_write(led, AW_REG_LED_ENABLE, val & (~(1 << led->id))); } aw2013_read(led, AW_REG_LED_ENABLE, &val); /* * If value in AW_REG_LED_ENABLE is 0, it means the RGB leds are * all off. So we need to power it off. */ if (val == 0) { if (aw2013_power_on(led->pdata->led, false)) { dev_err(&led->pdata->led->client->dev, "power off failed"); mutex_unlock(&led->pdata->led->lock); return; } } mutex_unlock(&led->pdata->led->lock); }
static void aw2013_led_blink_set(struct aw2013_led *led, unsigned long blinking) { u8 val; /* enable regulators if they are disabled */ if (!led->pdata->led->poweron) { if (aw2013_power_on(led->pdata->led, true)) { dev_err(&led->pdata->led->client->dev, "power on failed"); return; } } led->cdev.brightness = blinking ? led->cdev.max_brightness : 0; if (blinking > 0) { aw2013_write(led, AW_REG_GLOBAL_CONTROL, AW_LED_MOUDLE_ENABLE_MASK); aw2013_write(led, AW_REG_LED_CONFIG_BASE + led->id, AW_LED_FADE_OFF_MASK | AW_LED_FADE_ON_MASK | AW_LED_BREATHE_MODE_MASK | led->pdata->max_current); aw2013_write(led, AW_REG_LED_BRIGHTNESS_BASE + led->id, led->cdev.brightness); aw2013_write(led, AW_REG_TIMESET0_BASE + led->id * 3, led->pdata->rise_time_ms << 4 | led->pdata->hold_time_ms); aw2013_write(led, AW_REG_TIMESET1_BASE + led->id * 3, led->pdata->fall_time_ms << 4 | led->pdata->off_time_ms); aw2013_read(led, AW_REG_LED_ENABLE, &val); aw2013_write(led, AW_REG_LED_ENABLE, val | (1 << led->id)); } else { aw2013_read(led, AW_REG_LED_ENABLE, &val); aw2013_write(led, AW_REG_LED_ENABLE, val & (~(1 << led->id))); } aw2013_read(led, AW_REG_LED_ENABLE, &val); /* * If value in AW_REG_LED_ENABLE is 0, it means the RGB leds are * all off. So we need to power it off. */ if (val == 0) { if (aw2013_power_on(led->pdata->led, false)) { dev_err(&led->pdata->led->client->dev, "power off failed"); return; } } }
static int aw2013_led_resume(struct device *dev) { struct aw2013_led *led = dev_get_drvdata(dev); int ret = 0; if (!led->suspended) { dev_info(dev, "Already in awake state\n"); return 0; } mutex_lock(&led->lock); if (led->poweron) { led->suspended = false; mutex_unlock(&led->lock); return 0; } ret = aw2013_power_on(led, true); if (ret) { dev_err(dev, "power on failed"); mutex_unlock(&led->lock); return ret; } led->suspended = false; mutex_unlock(&led->lock); return ret; }
static int aw2013_led_suspend(struct device *dev) { struct aw2013_led *led = dev_get_drvdata(dev); int ret = 0; u8 val; if (led->suspended) { dev_info(dev, "Already in suspend state\n"); return 0; } mutex_lock(&led->lock); aw2013_read(led, AW_REG_LED_ENABLE, &val); /* * If value in AW_REG_LED_ENABLE is 0, it means the RGB leds are * all off. So we need to power it off. * If value in AW_REG_LED_ENABLE is not 0, that means LEDs are * already turned on by upper layer, we keep them alive during * suspend so as to support screen-off notification LED. */ if (val == 0) { ret = aw2013_power_on(led, false); if (ret) { dev_err(dev, "power off failed"); mutex_unlock(&led->lock); return ret; } } led->suspended = true; mutex_unlock(&led->lock); return ret; }