コード例 #1
0
ファイル: tps65090-charger.c プロジェクト: MaxChina/linux
static int tps65090_config_charger(struct tps65090_charger *charger)
{
	uint8_t intrmask = 0;
	int ret;

	if (charger->pdata->enable_low_current_chrg) {
		ret = tps65090_low_chrg_current(charger);
		if (ret < 0) {
			dev_err(charger->dev,
				"error configuring low charge current\n");
			return ret;
		}
	}

	/* Enable the VACG interrupt for AC power detect */
	ret = tps65090_read(charger->dev->parent, TPS65090_REG_INTR_MASK,
			    &intrmask);
	if (ret < 0) {
		dev_err(charger->dev, "%s(): error reading in register 0x%x\n",
			__func__, TPS65090_REG_INTR_MASK);
		return ret;
	}

	ret = tps65090_write(charger->dev->parent, TPS65090_REG_INTR_MASK,
			     (intrmask | TPS65090_VACG));
	if (ret < 0) {
		dev_err(charger->dev, "%s(): error writing in register 0x%x\n",
			__func__, TPS65090_REG_CG_CTRL0);
		return ret;
	}

	return 0;
}
コード例 #2
0
ファイル: tps65090-charger.c プロジェクト: 383530895/linux
static int tps65090_enable_charging(struct tps65090_charger *charger)
{
	int ret;
	uint8_t ctrl0 = 0;

	if (charger->passive_mode)
		return 0;

	ret = tps65090_read(charger->dev->parent, TPS65090_REG_CG_CTRL0,
			    &ctrl0);
	if (ret < 0) {
		dev_err(charger->dev, "%s(): error reading in register 0x%x\n",
				__func__, TPS65090_REG_CG_CTRL0);
		return ret;
	}

	ret = tps65090_write(charger->dev->parent, TPS65090_REG_CG_CTRL0,
				(ctrl0 | TPS65090_CHARGER_ENABLE));
	if (ret < 0) {
		dev_err(charger->dev, "%s(): error writing in register 0x%x\n",
				__func__, TPS65090_REG_CG_CTRL0);
		return ret;
	}
	return 0;
}
コード例 #3
0
ファイル: tps65090-charger.c プロジェクト: MaxChina/linux
static int tps65090_low_chrg_current(struct tps65090_charger *charger)
{
	int ret;

	ret = tps65090_write(charger->dev->parent, TPS65090_REG_CG_CTRL5,
			TPS65090_NOITERM);
	if (ret < 0) {
		dev_err(charger->dev, "%s(): error reading in register 0x%x\n",
			__func__, TPS65090_REG_CG_CTRL5);
		return ret;
	}
	return 0;
}
コード例 #4
0
ファイル: tps65090-charger.c プロジェクト: 383530895/linux
static irqreturn_t tps65090_charger_isr(int irq, void *dev_id)
{
	struct tps65090_charger *charger = dev_id;
	int ret;
	uint8_t status1 = 0;
	uint8_t intrsts = 0;

	ret = tps65090_read(charger->dev->parent, TPS65090_REG_CG_STATUS1,
			    &status1);
	if (ret < 0) {
		dev_err(charger->dev, "%s(): Error in reading reg 0x%x\n",
				__func__, TPS65090_REG_CG_STATUS1);
		return IRQ_HANDLED;
	}
	msleep(75);
	ret = tps65090_read(charger->dev->parent, TPS65090_REG_INTR_STS,
			    &intrsts);
	if (ret < 0) {
		dev_err(charger->dev, "%s(): Error in reading reg 0x%x\n",
				__func__, TPS65090_REG_INTR_STS);
		return IRQ_HANDLED;
	}

	if (intrsts & TPS65090_VACG) {
		ret = tps65090_enable_charging(charger);
		if (ret < 0)
			return IRQ_HANDLED;
		charger->ac_online = 1;
	} else {
		charger->ac_online = 0;
	}

	/* Clear interrupts. */
	if (!charger->passive_mode) {
		ret = tps65090_write(charger->dev->parent,
				     TPS65090_REG_INTR_STS, 0x00);
		if (ret < 0) {
			dev_err(charger->dev,
				"%s(): Error in writing reg 0x%x\n",
				__func__, TPS65090_REG_INTR_STS);
		}
	}

	if (charger->prev_ac_online != charger->ac_online)
		power_supply_changed(&charger->ac);

	return IRQ_HANDLED;
}