/* worker for setting wled brightness */ static void qpnp_wled_work(struct work_struct *work) { struct qpnp_wled *wled; int level, rc; wled = container_of(work, struct qpnp_wled, work); level = wled->cdev.brightness; mutex_lock(&wled->lock); if (level) { rc = qpnp_wled_set_level(wled, level); if (rc) { dev_err(&wled->spmi->dev, "wled set level failed\n"); goto unlock_mutex; } } rc = qpnp_wled_module_en(wled, wled->ctrl_base, !!level); if (rc) { dev_err(&wled->spmi->dev, "wled %sable failed\n", level ? "en" : "dis"); goto unlock_mutex; } unlock_mutex: mutex_unlock(&wled->lock); }
/* enable / disable wled brightness */ void qpnp_wled_enable_backlight(int enable) { int rc; if (!gwled) { dprintf(CRITICAL, "%s: wled is not initialized yet\n", __func__); return; } if (enable) { rc = qpnp_wled_set_level(gwled, QPNP_WLED_MAX_BR_LEVEL); if (rc) { dprintf(CRITICAL,"wled set level failed\n"); return; } } if (!gwled->disp_type_amoled || !gwled->wled_avdd_control) { rc = qpnp_wled_enable(gwled, gwled->ctrl_base, enable); if (rc) { dprintf(CRITICAL, "wled %sable failed\n", enable ? "en" : "dis"); return; } } }
/* sysfs store function for ramp */ static ssize_t qpnp_wled_ramp_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct qpnp_wled *wled = dev_get_drvdata(dev); int i, rc; mutex_lock(&wled->lock); if (!wled->cdev.brightness) { rc = qpnp_wled_module_en(wled, wled->ctrl_base, true); if (rc) { dev_err(&wled->spmi->dev, "wled enable failed\n"); goto unlock_mutex; } } /* ramp up */ for (i = 0; i <= wled->cdev.max_brightness;) { rc = qpnp_wled_set_level(wled, i); if (rc) { dev_err(&wled->spmi->dev, "wled set level failed\n"); goto restore_brightness; } if (wled->ramp_ms < QPNP_WLED_MIN_MSLEEP) usleep_range(wled->ramp_ms * USEC_PER_MSEC, wled->ramp_ms * USEC_PER_MSEC); else msleep(wled->ramp_ms); if (i == wled->cdev.max_brightness) break; i += wled->ramp_step; if (i > wled->cdev.max_brightness) i = wled->cdev.max_brightness; } /* ramp down */ for (i = wled->cdev.max_brightness; i >= 0;) { rc = qpnp_wled_set_level(wled, i); if (rc) { dev_err(&wled->spmi->dev, "wled set level failed\n"); goto restore_brightness; } if (wled->ramp_ms < QPNP_WLED_MIN_MSLEEP) usleep_range(wled->ramp_ms * USEC_PER_MSEC, wled->ramp_ms * USEC_PER_MSEC); else msleep(wled->ramp_ms); if (i == 0) break; i -= wled->ramp_step; if (i < 0) i = 0; } dev_info(&wled->spmi->dev, "wled ramp complete\n"); restore_brightness: /* restore the old brightness */ qpnp_wled_set_level(wled, wled->cdev.brightness); if (!wled->cdev.brightness) { rc = qpnp_wled_module_en(wled, wled->ctrl_base, false); if (rc) dev_err(&wled->spmi->dev, "wled enable failed\n"); } unlock_mutex: mutex_unlock(&wled->lock); return count; }