Пример #1
0
static int lm3630a_bank_b_get_brightness(struct backlight_device *bl)
{
	int brightness, rval;
	struct lm3630a_chip *pchip = bl_get_data(bl);
	enum lm3630a_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl;

	if ((pwm_ctrl & LM3630A_PWM_BANK_B) != 0) {
		rval = lm3630a_read(pchip, REG_PWM_OUTHIGH);
		if (rval < 0)
			goto out_i2c_err;
		brightness = (rval & 0x01) << 8;
		rval = lm3630a_read(pchip, REG_PWM_OUTLOW);
		if (rval < 0)
			goto out_i2c_err;
		brightness |= rval;
		goto out;
	}

	/* disable sleep */
	rval = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00);
	if (rval < 0)
		goto out_i2c_err;
	usleep_range(1000, 2000);
	rval = lm3630a_read(pchip, REG_BRT_B);
	if (rval < 0)
		goto out_i2c_err;
	brightness = rval;

out:
	bl->props.brightness = brightness;
	return bl->props.brightness;
out_i2c_err:
	dev_err(pchip->dev, "i2c failed to access register\n");
	return 0;
}
Пример #2
0
/* interrupt handling */
static void lm3630a_delayed_func(struct work_struct *work)
{
	int rval;
	struct lm3630a_chip *pchip;

	pchip = container_of(work, struct lm3630a_chip, work.work);

	rval = lm3630a_read(pchip, REG_INT_STATUS);
	if (rval < 0) {
		dev_err(pchip->dev,
			"i2c failed to access REG_INT_STATUS Register\n");
		return;
	}

	dev_info(pchip->dev, "REG_INT_STATUS Register is 0x%x\n", rval);
}
Пример #3
0
static void lm3630a_led_set_func(struct work_struct *work)
{
	struct lm3630a_chip *pchip;
	struct lm3630a_platform_data *pdata;
	int ret = 0, brt, ledval;
	bool new_hbm = false;
	static bool cur_hbm;
	static int cur_brt = LM3630A_MAX_BRIGHTNESS;

	pchip = container_of(work, struct lm3630a_chip, ledwork);
	ledval = pchip->ledval;
	pdata = pchip->pdata;

	dev_dbg(pchip->dev, "led value = %d\n", ledval);
	if (ledval == LM3630A_HBM_ON_BRIGHTNESS ||
	    ledval == LM3630A_HBM_OFF_BRIGHTNESS) {
		new_hbm = ledval == LM3630A_HBM_ON_BRIGHTNESS ? true : false;
		if (new_hbm == cur_hbm) {
			dev_warn(pchip->dev, "HBM state is %s already\n",
					new_hbm ? "ON" : "OFF");
			goto out;
		}
	} else {
		cur_brt = ledval;
		/* In HBM mode, brightness setting is not effective */
		if (cur_hbm)
			goto out;
	}

	if (lm3630a_read(pchip, REG_CTRL) & LM3630A_SLEEP_STATUS) {
		dev_info(pchip->dev, "wake up and re-init chip\n");
		ret = lm3630a_chip_config(pchip);
		if (ret < 0)
			goto out;
	}

	if (new_hbm != cur_hbm) {
		cur_hbm = new_hbm;
		dev_info(pchip->dev, "HBM state: %s\n", new_hbm ?
					"ON" : "OFF");
		ledval = new_hbm ?
			max(pdata->leda_max_brt, pdata->ledb_max_brt)
			: cur_brt;
		ret |= lm3630a_update(pchip, REG_I_A, 0x1F, new_hbm ?
			pdata->leda_max_hbm_cur : pdata->leda_max_cur);
		ret |= lm3630a_write(pchip, REG_I_B, new_hbm ?
			pdata->ledb_max_hbm_cur : pdata->ledb_max_cur);
	}

	if (pdata->leda_ctrl != LM3630A_LEDA_DISABLE) {
		/* pwm control */
		if ((pdata->pwm_ctrl & LM3630A_PWM_BANK_A) != 0)
			lm3630a_pwm_ctrl(pchip, ledval, pdata->leda_max_brt);
		else {
			brt = ledval > pdata->leda_max_brt ?
				pdata->leda_max_brt : ledval;
			if (!brt)
				ret = lm3630a_update(pchip, REG_CTRL,
						LM3630A_LEDA_ENABLE, 0);
			else {
				ret = lm3630a_update(pchip, REG_CTRL,
						LM3630A_LEDA_ENABLE,
						LM3630A_LEDA_ENABLE);
				ret |= lm3630a_write(pchip, REG_BRT_A, brt);
			}
			if (ret < 0)
				goto out;
		}
	}

	if ((pdata->ledb_ctrl != LM3630A_LEDB_DISABLE) &&
	    (pdata->ledb_ctrl != LM3630A_LEDB_ON_A)) {
		/* pwm control */
		if ((pdata->pwm_ctrl & LM3630A_PWM_BANK_B) != 0)
			lm3630a_pwm_ctrl(pchip, ledval, pdata->ledb_max_brt);
		else {
			brt = ledval > pdata->ledb_max_brt ?
				pdata->ledb_max_brt : ledval;
			if (!brt)
				ret = lm3630a_update(pchip, REG_CTRL,
						LM3630A_LEDB_ENABLE, 0);
			else {
				ret = lm3630a_update(pchip, REG_CTRL,
						LM3630A_LEDB_ENABLE,
						LM3630A_LEDB_ENABLE);
				ret |= lm3630a_write(pchip, REG_BRT_B, brt);
			}
			if (ret < 0)
				goto out;
		}
	}

	if (!ledval)
		ret = lm3630a_update(pchip, REG_CTRL, LM3630A_SLEEP_ENABLE,
				LM3630A_SLEEP_ENABLE);
out:
	if (ret < 0)
		dev_err(pchip->dev, "fail to set brightness\n");
	return;
}