Exemplo n.º 1
0
/* 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);
}
Exemplo n.º 2
0
/* 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;
		}
	}

}
Exemplo n.º 3
0
/* 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;
}